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/codec/SkCodec.h" 10cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 11cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 12cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 13cb93a386Sopenharmony_ci#include "include/core/SkImageInfo.h" 14cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 15cb93a386Sopenharmony_ci#include "include/core/SkScalar.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 "tools/Resources.h" 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci#include <memory> 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_cinamespace skiagm { 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ciclass BitmapImageGM : public GM { 26cb93a386Sopenharmony_cipublic: 27cb93a386Sopenharmony_ci BitmapImageGM() {} 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciprotected: 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci SkString onShortName() override { 32cb93a386Sopenharmony_ci return SkString("bitmap-image-srgb-legacy"); 33cb93a386Sopenharmony_ci } 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci SkISize onISize() override { 36cb93a386Sopenharmony_ci return SkISize::Make(2*kSize, 2*kSize); 37cb93a386Sopenharmony_ci } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 40cb93a386Sopenharmony_ci // Create image. 41cb93a386Sopenharmony_ci const char* path = "images/mandrill_512_q075.jpg"; 42cb93a386Sopenharmony_ci sk_sp<SkImage> image = GetResourceAsImage(path); 43cb93a386Sopenharmony_ci if (!image) { 44cb93a386Sopenharmony_ci *errorMsg = "Couldn't load images/mandrill_512_q075.jpg. " 45cb93a386Sopenharmony_ci "Did you forget to set the resource path?"; 46cb93a386Sopenharmony_ci return DrawResult::kFail; 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci // Create matching bitmap. 50cb93a386Sopenharmony_ci std::unique_ptr<SkCodec> codec(SkCodec::MakeFromStream(GetResourceAsStream(path))); 51cb93a386Sopenharmony_ci auto [codecImage, _] = codec->getImage(); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci // The GM will be displayed in a 2x2 grid. 54cb93a386Sopenharmony_ci // The top two squares show an sRGB image, then bitmap, drawn to a legacy canvas. 55cb93a386Sopenharmony_ci SkImageInfo linearInfo = SkImageInfo::MakeN32(2*kSize, kSize, kOpaque_SkAlphaType); 56cb93a386Sopenharmony_ci SkBitmap legacyBMCanvas; 57cb93a386Sopenharmony_ci legacyBMCanvas.allocPixels(linearInfo); 58cb93a386Sopenharmony_ci SkCanvas legacyCanvas(legacyBMCanvas); 59cb93a386Sopenharmony_ci legacyCanvas.drawImage(image, 0.0f, 0.0f); 60cb93a386Sopenharmony_ci legacyCanvas.translate(SkScalar(kSize), 0.0f); 61cb93a386Sopenharmony_ci legacyCanvas.drawImage(codecImage, 0.0f, 0.0f); 62cb93a386Sopenharmony_ci canvas->drawImage(legacyBMCanvas.asImage(), 0.0f, 0.0f); 63cb93a386Sopenharmony_ci canvas->translate(0.0f, SkScalar(kSize)); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci // The bottom two squares show an sRGB image, then bitmap, drawn to a srgb canvas. 66cb93a386Sopenharmony_ci SkImageInfo srgbInfo = SkImageInfo::MakeS32(2*kSize, kSize, kOpaque_SkAlphaType); 67cb93a386Sopenharmony_ci SkBitmap srgbBMCanvas; 68cb93a386Sopenharmony_ci srgbBMCanvas.allocPixels(srgbInfo); 69cb93a386Sopenharmony_ci SkCanvas srgbCanvas(srgbBMCanvas); 70cb93a386Sopenharmony_ci srgbCanvas.drawImage(image, 0.0f, 0.0f); 71cb93a386Sopenharmony_ci srgbCanvas.translate(SkScalar(kSize), 0.0f); 72cb93a386Sopenharmony_ci srgbCanvas.drawImage(codecImage, 0.0f, 0.0f); 73cb93a386Sopenharmony_ci canvas->drawImage(srgbBMCanvas.asImage(), 0.0f, 0.0f); 74cb93a386Sopenharmony_ci return DrawResult::kOk; 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ciprivate: 78cb93a386Sopenharmony_ci inline static constexpr int kSize = 512; 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci using INHERITED = GM; 81cb93a386Sopenharmony_ci}; 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ciDEF_GM( return new BitmapImageGM; ) 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci} // namespace skiagm 88