diff options
author | Cary Clark <caryclark@google.com> | 2018-09-05 18:41:40 +0000 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-09-05 18:41:45 +0000 |
commit | a24712e4dc5bf1bf676d997ef7405891cbddffb0 (patch) | |
tree | 48e21881dea1694b9d9873d799463c4caf99bcf0 | |
parent | 469dd659a517eac9b5691140b1dfa400e6dd269b (diff) | |
download | platform_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>
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); |