| Index: chrome/renderer/print_web_view_helper_win.cc
|
| ===================================================================
|
| --- chrome/renderer/print_web_view_helper_win.cc (revision 78814)
|
| +++ chrome/renderer/print_web_view_helper_win.cc (working copy)
|
| @@ -197,7 +197,8 @@
|
| void PrintWebViewHelper::RenderPage(
|
| const ViewMsg_Print_Params& params, float* scale_factor, int page_number,
|
| WebFrame* frame, scoped_ptr<printing::NativeMetafile>* metafile) {
|
| - DCHECK(metafile->get()->context());
|
| + HDC hdc = (*metafile)->context();
|
| + DCHECK(hdc);
|
|
|
| double content_width_in_points;
|
| double content_height_in_points;
|
| @@ -215,14 +216,21 @@
|
| int width = static_cast<int>(content_width_in_points * params.max_shrink);
|
| int height = static_cast<int>(content_height_in_points * params.max_shrink);
|
|
|
| - gfx::Size page_size(width, height);
|
| - gfx::Point content_origin(static_cast<int>(margin_left_in_points),
|
| - static_cast<int>(margin_top_in_points));
|
| - skia::PlatformDevice* device = (*metafile)->StartPageForVectorCanvas(
|
| - page_size, content_origin, 1.0f);
|
| - DCHECK(device);
|
| - skia::VectorCanvas canvas(device);
|
| + bool result = (*metafile)->StartPage(
|
| + gfx::Size(width, height),
|
| + gfx::Point(static_cast<int>(margin_top_in_points),
|
| + static_cast<int>(margin_left_in_points)),
|
| + *scale_factor);
|
| + DCHECK(result);
|
|
|
| +#if 0
|
| + // TODO(maruel): This code is kept for testing until the 100% GDI drawing
|
| + // code is stable. maruels use this code's output as a reference when the
|
| + // GDI drawing code fails.
|
| +
|
| + // Mix of Skia and GDI based.
|
| + skia::PlatformCanvas canvas(width, height, true);
|
| + canvas.drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode);
|
| float webkit_scale_factor = frame->printPage(page_number, &canvas);
|
| if (*scale_factor <= 0 || webkit_scale_factor <= 0) {
|
| NOTREACHED() << "Printing page " << page_number << " failed.";
|
| @@ -232,11 +240,40 @@
|
| *scale_factor /= webkit_scale_factor;
|
| }
|
|
|
| - bool result = (*metafile)->FinishPage();
|
| + // Create a BMP v4 header that we can serialize.
|
| + BITMAPV4HEADER bitmap_header;
|
| + gfx::CreateBitmapV4Header(width, height, &bitmap_header);
|
| + const SkBitmap& src_bmp = canvas.getDevice()->accessBitmap(true);
|
| + SkAutoLockPixels src_lock(src_bmp);
|
| + int retval = StretchDIBits(hdc,
|
| + 0,
|
| + 0,
|
| + width, height,
|
| + 0, 0,
|
| + width, height,
|
| + src_bmp.getPixels(),
|
| + reinterpret_cast<BITMAPINFO*>(&bitmap_header),
|
| + DIB_RGB_COLORS,
|
| + SRCCOPY);
|
| + DCHECK(retval != GDI_ERROR);
|
| +#else
|
| + // 100% GDI based.
|
| + skia::VectorCanvas canvas(hdc, width, height);
|
| + float webkit_scale_factor = frame->printPage(page_number, &canvas);
|
| + if (*scale_factor <= 0 || webkit_scale_factor <= 0) {
|
| + NOTREACHED() << "Printing page " << page_number << " failed.";
|
| + } else {
|
| + // Update the dpi adjustment with the "page |scale_factor|" calculated in
|
| + // webkit.
|
| + *scale_factor /= webkit_scale_factor;
|
| + }
|
| +#endif
|
| +
|
| + result = (*metafile)->FinishPage();
|
| DCHECK(result);
|
|
|
| skia::VectorPlatformDevice* platform_device =
|
| - static_cast<skia::VectorPlatformDevice*>(device);
|
| + static_cast<skia::VectorPlatformDevice*>(canvas.getDevice());
|
| if (platform_device->alpha_blend_used() && !params.supports_alpha_blend) {
|
| // Close the device context to retrieve the compiled metafile.
|
| if (!(*metafile)->FinishDocument())
|
|
|