15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings_initializer_mac.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h"
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "printing/units.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintSettingsInitializerMac::InitPrintSettings(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PMPrinter printer,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PMPageFormat page_format,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintSettings* print_settings) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_settings->set_device_name(
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::SysCFStringRefToUTF16(PMPrinterGetID(printer)));
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMOrientation orientation = kPMPortrait;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMGetOrientation(page_format, &orientation);
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_settings->SetOrientation(orientation == kPMLandscape);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UInt32 resolution_count = 0;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMResolution best_resolution = { 72.0, 72.0 };
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OSStatus status = PMPrinterGetPrinterResolutionCount(printer,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       &resolution_count);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status == noErr) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Resolution indexes are 1-based.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32 i = 1; i <= resolution_count; ++i) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PMResolution resolution;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PMPrinterGetIndexedPrinterResolution(printer, i, &resolution);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (resolution.hRes > best_resolution.hRes)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        best_resolution = resolution;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int dpi = best_resolution.hRes;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_settings->set_dpi(dpi);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(dpi, best_resolution.vRes);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get printable area and paper rects (in points)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMRect page_rect, paper_rect;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMGetAdjustedPageRect(page_format, &page_rect);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PMGetAdjustedPaperRect(page_format, &paper_rect);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Device units are in points. Units per inch is 72.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size physical_size_device_units(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (paper_rect.right - paper_rect.left),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (paper_rect.bottom - paper_rect.top));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect printable_area_device_units(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (page_rect.left - paper_rect.left),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (page_rect.top - paper_rect.top),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (page_rect.right - page_rect.left),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (page_rect.bottom - page_rect.top));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_EQ(print_settings->device_units_per_inch(), kPointsPerInch);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_settings->SetPrinterPrintableArea(physical_size_device_units,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          printable_area_device_units,
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                          false);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
65