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/lazy_instance.h"
9 #include "base/logging.h"
10 #include "printing/print_job_constants.h"
11 #include "printing/units.h"
15 base::LazyInstance<std::string>::Leaky g_user_agent;
17 void SetAgent(const std::string& user_agent) {
18 g_user_agent.Get() = user_agent;
21 const std::string& GetAgent() {
22 return g_user_agent.Get();
26 void GetColorModelForMode(
27 int color_mode, std::string* color_setting_name, std::string* color_value) {
28 #if defined(OS_MACOSX)
29 constexpr char kCUPSColorMode[] = "ColorMode";
30 constexpr char kCUPSColorModel[] = "ColorModel";
31 constexpr char kCUPSPrintoutMode[] = "PrintoutMode";
32 constexpr char kCUPSProcessColorModel[] = "ProcessColorModel";
33 constexpr char kCUPSBrotherMonoColor[] = "BRMonoColor";
34 constexpr char kCUPSBrotherPrintQuality[] = "BRPrintQuality";
36 constexpr char kCUPSColorMode[] = "cups-ColorMode";
37 constexpr char kCUPSColorModel[] = "cups-ColorModel";
38 constexpr char kCUPSPrintoutMode[] = "cups-PrintoutMode";
39 constexpr char kCUPSProcessColorModel[] = "cups-ProcessColorModel";
40 constexpr char kCUPSBrotherMonoColor[] = "cups-BRMonoColor";
41 constexpr char kCUPSBrotherPrintQuality[] = "cups-BRPrintQuality";
42 #endif // defined(OS_MACOSX)
44 color_setting_name->assign(kCUPSColorModel);
47 color_value->assign(kGray);
50 color_value->assign(kColor);
53 color_value->assign(kCMYK);
56 color_value->assign(kCMY);
59 color_value->assign(kKCMY);
62 color_value->assign(kCMY_K);
65 color_value->assign(kBlack);
68 color_value->assign(kGrayscale);
71 color_value->assign(kRGB);
74 color_value->assign(kRGB16);
77 color_value->assign(kRGBA);
80 color_setting_name->assign(kCUPSColorMode);
81 color_value->assign(kColor);
83 case COLORMODE_MONOCHROME:
84 color_setting_name->assign(kCUPSColorMode);
85 color_value->assign(kMonochrome);
88 color_setting_name->assign(kColor);
89 color_value->assign(kColor);
92 color_setting_name->assign(kColor);
93 color_value->assign(kBlack);
95 case PRINTOUTMODE_NORMAL:
96 color_setting_name->assign(kCUPSPrintoutMode);
97 color_value->assign(kNormal);
99 case PRINTOUTMODE_NORMAL_GRAY:
100 color_setting_name->assign(kCUPSPrintoutMode);
101 color_value->assign(kNormalGray);
103 case PROCESSCOLORMODEL_CMYK:
104 color_setting_name->assign(kCUPSProcessColorModel);
105 color_value->assign(kCMYK);
107 case PROCESSCOLORMODEL_GREYSCALE:
108 color_setting_name->assign(kCUPSProcessColorModel);
109 color_value->assign(kGreyscale);
111 case PROCESSCOLORMODEL_RGB:
112 color_setting_name->assign(kCUPSProcessColorModel);
113 color_value->assign(kRGB);
115 case BROTHER_CUPS_COLOR:
116 color_setting_name->assign(kCUPSBrotherMonoColor);
117 color_value->assign(kFullColor);
119 case BROTHER_CUPS_MONO:
120 color_setting_name->assign(kCUPSBrotherMonoColor);
121 color_value->assign(kMono);
123 case BROTHER_BRSCRIPT3_COLOR:
124 color_setting_name->assign(kCUPSBrotherPrintQuality);
125 color_value->assign(kColor);
127 case BROTHER_BRSCRIPT3_BLACK:
128 color_setting_name->assign(kCUPSBrotherPrintQuality);
129 color_value->assign(kBlack);
132 color_value->assign(kGrayscale);
136 #endif // defined(USE_CUPS)
138 bool IsColorModelSelected(int color_mode) {
139 return (color_mode != GRAY && color_mode != BLACK &&
140 color_mode != PRINTOUTMODE_NORMAL_GRAY &&
141 color_mode != COLORMODE_MONOCHROME &&
142 color_mode != PROCESSCOLORMODEL_GREYSCALE &&
143 color_mode != BROTHER_CUPS_MONO &&
144 color_mode != BROTHER_BRSCRIPT3_BLACK &&
145 color_mode != HP_COLOR_BLACK);
148 // Global SequenceNumber used for generating unique cookie values.
149 static base::AtomicSequenceNumber cookie_seq;
151 PrintSettings::PrintSettings() {
155 PrintSettings::PrintSettings(const PrintSettings& other) = default;
157 PrintSettings::~PrintSettings() = default;
159 void PrintSettings::Clear() {
161 selection_only_ = false;
162 margin_type_ = DEFAULT_MARGINS;
165 display_header_footer_ = false;
166 should_print_backgrounds_ = false;
168 color_ = UNKNOWN_COLOR_MODEL;
170 duplex_mode_ = UNKNOWN_DUPLEX_MODE;
171 device_name_.clear();
172 requested_media_ = RequestedMedia();
173 page_setup_device_units_.Clear();
175 scale_factor_ = 1.0f;
176 rasterize_pdf_ = false;
178 supports_alpha_blend_ = true;
180 print_text_with_gdi_ = false;
181 printer_type_ = PrintSettings::PrinterType::TYPE_NONE;
183 is_modifiable_ = true;
184 pages_per_sheet_ = 1;
187 void PrintSettings::SetPrinterPrintableArea(
188 const gfx::Size& physical_size_device_units,
189 const gfx::Rect& printable_area_device_units,
190 bool landscape_needs_flip) {
191 int units_per_inch = device_units_per_inch();
192 int header_footer_text_height = 0;
193 if (display_header_footer_) {
194 // Hard-code text_height = 0.5cm = ~1/5 of inch.
195 header_footer_text_height = ConvertUnit(kSettingHeaderFooterInterstice,
196 kPointsPerInch, units_per_inch);
200 bool small_paper_size = false;
201 switch (margin_type_) {
202 case DEFAULT_MARGINS: {
203 // Default margins 1.0cm = ~2/5 of an inch, unless a page dimension is
204 // less than 2.54 cm = ~1 inch, in which case set the margins in that
206 static constexpr double kCmInMicrons = 10000;
207 int margin_printer_units =
208 ConvertUnit(kCmInMicrons, kMicronsPerInch, units_per_inch);
209 int min_size_printer_units = units_per_inch;
210 margins.header = header_footer_text_height;
211 margins.footer = header_footer_text_height;
212 if (physical_size_device_units.height() > min_size_printer_units) {
213 margins.top = margin_printer_units;
214 margins.bottom = margin_printer_units;
218 small_paper_size = true;
220 if (physical_size_device_units.width() > min_size_printer_units) {
221 margins.left = margin_printer_units;
222 margins.right = margin_printer_units;
226 small_paper_size = true;
231 case PRINTABLE_AREA_MARGINS: {
240 case CUSTOM_MARGINS: {
243 margins.top = ConvertUnitDouble(
244 requested_custom_margins_in_points_.top,
247 margins.bottom = ConvertUnitDouble(
248 requested_custom_margins_in_points_.bottom,
251 margins.left = ConvertUnitDouble(
252 requested_custom_margins_in_points_.left,
255 margins.right = ConvertUnitDouble(
256 requested_custom_margins_in_points_.right,
266 if ((margin_type_ == DEFAULT_MARGINS ||
267 margin_type_ == PRINTABLE_AREA_MARGINS) &&
269 page_setup_device_units_.SetRequestedMargins(margins);
271 page_setup_device_units_.ForceRequestedMargins(margins);
273 page_setup_device_units_.Init(physical_size_device_units,
274 printable_area_device_units,
275 header_footer_text_height);
276 if (landscape_ && landscape_needs_flip)
277 page_setup_device_units_.FlipOrientation();
280 void PrintSettings::SetCustomMargins(
281 const PageMargins& requested_margins_in_points) {
282 requested_custom_margins_in_points_ = requested_margins_in_points;
283 margin_type_ = CUSTOM_MARGINS;
286 int PrintSettings::NewCookie() {
287 // A cookie of 0 is used to mark a document as unassigned, count from 1.
288 return cookie_seq.GetNext() + 1;
291 void PrintSettings::SetOrientation(bool landscape) {
292 if (landscape_ != landscape) {
293 landscape_ = landscape;
294 page_setup_device_units_.FlipOrientation();
298 } // namespace printing