1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 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/SkBitmap.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkData.h" 12cb93a386Sopenharmony_ci#include "include/core/SkEncodedImageFormat.h" 13cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 14cb93a386Sopenharmony_ci#include "include/core/SkImageInfo.h" 15cb93a386Sopenharmony_ci#include "include/core/SkPixmap.h" 16cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 17cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 18cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 19cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 20cb93a386Sopenharmony_ci#include "include/core/SkString.h" 21cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 22cb93a386Sopenharmony_ci#include "include/encode/SkJpegEncoder.h" 23cb93a386Sopenharmony_ci#include "include/encode/SkPngEncoder.h" 24cb93a386Sopenharmony_ci#include "include/encode/SkWebpEncoder.h" 25cb93a386Sopenharmony_ci#include "tools/Resources.h" 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) || defined(SK_BUILD_FOR_WIN) \ 28cb93a386Sopenharmony_ci || defined(SK_ENABLE_NDK_IMAGES) 29cb93a386Sopenharmony_ci#include "src/images/SkImageEncoderPriv.h" 30cb93a386Sopenharmony_ci#endif 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cinamespace { 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cistatic const struct { 35cb93a386Sopenharmony_ci SkEncodedImageFormat format; 36cb93a386Sopenharmony_ci int quality; 37cb93a386Sopenharmony_ci} gRecs[] = { 38cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 39cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 40cb93a386Sopenharmony_ci { SkEncodedImageFormat::kJPEG, 100}, 41cb93a386Sopenharmony_ci { SkEncodedImageFormat::kGIF, 100}, 42cb93a386Sopenharmony_ci { SkEncodedImageFormat::kBMP, 100}, 43cb93a386Sopenharmony_ci { SkEncodedImageFormat::kICO, 100}, 44cb93a386Sopenharmony_ci#elif defined(SK_BUILD_FOR_WIN) 45cb93a386Sopenharmony_ci // Our WIC encoder does not support GIF, BMP, or ICO. 46cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 47cb93a386Sopenharmony_ci { SkEncodedImageFormat::kJPEG, 100}, 48cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 49cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 50cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 51cb93a386Sopenharmony_ci#else 52cb93a386Sopenharmony_ci // We don't support GIF, BMP, or ICO. This applies to both NDK and SkEncoder. 53cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 54cb93a386Sopenharmony_ci { SkEncodedImageFormat::kJPEG, 100}, 55cb93a386Sopenharmony_ci { SkEncodedImageFormat::kWEBP, 100}, // Lossless 56cb93a386Sopenharmony_ci { SkEncodedImageFormat::kWEBP, 80}, // Lossy 57cb93a386Sopenharmony_ci { SkEncodedImageFormat::kPNG, 100}, 58cb93a386Sopenharmony_ci#endif 59cb93a386Sopenharmony_ci}; 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci} // anonymous namespace 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_cistatic sk_sp<SkData> encode_data(SkEncodedImageFormat type, const SkBitmap& bitmap, int quality) { 64cb93a386Sopenharmony_ci SkPixmap src; 65cb93a386Sopenharmony_ci if (!bitmap.peekPixels(&src)) { 66cb93a386Sopenharmony_ci return nullptr; 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci SkDynamicMemoryWStream buf; 69cb93a386Sopenharmony_ci #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 70cb93a386Sopenharmony_ci return SkEncodeImageWithCG(&buf, src, type) ? buf.detachAsData() : nullptr; 71cb93a386Sopenharmony_ci #elif defined(SK_BUILD_FOR_WIN) 72cb93a386Sopenharmony_ci return SkEncodeImageWithWIC(&buf, src, type, quality) ? buf.detachAsData() : nullptr; 73cb93a386Sopenharmony_ci #elif defined(SK_ENABLE_NDK_IMAGES) 74cb93a386Sopenharmony_ci return SkEncodeImageWithNDK(&buf, src, type, quality) ? buf.detachAsData() : nullptr; 75cb93a386Sopenharmony_ci #else 76cb93a386Sopenharmony_ci switch (type) { 77cb93a386Sopenharmony_ci case SkEncodedImageFormat::kPNG: { 78cb93a386Sopenharmony_ci bool success = SkPngEncoder::Encode(&buf, src, SkPngEncoder::Options()); 79cb93a386Sopenharmony_ci return success ? buf.detachAsData() : nullptr; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci case SkEncodedImageFormat::kJPEG: { 82cb93a386Sopenharmony_ci bool success = SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options()); 83cb93a386Sopenharmony_ci return success ? buf.detachAsData() : nullptr; 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci case SkEncodedImageFormat::kWEBP: { 86cb93a386Sopenharmony_ci bool success = SkWebpEncoder::Encode(&buf, src, SkWebpEncoder::Options()); 87cb93a386Sopenharmony_ci return success ? buf.detachAsData() : nullptr; 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci default: 90cb93a386Sopenharmony_ci SkUNREACHABLE; 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci #endif 93cb93a386Sopenharmony_ci} 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_cinamespace skiagm { 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ciclass EncodePlatformGM : public GM { 98cb93a386Sopenharmony_cipublic: 99cb93a386Sopenharmony_ci EncodePlatformGM() {} 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ciprotected: 102cb93a386Sopenharmony_ci SkString onShortName() override { 103cb93a386Sopenharmony_ci return SkString("encode-platform"); 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci SkISize onISize() override { 107cb93a386Sopenharmony_ci return SkISize::Make(256 * SK_ARRAY_COUNT(gRecs), 256 * 3); 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 111cb93a386Sopenharmony_ci SkBitmap opaqueBm, premulBm, unpremulBm; 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci if (!GetResourceAsBitmap("images/mandrill_256.png", &opaqueBm)) { 114cb93a386Sopenharmony_ci *errorMsg = "Could not load images/mandrill_256.png.png. " 115cb93a386Sopenharmony_ci "Did you forget to set the resourcePath?"; 116cb93a386Sopenharmony_ci return DrawResult::kFail; 117cb93a386Sopenharmony_ci } 118cb93a386Sopenharmony_ci SkBitmap tmp; 119cb93a386Sopenharmony_ci if (!GetResourceAsBitmap("images/yellow_rose.png", &tmp)) { 120cb93a386Sopenharmony_ci *errorMsg = "Could not load images/yellow_rose.png. " 121cb93a386Sopenharmony_ci "Did you forget to set the resourcePath?"; 122cb93a386Sopenharmony_ci return DrawResult::kFail; 123cb93a386Sopenharmony_ci } 124cb93a386Sopenharmony_ci tmp.extractSubset(&premulBm, SkIRect::MakeWH(256, 256)); 125cb93a386Sopenharmony_ci tmp.reset(); 126cb93a386Sopenharmony_ci unpremulBm.allocPixels(premulBm.info().makeAlphaType(kUnpremul_SkAlphaType)); 127cb93a386Sopenharmony_ci SkAssertResult(premulBm.readPixels(unpremulBm.pixmap())); 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci for (const auto& rec : gRecs) { 130cb93a386Sopenharmony_ci auto fmt = rec.format; int q = rec.quality; 131cb93a386Sopenharmony_ci auto opaqueImage = SkImage::MakeFromEncoded(encode_data(fmt, opaqueBm, q)); 132cb93a386Sopenharmony_ci auto premulImage = SkImage::MakeFromEncoded(encode_data(fmt, premulBm, q)); 133cb93a386Sopenharmony_ci auto unpremulImage = SkImage::MakeFromEncoded(encode_data(fmt, unpremulBm, q)); 134cb93a386Sopenharmony_ci 135cb93a386Sopenharmony_ci canvas->drawImage(opaqueImage.get(), 0.0f, 0.0f); 136cb93a386Sopenharmony_ci canvas->drawImage(premulImage.get(), 0.0f, 256.0f); 137cb93a386Sopenharmony_ci canvas->drawImage(unpremulImage.get(), 0.0f, 512.0f); 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ci canvas->translate(256.0f, 0.0f); 140cb93a386Sopenharmony_ci } 141cb93a386Sopenharmony_ci return DrawResult::kOk; 142cb93a386Sopenharmony_ci } 143cb93a386Sopenharmony_ci 144cb93a386Sopenharmony_ciprivate: 145cb93a386Sopenharmony_ci using INHERITED = GM; 146cb93a386Sopenharmony_ci}; 147cb93a386Sopenharmony_ci 148cb93a386Sopenharmony_ciDEF_GM( return new EncodePlatformGM; ) 149cb93a386Sopenharmony_ci} // namespace skiagm 150