| 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 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
| 11 #include "chrome/common/print_messages.h" | 11 #include "chrome/common/print_messages.h" |
| 12 #include "printing/metafile.h" | 12 #include "printing/metafile.h" |
| 13 #include "printing/metafile_impl.h" | 13 #include "printing/metafile_impl.h" |
| 14 #include "printing/metafile_skia_wrapper.h" |
| 14 #include "printing/units.h" | 15 #include "printing/units.h" |
| 15 #include "skia/ext/vector_canvas.h" | 16 #include "skia/ext/vector_canvas.h" |
| 16 #include "skia/ext/vector_platform_device_emf_win.h" | 17 #include "skia/ext/vector_platform_device_emf_win.h" |
| 18 #include "third_party/skia/include/core/SkRefCnt.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| 18 #include "ui/gfx/gdi_util.h" | 20 #include "ui/gfx/gdi_util.h" |
| 19 #include "ui/gfx/point.h" | 21 #include "ui/gfx/point.h" |
| 20 #include "ui/gfx/rect.h" | 22 #include "ui/gfx/rect.h" |
| 21 #include "ui/gfx/size.h" | 23 #include "ui/gfx/size.h" |
| 22 | 24 |
| 23 using printing::ConvertUnit; | 25 using printing::ConvertUnit; |
| 24 using printing::ConvertUnitDouble; | 26 using printing::ConvertUnitDouble; |
| 25 using printing::kPointsPerInch; | 27 using printing::kPointsPerInch; |
| 26 using printing::Metafile; | 28 using printing::Metafile; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 for (int i = 0; i < page_count; ++i) { | 149 for (int i = 0; i < page_count; ++i) { |
| 148 float scale_factor = shrink; | 150 float scale_factor = shrink; |
| 149 RenderPage(print_params, &scale_factor, i, true, frame, &metafile); | 151 RenderPage(print_params, &scale_factor, i, true, frame, &metafile); |
| 150 } | 152 } |
| 151 } else { | 153 } else { |
| 152 for (size_t i = 0; i < params.pages.size(); ++i) { | 154 for (size_t i = 0; i < params.pages.size(); ++i) { |
| 153 if (params.pages[i] >= page_count) | 155 if (params.pages[i] >= page_count) |
| 154 break; | 156 break; |
| 155 float scale_factor = shrink; | 157 float scale_factor = shrink; |
| 156 RenderPage(print_params, &scale_factor, | 158 RenderPage(print_params, &scale_factor, |
| 157 static_cast<int>(params.pages[i]), true, frame, &metafile); | 159 static_cast<int>(params.pages[i]), true, frame, &metafile); |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 163 // Ensure that printing has finished before we start cleaning up and |
| 164 // allocating buffers; this causes prep_frame_view to flush anything pending |
| 165 // into the metafile. Then we can get the final size and copy it into a |
| 166 // shared segment. |
| 167 prep_frame_view.FinishPrinting(); |
| 168 |
| 169 if (!metafile->FinishDocument()) |
| 170 NOTREACHED(); |
| 171 |
| 161 // Calculate the time taken to render the requested page for preview and add | 172 // Calculate the time taken to render the requested page for preview and add |
| 162 // the net time in the histogram. | 173 // the net time in the histogram. |
| 163 UMA_HISTOGRAM_TIMES("PrintPreview.RenderTime", | 174 UMA_HISTOGRAM_TIMES("PrintPreview.RenderTime", |
| 164 base::TimeTicks::Now() - begin_time); | 175 base::TimeTicks::Now() - begin_time); |
| 165 | 176 |
| 166 if (!metafile->FinishDocument()) | |
| 167 NOTREACHED(); | |
| 168 | |
| 169 // Get the size of the compiled metafile. | 177 // Get the size of the compiled metafile. |
| 170 uint32 buf_size = metafile->GetDataSize(); | 178 uint32 buf_size = metafile->GetDataSize(); |
| 171 DCHECK_GT(buf_size, 128u); | 179 DCHECK_GT(buf_size, 128u); |
| 172 | 180 |
| 173 PrintHostMsg_DidPreviewDocument_Params preview_params; | 181 PrintHostMsg_DidPreviewDocument_Params preview_params; |
| 174 preview_params.data_size = buf_size; | 182 preview_params.data_size = buf_size; |
| 175 preview_params.document_cookie = params.params.document_cookie; | 183 preview_params.document_cookie = params.params.document_cookie; |
| 176 preview_params.expected_pages_count = page_count; | 184 preview_params.expected_pages_count = page_count; |
| 177 preview_params.modifiable = IsModifiable(frame, node); | 185 preview_params.modifiable = IsModifiable(frame, node); |
| 178 | 186 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 } | 224 } |
| 217 | 225 |
| 218 gfx::Size page_size(width, height); | 226 gfx::Size page_size(width, height); |
| 219 gfx::Rect content_area(static_cast<int>(margin_left_in_points), | 227 gfx::Rect content_area(static_cast<int>(margin_left_in_points), |
| 220 static_cast<int>(margin_top_in_points), | 228 static_cast<int>(margin_top_in_points), |
| 221 static_cast<int>(content_width_in_points), | 229 static_cast<int>(content_width_in_points), |
| 222 static_cast<int>(content_height_in_points)); | 230 static_cast<int>(content_height_in_points)); |
| 223 skia::PlatformDevice* device = (*metafile)->StartPageForVectorCanvas( | 231 skia::PlatformDevice* device = (*metafile)->StartPageForVectorCanvas( |
| 224 page_size, content_area, frame->getPrintPageShrink(page_number)); | 232 page_size, content_area, frame->getPrintPageShrink(page_number)); |
| 225 DCHECK(device); | 233 DCHECK(device); |
| 226 skia::VectorCanvas canvas(device); | 234 // The printPage method may take a reference to the canvas we pass down, so it |
| 235 // can't be a stack object. |
| 236 SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device); |
| 237 canvas->unref(); // SkRefPtr and new both took a reference. |
| 238 if (is_preview) { |
| 239 printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), |
| 240 metafile->get()); |
| 241 } |
| 227 | 242 |
| 228 float webkit_scale_factor = frame->printPage(page_number, &canvas); | 243 float webkit_scale_factor = frame->printPage(page_number, canvas.get()); |
| 229 if (*scale_factor <= 0 || webkit_scale_factor <= 0) { | 244 if (*scale_factor <= 0 || webkit_scale_factor <= 0) { |
| 230 NOTREACHED() << "Printing page " << page_number << " failed."; | 245 NOTREACHED() << "Printing page " << page_number << " failed."; |
| 231 } else { | 246 } else { |
| 232 // Update the dpi adjustment with the "page |scale_factor|" calculated in | 247 // Update the dpi adjustment with the "page |scale_factor|" calculated in |
| 233 // webkit. | 248 // webkit. |
| 234 *scale_factor /= webkit_scale_factor; | 249 *scale_factor /= webkit_scale_factor; |
| 235 } | 250 } |
| 236 | 251 |
| 237 bool result = (*metafile)->FinishPage(); | 252 bool result = (*metafile)->FinishPage(); |
| 238 DCHECK(result); | 253 DCHECK(result); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 // Copy the bits into shared memory. | 330 // Copy the bits into shared memory. |
| 316 if (!metafile->GetData(shared_buf.memory(), buf_size)) { | 331 if (!metafile->GetData(shared_buf.memory(), buf_size)) { |
| 317 NOTREACHED() << "GetData() failed"; | 332 NOTREACHED() << "GetData() failed"; |
| 318 shared_buf.Unmap(); | 333 shared_buf.Unmap(); |
| 319 return false; | 334 return false; |
| 320 } | 335 } |
| 321 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), shared_mem_handle); | 336 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), shared_mem_handle); |
| 322 shared_buf.Unmap(); | 337 shared_buf.Unmap(); |
| 323 return true; | 338 return true; |
| 324 } | 339 } |
| OLD | NEW |