diff options
-rw-r--r-- | skia/ext/platform_canvas_skia.cc | 121 | ||||
-rw-r--r-- | skia/skia.gyp | 10 |
2 files changed, 131 insertions, 0 deletions
diff --git a/skia/ext/platform_canvas_skia.cc b/skia/ext/platform_canvas_skia.cc new file mode 100644 index 0000000..258f119 --- /dev/null +++ b/skia/ext/platform_canvas_skia.cc @@ -0,0 +1,121 @@ +// Copyright (c) 2012 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/platform_canvas.h" + +#include "base/debug/trace_event.h" +#include "skia/ext/bitmap_platform_device.h" + +// TODO(reveman): a lot of unnecessary duplication of code from +// platform_canvas_[win|linux|mac].cc in here. Need to refactor +// PlatformCanvas to avoid this: +// http://code.google.com/p/chromium/issues/detail?id=119555 + +namespace skia { + +PlatformCanvas::PlatformCanvas(int width, int height, bool is_opaque) { + TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", + "width", width, "height", height); + if (!initialize(width, height, is_opaque)) + SK_CRASH(); +} + +#if defined(WIN32) +PlatformCanvas::PlatformCanvas(int width, + int height, + bool is_opaque, + HANDLE shared_section) { + TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", + "width", width, "height", height); + if (!initialize(width, height, is_opaque, shared_section)) + SK_CRASH(); +} +#elif defined(__APPLE__) +PlatformCanvas::PlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data) { + TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", + "width", width, "height", height); + if (!initialize(width, height, is_opaque, data)) + SK_CRASH(); +} +PlatformCanvas::PlatformCanvas(int width, + int height, + bool is_opaque, + CGContextRef context) { + TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", + "width", width, "height", height); + if (!initialize(context, width, height, is_opaque)) + SK_CRASH(); +} +#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ + defined(__sun) || defined(ANDROID) +PlatformCanvas::PlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data) { + TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", + "width", width, "height", height); + if (!initialize(width, height, is_opaque, data)) + SK_CRASH(); +} +#endif + +PlatformCanvas::~PlatformCanvas() { +} + +#if defined(WIN32) +bool PlatformCanvas::initialize(int width, + int height, + bool is_opaque, + HANDLE shared_section) { + // Use platform specific device for shared_section. + if (shared_section) { + if (initializeWithDevice(BitmapPlatformDevice::Create(width, + height, + is_opaque, + shared_section))) + return true; + + // TODO(reveman): move the failure investigation from + // platform_canvas_win.cc to bitmap_platform_device_win.cc. + return false; + } + + return initializeWithDevice(new SkDevice( + SkBitmap::kARGB_8888_Config, width, height, is_opaque)); +} +#elif defined(__APPLE__) +bool PlatformCanvas::initialize(int width, + int height, + bool is_opaque, + uint8_t* data) { + // Use platform specific device for data. + if (data) + return initializeWithDevice(BitmapPlatformDevice::CreateWithData( + data, width, height, is_opaque)); + + return initializeWithDevice(new SkDevice( + SkBitmap::kARGB_8888_Config, width, height, is_opaque)); +} + +bool PlatformCanvas::initialize(CGContextRef context, + int width, + int height, + bool is_opaque) { + return initializeWithDevice(BitmapPlatformDevice::Create( + context, width, height, is_opaque)); +} +#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ + defined(__sun) || defined(ANDROID) +bool PlatformCanvas::initialize(int width, int height, bool is_opaque, + uint8_t* data) { + // Use platform specific device for data. + if (data) + return initializeWithDevice(BitmapPlatformDevice::Create( + width, height, is_opaque, data)); + + return initializeWithDevice(new SkDevice( + SkBitmap::kARGB_8888_Config, width, height, is_opaque)); +} +#endif + +} // namespace skia diff --git a/skia/skia.gyp b/skia/skia.gyp index 85b34b87..3549a92 100644 --- a/skia/skia.gyp +++ b/skia/skia.gyp @@ -712,6 +712,7 @@ 'ext/platform_canvas.h', 'ext/platform_canvas_linux.cc', 'ext/platform_canvas_mac.cc', + 'ext/platform_canvas_skia.cc', 'ext/platform_canvas_win.cc', 'ext/platform_device.cc', 'ext/platform_device.h', @@ -855,6 +856,15 @@ ['include', 'ext/platform_canvas_linux\\.cc$'], ], }], + [ 'use_aura == 1 and use_canvas_skia == 1', { + 'sources/': [ + ['exclude', 'ext/platform_canvas_mac\\.cc$'], + ['exclude', 'ext/platform_canvas_linux\\.cc$'], + ['exclude', 'ext/platform_canvas_win\\.cc$'], + ], + }, { # use_aura == 0 and use_canvas_skia == 1 + 'sources/': [ ['exclude', 'ext/platform_canvas_skia\\.cc$'] ], + }], [ 'toolkit_uses_gtk == 1', { 'dependencies': [ '../build/linux/system.gyp:gdk', |