print_settings.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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
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
101bool isColorModelSelected(int model) {
102  return (model != GRAY &&
103          model != BLACK &&
104          model != PRINTOUTMODE_NORMAL_GRAY &&
105          model != COLORMODE_MONOCHROME &&
106          model != PROCESSCOLORMODEL_GREYSCALE &&
107          model != HP_COLOR_BLACK);
108}
109
110// Global SequenceNumber used for generating unique cookie values.
111static base::StaticAtomicSequenceNumber cookie_seq;
112
113PrintSettings::PrintSettings()
114    : min_shrink(1.25),
115      max_shrink(2.0),
116      desired_dpi(72),
117      selection_only(false),
118      margin_type(DEFAULT_MARGINS),
119      display_header_footer(false),
120      dpi_(0),
121      landscape_(false),
122      supports_alpha_blend_(true) {
123}
124
125PrintSettings::~PrintSettings() {
126}
127
128void PrintSettings::Clear() {
129  ranges.clear();
130  min_shrink = 1.25;
131  max_shrink = 2.;
132  desired_dpi = 72;
133  selection_only = false;
134  date = string16();
135  title = string16();
136  url = string16();
137  display_header_footer = false;
138  printer_name_.clear();
139  device_name_.clear();
140  page_setup_device_units_.Clear();
141  dpi_ = 0;
142  landscape_ = false;
143  supports_alpha_blend_ = true;
144}
145
146void PrintSettings::SetPrinterPrintableArea(
147    gfx::Size const& physical_size_device_units,
148    gfx::Rect const& printable_area_device_units,
149    int units_per_inch) {
150  int header_footer_text_height = 0;
151  if (display_header_footer) {
152    // Hard-code text_height = 0.5cm = ~1/5 of inch.
153    header_footer_text_height = ConvertUnit(kSettingHeaderFooterInterstice,
154                                            kPointsPerInch, units_per_inch);
155  }
156
157  PageMargins margins;
158  switch (margin_type) {
159    case DEFAULT_MARGINS: {
160      // Default margins 1.0cm = ~2/5 of an inch.
161      int margin_printer_units = ConvertUnit(1000, kHundrethsMMPerInch,
162                                             units_per_inch);
163      margins.header = header_footer_text_height;
164      margins.footer = header_footer_text_height;
165      margins.top = margin_printer_units;
166      margins.bottom = margin_printer_units;
167      margins.left = margin_printer_units;
168      margins.right = margin_printer_units;
169      break;
170    }
171    case NO_MARGINS:
172    case PRINTABLE_AREA_MARGINS: {
173      margins.header = 0;
174      margins.footer = 0;
175      margins.top = 0;
176      margins.bottom = 0;
177      margins.left = 0;
178      margins.right = 0;
179      break;
180    }
181    case CUSTOM_MARGINS: {
182      margins.header = 0;
183      margins.footer = 0;
184      margins.top = ConvertUnitDouble(
185          requested_custom_margins_in_points_.top,
186          kPointsPerInch,
187          units_per_inch);
188      margins.bottom = ConvertUnitDouble(
189          requested_custom_margins_in_points_.bottom,
190          kPointsPerInch,
191          units_per_inch);
192      margins.left = ConvertUnitDouble(
193          requested_custom_margins_in_points_.left,
194          kPointsPerInch,
195          units_per_inch);
196      margins.right = ConvertUnitDouble(
197          requested_custom_margins_in_points_.right,
198          kPointsPerInch,
199          units_per_inch);
200      break;
201    }
202    default: {
203      NOTREACHED();
204    }
205  }
206
207  if (margin_type == DEFAULT_MARGINS || margin_type == PRINTABLE_AREA_MARGINS)
208    page_setup_device_units_.SetRequestedMargins(margins);
209  else
210    page_setup_device_units_.ForceRequestedMargins(margins);
211
212  page_setup_device_units_.Init(physical_size_device_units,
213                                printable_area_device_units,
214                                header_footer_text_height);
215}
216
217void PrintSettings::SetCustomMargins(
218    const PageMargins& requested_margins_in_points) {
219  requested_custom_margins_in_points_ = requested_margins_in_points;
220  margin_type = CUSTOM_MARGINS;
221}
222
223bool PrintSettings::Equals(const PrintSettings& rhs) const {
224  // Do not test the display device name (printer_name_) for equality since it
225  // may sometimes be chopped off at 30 chars. As long as device_name is the
226  // same, that's fine.
227  return ranges == rhs.ranges &&
228      min_shrink == rhs.min_shrink &&
229      max_shrink == rhs.max_shrink &&
230      desired_dpi == rhs.desired_dpi &&
231      device_name_ == rhs.device_name_ &&
232      page_setup_device_units_.Equals(rhs.page_setup_device_units_) &&
233      dpi_ == rhs.dpi_ &&
234      landscape_ == rhs.landscape_;
235}
236
237int PrintSettings::NewCookie() {
238  // A cookie of 0 is used to mark a document as unassigned, count from 1.
239  return cookie_seq.GetNext() + 1;
240}
241
242void PrintSettings::SetOrientation(bool landscape) {
243  if (landscape_ != landscape) {
244    landscape_ = landscape;
245    page_setup_device_units_.FlipOrientation();
246  }
247}
248
249}  // namespace printing
250