diff options
author | 2017-02-07 11:23:28 -0500 | |
---|---|---|
committer | 2017-02-07 16:58:07 +0000 | |
commit | 041f7dfc577822f1e97721a865f86a9a02660cf9 (patch) | |
tree | e97779c04ea0d2059cbd6291de3cbfbf27c1cc61 /gm | |
parent | 2bb94e814726cbe8e0a6a5763e262a5ccea9313c (diff) |
Bring back SkImage::makeTextureImage
Ensures that an image is GPU backed on the passed-in GrContxt. The new
version requires a destination color space (intended usage of the image),
so we can make a proper decision about decoded format.
This reverts commit d263413a2a92cafe3fd3b051c67d00206c9a0e4d.
BUG=skia:
Change-Id: Ibccddbafc301779559592045ed5a5fa9264e7432
Reviewed-on: https://skia-review.googlesource.com/8116
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'gm')
-rw-r--r-- | gm/image.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/gm/image.cpp b/gm/image.cpp index 595a5ef628..1a4b712491 100644 --- a/gm/image.cpp +++ b/gm/image.cpp @@ -427,3 +427,84 @@ private: typedef skiagm::GM INHERITED; }; DEF_GM( return new ScaleGeneratorGM; ) + +DEF_SIMPLE_GM(new_texture_image, canvas, 225, 60) { + GrContext* context = nullptr; +#if SK_SUPPORT_GPU + context = canvas->getGrContext(); +#endif + if (!context) { + skiagm::GM::DrawGpuOnlyMessage(canvas); + return; + } + + auto render_image = [](SkCanvas* canvas) { + canvas->clear(SK_ColorBLUE); + SkPaint paint; + paint.setColor(SK_ColorRED); + canvas->drawRect(SkRect::MakeXYWH(10.f,10.f,10.f,10.f), paint); + paint.setColor(SK_ColorGREEN); + canvas->drawRect(SkRect::MakeXYWH(30.f,10.f,10.f,10.f), paint); + paint.setColor(SK_ColorYELLOW); + canvas->drawRect(SkRect::MakeXYWH(10.f,30.f,10.f,10.f), paint); + paint.setColor(SK_ColorCYAN); + canvas->drawRect(SkRect::MakeXYWH(30.f,30.f,10.f,10.f), paint); + }; + + static constexpr int kSize = 50; + SkBitmap bmp; + bmp.allocPixels(SkImageInfo::MakeS32(kSize, kSize, kPremul_SkAlphaType)); + SkCanvas bmpCanvas(bmp); + render_image(&bmpCanvas); + + std::function<sk_sp<SkImage>()> imageFactories[] = { + // Create sw raster image. + [bmp] { + return SkImage::MakeFromBitmap(bmp); + }, + // Create encoded image. + [bmp] { + sk_sp<SkData> src( + sk_tool_utils::EncodeImageToData(bmp, SkEncodedImageFormat::kPNG, 100)); + return SkImage::MakeFromEncoded(std::move(src)); + }, + // Create a picture image. + [render_image] { + SkPictureRecorder recorder; + SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kSize), SkIntToScalar(kSize)); + render_image(canvas); + sk_sp<SkColorSpace> srgbColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); + return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), + SkISize::Make(kSize, kSize), nullptr, nullptr, + SkImage::BitDepth::kU8, srgbColorSpace); + }, + // Create a texture image + [context, render_image]() -> sk_sp<SkImage> { + auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, + SkImageInfo::MakeS32(kSize, kSize, + kPremul_SkAlphaType))); + if (!surface) { + return nullptr; + } + render_image(surface->getCanvas()); + return surface->makeImageSnapshot(); + } + }; + + constexpr SkScalar kPad = 5.f; + canvas->translate(kPad, kPad); + for (auto factory : imageFactories) { + auto image(factory()); + if (!image) { + continue; + } + if (context) { + sk_sp<SkImage> texImage(image->makeTextureImage(context, + canvas->imageInfo().colorSpace())); + if (texImage) { + canvas->drawImage(texImage, 0, 0); + } + } + canvas->translate(image->width() + kPad, 0); + } +} |