diff options
author | reed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 13:46:56 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-14 13:46:56 +0000 |
commit | 9d611ca0375cf3594423fa8571a30ed356e568f6 (patch) | |
tree | 6e04e592faf658dd786ea2cb1115af7ac7247124 | |
parent | bd3db410a3334cbcbd50247306d286326003eb2c (diff) | |
download | chromium_src-9d611ca0375cf3594423fa8571a30ed356e568f6.zip chromium_src-9d611ca0375cf3594423fa8571a30ed356e568f6.tar.gz chromium_src-9d611ca0375cf3594423fa8571a30ed356e568f6.tar.bz2 |
Simplify platform_canvas.h by recognizing that PlatformCanvas does not actually extend
SkCanvas in any way, other than provide a host of constructors (and delayed constructors
in the form of 'initialize' methods).
These late initializers are a problem, as SkCanvas is deprecating its setDevice() call,
moving to model where the backingstore/device for the canvas must be created before the
canvas is created. This is necessary to allow skia to continue to extend SkCanvas for
its backends (e.g. GPU, PDF, Picture, Pipe, etc.).
The practical change in this CL is to make PlatformCanvas just a typedef for SkCanvas,
and change the call-sites that want to call initialize() to instead create the canvas
using one of the provided Factory functions (e.g. CreatePlatformCanvas). The modifier
Platform is maintained, to document that this canvas may be backed by platform-specific
pixels (e.g. allocated by GDI or cairo).
Review URL: https://codereview.chromium.org/11138024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167669 0039d316-1c4b-4281-b951-d872f2087c98
52 files changed, 387 insertions, 648 deletions
diff --git a/chrome/renderer/automation/automation_renderer_helper.cc b/chrome/renderer/automation/automation_renderer_helper.cc index bfc4014..be20770 100644 --- a/chrome/renderer/automation/automation_renderer_helper.cc +++ b/chrome/renderer/automation/automation_renderer_helper.cc @@ -67,9 +67,9 @@ bool AutomationRendererHelper::SnapshotEntirePage( view->layout(); frame->setScrollOffset(WebSize(0, 0)); - skia::PlatformCanvas canvas( - new_size.width, new_size.height, true /* is_opaque */); - view->paint(webkit_glue::ToWebCanvas(&canvas), + skia::ScopedPlatformCanvas canvas(new_size.width, new_size.height, true); + + view->paint(webkit_glue::ToWebCanvas(canvas), gfx::Rect(0, 0, new_size.width, new_size.height)); frame->setCanHaveScrollbars(true); @@ -80,7 +80,7 @@ bool AutomationRendererHelper::SnapshotEntirePage( frame->setScrollOffset(WebSize(old_scroll.width - min_scroll.width, old_scroll.height - min_scroll.height)); - const SkBitmap& bmp = skia::GetTopDevice(canvas)->accessBitmap(false); + const SkBitmap& bmp = skia::GetTopDevice(*canvas)->accessBitmap(false); SkAutoLockPixels lock_pixels(bmp); // EncodeBGRA uses FORMAT_SkBitmap, which doesn't work on windows for some // cases dealing with transparency. See crbug.com/96317. Use FORMAT_BGRA. diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc index fca9e75..81314af 100644 --- a/chrome/renderer/chrome_render_view_observer.cc +++ b/chrome/renderer/chrome_render_view_observer.cc @@ -150,22 +150,6 @@ enum { // Constants for mixed-content blocking. static const char kGoogleDotCom[] = "google.com"; -static bool PaintViewIntoCanvas(WebView* view, - skia::PlatformCanvas& canvas) { - view->layout(); - const WebSize& size = view->size(); - - if (!canvas.initialize(size.width, size.height, true)) - return false; - - view->paint(webkit_glue::ToWebCanvas(&canvas), - WebRect(0, 0, size.width, size.height)); - // TODO: Add a way to snapshot the whole page, not just the currently - // visible part. - - return true; -} - static FaviconURL::IconType ToFaviconType(WebIconURL::Type type) { switch (type) { case WebIconURL::TypeFavicon: @@ -904,11 +888,21 @@ bool ChromeRenderViewObserver::CaptureSnapshot(WebView* view, SkBitmap* snapshot) { base::TimeTicks beginning_time = base::TimeTicks::Now(); - skia::PlatformCanvas canvas; - if (!PaintViewIntoCanvas(view, canvas)) + view->layout(); + const WebSize& size = view->size(); + + SkCanvas* canvas = skia::CreatePlatformCanvas(size.width, size.height, true, + NULL, skia::RETURN_NULL_ON_FAILURE); + if (!canvas) return false; - SkDevice* device = skia::GetTopDevice(canvas); + SkAutoUnref au(canvas); + view->paint(webkit_glue::ToWebCanvas(canvas), + WebRect(0, 0, size.width, size.height)); + // TODO: Add a way to snapshot the whole page, not just the currently + // visible part. + + SkDevice* device = skia::GetTopDevice(*canvas); const SkBitmap& bitmap = device->accessBitmap(false); if (!bitmap.copyTo(snapshot, SkBitmap::kARGB_8888_Config)) diff --git a/chrome/renderer/safe_browsing/phishing_thumbnailer.cc b/chrome/renderer/safe_browsing/phishing_thumbnailer.cc index 13f8c67..3b98fea 100644 --- a/chrome/renderer/safe_browsing/phishing_thumbnailer.cc +++ b/chrome/renderer/safe_browsing/phishing_thumbnailer.cc @@ -32,10 +32,12 @@ SkBitmap GrabPhishingThumbnail(content::RenderView* render_view, } WebView* view = render_view->GetWebView(); base::TimeTicks beginning_time = base::TimeTicks::Now(); - skia::PlatformCanvas canvas; - if (!canvas.initialize(view_size.width(), view_size.height(), true)) { + SkCanvas* canvas = skia::CreatePlatformCanvas(view_size.width(), + view_size.height(), true, 0, + skia::RETURN_NULL_ON_FAILURE); + if (!canvas) return SkBitmap(); - } + SkAutoUnref au(canvas); // Make sure we are not using any zoom when we take the snapshot. We will // restore the previous zoom level after the snapshot is taken. @@ -49,10 +51,10 @@ SkBitmap GrabPhishingThumbnail(content::RenderView* render_view, view->mainFrame()->setCanHaveScrollbars(false); // always hide scrollbars. view->resize(view_size); view->layout(); - view->paint(webkit_glue::ToWebCanvas(&canvas), + view->paint(webkit_glue::ToWebCanvas(canvas), WebRect(0, 0, view_size.width(), view_size.height())); - SkDevice* device = skia::GetTopDevice(canvas); + SkDevice* device = skia::GetTopDevice(*canvas); // Now resize the thumbnail to the right size. Note: it is important that we // use this resize algorithm here. diff --git a/content/plugin/webplugin_proxy.cc b/content/plugin/webplugin_proxy.cc index 148e906..8f8912f 100644 --- a/content/plugin/webplugin_proxy.cc +++ b/content/plugin/webplugin_proxy.cc @@ -451,14 +451,11 @@ void WebPluginProxy::CreateCanvasFromHandle( const TransportDIB::Handle& dib_handle, const gfx::Rect& window_rect, SkAutoTUnref<skia::PlatformCanvas>* canvas) { - canvas->reset(new skia::PlatformCanvas); - if (!canvas->get()->initialize( - window_rect.width(), - window_rect.height(), - true, - dib_handle)) { - canvas->reset(NULL); - } + canvas->reset(skia::CreatePlatformCanvas(window_rect.width(), + window_rect.height(), + true, + dib_handle, + skia::RETURN_NULL_ON_FAILURE)); // The canvas does not own the section so we need to close it now. CloseHandle(dib_handle); } diff --git a/content/plugin/webplugin_proxy.h b/content/plugin/webplugin_proxy.h index a51dc75..7c5e412 100644 --- a/content/plugin/webplugin_proxy.h +++ b/content/plugin/webplugin_proxy.h @@ -27,9 +27,7 @@ #include "ui/surface/transport_dib.h" #include "webkit/plugins/npapi/webplugin.h" -namespace skia { -class PlatformCanvas; -} +class SkCanvas; namespace webkit { namespace npapi { @@ -215,7 +213,7 @@ class WebPluginProxy : public webkit::npapi::WebPlugin { #if defined(OS_WIN) void CreateCanvasFromHandle(const TransportDIB::Handle& dib_handle, const gfx::Rect& window_rect, - SkAutoTUnref<skia::PlatformCanvas>* canvas); + SkAutoTUnref<SkCanvas>* canvas); #elif defined(OS_MACOSX) static void CreateDIBAndCGContextFromHandle( const TransportDIB::Handle& dib_handle, @@ -227,7 +225,7 @@ class WebPluginProxy : public webkit::npapi::WebPlugin { const TransportDIB::Handle& dib_handle, const gfx::Rect& window_rect, scoped_refptr<SharedTransportDIB>* dib_out, - SkAutoTUnref<skia::PlatformCanvas>* canvas); + SkAutoTUnref<SkCanvas>* canvas); static void CreateShmPixmapFromDIB( TransportDIB* dib, @@ -245,7 +243,7 @@ class WebPluginProxy : public webkit::npapi::WebPlugin { return windowless_contexts_[windowless_buffer_index_].get(); } #else - skia::PlatformCanvas* windowless_canvas() const { + SkCanvas* windowless_canvas() const { return windowless_canvases_[windowless_buffer_index_].get(); } @@ -282,7 +280,8 @@ class WebPluginProxy : public webkit::npapi::WebPlugin { base::mac::ScopedCFTypeRef<CGContextRef> windowless_contexts_[2]; scoped_ptr<WebPluginAcceleratedSurfaceProxy> accelerated_surface_; #else - SkAutoTUnref<skia::PlatformCanvas> windowless_canvases_[2]; + SkAutoTUnref<SkCanvas> windowless_canvases_[2]; + SkAutoTUnref<SkCanvas> background_canvas_; #if defined(USE_X11) scoped_refptr<SharedTransportDIB> windowless_dibs_[2]; diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index d8f60c5..d8cf69b 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc @@ -762,7 +762,7 @@ void BrowserPlugin::FreeDamageBuffer() { TransportDIB* BrowserPlugin::PopulateResizeGuestParameters( BrowserPluginHostMsg_ResizeGuest_Params* params, int view_width, int view_height) { - const size_t stride = skia::PlatformCanvas::StrideForWidth(view_width); + const size_t stride = skia::PlatformCanvasStrideForWidth(view_width); // Make sure the size of the damage buffer is at least four bytes so that we // can fit in a magic word to verify that the memory is shared correctly. size_t size = diff --git a/content/renderer/pepper/pepper_platform_image_2d_impl.cc b/content/renderer/pepper/pepper_platform_image_2d_impl.cc index 0cdeeed..dcad9ce 100644 --- a/content/renderer/pepper/pepper_platform_image_2d_impl.cc +++ b/content/renderer/pepper/pepper_platform_image_2d_impl.cc @@ -63,7 +63,7 @@ PepperPlatformImage2DImpl* PepperPlatformImage2DImpl::Create(int width, return new PepperPlatformImage2DImpl(width, height, dib); } -skia::PlatformCanvas* PepperPlatformImage2DImpl::Map() { +SkCanvas* PepperPlatformImage2DImpl::Map() { return dib_->GetPlatformCanvas(width_, height_); } diff --git a/content/renderer/pepper/pepper_platform_image_2d_impl.h b/content/renderer/pepper/pepper_platform_image_2d_impl.h index 851689a..099a428 100644 --- a/content/renderer/pepper/pepper_platform_image_2d_impl.h +++ b/content/renderer/pepper/pepper_platform_image_2d_impl.h @@ -21,7 +21,7 @@ class PepperPlatformImage2DImpl static PepperPlatformImage2DImpl* Create(int width, int height); // PlatformImage2D implementation. - virtual skia::PlatformCanvas* Map() OVERRIDE; + virtual SkCanvas* Map() OVERRIDE; virtual intptr_t GetSharedMemoryHandle(uint32* byte_count) const OVERRIDE; virtual TransportDIB* GetTransportDIB() const OVERRIDE; diff --git a/content/renderer/render_process.h b/content/renderer/render_process.h index 92a54a7..8443131 100644 --- a/content/renderer/render_process.h +++ b/content/renderer/render_process.h @@ -14,10 +14,6 @@ namespace gfx { class Rect; } -namespace skia { -class PlatformCanvas; -} - namespace content { // A abstract interface representing the renderer end of the browser<->renderer @@ -39,8 +35,8 @@ class RenderProcess : public ChildProcess { // // When no longer needed, you should pass the TransportDIB to // ReleaseTransportDIB so that it can be recycled. - virtual skia::PlatformCanvas* GetDrawingCanvas(TransportDIB** memory, - const gfx::Rect& rect) = 0; + virtual SkCanvas* GetDrawingCanvas(TransportDIB** memory, + const gfx::Rect& rect) = 0; // Frees shared memory allocated by AllocSharedMemory. You should only use // this function to free the SharedMemory object. diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index c221605..bbcb312 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc @@ -151,7 +151,7 @@ skia::PlatformCanvas* RenderProcessImpl::GetDrawingCanvas( TransportDIB** memory, const gfx::Rect& rect) { int width = rect.width(); int height = rect.height(); - const size_t stride = skia::PlatformCanvas::StrideForWidth(rect.width()); + const size_t stride = skia::PlatformCanvasStrideForWidth(rect.width()); #if defined(OS_LINUX) || defined(OS_OPENBSD) const size_t max_size = base::SysInfo::MaxSharedMemorySize(); #else diff --git a/content/renderer/render_process_impl.h b/content/renderer/render_process_impl.h index 4755842..c6819a9 100644 --- a/content/renderer/render_process_impl.h +++ b/content/renderer/render_process_impl.h @@ -8,9 +8,7 @@ #include "base/timer.h" #include "content/renderer/render_process.h" -namespace skia { -class PlatformCanvas; -} +class SkCanvas; namespace content { @@ -23,7 +21,7 @@ class RenderProcessImpl : public RenderProcess { virtual ~RenderProcessImpl(); // RenderProcess implementation. - virtual skia::PlatformCanvas* GetDrawingCanvas( + virtual SkCanvas* GetDrawingCanvas( TransportDIB** memory, const gfx::Rect& rect) OVERRIDE; virtual void ReleaseTransportDIB(TransportDIB* memory) OVERRIDE; diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index 28d961d..99eb137 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h @@ -47,10 +47,6 @@ class WebMouseEvent; class WebTouchEvent; } -namespace skia { -class PlatformCanvas; -} - namespace ui { class Range; } @@ -227,10 +223,10 @@ class CONTENT_EXPORT RenderWidget // shared memory segment returned by AllocPaintBuf on Windows). The caller // must ensure that the given rect fits within the bounds of the WebWidget. void PaintRect(const gfx::Rect& rect, const gfx::Point& canvas_origin, - skia::PlatformCanvas* canvas); + SkCanvas* canvas); // Paints a border at the given rect for debugging purposes. - void PaintDebugBorder(const gfx::Rect& rect, skia::PlatformCanvas* canvas); + void PaintDebugBorder(const gfx::Rect& rect, SkCanvas* canvas); bool IsRenderingVSynced(); void AnimationCallback(); diff --git a/content/renderer/webplugin_delegate_proxy.cc b/content/renderer/webplugin_delegate_proxy.cc index 063649f..e625006 100644 --- a/content/renderer/webplugin_delegate_proxy.cc +++ b/content/renderer/webplugin_delegate_proxy.cc @@ -629,7 +629,7 @@ void WebPluginDelegateProxy::ResetWindowlessBitmaps() { static size_t BitmapSizeForPluginRect(const gfx::Rect& plugin_rect) { const size_t stride = - skia::PlatformCanvas::StrideForWidth(plugin_rect.width()); + skia::PlatformCanvasStrideForWidth(plugin_rect.width()); return stride * plugin_rect.height(); } @@ -641,8 +641,9 @@ bool WebPluginDelegateProxy::CreateLocalBitmap( memory->resize(size); if (memory->size() != size) return false; - canvas->reset(new skia::PlatformCanvas( - plugin_rect_.width(), plugin_rect_.height(), true, &((*memory)[0]))); + canvas->reset(skia::CreatePlatformCanvas( + plugin_rect_.width(), plugin_rect_.height(), true, &((*memory)[0]), + skia::CRASH_ON_FAILURE)); return true; } #endif @@ -1039,7 +1040,7 @@ void WebPluginDelegateProxy::CopyFromBackBufferToFrontBuffer( // the goal is just to move the raw pixels between two bitmaps with the same // pixel format (no compositing, color correction, etc.), it's safe. const size_t stride = - skia::PlatformCanvas::StrideForWidth(plugin_rect_.width()); + skia::PlatformCanvasStrideForWidth(plugin_rect_.width()); const size_t chunk_size = 4 * rect.width(); DCHECK(back_buffer_dib() != NULL); uint8* source_data = static_cast<uint8*>(back_buffer_dib()->memory()) + diff --git a/content/renderer/webplugin_delegate_proxy.h b/content/renderer/webplugin_delegate_proxy.h index 9099d46..c89ed8c 100644 --- a/content/renderer/webplugin_delegate_proxy.h +++ b/content/renderer/webplugin_delegate_proxy.h @@ -35,10 +35,6 @@ namespace base { class WaitableEvent; } -namespace skia { -class PlatformCanvas; -} - namespace webkit { namespace npapi { class WebPlugin; @@ -144,7 +140,7 @@ class WebPluginDelegateProxy ~SharedBitmap(); scoped_ptr<TransportDIB> dib; - scoped_ptr<skia::PlatformCanvas> canvas; + scoped_ptr<SkCanvas> canvas; }; // Message handlers for messages that proxy WebPlugin methods, which @@ -227,11 +223,11 @@ class WebPluginDelegateProxy return 1 - front_buffer_index_; } - skia::PlatformCanvas* front_buffer_canvas() const { + SkCanvas* front_buffer_canvas() const { return transport_stores_[front_buffer_index()].canvas.get(); } - skia::PlatformCanvas* back_buffer_canvas() const { + SkCanvas* back_buffer_canvas() const { return transport_stores_[back_buffer_index()].canvas.get(); } @@ -247,12 +243,12 @@ class WebPluginDelegateProxy // Creates a process-local memory section and canvas. PlatformCanvas on // Windows only works with a DIB, not arbitrary memory. bool CreateLocalBitmap(std::vector<uint8>* memory, - scoped_ptr<skia::PlatformCanvas>* canvas); + scoped_ptr<SkCanvas>* canvas); #endif // Creates a shared memory section and canvas. bool CreateSharedBitmap(scoped_ptr<TransportDIB>* memory, - scoped_ptr<skia::PlatformCanvas>* canvas); + scoped_ptr<SkCanvas>* canvas); // Called for cleanup during plugin destruction. Normally right before the // plugin window gets destroyed, or when the plugin has crashed (at which diff --git a/content/shell/webkit_test_runner.cc b/content/shell/webkit_test_runner.cc index 301ffcd..a59d4ed 100644 --- a/content/shell/webkit_test_runner.cc +++ b/content/shell/webkit_test_runner.cc @@ -113,16 +113,17 @@ std::string DumpFrameScrollPosition(WebFrame* frame, bool recursive) { return result; } -bool PaintViewIntoCanvas(WebView* view, skia::PlatformCanvas& canvas) { +SkCanvas* PaintViewIntoCanvas(WebView* view) { view->layout(); const WebSize& size = view->size(); - if (!canvas.initialize(size.width, size.height, true)) - return false; - - view->paint(webkit_glue::ToWebCanvas(&canvas), - WebRect(0, 0, size.width, size.height)); - return true; + SkCanvas* canvas = skia::CreatePlatformCanvas(size.width, size.height, true, + 0, skia::RETURN_NULL_ON_FAILURE); + if (canvas) { + view->paint(webkit_glue::ToWebCanvas(canvas), + WebRect(0, 0, size.width, size.height)); + } + return canvas; } #if !defined(OS_MACOSX) @@ -138,11 +139,11 @@ void MakeBitmapOpaque(SkBitmap* bitmap) { #endif void CaptureSnapshot(WebView* view, SkBitmap* snapshot) { - skia::PlatformCanvas canvas; - if (!PaintViewIntoCanvas(view, canvas)) + SkCanvas* canvas = PaintViewIntoCanvas(view); + if (!canvas) return; - SkDevice* device = skia::GetTopDevice(canvas); + SkDevice* device = skia::GetTopDevice(*canvas); const SkBitmap& bitmap = device->accessBitmap(false); bitmap.copyTo(snapshot, SkBitmap::kARGB_8888_Config); diff --git a/content/test/mock_render_process.cc b/content/test/mock_render_process.cc index 550da7a..300dfe4 100644 --- a/content/test/mock_render_process.cc +++ b/content/test/mock_render_process.cc @@ -20,7 +20,7 @@ MockRenderProcess::~MockRenderProcess() { skia::PlatformCanvas* MockRenderProcess::GetDrawingCanvas( TransportDIB** memory, const gfx::Rect& rect) { - size_t stride = skia::PlatformCanvas::StrideForWidth(rect.width()); + size_t stride = skia::PlatformCanvasStrideForWidth(rect.width()); size_t size = stride * rect.height(); // Unlike RenderProcessImpl, when we're a test, we can just create transport diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc index 32a4b68..096d61d 100644 --- a/ppapi/proxy/ppb_image_data_proxy.cc +++ b/ppapi/proxy/ppb_image_data_proxy.cc @@ -386,7 +386,7 @@ int32_t ImageData::GetSharedMemory(int* /* handle */, return PP_ERROR_NOACCESS; } -skia::PlatformCanvas* ImageData::GetPlatformCanvas() { +SkCanvas* ImageData::GetPlatformCanvas() { #if defined(OS_NACL) return NULL; // No canvas in NaCl. #else diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h index 3c44dda..6ddbafa 100644 --- a/ppapi/proxy/ppb_image_data_proxy.h +++ b/ppapi/proxy/ppb_image_data_proxy.h @@ -57,7 +57,7 @@ class ImageData : public ppapi::Resource, virtual void* Map() OVERRIDE; virtual void Unmap() OVERRIDE; virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; - virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; + virtual SkCanvas* GetPlatformCanvas() OVERRIDE; virtual SkCanvas* GetCanvas() OVERRIDE; const PP_ImageDataDesc& desc() const { return desc_; } @@ -84,7 +84,7 @@ class ImageData : public ppapi::Resource, scoped_ptr<TransportDIB> transport_dib_; // Null when the image isn't mapped. - scoped_ptr<skia::PlatformCanvas> mapped_canvas_; + scoped_ptr<SkCanvas> mapped_canvas_; #endif // Set to true when this ImageData has been used in a call to diff --git a/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.cc b/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.cc index 9b2c0f5..f16154a 100644 --- a/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.cc +++ b/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.cc @@ -321,7 +321,7 @@ PP_Bool PPB_BrowserFont_Trusted_Shared::DrawTextAt( PPB_ImageData_API* image = static_cast<PPB_ImageData_API*>( enter.object()); - skia::PlatformCanvas* canvas = image->GetPlatformCanvas(); + SkCanvas* canvas = image->GetPlatformCanvas(); bool needs_unmapping = false; if (!canvas) { needs_unmapping = true; @@ -399,7 +399,7 @@ int32_t PPB_BrowserFont_Trusted_Shared::PixelOffsetForCharacter( } void PPB_BrowserFont_Trusted_Shared::DrawTextToCanvas( - skia::PlatformCanvas* destination, + SkCanvas* destination, const PP_BrowserFont_Trusted_TextRun& text, const PP_Point* position, uint32_t color, diff --git a/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.h b/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.h index e77be56..fa91ea0 100644 --- a/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.h +++ b/ppapi/shared_impl/private/ppb_browser_font_trusted_shared.h @@ -18,9 +18,7 @@ #include "ppapi/shared_impl/resource.h" #include "ppapi/thunk/ppb_browser_font_trusted_api.h" -namespace skia { -class PlatformCanvas; -} +class SkCanvas; namespace WebKit { class WebFont; @@ -73,7 +71,7 @@ class PPAPI_SHARED_EXPORT PPB_BrowserFont_Trusted_Shared const Preferences& prefs); // Internal version of DrawTextAt that takes a mapped PlatformCanvas. - void DrawTextToCanvas(skia::PlatformCanvas* destination, + void DrawTextToCanvas(SkCanvas* destination, const PP_BrowserFont_Trusted_TextRun& text, const PP_Point* position, uint32_t color, diff --git a/ppapi/thunk/ppb_image_data_api.h b/ppapi/thunk/ppb_image_data_api.h index 3e46206..32166c7 100644 --- a/ppapi/thunk/ppb_image_data_api.h +++ b/ppapi/thunk/ppb_image_data_api.h @@ -8,10 +8,6 @@ #include "ppapi/c/pp_bool.h" #include "ppapi/c/ppb_image_data.h" -namespace skia { -class PlatformCanvas; -} - class SkCanvas; namespace ppapi { @@ -39,7 +35,7 @@ class PPB_ImageData_API { // a platform-specific canvas (e.g., for use with platform-specific APIs). // Anything that relies on having a PlatformCanvas will not work for ImageDat // objects created from NaCl. - virtual skia::PlatformCanvas* GetPlatformCanvas() = 0; + virtual SkCanvas* GetPlatformCanvas() = 0; // Get the canvas that backs this ImageData, if there is one. // The canvas will be NULL: diff --git a/skia/ext/bitmap_platform_device_android.cc b/skia/ext/bitmap_platform_device_android.cc index 6a71fb2..c12abd6 100644 --- a/skia/ext/bitmap_platform_device_android.cc +++ b/skia/ext/bitmap_platform_device_android.cc @@ -72,6 +72,14 @@ void BitmapPlatformDevice::DrawToNativeContext( SkASSERT(false); } +// PlatformCanvas impl + +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { + SkDevice* dev = BitmapPlatformDevice::Create(width, height, is_opaque, data); + return CreateCanvas(dev, failureType); +} + // Port of PlatformBitmap to android PlatformBitmap::~PlatformBitmap() {} diff --git a/skia/ext/bitmap_platform_device_linux.cc b/skia/ext/bitmap_platform_device_linux.cc index 63b44a6..23a7683 100644 --- a/skia/ext/bitmap_platform_device_linux.cc +++ b/skia/ext/bitmap_platform_device_linux.cc @@ -176,6 +176,14 @@ void BitmapPlatformDevice::setMatrixClip(const SkMatrix& transform, data_->SetMatrixClip(transform, region); } +// PlatformCanvas impl + +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { + SkDevice* dev = BitmapPlatformDevice::Create(width, height, is_opaque, data); + return CreateCanvas(dev, failureType); +} + // Port of PlatformBitmap to linux PlatformBitmap::~PlatformBitmap() { diff --git a/skia/ext/bitmap_platform_device_mac.cc b/skia/ext/bitmap_platform_device_mac.cc index d8f16a2..c97e6fb 100644 --- a/skia/ext/bitmap_platform_device_mac.cc +++ b/skia/ext/bitmap_platform_device_mac.cc @@ -28,6 +28,12 @@ static CGContextRef CGContextForData(void* data, int width, int height) { #if defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0) // Allocate a bitmap context with 4 components per pixel (BGRA). Apple // recommends these flags for improved CG performance. + + // CGBitmapContextCreate returns NULL if width/height are 0. However, our + // callers expect to get a canvas back (which they later resize/reallocate) + // so we pin the dimensions here. + width = SkMax32(1, width); + height = SkMax32(1, height); CGContextRef context = CGBitmapContextCreate(data, width, height, 8, width * 4, base::mac::GetSystemColorSpace(), @@ -255,6 +261,21 @@ SkDevice* BitmapPlatformDevice::onCreateCompatibleDevice( return bitmap_device; } +// PlatformCanvas impl + +SkCanvas* CreatePlatformCanvas(CGContextRef ctx, int width, int height, + bool is_opaque, OnFailureType failureType) { + SkDevice* dev = BitmapPlatformDevice::Create(ctx, width, height, is_opaque); + return CreateCanvas(dev, failureType); +} + +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { + SkDevice* dev = BitmapPlatformDevice::CreateWithData(data, width, height, + is_opaque); + return CreateCanvas(dev, failureType); +} + // Port of PlatformBitmap to mac PlatformBitmap::~PlatformBitmap() { diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc index dc21673..4e5bbce 100644 --- a/skia/ext/bitmap_platform_device_win.cc +++ b/skia/ext/bitmap_platform_device_win.cc @@ -260,12 +260,23 @@ const SkBitmap& BitmapPlatformDevice::onAccessBitmap(SkBitmap* bitmap) { } SkDevice* BitmapPlatformDevice::onCreateCompatibleDevice( - SkBitmap::Config config, int width, int height, bool isOpaque, - Usage /*usage*/) { + SkBitmap::Config config, int width, int height, bool isOpaque, Usage) { SkASSERT(config == SkBitmap::kARGB_8888_Config); - SkDevice* bitmap_device = BitmapPlatformDevice::CreateAndClear(width, height, - isOpaque); - return bitmap_device; + return BitmapPlatformDevice::CreateAndClear(width, height, isOpaque); +} + +// PlatformCanvas impl + +SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + HANDLE shared_section, + OnFailureType failureType) { + SkDevice* dev = BitmapPlatformDevice::Create(width, + height, + is_opaque, + shared_section); + return CreateCanvas(dev, failureType); } // Port of PlatformBitmap to win diff --git a/skia/ext/platform_canvas.cc b/skia/ext/platform_canvas.cc index 11b1f5e..461dba4 100644 --- a/skia/ext/platform_canvas.cc +++ b/skia/ext/platform_canvas.cc @@ -9,35 +9,6 @@ namespace skia { -PlatformCanvas::PlatformCanvas() {} - -// static -size_t PlatformCanvas::StrideForWidth(unsigned width) { - return 4 * width; -} - -bool PlatformCanvas::initializeWithDevice(SkDevice* device) { - if (!device) - return false; - - setDevice(device); - device->unref(); // Was created with refcount 1, and setDevice also refs. - return true; -} - -SkCanvas* CreateBitmapCanvas(int width, int height, bool is_opaque) { - return new PlatformCanvas(width, height, is_opaque); -} - -SkCanvas* TryCreateBitmapCanvas(int width, int height, bool is_opaque) { - PlatformCanvas* canvas = new PlatformCanvas(); - if (!canvas->initialize(width, height, is_opaque)) { - delete canvas; - canvas = NULL; - } - return canvas; -} - SkDevice* GetTopDevice(const SkCanvas& canvas) { return canvas.getTopDevice(true); } @@ -87,6 +58,20 @@ void MakeOpaque(SkCanvas* canvas, int x, int y, int width, int height) { canvas->drawRect(rect, paint); } +size_t PlatformCanvasStrideForWidth(unsigned width) { + return 4 * width; +} + +SkCanvas* CreateCanvas(SkDevice* device, OnFailureType failureType) { + if (!device) { + if (CRASH_ON_FAILURE == failureType) + SK_CRASH(); + return NULL; + } + SkAutoUnref aur(device); + return new SkCanvas(device); +} + PlatformBitmap::PlatformBitmap() : surface_(0), platform_extra_(0) {} } // namespace skia diff --git a/skia/ext/platform_canvas.h b/skia/ext/platform_canvas.h index f20d62e..c83e6bf 100644 --- a/skia/ext/platform_canvas.h +++ b/skia/ext/platform_canvas.h @@ -13,74 +13,91 @@ namespace skia { -// This class is a specialization of the regular SkCanvas that is designed to -// work with a PlatformDevice to manage platform-specific drawing. It allows -// using both Skia operations and platform-specific operations. -class SK_API PlatformCanvas : public SkCanvas { - public: - // If you use the version with no arguments, you MUST call initialize() - PlatformCanvas(); - // Set is_opaque if you are going to erase the bitmap and not use - // transparency: this will enable some optimizations. - PlatformCanvas(int width, int height, bool is_opaque); +typedef SkCanvas PlatformCanvas; + +// +// Note about error handling. +// +// Creating a canvas can fail at times, most often because we fail to allocate +// the backing-store (pixels). This can be from out-of-memory, or something +// more opaque, like GDI or cairo reported a failure. +// +// To allow the caller to handle the failure, every Create... factory takes an +// enum as its last parameter. The default value is kCrashOnFailure. If the +// caller passes kReturnNullOnFailure, then the caller is responsible to check +// the return result. +// +enum OnFailureType { + CRASH_ON_FAILURE, + RETURN_NULL_ON_FAILURE +}; #if defined(WIN32) // The shared_section parameter is passed to gfx::PlatformDevice::create. // See it for details. - PlatformCanvas(int width, int height, bool is_opaque, HANDLE shared_section); + SK_API SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + HANDLE shared_section, + OnFailureType failure_type); #elif defined(__APPLE__) - PlatformCanvas(int width, int height, bool is_opaque, - CGContextRef context); - PlatformCanvas(int width, int height, bool is_opaque, uint8_t* context); + SK_API SkCanvas* CreatePlatformCanvas(CGContextRef context, + int width, + int height, + bool is_opaque, + OnFailureType failure_type); + + SK_API SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + uint8_t* context, + OnFailureType failure_type); #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ defined(__sun) || defined(ANDROID) // Linux --------------------------------------------------------------------- // Construct a canvas from the given memory region. The memory is not cleared // first. @data must be, at least, @height * StrideForWidth(@width) bytes. - PlatformCanvas(int width, int height, bool is_opaque, uint8_t* data); + SK_API SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + uint8_t* data, + OnFailureType failure_type); #endif - virtual ~PlatformCanvas(); - -#if defined(WIN32) - // For two-part init, call if you use the no-argument constructor above. Note - // that we want this to optionally match the Linux initialize if you only - // pass 3 arguments, hence the evil default argument. - bool initialize(int width, int height, bool is_opaque, - HANDLE shared_section = NULL); -#elif defined(__APPLE__) - // For two-part init, call if you use the no-argument constructor above - bool initialize(CGContextRef context, int width, int height, bool is_opaque); - bool initialize(int width, int height, bool is_opaque, uint8_t* data = NULL); - -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ - defined(__sun) || defined(ANDROID) - // For two-part init, call if you use the no-argument constructor above - bool initialize(int width, int height, bool is_opaque, uint8_t* data = NULL); -#endif - - // Shared -------------------------------------------------------------------- - - // Return the stride (length of a line in bytes) for the given width. Because - // we use 32-bits per pixel, this will be roughly 4*width. However, for - // alignment reasons we may wish to increase that. - static size_t StrideForWidth(unsigned width); - - // Allow callers to see the non-virtual function even though we have an - // override of a virtual one. - // FIXME(brettw) is this necessary? - using SkCanvas::clipRect; - - private: - // Helper method used internally by the initialize() methods. - bool initializeWithDevice(SkDevice* device); - - // Disallow copy and assign - PlatformCanvas(const PlatformCanvas&); - PlatformCanvas& operator=(const PlatformCanvas&); +static inline SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque) { + return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE); +} + +// Takes ownership of the device, so the caller need not call unref(). +SK_API SkCanvas* CreateCanvas(SkDevice* device, OnFailureType failure_type); + +static inline SkCanvas* CreateBitmapCanvas(int width, + int height, + bool is_opaque) { + return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE); +} + +static inline SkCanvas* TryCreateBitmapCanvas(int width, + int height, + bool is_opaque) { + return CreatePlatformCanvas(width, height, is_opaque, 0, + RETURN_NULL_ON_FAILURE); +} + +class SK_API ScopedPlatformCanvas : public SkAutoTUnref<SkCanvas> { + public: + ScopedPlatformCanvas(int width, int height, bool is_opaque) + : SkAutoTUnref<SkCanvas>(CreatePlatformCanvas(width, height, is_opaque)){} }; +// Return the stride (length of a line in bytes) for the given width. Because +// we use 32-bits per pixel, this will be roughly 4*width. However, for +// alignment reasons we may wish to increase that. +SK_API size_t PlatformCanvasStrideForWidth(unsigned width); + // Returns the SkDevice pointer of the topmost rect with a non-empty // clip. In practice, this is usually either the top layer or nothing, since // we usually set the clip to new layers when we make them. @@ -96,18 +113,6 @@ class SK_API PlatformCanvas : public SkCanvas { // by the next call to save() or restore(). SK_API SkDevice* GetTopDevice(const SkCanvas& canvas); -// Creates a canvas with raster bitmap backing. -// Set is_opaque if you are going to erase the bitmap and not use -// transparency: this will enable some optimizations. -SK_API SkCanvas* CreateBitmapCanvas(int width, int height, bool is_opaque); - -// Non-crashing version of CreateBitmapCanvas -// returns NULL if allocation fails for any reason. -// Use this instead of CreateBitmapCanvas in places that are likely to -// attempt to allocate very large canvases (therefore likely to fail), -// and where it is possible to recover gracefully from the failed allocation. -SK_API SkCanvas* TryCreateBitmapCanvas(int width, int height, bool is_opaque); - // Returns true if native platform routines can be used to draw on the // given canvas. If this function returns false, BeginPlatformPaint will // return NULL PlatformSurface. @@ -116,8 +121,11 @@ SK_API bool SupportsPlatformPaint(const SkCanvas* canvas); // Draws into the a native platform surface, |context|. Forwards to // DrawToNativeContext on a PlatformDevice instance bound to the top device. // If no PlatformDevice instance is bound, is a no-operation. -SK_API void DrawToNativeContext(SkCanvas* canvas, PlatformSurface context, - int x, int y, const PlatformRect* src_rect); +SK_API void DrawToNativeContext(SkCanvas* canvas, + PlatformSurface context, + int x, + int y, + const PlatformRect* src_rect); // Sets the opacity of each pixel in the specified region to be opaque. SK_API void MakeOpaque(SkCanvas* canvas, int x, int y, int width, int height); diff --git a/skia/ext/platform_canvas_linux.cc b/skia/ext/platform_canvas_linux.cc deleted file mode 100644 index 9912c16..0000000 --- a/skia/ext/platform_canvas_linux.cc +++ /dev/null @@ -1,38 +0,0 @@ -// 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 "skia/ext/platform_canvas.h" - -#include "base/debug/trace_event.h" -#include "skia/ext/bitmap_platform_device.h" -#include "skia/ext/platform_device.h" -#include "third_party/skia/include/core/SkTypes.h" - -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(); -} - -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() { -} - -bool PlatformCanvas::initialize(int width, int height, bool is_opaque, - uint8_t* data) { - return initializeWithDevice(BitmapPlatformDevice::Create( - width, height, is_opaque, data)); -} - -} // namespace skia diff --git a/skia/ext/platform_canvas_mac.cc b/skia/ext/platform_canvas_mac.cc deleted file mode 100644 index d1667c2..0000000 --- a/skia/ext/platform_canvas_mac.cc +++ /dev/null @@ -1,56 +0,0 @@ -// 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 "skia/ext/platform_canvas.h" - -#include "base/debug/trace_event.h" -#include "skia/ext/bitmap_platform_device.h" -#include "third_party/skia/include/core/SkTypes.h" - -namespace skia { - -PlatformCanvas::PlatformCanvas(int width, int height, bool is_opaque) { - TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", - "width", width, "height", height); - initialize(width, height, is_opaque); -} - -PlatformCanvas::PlatformCanvas(int width, - int height, - bool is_opaque, - CGContextRef context) { - TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", - "width", width, "height", height); - initialize(context, width, height, is_opaque); -} - -PlatformCanvas::PlatformCanvas(int width, - int height, - bool is_opaque, - uint8_t* data) { - TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", - "width", width, "height", height); - initialize(width, height, is_opaque, data); -} - -PlatformCanvas::~PlatformCanvas() { -} - -bool PlatformCanvas::initialize(int width, - int height, - bool is_opaque, - uint8_t* data) { - return initializeWithDevice(BitmapPlatformDevice::CreateWithData( - data, 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)); -} - -} // namespace skia diff --git a/skia/ext/platform_canvas_skia.cc b/skia/ext/platform_canvas_skia.cc deleted file mode 100644 index 9cd51ac..0000000 --- a/skia/ext/platform_canvas_skia.cc +++ /dev/null @@ -1,113 +0,0 @@ -// 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) - return initializeWithDevice(BitmapPlatformDevice::Create( - width, height, is_opaque, shared_section)); - - 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/ext/platform_canvas_unittest.cc b/skia/ext/platform_canvas_unittest.cc index 5679721..5d71613 100644 --- a/skia/ext/platform_canvas_unittest.cc +++ b/skia/ext/platform_canvas_unittest.cc @@ -194,16 +194,16 @@ const SkScalar kRadius = 2.0; // regular skia primitives. TEST(PlatformCanvas, SkLayer) { // Create the canvas initialized to opaque white. - PlatformCanvas canvas(16, 16, true); - canvas.drawColor(SK_ColorWHITE); + ScopedPlatformCanvas canvas(16, 16, true); + canvas->drawColor(SK_ColorWHITE); // Make a layer and fill it completely to make sure that the bounds are // correct. { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - canvas.drawColor(SK_ColorBLACK); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + canvas->drawColor(SK_ColorBLACK); } - EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX, kLayerY, kLayerW, kLayerH)); + EXPECT_TRUE(VerifyBlackRect(*canvas, kLayerX, kLayerY, kLayerW, kLayerH)); } #if !defined(USE_AURA) // http://crbug.com/154358 @@ -211,26 +211,26 @@ TEST(PlatformCanvas, SkLayer) { // Test native clipping. TEST(PlatformCanvas, ClipRegion) { // Initialize a white canvas - PlatformCanvas canvas(16, 16, true); - canvas.drawColor(SK_ColorWHITE); - EXPECT_TRUE(VerifyCanvasColor(canvas, SK_ColorWHITE)); + ScopedPlatformCanvas canvas(16, 16, true); + canvas->drawColor(SK_ColorWHITE); + EXPECT_TRUE(VerifyCanvasColor(*canvas, SK_ColorWHITE)); // Test that initially the canvas has no clip region, by filling it // with a black rectangle. // Note: Don't use LayerSaver, since internally it sets a clip region. - DrawNativeRect(canvas, 0, 0, 16, 16); - EXPECT_TRUE(VerifyCanvasColor(canvas, SK_ColorBLACK)); + DrawNativeRect(*canvas, 0, 0, 16, 16); + EXPECT_TRUE(VerifyCanvasColor(*canvas, SK_ColorBLACK)); // Test that intersecting disjoint clip rectangles sets an empty clip region - canvas.drawColor(SK_ColorWHITE); - EXPECT_TRUE(VerifyCanvasColor(canvas, SK_ColorWHITE)); + canvas->drawColor(SK_ColorWHITE); + EXPECT_TRUE(VerifyCanvasColor(*canvas, SK_ColorWHITE)); { - LayerSaver layer(canvas, 0, 0, 16, 16); - AddClip(canvas, 2, 3, 4, 5); - AddClip(canvas, 4, 9, 10, 10); - DrawNativeRect(canvas, 0, 0, 16, 16); + LayerSaver layer(*canvas, 0, 0, 16, 16); + AddClip(*canvas, 2, 3, 4, 5); + AddClip(*canvas, 4, 9, 10, 10); + DrawNativeRect(*canvas, 0, 0, 16, 16); } - EXPECT_TRUE(VerifyCanvasColor(canvas, SK_ColorWHITE)); + EXPECT_TRUE(VerifyCanvasColor(*canvas, SK_ColorWHITE)); } #endif // !defined(USE_AURA) @@ -238,58 +238,58 @@ TEST(PlatformCanvas, ClipRegion) { // Test the layers get filled properly by native rendering. TEST(PlatformCanvas, FillLayer) { // Create the canvas initialized to opaque white. - PlatformCanvas canvas(16, 16, true); + ScopedPlatformCanvas canvas(16, 16, true); // Make a layer and fill it completely to make sure that the bounds are // correct. - canvas.drawColor(SK_ColorWHITE); + canvas->drawColor(SK_ColorWHITE); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - DrawNativeRect(canvas, 0, 0, 100, 100); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, 0, 0, 100, 100); + MakeOpaque(canvas, 0, 0, 100, 100); #endif } - EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX, kLayerY, kLayerW, kLayerH)); + EXPECT_TRUE(VerifyBlackRect(*canvas, kLayerX, kLayerY, kLayerW, kLayerH)); // Make a layer and fill it partially to make sure the translation is correct. - canvas.drawColor(SK_ColorWHITE); + canvas->drawColor(SK_ColorWHITE); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + DrawNativeRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH); #if defined(OS_WIN) - MakeOpaque(&canvas, kInnerX, kInnerY, kInnerW, kInnerH); + MakeOpaque(canvas, kInnerX, kInnerY, kInnerW, kInnerH); #endif } - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH)); // Add a clip on the layer and fill to make sure clip is correct. - canvas.drawColor(SK_ColorWHITE); + canvas->drawColor(SK_ColorWHITE); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - canvas.save(); - AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH); - DrawNativeRect(canvas, 0, 0, 100, 100); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + canvas->save(); + AddClip(*canvas, kInnerX, kInnerY, kInnerW, kInnerH); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, kInnerX, kInnerY, kInnerW, kInnerH); + MakeOpaque(canvas, kInnerX, kInnerY, kInnerW, kInnerH); #endif - canvas.restore(); + canvas->restore(); } - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH)); // Add a clip and then make the layer to make sure the clip is correct. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); - AddClip(canvas, kInnerX, kInnerY, kInnerW, kInnerH); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); + AddClip(*canvas, kInnerX, kInnerY, kInnerW, kInnerH); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - DrawNativeRect(canvas, 0, 0, 100, 100); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, 0, 0, 100, 100); + MakeOpaque(canvas, 0, 0, 100, 100); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH)); + canvas->restore(); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH)); } #if !defined(USE_AURA) // http://crbug.com/154358 @@ -297,98 +297,98 @@ TEST(PlatformCanvas, FillLayer) { // Test that translation + make layer works properly. TEST(PlatformCanvas, TranslateLayer) { // Create the canvas initialized to opaque white. - PlatformCanvas canvas(16, 16, true); + ScopedPlatformCanvas canvas(16, 16, true); // Make a layer and fill it completely to make sure that the bounds are // correct. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); - canvas.translate(1, 1); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); + canvas->translate(1, 1); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - DrawNativeRect(canvas, 0, 0, 100, 100); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, 0, 0, 100, 100); + MakeOpaque(canvas, 0, 0, 100, 100); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyBlackRect(canvas, kLayerX + 1, kLayerY + 1, + canvas->restore(); + EXPECT_TRUE(VerifyBlackRect(*canvas, kLayerX + 1, kLayerY + 1, kLayerW, kLayerH)); // Translate then make the layer. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); - canvas.translate(1, 1); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); + canvas->translate(1, 1); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + DrawNativeRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH); #if defined(OS_WIN) - MakeOpaque(&canvas, kInnerX, kInnerY, kInnerW, kInnerH); + MakeOpaque(canvas, kInnerX, kInnerY, kInnerW, kInnerH); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1, + canvas->restore(); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX + 1, kInnerY + 1, kInnerW, kInnerH)); // Make the layer then translate. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - canvas.translate(1, 1); - DrawNativeRect(canvas, kInnerX, kInnerY, kInnerW, kInnerH); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + canvas->translate(1, 1); + DrawNativeRect(*canvas, kInnerX, kInnerY, kInnerW, kInnerH); #if defined(OS_WIN) - MakeOpaque(&canvas, kInnerX, kInnerY, kInnerW, kInnerH); + MakeOpaque(canvas, kInnerX, kInnerY, kInnerW, kInnerH); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 1, kInnerY + 1, + canvas->restore(); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX + 1, kInnerY + 1, kInnerW, kInnerH)); // Translate both before and after, and have a clip. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); - canvas.translate(1, 1); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); + canvas->translate(1, 1); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - canvas.drawColor(SK_ColorWHITE); - canvas.translate(1, 1); - AddClip(canvas, kInnerX + 1, kInnerY + 1, kInnerW - 1, kInnerH - 1); - DrawNativeRect(canvas, 0, 0, 100, 100); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + canvas->drawColor(SK_ColorWHITE); + canvas->translate(1, 1); + AddClip(*canvas, kInnerX + 1, kInnerY + 1, kInnerW - 1, kInnerH - 1); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, kLayerX, kLayerY, kLayerW, kLayerH); + MakeOpaque(canvas, kLayerX, kLayerY, kLayerW, kLayerH); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyBlackRect(canvas, kInnerX + 3, kInnerY + 3, + canvas->restore(); + EXPECT_TRUE(VerifyBlackRect(*canvas, kInnerX + 3, kInnerY + 3, kInnerW - 1, kInnerH - 1)); // TODO(dglazkov): Figure out why this fails on Mac (antialiased clipping?), // modify test and remove this guard. #if !defined(OS_MACOSX) // Translate both before and after, and have a path clip. - canvas.drawColor(SK_ColorWHITE); - canvas.save(); - canvas.translate(1, 1); + canvas->drawColor(SK_ColorWHITE); + canvas->save(); + canvas->translate(1, 1); { - LayerSaver layer(canvas, kLayerX, kLayerY, kLayerW, kLayerH); - canvas.drawColor(SK_ColorWHITE); - canvas.translate(1, 1); + LayerSaver layer(*canvas, kLayerX, kLayerY, kLayerW, kLayerH); + canvas->drawColor(SK_ColorWHITE); + canvas->translate(1, 1); SkPath path; SkRect rect; rect.iset(kInnerX - 1, kInnerY - 1, kInnerX + kInnerW, kInnerY + kInnerH); path.addRoundRect(rect, kRadius, kRadius); - canvas.clipPath(path); + canvas->clipPath(path); - DrawNativeRect(canvas, 0, 0, 100, 100); + DrawNativeRect(*canvas, 0, 0, 100, 100); #if defined(OS_WIN) - MakeOpaque(&canvas, kLayerX, kLayerY, kLayerW, kLayerH); + MakeOpaque(canvas, kLayerX, kLayerY, kLayerW, kLayerH); #endif } - canvas.restore(); - EXPECT_TRUE(VerifyRoundedRect(canvas, SK_ColorWHITE, SK_ColorBLACK, + canvas->restore(); + EXPECT_TRUE(VerifyRoundedRect(*canvas, SK_ColorWHITE, SK_ColorBLACK, kInnerX + 1, kInnerY + 1, kInnerW, kInnerH)); #endif } diff --git a/skia/ext/platform_canvas_win.cc b/skia/ext/platform_canvas_win.cc deleted file mode 100644 index 7b9a787..0000000 --- a/skia/ext/platform_canvas_win.cc +++ /dev/null @@ -1,40 +0,0 @@ -// 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 <windows.h> -#include <psapi.h> - -#include "base/debug/trace_event.h" -#include "skia/ext/bitmap_platform_device_win.h" -#include "skia/ext/platform_canvas.h" - -namespace skia { - -PlatformCanvas::PlatformCanvas(int width, int height, bool is_opaque) { - TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", - "width", width, "height", height); - initialize(width, height, is_opaque, NULL); -} - -PlatformCanvas::PlatformCanvas(int width, - int height, - bool is_opaque, - HANDLE shared_section) { - TRACE_EVENT2("skia", "PlatformCanvas::PlatformCanvas", - "width", width, "height", height); - initialize(width, height, is_opaque, shared_section); -} - -PlatformCanvas::~PlatformCanvas() { -} - -bool PlatformCanvas::initialize(int width, - int height, - bool is_opaque, - HANDLE shared_section) { - return initializeWithDevice(BitmapPlatformDevice::Create( - width, height, is_opaque, shared_section)); -} - -} // namespace skia diff --git a/skia/ext/vector_canvas_unittest.cc b/skia/ext/vector_canvas_unittest.cc index d5f7f41..8efbcdb 100644 --- a/skia/ext/vector_canvas_unittest.cc +++ b/skia/ext/vector_canvas_unittest.cc @@ -392,7 +392,7 @@ class VectorCanvasTest : public ImageTest { bitmap_ = new Bitmap(*context_, size_, size_); vcanvas_ = new VectorCanvas(VectorPlatformDeviceEmf::CreateDevice( size_, size_, true, context_->context())); - pcanvas_ = new PlatformCanvas(size_, size_, false); + pcanvas_ = CreatePlatformCanvas(size_, size_, false); // Clear white. vcanvas_->drawARGB(255, 255, 255, 255, SkXfermode::kSrc_Mode); diff --git a/skia/skia.gyp b/skia/skia.gyp index 37d6c2e..e4c8063 100644 --- a/skia/skia.gyp +++ b/skia/skia.gyp @@ -170,10 +170,6 @@ 'ext/SkThread_chrome.cc', 'ext/platform_canvas.cc', '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', 'ext/platform_device_linux.cc', @@ -378,15 +374,6 @@ '../third_party/skia/src/ports/SkFontHost_FreeType_common.cpp', ], }], - [ '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', @@ -428,7 +415,6 @@ ], 'sources/': [ ['include', 'ext/platform_device_linux\\.cc$'], - ['include', 'ext/platform_canvas_linux\\.cc$'], ['exclude', '../third_party/skia/src/pdf/'], ], 'sources!': [ @@ -446,7 +432,6 @@ [ '_toolset=="host" and host_os=="linux"', { 'sources': [ 'ext/platform_device_linux.cc', - 'ext/platform_canvas_linux.cc', ], }], ], diff --git a/ui/gfx/blit_unittest.cc b/ui/gfx/blit_unittest.cc index a0c4de9..1d59d9b 100644 --- a/ui/gfx/blit_unittest.cc +++ b/ui/gfx/blit_unittest.cc @@ -61,78 +61,78 @@ void VerifyCanvasValues(skia::PlatformCanvas* canvas, uint8 values[h][w]) { TEST(Blit, ScrollCanvas) { static const int kCanvasWidth = 5; static const int kCanvasHeight = 5; - skia::PlatformCanvas canvas(kCanvasWidth, kCanvasHeight, true); + skia::ScopedPlatformCanvas canvas(kCanvasWidth, kCanvasHeight, true); uint8 initial_values[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x11, 0x12, 0x13, 0x14 }, { 0x20, 0x21, 0x22, 0x23, 0x24 }, { 0x30, 0x31, 0x32, 0x33, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - SetToCanvas<5, 5>(&canvas, initial_values); + SetToCanvas<5, 5>(canvas, initial_values); // Sanity check on input. - VerifyCanvasValues<5, 5>(&canvas, initial_values); + VerifyCanvasValues<5, 5>(canvas, initial_values); // Scroll none and make sure it's a NOP. - gfx::ScrollCanvas(&canvas, + gfx::ScrollCanvas(canvas, gfx::Rect(0, 0, kCanvasWidth, kCanvasHeight), gfx::Vector2d(0, 0)); - VerifyCanvasValues<5, 5>(&canvas, initial_values); + VerifyCanvasValues<5, 5>(canvas, initial_values); // Scroll the center 3 pixels up one. gfx::Rect center_three(1, 1, 3, 3); - gfx::ScrollCanvas(&canvas, center_three, gfx::Vector2d(0, -1)); + gfx::ScrollCanvas(canvas, center_three, gfx::Vector2d(0, -1)); uint8 scroll_up_expected[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x21, 0x22, 0x23, 0x14 }, { 0x20, 0x31, 0x32, 0x33, 0x24 }, { 0x30, 0x31, 0x32, 0x33, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - VerifyCanvasValues<5, 5>(&canvas, scroll_up_expected); + VerifyCanvasValues<5, 5>(canvas, scroll_up_expected); // Reset and scroll the center 3 pixels down one. - SetToCanvas<5, 5>(&canvas, initial_values); - gfx::ScrollCanvas(&canvas, center_three, gfx::Vector2d(0, 1)); + SetToCanvas<5, 5>(canvas, initial_values); + gfx::ScrollCanvas(canvas, center_three, gfx::Vector2d(0, 1)); uint8 scroll_down_expected[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x11, 0x12, 0x13, 0x14 }, { 0x20, 0x11, 0x12, 0x13, 0x24 }, { 0x30, 0x21, 0x22, 0x23, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - VerifyCanvasValues<5, 5>(&canvas, scroll_down_expected); + VerifyCanvasValues<5, 5>(canvas, scroll_down_expected); // Reset and scroll the center 3 pixels right one. - SetToCanvas<5, 5>(&canvas, initial_values); - gfx::ScrollCanvas(&canvas, center_three, gfx::Vector2d(1, 0)); + SetToCanvas<5, 5>(canvas, initial_values); + gfx::ScrollCanvas(canvas, center_three, gfx::Vector2d(1, 0)); uint8 scroll_right_expected[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x11, 0x11, 0x12, 0x14 }, { 0x20, 0x21, 0x21, 0x22, 0x24 }, { 0x30, 0x31, 0x31, 0x32, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - VerifyCanvasValues<5, 5>(&canvas, scroll_right_expected); + VerifyCanvasValues<5, 5>(canvas, scroll_right_expected); // Reset and scroll the center 3 pixels left one. - SetToCanvas<5, 5>(&canvas, initial_values); - gfx::ScrollCanvas(&canvas, center_three, gfx::Vector2d(-1, 0)); + SetToCanvas<5, 5>(canvas, initial_values); + gfx::ScrollCanvas(canvas, center_three, gfx::Vector2d(-1, 0)); uint8 scroll_left_expected[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x12, 0x13, 0x13, 0x14 }, { 0x20, 0x22, 0x23, 0x23, 0x24 }, { 0x30, 0x32, 0x33, 0x33, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - VerifyCanvasValues<5, 5>(&canvas, scroll_left_expected); + VerifyCanvasValues<5, 5>(canvas, scroll_left_expected); // Diagonal scroll. - SetToCanvas<5, 5>(&canvas, initial_values); - gfx::ScrollCanvas(&canvas, center_three, gfx::Vector2d(2, 2)); + SetToCanvas<5, 5>(canvas, initial_values); + gfx::ScrollCanvas(canvas, center_three, gfx::Vector2d(2, 2)); uint8 scroll_diagonal_expected[kCanvasHeight][kCanvasWidth] = { { 0x00, 0x01, 0x02, 0x03, 0x04 }, { 0x10, 0x11, 0x12, 0x13, 0x14 }, { 0x20, 0x21, 0x22, 0x23, 0x24 }, { 0x30, 0x31, 0x32, 0x11, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - VerifyCanvasValues<5, 5>(&canvas, scroll_diagonal_expected); + VerifyCanvasValues<5, 5>(canvas, scroll_diagonal_expected); } #if defined(OS_WIN) @@ -140,11 +140,13 @@ TEST(Blit, ScrollCanvas) { TEST(Blit, WithSharedMemory) { const int kCanvasWidth = 5; const int kCanvasHeight = 5; - skia::PlatformCanvas canvas; base::SharedMemory shared_mem; ASSERT_TRUE(shared_mem.CreateAnonymous(kCanvasWidth * kCanvasHeight)); base::SharedMemoryHandle section = shared_mem.handle(); - ASSERT_TRUE(canvas.initialize(kCanvasWidth, kCanvasHeight, true, section)); + SkCanvas* canvas = skia::CreatePlatformCanvas(kCanvasWidth, kCanvasHeight, + true, section, skia::RETURN_NULL_ON_FAILURE); + ASSERT_TRUE(NULL != canvas); + SkAutoUnref aur(canvas); shared_mem.Close(); uint8 initial_values[kCanvasHeight][kCanvasWidth] = { @@ -153,10 +155,10 @@ TEST(Blit, WithSharedMemory) { { 0x20, 0x21, 0x22, 0x23, 0x24 }, { 0x30, 0x31, 0x32, 0x33, 0x34 }, { 0x40, 0x41, 0x42, 0x43, 0x44 }}; - SetToCanvas<5, 5>(&canvas, initial_values); + SetToCanvas<5, 5>(canvas, initial_values); // Sanity check on input. - VerifyCanvasValues<5, 5>(&canvas, initial_values); + VerifyCanvasValues<5, 5>(canvas, initial_values); } #endif diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc index eb11b37..831f4fc 100644 --- a/ui/gfx/canvas.cc +++ b/ui/gfx/canvas.cc @@ -31,9 +31,9 @@ Canvas::Canvas(const gfx::Size& size, canvas_(NULL) { gfx::Size pixel_size = gfx::ToFlooredSize( gfx::ScaleSize(size, ui::GetScaleFactorScale(scale_factor))); - owned_canvas_.reset(new skia::PlatformCanvas(pixel_size.width(), - pixel_size.height(), - is_opaque)); + owned_canvas_.reset(skia::CreatePlatformCanvas(pixel_size.width(), + pixel_size.height(), + is_opaque)); canvas_ = owned_canvas_.get(); #if defined(OS_WIN) || defined(OS_MACOSX) // skia::PlatformCanvas instances are initialized to 0 by Cairo on Linux, but @@ -48,7 +48,7 @@ Canvas::Canvas(const gfx::Size& size, Canvas::Canvas(const gfx::ImageSkiaRep& image_rep, bool is_opaque) : scale_factor_(image_rep.scale_factor()), - owned_canvas_(new skia::PlatformCanvas(image_rep.pixel_width(), + owned_canvas_(skia::CreatePlatformCanvas(image_rep.pixel_width(), image_rep.pixel_height(), is_opaque)), canvas_(owned_canvas_.get()) { @@ -59,7 +59,7 @@ Canvas::Canvas(const gfx::ImageSkiaRep& image_rep, bool is_opaque) Canvas::Canvas() : scale_factor_(ui::SCALE_FACTOR_100P), - owned_canvas_(new skia::PlatformCanvas()), + owned_canvas_(skia::CreatePlatformCanvas(0, 0, false)), canvas_(owned_canvas_.get()) { } @@ -78,9 +78,9 @@ void Canvas::RecreateBackingCanvas(const gfx::Size& size, scale_factor_ = scale_factor; gfx::Size pixel_size = gfx::ToFlooredSize( gfx::ScaleSize(size, ui::GetScaleFactorScale(scale_factor))); - owned_canvas_.reset(new skia::PlatformCanvas(pixel_size.width(), - pixel_size.height(), - is_opaque)); + owned_canvas_.reset(skia::CreatePlatformCanvas(pixel_size.width(), + pixel_size.height(), + is_opaque)); canvas_ = owned_canvas_.get(); SkScalar scale = SkFloatToScalar(ui::GetScaleFactorScale(scale_factor_)); canvas_->scale(scale, scale); diff --git a/ui/gfx/canvas_paint_gtk.cc b/ui/gfx/canvas_paint_gtk.cc index ded981b..4c185c0 100644 --- a/ui/gfx/canvas_paint_gtk.cc +++ b/ui/gfx/canvas_paint_gtk.cc @@ -52,13 +52,10 @@ CanvasSkiaPaint::~CanvasSkiaPaint() { void CanvasSkiaPaint::Init(bool opaque) { GdkRectangle bounds = rectangle(); + RecreateBackingCanvas(gfx::Size(bounds.width, bounds.height), + ui::SCALE_FACTOR_100P, opaque); + skia::PlatformCanvas* canvas = platform_canvas(); - if (!canvas->initialize(bounds.width, bounds.height, opaque, NULL)) { - // Cause a deliberate crash; - CHECK(false); - } - // No need to clear the canvas, because cairo automatically performs the - // clear. // Need to translate so that the dirty region appears at the origin of the // surface. diff --git a/ui/gfx/canvas_paint_win.h b/ui/gfx/canvas_paint_win.h index 8a146e1..1316b96 100644 --- a/ui/gfx/canvas_paint_win.h +++ b/ui/gfx/canvas_paint_win.h @@ -8,6 +8,7 @@ #include "skia/ext/platform_canvas.h" #include "ui/gfx/canvas.h" #include "ui/gfx/canvas_paint.h" +#include "ui/gfx/size.h" namespace gfx { @@ -102,18 +103,17 @@ class UI_EXPORT CanvasSkiaPaint : public Canvas { } void init(bool opaque) { - skia::PlatformCanvas* canvas = platform_canvas(); // FIXME(brettw) for ClearType, we probably want to expand the bounds of // painting by one pixel so that the boundaries will be correct (ClearType // text can depend on the adjacent pixel). Then we would paint just the // inset pixels to the screen. const int width = ps_.rcPaint.right - ps_.rcPaint.left; const int height = ps_.rcPaint.bottom - ps_.rcPaint.top; - if (!canvas->initialize(width, height, opaque, NULL)) { - // Cause a deliberate crash; - __debugbreak(); - _exit(1); - } + + RecreateBackingCanvas(gfx::Size(width, height), ui::SCALE_FACTOR_100P, + opaque); + skia::PlatformCanvas* canvas = platform_canvas(); + canvas->clear(SkColorSetARGB(0, 0, 0, 0)); // This will bring the canvas into the screen coordinate system for the diff --git a/ui/gfx/image/image_skia_operations.cc b/ui/gfx/image/image_skia_operations.cc index 878d9d2..db80e0b 100644 --- a/ui/gfx/image/image_skia_operations.cc +++ b/ui/gfx/image/image_skia_operations.cc @@ -7,7 +7,6 @@ #include "base/command_line.h" #include "base/logging.h" #include "skia/ext/image_operations.h" -#include "skia/ext/platform_canvas.h" #include "ui/base/layout.h" #include "ui/gfx/canvas.h" #include "ui/gfx/image/canvas_image_source.h" @@ -35,10 +34,15 @@ bool ScalingEnabled() { // Creates 2x scaled image of the give |source|. ImageSkiaRep Create2XImageSkiaRep(const ImageSkiaRep& source) { gfx::Size size(source.GetWidth() * 2.0f, source.GetHeight() * 2.0f); - skia::PlatformCanvas canvas(size.width(), size.height(), false); + + SkBitmap resized_bitmap; + resized_bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width(), + size.height()); + if (!resized_bitmap.allocPixels()) + SK_CRASH(); + SkCanvas canvas(resized_bitmap); SkRect resized_bounds = RectToSkRect(gfx::Rect(size)); canvas.drawBitmapRect(source.sk_bitmap(), NULL, resized_bounds); - SkBitmap resized_bitmap = canvas.getDevice()->accessBitmap(false); return ImageSkiaRep(resized_bitmap, ui::SCALE_FACTOR_200P); } diff --git a/ui/surface/transport_dib.h b/ui/surface/transport_dib.h index 70928ed..5050a6a 100644 --- a/ui/surface/transport_dib.h +++ b/ui/surface/transport_dib.h @@ -18,9 +18,7 @@ #include "ui/base/x/x11_util.h" #endif -namespace skia { -class PlatformCanvas; -} +class SkCanvas; // ----------------------------------------------------------------------------- // A TransportDIB is a block of memory that is used to transport pixels @@ -168,7 +166,7 @@ class SURFACE_EXPORT TransportDIB { // // Will return NULL on allocation failure. This could be because the image // is too large to map into the current process' address space. - skia::PlatformCanvas* GetPlatformCanvas(int w, int h); + SkCanvas* GetPlatformCanvas(int w, int h); // Map the DIB into the current process if it is not already. This is used to // map a DIB that has already been created. Returns true if the DIB is mapped. diff --git a/ui/surface/transport_dib_android.cc b/ui/surface/transport_dib_android.cc index 54f8dc3..bab725e 100644 --- a/ui/surface/transport_dib_android.cc +++ b/ui/surface/transport_dib_android.cc @@ -65,13 +65,9 @@ bool TransportDIB::is_valid_id(Id id) { skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { if (!memory() && !Map()) return NULL; - scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); - if (!canvas->initialize(w, h, true, reinterpret_cast<uint8_t*>(memory()))) { - // TODO(husky): Remove when http://b/issue?id=4233182 is definitely fixed. - LOG(ERROR) << "Failed to initialize canvas of size " << w << "x" << h; - return NULL; - } - return canvas.release(); + return skia::CreatePlatformCanvas(w, h, true, + reinterpret_cast<uint8_t*>(memory()), + skia::RETURN_NULL_ON_FAILURE); } bool TransportDIB::Map() { diff --git a/ui/surface/transport_dib_linux.cc b/ui/surface/transport_dib_linux.cc index 7763c0e..3aaa798 100644 --- a/ui/surface/transport_dib_linux.cc +++ b/ui/surface/transport_dib_linux.cc @@ -94,10 +94,9 @@ bool TransportDIB::is_valid_id(Id id) { skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { if (address_ == kInvalidAddress && !Map()) return NULL; - scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); - if (!canvas->initialize(w, h, true, reinterpret_cast<uint8_t*>(memory()))) - return NULL; - return canvas.release(); + return skia::CreatePlatformCanvas(w, h, true, + reinterpret_cast<uint8_t*>(memory()), + skia::RETURN_NULL_ON_FAILURE); } bool TransportDIB::Map() { diff --git a/ui/surface/transport_dib_mac.cc b/ui/surface/transport_dib_mac.cc index 37ce877..a5e5d55 100644 --- a/ui/surface/transport_dib_mac.cc +++ b/ui/surface/transport_dib_mac.cc @@ -63,10 +63,9 @@ bool TransportDIB::is_valid_id(Id id) { skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { if (!memory() && !Map()) return NULL; - scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); - if (!canvas->initialize(w, h, true, reinterpret_cast<uint8_t*>(memory()))) - return NULL; - return canvas.release(); + return skia::CreatePlatformCanvas(w, h, true, + reinterpret_cast<uint8_t*>(memory()), + skia::RETURN_NULL_ON_FAILURE); } bool TransportDIB::Map() { diff --git a/ui/surface/transport_dib_win.cc b/ui/surface/transport_dib_win.cc index c30e7c4c..55dd6a3 100644 --- a/ui/surface/transport_dib_win.cc +++ b/ui/surface/transport_dib_win.cc @@ -70,10 +70,8 @@ skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h) { // will map it again. DCHECK(!memory()) << "Mapped file twice in the same process."; - scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); - if (!canvas->initialize(w, h, true, handle())) - return NULL; - return canvas.release(); + return skia::CreatePlatformCanvas(w, h, true, handle(), + skia::RETURN_NULL_ON_FAILURE); } bool TransportDIB::Map() { diff --git a/webkit/glue/webkit_glue.h b/webkit/glue/webkit_glue.h index c166c72..d5c1991 100644 --- a/webkit/glue/webkit_glue.h +++ b/webkit/glue/webkit_glue.h @@ -21,15 +21,12 @@ #include "webkit/glue/webkit_glue_export.h" class SkBitmap; +class SkCanvas; namespace net { class URLRequest; } -namespace skia { -class PlatformCanvas; -} - namespace WebKit { struct WebFileInfo; class WebFrame; @@ -99,7 +96,7 @@ WEBKIT_GLUE_EXPORT void PlatformFileInfoToWebFileInfo( WebKit::WebFileInfo* web_file_info); // Returns a WebCanvas pointer associated with the given Skia canvas. -WEBKIT_GLUE_EXPORT WebKit::WebCanvas* ToWebCanvas(skia::PlatformCanvas*); +WEBKIT_GLUE_EXPORT WebKit::WebCanvas* ToWebCanvas(SkCanvas*); // Returns the number of currently-active glyph pages this process is using. // There can be many such pages (maps of 256 character -> glyph) so this is diff --git a/webkit/plugins/ppapi/mock_platform_image_2d.cc b/webkit/plugins/ppapi/mock_platform_image_2d.cc index 197a3e0..f95f987 100644 --- a/webkit/plugins/ppapi/mock_platform_image_2d.cc +++ b/webkit/plugins/ppapi/mock_platform_image_2d.cc @@ -18,7 +18,7 @@ MockPlatformImage2D::~MockPlatformImage2D() { } skia::PlatformCanvas* MockPlatformImage2D::Map() { - return new skia::PlatformCanvas(width_, height_, true); + return skia::CreatePlatformCanvas(width_, height_, true); } intptr_t MockPlatformImage2D::GetSharedMemoryHandle(uint32* byte_count) const { diff --git a/webkit/plugins/ppapi/mock_platform_image_2d.h b/webkit/plugins/ppapi/mock_platform_image_2d.h index 296d7ea..5185963 100644 --- a/webkit/plugins/ppapi/mock_platform_image_2d.h +++ b/webkit/plugins/ppapi/mock_platform_image_2d.h @@ -6,6 +6,7 @@ #define WEBKIT_PLUGINS_PPAPI_MOCK_PLATFORM_IMAGE_2D_H_ #include "webkit/plugins/ppapi/plugin_delegate.h" +#include "skia/ext/platform_canvas.h" namespace webkit { namespace ppapi { diff --git a/webkit/plugins/ppapi/plugin_delegate.h b/webkit/plugins/ppapi/plugin_delegate.h index f412135..e721f72 100644 --- a/webkit/plugins/ppapi/plugin_delegate.h +++ b/webkit/plugins/ppapi/plugin_delegate.h @@ -35,6 +35,7 @@ class GURL; class SkBitmap; +class SkCanvas; class TransportDIB; struct PP_HostResolver_Private_Hint; struct PP_NetAddress_Private; @@ -70,10 +71,6 @@ class ResourceCreationAPI; } // namespace ppapi -namespace skia { -class PlatformCanvas; -} - namespace WebKit { class WebGamepads; class WebPlugin; @@ -160,7 +157,7 @@ class PluginDelegate { virtual ~PlatformImage2D() {} // Caller will own the returned pointer, returns NULL on failure. - virtual skia::PlatformCanvas* Map() = 0; + virtual SkCanvas* Map() = 0; // Returns the platform-specific shared memory handle of the data backing // this image. This is used by PPAPI proxying to send the image to the diff --git a/webkit/plugins/ppapi/ppb_image_data_impl.h b/webkit/plugins/ppapi/ppb_image_data_impl.h index 65ac751..a0548709 100644 --- a/webkit/plugins/ppapi/ppb_image_data_impl.h +++ b/webkit/plugins/ppapi/ppb_image_data_impl.h @@ -15,11 +15,8 @@ #include "webkit/plugins/ppapi/plugin_delegate.h" #include "webkit/plugins/webkit_plugins_export.h" -namespace skia { -class PlatformCanvas; -} - class SkBitmap; +class SkCanvas; namespace webkit { namespace ppapi { @@ -42,7 +39,7 @@ class WEBKIT_PLUGINS_EXPORT PPB_ImageData_Impl virtual void* Map() = 0; virtual void Unmap() = 0; virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) = 0; - virtual skia::PlatformCanvas* GetPlatformCanvas() = 0; + virtual SkCanvas* GetPlatformCanvas() = 0; virtual SkCanvas* GetCanvas() = 0; virtual const SkBitmap* GetMappedBitmap() const = 0; }; @@ -92,7 +89,7 @@ class WEBKIT_PLUGINS_EXPORT PPB_ImageData_Impl virtual void* Map() OVERRIDE; virtual void Unmap() OVERRIDE; virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; - virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; + virtual SkCanvas* GetPlatformCanvas() OVERRIDE; virtual SkCanvas* GetCanvas() OVERRIDE; const SkBitmap* GetMappedBitmap() const; @@ -119,7 +116,7 @@ class ImageDataPlatformBackend : public PPB_ImageData_Impl::Backend { virtual void* Map() OVERRIDE; virtual void Unmap() OVERRIDE; virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; - virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; + virtual SkCanvas* GetPlatformCanvas() OVERRIDE; virtual SkCanvas* GetCanvas() OVERRIDE; virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; @@ -129,7 +126,7 @@ class ImageDataPlatformBackend : public PPB_ImageData_Impl::Backend { scoped_ptr<PluginDelegate::PlatformImage2D> platform_image_; // When the device is mapped, this is the image. Null when umapped. - scoped_ptr<skia::PlatformCanvas> mapped_canvas_; + scoped_ptr<SkCanvas> mapped_canvas_; DISALLOW_COPY_AND_ASSIGN(ImageDataPlatformBackend); }; @@ -147,7 +144,7 @@ class ImageDataNaClBackend : public PPB_ImageData_Impl::Backend { virtual void* Map() OVERRIDE; virtual void Unmap() OVERRIDE; virtual int32_t GetSharedMemory(int* handle, uint32_t* byte_count) OVERRIDE; - virtual skia::PlatformCanvas* GetPlatformCanvas() OVERRIDE; + virtual SkCanvas* GetPlatformCanvas() OVERRIDE; virtual SkCanvas* GetCanvas() OVERRIDE; virtual const SkBitmap* GetMappedBitmap() const OVERRIDE; diff --git a/webkit/tools/test_shell/webwidget_host_gtk.cc b/webkit/tools/test_shell/webwidget_host_gtk.cc index 8029928..b27f541 100644 --- a/webkit/tools/test_shell/webwidget_host_gtk.cc +++ b/webkit/tools/test_shell/webwidget_host_gtk.cc @@ -357,7 +357,8 @@ void WebWidgetHost::Paint() { if (!canvas_.get()) { ResetScrollRect(); paint_rect_ = client_rect; - canvas_.reset(new skia::PlatformCanvas(width, height, true)); + canvas_.reset(skia::CreatePlatformCanvas(width, height, true, 0, + skia::RETURN_NULL_ON_FAILURE)); if (!canvas_.get()) { // memory allocation failed, we can't paint. LOG(ERROR) << "Failed to allocate memory for " << width << "x" << height; diff --git a/webkit/tools/test_shell/webwidget_host_mac.mm b/webkit/tools/test_shell/webwidget_host_mac.mm index 795430e..7066824 100644 --- a/webkit/tools/test_shell/webwidget_host_mac.mm +++ b/webkit/tools/test_shell/webwidget_host_mac.mm @@ -173,7 +173,7 @@ void WebWidgetHost::Paint() { if (!canvas_.get()) { ResetScrollRect(); paint_rect_ = client_rect; - canvas_.reset(new skia::PlatformCanvas( + canvas_.reset(skia::CreatePlatformCanvas( paint_rect_.width(), paint_rect_.height(), true)); } diff --git a/webkit/tools/test_shell/webwidget_host_win.cc b/webkit/tools/test_shell/webwidget_host_win.cc index b816f83..abb6433 100644 --- a/webkit/tools/test_shell/webwidget_host_win.cc +++ b/webkit/tools/test_shell/webwidget_host_win.cc @@ -239,7 +239,7 @@ void WebWidgetHost::Paint() { if (!canvas_.get()) { ResetScrollRect(); paint_rect_ = client_rect; - canvas_.reset(new skia::PlatformCanvas( + canvas_.reset(skia::CreatePlatformCanvas( paint_rect_.width(), paint_rect_.height(), true)); } |