0
Files
src/printing/print_settings_initializer_mac.cc
Andy Phan f864aac3d5 Provide a default DPI if DPI is missing
When the DPI entry is missing, the page size, content size, and
printable area of PrintSettings will be empty. Some printers may not set
their DPI, so provide a OS-dependent default DPI.

Change-Id: Ic18cd6543801228bd18e69e3b9607c48250551d7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4222980
Commit-Queue: Andy Phan <andyphan@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1108038}
2023-02-22 00:12:29 +00:00

63 lines
2.2 KiB
C++

// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "printing/print_settings_initializer_mac.h"
#include <stdint.h>
#include "base/strings/sys_string_conversions.h"
#include "printing/print_settings.h"
#include "printing/units.h"
namespace printing {
// static
void PrintSettingsInitializerMac::InitPrintSettings(
PMPrinter printer,
PMPageFormat page_format,
PrintSettings* print_settings) {
print_settings->set_device_name(
base::SysCFStringRefToUTF16(PMPrinterGetID(printer)));
PMOrientation orientation = kPMPortrait;
PMGetOrientation(page_format, &orientation);
print_settings->SetOrientation(orientation == kPMLandscape);
UInt32 resolution_count = 0;
PMResolution best_resolution = {kDefaultMacDpi, kDefaultMacDpi};
OSStatus status =
PMPrinterGetPrinterResolutionCount(printer, &resolution_count);
if (status == noErr) {
// Resolution indexes are 1-based.
for (uint32_t i = 1; i <= resolution_count; ++i) {
PMResolution resolution;
PMPrinterGetIndexedPrinterResolution(printer, i, &resolution);
if (resolution.hRes > best_resolution.hRes)
best_resolution = resolution;
}
}
int dpi = best_resolution.hRes;
print_settings->set_dpi(dpi);
DCHECK_EQ(dpi, best_resolution.vRes);
// Get printable area and paper rects (in points)
PMRect page_rect, paper_rect;
PMGetAdjustedPageRect(page_format, &page_rect);
PMGetAdjustedPaperRect(page_format, &paper_rect);
// Device units are in points. Units per inch is 72.
gfx::Size physical_size_device_units((paper_rect.right - paper_rect.left),
(paper_rect.bottom - paper_rect.top));
gfx::Rect printable_area_device_units(
(page_rect.left - paper_rect.left), (page_rect.top - paper_rect.top),
(page_rect.right - page_rect.left), (page_rect.bottom - page_rect.top));
DCHECK_EQ(print_settings->device_units_per_inch(), kPointsPerInch);
print_settings->SetPrinterPrintableArea(physical_size_device_units,
printable_area_device_units, false);
}
} // namespace printing