blob: f2dc42585dafc8b0ee7fa1c55d5c7273e97aef1d [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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
12namespace printing {
13
14#if defined(USE_CUPS)
15void 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)4e180b62013-10-18 15:46:22 +0100101bool 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)58218062012-11-14 11:43:16 +0000108}
109
110// Global SequenceNumber used for generating unique cookie values.
111static base::StaticAtomicSequenceNumber cookie_seq;
112
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000113PrintSettings::PrintSettings() {
114 Clear();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000115}
116
117PrintSettings::~PrintSettings() {
118}
119
120void PrintSettings::Clear() {
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000121 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)58218062012-11-14 11:43:16 +0000130 device_name_.clear();
131 page_setup_device_units_.Clear();
132 dpi_ = 0;
133 landscape_ = false;
134 supports_alpha_blend_ = true;
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000135 should_print_backgrounds_ = false;
136 collate_ = false;
137 color_ = UNKNOWN_COLOR_MODEL;
138 copies_ = 0;
139 duplex_mode_ = UNKNOWN_DUPLEX_MODE;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000140}
141
142void PrintSettings::SetPrinterPrintableArea(
Torne (Richard Coles)0f1bc082013-11-06 12:27:47 +0000143 const gfx::Size& physical_size_device_units,
144 const gfx::Rect& printable_area_device_units,
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000145 bool landscape_needs_flip) {
Torne (Richard Coles)0f1bc082013-11-06 12:27:47 +0000146 int units_per_inch = device_units_per_inch();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000147 int header_footer_text_height = 0;
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000148 if (display_header_footer_) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000149 // 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)1e9bf3e2013-10-31 11:16:26 +0000155 switch (margin_type_) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000156 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)1e9bf3e2013-10-31 11:16:26 +0000204 if (margin_type_ == DEFAULT_MARGINS || margin_type_ == PRINTABLE_AREA_MARGINS)
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000205 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)1e9bf3e2013-10-31 11:16:26 +0000212 if (landscape_ && landscape_needs_flip)
213 page_setup_device_units_.FlipOrientation();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000214}
215
216void PrintSettings::SetCustomMargins(
217 const PageMargins& requested_margins_in_points) {
218 requested_custom_margins_in_points_ = requested_margins_in_points;
Torne (Richard Coles)1e9bf3e2013-10-31 11:16:26 +0000219 margin_type_ = CUSTOM_MARGINS;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000220}
221
222int 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
227void PrintSettings::SetOrientation(bool landscape) {
228 if (landscape_ != landscape) {
229 landscape_ = landscape;
230 page_setup_device_units_.FlipOrientation();
231 }
232}
233
234} // namespace printing