// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/renderer/print_web_view_helper.h" #include "base/logging.h" #include "chrome/common/render_messages.h" #include "skia/ext/vector_canvas.h" #include "webkit/api/public/WebFrame.h" using WebKit::WebFrame; void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) { // If still not finished with earlier print request simply ignore. if (IsPrinting()) return; // TODO(myhuang): Get printing parameters via IPC. // For testing purpose, we hard-coded printing parameters here. // The paper size is US Letter (8.5 in. by 11 in.). // Using default margins: // Left = 0.25 in. // Right = 0.25 in. // Top = 0.25 in. // Bottom = 0.56 in. const int kDPI = 72; const int kWidth = (8.5-0.25-0.25) * kDPI; const int kHeight = (11-0.25-0.56) * kDPI; ViewMsg_Print_Params default_settings; default_settings.printable_size = gfx::Size(kWidth, kHeight); default_settings.dpi = kDPI; default_settings.min_shrink = 1.25; default_settings.max_shrink = 2.0; default_settings.desired_dpi = kDPI; default_settings.document_cookie = NULL; default_settings.selection_only = false; // Calculate the estimated page count. PrepareFrameAndViewForPrint prep_frame_view(default_settings, frame, frame->view()); int expected_pages_count = prep_frame_view.GetExpectedPageCount(); DCHECK(expected_pages_count); ViewMsg_PrintPage_Params page_params; page_params.params = default_settings; // TODO(myhuang): Get final printing settings via IPC. // For testing purpose, we hard-coded printing settings here. // Print the first page only. expected_pages_count = 1; for (int i = 0; i < expected_pages_count; ++i) { page_params.page_number = i; PrintPage(page_params, prep_frame_view.GetPrintCanvasSize(), frame); } } void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, const gfx::Size& canvas_size, WebFrame* frame) { // Since WebKit extends the page width depending on the magical shrink // factor we make sure the canvas covers the worst case scenario // (x2.0 currently). PrintContext will then set the correct clipping region. int size_x = static_cast(canvas_size.width() * params.params.max_shrink); int size_y = static_cast(canvas_size.height() * params.params.max_shrink); // Calculate the dpi adjustment. float shrink = static_cast(canvas_size.width()) / params.params.printable_size.width(); // TODO(myhuang): We now use VectorCanvas to generate a PS/PDF file for // each page in printing. We might also need to create a metafile class // on Linux. skia::VectorCanvas canvas(size_x, size_y); float webkit_shrink = frame->printPage(params.page_number, &canvas); if (shrink <= 0) { NOTREACHED() << "Printing page " << params.page_number << " failed."; } else { // Update the dpi adjustment with the "page shrink" calculated in webkit. shrink /= webkit_shrink; } }