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.
5 #include "printing/print_settings.h"
7 #include "base/atomic_sequence_num.h"
8 #include "base/logging.h"
9 #include "printing/print_job_constants.h"
10 #include "printing/units.h"
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";
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)
29 color_setting_name
->assign(kCUPSColorModel
);
32 color_value
->assign(kColor
);
35 color_value
->assign(kCMYK
);
37 case PRINTOUTMODE_NORMAL
:
38 color_value
->assign(kNormal
);
39 color_setting_name
->assign(kCUPSPrintoutMode
);
41 case PRINTOUTMODE_NORMAL_GRAY
:
42 color_value
->assign(kNormalGray
);
43 color_setting_name
->assign(kCUPSPrintoutMode
);
46 color_value
->assign(kRGB16
);
49 color_value
->assign(kRGBA
);
52 color_value
->assign(kRGB
);
55 color_value
->assign(kCMY
);
58 color_value
->assign(kCMY_K
);
61 color_value
->assign(kBlack
);
64 color_value
->assign(kGray
);
67 color_setting_name
->assign(kCUPSColorMode
);
68 color_value
->assign(kColor
);
70 case COLORMODE_MONOCHROME
:
71 color_setting_name
->assign(kCUPSColorMode
);
72 color_value
->assign(kMonochrome
);
75 color_setting_name
->assign(kColor
);
76 color_value
->assign(kColor
);
79 color_setting_name
->assign(kColor
);
80 color_value
->assign(kBlack
);
82 case PROCESSCOLORMODEL_CMYK
:
83 color_setting_name
->assign(kCUPSProcessColorModel
);
84 color_value
->assign(kCMYK
);
86 case PROCESSCOLORMODEL_GREYSCALE
:
87 color_setting_name
->assign(kCUPSProcessColorModel
);
88 color_value
->assign(kGreyscale
);
90 case PROCESSCOLORMODEL_RGB
:
91 color_setting_name
->assign(kCUPSProcessColorModel
);
92 color_value
->assign(kRGB
);
95 color_value
->assign(kGrayscale
);
99 #endif // defined(USE_CUPS)
101 bool isColorModelSelected(int model
) {
102 return (model
!= GRAY
&&
104 model
!= PRINTOUTMODE_NORMAL_GRAY
&&
105 model
!= COLORMODE_MONOCHROME
&&
106 model
!= PROCESSCOLORMODEL_GREYSCALE
&&
107 model
!= HP_COLOR_BLACK
);
110 // Global SequenceNumber used for generating unique cookie values.
111 static base::StaticAtomicSequenceNumber cookie_seq
;
113 PrintSettings::PrintSettings()
117 selection_only(false),
118 margin_type(DEFAULT_MARGINS
),
119 display_header_footer(false),
120 should_print_backgrounds(false),
123 supports_alpha_blend_(true) {
126 PrintSettings::~PrintSettings() {
129 void PrintSettings::Clear() {
134 selection_only
= false;
138 display_header_footer
= false;
139 printer_name_
.clear();
140 device_name_
.clear();
141 page_setup_device_units_
.Clear();
144 supports_alpha_blend_
= true;
145 should_print_backgrounds
= false;
148 void PrintSettings::SetPrinterPrintableArea(
149 gfx::Size
const& physical_size_device_units
,
150 gfx::Rect
const& printable_area_device_units
,
151 int units_per_inch
) {
152 int header_footer_text_height
= 0;
153 if (display_header_footer
) {
154 // Hard-code text_height = 0.5cm = ~1/5 of inch.
155 header_footer_text_height
= ConvertUnit(kSettingHeaderFooterInterstice
,
156 kPointsPerInch
, units_per_inch
);
160 switch (margin_type
) {
161 case DEFAULT_MARGINS
: {
162 // Default margins 1.0cm = ~2/5 of an inch.
163 int margin_printer_units
= ConvertUnit(1000, kHundrethsMMPerInch
,
165 margins
.header
= header_footer_text_height
;
166 margins
.footer
= header_footer_text_height
;
167 margins
.top
= margin_printer_units
;
168 margins
.bottom
= margin_printer_units
;
169 margins
.left
= margin_printer_units
;
170 margins
.right
= margin_printer_units
;
174 case PRINTABLE_AREA_MARGINS
: {
183 case CUSTOM_MARGINS
: {
186 margins
.top
= ConvertUnitDouble(
187 requested_custom_margins_in_points_
.top
,
190 margins
.bottom
= ConvertUnitDouble(
191 requested_custom_margins_in_points_
.bottom
,
194 margins
.left
= ConvertUnitDouble(
195 requested_custom_margins_in_points_
.left
,
198 margins
.right
= ConvertUnitDouble(
199 requested_custom_margins_in_points_
.right
,
209 if (margin_type
== DEFAULT_MARGINS
|| margin_type
== PRINTABLE_AREA_MARGINS
)
210 page_setup_device_units_
.SetRequestedMargins(margins
);
212 page_setup_device_units_
.ForceRequestedMargins(margins
);
214 page_setup_device_units_
.Init(physical_size_device_units
,
215 printable_area_device_units
,
216 header_footer_text_height
);
219 void PrintSettings::SetCustomMargins(
220 const PageMargins
& requested_margins_in_points
) {
221 requested_custom_margins_in_points_
= requested_margins_in_points
;
222 margin_type
= CUSTOM_MARGINS
;
225 bool PrintSettings::Equals(const PrintSettings
& rhs
) const {
226 // Do not test the display device name (printer_name_) for equality since it
227 // may sometimes be chopped off at 30 chars. As long as device_name is the
228 // same, that's fine.
229 return ranges
== rhs
.ranges
&&
230 min_shrink
== rhs
.min_shrink
&&
231 max_shrink
== rhs
.max_shrink
&&
232 desired_dpi
== rhs
.desired_dpi
&&
233 device_name_
== rhs
.device_name_
&&
234 page_setup_device_units_
.Equals(rhs
.page_setup_device_units_
) &&
236 landscape_
== rhs
.landscape_
&&
237 should_print_backgrounds
== rhs
.should_print_backgrounds
;
240 int PrintSettings::NewCookie() {
241 // A cookie of 0 is used to mark a document as unassigned, count from 1.
242 return cookie_seq
.GetNext() + 1;
245 void PrintSettings::SetOrientation(bool landscape
) {
246 if (landscape_
!= landscape
) {
247 landscape_
= landscape
;
248 page_setup_device_units_
.FlipOrientation();
252 } // namespace printing