print_settings.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// found in the LICENSE file.
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "printing/print_settings.h"
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "base/atomic_sequence_num.h"
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "base/logging.h"
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "printing/print_job_constants.h"
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "printing/units.h"
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectnamespace printing {
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#if defined(USE_CUPS)
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid GetColorModelForMode(
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int color_mode, std::string* color_setting_name, std::string* color_value) {
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#if defined(OS_MACOSX)
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSColorMode[] = "ColorMode";
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSColorModel[] = "ColorModel";
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSPrintoutMode[] = "PrintoutMode";
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSProcessColorModel[] = "ProcessColorModel";
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#else
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSColorMode[] = "cups-ColorMode";
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSColorModel[] = "cups-ColorModel";
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSPrintoutMode[] = "cups-PrintoutMode";
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  const char kCUPSProcessColorModel[] = "cups-ProcessColorModel";
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#endif  // defined(OS_MACOSX)
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  color_setting_name->assign(kCUPSColorModel);
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project  switch (color_mode) {
312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    case COLOR:
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kColor);
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case CMYK:
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kCMYK);
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case PRINTOUTMODE_NORMAL:
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kNormal);
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_setting_name->assign(kCUPSPrintoutMode);
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case PRINTOUTMODE_NORMAL_GRAY:
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kNormalGray);
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_setting_name->assign(kCUPSPrintoutMode);
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case RGB16:
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kRGB16);
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    case RGBA:
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kRGBA);
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case RGB:
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kRGB);
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case CMY:
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kCMY);
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case CMY_K:
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kCMY_K);
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case BLACK:
612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes      color_value->assign(kBlack);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case GRAY:
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_value->assign(kGray);
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      break;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    case COLORMODE_COLOR:
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      color_setting_name->assign(kCUPSColorMode);
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project      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 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);
108}
109
110// Global SequenceNumber used for generating unique cookie values.
111static base::StaticAtomicSequenceNumber cookie_seq;
112
113PrintSettings::PrintSettings() {
114  Clear();
115}
116
117PrintSettings::~PrintSettings() {
118}
119
120void PrintSettings::Clear() {
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;
130  device_name_.clear();
131  page_setup_device_units_.Clear();
132  dpi_ = 0;
133  landscape_ = false;
134  supports_alpha_blend_ = true;
135  should_print_backgrounds_ = false;
136  collate_ = false;
137  color_ = UNKNOWN_COLOR_MODEL;
138  copies_ = 0;
139  duplex_mode_ = UNKNOWN_DUPLEX_MODE;
140}
141
142void PrintSettings::SetPrinterPrintableArea(
143    const gfx::Size& physical_size_device_units,
144    const gfx::Rect& printable_area_device_units,
145    bool landscape_needs_flip) {
146  int units_per_inch = device_units_per_inch();
147  int header_footer_text_height = 0;
148  if (display_header_footer_) {
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;
155  switch (margin_type_) {
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
204  if (margin_type_ == DEFAULT_MARGINS || margin_type_ == PRINTABLE_AREA_MARGINS)
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);
212  if (landscape_ && landscape_needs_flip)
213    page_setup_device_units_.FlipOrientation();
214}
215
216void PrintSettings::SetCustomMargins(
217    const PageMargins& requested_margins_in_points) {
218  requested_custom_margins_in_points_ = requested_margins_in_points;
219  margin_type_ = CUSTOM_MARGINS;
220}
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
235