Index: ui/gfx/canvas.cc |
diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc |
index 5f2bff9758d907a700e918c7ee3b4feec33fa91a..6acf55a30c0fcb950a20e200428a79c8214db08c 100644 |
--- a/ui/gfx/canvas.cc |
+++ b/ui/gfx/canvas.cc |
@@ -12,6 +12,7 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "third_party/skia/include/core/SkPath.h" |
#include "third_party/skia/include/core/SkRefCnt.h" |
+#include "third_party/skia/include/core/SkSurface.h" |
#include "third_party/skia/include/effects/SkGradientShader.h" |
#include "ui/gfx/font_list.h" |
#include "ui/gfx/geometry/insets_f.h" |
@@ -26,12 +27,25 @@ |
namespace gfx { |
+namespace { |
+ |
+sk_sp<SkSurface> CreateSurface(const Size& size, bool is_opaque) { |
+ // SkSurface cannot be zero-sized, but clients of Canvas sometimes request |
+ // that (and then later resize). |
+ int width = std::max(size.width(), 1); |
+ int height = std::max(size.height(), 1); |
+ SkAlphaType alpha = is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, alpha); |
+ return SkSurface::MakeRaster(info); |
+} |
+ |
+} // namespace |
+ |
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(); |
+ surface_ = CreateSurface(pixel_size, is_opaque); |
+ canvas_ = surface_->getCanvas(); |
#if !defined(USE_CAIRO) |
// skia::PlatformCanvas instances are initialized to 0 by Cairo, but |
@@ -46,8 +60,8 @@ 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()) {} |
+ surface_(CreateSurface({0, 0}, false)), |
+ canvas_(surface_->getCanvas()) {} |
Canvas::Canvas(SkCanvas* canvas, float image_scale) |
: image_scale_(image_scale), canvas_(canvas) { |
@@ -62,9 +76,8 @@ 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(); |
+ surface_ = CreateSurface(pixel_size, is_opaque); |
+ canvas_ = surface_->getCanvas(); |
SkScalar scale_scalar = SkFloatToScalar(image_scale); |
canvas_->scale(scale_scalar, scale_scalar); |