Home | History | Annotate | Download | only in printing
      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 
     12 namespace printing {
     13 
     14 #if defined(USE_CUPS)
     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";
     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 
    101 bool 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.
    111 static base::StaticAtomicSequenceNumber cookie_seq;
    112 
    113 PrintSettings::PrintSettings() {
    114   Clear();
    115 }
    116 
    117 PrintSettings::~PrintSettings() {
    118 }
    119 
    120 void 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   requested_media_ = RequestedMedia();
    132   page_setup_device_units_.Clear();
    133   dpi_ = 0;
    134   landscape_ = false;
    135   supports_alpha_blend_ = true;
    136   should_print_backgrounds_ = false;
    137   collate_ = false;
    138   color_ = UNKNOWN_COLOR_MODEL;
    139   copies_ = 0;
    140   duplex_mode_ = UNKNOWN_DUPLEX_MODE;
    141 }
    142 
    143 void PrintSettings::SetPrinterPrintableArea(
    144     const gfx::Size& physical_size_device_units,
    145     const gfx::Rect& printable_area_device_units,
    146     bool landscape_needs_flip) {
    147   int units_per_inch = device_units_per_inch();
    148   int header_footer_text_height = 0;
    149   if (display_header_footer_) {
    150     // Hard-code text_height = 0.5cm = ~1/5 of inch.
    151     header_footer_text_height = ConvertUnit(kSettingHeaderFooterInterstice,
    152                                             kPointsPerInch, units_per_inch);
    153   }
    154 
    155   PageMargins margins;
    156   switch (margin_type_) {
    157     case DEFAULT_MARGINS: {
    158       // Default margins 1.0cm = ~2/5 of an inch.
    159       int margin_printer_units = ConvertUnit(1000, kHundrethsMMPerInch,
    160                                              units_per_inch);
    161       margins.header = header_footer_text_height;
    162       margins.footer = header_footer_text_height;
    163       margins.top = margin_printer_units;
    164       margins.bottom = margin_printer_units;
    165       margins.left = margin_printer_units;
    166       margins.right = margin_printer_units;
    167       break;
    168     }
    169     case NO_MARGINS:
    170     case PRINTABLE_AREA_MARGINS: {
    171       margins.header = 0;
    172       margins.footer = 0;
    173       margins.top = 0;
    174       margins.bottom = 0;
    175       margins.left = 0;
    176       margins.right = 0;
    177       break;
    178     }
    179     case CUSTOM_MARGINS: {
    180       margins.header = 0;
    181       margins.footer = 0;
    182       margins.top = ConvertUnitDouble(
    183           requested_custom_margins_in_points_.top,
    184           kPointsPerInch,
    185           units_per_inch);
    186       margins.bottom = ConvertUnitDouble(
    187           requested_custom_margins_in_points_.bottom,
    188           kPointsPerInch,
    189           units_per_inch);
    190       margins.left = ConvertUnitDouble(
    191           requested_custom_margins_in_points_.left,
    192           kPointsPerInch,
    193           units_per_inch);
    194       margins.right = ConvertUnitDouble(
    195           requested_custom_margins_in_points_.right,
    196           kPointsPerInch,
    197           units_per_inch);
    198       break;
    199     }
    200     default: {
    201       NOTREACHED();
    202     }
    203   }
    204 
    205   if (margin_type_ == DEFAULT_MARGINS || margin_type_ == PRINTABLE_AREA_MARGINS)
    206     page_setup_device_units_.SetRequestedMargins(margins);
    207   else
    208     page_setup_device_units_.ForceRequestedMargins(margins);
    209 
    210   page_setup_device_units_.Init(physical_size_device_units,
    211                                 printable_area_device_units,
    212                                 header_footer_text_height);
    213   if (landscape_ && landscape_needs_flip)
    214     page_setup_device_units_.FlipOrientation();
    215 }
    216 
    217 void 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 
    223 int PrintSettings::NewCookie() {
    224   // A cookie of 0 is used to mark a document as unassigned, count from 1.
    225   return cookie_seq.GetNext() + 1;
    226 }
    227 
    228 void PrintSettings::SetOrientation(bool landscape) {
    229   if (landscape_ != landscape) {
    230     landscape_ = landscape;
    231     page_setup_device_units_.FlipOrientation();
    232   }
    233 }
    234 
    235 }  // namespace printing
    236