Index: chrome/renderer/print_web_view_helper_win.cc |
=================================================================== |
--- chrome/renderer/print_web_view_helper_win.cc (revision 134542) |
+++ chrome/renderer/print_web_view_helper_win.cc (working copy) |
@@ -12,6 +12,7 @@ |
#include "base/win/scoped_hdc.h" |
#include "base/win/scoped_select_object.h" |
#include "chrome/common/print_messages.h" |
+#include "printing/custom_scaling.h" |
#include "printing/metafile.h" |
#include "printing/metafile_impl.h" |
#include "printing/metafile_skia_wrapper.h" |
@@ -114,46 +115,44 @@ |
// actual printing. |
double actual_shrink = static_cast<float>(params.params.desired_dpi / |
params.params.dpi); |
- if (print_for_preview_) { |
- // While printing from the preview, we are using PDF to print. |
- // It creates a temp metafile based on screen DC. The standard scale factor |
- // may not fit an entire content of the PDF to the metafile. It will cause |
- // output to be cutoff. |
- // (See http://code.google.com/p/chromium-os/issues/detail?id=16088 and |
- // related Chrome bugs) |
- // In such case we need to calculate the same scale ratio PDF plugin will |
- // calculate during printing. |
- // TODO(gene): Revisit current implementation and address comments below. |
- // (http://code.google.com/p/chromium/issues/detail?id=123408) |
- // Ideally, we should return this parameter from the plugin to avoid code |
- // duplication. However, currently the call stack involves WebKit and at |
- // some point shrink factor was cutoff and always returns 1.0. |
- // webkit::ppapi::PluginInstance::PrintPDFOutput - ratio calculated here |
- // webkit::ppapi::PluginInstance::PrintPageHelper |
- // webkit::ppapi::PluginInstance::PrintPage |
- // webkit::ppapi::WebPluginImpl::printPage |
- // WebKit::WebPluginContainerImpl::printPage |
- // WebKit::ChromePluginPrintContext::spoolPage - always return 1.0 scale |
- // WebKit::WebFrameImpl::printPage |
- // PrintWebViewHelper::RenderPage |
- // PrintWebViewHelper::PrintPageInternal |
- // |
- // Another solution is to build in scaling factor into metafile itself |
- // (for example, GDI comments), and make metafile playback to take care of |
- // scaling automatically. |
- actual_shrink = gfx::CalculatePageScale( |
- metafile->context(), |
- params.params.content_size.width(), |
- params.params.content_size.height()); |
- } |
- |
gfx::Size page_size_in_dpi; |
gfx::Rect content_area_in_dpi; |
+ |
+ // If we are printing PDF, it may not fit into metafile using 72dpi. |
+ // (Metafile is based on screen resolution here.) |
+ // (See http://code.google.com/p/chromium-os/issues/detail?id=16088) |
+ // If PDF plugin encounter this issue it will save custom scale in TLS, |
+ // so we can apply the same scaling factor here. |
+ // If will do so ONLY if default scaling does not work. |
+ // TODO(gene): We should revisit this solution for the next versions. |
+ // Two possible solutions: |
+ // We can create metafile of the right size (or resizable) |
+ // https://code.google.com/p/chromium/issues/detail?id=126037 |
+ // or |
+ // We should return scale factor all the way from the plugin: |
+ // webkit::ppapi::PluginInstance::PrintPDFOutput - scale calculated here |
+ // webkit::ppapi::PluginInstance::PrintPageHelper |
+ // webkit::ppapi::PluginInstance::PrintPage |
+ // webkit::ppapi::WebPluginImpl::printPage |
+ // WebKit::WebPluginContainerImpl::printPage |
+ // WebKit::ChromePluginPrintContext::spoolPage - always return 1.0 scale |
+ // WebKit::WebFrameImpl::printPage |
+ // PrintWebViewHelper::RenderPage |
+ // PrintWebViewHelper::PrintPageInternal |
+ |
+ printing::ClearCustomPrintingPageScale(); |
+ |
// Render page for printing. |
metafile.reset(RenderPage(params.params, page_number, frame, false, |
metafile.get(), &actual_shrink, &page_size_in_dpi, |
&content_area_in_dpi)); |
+ double custom_scale; |
+ if (printing::GetCustomPrintingPageScale(&custom_scale)) { |
+ actual_shrink = custom_scale; |
+ printing::ClearCustomPrintingPageScale(); |
+ } |
+ |
// Close the device context to retrieve the compiled metafile. |
if (!metafile->FinishDocument()) |
NOTREACHED(); |