Index: chrome/renderer/webplugin_delegate_pepper.cc |
=================================================================== |
--- chrome/renderer/webplugin_delegate_pepper.cc (revision 51151) |
+++ chrome/renderer/webplugin_delegate_pepper.cc (working copy) |
@@ -1132,15 +1132,15 @@ |
current_printer_dpi_ = printer_dpi; |
} |
} |
+#if defined (OS_LINUX) |
+ num_pages_ = num_pages; |
+ pdf_output_done_ = false; |
+#endif // (OS_LINUX) |
return num_pages; |
} |
bool WebPluginDelegatePepper::VectorPrintPage(int page_number, |
WebKit::WebCanvas* canvas) { |
-#if !defined(OS_WIN) && !defined(OS_MACOSX) |
- // TODO(sanjeevr): Add vector print support for Linux. |
- return false; |
-#endif // !defined(OS_WIN) && !defined(OS_MACOSX) |
NPPPrintExtensions* print_extensions = GetPrintExtensions(); |
if (!print_extensions) |
return false; |
@@ -1160,13 +1160,40 @@ |
unsigned char* pdf_output = NULL; |
int32 output_size = 0; |
- NPError err = print_extensions->printPageAsPDF(instance()->npp(), page_number, |
- &pdf_output, &output_size); |
+ NPPrintPageNumberRange page_range; |
+#if defined(OS_LINUX) |
+ // On Linux we will try and output all pages as PDF in the first call to |
+ // PrintPage. This is a temporary hack. |
+ // TODO(sanjeevr): Remove this hack and fix this by changing the print |
+ // interfaces for WebFrame and WebPlugin. |
+ if (page_number != 0) |
+ return pdf_output_done_; |
+ page_range.firstPageNumber = 0; |
+ page_range.lastPageNumber = num_pages_ - 1; |
+#else // defined(OS_LINUX) |
+ page_range.firstPageNumber = page_range.lastPageNumber = page_number; |
+#endif // defined(OS_LINUX) |
+ NPError err = print_extensions->printPagesAsPDF(instance()->npp(), |
+ &page_range, 1, |
+ &pdf_output, &output_size); |
if (err != NPERR_NO_ERROR) |
return false; |
bool ret = false; |
-#if defined(OS_MACOSX) |
+#if defined(OS_LINUX) |
+ // On Linux we need to get the backing PdfPsMetafile and write the bits |
+ // directly. |
+ cairo_t* context = canvas->beginPlatformPaint(); |
+ printing::NativeMetafile* metafile = |
+ printing::NativeMetafile::FromCairoContext(context); |
+ DCHECK(metafile); |
+ if (metafile) { |
+ ret = metafile->SetRawData(pdf_output, output_size); |
+ if (ret) |
+ pdf_output_done_ = true; |
+ } |
+ canvas->endPlatformPaint(); |
+#elif defined(OS_MACOSX) |
printing::NativeMetafile metafile; |
// Create a PDF metafile and render from there into the passed in context. |
if (metafile.Init(pdf_output, output_size)) { |
@@ -1306,7 +1333,10 @@ |
current_printer_dpi_ = -1; |
#if defined(OS_MACOSX) |
last_printed_page_ = SkBitmap(); |
-#endif // defined(OS_MACOSX) |
+#elif defined(OS_LINUX) |
+ num_pages_ = 0; |
+ pdf_output_done_ = false; |
+#endif // defined(OS_LINUX) |
} |
bool WebPluginDelegatePepper::SupportsFind() { |
@@ -1322,6 +1352,10 @@ |
instance_(instance), |
nested_delegate_(NULL), |
current_printer_dpi_(-1), |
+#if defined (OS_LINUX) |
+ num_pages_(0), |
+ pdf_output_done_(false), |
+#endif // (OS_LINUX) |
#if defined(ENABLE_GPU) |
command_buffer_(NULL), |
#endif |