Skip to content

Commit

Permalink
Revert 78859 - Unfork VectorPlatformCanvas.
Browse files Browse the repository at this point in the history
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

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=78662
Reverted: http://src.chromium.org/viewvc/chrome?view=rev&revision=78663

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=78812
Reverted: http://src.chromium.org/viewvc/chrome?view=rev&revision=78815

Review URL: http://codereview.chromium.org/6665046

TBR=vandebo@chromium.org
Review URL: http://codereview.chromium.org/6711067

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78860 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
vandebo@chromium.org committed Mar 21, 2011
1 parent d031544 commit 5209d8e
Show file tree
Hide file tree
Showing 19 changed files with 153 additions and 92 deletions.
11 changes: 6 additions & 5 deletions chrome/renderer/print_web_view_helper_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -220,14 +220,15 @@ 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)
gfx::Point content_origin(margin_top_in_points, margin_left_in_points);

if (!metafile->StartPage(page_size, content_origin, 1))
return;

canvas->reset(new skia::VectorCanvas(device));
canvas->reset(new skia::VectorCanvas(metafile->context(),
canvas_size.width(),
canvas_size.height()));
frame->printPage(params.page_number, canvas->get());

// TODO(myhuang): We should handle transformation for paper margins.
Expand Down
57 changes: 47 additions & 10 deletions chrome/renderer/print_web_view_helper_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,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;
Expand All @@ -215,14 +216,49 @@ 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(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.";
} 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.";
Expand All @@ -231,12 +267,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)->FinishDocument())
Expand Down
14 changes: 1 addition & 13 deletions printing/emf_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -413,21 +412,10 @@ 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(1.0f, scale_factor); // We don't support scaling here.
DCHECK_EQ(scale_factor, 1);
DCHECK(hdc_);
if (!hdc_)
return false;
Expand Down
3 changes: 0 additions & 3 deletions printing/emf_win.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,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);
// 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.
Expand Down
11 changes: 0 additions & 11 deletions printing/native_metafile.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ class Rect;
class Size;
}

namespace skia {
class PlatformDevice;
}

#if defined(OS_CHROMEOS)
namespace base {
class FileDescriptor;
Expand All @@ -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;

// 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.
Expand Down
7 changes: 0 additions & 7 deletions printing/pdf_metafile_mac.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

bool PdfMetafile::StartPage(const gfx::Size& page_size,
const gfx::Point& content_origin,
const float& scale_factor) {
Expand Down
4 changes: 0 additions & 4 deletions printing/pdf_metafile_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
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);
Expand Down
12 changes: 0 additions & 12 deletions printing/pdf_ps_metafile_cairo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -145,18 +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) {
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) {
Expand Down
3 changes: 0 additions & 3 deletions printing/pdf_ps_metafile_cairo.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,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 bool StartPage(const gfx::Size& page_size,
const gfx::Point& content_origin,
const float& scale_factor);
Expand Down
10 changes: 5 additions & 5 deletions skia/ext/vector_canvas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
25 changes: 21 additions & 4 deletions skia/ext/vector_canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,38 @@
#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
// 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:
// 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);

Expand Down
28 changes: 28 additions & 0 deletions skia/ext/vector_canvas_linux.cc
Original file line number Diff line number Diff line change
@@ -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
7 changes: 2 additions & 5 deletions skia/ext/vector_canvas_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
30 changes: 30 additions & 0 deletions skia/ext/vector_canvas_win.cc
Original file line number Diff line number Diff line change
@@ -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

6 changes: 3 additions & 3 deletions skia/ext/vector_platform_device_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions skia/ext/vector_platform_device_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading

0 comments on commit 5209d8e

Please sign in to comment.