diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 18:53:24 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 18:53:24 +0000 |
commit | efb9cc0a1597cba47d77f56f5a6528457087a69d (patch) | |
tree | 83ef9035a8a5c34719ab258407a52ba73df94d07 | |
parent | 7aee9e5bfc06cc556bf45cb9ae271d8a4123851a (diff) | |
download | chromium_src-efb9cc0a1597cba47d77f56f5a6528457087a69d.zip chromium_src-efb9cc0a1597cba47d77f56f5a6528457087a69d.tar.gz chromium_src-efb9cc0a1597cba47d77f56f5a6528457087a69d.tar.bz2 |
Match paper by both PPD name and size.
According http://lists.apple.com/archives/printing/2011/Nov/msg00001.html PMPaperGetPPDPaperName should provide better result than just size.
BUG=145237
Review URL: https://chromiumcodereview.appspot.com/10918117
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155783 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | printing/printing_context_mac.mm | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm index 36971c8..8936f29 100644 --- a/printing/printing_context_mac.mm +++ b/printing/printing_context_mac.mm @@ -7,6 +7,9 @@ #import <ApplicationServices/ApplicationServices.h> #import <AppKit/AppKit.h> +#import <iomanip> +#import <numeric> + #include "base/logging.h" #include "base/mac/scoped_cftyperef.h" #include "base/mac/scoped_nsautorelease_pool.h" @@ -17,6 +20,20 @@ namespace printing { +namespace { + +// Return true if PPD name of paper is equal. +bool IsPaperNameEqual(const PMPaper& paper1, const PMPaper& paper2) { + CFStringRef name1 = NULL; + CFStringRef name2 = NULL; + return (PMPaperGetPPDPaperName(paper1, &name1) == noErr) && + (PMPaperGetPPDPaperName(paper2, &name2) == noErr) && + (CFStringCompare(name1, name2, + kCFCompareCaseInsensitive) == kCFCompareEqualTo); +} + +} // namespace + // static PrintingContext* PrintingContext::Create(const std::string& app_locale) { return static_cast<PrintingContext*>(new PrintingContextMac(app_locale)); @@ -227,7 +244,8 @@ bool PrintingContextMac::UpdatePageFormatWithPaperInfo() { if (PMGetPageFormatPaper(default_page_format, &default_paper) != noErr) return false; - double default_page_width, default_page_height; + double default_page_width = 0.0; + double default_page_height = 0.0; if (PMPaperGetWidth(default_paper, &default_page_width) != noErr) return false; @@ -245,22 +263,24 @@ bool PrintingContextMac::UpdatePageFormatWithPaperInfo() { if (PMPrinterGetPaperList(current_printer, &paper_list) != noErr) return false; + double best_match = std::numeric_limits<double>::max(); PMPaper best_matching_paper = kPMNoData; 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, paper_height; + 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); - if (default_page_width == paper_width && - default_page_height == paper_height) { - best_matching_paper = paper; - break; - } - // Trying to find the best matching paper. - if (fabs(default_page_width - paper_width) < 2 && - fabs(default_page_height - paper_height) < 2) { + 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; } } |