diff options
-rw-r--r-- | chrome/renderer/print_web_view_helper_linux.cc | 11 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_win.cc | 57 | ||||
-rw-r--r-- | printing/emf_win.cc | 14 | ||||
-rw-r--r-- | printing/emf_win.h | 3 | ||||
-rw-r--r-- | printing/native_metafile.h | 11 | ||||
-rw-r--r-- | printing/pdf_metafile_mac.cc | 7 | ||||
-rw-r--r-- | printing/pdf_metafile_mac.h | 4 | ||||
-rw-r--r-- | printing/pdf_ps_metafile_cairo.cc | 12 | ||||
-rw-r--r-- | printing/pdf_ps_metafile_cairo.h | 3 | ||||
-rw-r--r-- | skia/ext/vector_canvas.cc | 10 | ||||
-rw-r--r-- | skia/ext/vector_canvas.h | 25 | ||||
-rw-r--r-- | skia/ext/vector_canvas_linux.cc | 28 | ||||
-rw-r--r-- | skia/ext/vector_canvas_unittest.cc | 7 | ||||
-rw-r--r-- | skia/ext/vector_canvas_win.cc | 30 | ||||
-rw-r--r-- | skia/ext/vector_platform_device_linux.cc | 6 | ||||
-rw-r--r-- | skia/ext/vector_platform_device_linux.h | 4 | ||||
-rw-r--r-- | skia/ext/vector_platform_device_win.cc | 5 | ||||
-rw-r--r-- | skia/ext/vector_platform_device_win.h | 6 | ||||
-rw-r--r-- | skia/skia.gyp | 2 |
19 files changed, 92 insertions, 153 deletions
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc index 970b47c..555f419 100644 --- a/chrome/renderer/print_web_view_helper_linux.cc +++ b/chrome/renderer/print_web_view_helper_linux.cc @@ -220,15 +220,14 @@ void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, margin_left_in_points, content_height_in_points + margin_top_in_points + margin_bottom_in_points); + gfx::Point content_origin(margin_left_in_points, margin_top_in_points); - gfx::Point content_origin(margin_top_in_points, margin_left_in_points); - - if (!metafile->StartPage(page_size, content_origin, 1)) + skia::PlatformDevice* device = metafile->StartPageForVectorCanvas( + page_size, content_origin, 1.0f); + if (!device) return; - canvas->reset(new skia::VectorCanvas(metafile->context(), - canvas_size.width(), - canvas_size.height())); + canvas->reset(new skia::VectorCanvas(device)); frame->printPage(params.page_number, canvas->get()); // TODO(myhuang): We should handle transformation for paper margins. diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc index d4b37db..2e87939 100644 --- a/chrome/renderer/print_web_view_helper_win.cc +++ b/chrome/renderer/print_web_view_helper_win.cc @@ -197,8 +197,7 @@ void PrintWebViewHelper::CreatePreviewDocument( void PrintWebViewHelper::RenderPage( const ViewMsg_Print_Params& params, float* scale_factor, int page_number, WebFrame* frame, scoped_ptr<printing::NativeMetafile>* metafile) { - HDC hdc = (*metafile)->context(); - DCHECK(hdc); + DCHECK(metafile->get()->context()); double content_width_in_points; double content_height_in_points; @@ -216,49 +215,14 @@ void PrintWebViewHelper::RenderPage( int width = static_cast<int>(content_width_in_points * params.max_shrink); int height = static_cast<int>(content_height_in_points * params.max_shrink); - 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."; - } else { - // Update the dpi adjustment with the "page |scale_factor|" calculated in - // webkit. - *scale_factor /= webkit_scale_factor; - } + 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); - // 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."; @@ -267,13 +231,12 @@ void PrintWebViewHelper::RenderPage( // webkit. *scale_factor /= webkit_scale_factor; } -#endif - result = (*metafile)->FinishPage(); + bool result = (*metafile)->FinishPage(); DCHECK(result); skia::VectorPlatformDevice* platform_device = - static_cast<skia::VectorPlatformDevice*>(canvas.getDevice()); + static_cast<skia::VectorPlatformDevice*>(device); if (platform_device->alpha_blend_used() && !params.supports_alpha_blend) { // Close the device context to retrieve the compiled metafile. if (!(*metafile)->FinishDocument()) diff --git a/printing/emf_win.cc b/printing/emf_win.cc index de652f1..8609c34 100644 --- a/printing/emf_win.cc +++ b/printing/emf_win.cc @@ -9,6 +9,7 @@ #include "base/metrics/histogram.h" #include "base/scoped_ptr.h" #include "base/time.h" +#include "skia/ext/vector_platform_device_win.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/codec/jpeg_codec.h" #include "ui/gfx/codec/png_codec.h" @@ -412,10 +413,21 @@ bool Emf::Record::SafePlayback(const XFORM* base_matrix) const { return res; } +skia::PlatformDevice* Emf::StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor) { + if (!StartPage(page_size, content_origin, scale_factor)) + return NULL; + + return skia::VectorPlatformDeviceFactory::CreateDevice(page_size.width(), + page_size.height(), + true, hdc_); +} + bool Emf::StartPage(const gfx::Size& /*page_size*/, const gfx::Point& /*content_origin*/, const float& scale_factor) { - DCHECK_EQ(scale_factor, 1); + DCHECK_EQ(1.0f, scale_factor); // We don't support scaling here. DCHECK(hdc_); if (!hdc_) return false; diff --git a/printing/emf_win.h b/printing/emf_win.h index e3a0a8e..f2ccffd 100644 --- a/printing/emf_win.h +++ b/printing/emf_win.h @@ -35,6 +35,9 @@ class Emf : public NativeMetafile { virtual bool Init() { return true; } virtual bool InitFromData(const void* src_buffer, uint32 src_buffer_size); + virtual skia::PlatformDevice* StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor); // Inserts a custom GDICOMMENT records indicating StartPage/EndPage calls // (since StartPage and EndPage do not work in a metafile DC). Only valid // when hdc_ is non-NULL. |page_size| and |content_origin| are ignored. diff --git a/printing/native_metafile.h b/printing/native_metafile.h index ef1e546..742ee27 100644 --- a/printing/native_metafile.h +++ b/printing/native_metafile.h @@ -26,6 +26,10 @@ class Rect; class Size; } +namespace skia { +class PlatformDevice; +} + #if defined(OS_CHROMEOS) namespace base { class FileDescriptor; @@ -50,6 +54,13 @@ class NativeMetafile { // Note: It should only be called from within the browser process. virtual bool InitFromData(const void* src_buffer, uint32 src_buffer_size) = 0; + // This method calls StartPage and then returns an appropriate + // VectorPlatformDevice implementation bound to the context created by + // StartPage or NULL on error. + virtual skia::PlatformDevice* StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor) = 0; + // Prepares a context for rendering a new page at the specified // |content_origin| with the given |page_size| and a |scale_factor| to use for // the drawing. The units are in points (=1/72 in). Returns true on success. diff --git a/printing/pdf_metafile_mac.cc b/printing/pdf_metafile_mac.cc index f5a36f8..913f6aa 100644 --- a/printing/pdf_metafile_mac.cc +++ b/printing/pdf_metafile_mac.cc @@ -62,6 +62,13 @@ bool PdfMetafile::InitFromData(const void* src_buffer, uint32 src_buffer_size) { return true; } +skia::PlatformDevice* PdfMetafile::StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor) { + NOTIMPLEMENTED(); + return NULL; +} + bool PdfMetafile::StartPage(const gfx::Size& page_size, const gfx::Point& content_origin, const float& scale_factor) { diff --git a/printing/pdf_metafile_mac.h b/printing/pdf_metafile_mac.h index c5a2a4a..496b275 100644 --- a/printing/pdf_metafile_mac.h +++ b/printing/pdf_metafile_mac.h @@ -33,6 +33,10 @@ class PdfMetafile : public NativeMetafile { virtual bool Init(); virtual bool InitFromData(const void* src_buffer, uint32 src_buffer_size); + // Not implemented on mac. + virtual skia::PlatformDevice* StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor); virtual bool StartPage(const gfx::Size& page_size, const gfx::Point& content_origin, const float& scale_factor); diff --git a/printing/pdf_ps_metafile_cairo.cc b/printing/pdf_ps_metafile_cairo.cc index 6c42bd4..4a8a1ff 100644 --- a/printing/pdf_ps_metafile_cairo.cc +++ b/printing/pdf_ps_metafile_cairo.cc @@ -145,6 +145,18 @@ bool PdfPsMetafile::SetRawData(const void* src_buffer, return true; } +skia::PlatformDevice* PdfPsMetafile::StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor) { + if (!StartPage(page_size, content_origin, scale_factor)) + return NULL; + + return skia::VectorPlatformDeviceFactory::CreateDevice(context_, + page_size.width(), + page_size.height(), + true); +} + bool PdfPsMetafile::StartPage(const gfx::Size& page_size, const gfx::Point& content_origin, const float& scale_factor) { diff --git a/printing/pdf_ps_metafile_cairo.h b/printing/pdf_ps_metafile_cairo.h index 5ff59db..3e1e811 100644 --- a/printing/pdf_ps_metafile_cairo.h +++ b/printing/pdf_ps_metafile_cairo.h @@ -31,6 +31,9 @@ class PdfPsMetafile : public NativeMetafile { virtual bool Init(); virtual bool InitFromData(const void* src_buffer, uint32 src_buffer_size); + virtual skia::PlatformDevice* StartPageForVectorCanvas( + const gfx::Size& page_size, const gfx::Point& content_origin, + const float& scale_factor); virtual bool StartPage(const gfx::Size& page_size, const gfx::Point& content_origin, const float& scale_factor); diff --git a/skia/ext/vector_canvas.cc b/skia/ext/vector_canvas.cc index 851da79..216a2ee 100644 --- a/skia/ext/vector_canvas.cc +++ b/skia/ext/vector_canvas.cc @@ -4,13 +4,13 @@ #include "skia/ext/vector_canvas.h" -namespace skia { +#include "skia/ext/vector_platform_device.h" -VectorCanvas::VectorCanvas() - : PlatformCanvas(SkNEW(VectorPlatformDeviceFactory)) { -} +namespace skia { -VectorCanvas::VectorCanvas(SkDeviceFactory* factory) : PlatformCanvas(factory) { +VectorCanvas::VectorCanvas(PlatformDevice* device) + : PlatformCanvas(device->getDeviceFactory()) { + setDevice(device)->unref(); // Created with refcount 1, and setDevice refs. } VectorCanvas::~VectorCanvas() { diff --git a/skia/ext/vector_canvas.h b/skia/ext/vector_canvas.h index 4f8bc7a..4b4419d 100644 --- a/skia/ext/vector_canvas.h +++ b/skia/ext/vector_canvas.h @@ -7,38 +7,21 @@ #pragma once #include "skia/ext/platform_canvas.h" -#include "skia/ext/vector_platform_device.h" - -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) -typedef struct _cairo cairo_t; -#endif namespace skia { +class PlatformDevice; + // This class is a specialization of the regular PlatformCanvas. It is designed // to work with a VectorDevice to manage platform-specific drawing. It allows // using both Skia operations and platform-specific operations. It *doesn't* // support reading back from the bitmap backstore since it is not used. class SK_API VectorCanvas : public PlatformCanvas { public: - VectorCanvas(); - explicit VectorCanvas(SkDeviceFactory* factory); -#if defined(WIN32) - VectorCanvas(HDC dc, int width, int height); -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) - // Caller owns |context|. Ownership is not transferred. - VectorCanvas(cairo_t* context, int width, int height); -#endif + // Ownership of |device| is transfered to VectorCanvas. + explicit VectorCanvas(PlatformDevice* device); virtual ~VectorCanvas(); - // For two-part init, call if you use the no-argument constructor above -#if defined(WIN32) - bool initialize(HDC context, int width, int height); -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) - // Ownership of |context| is not transferred. - bool initialize(cairo_t* context, int width, int height); -#endif - virtual SkBounder* setBounder(SkBounder* bounder); virtual SkDrawFilter* setDrawFilter(SkDrawFilter* filter); diff --git a/skia/ext/vector_canvas_linux.cc b/skia/ext/vector_canvas_linux.cc deleted file mode 100644 index aff4fbe..0000000 --- a/skia/ext/vector_canvas_linux.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "skia/ext/vector_canvas.h" - -#include "skia/ext/vector_platform_device.h" - -namespace skia { - -VectorCanvas::VectorCanvas(cairo_t* context, int width, int height) { - bool initialized = initialize(context, width, height); - - SkASSERT(initialized); -} - -bool VectorCanvas::initialize(cairo_t* context, int width, int height) { - SkDevice* device = VectorPlatformDeviceFactory::CreateDevice(context, width, - height, true); - if (!device) - return false; - - setDevice(device); - device->unref(); // was created with refcount 1, and setDevice also refs - return true; -} - -} // namespace skia diff --git a/skia/ext/vector_canvas_unittest.cc b/skia/ext/vector_canvas_unittest.cc index 0266c81..1066c0c 100644 --- a/skia/ext/vector_canvas_unittest.cc +++ b/skia/ext/vector_canvas_unittest.cc @@ -14,6 +14,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "skia/ext/vector_canvas.h" +#include "skia/ext/vector_platform_device.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/effects/SkDashPathEffect.h" #include "ui/gfx/codec/png_codec.h" @@ -386,7 +387,8 @@ class VectorCanvasTest : public ImageTest { size_ = size; context_ = new Context(); bitmap_ = new Bitmap(*context_, size_, size_); - vcanvas_ = new VectorCanvas(context_->context(), size_, size_); + vcanvas_ = new VectorCanvas(VectorPlatformDeviceFactory::CreateDevice( + size_, size_, true, context_->context())); pcanvas_ = new PlatformCanvas(size_, size_, false); // Clear white. @@ -452,7 +454,8 @@ TEST_F(VectorCanvasTest, Uninitialized) { context_ = new Context(); bitmap_ = new Bitmap(*context_, size_, size_); - vcanvas_ = new VectorCanvas(context_->context(), size_, size_); + vcanvas_ = new VectorCanvas(VectorPlatformDeviceFactory::CreateDevice( + size_, size_, true, context_->context())); pcanvas_ = new PlatformCanvas(size_, size_, false); // VectorCanvas default initialization is black. diff --git a/skia/ext/vector_canvas_win.cc b/skia/ext/vector_canvas_win.cc deleted file mode 100644 index 400b2a4..0000000 --- a/skia/ext/vector_canvas_win.cc +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "skia/ext/vector_canvas.h" - -#include "skia/ext/bitmap_platform_device.h" -#include "skia/ext/vector_platform_device.h" - -namespace skia { - -VectorCanvas::VectorCanvas(HDC dc, int width, int height) { - bool initialized = initialize(dc, width, height); - if (!initialized) - __debugbreak(); -} - -bool VectorCanvas::initialize(HDC context, int width, int height) { - SkDevice* device = VectorPlatformDeviceFactory::CreateDevice(width, height, - true, context); - if (!device) - return false; - - setDevice(device); - device->unref(); // was created with refcount 1, and setDevice also refs - return true; -} - -} // namespace skia - diff --git a/skia/ext/vector_platform_device_linux.cc b/skia/ext/vector_platform_device_linux.cc index 068ae89..bc6a41e 100644 --- a/skia/ext/vector_platform_device_linux.cc +++ b/skia/ext/vector_platform_device_linux.cc @@ -78,9 +78,9 @@ SkDevice* VectorPlatformDeviceFactory::newDevice(SkCanvas* ignored, } // static -SkDevice* VectorPlatformDeviceFactory::CreateDevice(cairo_t* context, - int width, int height, - bool isOpaque) { +PlatformDevice* VectorPlatformDeviceFactory::CreateDevice(cairo_t* context, + int width, int height, + bool isOpaque) { // TODO(myhuang): Here we might also have similar issues as those on Windows // (vector_canvas_win.cc, http://crbug.com/18382 & http://crbug.com/18383). // Please note that is_opaque is true when we use this class for printing. diff --git a/skia/ext/vector_platform_device_linux.h b/skia/ext/vector_platform_device_linux.h index 222f68f..ae2bafb 100644 --- a/skia/ext/vector_platform_device_linux.h +++ b/skia/ext/vector_platform_device_linux.h @@ -15,8 +15,8 @@ namespace skia { class VectorPlatformDeviceFactory : public SkDeviceFactory { public: - static SkDevice* CreateDevice(cairo_t* context, int width, int height, - bool isOpaque); + static PlatformDevice* CreateDevice(cairo_t* context, int width, int height, + bool isOpaque); // Overridden from SkDeviceFactory: virtual SkDevice* newDevice(SkCanvas* ignored, SkBitmap::Config config, diff --git a/skia/ext/vector_platform_device_win.cc b/skia/ext/vector_platform_device_win.cc index 2476152..90f824e 100644 --- a/skia/ext/vector_platform_device_win.cc +++ b/skia/ext/vector_platform_device_win.cc @@ -22,9 +22,8 @@ SkDevice* VectorPlatformDeviceFactory::newDevice(SkCanvas* unused, } //static -SkDevice* VectorPlatformDeviceFactory::CreateDevice(int width, int height, - bool is_opaque, - HANDLE shared_section) { +PlatformDevice* VectorPlatformDeviceFactory::CreateDevice( + int width, int height, bool is_opaque, HANDLE shared_section) { if (!is_opaque) { // TODO(maruel): http://crbug.com/18382 When restoring a semi-transparent // layer, i.e. merging it, we need to rasterize it because GDI doesn't diff --git a/skia/ext/vector_platform_device_win.h b/skia/ext/vector_platform_device_win.h index 6045f24..83d51f7 100644 --- a/skia/ext/vector_platform_device_win.h +++ b/skia/ext/vector_platform_device_win.h @@ -13,13 +13,13 @@ namespace skia { -class VectorPlatformDeviceFactory : public SkDeviceFactory { +class SK_API VectorPlatformDeviceFactory : public SkDeviceFactory { public: virtual SkDevice* newDevice(SkCanvas* ignored, SkBitmap::Config config, int width, int height, bool isOpaque, bool isForLayer) OVERRIDE; - static SkDevice* CreateDevice(int width, int height, bool isOpaque, - HANDLE shared_section); + static PlatformDevice* CreateDevice(int width, int height, bool isOpaque, + HANDLE shared_section); }; // A device is basically a wrapper around SkBitmap that provides a surface for diff --git a/skia/skia.gyp b/skia/skia.gyp index f28ffd2..628bf9b 100644 --- a/skia/skia.gyp +++ b/skia/skia.gyp @@ -642,8 +642,6 @@ 'ext/skia_utils_win.h', 'ext/vector_canvas.cc', 'ext/vector_canvas.h', - 'ext/vector_canvas_linux.cc', - 'ext/vector_canvas_win.cc', 'ext/vector_platform_device.h', 'ext/vector_platform_device_linux.cc', 'ext/vector_platform_device_linux.h', |