Chromium Code Reviews| Index: chrome/browser/printing/print_view_manager_base.cc |
| diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc |
| index 53598aa8a78e5bbcea1399880c4bf37929604e87..07d7870872ad29c202287980b0fc24805ba41e60 100644 |
| --- a/chrome/browser/printing/print_view_manager_base.cc |
| +++ b/chrome/browser/printing/print_view_manager_base.cc |
| @@ -7,12 +7,14 @@ |
| #include <map> |
| #include "base/bind.h" |
| +#include "base/memory/ref_counted_memory.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/timer/timer.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| +#include "chrome/browser/printing/pdf_to_emf_converter.h" |
| #include "chrome/browser/printing/print_job.h" |
| #include "chrome/browser/printing/print_job_manager.h" |
| #include "chrome/browser/printing/printer_query.h" |
| @@ -28,6 +30,7 @@ |
| #include "content/public/browser/web_contents.h" |
| #include "grit/generated_resources.h" |
| #include "printing/metafile_impl.h" |
| +#include "printing/pdf_render_settings.h" |
| #include "printing/printed_document.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -43,7 +46,7 @@ |
| using base::TimeDelta; |
| using content::BrowserThread; |
| -#if defined(OS_WIN) |
| +#if !defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| // Limits memory usage by raster to 64 MiB. |
| const int kMaxRasterSizeInPixels = 16*1024*1024; |
| #endif |
| @@ -58,7 +61,8 @@ PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) |
| cookie_(0), |
| queue_(g_browser_process->print_job_manager()->queue()) { |
| DCHECK(queue_); |
| -#if defined(OS_POSIX) && !defined(OS_MACOSX) |
| +#if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \ |
| + defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| expecting_first_page_ = true; |
| #endif |
| Profile* profile = |
| @@ -124,8 +128,39 @@ void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) { |
| cookie_ = cookie; |
| } |
| +#if defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| +void PrintViewManagerBase::OnPdfToEmfConverted( |
| + const PrintHostMsg_DidPrintPage_Params& params, |
| + double scale_factor, |
| + const std::vector<base::FilePath>& emf_files) { |
| + PrintedDocument* document = print_job_->document(); |
| + if (!document) |
| + return; |
| + |
| + int page_number = 0; |
| + for (std::vector<base::FilePath>::const_iterator i(emf_files.begin()); |
|
Vitaly Buka (NO REVIEWS)
2014/05/13 23:54:33
I guess for (size_t i = ) is more appropriate here
scottmg
2014/05/14 00:34:48
Done.
|
| + i != emf_files.end(); |
| + ++i, ++page_number) { |
| + scoped_ptr<printing::Emf> metafile(new printing::Emf); |
| + if (!metafile->InitFromFile(*i)) { |
| + NOTREACHED() << "Invalid metafile"; |
| + web_contents()->Stop(); |
| + return; |
| + } |
| + // Update the rendered document. It will send notifications to the listener. |
| + document->SetPage(page_number, |
| + metafile.release(), |
| + scale_factor, |
| + params.page_size, |
| + params.content_area); |
| + } |
| + |
| + ShouldQuitFromInnerMessageLoop(); |
| +} |
| +#endif // PRINTING_WIN_USES_PDF_AS_METAFILE |
| + |
| void PrintViewManagerBase::OnDidPrintPage( |
| - const PrintHostMsg_DidPrintPage_Params& params) { |
| + const PrintHostMsg_DidPrintPage_Params& params) { |
| if (!OpportunisticallyCreatePrintJob(params.document_cookie)) |
| return; |
| @@ -136,9 +171,9 @@ void PrintViewManagerBase::OnDidPrintPage( |
| return; |
| } |
| -#if defined(OS_WIN) || defined(OS_MACOSX) |
| +#if !defined(PRINTING_WIN_USES_PDF_AS_METAFILE) || defined(OS_MACOSX) |
| const bool metafile_must_be_valid = true; |
| -#elif defined(OS_POSIX) |
| +#elif defined(OS_POSIX) || defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| const bool metafile_must_be_valid = expecting_first_page_; |
| expecting_first_page_ = false; |
| #endif |
| @@ -152,6 +187,7 @@ void PrintViewManagerBase::OnDidPrintPage( |
| } |
| } |
| +#if defined(OS_WIN) && !defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| scoped_ptr<NativeMetafile> metafile(new NativeMetafile); |
| if (metafile_must_be_valid) { |
| if (!metafile->InitFromData(shared_buf.memory(), params.data_size)) { |
| @@ -161,13 +197,12 @@ void PrintViewManagerBase::OnDidPrintPage( |
| } |
| } |
| -#if defined(OS_WIN) |
| bool big_emf = (params.data_size && params.data_size >= kMetafileMaxSize); |
| int raster_size = std::min(params.page_size.GetArea(), |
| - kMaxRasterSizeInPixels); |
| + kMaxRasterSizeInPixels); |
|
Vitaly Buka (NO REVIEWS)
2014/05/13 23:54:33
missaligned
scottmg
2014/05/14 00:34:48
Done.
|
| if (big_emf) { |
| scoped_ptr<NativeMetafile> raster_metafile( |
| - metafile->RasterizeMetafile(raster_size)); |
| + metafile->RasterizeMetafile(raster_size)); |
| if (raster_metafile.get()) { |
| metafile.swap(raster_metafile); |
| } else if (big_emf) { |
| @@ -178,16 +213,35 @@ void PrintViewManagerBase::OnDidPrintPage( |
| return; |
| } |
| } |
| -#endif |
| +#endif // OS_WIN && !PRINTING_WIN_USES_PDF_AS_METAFILE |
| +#if !defined(OS_WIN) || !defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| // Update the rendered document. It will send notifications to the listener. |
| document->SetPage(params.page_number, |
| - metafile.release(), |
| - params.actual_shrink, |
| - params.page_size, |
| - params.content_area); |
| + metafile.release(), |
| + params.actual_shrink, |
|
Vitaly Buka (NO REVIEWS)
2014/05/13 23:54:33
missaligned
scottmg
2014/05/14 00:34:48
Done.
|
| + params.page_size, |
| + params.content_area); |
| ShouldQuitFromInnerMessageLoop(); |
| +#else |
| + if (metafile_must_be_valid) { |
| + base::RefCountedBytes* bytes = new base::RefCountedBytes( |
|
Vitaly Buka (NO REVIEWS)
2014/05/13 23:54:33
scoped_refptr<base::RefCountedBytes>
scottmg
2014/05/14 00:34:48
Done.
|
| + reinterpret_cast<const unsigned char*>(shared_buf.memory()), |
| + params.data_size); |
| + |
| + if (!pdf_to_emf_converter_) |
| + pdf_to_emf_converter_ = PdfToEmfConverter::CreateDefault(); |
| + |
| + const int printer_dpi = 600; |
| + pdf_to_emf_converter_->Start( |
| + bytes, |
| + printing::PdfRenderSettings(params.content_area, printer_dpi, false), |
| + base::Bind(&PrintViewManagerBase::OnPdfToEmfConverted, |
| + base::Unretained(this), |
| + params)); |
| + } |
| +#endif // !PRINTING_WIN_USES_PDF_AS_METAFILE |
| } |
| void PrintViewManagerBase::OnPrintingFailed(int cookie) { |
| @@ -394,7 +448,8 @@ void PrintViewManagerBase::DisconnectFromCurrentPrintJob() { |
| // DO NOT wait for the job to finish. |
| ReleasePrintJob(); |
| } |
| -#if defined(OS_POSIX) && !defined(OS_MACOSX) |
| +#if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \ |
| + defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
| expecting_first_page_ = true; |
| #endif |
| } |