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 cfadc098230320b8857352a963b73c052c0ce38e..0471a1c98b4b4f9f9e7e07667bf058a3f2f7a391 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" |
@@ -29,6 +31,7 @@ |
#include "content/public/browser/web_contents_view.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" |
@@ -44,7 +47,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 |
@@ -59,7 +62,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 = |
@@ -125,6 +129,31 @@ void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) { |
cookie_ = cookie; |
} |
+#if defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
+void PrintViewManagerBase::OnPdfToEmfConverted( |
+ const PrintHostMsg_DidPrintPage_Params& params, |
+ bool success, |
+ const base::FilePath& emf_file) { |
+ PrintedDocument* document = print_job_->document(); |
Vitaly Buka (NO REVIEWS)
2014/04/25 22:35:24
this metafile could be multi paged. it's likely in
Vitaly Buka (NO REVIEWS)
2014/04/25 22:42:16
single string -> single stream of concatenated pag
scottmg
2014/04/25 22:45:10
This is only called from OnDidPrintPage, where it'
|
+ if (!document) |
+ return; |
+ scoped_ptr<printing::Emf> metafile(new printing::Emf); |
+ if (!metafile->InitFromFile(emf_file)) { |
+ NOTREACHED() << "Invalid metafile"; |
+ web_contents()->Stop(); |
+ return; |
+ } |
+ // 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); |
+ |
+ ShouldQuitFromInnerMessageLoop(); |
+} |
+#endif // PRINTING_WIN_USES_PDF_AS_METAFILE |
+ |
void PrintViewManagerBase::OnDidPrintPage( |
const PrintHostMsg_DidPrintPage_Params& params) { |
if (!OpportunisticallyCreatePrintJob(params.document_cookie)) |
@@ -137,9 +166,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 |
@@ -153,6 +182,7 @@ void PrintViewManagerBase::OnDidPrintPage( |
} |
} |
+#if !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)) { |
@@ -162,7 +192,6 @@ 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); |
@@ -179,7 +208,6 @@ void PrintViewManagerBase::OnDidPrintPage( |
return; |
} |
} |
-#endif |
// Update the rendered document. It will send notifications to the listener. |
document->SetPage(params.page_number, |
@@ -189,6 +217,30 @@ void PrintViewManagerBase::OnDidPrintPage( |
params.content_area); |
ShouldQuitFromInnerMessageLoop(); |
+#elif defined(PRINTING_WIN_USES_PDF_AS_METAFILE) |
+ base::RefCountedBytes* bytes = new base::RefCountedBytes( |
+ reinterpret_cast<const unsigned char*>(shared_buf.memory()), |
+ params.data_size); |
+ |
+ if (!pdf_to_emf_converter_) |
+ pdf_to_emf_converter_ = PdfToEmfConverter::CreateDefault(); |
+ |
+ /* XXX |
scottmg
2014/04/25 20:47:18
Not sure what the correct way to get a printer DC
Vitaly Buka (NO REVIEWS)
2014/04/25 22:35:24
you don't need dc here, params.printable_area is p
scottmg
2014/04/25 22:45:10
Ah! Thanks.
|
+ int printer_dpi = ::GetDeviceCaps(printer_dc_.Get(), LOGPIXELSX); |
+ int dc_width = GetDeviceCaps(printer_dc_.Get(), PHYSICALWIDTH); |
+ int dc_height = GetDeviceCaps(printer_dc_.Get(), PHYSICALHEIGHT); |
+ */ |
+ int printer_dpi = 300; |
+ int dc_width = 300*8.5; |
+ int dc_height = 300*11; |
+ gfx::Rect render_area(0, 0, dc_width, dc_height); |
+ pdf_to_emf_converter_->Start( |
+ bytes, |
+ printing::PdfRenderSettings(render_area, printer_dpi, false), |
+ base::Bind(&PrintViewManagerBase::OnPdfToEmfConverted, |
+ base::Unretained(this), |
+ params)); |
+#endif |
} |
void PrintViewManagerBase::OnPrintingFailed(int cookie) { |
@@ -395,7 +447,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 |
} |