Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "printing/print_settings.h" |
| 6 | |
| 7 | #include "base/atomic_sequence_num.h" |
| 8 | #include "base/logging.h" |
| 9 | #include "printing/print_job_constants.h" |
| 10 | #include "printing/units.h" |
| 11 | |
| 12 | namespace printing { |
| 13 | |
| 14 | #if defined(USE_CUPS) |
| 15 | void GetColorModelForMode( |
| 16 | int color_mode, std::string* color_setting_name, std::string* color_value) { |
| 17 | #if defined(OS_MACOSX) |
| 18 | const char kCUPSColorMode[] = "ColorMode"; |
| 19 | const char kCUPSColorModel[] = "ColorModel"; |
| 20 | const char kCUPSPrintoutMode[] = "PrintoutMode"; |
| 21 | const char kCUPSProcessColorModel[] = "ProcessColorModel"; |
| 22 | #else |
| 23 | const char kCUPSColorMode[] = "cups-ColorMode"; |
| 24 | const char kCUPSColorModel[] = "cups-ColorModel"; |
| 25 | const char kCUPSPrintoutMode[] = "cups-PrintoutMode"; |
| 26 | const char kCUPSProcessColorModel[] = "cups-ProcessColorModel"; |
| 27 | #endif // defined(OS_MACOSX) |
| 28 | |
| 29 | color_setting_name->assign(kCUPSColorModel); |
| 30 | switch (color_mode) { |
| 31 | case COLOR: |
| 32 | color_value->assign(kColor); |
| 33 | break; |
| 34 | case CMYK: |
| 35 | color_value->assign(kCMYK); |
| 36 | break; |
| 37 | case PRINTOUTMODE_NORMAL: |
| 38 | color_value->assign(kNormal); |
| 39 | color_setting_name->assign(kCUPSPrintoutMode); |
| 40 | break; |
| 41 | case PRINTOUTMODE_NORMAL_GRAY: |
| 42 | color_value->assign(kNormalGray); |
| 43 | color_setting_name->assign(kCUPSPrintoutMode); |
| 44 | break; |
| 45 | case RGB16: |
| 46 | color_value->assign(kRGB16); |
| 47 | break; |
| 48 | case RGBA: |
| 49 | color_value->assign(kRGBA); |
| 50 | break; |
| 51 | case RGB: |
| 52 | color_value->assign(kRGB); |
| 53 | break; |
| 54 | case CMY: |
| 55 | color_value->assign(kCMY); |
| 56 | break; |
| 57 | case CMY_K: |
| 58 | color_value->assign(kCMY_K); |
| 59 | break; |
| 60 | case BLACK: |
| 61 | color_value->assign(kBlack); |
| 62 | break; |
| 63 | case GRAY: |
| 64 | color_value->assign(kGray); |
| 65 | break; |
| 66 | case COLORMODE_COLOR: |
| 67 | color_setting_name->assign(kCUPSColorMode); |
| 68 | color_value->assign(kColor); |
| 69 | break; |
| 70 | case COLORMODE_MONOCHROME: |
| 71 | color_setting_name->assign(kCUPSColorMode); |
| 72 | color_value->assign(kMonochrome); |
| 73 | break; |
| 74 | case HP_COLOR_COLOR: |
| 75 | color_setting_name->assign(kColor); |
| 76 | color_value->assign(kColor); |
| 77 | break; |
| 78 | case HP_COLOR_BLACK: |
| 79 | color_setting_name->assign(kColor); |
| 80 | color_value->assign(kBlack); |
| 81 | break; |
| 82 | case PROCESSCOLORMODEL_CMYK: |
| 83 | color_setting_name->assign(kCUPSProcessColorModel); |
| 84 | color_value->assign(kCMYK); |
| 85 | break; |
| 86 | case PROCESSCOLORMODEL_GREYSCALE: |
| 87 | color_setting_name->assign(kCUPSProcessColorModel); |
| 88 | color_value->assign(kGreyscale); |
| 89 | break; |
| 90 | case PROCESSCOLORMODEL_RGB: |
| 91 | color_setting_name->assign(kCUPSProcessColorModel); |
| 92 | color_value->assign(kRGB); |
| 93 | break; |
| 94 | default: |
| 95 | color_value->assign(kGrayscale); |
| 96 | break; |
| 97 | } |
| 98 | } |
| 99 | #endif // defined(USE_CUPS) |
| 100 | |
Torne (Richard Coles) | 4e180b6 | 2013-10-18 15:46:22 +0100 | [diff] [blame] | 101 | bool IsColorModelSelected(int color_mode) { |
| 102 | return (color_mode != GRAY && |
| 103 | color_mode != BLACK && |
| 104 | color_mode != PRINTOUTMODE_NORMAL_GRAY && |
| 105 | color_mode != COLORMODE_MONOCHROME && |
| 106 | color_mode != PROCESSCOLORMODEL_GREYSCALE && |
| 107 | color_mode != HP_COLOR_BLACK); |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | // Global SequenceNumber used for generating unique cookie values. |
| 111 | static base::StaticAtomicSequenceNumber cookie_seq; |
| 112 | |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 113 | PrintSettings::PrintSettings() { |
| 114 | Clear(); |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 115 | } |
| 116 | |
| 117 | PrintSettings::~PrintSettings() { |
| 118 | } |
| 119 | |
| 120 | void PrintSettings::Clear() { |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 121 | ranges_.clear(); |
| 122 | margin_type_ = DEFAULT_MARGINS; |
| 123 | min_shrink_ = 1.25; |
| 124 | max_shrink_ = 2.; |
| 125 | desired_dpi_ = 72; |
| 126 | selection_only_ = false; |
| 127 | title_ = base::string16(); |
| 128 | url_ = base::string16(); |
| 129 | display_header_footer_ = false; |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 130 | device_name_.clear(); |
| 131 | page_setup_device_units_.Clear(); |
| 132 | dpi_ = 0; |
| 133 | landscape_ = false; |
| 134 | supports_alpha_blend_ = true; |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 135 | should_print_backgrounds_ = false; |
| 136 | collate_ = false; |
| 137 | color_ = UNKNOWN_COLOR_MODEL; |
| 138 | copies_ = 0; |
| 139 | duplex_mode_ = UNKNOWN_DUPLEX_MODE; |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | void PrintSettings::SetPrinterPrintableArea( |
Torne (Richard Coles) | 0f1bc08 | 2013-11-06 12:27:47 +0000 | [diff] [blame] | 143 | const gfx::Size& physical_size_device_units, |
| 144 | const gfx::Rect& printable_area_device_units, |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 145 | bool landscape_needs_flip) { |
Torne (Richard Coles) | 0f1bc08 | 2013-11-06 12:27:47 +0000 | [diff] [blame] | 146 | int units_per_inch = device_units_per_inch(); |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 147 | int header_footer_text_height = 0; |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 148 | if (display_header_footer_) { |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 149 | // Hard-code text_height = 0.5cm = ~1/5 of inch. |
| 150 | header_footer_text_height = ConvertUnit(kSettingHeaderFooterInterstice, |
| 151 | kPointsPerInch, units_per_inch); |
| 152 | } |
| 153 | |
| 154 | PageMargins margins; |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 155 | switch (margin_type_) { |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 156 | case DEFAULT_MARGINS: { |
| 157 | // Default margins 1.0cm = ~2/5 of an inch. |
| 158 | int margin_printer_units = ConvertUnit(1000, kHundrethsMMPerInch, |
| 159 | units_per_inch); |
| 160 | margins.header = header_footer_text_height; |
| 161 | margins.footer = header_footer_text_height; |
| 162 | margins.top = margin_printer_units; |
| 163 | margins.bottom = margin_printer_units; |
| 164 | margins.left = margin_printer_units; |
| 165 | margins.right = margin_printer_units; |
| 166 | break; |
| 167 | } |
| 168 | case NO_MARGINS: |
| 169 | case PRINTABLE_AREA_MARGINS: { |
| 170 | margins.header = 0; |
| 171 | margins.footer = 0; |
| 172 | margins.top = 0; |
| 173 | margins.bottom = 0; |
| 174 | margins.left = 0; |
| 175 | margins.right = 0; |
| 176 | break; |
| 177 | } |
| 178 | case CUSTOM_MARGINS: { |
| 179 | margins.header = 0; |
| 180 | margins.footer = 0; |
| 181 | margins.top = ConvertUnitDouble( |
| 182 | requested_custom_margins_in_points_.top, |
| 183 | kPointsPerInch, |
| 184 | units_per_inch); |
| 185 | margins.bottom = ConvertUnitDouble( |
| 186 | requested_custom_margins_in_points_.bottom, |
| 187 | kPointsPerInch, |
| 188 | units_per_inch); |
| 189 | margins.left = ConvertUnitDouble( |
| 190 | requested_custom_margins_in_points_.left, |
| 191 | kPointsPerInch, |
| 192 | units_per_inch); |
| 193 | margins.right = ConvertUnitDouble( |
| 194 | requested_custom_margins_in_points_.right, |
| 195 | kPointsPerInch, |
| 196 | units_per_inch); |
| 197 | break; |
| 198 | } |
| 199 | default: { |
| 200 | NOTREACHED(); |
| 201 | } |
| 202 | } |
| 203 | |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 204 | if (margin_type_ == DEFAULT_MARGINS || margin_type_ == PRINTABLE_AREA_MARGINS) |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 205 | page_setup_device_units_.SetRequestedMargins(margins); |
| 206 | else |
| 207 | page_setup_device_units_.ForceRequestedMargins(margins); |
| 208 | |
| 209 | page_setup_device_units_.Init(physical_size_device_units, |
| 210 | printable_area_device_units, |
| 211 | header_footer_text_height); |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 212 | if (landscape_ && landscape_needs_flip) |
| 213 | page_setup_device_units_.FlipOrientation(); |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 214 | } |
| 215 | |
| 216 | void PrintSettings::SetCustomMargins( |
| 217 | const PageMargins& requested_margins_in_points) { |
| 218 | requested_custom_margins_in_points_ = requested_margins_in_points; |
Torne (Richard Coles) | 1e9bf3e | 2013-10-31 11:16:26 +0000 | [diff] [blame] | 219 | margin_type_ = CUSTOM_MARGINS; |
Torne (Richard Coles) | 5821806 | 2012-11-14 11:43:16 +0000 | [diff] [blame] | 220 | } |
| 221 | |
| 222 | int PrintSettings::NewCookie() { |
| 223 | // A cookie of 0 is used to mark a document as unassigned, count from 1. |
| 224 | return cookie_seq.GetNext() + 1; |
| 225 | } |
| 226 | |
| 227 | void PrintSettings::SetOrientation(bool landscape) { |
| 228 | if (landscape_ != landscape) { |
| 229 | landscape_ = landscape; |
| 230 | page_setup_device_units_.FlipOrientation(); |
| 231 | } |
| 232 | } |
| 233 | |
| 234 | } // namespace printing |