OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/print_web_view_helper.h" | 5 #include "chrome/renderer/print_web_view_helper.h" |
6 | 6 |
7 #include "base/file_descriptor_posix.h" | 7 #include "base/file_descriptor_posix.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "chrome/common/render_messages.h" | 9 #include "chrome/common/render_messages.h" |
10 #include "chrome/common/render_messages_params.h" | 10 #include "chrome/common/render_messages_params.h" |
11 #include "printing/native_metafile.h" | 11 #include "printing/native_metafile.h" |
12 #include "printing/units.h" | |
13 #include "skia/ext/vector_canvas.h" | 12 #include "skia/ext/vector_canvas.h" |
14 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" | 13 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" |
15 #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" | 14 #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" |
16 | 15 |
17 using printing::NativeMetafile; | 16 using printing::NativeMetafile; |
18 using WebKit::WebFrame; | 17 using WebKit::WebFrame; |
19 using WebKit::WebSize; | 18 using WebKit::WebSize; |
20 | 19 |
21 static void FillDefaultPrintParams(ViewMsg_Print_Params* params) { | |
22 // TODO(myhuang): Get printing parameters via IPC | |
23 // using the print_web_view_helper.cc version of Print. | |
24 // For testing purpose, we hard-coded printing parameters here. | |
25 | |
26 // The paper size is US Letter (8.5 in. by 11 in.). | |
27 double page_width_in_pixel = 8.5 * printing::kPixelsPerInch; | |
28 double page_height_in_pixel = 11.0 * printing::kPixelsPerInch; | |
29 params->page_size = gfx::Size( | |
30 static_cast<int>(page_width_in_pixel), | |
31 static_cast<int>(page_height_in_pixel)); | |
32 params->printable_size = gfx::Size( | |
33 static_cast<int>( | |
34 page_width_in_pixel - | |
35 (NativeMetafile::kLeftMarginInInch + | |
36 NativeMetafile::kRightMarginInInch) * printing::kPixelsPerInch), | |
37 static_cast<int>( | |
38 page_height_in_pixel - | |
39 (NativeMetafile::kTopMarginInInch + | |
40 NativeMetafile::kBottomMarginInInch) * printing::kPixelsPerInch)); | |
41 params->margin_top = static_cast<int>( | |
42 NativeMetafile::kTopMarginInInch * printing::kPixelsPerInch); | |
43 params->margin_left = static_cast<int>( | |
44 NativeMetafile::kLeftMarginInInch * printing::kPixelsPerInch); | |
45 params->dpi = printing::kPixelsPerInch; | |
46 params->desired_dpi = params->dpi; | |
47 } | |
48 | |
49 void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params, | 20 void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params, |
50 WebFrame* frame) { | 21 WebFrame* frame) { |
51 PrepareFrameAndViewForPrint prep_frame_view(params.params, | 22 PrepareFrameAndViewForPrint prep_frame_view(params.params, |
52 frame, | 23 frame, |
53 frame->view()); | 24 frame->view()); |
54 int page_count = prep_frame_view.GetExpectedPageCount(); | 25 int page_count = prep_frame_view.GetExpectedPageCount(); |
55 | 26 |
56 // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount. | 27 // TODO(myhuang): Send ViewHostMsg_DidGetPrintedPagesCount. |
57 | 28 |
58 if (page_count == 0) | 29 if (page_count == 0) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 return; | 68 return; |
98 | 69 |
99 // Tell the browser we've finished writing the file. | 70 // Tell the browser we've finished writing the file. |
100 Send(new ViewHostMsg_TempFileForPrintingWritten(fd_in_browser)); | 71 Send(new ViewHostMsg_TempFileForPrintingWritten(fd_in_browser)); |
101 } | 72 } |
102 | 73 |
103 void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, | 74 void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, |
104 const gfx::Size& canvas_size, | 75 const gfx::Size& canvas_size, |
105 WebFrame* frame, | 76 WebFrame* frame, |
106 printing::NativeMetafile* metafile) { | 77 printing::NativeMetafile* metafile) { |
107 ViewMsg_Print_Params default_params; | |
108 FillDefaultPrintParams(&default_params); | |
109 | |
110 double content_width_in_points; | 78 double content_width_in_points; |
111 double content_height_in_points; | 79 double content_height_in_points; |
112 double margin_top_in_points; | 80 double margin_top_in_points; |
113 double margin_right_in_points; | 81 double margin_right_in_points; |
114 double margin_bottom_in_points; | 82 double margin_bottom_in_points; |
115 double margin_left_in_points; | 83 double margin_left_in_points; |
116 GetPageSizeAndMarginsInPoints(frame, | 84 GetPageSizeAndMarginsInPoints(frame, |
117 params.page_number, | 85 params.page_number, |
118 default_params, | 86 params.params, |
119 &content_width_in_points, | 87 &content_width_in_points, |
120 &content_height_in_points, | 88 &content_height_in_points, |
121 &margin_top_in_points, | 89 &margin_top_in_points, |
122 &margin_right_in_points, | 90 &margin_right_in_points, |
123 &margin_bottom_in_points, | 91 &margin_bottom_in_points, |
124 &margin_left_in_points); | 92 &margin_left_in_points); |
125 | 93 |
126 cairo_t* cairo_context = | 94 cairo_t* cairo_context = |
127 metafile->StartPage(content_width_in_points, | 95 metafile->StartPage(content_width_in_points, |
128 content_height_in_points, | 96 content_height_in_points, |
129 margin_top_in_points, | 97 margin_top_in_points, |
130 margin_right_in_points, | 98 margin_right_in_points, |
131 margin_bottom_in_points, | 99 margin_bottom_in_points, |
132 margin_left_in_points); | 100 margin_left_in_points); |
133 if (!cairo_context) | 101 if (!cairo_context) |
134 return; | 102 return; |
135 | 103 |
136 skia::VectorCanvas canvas(cairo_context, | 104 skia::VectorCanvas canvas(cairo_context, |
137 canvas_size.width(), canvas_size.height()); | 105 canvas_size.width(), canvas_size.height()); |
138 frame->printPage(params.page_number, &canvas); | 106 frame->printPage(params.page_number, &canvas); |
139 | 107 |
140 // TODO(myhuang): We should handle transformation for paper margins. | 108 // TODO(myhuang): We should handle transformation for paper margins. |
141 // TODO(myhuang): We should render the header and the footer. | 109 // TODO(myhuang): We should render the header and the footer. |
142 | 110 |
143 // Done printing. Close the device context to retrieve the compiled metafile. | 111 // Done printing. Close the device context to retrieve the compiled metafile. |
144 if (!metafile->FinishPage()) | 112 if (!metafile->FinishPage()) |
145 NOTREACHED() << "metafile failed"; | 113 NOTREACHED() << "metafile failed"; |
146 } | 114 } |
OLD | NEW |