Home | History | Annotate | Download | only in printing
      1 // Copyright (c) 2011 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_initializer_mac.h"
      6 
      7 #include "base/strings/sys_string_conversions.h"
      8 #include "printing/print_settings.h"
      9 #include "printing/units.h"
     10 
     11 namespace printing {
     12 
     13 // static
     14 void PrintSettingsInitializerMac::InitPrintSettings(
     15     PMPrinter printer,
     16     PMPageFormat page_format,
     17     PrintSettings* print_settings) {
     18   print_settings->set_device_name(
     19       base::SysCFStringRefToUTF16(PMPrinterGetID(printer)));
     20 
     21   PMOrientation orientation = kPMPortrait;
     22   PMGetOrientation(page_format, &orientation);
     23   print_settings->SetOrientation(orientation == kPMLandscape);
     24 
     25   UInt32 resolution_count = 0;
     26   PMResolution best_resolution = { 72.0, 72.0 };
     27   OSStatus status = PMPrinterGetPrinterResolutionCount(printer,
     28                                                        &resolution_count);
     29   if (status == noErr) {
     30     // Resolution indexes are 1-based.
     31     for (uint32 i = 1; i <= resolution_count; ++i) {
     32       PMResolution resolution;
     33       PMPrinterGetIndexedPrinterResolution(printer, i, &resolution);
     34       if (resolution.hRes > best_resolution.hRes)
     35         best_resolution = resolution;
     36     }
     37   }
     38   int dpi = best_resolution.hRes;
     39   print_settings->set_dpi(dpi);
     40 
     41   DCHECK_EQ(dpi, best_resolution.vRes);
     42 
     43   // Get printable area and paper rects (in points)
     44   PMRect page_rect, paper_rect;
     45   PMGetAdjustedPageRect(page_format, &page_rect);
     46   PMGetAdjustedPaperRect(page_format, &paper_rect);
     47 
     48   // Device units are in points. Units per inch is 72.
     49   gfx::Size physical_size_device_units(
     50       (paper_rect.right - paper_rect.left),
     51       (paper_rect.bottom - paper_rect.top));
     52   gfx::Rect printable_area_device_units(
     53       (page_rect.left - paper_rect.left),
     54       (page_rect.top - paper_rect.top),
     55       (page_rect.right - page_rect.left),
     56       (page_rect.bottom - page_rect.top));
     57 
     58   DCHECK_EQ(print_settings->device_units_per_inch(), kPointsPerInch);
     59   print_settings->SetPrinterPrintableArea(physical_size_device_units,
     60                                           printable_area_device_units,
     61                                           false);
     62 }
     63 
     64 }  // namespace printing
     65