blob: 6d26d7a85ccde2c25639c8e395b1b0d568fdc0b4 [file] [log] [blame]
Matt Sarett2e61b182017-05-09 12:46:50 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "SkImage.h"
Mike Reed7fcfb622018-02-09 13:26:46 -050010#include "SkImageInfoPriv.h"
Matt Sarett2e61b182017-05-09 12:46:50 -040011#include "SkJpegEncoder.h"
12
13#include "Resources.h"
14
15namespace skiagm {
16
17static inline void read_into_pixmap(SkPixmap* dst, SkImageInfo dstInfo, void* dstPixels,
18 sk_sp<SkImage> src) {
19 dst->reset(dstInfo, dstPixels, dstInfo.minRowBytes());
20 src->readPixels(*dst, 0, 0, SkImage::CachingHint::kDisallow_CachingHint);
21}
22
23static inline sk_sp<SkImage> encode_pixmap_and_make_image(const SkPixmap& src,
24 SkJpegEncoder::AlphaOption alphaOption, SkTransferFunctionBehavior blendBehavior) {
25 SkDynamicMemoryWStream dst;
26 SkJpegEncoder::Options options;
27 options.fAlphaOption = alphaOption;
28 options.fBlendBehavior = blendBehavior;
29 SkJpegEncoder::Encode(&dst, src, options);
30 return SkImage::MakeFromEncoded(dst.detachAsData());
31}
32
33class EncodeJpegAlphaOptsGM : public GM {
34public:
35 EncodeJpegAlphaOptsGM() {}
36
37protected:
38 SkString onShortName() override {
39 return SkString("encode-alpha-jpeg");
40 }
41
42 SkISize onISize() override {
43 return SkISize::Make(400, 200);
44 }
45
46 void onDraw(SkCanvas* canvas) override {
Hal Canaryc465d132017-12-08 10:21:31 -050047 sk_sp<SkImage> srcImg = GetResourceAsImage("images/rainbow-gradient.png");
Matt Sarett2e61b182017-05-09 12:46:50 -040048 fStorage.reset(srcImg->width() * srcImg->height() *
49 SkColorTypeBytesPerPixel(kRGBA_F16_SkColorType));
50
51 SkPixmap src;
52 SkImageInfo info = SkImageInfo::MakeN32Premul(srcImg->width(), srcImg->height(),
53 canvas->imageInfo().colorSpace() ? SkColorSpace::MakeSRGB() : nullptr);
54 read_into_pixmap(&src, info, fStorage.get(), srcImg);
55
56 SkTransferFunctionBehavior behavior = canvas->imageInfo().colorSpace() ?
57 SkTransferFunctionBehavior::kRespect : SkTransferFunctionBehavior::kIgnore;
58
59 // Encode 8888 premul.
60 sk_sp<SkImage> img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore,
61 behavior);
62 sk_sp<SkImage> img1 = encode_pixmap_and_make_image(src,
63 SkJpegEncoder::AlphaOption::kBlendOnBlack, behavior);
64 canvas->drawImage(img0, 0.0f, 0.0f);
65 canvas->drawImage(img1, 0.0f, 100.0f);
66
67 // Encode 8888 unpremul
68 info = info.makeAlphaType(kUnpremul_SkAlphaType);
69 read_into_pixmap(&src, info, fStorage.get(), srcImg);
70 img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
71 img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
72 behavior);
73 canvas->drawImage(img0, 100.0f, 0.0f);
74 canvas->drawImage(img1, 100.0f, 100.0f);
75
76 if (canvas->imageInfo().colorSpace()) {
77 // Encode F16 premul
78 info = SkImageInfo::Make(srcImg->width(), srcImg->height(), kRGBA_F16_SkColorType,
79 kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear());
80 read_into_pixmap(&src, info, fStorage.get(), srcImg);
81 img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
82 img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
83 behavior);
84 canvas->drawImage(img0, 200.0f, 0.0f);
85 canvas->drawImage(img1, 200.0f, 100.0f);
86
87 // Encode F16 unpremul
88 info = info.makeAlphaType(kUnpremul_SkAlphaType);
89 read_into_pixmap(&src, info, fStorage.get(), srcImg);
90 img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore, behavior);
91 img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack,
92 behavior);
93 canvas->drawImage(img0, 300.0f, 0.0f);
94 canvas->drawImage(img1, 300.0f, 100.0f);
95 }
96 }
97
98private:
99 SkAutoTMalloc<uint8_t> fStorage;
100
101 typedef GM INHERITED;
102};
103
104DEF_GM( return new EncodeJpegAlphaOptsGM; )
105
106};