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