summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 03:41:22 +0000
committervandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-18 03:41:22 +0000
commit063f8db1c4ec940c6391a36f85c9bcb124fbed9a (patch)
tree62be78e0e699429c27ea0f1797c16ed0bdb2aacd
parent2aba747f04b9466ec85ff659285192da21195c32 (diff)
downloadchromium_src-063f8db1c4ec940c6391a36f85c9bcb124fbed9a.zip
chromium_src-063f8db1c4ec940c6391a36f85c9bcb124fbed9a.tar.gz
chromium_src-063f8db1c4ec940c6391a36f85c9bcb124fbed9a.tar.bz2
Unfork VectorPlatformCanvas.
Unfork VectorPlatformCanvas by making NativeMetafile know how to create an appropriate VectorPlatformDevice. This will also be useful when we have multiple NativeMetafile implemenations (each requiring a different VectorPlatformDevices). BUG=NONE TEST=NONE Review URL: http://codereview.chromium.org/6665046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78662 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/renderer/print_web_view_helper_linux.cc13
-rw-r--r--chrome/renderer/print_web_view_helper_win.cc53
-rw-r--r--printing/emf_win.cc13
-rw-r--r--printing/emf_win.h4
-rw-r--r--printing/native_metafile.h11
-rw-r--r--printing/pdf_metafile_mac.cc7
-rw-r--r--printing/pdf_metafile_mac.h4
-rw-r--r--printing/pdf_ps_metafile_cairo.cc13
-rw-r--r--printing/pdf_ps_metafile_cairo.h3
-rw-r--r--skia/ext/vector_canvas.cc10
-rw-r--r--skia/ext/vector_canvas.h25
-rw-r--r--skia/ext/vector_canvas_linux.cc28
-rw-r--r--skia/ext/vector_canvas_unittest.cc7
-rw-r--r--skia/ext/vector_canvas_win.cc30
-rw-r--r--skia/ext/vector_platform_device_linux.cc6
-rw-r--r--skia/ext/vector_platform_device_linux.h4
-rw-r--r--skia/ext/vector_platform_device_win.cc5
-rw-r--r--skia/ext/vector_platform_device_win.h4
-rw-r--r--skia/skia.gyp2
19 files changed, 92 insertions, 150 deletions
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc
index 827c618..06f802d 100644
--- a/chrome/renderer/print_web_view_helper_linux.cc
+++ b/chrome/renderer/print_web_view_helper_linux.cc
@@ -219,17 +219,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);
- cairo_t* cairo_context =
- metafile->StartPage(page_size,
- margin_top_in_points,
- margin_left_in_points);
- if (!cairo_context)
+ skia::PlatformDevice* device = metafile->StartPageForVectorCanvas(
+ page_size, content_origin, 1.0f);
+ if (!device)
return;
- canvas->reset(new skia::VectorCanvas(cairo_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 72e3399..66b0486 100644
--- a/chrome/renderer/print_web_view_helper_win.cc
+++ b/chrome/renderer/print_web_view_helper_win.cc
@@ -194,8 +194,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;
@@ -209,45 +208,12 @@ 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();
- 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;
- }
-
- // 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);
+ gfx::Size page_size(width, height);
+ gfx::Point content_origin;
+ skia::PlatformDevice* device = (*metafile)->StartPageForVectorCanvas(
+ page_size, content_origin, 1.0f);
+ DCHECK(device);
+ skia::VectorCanvas canvas(device);
float webkit_scale_factor = frame->printPage(page_number, &canvas);
if (*scale_factor <= 0 || webkit_scale_factor <= 0) {
NOTREACHED() << "Printing page " << page_number << " failed.";
@@ -256,13 +222,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)->Close())
diff --git a/printing/emf_win.cc b/printing/emf_win.cc
index 6fea291..dd9d8d6 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"
@@ -410,6 +411,18 @@ 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) {
+ DCHECK_EQ(1.0f, scale_factor); // We don't support scaling here.
+ if (!StartPage())
+ return NULL;
+
+ return skia::VectorPlatformDeviceFactory::CreateDevice(page_size.width(),
+ page_size.height(),
+ true, hdc_);
+}
+
bool Emf::StartPage() {
DCHECK(hdc_);
if (!hdc_)
diff --git a/printing/emf_win.h b/printing/emf_win.h
index 5150356..241b4e4 100644
--- a/printing/emf_win.h
+++ b/printing/emf_win.h
@@ -15,6 +15,7 @@
class FilePath;
namespace gfx {
+class Point;
class Rect;
}
@@ -33,6 +34,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);
virtual bool StartPage();
virtual bool FinishPage();
virtual bool Close();
diff --git a/printing/native_metafile.h b/printing/native_metafile.h
index a076b32..ce43740 100644
--- a/printing/native_metafile.h
+++ b/printing/native_metafile.h
@@ -26,6 +26,10 @@ class Size;
class Point;
}
+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;
+
#if defined(OS_WIN)
// Inserts a custom GDICOMMENT records indicating StartPage/EndPage calls
// (since StartPage and EndPage do not work in a metafile DC). Only valid
diff --git a/printing/pdf_metafile_mac.cc b/printing/pdf_metafile_mac.cc
index 6c53de9..157950c 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;
+}
+
CGContextRef PdfMetafile::StartPage(const gfx::Size& page_size,
const gfx::Point& content_origin, const float& scale_factor) {
DCHECK(context_.get());
diff --git a/printing/pdf_metafile_mac.h b/printing/pdf_metafile_mac.h
index d1dbbef..728ae10 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.
+ skia::PlatformDevice* StartPageForVectorCanvas(
+ const gfx::Size& page_size, const gfx::Point& content_origin,
+ const float& scale_factor);
virtual CGContextRef 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 cfa89e4..9f59eca 100644
--- a/printing/pdf_ps_metafile_cairo.cc
+++ b/printing/pdf_ps_metafile_cairo.cc
@@ -145,6 +145,19 @@ 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) {
+ DCHECK_EQ(1.0f, scale_factor); // We don't yet support scale_factor.
+ if (!StartPage(page_size, content_origin.y(), content_origin.x()))
+ return NULL;
+
+ return skia::VectorPlatformDeviceFactory::CreateDevice(context_,
+ page_size.width(),
+ page_size.height(),
+ true);
+}
+
cairo_t* PdfPsMetafile::StartPage(const gfx::Size& page_size,
double margin_top_in_points,
double margin_left_in_points) {
diff --git a/printing/pdf_ps_metafile_cairo.h b/printing/pdf_ps_metafile_cairo.h
index 1294862..faacdb0 100644
--- a/printing/pdf_ps_metafile_cairo.h
+++ b/printing/pdf_ps_metafile_cairo.h
@@ -25,6 +25,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 cairo_t* StartPage(const gfx::Size& page_size,
double margin_top_in_points,
double margin_left_in_points);
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..a749332 100644
--- a/skia/ext/vector_platform_device_win.h
+++ b/skia/ext/vector_platform_device_win.h
@@ -18,8 +18,8 @@ class VectorPlatformDeviceFactory : public SkDeviceFactory {
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 a34bd28..9994593 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',