print_settings_initializer_mac.cc 2.2 KB

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