aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCary Clark <caryclark@google.com>2018-09-05 18:41:40 +0000
committerSkia Commit-Bot <skia-commit-bot@chromium.org>2018-09-05 18:41:45 +0000
commita24712e4dc5bf1bf676d997ef7405891cbddffb0 (patch)
tree48e21881dea1694b9d9873d799463c4caf99bcf0
parent469dd659a517eac9b5691140b1dfa400e6dd269b (diff)
downloadplatform_external_skqp-a24712e4dc5bf1bf676d997ef7405891cbddffb0.tar.gz
platform_external_skqp-a24712e4dc5bf1bf676d997ef7405891cbddffb0.tar.bz2
platform_external_skqp-a24712e4dc5bf1bf676d997ef7405891cbddffb0.zip
Revert "makeSurface defaults to raster"
This reverts commit 29a4a684af2525d78a1090fba2d3dea2b6a59fc7. Reason for revert: some configs fail Original change's description: > makeSurface defaults to raster > > Rather that returning nullptr for a recording > canvas, return a raster canvas instead. > > R=​reed@google.com,robertphillips@google.com > > Bug: skia: > Change-Id: I211d8ef368b9aec6d14cc72d1652ac6a03f3fa7b > Reviewed-on: https://skia-review.googlesource.com/151666 > Commit-Queue: Cary Clark <caryclark@skia.org> > Reviewed-by: Robert Phillips <robertphillips@google.com> TBR=robertphillips@google.com,reed@google.com,caryclark@skia.org Change-Id: I82d2c3e4589a2ca8523bbf86884ed68b1431631d No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/151824 Reviewed-by: Cary Clark <caryclark@google.com> Commit-Queue: Cary Clark <caryclark@google.com>
-rw-r--r--dm/DMSrcSink.cpp3
-rw-r--r--gm/bleed.cpp4
-rw-r--r--gm/complexclip_blur_tiled.cpp2
-rw-r--r--gm/drawatlas.cpp2
-rw-r--r--gm/drawatlascolor.cpp2
-rw-r--r--gm/drawbitmaprect.cpp2
-rw-r--r--gm/dstreadshuffle.cpp14
-rw-r--r--gm/image.cpp2
-rw-r--r--gm/imagealphathreshold.cpp2
-rw-r--r--gm/imageblurclampmode.cpp2
-rw-r--r--gm/imageblurrepeatmode.cpp2
-rw-r--r--gm/imagefilters.cpp2
-rw-r--r--gm/imagemakewithfilter.cpp2
-rw-r--r--gm/lattice.cpp2
-rw-r--r--gm/lcdblendmodes.cpp2
-rw-r--r--gm/localmatriximagefilter.cpp2
-rw-r--r--gm/localmatriximageshader.cpp2
-rw-r--r--gm/localmatrixshader.cpp2
-rw-r--r--gm/multipicturedraw.cpp2
-rw-r--r--gm/ninepatchstretch.cpp2
-rw-r--r--gm/path_stroke_with_zero_length.cpp6
-rw-r--r--gm/perspshaders.cpp2
-rw-r--r--gm/shadermaskfilter.cpp5
-rw-r--r--gm/shapes_as_paths.cpp3
-rw-r--r--gm/srcmode.cpp1
-rw-r--r--gm/surface.cpp6
-rw-r--r--gm/textblobgeometrychange.cpp2
-rw-r--r--gm/textblobrandomfont.cpp2
-rw-r--r--samplecode/SampleFilterQuality.cpp10
-rw-r--r--src/core/SkCanvas.cpp9
-rw-r--r--tools/sk_tool_utils.cpp8
-rw-r--r--tools/sk_tool_utils.h3
32 files changed, 76 insertions, 36 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 620f2a4f5b..04d3b55e16 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1901,6 +1901,9 @@ Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
// This lets our ultimate Sink determine the best kind of surface.
// E.g., if it's a GpuSink, the surfaces and images are textures.
auto s = canvas->makeSurface(info);
+ if (!s) {
+ s = SkSurface::MakeRaster(info); // Some canvases can't create surfaces.
+ }
surfaces.push_back(s);
SkCanvas* c = s->getCanvas();
c->translate(SkIntToScalar(-i * fW),
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index b5497c60b5..f7d582f1ac 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -457,7 +457,7 @@ static sk_sp<SkImage> make_image(SkCanvas* canvas, SkRect* srcR) {
// produce different mipmap filtering when we have an odd sized texture.
const int N = 10 + 2 + 8 + 2 + 10;
SkImageInfo info = SkImageInfo::MakeN32Premul(N, N);
- auto surface = canvas->makeSurface(info);
+ auto surface = sk_tool_utils::makeSurface(canvas, info);
SkCanvas* c = surface->getCanvas();
SkRect r = SkRect::MakeIWH(info.width(), info.height());
SkPaint paint;
@@ -489,7 +489,7 @@ DEF_SIMPLE_GM(bleed_downscale, canvas, 360, 240) {
canvas->save();
for (auto quality : qualities) {
paint.setFilterQuality(quality);
- auto surf = canvas->makeSurface(SkImageInfo::MakeN32Premul(1, 1));
+ auto surf = sk_tool_utils::makeSurface(canvas, SkImageInfo::MakeN32Premul(1, 1));
surf->getCanvas()->drawImageRect(img, src, SkRect::MakeWH(1, 1), &paint, constraint);
// now blow up the 1 pixel result
canvas->drawImageRect(surf->makeImageSnapshot(), SkRect::MakeWH(100, 100), nullptr);
diff --git a/gm/complexclip_blur_tiled.cpp b/gm/complexclip_blur_tiled.cpp
index b2899a5f8f..47234da55f 100644
--- a/gm/complexclip_blur_tiled.cpp
+++ b/gm/complexclip_blur_tiled.cpp
@@ -38,7 +38,7 @@ protected:
SkRect bounds = canvas->getLocalClipBounds();
int ts = SkScalarCeilToInt(tileSize);
SkImageInfo info = SkImageInfo::MakeN32Premul(ts, ts);
- auto tileSurface(canvas->makeSurface(info));
+ auto tileSurface(sk_tool_utils::makeSurface(canvas, info));
SkCanvas* tileCanvas = tileSurface->getCanvas();
for (SkScalar y = bounds.top(); y < bounds.bottom(); y += tileSize) {
for (SkScalar x = bounds.left(); x < bounds.right(); x += tileSize) {
diff --git a/gm/drawatlas.cpp b/gm/drawatlas.cpp
index 9d28e26d0c..a51413869b 100644
--- a/gm/drawatlas.cpp
+++ b/gm/drawatlas.cpp
@@ -17,7 +17,7 @@
class DrawAtlasGM : public skiagm::GM {
static sk_sp<SkImage> MakeAtlas(SkCanvas* caller, const SkRect& target) {
SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
- auto surface(caller->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(caller, info));
SkCanvas* canvas = surface->getCanvas();
// draw red everywhere, but we don't expect to see it in the draw, testing the notion
// that drawAtlas draws a subset-region of the atlas.
diff --git a/gm/drawatlascolor.cpp b/gm/drawatlascolor.cpp
index 253d50d26d..3122777a3b 100644
--- a/gm/drawatlascolor.cpp
+++ b/gm/drawatlascolor.cpp
@@ -20,7 +20,7 @@ static sk_sp<SkImage> make_atlas(SkCanvas* caller, int atlasSize) {
const int kBlockSize = atlasSize/2;
SkImageInfo info = SkImageInfo::MakeN32Premul(atlasSize, atlasSize);
- auto surface(caller->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(caller, info));
SkCanvas* canvas = surface->getCanvas();
SkPaint paint;
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index 8549cb6940..77125c5e7e 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -35,7 +35,7 @@ static SkBitmap make_chessbm(int w, int h) {
static sk_sp<SkImage> makebm(SkCanvas* origCanvas, SkBitmap* resultBM, int w, int h) {
SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
- auto surface(origCanvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(origCanvas, info));
SkCanvas* canvas = surface->getCanvas();
canvas->clear(SK_ColorTRANSPARENT);
diff --git a/gm/dstreadshuffle.cpp b/gm/dstreadshuffle.cpp
index 90c44b3a8d..c4c19fcd4e 100644
--- a/gm/dstreadshuffle.cpp
+++ b/gm/dstreadshuffle.cpp
@@ -154,6 +154,20 @@ protected:
canvas->imageInfo().refColorSpace());
}
auto surf = canvas->makeSurface(info);
+ if (!surf) {
+ // Fall back to raster. Raster supports only one of the 8 bit per-channel RGBA or BGRA
+ // formats. This fall back happens when running with --preAbandonGpuContext.
+ if ((info.colorType() == kRGBA_8888_SkColorType ||
+ info.colorType() == kBGRA_8888_SkColorType) &&
+ info.colorType() != kN32_SkColorType) {
+ info = SkImageInfo::Make(35, 35,
+ kN32_SkColorType,
+ canvas->imageInfo().alphaType(),
+ canvas->imageInfo().refColorSpace());
+ }
+ surf = SkSurface::MakeRaster(info);
+ SkASSERT(surf);
+ }
canvas->scale(5.f, 5.f);
canvas->translate(67.f, 10.f);
DrawHairlines(surf->getCanvas());
diff --git a/gm/image.cpp b/gm/image.cpp
index 1a7b89012b..1e3edc3292 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -421,7 +421,7 @@ static sk_sp<SkImage> serial_deserial(SkImage* img) {
DEF_SIMPLE_GM(image_subset, canvas, 440, 220) {
SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200, nullptr);
- auto surf = canvas->makeSurface(info, nullptr);
+ auto surf = sk_tool_utils::makeSurface(canvas, info, nullptr);
auto img = make_lazy_image(surf.get());
if (!img) {
return;
diff --git a/gm/imagealphathreshold.cpp b/gm/imagealphathreshold.cpp
index 2ae358d278..4bdf6eb5a2 100644
--- a/gm/imagealphathreshold.cpp
+++ b/gm/imagealphathreshold.cpp
@@ -104,7 +104,7 @@ static sk_sp<SkSurface> make_color_matching_surface(SkCanvas* canvas, int width,
SkImageInfo info = SkImageInfo::Make(width, height, ct, at, std::move(cs));
- return canvas->makeSurface(info);
+ return sk_tool_utils::makeSurface(canvas, info);
}
class ImageAlphaThresholdSurfaceGM : public skiagm::GM {
diff --git a/gm/imageblurclampmode.cpp b/gm/imageblurclampmode.cpp
index 3f04409013..f16f01db37 100644
--- a/gm/imageblurclampmode.cpp
+++ b/gm/imageblurclampmode.cpp
@@ -12,7 +12,7 @@
static sk_sp<SkImage> make_image(SkCanvas* canvas) {
SkImageInfo info = SkImageInfo::MakeN32Premul(250, 200);
- auto surface = canvas->makeSurface(info);
+ auto surface = sk_tool_utils::makeSurface(canvas, info);
SkCanvas* c = surface->getCanvas();
SkPaint paint;
paint.setAntiAlias(true);
diff --git a/gm/imageblurrepeatmode.cpp b/gm/imageblurrepeatmode.cpp
index 592328186f..27465aaa51 100644
--- a/gm/imageblurrepeatmode.cpp
+++ b/gm/imageblurrepeatmode.cpp
@@ -12,7 +12,7 @@
static sk_sp<SkImage> make_image(SkCanvas* canvas, int direction) {
SkImageInfo info = SkImageInfo::MakeN32Premul(250, 200);
- auto surface = canvas->makeSurface(info);
+ auto surface = sk_tool_utils::makeSurface(canvas, info);
SkCanvas* c = surface->getCanvas();
SkPaint paint;
paint.setAntiAlias(true);
diff --git a/gm/imagefilters.cpp b/gm/imagefilters.cpp
index 6ed346f7d2..bc33a57e8f 100644
--- a/gm/imagefilters.cpp
+++ b/gm/imagefilters.cpp
@@ -70,7 +70,7 @@ DEF_SIMPLE_GM(imagefilters_xfermodes, canvas, 480, 480) {
static sk_sp<SkImage> make_image(SkCanvas* canvas) {
const SkImageInfo info = SkImageInfo::MakeS32(100, 100, kPremul_SkAlphaType);
- auto surface(canvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(canvas, info));
surface->getCanvas()->drawRect(SkRect::MakeXYWH(25, 25, 50, 50), SkPaint());
return surface->makeImageSnapshot();
}
diff --git a/gm/imagemakewithfilter.cpp b/gm/imagemakewithfilter.cpp
index dc7609815c..9805a0ba09 100644
--- a/gm/imagemakewithfilter.cpp
+++ b/gm/imagemakewithfilter.cpp
@@ -70,7 +70,7 @@ protected:
canvas->translate(MARGIN, MARGIN);
- sk_sp<SkSurface> surface = canvas->makeSurface(info);
+ sk_sp<SkSurface> surface = sk_tool_utils::makeSurface(canvas, info);
sk_tool_utils::draw_checkerboard(surface->getCanvas());
sk_sp<SkImage> source = surface->makeImageSnapshot();
diff --git a/gm/lattice.cpp b/gm/lattice.cpp
index 05a51dd28a..b2809105bc 100644
--- a/gm/lattice.cpp
+++ b/gm/lattice.cpp
@@ -12,7 +12,7 @@
static sk_sp<SkSurface> make_surface(SkCanvas* root, int N, int padLeft, int padTop,
int padRight, int padBottom) {
SkImageInfo info = SkImageInfo::MakeN32Premul(N + padLeft + padRight, N + padTop + padBottom);
- return root->makeSurface(info);
+ return sk_tool_utils::makeSurface(root, info);
}
static sk_sp<SkImage> make_image(SkCanvas* root, int* xDivs, int* yDivs, int padLeft, int padTop,
diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp
index 72b1ce1888..1627654ffc 100644
--- a/gm/lcdblendmodes.cpp
+++ b/gm/lcdblendmodes.cpp
@@ -62,7 +62,7 @@ protected:
canvas->drawRect(r, p);
SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
- auto surface(canvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(canvas, info));
SkCanvas* surfCanvas = surface->getCanvas();
this->drawColumn(surfCanvas, SK_ColorBLACK, SK_ColorWHITE, false);
diff --git a/gm/localmatriximagefilter.cpp b/gm/localmatriximagefilter.cpp
index 66ef2a6e42..8280c07b02 100644
--- a/gm/localmatriximagefilter.cpp
+++ b/gm/localmatriximagefilter.cpp
@@ -17,7 +17,7 @@
static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
- auto surface(rootCanvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(rootCanvas, info));
SkPaint paint;
paint.setAntiAlias(true);
diff --git a/gm/localmatriximageshader.cpp b/gm/localmatriximageshader.cpp
index d87cb078fa..b041c70224 100644
--- a/gm/localmatriximageshader.cpp
+++ b/gm/localmatriximageshader.cpp
@@ -13,7 +13,7 @@
static sk_sp<SkImage> make_image(SkCanvas* rootCanvas, SkColor color) {
SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
- auto surface(rootCanvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(rootCanvas, info));
SkPaint paint;
paint.setAntiAlias(true);
diff --git a/gm/localmatrixshader.cpp b/gm/localmatrixshader.cpp
index b4d73427ae..bbd2775b7c 100644
--- a/gm/localmatrixshader.cpp
+++ b/gm/localmatrixshader.cpp
@@ -14,7 +14,7 @@
static sk_sp<SkImage> make_image(SkCanvas* rootCanvas) {
static constexpr SkScalar kSize = 50;
SkImageInfo info = SkImageInfo::MakeN32Premul(kSize, kSize);
- auto surface = rootCanvas->makeSurface(info);
+ auto surface = sk_tool_utils::makeSurface(rootCanvas, info);
SkPaint p;
p.setAntiAlias(true);
diff --git a/gm/multipicturedraw.cpp b/gm/multipicturedraw.cpp
index 7a6bda0785..3879fe7de7 100644
--- a/gm/multipicturedraw.cpp
+++ b/gm/multipicturedraw.cpp
@@ -241,7 +241,7 @@ static sk_sp<SkPicture> make_sierpinski_picture() {
static sk_sp<SkSurface> create_compat_surface(SkCanvas* canvas, int width, int height) {
SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
- return canvas->makeSurface(info);
+ return sk_tool_utils::makeSurface(canvas, info);
}
// This class stores the information required to compose all the result
diff --git a/gm/ninepatchstretch.cpp b/gm/ninepatchstretch.cpp
index d59189905d..1644c2cae2 100644
--- a/gm/ninepatchstretch.cpp
+++ b/gm/ninepatchstretch.cpp
@@ -11,7 +11,7 @@
static sk_sp<SkSurface> make_surface(SkCanvas* root, int N) {
SkImageInfo info = SkImageInfo::MakeN32Premul(N, N);
- return root->makeSurface(info);
+ return sk_tool_utils::makeSurface(root, info);
}
static sk_sp<SkImage> make_image(SkCanvas* root, SkIRect* center) {
diff --git a/gm/path_stroke_with_zero_length.cpp b/gm/path_stroke_with_zero_length.cpp
index 01c5467fb8..3cb789f0ac 100644
--- a/gm/path_stroke_with_zero_length.cpp
+++ b/gm/path_stroke_with_zero_length.cpp
@@ -123,6 +123,9 @@ static void draw_zero_length_capped_paths(SkCanvas* canvas, bool aa) {
SkImageInfo info = canvas->imageInfo().makeWH(kCellWidth, kCellHeight);
auto surface = canvas->makeSurface(info);
+ if (!surface) {
+ surface = SkSurface::MakeRasterN32Premul(kCellWidth, kCellHeight);
+ }
SkPaint paint;
paint.setColor(SK_ColorWHITE);
@@ -180,6 +183,9 @@ static void draw_zero_length_capped_paths_dbl_contour(SkCanvas* canvas, bool aa)
SkImageInfo info = canvas->imageInfo().makeWH(kCellWidth, kCellHeight);
auto surface = canvas->makeSurface(info);
+ if (!surface) {
+ surface = SkSurface::MakeRasterN32Premul(kCellWidth, kCellHeight);
+ }
SkPaint paint;
paint.setColor(SK_ColorWHITE);
diff --git a/gm/perspshaders.cpp b/gm/perspshaders.cpp
index 91114a5726..31c48f2896 100644
--- a/gm/perspshaders.cpp
+++ b/gm/perspshaders.cpp
@@ -15,7 +15,7 @@
static sk_sp<SkImage> make_image(SkCanvas* origCanvas, int w, int h) {
SkImageInfo info = SkImageInfo::MakeN32Premul(w, h);
- auto surface(origCanvas->makeSurface(info));
+ auto surface(sk_tool_utils::makeSurface(origCanvas, info));
SkCanvas* canvas = surface->getCanvas();
sk_tool_utils::draw_checkerboard(canvas, SK_ColorRED, SK_ColorGREEN, w/10);
diff --git a/gm/shadermaskfilter.cpp b/gm/shadermaskfilter.cpp
index 8d35b24606..83c95f41b4 100644
--- a/gm/shadermaskfilter.cpp
+++ b/gm/shadermaskfilter.cpp
@@ -170,7 +170,7 @@ DEF_SIMPLE_GM(combinemaskfilter, canvas, 560, 510) {
#include "SkMaskFilter.h"
static sk_sp<SkImage> make_circle_image(SkCanvas* canvas, SkScalar radius, int margin) {
const int n = SkScalarCeilToInt(radius) * 2 + margin * 2;
- auto surf = canvas->makeSurface(SkImageInfo::MakeN32Premul(n, n));
+ auto surf = sk_tool_utils::makeSurface(canvas, SkImageInfo::MakeN32Premul(n, n));
SkPaint paint;
paint.setAntiAlias(true);
surf->getCanvas()->drawCircle(n * 0.5f, n * 0.5f, radius, paint);
@@ -233,7 +233,8 @@ DEF_SIMPLE_GM(shadermaskfilter_localmatrix, canvas, 1500, 1000) {
using ShaderMakerT = sk_sp<SkShader>(*)(SkCanvas*, const SkMatrix& lm);
static const ShaderMakerT gShaderMakers[] = {
[](SkCanvas* canvas, const SkMatrix& lm) -> sk_sp<SkShader> {
- auto surface = canvas->makeSurface(SkImageInfo::MakeN32Premul(kSize, kSize));
+ auto surface = sk_tool_utils::makeSurface(canvas,
+ SkImageInfo::MakeN32Premul(kSize, kSize));
draw_mask(surface->getCanvas());
return surface->makeImageSnapshot()->makeShader(SkShader::kClamp_TileMode,
SkShader::kClamp_TileMode, &lm);
diff --git a/gm/shapes_as_paths.cpp b/gm/shapes_as_paths.cpp
index 4b092c8788..4ad760dcc7 100644
--- a/gm/shapes_as_paths.cpp
+++ b/gm/shapes_as_paths.cpp
@@ -150,6 +150,9 @@ static void draw_rect_geom_diff_grid(SkCanvas* canvas, ShapeDrawFunc f1, ShapeDr
SkImageInfo info = canvas->imageInfo().makeWH(50, 50);
auto surface = canvas->makeSurface(info);
+ if (!surface) {
+ surface = SkSurface::MakeRasterN32Premul(50, 50);
+ }
for (const SkRect& rect : kRects) {
for (const auto& style : kStyles) {
diff --git a/gm/srcmode.cpp b/gm/srcmode.cpp
index b984e39d08..21cf9797f5 100644
--- a/gm/srcmode.cpp
+++ b/gm/srcmode.cpp
@@ -121,6 +121,7 @@ protected:
}
sk_sp<SkSurface> surface = callNewSurface ? canvas->makeSurface(info) : nullptr;
if (nullptr == surface) {
+ // picture canvas will return null, so fall-back to raster
surface = SkSurface::MakeRaster(info);
}
return surface;
diff --git a/gm/surface.cpp b/gm/surface.cpp
index d97c25d64a..30a7844742 100644
--- a/gm/surface.cpp
+++ b/gm/surface.cpp
@@ -124,7 +124,7 @@ protected:
void onDraw(SkCanvas* canvas) override {
SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
- auto surf(canvas->makeSurface(info, nullptr));
+ auto surf(sk_tool_utils::makeSurface(canvas, info, nullptr));
drawInto(surf->getCanvas());
sk_sp<SkImage> image(surf->makeImageSnapshot());
@@ -149,7 +149,7 @@ DEF_GM( return new NewSurfaceGM )
DEF_SIMPLE_GM(copy_on_write_retain, canvas, 256, 256) {
const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256);
- sk_sp<SkSurface> surf = canvas->makeSurface(info);
+ sk_sp<SkSurface> surf = sk_tool_utils::makeSurface(canvas, info);
surf->getCanvas()->clear(SK_ColorRED);
// its important that image survives longer than the next draw, so the surface will see
@@ -167,7 +167,7 @@ DEF_SIMPLE_GM(copy_on_write_retain, canvas, 256, 256) {
DEF_SIMPLE_GM(copy_on_write_savelayer, canvas, 256, 256) {
const SkImageInfo info = SkImageInfo::MakeN32Premul(256, 256);
- sk_sp<SkSurface> surf = canvas->makeSurface(info);
+ sk_sp<SkSurface> surf = sk_tool_utils::makeSurface(canvas, info);
surf->getCanvas()->clear(SK_ColorRED);
// its important that image survives longer than the next draw, so the surface will see
// an outstanding image, and have to decide if it should retain or discard those pixels
diff --git a/gm/textblobgeometrychange.cpp b/gm/textblobgeometrychange.cpp
index c4175369f8..57f3962817 100644
--- a/gm/textblobgeometrychange.cpp
+++ b/gm/textblobgeometrychange.cpp
@@ -45,7 +45,7 @@ protected:
SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200);
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
- auto surface = canvas->makeSurface(info, &props);
+ auto surface = sk_tool_utils::makeSurface(canvas, info, &props);
SkCanvas* c = surface->getCanvas();
// LCD text on white background
diff --git a/gm/textblobrandomfont.cpp b/gm/textblobrandomfont.cpp
index 4ee1d777ff..58749e9276 100644
--- a/gm/textblobrandomfont.cpp
+++ b/gm/textblobrandomfont.cpp
@@ -106,7 +106,7 @@ protected:
kPremul_SkAlphaType,
canvas->imageInfo().refColorSpace());
SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
- auto surface(canvas->makeSurface(info, &props));
+ auto surface(sk_tool_utils::makeSurface(canvas, info, &props));
if (!surface) {
const char* text = "This test requires a surface";
size_t len = strlen(text);
diff --git a/samplecode/SampleFilterQuality.cpp b/samplecode/SampleFilterQuality.cpp
index b30086301e..a686efbdd2 100644
--- a/samplecode/SampleFilterQuality.cpp
+++ b/samplecode/SampleFilterQuality.cpp
@@ -17,6 +17,14 @@
#include "SkRandom.h"
#include "SkTime.h"
+static sk_sp<SkSurface> make_surface(SkCanvas* canvas, const SkImageInfo& info) {
+ auto surface = canvas->makeSurface(info);
+ if (!surface) {
+ surface = SkSurface::MakeRaster(info);
+ }
+ return surface;
+}
+
static sk_sp<SkShader> make_shader(const SkRect& bounds) {
sk_sp<SkImage> image(GetResourceAsImage("images/mandrill_128.png"));
return image ? image->makeShader() : nullptr;
@@ -209,7 +217,7 @@ protected:
// scale up so we don't clip rotations
SkImageInfo info = SkImageInfo::MakeN32(fImage->width() * 2, fImage->height() * 2,
kOpaque_SkAlphaType);
- surface = canvas->makeSurface(info);
+ surface = make_surface(canvas, info);
canvas = surface->getCanvas();
canvas->drawColor(SK_ColorWHITE);
size.set(info.width(), info.height());
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index d1e692f6cc..9566a34b43 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1158,14 +1158,7 @@ sk_sp<SkSurface> SkCanvas::makeSurface(const SkImageInfo& info, const SkSurfaceP
sk_sp<SkSurface> SkCanvas::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props) {
SkBaseDevice* dev = this->getDevice();
- sk_sp<SkSurface> result = nullptr;
- if (dev) {
- result = dev->makeSurface(info, props);
- }
- if (!result) {
- result = SkSurface::MakeRaster(info, 0, &props);
- }
- return result;
+ return dev ? dev->makeSurface(info, props) : nullptr;
}
SkImageInfo SkCanvas::imageInfo() const {
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 2dbd834845..9bff574c93 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -626,4 +626,12 @@ void copy_to_g8(SkBitmap* dst, const SkBitmap& src) {
equal_pixels(pm0, pm1, maxDiff, respectColorSpaces);
}
+ sk_sp<SkSurface> makeSurface(SkCanvas* canvas, const SkImageInfo& info,
+ const SkSurfaceProps* props) {
+ auto surf = canvas->makeSurface(info, props);
+ if (!surf) {
+ surf = SkSurface::MakeRaster(info, props);
+ }
+ return surf;
+ }
} // namespace sk_tool_utils
diff --git a/tools/sk_tool_utils.h b/tools/sk_tool_utils.h
index 92aea694ef..27fcc00f17 100644
--- a/tools/sk_tool_utils.h
+++ b/tools/sk_tool_utils.h
@@ -118,6 +118,9 @@ namespace sk_tool_utils {
SkBitmap create_string_bitmap(int w, int h, SkColor c, int x, int y,
int textSize, const char* str);
+ // If the canvas does't make a surface (e.g. recording), make a raster surface
+ sk_sp<SkSurface> makeSurface(SkCanvas*, const SkImageInfo&, const SkSurfaceProps* = nullptr);
+
// A helper for inserting a drawtext call into a SkTextBlobBuilder
void add_to_text_blob_w_len(SkTextBlobBuilder* builder, const char* text, size_t len,
const SkPaint& origPaint, SkScalar x, SkScalar y);