summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/print_web_view_helper_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/print_web_view_helper_win.cc')
-rw-r--r--chrome/renderer/print_web_view_helper_win.cc141
1 files changed, 6 insertions, 135 deletions
diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc
index d3e6576..d827678 100644
--- a/chrome/renderer/print_web_view_helper_win.cc
+++ b/chrome/renderer/print_web_view_helper_win.cc
@@ -32,117 +32,6 @@ using printing::kPointsPerInch;
using printing::Metafile;
using WebKit::WebFrame;
-namespace {
-
-int CALLBACK EnhMetaFileProc(HDC dc,
- HANDLETABLE* handle_table,
- const ENHMETARECORD *record,
- int num_objects,
- LPARAM data) {
- HDC* bitmap_dc = reinterpret_cast<HDC*>(data);
- // Play this command to the bitmap DC.
- PlayEnhMetaFileRecord(*bitmap_dc, handle_table, record, num_objects);
- switch (record->iType) {
- case EMR_ALPHABLEND: {
- const EMRALPHABLEND* emr_alpha_blend =
- reinterpret_cast<const EMRALPHABLEND*>(record);
- XFORM bitmap_dc_transform, metafile_dc_transform;
- XFORM identity = { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f };
- // Temporarily set the world transforms of both DC's to identity.
- GetWorldTransform(dc, &metafile_dc_transform);
- SetWorldTransform(dc, &identity);
- GetWorldTransform(*bitmap_dc, &bitmap_dc_transform);
- SetWorldTransform(*bitmap_dc, &identity);
- const RECTL& rect = emr_alpha_blend->rclBounds;
- // Since the printer does not support alpha blend, copy the alpha
- // blended region from our (software-rendered) bitmap DC to the
- // metafile DC.
- BitBlt(dc,
- rect.left,
- rect.top,
- rect.right - rect.left + 1,
- rect.bottom - rect.top + 1,
- *bitmap_dc,
- rect.left,
- rect.top,
- SRCCOPY);
- // Restore the world transforms of both DC's.
- SetWorldTransform(dc, &metafile_dc_transform);
- SetWorldTransform(*bitmap_dc, &bitmap_dc_transform);
- break;
- }
-
- case EMR_CREATEBRUSHINDIRECT:
- case EMR_CREATECOLORSPACE:
- case EMR_CREATECOLORSPACEW:
- case EMR_CREATEDIBPATTERNBRUSHPT:
- case EMR_CREATEMONOBRUSH:
- case EMR_CREATEPALETTE:
- case EMR_CREATEPEN:
- case EMR_DELETECOLORSPACE:
- case EMR_DELETEOBJECT:
- case EMR_EXTCREATEFONTINDIRECTW:
- // Play object creation command only once.
- break;
-
- default:
- // Play this command to the metafile DC.
- PlayEnhMetaFileRecord(dc, handle_table, record, num_objects);
- break;
- }
- return 1; // Continue enumeration
-}
-
-Metafile* FlattenTransparency(Metafile* metafile, const gfx::Size& page_size) {
- // Currently, we handle alpha blend transparency for a single page.
- // Therefore, expecting a metafile with page count 1.
- DCHECK_EQ(1U, metafile->GetPageCount());
-
- // Close the device context to retrieve the compiled metafile.
- if (!metafile->FinishDocument())
- NOTREACHED();
-
- // Page used alpha blend, but printer doesn't support it. Rewrite the
- // metafile and flatten out the transparency.
- base::win::ScopedGetDC screen_dc(NULL);
- base::win::ScopedCreateDC bitmap_dc(CreateCompatibleDC(screen_dc));
- if (!bitmap_dc)
- NOTREACHED() << "Bitmap DC creation failed";
- SetGraphicsMode(bitmap_dc, GM_ADVANCED);
- void* bits = NULL;
- BITMAPINFO hdr;
- gfx::CreateBitmapHeader(page_size.width(), page_size.height(),
- &hdr.bmiHeader);
- base::win::ScopedBitmap hbitmap(CreateDIBSection(
- bitmap_dc, &hdr, DIB_RGB_COLORS, &bits, NULL, 0));
- if (!hbitmap)
- NOTREACHED() << "Raster bitmap creation for printing failed";
-
- base::win::ScopedSelectObject selectBitmap(bitmap_dc, hbitmap);
- RECT rect = { 0, 0, page_size.width(), page_size.height() };
- HBRUSH whiteBrush = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
- FillRect(bitmap_dc, &rect, whiteBrush);
-
- Metafile* metafile2(new printing::NativeMetafile);
- metafile2->Init();
- HDC hdc = metafile2->context();
- DCHECK(hdc);
- skia::InitializeDC(hdc);
-
- RECT metafile_bounds = metafile->GetPageBounds(1).ToRECT();
- // Process the old metafile, placing all non-AlphaBlend calls into the
- // new metafile, and copying the results of all the AlphaBlend calls
- // from the bitmap DC.
- EnumEnhMetaFile(hdc,
- metafile->emf(),
- EnhMetaFileProc,
- &bitmap_dc,
- &metafile_bounds);
- return metafile2;
-}
-
-} // namespace
-
void PrintWebViewHelper::PrintPageInternal(
const PrintMsg_PrintPage_Params& params,
const gfx::Size& canvas_size,
@@ -166,9 +55,8 @@ void PrintWebViewHelper::PrintPageInternal(
gfx::Rect content_area_in_dpi;
// Render page for printing.
- metafile.reset(RenderPage(params.params, page_number, frame, false,
- metafile.get(), &actual_shrink, &page_size_in_dpi,
- &content_area_in_dpi));
+ RenderPage(params.params, page_number, frame, false, metafile.get(),
+ &actual_shrink, &page_size_in_dpi, &content_area_in_dpi);
// Close the device context to retrieve the compiled metafile.
if (!metafile->FinishDocument())
@@ -210,11 +98,8 @@ bool PrintWebViewHelper::RenderPreviewPage(int page_number) {
}
base::TimeTicks begin_time = base::TimeTicks::Now();
- printing::Metafile* render_page_result =
- RenderPage(print_params, page_number, print_preview_context_.frame(),
- true, initial_render_metafile, &actual_shrink, NULL, NULL);
- // In the preview flow, RenderPage will never return a new metafile.
- DCHECK_EQ(render_page_result, initial_render_metafile);
+ RenderPage(print_params, page_number, print_preview_context_.frame(), true,
+ initial_render_metafile, &actual_shrink, NULL, NULL);
print_preview_context_.RenderedPreviewPage(
base::TimeTicks::Now() - begin_time);
@@ -229,7 +114,7 @@ bool PrintWebViewHelper::RenderPreviewPage(int page_number) {
return PreviewPageRendered(page_number, draft_metafile.get());
}
-Metafile* PrintWebViewHelper::RenderPage(
+void PrintWebViewHelper::RenderPage(
const PrintMsg_Print_Params& params, int page_number, WebFrame* frame,
bool is_preview, Metafile* metafile, double* actual_shrink,
gfx::Size* page_size_in_dpi, gfx::Rect* content_area_in_dpi) {
@@ -319,27 +204,13 @@ Metafile* PrintWebViewHelper::RenderPage(
bool result = metafile->FinishPage();
DCHECK(result);
-
- if (!params.supports_alpha_blend) {
- // PreviewMetafile (PDF) supports alpha blend, so we only hit this case
- // for NativeMetafile.
- DCHECK(!is_preview);
- skia::PlatformDevice* platform_device = skia::GetPlatformDevice(device);
- if (platform_device && platform_device->AlphaBlendUsed()) {
- return FlattenTransparency(metafile, page_size);
- }
- }
- return metafile;
}
bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
Metafile* metafile, base::SharedMemoryHandle* shared_mem_handle) {
uint32 buf_size = metafile->GetDataSize();
base::SharedMemory shared_buf;
- // http://msdn2.microsoft.com/en-us/library/ms535522.aspx
- // Windows 2000/XP: When a page in a spooled file exceeds approximately 350
- // MB, it can fail to print and not send an error message.
- if (buf_size >= 350*1024*1024) {
+ if (buf_size >= printing::kMetafileMaxSize) {
NOTREACHED() << "Buffer too large: " << buf_size;
return false;
}