From c5afa233cc6b4eff679a2e6fbac926567ac5bf17 Mon Sep 17 00:00:00 2001 From: reed Date: Thu, 17 Nov 2016 22:44:20 -0800 Subject: [PATCH] Revert "Change call-sites now that SkCanvas is not ref-counted" This reverts commit 60c148ef13aed978fcaf5dae9e242f99618f2164. https://codereview.chromium.org/2476113002/ BUG=666154 CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_precise_blink_rel TBR=esprehn@chromium.org,blundell@chromium.org,ccameron@chromium.org,danakj@chromium.org,fmalita@chromium.org,khushalsagar@chromium.org,raymes@chromium.org,sky@chromium.org,tobiasjs@chromium.org Review-Url: https://codereview.chromium.org/2509983004 Cr-Commit-Position: refs/heads/master@{#433136} --- .../java_browser_view_renderer_helper.cc | 10 +-- .../compositor/picture_cache_test_support.cc | 3 +- .../compositor_state_deserializer_unittest.cc | 6 +- cc/blimp/picture_data_conversions_unittest.cc | 4 +- cc/output/software_renderer.cc | 2 +- cc/output/software_renderer.h | 2 +- cc/playback/discardable_image_map.cc | 5 +- cc/playback/discardable_image_map.h | 4 +- cc/playback/display_item_list_unittest.cc | 45 ++++++---- cc/raster/gpu_raster_buffer_provider.cc | 6 +- cc/test/fake_content_layer_client.cc | 9 +- cc/test/solid_color_content_layer_client.cc | 3 +- cc/trees/layer_tree_host_pixeltest_masks.cc | 12 +-- cc/trees/layer_tree_host_pixeltest_tiles.cc | 4 +- .../compositor/layer/crushed_sprite_layer.cc | 12 +-- .../compositor/layer/crushed_sprite_layer.h | 2 +- components/test_runner/pixel_dump.cc | 4 +- .../compositor/software_output_device_mac.h | 2 +- .../compositor/software_output_device_mac.mm | 4 +- .../compositor/software_output_device_win.cc | 5 +- .../compositor/software_output_device_win.h | 2 +- .../pepper/pepper_plugin_instance_impl.cc | 8 +- .../pepper/pepper_plugin_instance_impl.h | 5 +- .../renderer/pepper/ppb_image_data_impl.cc | 5 +- content/renderer/pepper/ppb_image_data_impl.h | 4 +- ppapi/proxy/ppb_image_data_proxy.cc | 6 +- ppapi/proxy/ppb_image_data_proxy.h | 2 +- skia/config/SkUserConfig.h | 4 + skia/ext/analysis_canvas_unittest.cc | 2 +- skia/ext/bitmap_platform_device_cairo.cc | 7 +- skia/ext/bitmap_platform_device_mac.cc | 14 +-- .../bitmap_platform_device_mac_unittest.cc | 6 +- skia/ext/bitmap_platform_device_skia.cc | 7 +- skia/ext/bitmap_platform_device_win.cc | 10 +-- skia/ext/platform_canvas.cc | 7 +- skia/ext/platform_canvas.h | 88 +++++++++---------- skia/ext/platform_canvas_unittest.cc | 8 +- skia/ext/skia_utils_mac.mm | 2 +- .../Source/core/svg/graphics/SVGImageTest.cpp | 2 +- .../platform/graphics/GraphicsContext.cpp | 2 +- ui/compositor/paint_recorder.cc | 10 +-- ui/gfx/blit_unittest.cc | 8 +- ui/gfx/canvas.cc | 21 ++--- ui/gfx/canvas.h | 13 +-- ui/gfx/render_text_unittest.cc | 4 +- ui/surface/transport_dib.h | 4 +- ui/surface/transport_dib_posix.cc | 4 +- ui/surface/transport_dib_win.cc | 7 +- ui/views/border_unittest.cc | 4 +- 49 files changed, 199 insertions(+), 211 deletions(-) diff --git a/android_webview/native/java_browser_view_renderer_helper.cc b/android_webview/native/java_browser_view_renderer_helper.cc index 70eca1dd2276..8d8ee8da7662 100644 --- a/android_webview/native/java_browser_view_renderer_helper.cc +++ b/android_webview/native/java_browser_view_renderer_helper.cc @@ -8,7 +8,6 @@ #include "android_webview/public/browser/draw_sw.h" #include "base/android/scoped_java_ref.h" -#include "base/memory/ptr_util.h" #include "base/trace_event/trace_event.h" #include "jni/JavaBrowserViewRendererHelper_jni.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -36,7 +35,7 @@ class JavaCanvasHolder : public SoftwareCanvasHolder { private: AwPixelInfo* pixels_; - std::unique_ptr canvas_; + sk_sp canvas_; DISALLOW_COPY_AND_ASSIGN(JavaCanvasHolder); }; @@ -50,7 +49,8 @@ JavaCanvasHolder::JavaCanvasHolder(JNIEnv* env, if (!pixels_ || !pixels_->state) return; - canvas_ = SkCanvasStateUtils::MakeFromCanvasState(pixels_->state); + canvas_ = sk_sp( + SkCanvasStateUtils::CreateFromCanvasState(pixels_->state)); // Workarounds for http://crbug.com/271096: SW draw only supports // translate & scale transforms, and a simple rectangular clip. if (canvas_ && (!canvas_->isClipRect() || @@ -88,7 +88,7 @@ class AuxiliaryCanvasHolder : public SoftwareCanvasHolder { ScopedJavaLocalRef jbitmap_; gfx::Vector2d scroll_; std::unique_ptr bitmap_; - std::unique_ptr canvas_; + sk_sp canvas_; DISALLOW_COPY_AND_ASSIGN(AuxiliaryCanvasHolder); }; @@ -121,7 +121,7 @@ AuxiliaryCanvasHolder::AuxiliaryCanvasHolder( SkImageInfo::MakeN32Premul(bitmap_info.width, bitmap_info.height); bitmap_.reset(new SkBitmap); bitmap_->installPixels(info, pixels, bitmap_info.stride); - canvas_ = base::MakeUnique(*bitmap_); + canvas_ = sk_make_sp(*bitmap_); } AuxiliaryCanvasHolder::~AuxiliaryCanvasHolder() { diff --git a/blimp/test/support/compositor/picture_cache_test_support.cc b/blimp/test/support/compositor/picture_cache_test_support.cc index 58cd52fd2933..1f2b35c8b4a6 100644 --- a/blimp/test/support/compositor/picture_cache_test_support.cc +++ b/blimp/test/support/compositor/picture_cache_test_support.cc @@ -22,7 +22,8 @@ namespace blimp { sk_sp CreateSkPicture(SkColor color) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(SkRect::MakeWH(1, 1)); + sk_sp canvas = + sk_ref_sp(recorder.beginRecording(SkRect::MakeWH(1, 1))); canvas->drawColor(color); return recorder.finishRecordingAsPicture(); } diff --git a/cc/blimp/compositor_state_deserializer_unittest.cc b/cc/blimp/compositor_state_deserializer_unittest.cc index e044e66f878f..46472928b422 100644 --- a/cc/blimp/compositor_state_deserializer_unittest.cc +++ b/cc/blimp/compositor_state_deserializer_unittest.cc @@ -339,11 +339,11 @@ TEST_F(CompositorStateDeserializerTest, PictureLayer) { gfx::PointF offset(2.f, 3.f); SkPictureRecorder recorder; - SkCanvas* canvas; + sk_sp canvas; SkPaint red_paint; red_paint.setColor(SK_ColorRED); - canvas = recorder.beginRecording(SkRect::MakeXYWH( - offset.x(), offset.y(), layer_size.width(), layer_size.height())); + canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( + offset.x(), offset.y(), layer_size.width(), layer_size.height()))); canvas->translate(offset.x(), offset.y()); canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); sk_sp test_picture = recorder.finishRecordingAsPicture(); diff --git a/cc/blimp/picture_data_conversions_unittest.cc b/cc/blimp/picture_data_conversions_unittest.cc index 535b312fb166..f3e64db53843 100644 --- a/cc/blimp/picture_data_conversions_unittest.cc +++ b/cc/blimp/picture_data_conversions_unittest.cc @@ -23,7 +23,9 @@ namespace cc { namespace { sk_sp CreateSkPicture(SkColor color) { SkPictureRecorder recorder; - recorder.beginRecording(SkRect::MakeWH(1, 1))->drawColor(color); + sk_sp canvas = + sk_ref_sp(recorder.beginRecording(SkRect::MakeWH(1, 1))); + canvas->drawColor(color); return recorder.finishRecordingAsPicture(); } diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index d14526eb5f2d..4a4d89097ff3 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -128,7 +128,7 @@ bool SoftwareRenderer::BindFramebufferToTexture( base::MakeUnique( resource_provider_, texture->id()); current_framebuffer_canvas_ = - base::MakeUnique(current_framebuffer_lock_->sk_bitmap()); + sk_make_sp(current_framebuffer_lock_->sk_bitmap()); current_canvas_ = current_framebuffer_canvas_.get(); return true; } diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h index ef919a2fcbf1..28effca5ad1a 100644 --- a/cc/output/software_renderer.h +++ b/cc/output/software_renderer.h @@ -104,7 +104,7 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer { SkPaint current_paint_; std::unique_ptr current_framebuffer_lock_; - std::unique_ptr current_framebuffer_canvas_; + sk_sp current_framebuffer_canvas_; DISALLOW_COPY_AND_ASSIGN(SoftwareRenderer); }; diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc index 74f830df3470..e79d153febf0 100644 --- a/cc/playback/discardable_image_map.cc +++ b/cc/playback/discardable_image_map.cc @@ -10,7 +10,6 @@ #include #include "base/containers/adapters.h" -#include "base/memory/ptr_util.h" #include "cc/base/math_util.h" #include "cc/playback/display_item_list.h" #include "third_party/skia/include/utils/SkNWayCanvas.h" @@ -198,10 +197,10 @@ DiscardableImageMap::DiscardableImageMap() {} DiscardableImageMap::~DiscardableImageMap() {} -std::unique_ptr DiscardableImageMap::BeginGeneratingMetadata( +sk_sp DiscardableImageMap::BeginGeneratingMetadata( const gfx::Size& bounds) { DCHECK(all_images_.empty()); - return base::MakeUnique( + return sk_make_sp( bounds.width(), bounds.height(), &all_images_, &image_id_to_region_); } diff --git a/cc/playback/discardable_image_map.h b/cc/playback/discardable_image_map.h index c773a7237057..f2e91aedc2f1 100644 --- a/cc/playback/discardable_image_map.h +++ b/cc/playback/discardable_image_map.h @@ -41,7 +41,7 @@ class CC_EXPORT DiscardableImageMap { private: DiscardableImageMap* image_map_; - std::unique_ptr metadata_canvas_; + sk_sp metadata_canvas_; }; DiscardableImageMap(); @@ -57,7 +57,7 @@ class CC_EXPORT DiscardableImageMap { friend class ScopedMetadataGenerator; friend class DiscardableImageMapTest; - std::unique_ptr BeginGeneratingMetadata(const gfx::Size& bounds); + sk_sp BeginGeneratingMetadata(const gfx::Size& bounds); void EndGeneratingMetadata(); std::vector> all_images_; diff --git a/cc/playback/display_item_list_unittest.cc b/cc/playback/display_item_list_unittest.cc index 9bbc5d92fe78..bcee1202839a 100644 --- a/cc/playback/display_item_list_unittest.cc +++ b/cc/playback/display_item_list_unittest.cc @@ -52,7 +52,9 @@ scoped_refptr CreateDefaultList() { sk_sp CreateRectPicture(const gfx::Rect& bounds) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(bounds.width(), bounds.height()); + sk_sp canvas; + + canvas = sk_ref_sp(recorder.beginRecording(bounds.width(), bounds.height())); canvas->drawRect( SkRect::MakeXYWH(bounds.x(), bounds.y(), bounds.width(), bounds.height()), SkPaint()); @@ -63,12 +65,13 @@ void AppendFirstSerializationTestPicture(scoped_refptr list, const gfx::Size& layer_size) { gfx::PointF offset(2.f, 3.f); SkPictureRecorder recorder; + sk_sp canvas; SkPaint red_paint; red_paint.setColor(SK_ColorRED); - SkCanvas* canvas = recorder.beginRecording(SkRect::MakeXYWH( - offset.x(), offset.y(), layer_size.width(), layer_size.height())); + canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( + offset.x(), offset.y(), layer_size.width(), layer_size.height()))); canvas->translate(offset.x(), offset.y()); canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); list->CreateAndAppendDrawingItem( @@ -79,12 +82,13 @@ void AppendSecondSerializationTestPicture(scoped_refptr list, const gfx::Size& layer_size) { gfx::PointF offset(2.f, 2.f); SkPictureRecorder recorder; + sk_sp canvas; SkPaint blue_paint; blue_paint.setColor(SK_ColorBLUE); - SkCanvas* canvas = recorder.beginRecording(SkRect::MakeXYWH( - offset.x(), offset.y(), layer_size.width(), layer_size.height())); + canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH( + offset.x(), offset.y(), layer_size.width(), layer_size.height()))); canvas->translate(offset.x(), offset.y()); canvas->drawRectCoords(3.f, 3.f, 7.f, 7.f, blue_paint); list->CreateAndAppendDrawingItem( @@ -291,6 +295,7 @@ TEST(DisplayItemListTest, SerializeTransformItem) { TEST(DisplayItemListTest, SingleDrawingItem) { gfx::Rect layer_rect(100, 100); SkPictureRecorder recorder; + sk_sp canvas; SkPaint blue_paint; blue_paint.setColor(SK_ColorBLUE); SkPaint red_paint; @@ -302,8 +307,8 @@ TEST(DisplayItemListTest, SingleDrawingItem) { gfx::PointF offset(8.f, 9.f); gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size())); - SkCanvas* canvas = - recorder.beginRecording(gfx::RectFToSkRect(recording_rect)); + canvas = + sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); canvas->translate(offset.x(), offset.y()); canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); @@ -332,6 +337,7 @@ TEST(DisplayItemListTest, SingleDrawingItem) { TEST(DisplayItemListTest, ClipItem) { gfx::Rect layer_rect(100, 100); SkPictureRecorder recorder; + sk_sp canvas; SkPaint blue_paint; blue_paint.setColor(SK_ColorBLUE); SkPaint red_paint; @@ -343,8 +349,8 @@ TEST(DisplayItemListTest, ClipItem) { gfx::PointF first_offset(8.f, 9.f); gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); - SkCanvas* canvas = - recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect)); + canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); canvas->translate(first_offset.x(), first_offset.y()); canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); list->CreateAndAppendDrawingItem( @@ -357,7 +363,8 @@ TEST(DisplayItemListTest, ClipItem) { gfx::PointF second_offset(2.f, 3.f); gfx::RectF second_recording_rect(second_offset, gfx::SizeF(layer_rect.size())); - canvas = recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect)); + canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); canvas->translate(second_offset.x(), second_offset.y()); canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); list->CreateAndAppendDrawingItem( @@ -389,6 +396,7 @@ TEST(DisplayItemListTest, ClipItem) { TEST(DisplayItemListTest, TransformItem) { gfx::Rect layer_rect(100, 100); SkPictureRecorder recorder; + sk_sp canvas; SkPaint blue_paint; blue_paint.setColor(SK_ColorBLUE); SkPaint red_paint; @@ -400,8 +408,8 @@ TEST(DisplayItemListTest, TransformItem) { gfx::PointF first_offset(8.f, 9.f); gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); - SkCanvas* canvas = - recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect)); + canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); canvas->translate(first_offset.x(), first_offset.y()); canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); list->CreateAndAppendDrawingItem( @@ -414,7 +422,8 @@ TEST(DisplayItemListTest, TransformItem) { gfx::PointF second_offset(2.f, 3.f); gfx::RectF second_recording_rect(second_offset, gfx::SizeF(layer_rect.size())); - canvas = recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect)); + canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); canvas->translate(second_offset.x(), second_offset.y()); canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); list->CreateAndAppendDrawingItem( @@ -476,12 +485,13 @@ TEST(DisplayItemListTest, FilterItem) { // Include a rect drawing so that filter is actually applied to something. { SkPictureRecorder recorder; + sk_sp canvas; SkPaint red_paint; red_paint.setColor(SK_ColorRED); - SkCanvas* canvas = recorder.beginRecording( - SkRect::MakeXYWH(0, 0, layer_rect.width(), layer_rect.height())); + canvas = sk_ref_sp(recorder.beginRecording( + SkRect::MakeXYWH(0, 0, layer_rect.width(), layer_rect.height()))); canvas->drawRectCoords(filter_bounds.x(), filter_bounds.y(), filter_bounds.right(), filter_bounds.bottom(), red_paint); @@ -510,6 +520,7 @@ TEST(DisplayItemListTest, FilterItem) { TEST(DisplayItemListTest, CompactingItems) { gfx::Rect layer_rect(100, 100); SkPictureRecorder recorder; + sk_sp canvas; SkPaint blue_paint; blue_paint.setColor(SK_ColorBLUE); SkPaint red_paint; @@ -523,8 +534,8 @@ TEST(DisplayItemListTest, CompactingItems) { scoped_refptr list_without_caching = DisplayItemList::Create(no_caching_settings); - SkCanvas* canvas = - recorder.beginRecording(gfx::RectFToSkRect(recording_rect)); + canvas = + sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); canvas->translate(offset.x(), offset.y()); canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc index aaf2ea4ff317..dbe72d62dc03 100644 --- a/cc/raster/gpu_raster_buffer_provider.cc +++ b/cc/raster/gpu_raster_buffer_provider.cc @@ -60,8 +60,8 @@ static sk_sp PlaybackToPicture( // Play back raster_source into temp SkPicture. SkPictureRecorder recorder; - SkCanvas* canvas = - recorder.beginRecording(resource_size.width(), resource_size.height()); + sk_sp canvas = sk_ref_sp( + recorder.beginRecording(resource_size.width(), resource_size.height())); canvas->save(); // The GPU image decode controller assumes that Skia is done with an image @@ -73,7 +73,7 @@ static sk_sp PlaybackToPicture( // later picture rasterization. RasterSource::PlaybackSettings settings = playback_settings; settings.use_image_hijack_canvas = false; - raster_source->PlaybackToCanvas(canvas, raster_full_rect, playback_rect, + raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect, scales, settings); canvas->restore(); return recorder.finishRecordingAsPicture(); diff --git a/cc/test/fake_content_layer_client.cc b/cc/test/fake_content_layer_client.cc index e192e3a3f091..11c8b3e6cae7 100644 --- a/cc/test/fake_content_layer_client.cc +++ b/cc/test/fake_content_layer_client.cc @@ -58,12 +58,13 @@ FakeContentLayerClient::PaintContentsToDisplayList( DisplayItemList::Create(settings); display_list->SetRetainVisualRectsForTesting(true); SkPictureRecorder recorder; + sk_sp canvas; for (RectPaintVector::const_iterator it = draw_rects_.begin(); it != draw_rects_.end(); ++it) { const gfx::RectF& draw_rect = it->first; const SkPaint& paint = it->second; - SkCanvas* canvas = recorder.beginRecording(gfx::RectFToSkRect(draw_rect)); + canvas = sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(draw_rect))); canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint); display_list->CreateAndAppendDrawingItem( ToEnclosingRect(draw_rect), recorder.finishRecordingAsPicture()); @@ -75,8 +76,8 @@ FakeContentLayerClient::PaintContentsToDisplayList( display_list->CreateAndAppendPairedBeginItem( it->transform); } - SkCanvas* canvas = - recorder.beginRecording(it->image->width(), it->image->height()); + canvas = sk_ref_sp( + recorder.beginRecording(it->image->width(), it->image->height())); canvas->drawImage(it->image.get(), it->point.x(), it->point.y(), &it->paint); display_list->CreateAndAppendDrawingItem( @@ -92,7 +93,7 @@ FakeContentLayerClient::PaintContentsToDisplayList( while (!draw_rect.IsEmpty()) { SkPaint paint; paint.setColor(red ? SK_ColorRED : SK_ColorBLUE); - SkCanvas* canvas = recorder.beginRecording(gfx::RectToSkRect(draw_rect)); + canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(draw_rect))); canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint); display_list->CreateAndAppendDrawingItem( draw_rect, recorder.finishRecordingAsPicture()); diff --git a/cc/test/solid_color_content_layer_client.cc b/cc/test/solid_color_content_layer_client.cc index 58e4ad271cd9..b7138f2729b6 100644 --- a/cc/test/solid_color_content_layer_client.cc +++ b/cc/test/solid_color_content_layer_client.cc @@ -26,7 +26,8 @@ SolidColorContentLayerClient::PaintContentsToDisplayList( PaintingControlSetting painting_control) { SkPictureRecorder recorder; gfx::Rect clip(PaintableRegion()); - SkCanvas* canvas = recorder.beginRecording(gfx::RectToSkRect(clip)); + sk_sp canvas = + sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(clip))); canvas->clear(SK_ColorTRANSPARENT); diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc index 0ce262cb50a7..87e92a43553e 100644 --- a/cc/trees/layer_tree_host_pixeltest_masks.cc +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc @@ -40,8 +40,8 @@ class MaskContentLayerClient : public ContentLayerClient { scoped_refptr PaintContentsToDisplayList( PaintingControlSetting picture_control) override { SkPictureRecorder recorder; - SkCanvas* canvas = - recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_))); + sk_sp canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_)))); SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); @@ -163,8 +163,8 @@ class CheckerContentLayerClient : public ContentLayerClient { scoped_refptr PaintContentsToDisplayList( PaintingControlSetting picture_control) override { SkPictureRecorder recorder; - SkCanvas* canvas = - recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_))); + sk_sp canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_)))); SkPaint paint; paint.setStyle(SkPaint::kStroke_Style); @@ -207,8 +207,8 @@ class CircleContentLayerClient : public ContentLayerClient { scoped_refptr PaintContentsToDisplayList( PaintingControlSetting picture_control) override { SkPictureRecorder recorder; - SkCanvas* canvas = - recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_))); + sk_sp canvas = sk_ref_sp( + recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(bounds_)))); SkPaint paint; paint.setStyle(SkPaint::kFill_Style); diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc index b569208f0188..9a649dcece9c 100644 --- a/cc/trees/layer_tree_host_pixeltest_tiles.cc +++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc @@ -115,8 +115,8 @@ class BlueYellowClient : public ContentLayerClient { DisplayItemList::Create(settings); SkPictureRecorder recorder; - SkCanvas* canvas = - recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(size_))); + sk_sp canvas = + sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(gfx::Rect(size_)))); gfx::Rect top(0, 0, size_.width(), size_.height() / 2); gfx::Rect bottom(0, size_.height() / 2, size_.width(), size_.height() / 2); diff --git a/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc b/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc index f7799bc50140..3a6e604908cd 100644 --- a/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc +++ b/chrome/browser/android/compositor/layer/crushed_sprite_layer.cc @@ -53,13 +53,13 @@ void CrushedSpriteLayer::DrawSpriteFrame( SkBitmap bitmap; bitmap.allocN32Pixels(resource->GetUnscaledSpriteSize().width(), resource->GetUnscaledSpriteSize().height()); - SkCanvas canvas(bitmap); + sk_sp canvas = sk_make_sp(bitmap); if (previous_frame_ == -1 || sprite_frame == resource->GetFrameCount() - 1) { // The newly allocated pixels for the SkBitmap need to be cleared if this // is the first frame being drawn or the last frame. See crbug.com/549453. - canvas.clear(SK_ColorTRANSPARENT); + canvas->clear(SK_ColorTRANSPARENT); } // If this isn't the first or last frame, draw the previous frame(s). @@ -70,17 +70,17 @@ void CrushedSpriteLayer::DrawSpriteFrame( if (sprite_frame != 0 && sprite_frame != resource->GetFrameCount() - 1) { // Draw the previous frame. if (previous_frame_ != -1) { - canvas.drawBitmap(previous_frame_bitmap_, 0, 0, nullptr); + canvas->drawBitmap(previous_frame_bitmap_, 0, 0, nullptr); } // Draw any skipped frames. for (int i = previous_frame_ + 1; i < sprite_frame; ++i) { - DrawRectanglesForFrame(resource, i, &canvas); + DrawRectanglesForFrame(resource, i, canvas); } } // Draw the current frame. - DrawRectanglesForFrame(resource, sprite_frame, &canvas); + DrawRectanglesForFrame(resource, sprite_frame, canvas); // Set the bitmap on layer_. bitmap.setImmutable(); @@ -103,7 +103,7 @@ void CrushedSpriteLayer::DrawSpriteFrame( void CrushedSpriteLayer::DrawRectanglesForFrame( ui::CrushedSpriteResource* resource, int frame, - SkCanvas* canvas) { + sk_sp canvas) { ui::CrushedSpriteResource::FrameSrcDstRects src_dst_rects = resource->GetRectanglesForFrame(frame); for (const auto& rect : src_dst_rects) { diff --git a/chrome/browser/android/compositor/layer/crushed_sprite_layer.h b/chrome/browser/android/compositor/layer/crushed_sprite_layer.h index 0b425f10dce7..5dbc5cb9275d 100644 --- a/chrome/browser/android/compositor/layer/crushed_sprite_layer.h +++ b/chrome/browser/android/compositor/layer/crushed_sprite_layer.h @@ -49,7 +49,7 @@ class CrushedSpriteLayer : public Layer { // Draws the rectangles for |frame| to |canvas|. void DrawRectanglesForFrame(ui::CrushedSpriteResource* resource, int frame, - SkCanvas* canvas); + sk_sp canvas); scoped_refptr layer_; int frame_count_; diff --git a/components/test_runner/pixel_dump.cc b/components/test_runner/pixel_dump.cc index 67881c94b300..de2316a71aa9 100644 --- a/components/test_runner/pixel_dump.cc +++ b/components/test_runner/pixel_dump.cc @@ -96,8 +96,8 @@ void CapturePixelsForPrinting(std::unique_ptr dump_request) { int totalHeight = page_count * (page_size_in_pixels.height + 1) - 1; bool is_opaque = false; - std::unique_ptr canvas = skia::TryCreateBitmapCanvas( - page_size_in_pixels.width, totalHeight, is_opaque); + sk_sp canvas(skia::TryCreateBitmapCanvas( + page_size_in_pixels.width, totalHeight, is_opaque)); if (!canvas) { LOG(ERROR) << "Failed to create canvas width=" << page_size_in_pixels.width << " height=" << totalHeight; diff --git a/content/browser/compositor/software_output_device_mac.h b/content/browser/compositor/software_output_device_mac.h index a0bc91098679..e0a1b1f0c499 100644 --- a/content/browser/compositor/software_output_device_mac.h +++ b/content/browser/compositor/software_output_device_mac.h @@ -66,7 +66,7 @@ class SoftwareOutputDeviceMac : // The SkCanvas wrapps the mapped current IOSurface. It is valid only between // BeginPaint and EndPaint. - std::unique_ptr canvas_; + sk_sp canvas_; gfx::VSyncProvider::UpdateVSyncCallback update_vsync_callback_; diff --git a/content/browser/compositor/software_output_device_mac.mm b/content/browser/compositor/software_output_device_mac.mm index 1db33824c81f..bff1570c1fe1 100644 --- a/content/browser/compositor/software_output_device_mac.mm +++ b/content/browser/compositor/software_output_device_mac.mm @@ -114,8 +114,8 @@ IOSurfaceGetBaseAddress(io_surfaces_[current_index_])); size_t stride = IOSurfaceGetBytesPerRow(io_surfaces_[current_index_]); - canvas_ = SkCanvas::MakeRasterDirectN32(pixel_size_.width(), - pixel_size_.height(), pixels, stride); + canvas_ = sk_sp(SkCanvas::NewRasterDirectN32( + pixel_size_.width(), pixel_size_.height(), pixels, stride)); CopyPreviousBufferDamage(SkRegion(gfx::RectToSkIRect(new_damage_rect))); diff --git a/content/browser/compositor/software_output_device_win.cc b/content/browser/compositor/software_output_device_win.cc index 2edf325b360a..c48bed4fa0eb 100644 --- a/content/browser/compositor/software_output_device_win.cc +++ b/content/browser/compositor/software_output_device_win.cc @@ -139,9 +139,9 @@ SkCanvas* SoftwareOutputDeviceWin::BeginPaint(const gfx::Rect& damage_rect) { } } if (can_create_contents) { - contents_ = skia::CreatePlatformCanvas( + contents_ = sk_sp(skia::CreatePlatformCanvas( viewport_pixel_size_.width(), viewport_pixel_size_.height(), true, - shared_section, skia::CRASH_ON_FAILURE); + shared_section, skia::CRASH_ON_FAILURE)); } } @@ -192,6 +192,7 @@ void SoftwareOutputDeviceWin::EndPaint() { } void SoftwareOutputDeviceWin::ReleaseContents() { + DCHECK(!contents_ || contents_->unique()); DCHECK(!in_paint_); contents_.reset(); } diff --git a/content/browser/compositor/software_output_device_win.h b/content/browser/compositor/software_output_device_win.h index 2c0780faec3e..61066ceaa948 100644 --- a/content/browser/compositor/software_output_device_win.h +++ b/content/browser/compositor/software_output_device_win.h @@ -63,7 +63,7 @@ class SoftwareOutputDeviceWin : public cc::SoftwareOutputDevice { private: HWND hwnd_; - std::unique_ptr contents_; + sk_sp contents_; bool is_hwnd_composited_; OutputDeviceBacking* backing_; bool in_paint_; diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 367fa644a0a5..bb02dbee9f4b 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc @@ -1798,7 +1798,7 @@ int PepperPluginInstanceImpl::PrintBegin(const WebPrintParams& print_params) { if (!num_pages) return 0; current_print_settings_ = print_settings; - canvas_ = nullptr; + canvas_.reset(); ranges_.clear(); return num_pages; } @@ -1817,7 +1817,7 @@ void PepperPluginInstanceImpl::PrintPage(int page_number, #endif // defined(OS_MACOSX) if (save_for_later) { ranges_.push_back(page_range); - canvas_ = canvas; + canvas_ = sk_ref_sp(canvas); } else { PrintPageHelper(&page_range, 1, canvas); } @@ -1849,8 +1849,8 @@ void PepperPluginInstanceImpl::PrintEnd() { // Keep a reference on the stack. See NOTE above. scoped_refptr ref(this); if (!ranges_.empty()) - PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_); - canvas_ = nullptr; + PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_.get()); + canvas_.reset(); ranges_.clear(); DCHECK(plugin_print_interface_); diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h index dade2ee2e635..dc08cfff6c7d 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.h +++ b/content/renderer/pepper/pepper_plugin_instance_impl.h @@ -839,9 +839,8 @@ class CONTENT_EXPORT PepperPluginInstanceImpl // is preserved in PrintWebViewHelper::PrintPages. This makes it possible // to generate the entire PDF given the variables below: // - // The most recently used WebCanvas to be used in printEnd(). Caller must - // ensure that it remains valid until that point. - blink::WebCanvas* canvas_; + // The most recently used WebCanvas, guaranteed to be valid. + sk_sp canvas_; // An array of page ranges. std::vector ranges_; diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc index edf80694df95..7b8740b1ebd3 100644 --- a/content/renderer/pepper/ppb_image_data_impl.cc +++ b/content/renderer/pepper/ppb_image_data_impl.cc @@ -171,7 +171,8 @@ TransportDIB* ImageDataPlatformBackend::GetTransportDIB() const { void* ImageDataPlatformBackend::Map() { if (!mapped_canvas_) { const bool is_opaque = false; - mapped_canvas_ = dib_->GetPlatformCanvas(width_, height_, is_opaque); + mapped_canvas_ = + sk_sp(dib_->GetPlatformCanvas(width_, height_, is_opaque)); if (!mapped_canvas_) return NULL; } @@ -249,7 +250,7 @@ void* ImageDataSimpleBackend::Map() { skia_bitmap_.setPixels(shared_memory_->memory()); // Our platform bitmaps are set to opaque by default, which we don't want. skia_bitmap_.setAlphaType(kPremul_SkAlphaType); - skia_canvas_ = base::MakeUnique(skia_bitmap_); + skia_canvas_ = sk_make_sp(skia_bitmap_); return skia_bitmap_.getAddr32(0, 0); } return shared_memory_->memory(); diff --git a/content/renderer/pepper/ppb_image_data_impl.h b/content/renderer/pepper/ppb_image_data_impl.h index 81c9a5a68ebd..28fa33bd89f5 100644 --- a/content/renderer/pepper/ppb_image_data_impl.h +++ b/content/renderer/pepper/ppb_image_data_impl.h @@ -149,7 +149,7 @@ class ImageDataPlatformBackend : public PPB_ImageData_Impl::Backend { std::unique_ptr dib_; // When the device is mapped, this is the image. Null when umapped. - std::unique_ptr mapped_canvas_; + sk_sp mapped_canvas_; DISALLOW_COPY_AND_ASSIGN(ImageDataPlatformBackend); }; @@ -179,7 +179,7 @@ class ImageDataSimpleBackend : public PPB_ImageData_Impl::Backend { std::unique_ptr shared_memory_; // skia_bitmap_ is backed by shared_memory_. SkBitmap skia_bitmap_; - std::unique_ptr skia_canvas_; + sk_sp skia_canvas_; uint32_t map_count_; DISALLOW_COPY_AND_ASSIGN(ImageDataSimpleBackend); diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc index b4415fdada0f..bde81b43fb62 100644 --- a/ppapi/proxy/ppb_image_data_proxy.cc +++ b/ppapi/proxy/ppb_image_data_proxy.cc @@ -391,8 +391,10 @@ void* PlatformImageData::Map() { return NULL; const bool is_opaque = false; - mapped_canvas_ = transport_dib_->GetPlatformCanvas( - desc_.size.width, desc_.size.height, is_opaque); + mapped_canvas_ = + sk_sp(transport_dib_->GetPlatformCanvas(desc_.size.width, + desc_.size.height, + is_opaque)); if (!mapped_canvas_.get()) return NULL; } diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h index 2b39aa0c8bae..2e5554d57088 100644 --- a/ppapi/proxy/ppb_image_data_proxy.h +++ b/ppapi/proxy/ppb_image_data_proxy.h @@ -104,7 +104,7 @@ class PPAPI_PROXY_EXPORT PlatformImageData : public ImageData { std::unique_ptr transport_dib_; // Null when the image isn't mapped. - std::unique_ptr mapped_canvas_; + sk_sp mapped_canvas_; DISALLOW_COPY_AND_ASSIGN(PlatformImageData); }; diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 00b9417a3c69..56407f03b991 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h @@ -212,6 +212,10 @@ SK_API void SkDebugf_FileLine(const char* file, int line, bool fatal, # define SK_SUPPORT_LEGACY_ANISOTROPIC_MIPMAP_SCALE #endif +#ifndef SK_SUPPORT_LEGACY_CANVAS_IS_REFCNT +# define SK_SUPPORT_LEGACY_CANVAS_IS_REFCNT +#endif + #ifndef SK_IGNORE_ETC1_SUPPORT # define SK_IGNORE_ETC1_SUPPORT #endif diff --git a/skia/ext/analysis_canvas_unittest.cc b/skia/ext/analysis_canvas_unittest.cc index 9d9eb1c77262..f64722a5dec9 100644 --- a/skia/ext/analysis_canvas_unittest.cc +++ b/skia/ext/analysis_canvas_unittest.cc @@ -329,7 +329,7 @@ TEST(AnalysisCanvasTest, EarlyOutNotSolid) { SkPictureRecorder recorder; // Create a picture with 3 commands, last of which is non-solid. - SkCanvas* record_canvas = recorder.beginRecording(256, 256, &factory); + sk_sp record_canvas = sk_ref_sp(recorder.beginRecording(256, 256, &factory)); std::string text = "text"; SkPoint point = SkPoint::Make(SkIntToScalar(25), SkIntToScalar(25)); diff --git a/skia/ext/bitmap_platform_device_cairo.cc b/skia/ext/bitmap_platform_device_cairo.cc index 093719e1cad9..231c3a8b4a40 100644 --- a/skia/ext/bitmap_platform_device_cairo.cc +++ b/skia/ext/bitmap_platform_device_cairo.cc @@ -166,11 +166,8 @@ cairo_t* BitmapPlatformDevice::BeginPlatformPaint( // PlatformCanvas impl -std::unique_ptr CreatePlatformCanvas(int width, - int height, - bool is_opaque, - uint8_t* data, - OnFailureType failureType) { +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { sk_sp dev( BitmapPlatformDevice::Create(width, height, is_opaque, data)); return CreateCanvas(dev, failureType); diff --git a/skia/ext/bitmap_platform_device_mac.cc b/skia/ext/bitmap_platform_device_mac.cc index bf02a89a5e1b..06a41390b5db 100644 --- a/skia/ext/bitmap_platform_device_mac.cc +++ b/skia/ext/bitmap_platform_device_mac.cc @@ -260,22 +260,16 @@ SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& cinfo, // PlatformCanvas impl -std::unique_ptr CreatePlatformCanvas(CGContextRef ctx, - int width, - int height, - bool is_opaque, - OnFailureType failureType) { +SkCanvas* CreatePlatformCanvas(CGContextRef ctx, int width, int height, + bool is_opaque, OnFailureType failureType) { const bool do_clear = false; sk_sp dev( BitmapPlatformDevice::Create(ctx, width, height, is_opaque, do_clear)); return CreateCanvas(dev, failureType); } -std::unique_ptr CreatePlatformCanvas(int width, - int height, - bool is_opaque, - uint8_t* data, - OnFailureType failureType) { +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { sk_sp dev( BitmapPlatformDevice::CreateWithData(data, width, height, is_opaque)); return CreateCanvas(dev, failureType); diff --git a/skia/ext/bitmap_platform_device_mac_unittest.cc b/skia/ext/bitmap_platform_device_mac_unittest.cc index 9d8020b0d699..b1f6ee74dab1 100644 --- a/skia/ext/bitmap_platform_device_mac_unittest.cc +++ b/skia/ext/bitmap_platform_device_mac_unittest.cc @@ -32,8 +32,7 @@ TEST_F(BitmapPlatformDeviceMacTest, ClipRectTransformWithTranslate) { SkMatrix transform; transform.setTranslate(50, 140); - std::unique_ptr canvas = - skia::CreateCanvas(bitmap_, CRASH_ON_FAILURE); + sk_sp canvas(skia::CreateCanvas(bitmap_, CRASH_ON_FAILURE)); canvas->setMatrix(transform); ScopedPlatformPaint p(canvas.get()); @@ -51,8 +50,7 @@ TEST_F(BitmapPlatformDeviceMacTest, ClipRectTransformWithScale) { SkMatrix transform; transform.setScale(0.5, 0.5); - std::unique_ptr canvas = - skia::CreateCanvas(bitmap_, CRASH_ON_FAILURE); + sk_sp canvas(skia::CreateCanvas(bitmap_, CRASH_ON_FAILURE)); canvas->setMatrix(transform); ScopedPlatformPaint p(canvas.get()); diff --git a/skia/ext/bitmap_platform_device_skia.cc b/skia/ext/bitmap_platform_device_skia.cc index d19810badac5..77957af919be 100644 --- a/skia/ext/bitmap_platform_device_skia.cc +++ b/skia/ext/bitmap_platform_device_skia.cc @@ -60,11 +60,8 @@ NativeDrawingContext BitmapPlatformDevice::BeginPlatformPaint( // PlatformCanvas impl -std::unique_ptr CreatePlatformCanvas(int width, - int height, - bool is_opaque, - uint8_t* data, - OnFailureType failureType) { +SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque, + uint8_t* data, OnFailureType failureType) { sk_sp dev( BitmapPlatformDevice::Create(width, height, is_opaque, data)); return CreateCanvas(dev, failureType); diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc index 44a3ea5705e9..4687c920b32c 100644 --- a/skia/ext/bitmap_platform_device_win.cc +++ b/skia/ext/bitmap_platform_device_win.cc @@ -207,11 +207,11 @@ SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& cinfo, // PlatformCanvas impl -std::unique_ptr CreatePlatformCanvas(int width, - int height, - bool is_opaque, - HANDLE shared_section, - OnFailureType failureType) { +SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + HANDLE shared_section, + OnFailureType failureType) { sk_sp dev( BitmapPlatformDevice::Create(width, height, is_opaque, shared_section)); return CreateCanvas(dev, failureType); diff --git a/skia/ext/platform_canvas.cc b/skia/ext/platform_canvas.cc index ec99dfe92a8f..cf78a4ea925d 100644 --- a/skia/ext/platform_canvas.cc +++ b/skia/ext/platform_canvas.cc @@ -5,7 +5,6 @@ #include "skia/ext/platform_canvas.h" #include "base/logging.h" -#include "base/memory/ptr_util.h" #include "build/build_config.h" #include "skia/ext/platform_device.h" #include "third_party/skia/include/core/SkMetaData.h" @@ -66,14 +65,14 @@ size_t PlatformCanvasStrideForWidth(unsigned width) { return 4 * width; } -std::unique_ptr CreateCanvas(const sk_sp& device, - OnFailureType failureType) { +SkCanvas* CreateCanvas(const sk_sp& device, + OnFailureType failureType) { if (!device) { if (CRASH_ON_FAILURE == failureType) SK_CRASH(); return nullptr; } - return base::MakeUnique(device.get()); + return new SkCanvas(device.get()); } SkMetaData& GetMetaData(const SkCanvas& canvas) { diff --git a/skia/ext/platform_canvas.h b/skia/ext/platform_canvas.h index 04a4d177ab96..c71c0dc702a0 100644 --- a/skia/ext/platform_canvas.h +++ b/skia/ext/platform_canvas.h @@ -45,68 +45,64 @@ enum OnFailureType { #if defined(WIN32) // The shared_section parameter is passed to gfx::PlatformDevice::create. // See it for details. -SK_API std::unique_ptr CreatePlatformCanvas( - int width, - int height, - bool is_opaque, - HANDLE shared_section, - OnFailureType failure_type); - -// Draws the top layer of the canvas into the specified HDC. Only works -// with a SkCanvas with a BitmapPlatformDevice. Will create a temporary -// HDC to back the canvas if one doesn't already exist, tearing it down -// before returning. If |src_rect| is null, copies the entire canvas. -SK_API void DrawToNativeContext(SkCanvas* canvas, - HDC hdc, - int x, - int y, - const RECT* src_rect); + SK_API SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + HANDLE shared_section, + OnFailureType failure_type); + + // Draws the top layer of the canvas into the specified HDC. Only works + // with a SkCanvas with a BitmapPlatformDevice. Will create a temporary + // HDC to back the canvas if one doesn't already exist, tearing it down + // before returning. If |src_rect| is null, copies the entire canvas. + SK_API void DrawToNativeContext(SkCanvas* canvas, + HDC hdc, + int x, + int y, + const RECT* src_rect); #elif defined(__APPLE__) -SK_API std::unique_ptr CreatePlatformCanvas( - CGContextRef context, - int width, - int height, - bool is_opaque, - OnFailureType failure_type); - -SK_API std::unique_ptr CreatePlatformCanvas( - int width, - int height, - bool is_opaque, - uint8_t* context, - OnFailureType failure_type); + 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. -SK_API std::unique_ptr CreatePlatformCanvas( - int width, - int height, - bool is_opaque, - uint8_t* data, - OnFailureType failure_type); + SK_API SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque, + uint8_t* data, + OnFailureType failure_type); #endif -static inline std::unique_ptr CreatePlatformCanvas(int width, - int height, - bool is_opaque) { +static inline SkCanvas* CreatePlatformCanvas(int width, + int height, + bool is_opaque) { return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE); } -SK_API std::unique_ptr CreateCanvas(const sk_sp& device, - OnFailureType failure_type); +SK_API SkCanvas* CreateCanvas(const sk_sp& device, + OnFailureType failure_type); -static inline std::unique_ptr CreateBitmapCanvas(int width, - int height, - bool is_opaque) { +static inline SkCanvas* CreateBitmapCanvas(int width, + int height, + bool is_opaque) { return CreatePlatformCanvas(width, height, is_opaque, 0, CRASH_ON_FAILURE); } -static inline std::unique_ptr TryCreateBitmapCanvas(int width, - int height, - bool is_opaque) { +static inline SkCanvas* TryCreateBitmapCanvas(int width, + int height, + bool is_opaque) { return CreatePlatformCanvas(width, height, is_opaque, 0, RETURN_NULL_ON_FAILURE); } diff --git a/skia/ext/platform_canvas_unittest.cc b/skia/ext/platform_canvas_unittest.cc index 38d574f48805..67c7c8f045f3 100644 --- a/skia/ext/platform_canvas_unittest.cc +++ b/skia/ext/platform_canvas_unittest.cc @@ -233,7 +233,7 @@ const int kInnerH = 3; // regular skia primitives. TEST(PlatformCanvas, SkLayer) { // Create the canvas initialized to opaque white. - std::unique_ptr canvas = CreatePlatformCanvas(16, 16, true); + sk_sp canvas(CreatePlatformCanvas(16, 16, true)); canvas->drawColor(SK_ColorWHITE); // Make a layer and fill it completely to make sure that the bounds are @@ -248,7 +248,7 @@ TEST(PlatformCanvas, SkLayer) { // Test native clipping. TEST(PlatformCanvas, ClipRegion) { // Initialize a white canvas - std::unique_ptr canvas = CreatePlatformCanvas(16, 16, true); + sk_sp canvas(CreatePlatformCanvas(16, 16, true)); canvas->drawColor(SK_ColorWHITE); EXPECT_TRUE(VerifyCanvasColor(*canvas, SK_ColorWHITE)); @@ -273,7 +273,7 @@ TEST(PlatformCanvas, ClipRegion) { // Test the layers get filled properly by native rendering. TEST(PlatformCanvas, FillLayer) { // Create the canvas initialized to opaque white. - std::unique_ptr canvas(CreatePlatformCanvas(16, 16, true)); + sk_sp canvas(CreatePlatformCanvas(16, 16, true)); // Make a layer and fill it completely to make sure that the bounds are // correct. @@ -322,7 +322,7 @@ TEST(PlatformCanvas, FillLayer) { // Test that translation + make layer works properly. TEST(PlatformCanvas, TranslateLayer) { // Create the canvas initialized to opaque white. - std::unique_ptr canvas = CreatePlatformCanvas(16, 16, true); + sk_sp canvas(CreatePlatformCanvas(16, 16, true)); // Make a layer and fill it completely to make sure that the bounds are // correct. diff --git a/skia/ext/skia_utils_mac.mm b/skia/ext/skia_utils_mac.mm index 57fb7076ba21..9ebdd7a227c8 100644 --- a/skia/ext/skia_utils_mac.mm +++ b/skia/ext/skia_utils_mac.mm @@ -190,7 +190,7 @@ SkBitmap CGImageToSkBitmap(CGImageRef image) { int width = CGImageGetWidth(image); int height = CGImageGetHeight(image); - std::unique_ptr canvas(skia::CreatePlatformCanvas( + sk_sp canvas(skia::CreatePlatformCanvas( nullptr, width, height, false, RETURN_NULL_ON_FAILURE)); ScopedPlatformPaint p(canvas.get()); CGContextRef context = p.GetNativeDrawingContext(); diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImageTest.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImageTest.cpp index 3ffba59d7c30..9ac7b526814c 100644 --- a/third_party/WebKit/Source/core/svg/graphics/SVGImageTest.cpp +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImageTest.cpp @@ -27,7 +27,7 @@ class SVGImageTest : public ::testing::Test { void pumpFrame() { Image* image = m_image.get(); - std::unique_ptr nullCanvas = SkMakeNullCanvas(); + sk_sp nullCanvas(SkCreateNullCanvas()); SkPaint paint; FloatRect dummyRect(0, 0, 100, 100); image->draw(nullCanvas.get(), paint, dummyRect, dummyRect, diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp index 457772162501..fe833dd1b166 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp @@ -78,7 +78,7 @@ GraphicsContext::GraphicsContext(PaintController& paintController, m_paintState = m_paintStateStack.last().get(); if (contextDisabled()) { - DEFINE_STATIC_LOCAL(SkCanvas*, nullCanvas, (SkMakeNullCanvas().release())); + DEFINE_STATIC_LOCAL(SkCanvas*, nullCanvas, (SkCreateNullCanvas())); m_canvas = nullCanvas; } } diff --git a/ui/compositor/paint_recorder.cc b/ui/compositor/paint_recorder.cc index b48717dc307a..2c01e5c43d9c 100644 --- a/ui/compositor/paint_recorder.cc +++ b/ui/compositor/paint_recorder.cc @@ -14,15 +14,15 @@ namespace ui { -// This class records a reference to the context, the canvas returned -// by its recorder_, and the cache. Thus all 3 of these must remain -// valid for the lifetime of this object. PaintRecorder::PaintRecorder(const PaintContext& context, const gfx::Size& recording_size, PaintCache* cache) : context_(context), - canvas_(context.recorder_->beginRecording( - gfx::RectToSkRect(gfx::Rect(recording_size))), + // The SkCanvas reference returned by beginRecording is shared with + // the recorder_ so no need to store a RefPtr to it on this class, we just + // store the gfx::Canvas. + canvas_(sk_ref_sp(context.recorder_->beginRecording( + gfx::RectToSkRect(gfx::Rect(recording_size)))), context.device_scale_factor_), cache_(cache), bounds_in_layer_(context.ToLayerSpaceBounds(recording_size)) { diff --git a/ui/gfx/blit_unittest.cc b/ui/gfx/blit_unittest.cc index 50e7952265ad..7598ef658289 100644 --- a/ui/gfx/blit_unittest.cc +++ b/ui/gfx/blit_unittest.cc @@ -64,8 +64,8 @@ void VerifyCanvasValues(SkCanvas* canvas, uint8_t values[h][w]) { TEST(Blit, ScrollCanvas) { static const int kCanvasWidth = 5; static const int kCanvasHeight = 5; - std::unique_ptr canvas = - skia::CreatePlatformCanvas(kCanvasWidth, kCanvasHeight, true); + sk_sp canvas( + skia::CreatePlatformCanvas(kCanvasWidth, kCanvasHeight, true)); uint8_t initial_values[kCanvasHeight][kCanvasWidth] = { {0x00, 0x01, 0x02, 0x03, 0x04}, {0x10, 0x11, 0x12, 0x13, 0x14}, @@ -152,9 +152,9 @@ TEST(Blit, WithSharedMemory) { base::SharedMemory shared_mem; ASSERT_TRUE(shared_mem.CreateAnonymous(kCanvasWidth * kCanvasHeight)); base::SharedMemoryHandle section = shared_mem.handle(); - std::unique_ptr canvas = skia::CreatePlatformCanvas( + sk_sp canvas(skia::CreatePlatformCanvas( kCanvasWidth, kCanvasHeight, true, section.GetHandle(), - skia::RETURN_NULL_ON_FAILURE); + skia::RETURN_NULL_ON_FAILURE)); ASSERT_TRUE(canvas); shared_mem.Close(); diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc index 73a7a669700c..df386f7da584 100644 --- a/ui/gfx/canvas.cc +++ b/ui/gfx/canvas.cc @@ -28,10 +28,9 @@ namespace gfx { Canvas::Canvas(const Size& size, float image_scale, bool is_opaque) : image_scale_(image_scale) { Size pixel_size = ScaleToCeiledSize(size, image_scale); - canvas_owner_ = skia::CreatePlatformCanvas(pixel_size.width(), - pixel_size.height(), is_opaque); - canvas_ = canvas_owner_.get(); - + canvas_ = sk_sp(skia::CreatePlatformCanvas(pixel_size.width(), + pixel_size.height(), + is_opaque)); #if !defined(USE_CAIRO) // skia::PlatformCanvas instances are initialized to 0 by Cairo, but // uninitialized on other platforms. @@ -45,11 +44,10 @@ Canvas::Canvas(const Size& size, float image_scale, bool is_opaque) Canvas::Canvas() : image_scale_(1.f), - canvas_owner_(skia::CreatePlatformCanvas(0, 0, false)), - canvas_(canvas_owner_.get()) {} + canvas_(sk_sp(skia::CreatePlatformCanvas(0, 0, false))) {} -Canvas::Canvas(SkCanvas* canvas, float image_scale) - : image_scale_(image_scale), canvas_(canvas) { +Canvas::Canvas(sk_sp canvas, float image_scale) + : image_scale_(image_scale), canvas_(std::move(canvas)) { DCHECK(canvas_); } @@ -61,10 +59,9 @@ void Canvas::RecreateBackingCanvas(const Size& size, bool is_opaque) { image_scale_ = image_scale; Size pixel_size = ScaleToFlooredSize(size, image_scale); - canvas_owner_ = skia::CreatePlatformCanvas(pixel_size.width(), - pixel_size.height(), is_opaque); - canvas_ = canvas_owner_.get(); - + canvas_ = sk_sp(skia::CreatePlatformCanvas(pixel_size.width(), + pixel_size.height(), + is_opaque)); SkScalar scale_scalar = SkFloatToScalar(image_scale); canvas_->scale(scale_scalar, scale_scalar); } diff --git a/ui/gfx/canvas.h b/ui/gfx/canvas.h index 521a1567f4a9..ec85eb537468 100644 --- a/ui/gfx/canvas.h +++ b/ui/gfx/canvas.h @@ -89,9 +89,7 @@ class GFX_EXPORT Canvas { // Creates a Canvas backed by an |sk_canvas| with |image_scale_|. // |sk_canvas| is assumed to be already scaled based on |image_scale| // so no additional scaling is applied. - // Note: the caller must ensure that sk_canvas outlives this object, or until - // RecreateBackingCanvas is called. - Canvas(SkCanvas* sk_canvas, float image_scale); + Canvas(sk_sp sk_canvas, float image_scale); virtual ~Canvas(); @@ -483,7 +481,7 @@ class GFX_EXPORT Canvas { const Rect& display_rect, int flags); - SkCanvas* sk_canvas() { return canvas_; } + SkCanvas* sk_canvas() { return canvas_.get(); } float image_scale() const { return image_scale_; } private: @@ -511,12 +509,7 @@ class GFX_EXPORT Canvas { // Canvas::Scale() does not affect |image_scale_|. float image_scale_; - // canvas_ is our active canvas object. Sometimes we are also the owner, - // in which case canvas_owner_ will be set. Other times we are just - // borrowing someone else's canvas, in which case canvas_ will point there - // but canvas_owner_ will be null. - std::unique_ptr canvas_owner_; - SkCanvas* canvas_; + sk_sp canvas_; DISALLOW_COPY_AND_ASSIGN(Canvas); }; diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index c51ef30315f6..5091fcacd3d8 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc @@ -3645,7 +3645,7 @@ TEST_P(RenderTextTest, TextDoesntClip) { sk_sp surface = SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height()); - Canvas canvas(surface->getCanvas(), 1.0f); + Canvas canvas(sk_ref_sp(surface->getCanvas()), 1.0f); RenderText* render_text = GetRenderText(); render_text->SetHorizontalAlignment(ALIGN_LEFT); render_text->SetColor(SK_ColorBLACK); @@ -3738,7 +3738,7 @@ TEST_P(RenderTextTest, TextDoesClip) { sk_sp surface = SkSurface::MakeRasterN32Premul(kCanvasSize.width(), kCanvasSize.height()); - Canvas canvas(surface->getCanvas(), 1.0f); + Canvas canvas(sk_ref_sp(surface->getCanvas()), 1.0f); RenderText* render_text = GetRenderText(); render_text->SetHorizontalAlignment(ALIGN_LEFT); render_text->SetColor(SK_ColorBLACK); diff --git a/ui/surface/transport_dib.h b/ui/surface/transport_dib.h index 3217b5ff8a66..a14be68fcbb5 100644 --- a/ui/surface/transport_dib.h +++ b/ui/surface/transport_dib.h @@ -17,8 +17,6 @@ #include #endif -#include - class SkCanvas; // ----------------------------------------------------------------------------- @@ -73,7 +71,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. - std::unique_ptr GetPlatformCanvas(int w, int h, bool opaque); + SkCanvas* GetPlatformCanvas(int w, int h, bool opaque); // 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_posix.cc b/ui/surface/transport_dib_posix.cc index 8beba1f7e5cf..da370c96698e 100644 --- a/ui/surface/transport_dib_posix.cc +++ b/ui/surface/transport_dib_posix.cc @@ -58,9 +58,7 @@ bool TransportDIB::is_valid_handle(Handle dib) { return base::SharedMemory::IsHandleValid(dib); } -std::unique_ptr TransportDIB::GetPlatformCanvas(int w, - int h, - bool opaque) { +SkCanvas* TransportDIB::GetPlatformCanvas(int w, int h, bool opaque) { if ((!memory() && !Map()) || !VerifyCanvasSize(w, h)) return NULL; return skia::CreatePlatformCanvas(w, h, opaque, diff --git a/ui/surface/transport_dib_win.cc b/ui/surface/transport_dib_win.cc index 61f5a1b24295..190065b9ded3 100644 --- a/ui/surface/transport_dib_win.cc +++ b/ui/surface/transport_dib_win.cc @@ -58,9 +58,8 @@ bool TransportDIB::is_valid_handle(Handle dib) { return dib.IsValid(); } -std::unique_ptr TransportDIB::GetPlatformCanvas(int w, - int h, - bool opaque) { +SkCanvas* TransportDIB::GetPlatformCanvas(int w, int h, + bool opaque) { // This DIB already mapped the file into this process, but PlatformCanvas // will map it again. DCHECK(!memory()) << "Mapped file twice in the same process."; @@ -68,7 +67,7 @@ std::unique_ptr TransportDIB::GetPlatformCanvas(int w, // We can't check the canvas size before mapping, but it's safe because // Windows will fail to map the section if the dimensions of the canvas // are too large. - std::unique_ptr canvas = skia::CreatePlatformCanvas( + SkCanvas* canvas = skia::CreatePlatformCanvas( w, h, opaque, shared_memory_.handle().GetHandle(), skia::RETURN_NULL_ON_FAILURE); diff --git a/ui/views/border_unittest.cc b/ui/views/border_unittest.cc index ab428df65e68..c9b5b6c033f3 100644 --- a/ui/views/border_unittest.cc +++ b/ui/views/border_unittest.cc @@ -132,7 +132,7 @@ class BorderTest : public ViewsTestBase { view_->SetSize(gfx::Size(100, 50)); // The canvas should be much bigger than the view. sk_canvas_.reset(new MockCanvas(1000, 500)); - canvas_.reset(new gfx::Canvas(sk_canvas_.get(), 1.0f)); + canvas_.reset(new gfx::Canvas(sk_canvas_, 1.0f)); } void TearDown() override { @@ -145,7 +145,7 @@ class BorderTest : public ViewsTestBase { protected: std::unique_ptr view_; - std::unique_ptr sk_canvas_; + sk_sp sk_canvas_; std::unique_ptr canvas_; };