Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(38)

Unified Diff: chrome/browser/printing/print_view_manager_base.cc

Issue 255543006: Printing on Windows via PDF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove ref to internal_pdf and rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/printing/print_view_manager_base.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..f10180891110e44923841330f69b777a5804b4c6 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -40,10 +40,17 @@
#include "chrome/browser/printing/print_error_dialog.h"
#endif
+#if defined(WIN_PDF_METAFILE_FOR_PRINTING)
+#include "base/memory/ref_counted.h"
+#include "base/memory/ref_counted_memory.h"
+#include "chrome/browser/printing/pdf_to_emf_converter.h"
+#include "printing/pdf_render_settings.h"
+#endif
+
using base::TimeDelta;
using content::BrowserThread;
-#if defined(OS_WIN)
+#if defined(OS_WIN) && !defined(WIN_PDF_METAFILE_FOR_PRINTING)
// Limits memory usage by raster to 64 MiB.
const int kMaxRasterSizeInPixels = 16*1024*1024;
#endif
@@ -58,7 +65,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(WIN_PDF_METAFILE_FOR_PRINTING)
expecting_first_page_ = true;
#endif
Profile* profile =
@@ -124,8 +132,36 @@ void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) {
cookie_ = cookie;
}
+#if defined(WIN_PDF_METAFILE_FOR_PRINTING)
+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;
+
+ for (size_t i = 0; i < emf_files.size(); ++i) {
+ scoped_ptr<printing::Emf> metafile(new printing::Emf);
+ if (!metafile->InitFromFile(emf_files[i])) {
+ NOTREACHED() << "Invalid metafile";
+ web_contents()->Stop();
+ return;
+ }
+ // Update the rendered document. It will send notifications to the listener.
+ document->SetPage(i,
+ metafile.release(),
+ scale_factor,
+ params.page_size,
+ params.content_area);
+ }
+
+ ShouldQuitFromInnerMessageLoop();
+}
+#endif // WIN_PDF_METAFILE_FOR_PRINTING
+
void PrintViewManagerBase::OnDidPrintPage(
- const PrintHostMsg_DidPrintPage_Params& params) {
+ const PrintHostMsg_DidPrintPage_Params& params) {
if (!OpportunisticallyCreatePrintJob(params.document_cookie))
return;
@@ -136,9 +172,10 @@ void PrintViewManagerBase::OnDidPrintPage(
return;
}
-#if defined(OS_WIN) || defined(OS_MACOSX)
+#if (defined(OS_WIN) && !defined(WIN_PDF_METAFILE_FOR_PRINTING)) || \
+ defined(OS_MACOSX)
const bool metafile_must_be_valid = true;
-#elif defined(OS_POSIX)
+#elif defined(OS_POSIX) || defined(WIN_PDF_METAFILE_FOR_PRINTING)
const bool metafile_must_be_valid = expecting_first_page_;
expecting_first_page_ = false;
#endif
@@ -161,10 +198,10 @@ void PrintViewManagerBase::OnDidPrintPage(
}
}
-#if defined(OS_WIN)
+#if defined(OS_WIN) && !defined(WIN_PDF_METAFILE_FOR_PRINTING)
bool big_emf = (params.data_size && params.data_size >= kMetafileMaxSize);
- int raster_size = std::min(params.page_size.GetArea(),
- kMaxRasterSizeInPixels);
+ int raster_size =
+ std::min(params.page_size.GetArea(), kMaxRasterSizeInPixels);
if (big_emf) {
scoped_ptr<NativeMetafile> raster_metafile(
metafile->RasterizeMetafile(raster_size));
@@ -178,16 +215,35 @@ void PrintViewManagerBase::OnDidPrintPage(
return;
}
}
-#endif
+#endif // OS_WIN && !WIN_PDF_METAFILE_FOR_PRINTING
+#if !defined(WIN_PDF_METAFILE_FOR_PRINTING)
// 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,
+ params.page_size,
+ params.content_area);
ShouldQuitFromInnerMessageLoop();
+#else
+ if (metafile_must_be_valid) {
+ scoped_refptr<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();
+
+ const int kPrinterDpi = 600;
+ pdf_to_emf_converter_->Start(
+ bytes,
+ printing::PdfRenderSettings(params.content_area, kPrinterDpi, false),
+ base::Bind(&PrintViewManagerBase::OnPdfToEmfConverted,
+ base::Unretained(this),
+ params));
+ }
+#endif // !WIN_PDF_METAFILE_FOR_PRINTING
}
void PrintViewManagerBase::OnPrintingFailed(int cookie) {
@@ -394,7 +450,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(WIN_PDF_METAFILE_FOR_PRINTING)
expecting_first_page_ = true;
#endif
}
« no previous file with comments | « chrome/browser/printing/print_view_manager_base.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698