Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Unified Diff: gm/image.cpp

Issue 1487683004: Create an SkCodecImageGenerator (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | gyp/core.gyp » ('j') | src/ports/SkImageGenerator_skia.cpp » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/image.cpp
diff --git a/gm/image.cpp b/gm/image.cpp
index 991b4014f02aa3bfff0a2a3126a29f5210a21591..accdbd1670d099d89be0bc135ea8b8d28933be87 100644
--- a/gm/image.cpp
+++ b/gm/image.cpp
@@ -300,3 +300,122 @@ private:
typedef skiagm::GM INHERITED;
};
DEF_GM( return new ScalePixelsGM; )
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "SkImageGenerator.h"
+
+static SkImageInfo make_info(SkImage* img) {
+ return SkImageInfo::MakeN32Premul(img->width(), img->height());
+}
+
+class ImageGeneratorFromImage : public SkImageGenerator {
+public:
+ ImageGeneratorFromImage(SkImage* img) : INHERITED(make_info(img)), fImg(SkRef(img)) {}
+
+protected:
+ bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[],
+ int* ctableCount) override {
+ SkBitmap bm;
+ bm.installPixels(info, pixels, rowBytes);
+ bm.eraseColor(0);
+ SkCanvas canvas(bm);
+ canvas.drawImage(fImg, 0, 0, nullptr);
+ return true;
+ }
+
+private:
+ SkAutoTUnref<SkImage> fImg;
+
+ typedef SkImageGenerator INHERITED;
+};
+
+static SkImageGenerator* gen_raster(const SkImageInfo& info, GrContext*) {
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
+ draw_contents(surface->getCanvas());
+ SkAutoTUnref<SkImage> img(surface->newImageSnapshot());
+ return new ImageGeneratorFromImage(img);
+}
+
+static SkImageGenerator* gen_picture(const SkImageInfo& info, GrContext*) {
+ SkPictureRecorder recorder;
+ draw_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
+ SkAutoTUnref<SkPicture> pict(recorder.endRecording());
+ return SkImageGenerator::NewFromPicture(info.dimensions(), pict, nullptr, nullptr);
+}
+
+static SkImageGenerator* gen_png(const SkImageInfo& info, GrContext*) {
+ SkAutoTUnref<SkImage> image(make_raster(info, nullptr));
+ SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100));
+ return SkImageGenerator::NewFromEncoded(data);
+}
+
+static SkImageGenerator* gen_jpg(const SkImageInfo& info, GrContext*) {
+ SkAutoTUnref<SkImage> image(make_raster(info, nullptr));
+ SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kJPEG_Type, 100));
+ return SkImageGenerator::NewFromEncoded(data);
+}
+
+typedef SkImageGenerator* (*GeneratorMakerProc)(const SkImageInfo&, GrContext*);
+
+static void show_scaled_generator(SkCanvas* canvas, SkImageGenerator* gen) {
+ const SkImageInfo genInfo = gen->getInfo();
+
+ SkAutoCanvasRestore acr(canvas, true);
+
+ SkBitmap bm;
+ bm.allocPixels(genInfo);
+ if (gen->getPixels(bm.info(), bm.getPixels(), bm.rowBytes())) {
+ canvas->drawBitmap(bm, 0, 0, nullptr);
+ }
+ canvas->translate(110, 0);
+
+ const float scales[] = { 0.75f, 0.5f, 0.25f };
+ for (auto scale : scales) {
+ SkImageGenerator::SupportedSizes sizes;
+ if (gen->computeScaledDimensions(scale, &sizes)) {
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(sizes.fSizes[0].width(),
+ sizes.fSizes[0].height());
+ bm.allocPixels(info);
+ SkPixmap pmap;
+ bm.peekPixels(&pmap);
+ if (gen->generateScaledPixels(pmap)) {
+ canvas->drawBitmap(bm, 0, (genInfo.height() - info.height())/2, nullptr);
+ }
+ }
+ canvas->translate(100, 0);
+ }
+}
+
+class ScaleGeneratorGM : public skiagm::GM {
+public:
+ ScaleGeneratorGM() {}
+
+protected:
+ SkString onShortName() override {
+ return SkString("scale-generator");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(960, 1200);
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
+
+ const GeneratorMakerProc procs[] = {
+ gen_raster, gen_picture, gen_png, gen_jpg,
+ };
+ for (auto& proc : procs) {
+ SkAutoTDelete<SkImageGenerator> gen(proc(info, canvas->getGrContext()));
+ if (gen) {
+ show_scaled_generator(canvas, gen);
+ }
+ canvas->translate(0, 120);
+ }
+ }
+
+private:
+ typedef skiagm::GM INHERITED;
+};
+DEF_GM( return new ScaleGeneratorGM; )
« no previous file with comments | « no previous file | gyp/core.gyp » ('j') | src/ports/SkImageGenerator_skia.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698