Apply paper size selection for local printers on OSX.

BUG=239879

Review URL: https://codereview.chromium.org/345493003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@278603 0039d316-1c4b-4281-b951-d872f2087c98
parent 119e9e66
...@@ -54,13 +54,18 @@ class PRINTING_EXPORT PrintingContextMac : public PrintingContext { ...@@ -54,13 +54,18 @@ class PRINTING_EXPORT PrintingContextMac : public PrintingContext {
PageRanges GetPageRangesFromPrintInfo(); PageRanges GetPageRangesFromPrintInfo();
// Updates |print_info_| to use the given printer. // Updates |print_info_| to use the given printer.
// Returns true if the printer was set else returns false. // Returns true if the printer was set.
bool SetPrinter(const std::string& device_name); bool SetPrinter(const std::string& device_name);
// Updates |print_info_| page format with user default paper information. // Updates |print_info_| page format with paper selected by user. If paper was
// Returns true if the paper was set else returns false. // not selected, default system paper is used.
// Returns true if the paper was set.
bool UpdatePageFormatWithPaperInfo(); bool UpdatePageFormatWithPaperInfo();
// Updates |print_info_| page format with |paper|.
// Returns true if the paper was set.
bool UpdatePageFormatWithPaper(PMPaper paper, PMPageFormat page_format);
// Sets the print job destination type as preview job. // Sets the print job destination type as preview job.
// Returns true if the print job destination type is set. // Returns true if the print job destination type is set.
bool SetPrintPreviewJob(); bool SetPrintPreviewJob();
......
...@@ -24,14 +24,45 @@ namespace printing { ...@@ -24,14 +24,45 @@ namespace printing {
namespace { namespace {
const int kMaxPaperSizeDiffereceInPoints = 2;
// Return true if PPD name of paper is equal. // Return true if PPD name of paper is equal.
bool IsPaperNameEqual(const PMPaper& paper1, const PMPaper& paper2) { bool IsPaperNameEqual(CFStringRef name1, const PMPaper& paper2) {
CFStringRef name1 = NULL;
CFStringRef name2 = NULL; CFStringRef name2 = NULL;
return (PMPaperGetPPDPaperName(paper1, &name1) == noErr) && return (name1 && PMPaperGetPPDPaperName(paper2, &name2) == noErr) &&
(PMPaperGetPPDPaperName(paper2, &name2) == noErr) && (CFStringCompare(name1, name2, kCFCompareCaseInsensitive) ==
(CFStringCompare(name1, name2, kCFCompareEqualTo);
kCFCompareCaseInsensitive) == kCFCompareEqualTo); }
PMPaper MatchPaper(CFArrayRef paper_list,
CFStringRef name,
double width,
double height) {
double best_match = std::numeric_limits<double>::max();
PMPaper best_matching_paper = NULL;
int num_papers = CFArrayGetCount(paper_list);
for (int i = 0; i < num_papers; ++i) {
PMPaper paper = (PMPaper)[(NSArray*)paper_list objectAtIndex : i];
double paper_width = 0.0;
double paper_height = 0.0;
PMPaperGetWidth(paper, &paper_width);
PMPaperGetHeight(paper, &paper_height);
double difference =
std::max(fabs(width - paper_width), fabs(height - paper_height));
// Ignore papers with size too different from expected.
if (difference > kMaxPaperSizeDiffereceInPoints)
continue;
if (name && IsPaperNameEqual(name, paper))
return paper;
if (difference < best_match) {
best_matching_paper = paper;
best_match = difference;
}
}
return best_matching_paper;
} }
} // namespace } // namespace
...@@ -214,7 +245,7 @@ bool PrintingContextMac::SetPrinter(const std::string& device_name) { ...@@ -214,7 +245,7 @@ bool PrintingContextMac::SetPrinter(const std::string& device_name) {
} }
PMPrinter new_printer = PMPrinterCreateFromPrinterID(new_printer_id.get()); PMPrinter new_printer = PMPrinterCreateFromPrinterID(new_printer_id.get());
if (new_printer == NULL) if (!new_printer)
return false; return false;
OSStatus status = PMSessionSetCurrentPMPrinter(print_session, new_printer); OSStatus status = PMSessionSetCurrentPMPrinter(print_session, new_printer);
...@@ -229,89 +260,75 @@ bool PrintingContextMac::UpdatePageFormatWithPaperInfo() { ...@@ -229,89 +260,75 @@ bool PrintingContextMac::UpdatePageFormatWithPaperInfo() {
PMPageFormat default_page_format = PMPageFormat default_page_format =
static_cast<PMPageFormat>([print_info_.get() PMPageFormat]); static_cast<PMPageFormat>([print_info_.get() PMPageFormat]);
PMPaper default_paper;
if (PMGetPageFormatPaper(default_page_format, &default_paper) != noErr)
return false;
double default_page_width = 0.0;
double default_page_height = 0.0;
if (PMPaperGetWidth(default_paper, &default_page_width) != noErr)
return false;
if (PMPaperGetHeight(default_paper, &default_page_height) != noErr)
return false;
PMPrinter current_printer = NULL; PMPrinter current_printer = NULL;
if (PMSessionGetCurrentPrinter(print_session, &current_printer) != noErr) if (PMSessionGetCurrentPrinter(print_session, &current_printer) != noErr)
return false; return false;
if (current_printer == nil) double page_width = 0.0;
return false; double page_height = 0.0;
base::ScopedCFTypeRef<CFStringRef> paper_name;
PMPaperMargins margins = {0};
const PrintSettings::RequestedMedia& media = settings_.requested_media();
if (media.IsDefault()) {
PMPaper default_paper;
if (PMGetPageFormatPaper(default_page_format, &default_paper) != noErr ||
PMPaperGetWidth(default_paper, &page_width) != noErr ||
PMPaperGetHeight(default_paper, &page_height) != noErr) {
return false;
}
// Ignore result, because we can continue without following.
CFStringRef tmp_paper_name = NULL;
PMPaperGetPPDPaperName(default_paper, &tmp_paper_name);
PMPaperGetMargins(default_paper, &margins);
paper_name.reset(tmp_paper_name, base::scoped_policy::RETAIN);
} else {
const double kMutiplier = kPointsPerInch / (10.0f * kHundrethsMMPerInch);
page_width = media.size_microns.width() * kMutiplier;
page_height = media.size_microns.height() * kMutiplier;
paper_name.reset(base::SysUTF8ToCFStringRef(media.vendor_id));
}
CFArrayRef paper_list = NULL; CFArrayRef paper_list = NULL;
if (PMPrinterGetPaperList(current_printer, &paper_list) != noErr) if (PMPrinterGetPaperList(current_printer, &paper_list) != noErr)
return false; return false;
double best_match = std::numeric_limits<double>::max(); PMPaper best_matching_paper =
PMPaper best_matching_paper = kPMNoData; MatchPaper(paper_list, paper_name, page_width, page_height);
int num_papers = CFArrayGetCount(paper_list);
for (int i = 0; i < num_papers; ++i) {
PMPaper paper = (PMPaper)[(NSArray*)paper_list objectAtIndex: i];
double paper_width = 0.0;
double paper_height = 0.0;
PMPaperGetWidth(paper, &paper_width);
PMPaperGetHeight(paper, &paper_height);
double current_match = std::max(fabs(default_page_width - paper_width),
fabs(default_page_height - paper_height));
// Ignore paper sizes that are very different.
if (current_match > 2)
continue;
current_match += IsPaperNameEqual(paper, default_paper) ? 0 : 1;
if (current_match < best_match) {
best_matching_paper = paper;
best_match = current_match;
}
}
if (best_matching_paper == kPMNoData) { if (best_matching_paper)
PMPaper paper = kPMNoData; return UpdatePageFormatWithPaper(best_matching_paper, default_page_format);
// Create a custom paper for the specified default page size.
PMPaperMargins default_margins;
if (PMPaperGetMargins(default_paper, &default_margins) != noErr)
return false;
const PMPaperMargins margins = // Do nothing if unmatched paper was default system paper.
{default_margins.top, default_margins.left, default_margins.bottom, if (media.IsDefault())
default_margins.right}; return true;
CFStringRef paper_id = CFSTR("Custom paper ID");
CFStringRef paper_name = CFSTR("Custom paper");
if (PMPaperCreateCustom(current_printer, paper_id, paper_name,
default_page_width, default_page_height, &margins, &paper) !=
noErr) {
return false;
}
[print_info_.get() updateFromPMPageFormat];
PMRelease(paper);
} else {
PMPageFormat chosen_page_format = NULL;
if (PMCreatePageFormat((PMPageFormat*) &chosen_page_format) != noErr)
return false;
// Create page format from that paper. PMPaper paper = NULL;
if (PMCreatePageFormatWithPMPaper(&chosen_page_format, if (PMPaperCreateCustom(current_printer,
best_matching_paper) != noErr) { CFSTR("Custom paper ID"),
PMRelease(chosen_page_format); CFSTR("Custom paper"),
return false; page_width,
} page_height,
// Copy over the original format with the new page format. &margins,
if (PMCopyPageFormat(chosen_page_format, default_page_format) != noErr) { &paper) != noErr) {
PMRelease(chosen_page_format); return false;
return false;
}
[print_info_.get() updateFromPMPageFormat];
PMRelease(chosen_page_format);
} }
return true; bool result = UpdatePageFormatWithPaper(paper, default_page_format);
PMRelease(paper);
return result;
}
bool PrintingContextMac::UpdatePageFormatWithPaper(PMPaper paper,
PMPageFormat page_format) {
PMPageFormat new_format = NULL;
if (PMCreatePageFormatWithPMPaper(&new_format, paper) != noErr)
return false;
// Copy over the original format with the new page format.
bool result = (PMCopyPageFormat(new_format, page_format) == noErr);
[print_info_.get() updateFromPMPageFormat];
PMRelease(new_format);
return result;
} }
bool PrintingContextMac::SetCopiesInPrintSettings(int copies) { bool PrintingContextMac::SetCopiesInPrintSettings(int copies) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment