1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2012 The Android Open Source Project 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 "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColorSpace.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci// Time variants of read-pixels 14cb93a386Sopenharmony_ci// [ colortype ][ alphatype ][ colorspace ] 15cb93a386Sopenharmony_ci// Different combinations can trigger fast or slow paths in the impls 16cb93a386Sopenharmony_ci// 17cb93a386Sopenharmony_ciclass ReadPixBench : public Benchmark { 18cb93a386Sopenharmony_cipublic: 19cb93a386Sopenharmony_ci ReadPixBench(SkColorType ct, SkAlphaType at, sk_sp<SkColorSpace> cs) 20cb93a386Sopenharmony_ci : fCT(ct), fAT(at), fCS(cs) 21cb93a386Sopenharmony_ci { 22cb93a386Sopenharmony_ci fName.printf("readpix_%s_%s_%s", 23cb93a386Sopenharmony_ci at == kPremul_SkAlphaType ? "pm" : "um", 24cb93a386Sopenharmony_ci ct == kRGBA_8888_SkColorType ? "rgba" : "bgra", 25cb93a386Sopenharmony_ci cs ? "srgb" : "null"); 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ciprotected: 29cb93a386Sopenharmony_ci const char* onGetName() override { 30cb93a386Sopenharmony_ci return fName.c_str(); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 34cb93a386Sopenharmony_ci canvas->clear(0x80000000); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci SkISize size = canvas->getBaseLayerSize(); 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci auto info = SkImageInfo::Make(size, fCT, fAT, fCS); 39cb93a386Sopenharmony_ci SkBitmap bitmap; 40cb93a386Sopenharmony_ci bitmap.allocPixels(info); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 43cb93a386Sopenharmony_ci canvas->readPixels(bitmap.info(), bitmap.getPixels(), bitmap.rowBytes(), 0, 0); 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci } 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ciprivate: 48cb93a386Sopenharmony_ci SkColorType fCT; 49cb93a386Sopenharmony_ci SkAlphaType fAT; 50cb93a386Sopenharmony_ci sk_sp<SkColorSpace> fCS; 51cb93a386Sopenharmony_ci SkString fName; 52cb93a386Sopenharmony_ci using INHERITED = Benchmark; 53cb93a386Sopenharmony_ci}; 54cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr); ) 55cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); ) 56cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 57cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kRGBA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, nullptr); ) 60cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, nullptr); ) 61cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kPremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 62cb93a386Sopenharmony_ciDEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); ) 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////// 65cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 66cb93a386Sopenharmony_ci#include "src/core/SkPixmapPriv.h" 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ciclass PixmapOrientBench : public Benchmark { 69cb93a386Sopenharmony_cipublic: 70cb93a386Sopenharmony_ci PixmapOrientBench() {} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciprotected: 73cb93a386Sopenharmony_ci void onDelayedSetup() override { 74cb93a386Sopenharmony_ci const SkImageInfo info = SkImageInfo::MakeN32Premul(2048, 1024); 75cb93a386Sopenharmony_ci fSrc.allocPixels(info); 76cb93a386Sopenharmony_ci fSrc.eraseColor(SK_ColorBLACK); 77cb93a386Sopenharmony_ci fDst.allocPixels(info.makeDimensions(info.dimensions())); 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci const char* onGetName() override { 81cb93a386Sopenharmony_ci return "orient_pixmap"; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 85cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 86cb93a386Sopenharmony_ci } 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 89cb93a386Sopenharmony_ci SkPixmap src, dst; 90cb93a386Sopenharmony_ci fSrc.peekPixels(&src); 91cb93a386Sopenharmony_ci fDst.peekPixels(&dst); 92cb93a386Sopenharmony_ci for (int i = 0; i < loops; ++i) { 93cb93a386Sopenharmony_ci SkPixmapPriv::Orient(dst, src, kTopRight_SkEncodedOrigin); 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ciprivate: 98cb93a386Sopenharmony_ci SkBitmap fSrc, fDst; 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci using INHERITED = Benchmark; 101cb93a386Sopenharmony_ci}; 102cb93a386Sopenharmony_ciDEF_BENCH( return new PixmapOrientBench(); ) 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci 105cb93a386Sopenharmony_ciclass GetAlphafBench : public Benchmark { 106cb93a386Sopenharmony_ci SkString fName; 107cb93a386Sopenharmony_ci SkColorType fCT; 108cb93a386Sopenharmony_cipublic: 109cb93a386Sopenharmony_ci GetAlphafBench(SkColorType ct, const char label[]) : fCT(ct) { 110cb93a386Sopenharmony_ci fName.printf("getalphaf_%s", label); 111cb93a386Sopenharmony_ci } 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ciprotected: 114cb93a386Sopenharmony_ci void onDelayedSetup() override { 115cb93a386Sopenharmony_ci fBM.allocPixels(SkImageInfo::Make(1024, 1024, fCT, kPremul_SkAlphaType)); 116cb93a386Sopenharmony_ci fBM.eraseColor(0x88112233); 117cb93a386Sopenharmony_ci } 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci const char* onGetName() override { 120cb93a386Sopenharmony_ci return fName.c_str(); 121cb93a386Sopenharmony_ci } 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 124cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 125cb93a386Sopenharmony_ci } 126cb93a386Sopenharmony_ci 127cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 128cb93a386Sopenharmony_ci for (int i = 0; i < loops; ++i) { 129cb93a386Sopenharmony_ci for (int y = 0; y < fBM.height(); ++y) { 130cb93a386Sopenharmony_ci for (int x = 0; x < fBM.width(); ++x) { 131cb93a386Sopenharmony_ci fBM.getAlphaf(x, y); 132cb93a386Sopenharmony_ci } 133cb93a386Sopenharmony_ci } 134cb93a386Sopenharmony_ci } 135cb93a386Sopenharmony_ci } 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ciprivate: 138cb93a386Sopenharmony_ci SkBitmap fBM; 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci using INHERITED = Benchmark; 141cb93a386Sopenharmony_ci}; 142cb93a386Sopenharmony_ciDEF_BENCH( return new GetAlphafBench(kN32_SkColorType, "rgba"); ) 143cb93a386Sopenharmony_ciDEF_BENCH( return new GetAlphafBench(kRGB_888x_SkColorType, "rgbx"); ) 144cb93a386Sopenharmony_ciDEF_BENCH( return new GetAlphafBench(kRGBA_F16_SkColorType, "f16"); ) 145cb93a386Sopenharmony_ciDEF_BENCH( return new GetAlphafBench(kRGBA_F32_SkColorType, "f32"); ) 146cb93a386Sopenharmony_ci 147