summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-25 16:35:22 +0000
committervandebo@chromium.org <vandebo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-25 16:35:22 +0000
commite6eddfdb8f1a9688145e5efba334d484c738a1c6 (patch)
treef7f527ea233ab64053683a7af7933314a93f1934
parent8effd3f691277e168a10890127085a3bc999810f (diff)
downloadchromium_src-e6eddfdb8f1a9688145e5efba334d484c738a1c6.zip
chromium_src-e6eddfdb8f1a9688145e5efba334d484c738a1c6.tar.gz
chromium_src-e6eddfdb8f1a9688145e5efba334d484c738a1c6.tar.bz2
Make PluginInstance::PrintPDFOutput metafile-implementation agnostic on Linux.
PluginInstance::PrintPDFOutput wants to set the PDF bits in the metafile. This change makes it agnostic to the implementation of NativeMetafile in use by using the SkRefDict in SkDevice (and removes the old mechanism). BUG=NONE TEST=NONE Review URL: http://codereview.chromium.org/6733036 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@79412 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/renderer/print_web_view_helper_linux.cc3
-rw-r--r--printing/native_metafile_skia_wrapper.cc55
-rw-r--r--printing/native_metafile_skia_wrapper.h34
-rw-r--r--printing/pdf_ps_metafile_cairo.cc12
-rw-r--r--printing/pdf_ps_metafile_cairo.h4
-rw-r--r--printing/pdf_ps_metafile_cairo_unittest.cc1
-rw-r--r--printing/printing.gyp4
-rw-r--r--webkit/plugins/ppapi/ppapi_plugin_instance.cc11
8 files changed, 100 insertions, 24 deletions
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc
index 65370c7..98a2f80 100644
--- a/chrome/renderer/print_web_view_helper_linux.cc
+++ b/chrome/renderer/print_web_view_helper_linux.cc
@@ -10,6 +10,7 @@
#include "chrome/common/print_messages.h"
#include "content/common/view_messages.h"
#include "printing/native_metafile_factory.h"
+#include "printing/native_metafile_skia_wrapper.h"
#include "printing/native_metafile.h"
#include "skia/ext/vector_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
@@ -228,6 +229,8 @@ void PrintWebViewHelper::PrintPage(const PrintMsg_PrintPage_Params& params,
return;
canvas->reset(new skia::VectorCanvas(device));
+ printing::NativeMetafileSkiaWrapper::SetMetafileOnCanvas(canvas->get(),
+ metafile);
frame->printPage(params.page_number, canvas->get());
// TODO(myhuang): We should handle transformation for paper margins.
diff --git a/printing/native_metafile_skia_wrapper.cc b/printing/native_metafile_skia_wrapper.cc
new file mode 100644
index 0000000..af6f446
--- /dev/null
+++ b/printing/native_metafile_skia_wrapper.cc
@@ -0,0 +1,55 @@
+// Copyright (c) 2011 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 "base/logging.h"
+#include "printing/native_metafile_skia_wrapper.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkDevice.h"
+#include "third_party/skia/include/core/SkRefDict.h"
+
+namespace printing {
+
+namespace {
+
+static const char* kNativeMetafileKey = "CrNativeMetafile";
+
+SkRefDict& getRefDict(SkCanvas* canvas) {
+ DCHECK(canvas != NULL);
+
+ SkDevice* device = canvas->getDevice();
+ DCHECK(device != NULL);
+ return device->getRefDict();
+}
+
+} // namespace
+
+
+// static
+void NativeMetafileSkiaWrapper::SetMetafileOnCanvas(SkCanvas* canvas,
+ NativeMetafile* metafile) {
+ NativeMetafileSkiaWrapper* wrapper = NULL;
+ if (metafile)
+ wrapper = new NativeMetafileSkiaWrapper(metafile);
+
+ SkRefDict& dict = getRefDict(canvas);
+ dict.set(kNativeMetafileKey, wrapper);
+ SkSafeUnref(wrapper);
+}
+
+// static
+NativeMetafile* NativeMetafileSkiaWrapper::GetMetafileFromCanvas(
+ SkCanvas* canvas) {
+ SkRefDict& dict = getRefDict(canvas);
+ SkRefCnt* value = dict.find(kNativeMetafileKey);
+ if (!value)
+ return NULL;
+
+ return static_cast<NativeMetafileSkiaWrapper*>(value)->metafile_;
+}
+
+NativeMetafileSkiaWrapper::NativeMetafileSkiaWrapper(NativeMetafile* metafile)
+ : metafile_(metafile) {
+}
+
+} // namespace printing
diff --git a/printing/native_metafile_skia_wrapper.h b/printing/native_metafile_skia_wrapper.h
new file mode 100644
index 0000000..7eb2887
--- /dev/null
+++ b/printing/native_metafile_skia_wrapper.h
@@ -0,0 +1,34 @@
+// Copyright (c) 2011 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.
+
+#ifndef PRINTING_NATIVE_METAFILE_SKIA_WRAPPER_H_
+#define PRINTING_NATIVE_METAFILE_SKIA_WRAPPER_H_
+
+#include "third_party/skia/include/core/SkRefCnt.h"
+
+class SkCanvas;
+
+namespace printing {
+
+class NativeMetafile;
+
+// A wrapper class with static methods to set and retrieve a NativeMetafile
+// on an SkCanvas. The ownership of the metafile is not affected and it
+// is the caller's responsibility to ensure that the metafile remains valid
+// as long as the canvas.
+class NativeMetafileSkiaWrapper : public SkRefCnt {
+ public:
+ static void SetMetafileOnCanvas(SkCanvas* canvas, NativeMetafile* metafile);
+
+ static NativeMetafile* GetMetafileFromCanvas(SkCanvas* canvas);
+
+ private:
+ explicit NativeMetafileSkiaWrapper(NativeMetafile* metafile);
+
+ NativeMetafile* metafile_;
+};
+
+} // namespace printing
+
+#endif // PRINTING_NATIVE_METAFILE_SKIA_WRAPPER_H_
diff --git a/printing/pdf_ps_metafile_cairo.cc b/printing/pdf_ps_metafile_cairo.cc
index fdbb335..a10b125 100644
--- a/printing/pdf_ps_metafile_cairo.cc
+++ b/printing/pdf_ps_metafile_cairo.cc
@@ -20,8 +20,6 @@
namespace {
-const cairo_user_data_key_t kPdfMetafileKey = {0};
-
// Tests if |surface| is valid.
bool IsSurfaceValid(cairo_surface_t* surface) {
return cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS;
@@ -63,10 +61,6 @@ cairo_status_t WriteCairoStream(void* dst_buffer,
return CAIRO_STATUS_SUCCESS;
}
-void DestroyContextData(void* data) {
- // Nothing to be done here.
-}
-
} // namespace
namespace printing {
@@ -110,7 +104,6 @@ bool PdfPsMetafile::Init() {
return false;
}
- cairo_set_user_data(context_, &kPdfMetafileKey, this, DestroyContextData);
return true;
}
@@ -257,11 +250,6 @@ bool PdfPsMetafile::SaveToFD(const base::FileDescriptor& fd) const {
}
#endif // if defined(OS_CHROMEOS)
-PdfPsMetafile* PdfPsMetafile::FromCairoContext(cairo_t* context) {
- return reinterpret_cast<PdfPsMetafile*>(
- cairo_get_user_data(context, &kPdfMetafileKey));
-}
-
void PdfPsMetafile::CleanUpAll() {
CleanUpContext(&context_);
CleanUpSurface(&surface_);
diff --git a/printing/pdf_ps_metafile_cairo.h b/printing/pdf_ps_metafile_cairo.h
index 2ae1f34..6d5cf5c 100644
--- a/printing/pdf_ps_metafile_cairo.h
+++ b/printing/pdf_ps_metafile_cairo.h
@@ -58,10 +58,6 @@ class PdfPsMetafile : public NativeMetafile {
virtual bool SaveToFD(const base::FileDescriptor& fd) const;
#endif // if defined(OS_CHROMEOS)
- // Returns the PdfPsMetafile object that owns the given context. Returns NULL
- // if the context was not created by a PdfPsMetafile object.
- static PdfPsMetafile* FromCairoContext(cairo_t* context);
-
protected:
PdfPsMetafile();
diff --git a/printing/pdf_ps_metafile_cairo_unittest.cc b/printing/pdf_ps_metafile_cairo_unittest.cc
index d76d801..5b2bf2a 100644
--- a/printing/pdf_ps_metafile_cairo_unittest.cc
+++ b/printing/pdf_ps_metafile_cairo_unittest.cc
@@ -33,7 +33,6 @@ TEST_F(PdfPsTest, Pdf) {
// Renders page 1.
EXPECT_TRUE(pdf.StartPage(gfx::Size(72, 73), gfx::Point(4, 5), 1));
- EXPECT_EQ(printing::PdfPsMetafile::FromCairoContext(pdf.context()), &pdf);
// In theory, we should use Cairo to draw something on |context|.
EXPECT_TRUE(pdf.FinishPage());
diff --git a/printing/printing.gyp b/printing/printing.gyp
index 049e752..0e504c4 100644
--- a/printing/printing.gyp
+++ b/printing/printing.gyp
@@ -94,6 +94,10 @@
'sources/': [['exclude', '_posix\\.cc$']]
}],
['OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ 'sources': [
+ 'native_metafile_skia_wrapper.cc',
+ 'native_metafile_skia_wrapper.h',
+ ],
'dependencies': [
# For FT_Init_FreeType and friends.
'../build/linux/system.gyp:freetype2',
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
index 0756308..d6a1da0 100644
--- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc
+++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
@@ -69,7 +69,7 @@
#endif
#if defined(OS_LINUX)
-#include "printing/pdf_ps_metafile_cairo.h"
+#include "printing/native_metafile_skia_wrapper.h"
#endif
#if defined(OS_WIN)
@@ -1180,15 +1180,12 @@ bool PluginInstance::PrintPDFOutput(PP_Resource print_output,
bool ret = false;
#if defined(OS_LINUX)
- // On Linux we need to get the backing PdfPsMetafile and write the bits
- // directly.
- cairo_t* context = canvas->beginPlatformPaint();
+ // On Linux we just set the final bits in the native metafile.
printing::NativeMetafile* metafile =
- printing::PdfPsMetafile::FromCairoContext(context);
- DCHECK(metafile);
+ printing::NativeMetafileSkiaWrapper::GetMetafileFromCanvas(canvas);
+ DCHECK(metafile != NULL);
if (metafile)
ret = metafile->InitFromData(buffer->mapped_buffer(), buffer->size());
- canvas->endPlatformPaint();
#elif defined(OS_MACOSX)
scoped_ptr<printing::NativeMetafile> metafile(
printing::NativeMetafileFactory::Create());