1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkColorSpace.h" 11cb93a386Sopenharmony_ci#include "include/core/SkData.h" 12cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 13cb93a386Sopenharmony_ci#include "include/core/SkImageInfo.h" 14cb93a386Sopenharmony_ci#include "include/core/SkPixmap.h" 15cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 16cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 17cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 18cb93a386Sopenharmony_ci#include "include/core/SkString.h" 19cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 20cb93a386Sopenharmony_ci#include "include/encode/SkJpegEncoder.h" 21cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h" 22cb93a386Sopenharmony_ci#include "tools/Resources.h" 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cinamespace skiagm { 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_cistatic inline void read_into_pixmap(SkPixmap* dst, SkImageInfo dstInfo, void* dstPixels, 27cb93a386Sopenharmony_ci sk_sp<SkImage> src) { 28cb93a386Sopenharmony_ci dst->reset(dstInfo, dstPixels, dstInfo.minRowBytes()); 29cb93a386Sopenharmony_ci src->readPixels(nullptr, *dst, 0, 0, SkImage::CachingHint::kDisallow_CachingHint); 30cb93a386Sopenharmony_ci} 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cistatic inline sk_sp<SkImage> encode_pixmap_and_make_image(const SkPixmap& src, 33cb93a386Sopenharmony_ci SkJpegEncoder::AlphaOption alphaOption) { 34cb93a386Sopenharmony_ci SkDynamicMemoryWStream dst; 35cb93a386Sopenharmony_ci SkJpegEncoder::Options options; 36cb93a386Sopenharmony_ci options.fAlphaOption = alphaOption; 37cb93a386Sopenharmony_ci SkJpegEncoder::Encode(&dst, src, options); 38cb93a386Sopenharmony_ci return SkImage::MakeFromEncoded(dst.detachAsData()); 39cb93a386Sopenharmony_ci} 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ciclass EncodeJpegAlphaOptsGM : public GM { 42cb93a386Sopenharmony_cipublic: 43cb93a386Sopenharmony_ci EncodeJpegAlphaOptsGM() {} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ciprotected: 46cb93a386Sopenharmony_ci SkString onShortName() override { 47cb93a386Sopenharmony_ci return SkString("encode-alpha-jpeg"); 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci SkISize onISize() override { 51cb93a386Sopenharmony_ci return SkISize::Make(400, 200); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 55cb93a386Sopenharmony_ci sk_sp<SkImage> srcImg = GetResourceAsImage("images/rainbow-gradient.png"); 56cb93a386Sopenharmony_ci if (!srcImg) { 57cb93a386Sopenharmony_ci *errorMsg = "Could not load images/rainbow-gradient.png. " 58cb93a386Sopenharmony_ci "Did you forget to set the resourcePath?"; 59cb93a386Sopenharmony_ci return DrawResult::kFail; 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci fStorage.reset(srcImg->width() * srcImg->height() * 62cb93a386Sopenharmony_ci SkColorTypeBytesPerPixel(kRGBA_F16_SkColorType)); 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkPixmap src; 65cb93a386Sopenharmony_ci SkImageInfo info = SkImageInfo::MakeN32Premul(srcImg->width(), srcImg->height(), 66cb93a386Sopenharmony_ci canvas->imageInfo().colorSpace() ? SkColorSpace::MakeSRGB() : nullptr); 67cb93a386Sopenharmony_ci read_into_pixmap(&src, info, fStorage.get(), srcImg); 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci // Encode 8888 premul. 70cb93a386Sopenharmony_ci auto img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore); 71cb93a386Sopenharmony_ci auto img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack); 72cb93a386Sopenharmony_ci canvas->drawImage(img0, 0.0f, 0.0f); 73cb93a386Sopenharmony_ci canvas->drawImage(img1, 0.0f, 100.0f); 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci // Encode 8888 unpremul 76cb93a386Sopenharmony_ci info = info.makeAlphaType(kUnpremul_SkAlphaType); 77cb93a386Sopenharmony_ci read_into_pixmap(&src, info, fStorage.get(), srcImg); 78cb93a386Sopenharmony_ci img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore); 79cb93a386Sopenharmony_ci img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack); 80cb93a386Sopenharmony_ci canvas->drawImage(img0, 100.0f, 0.0f); 81cb93a386Sopenharmony_ci canvas->drawImage(img1, 100.0f, 100.0f); 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci // Encode F16 premul 84cb93a386Sopenharmony_ci info = SkImageInfo::Make(srcImg->width(), srcImg->height(), kRGBA_F16_SkColorType, 85cb93a386Sopenharmony_ci kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); 86cb93a386Sopenharmony_ci read_into_pixmap(&src, info, fStorage.get(), srcImg); 87cb93a386Sopenharmony_ci img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore); 88cb93a386Sopenharmony_ci img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack); 89cb93a386Sopenharmony_ci canvas->drawImage(img0, 200.0f, 0.0f); 90cb93a386Sopenharmony_ci canvas->drawImage(img1, 200.0f, 100.0f); 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci // Encode F16 unpremul 93cb93a386Sopenharmony_ci info = info.makeAlphaType(kUnpremul_SkAlphaType); 94cb93a386Sopenharmony_ci read_into_pixmap(&src, info, fStorage.get(), srcImg); 95cb93a386Sopenharmony_ci img0 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kIgnore); 96cb93a386Sopenharmony_ci img1 = encode_pixmap_and_make_image(src, SkJpegEncoder::AlphaOption::kBlendOnBlack); 97cb93a386Sopenharmony_ci canvas->drawImage(img0, 300.0f, 0.0f); 98cb93a386Sopenharmony_ci canvas->drawImage(img1, 300.0f, 100.0f); 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci return DrawResult::kOk; 101cb93a386Sopenharmony_ci } 102cb93a386Sopenharmony_ci 103cb93a386Sopenharmony_ciprivate: 104cb93a386Sopenharmony_ci SkAutoTMalloc<uint8_t> fStorage; 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci using INHERITED = GM; 107cb93a386Sopenharmony_ci}; 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ciDEF_GM( return new EncodeJpegAlphaOptsGM; ) 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci} // namespace skiagm 112