summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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, 150 insertions, 92 deletions
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc
index 06f802d..827c618 100644
--- a/chrome/renderer/print_web_view_helper_linux.cc
+++ b/chrome/renderer/print_web_view_helper_linux.cc
@@ -219,14 +219,17 @@ 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);
- skia::PlatformDevice* device = metafile->StartPageForVectorCanvas(
- page_size, content_origin, 1.0f);
- if (!device)
+ cairo_t* cairo_context =
+ metafile->StartPage(page_size,
+ margin_top_in_points,
+ margin_left_in_points);
+ if (!cairo_context)
return;
- canvas->reset(new skia::VectorCanvas(device));
+ canvas->reset(new skia::VectorCanvas(cairo_context,
+ canvas_size.width(),
+ canvas_size.height()));
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 66b0486..72e3399 100644
--- a/chrome/renderer/print_web_view_helper_win.cc
+++ b/chrome/renderer/print_web_view_helper_win.cc
@@ -194,7 +194,8 @@ void PrintWebViewHelper::CreatePreviewDocument(
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;
@@ -208,12 +209,45 @@ 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);
- 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);
+ 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);
float webkit_scale_factor = frame->printPage(page_number, &canvas);
if (*scale_factor <= 0 || webkit_scale_factor <= 0) {
NOTREACHED() << "Printing page " << page_number << " failed.";
@@ -222,12 +256,13 @@ void PrintWebViewHelper::RenderPage(
// webkit.
*scale_factor /= webkit_scale_factor;
}
+#endif
- bool result = (*metafile)->FinishPage();
+ 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)->Close())
diff --git a/printing/emf_win.cc b/printing/emf_win.cc
index dd9d8d6..6fea291 100644
--- a/printing/emf_win.cc
+++ b/printing/emf_win.cc
@@ -9,7 +9,6 @@
#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"
@@ -411,18 +410,6 @@ 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 241b4e4..5150356 100644
--- a/printing/emf_win.h
+++ b/printing/emf_win.h
@@ -15,7 +15,6 @@
class FilePath;
namespace gfx {
-class Point;
class Rect;
}
@@ -34,9 +33,6 @@ 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 ce43740..a076b32 100644
--- a/printing/native_metafile.h
+++ b/printing/native_metafile.h
@@ -26,10 +26,6 @@ class Size;
class Point;
}
-namespace skia {
-class PlatformDevice;
-}
-
#if defined(OS_CHROMEOS)
namespace base {
class FileDescriptor;
@@ -54,13 +50,6 @@ 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 157950c..6c53de9 100644
--- a/printing/pdf_metafile_mac.cc
+++ b/printing/pdf_metafile_mac.cc
@@ -62,13 +62,6 @@ 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 728ae10..d1dbbef 100644
--- a/printing/pdf_metafile_mac.h
+++ b/printing/pdf_metafile_mac.h
@@ -33,10 +33,6 @@ 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 9f59eca..cfa89e4 100644
--- a/printing/pdf_ps_metafile_cairo.cc
+++ b/printing/pdf_ps_metafile_cairo.cc
@@ -145,19 +145,6 @@ 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 faacdb0..1294862 100644
--- a/printing/pdf_ps_metafile_cairo.h
+++ b/printing/pdf_ps_metafile_cairo.h
@@ -25,9 +25,6 @@ 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 216a2ee..851da79 100644
--- a/skia/ext/vector_canvas.cc
+++ b/skia/ext/vector_canvas.cc
@@ -4,13 +4,13 @@
#include "skia/ext/vector_canvas.h"
-#include "skia/ext/vector_platform_device.h"
-
namespace skia {
-VectorCanvas::VectorCanvas(PlatformDevice* device)
- : PlatformCanvas(device->getDeviceFactory()) {
- setDevice(device)->unref(); // Created with refcount 1, and setDevice refs.
+VectorCanvas::VectorCanvas()
+ : PlatformCanvas(SkNEW(VectorPlatformDeviceFactory)) {
+}
+
+VectorCanvas::VectorCanvas(SkDeviceFactory* factory) : PlatformCanvas(factory) {
}
VectorCanvas::~VectorCanvas() {
diff --git a/skia/ext/vector_canvas.h b/skia/ext/vector_canvas.h
index 4b4419d..4f8bc7a 100644
--- a/skia/ext/vector_canvas.h
+++ b/skia/ext/vector_canvas.h
@@ -7,10 +7,13 @@
#pragma once
#include "skia/ext/platform_canvas.h"
+#include "skia/ext/vector_platform_device.h"
-namespace skia {
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+typedef struct _cairo cairo_t;
+#endif
-class PlatformDevice;
+namespace skia {
// This class is a specialization of the regular PlatformCanvas. It is designed
// to work with a VectorDevice to manage platform-specific drawing. It allows
@@ -18,10 +21,24 @@ class PlatformDevice;
// support reading back from the bitmap backstore since it is not used.
class SK_API VectorCanvas : public PlatformCanvas {
public:
- // Ownership of |device| is transfered to VectorCanvas.
- explicit VectorCanvas(PlatformDevice* device);
+ 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
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
new file mode 100644
index 0000000..aff4fbe
--- /dev/null
+++ b/skia/ext/vector_canvas_linux.cc
@@ -0,0 +1,28 @@
+// 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 1066c0c..0266c81 100644
--- a/skia/ext/vector_canvas_unittest.cc
+++ b/skia/ext/vector_canvas_unittest.cc
@@ -14,7 +14,6 @@
#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"
@@ -387,8 +386,7 @@ class VectorCanvasTest : public ImageTest {
size_ = size;
context_ = new Context();
bitmap_ = new Bitmap(*context_, size_, size_);
- vcanvas_ = new VectorCanvas(VectorPlatformDeviceFactory::CreateDevice(
- size_, size_, true, context_->context()));
+ vcanvas_ = new VectorCanvas(context_->context(), size_, size_);
pcanvas_ = new PlatformCanvas(size_, size_, false);
// Clear white.
@@ -454,8 +452,7 @@ TEST_F(VectorCanvasTest, Uninitialized) {
context_ = new Context();
bitmap_ = new Bitmap(*context_, size_, size_);
- vcanvas_ = new VectorCanvas(VectorPlatformDeviceFactory::CreateDevice(
- size_, size_, true, context_->context()));
+ vcanvas_ = new VectorCanvas(context_->context(), size_, size_);
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
new file mode 100644
index 0000000..400b2a4
--- /dev/null
+++ b/skia/ext/vector_canvas_win.cc
@@ -0,0 +1,30 @@
+// 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 bc6a41e..068ae89 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
-PlatformDevice* VectorPlatformDeviceFactory::CreateDevice(cairo_t* context,
- int width, int height,
- bool isOpaque) {
+SkDevice* 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 ae2bafb..222f68f 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 PlatformDevice* CreateDevice(cairo_t* context, int width, int height,
- bool isOpaque);
+ static SkDevice* 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 90f824e..2476152 100644
--- a/skia/ext/vector_platform_device_win.cc
+++ b/skia/ext/vector_platform_device_win.cc
@@ -22,8 +22,9 @@ SkDevice* VectorPlatformDeviceFactory::newDevice(SkCanvas* unused,
}
//static
-PlatformDevice* VectorPlatformDeviceFactory::CreateDevice(
- int width, int height, bool is_opaque, HANDLE shared_section) {
+SkDevice* 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 a749332..6045f24 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 PlatformDevice* CreateDevice(int width, int height, bool isOpaque,
- HANDLE shared_section);
+ static SkDevice* 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 9994593..a34bd28 100644
--- a/skia/skia.gyp
+++ b/skia/skia.gyp
@@ -642,6 +642,8 @@
'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',