aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/encode-alpha-jpeg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gm/encode-alpha-jpeg.cpp')
-rw-r--r--gm/encode-alpha-jpeg.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/gm/encode-alpha-jpeg.cpp b/gm/encode-alpha-jpeg.cpp
new file mode 100644
index 0000000000..6686e78044
--- /dev/null
+++ b/gm/encode-alpha-jpeg.cpp
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gm.h"
+#include "SkImage.h"
+#include "SkJpegEncoder.h"
+
+#include "Resources.h"
+
+namespace skiagm {
+
+static inline void read_into_pixmap(SkPixmap* dst, SkImageInfo dstInfo, void* dstPixels,
+ sk_sp<SkImage> src) {
+ dst->reset(dstInfo, dstPixels, dstInfo.minRowBytes());
+ src->readPixels(*dst, 0, 0, SkImage::CachingHint::kDisallow_CachingHint);
+}
+
+static inline sk_sp<SkImage> encode_pixmap_and_make_image(const SkPixmap& src,
+ SkJpegEncoder::AlphaOption alphaOption, SkTransferFunctionBehavior blendBehavior) {
+ SkDynamicMemoryWStream dst;
+ SkJpegEncoder::Options options;
+ options.fAlphaOption = alphaOption;
+ options.fBlendBehavior = blendBehavior;
+ SkJpegEncoder::Encode(&dst, src, options);
+ return SkImage::MakeFromEncoded(dst.detachAsData());
+}
+
+class EncodeJpegAlphaOptsGM : public GM {
+public:
+ EncodeJpegAlphaOptsGM() {}
+
+protected:
+ SkString onShortName() override {
+ return SkString("encode-alpha-jpeg");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(400, 200);
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ sk_sp<SkImage> srcImg = GetResourceAsImage("rainbow-gradient.png");
+ fStorage.reset(srcImg->width() * srcImg->height() *
+ SkColorTypeBytesPerPixel(kRGBA_F16_SkColorType));
+
+ SkPixmap src;
+ SkImageInfo info = SkImageInfo::MakeN32Premul(srcImg->width(), srcImg->height(),
+ canvas->imageInfo().colorSpace() ? SkColorSpace::MakeSRGB() : nullptr);
+ read_into_pixmap(&src, info, fStorage.get(), srcImg);
+
+ SkTransferFunctionBehavior behavior = canvas->imageInfo().colorSpace() ?
+ SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore;
+
+ // Encode 8888 premul.
+ sk_sp<SkImage> img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore,
+ behavior);
+ sk_sp<SkImage> img1 = encode_pixmap_and_make_image(src,
+ SkJpegEncoder::AlphaOption::kBlendOnBlack, behavior);
+ canvas->drawImage(img0, 0.0f, 0.0f);
+ canvas->drawImage(img1, 0.0f, 100.0f);
+
+ // Encode 8888 unpremul
+ info = info.makeAlphaType(kUnpremul_SkAlphaType);
+ read_into_pixmap(&src, info, fStorage.get(), srcImg);
+ img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
+ img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
+ behavior);
+ canvas->drawImage(img0, 100.0f, 0.0f);
+ canvas->drawImage(img1, 100.0f, 100.0f);
+
+ if (canvas->imageInfo().colorSpace()) {
+ // Encode F16 premul
+ info = SkImageInfo::Make(srcImg->width(), srcImg->height(), kRGBA_F16_SkColorType,
+ kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear());
+ read_into_pixmap(&src, info, fStorage.get(), srcImg);
+ img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
+ img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
+ behavior);
+ canvas->drawImage(img0, 200.0f, 0.0f);
+ canvas->drawImage(img1, 200.0f, 100.0f);
+
+ // Encode F16 unpremul
+ info = info.makeAlphaType(kUnpremul_SkAlphaType);
+ read_into_pixmap(&src, info, fStorage.get(), srcImg);
+ img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
+ img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
+ behavior);
+ canvas->drawImage(img0, 300.0f, 0.0f);
+ canvas->drawImage(img1, 300.0f, 100.0f);
+ }
+ }
+
+private:
+ SkAutoTMalloc<uint8_t> fStorage;
+
+ typedef GM INHERITED;
+};
+
+DEF_GM( return new EncodeJpegAlphaOptsGM; )
+
+};