OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #import <AppKit/AppKit.h> | 7 #import <AppKit/AppKit.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/mac/scoped_nsautorelease_pool.h" | 10 #include "base/mac/scoped_nsautorelease_pool.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 // Ask the browser to create the shared memory for us. | 53 // Ask the browser to create the shared memory for us. |
54 if (!CopyMetafileDataToSharedMem(&metafile, | 54 if (!CopyMetafileDataToSharedMem(&metafile, |
55 &(page_params.metafile_data_handle))) { | 55 &(page_params.metafile_data_handle))) { |
56 page_params.data_size = 0; | 56 page_params.data_size = 0; |
57 } | 57 } |
58 | 58 |
59 Send(new PrintHostMsg_DidPrintPage(routing_id(), page_params)); | 59 Send(new PrintHostMsg_DidPrintPage(routing_id(), page_params)); |
60 } | 60 } |
61 | 61 |
62 bool PrintWebViewHelper::CreatePreviewDocument( | 62 void PrintWebViewHelper::RenderPreviewPage(int page_number) { |
63 const PrintMsg_PrintPages_Params& params, WebKit::WebFrame* frame, | 63 float scale_factor = print_preview_context_.frame()->getPrintPageShrink(0); |
64 WebKit::WebNode* node) { | 64 PrintMsg_Print_Params printParams = print_preview_context_.print_params(); |
65 if (!PreviewPageRendered(-1)) | |
66 return false; | |
67 | |
68 PrintMsg_Print_Params printParams = params.params; | |
69 UpdatePrintableSizeInPrintParameters(frame, node, &printParams); | |
70 | |
71 PrepareFrameAndViewForPrint prep_frame_view(printParams, | |
72 frame, node, frame->view()); | |
73 if (!PreviewPageRendered(-1)) | |
74 return false; | |
75 | |
76 preview_page_count_ = prep_frame_view.GetExpectedPageCount(); | |
77 if (!preview_page_count_) | |
78 return false; | |
79 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), | |
80 preview_page_count_)); | |
81 | |
82 printing::PreviewMetafile metafile; | |
83 if (!metafile.Init()) | |
84 return false; | |
85 | |
86 float scale_factor = frame->getPrintPageShrink(0); | |
87 gfx::Rect content_area(printParams.margin_left, printParams.margin_top, | 65 gfx::Rect content_area(printParams.margin_left, printParams.margin_top, |
88 printParams.printable_size.width(), | 66 printParams.printable_size.width(), |
89 printParams.printable_size.height()); | 67 printParams.printable_size.height()); |
90 | 68 |
91 base::TimeTicks begin_time = base::TimeTicks::Now(); | 69 base::TimeTicks begin_time = base::TimeTicks::Now(); |
92 base::TimeTicks page_begin_time = begin_time; | 70 RenderPage(printParams.page_size, content_area, scale_factor, page_number, |
93 | 71 print_preview_context_.frame(), print_preview_context_.metafile()); |
94 if (params.pages.empty()) { | 72 print_preview_context_.RenderedPreviewPage( |
95 for (int i = 0; i < preview_page_count_; ++i) { | 73 base::TimeTicks::Now() - begin_time); |
96 RenderPage(printParams.page_size, content_area, scale_factor, i, frame, | 74 PreviewPageRendered(page_number); |
97 &metafile); | |
98 page_begin_time = ReportPreviewPageRenderTime(page_begin_time); | |
99 if (!PreviewPageRendered(i)) | |
100 return false; | |
101 } | |
102 } else { | |
103 for (size_t i = 0; i < params.pages.size(); ++i) { | |
104 if (params.pages[i] >= preview_page_count_) | |
105 break; | |
106 RenderPage(printParams.page_size, content_area, scale_factor, | |
107 params.pages[i], frame, &metafile); | |
108 page_begin_time = ReportPreviewPageRenderTime(page_begin_time); | |
109 if (!PreviewPageRendered(params.pages[i])) | |
110 return false; | |
111 } | |
112 } | |
113 | |
114 base::TimeDelta render_time = base::TimeTicks::Now() - begin_time; | |
115 | |
116 prep_frame_view.FinishPrinting(); | |
117 metafile.FinishDocument(); | |
118 | |
119 ReportTotalPreviewGenerationTime(params.pages.size(), | |
120 preview_page_count_, | |
121 render_time, | |
122 base::TimeTicks::Now() - begin_time); | |
123 | |
124 PrintHostMsg_DidPreviewDocument_Params preview_params; | |
125 preview_params.reuse_existing_data = false; | |
126 preview_params.data_size = metafile.GetDataSize(); | |
127 preview_params.document_cookie = params.params.document_cookie; | |
128 preview_params.expected_pages_count = preview_page_count_; | |
129 preview_params.modifiable = IsModifiable(frame, node); | |
130 preview_params.preview_request_id = params.params.preview_request_id; | |
131 | |
132 // Ask the browser to create the shared memory for us. | |
133 if (!CopyMetafileDataToSharedMem(&metafile, | |
134 &(preview_params.metafile_data_handle))) { | |
135 return false; | |
136 } | |
137 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | |
138 return true; | |
139 } | 75 } |
140 | 76 |
141 void PrintWebViewHelper::RenderPage( | 77 void PrintWebViewHelper::RenderPage( |
142 const gfx::Size& page_size, const gfx::Rect& content_area, | 78 const gfx::Size& page_size, const gfx::Rect& content_area, |
143 const float& scale_factor, int page_number, WebFrame* frame, | 79 const float& scale_factor, int page_number, WebFrame* frame, |
144 printing::Metafile* metafile) { | 80 printing::Metafile* metafile) { |
145 | 81 |
146 { | 82 { |
147 #if defined(USE_SKIA) | 83 #if defined(USE_SKIA) |
148 SkDevice* device = metafile->StartPageForVectorCanvas( | 84 SkDevice* device = metafile->StartPageForVectorCanvas( |
(...skipping 14 matching lines...) Expand all Loading... |
163 base::mac::ScopedNSAutoreleasePool pool; | 99 base::mac::ScopedNSAutoreleasePool pool; |
164 CGContextRef cgContext = metafile->context(); | 100 CGContextRef cgContext = metafile->context(); |
165 CGContextRef canvasPtr = cgContext; | 101 CGContextRef canvasPtr = cgContext; |
166 #endif | 102 #endif |
167 frame->printPage(page_number, canvasPtr); | 103 frame->printPage(page_number, canvasPtr); |
168 } | 104 } |
169 | 105 |
170 // Done printing. Close the device context to retrieve the compiled metafile. | 106 // Done printing. Close the device context to retrieve the compiled metafile. |
171 metafile->FinishPage(); | 107 metafile->FinishPage(); |
172 } | 108 } |
OLD | NEW |