1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 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 "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkString.h" 12cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciclass PremulAndUnpremulAlphaOpsBench : public Benchmark { 15cb93a386Sopenharmony_ci enum { 16cb93a386Sopenharmony_ci W = 256, 17cb93a386Sopenharmony_ci H = 256, 18cb93a386Sopenharmony_ci }; 19cb93a386Sopenharmony_ci SkBitmap fBmp1, fBmp2; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cipublic: 22cb93a386Sopenharmony_ci PremulAndUnpremulAlphaOpsBench(SkColorType ct) { 23cb93a386Sopenharmony_ci fColorType = ct; 24cb93a386Sopenharmony_ci fName.printf("premul_and_unpremul_alpha_%s", ToolUtils::colortype_name(ct)); 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciprotected: 28cb93a386Sopenharmony_ci const char* onGetName() override { 29cb93a386Sopenharmony_ci return fName.c_str(); 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci void onDelayedSetup() override { 33cb93a386Sopenharmony_ci SkImageInfo info = SkImageInfo::Make(W, H, fColorType, kUnpremul_SkAlphaType); 34cb93a386Sopenharmony_ci fBmp1.allocPixels(info); // used in writePixels 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci for (int h = 0; h < H; ++h) { 37cb93a386Sopenharmony_ci for (int w = 0; w < W; ++w) { 38cb93a386Sopenharmony_ci // SkColor places A in the right slot for either RGBA or BGRA 39cb93a386Sopenharmony_ci *fBmp1.getAddr32(w, h) = SkColorSetARGB(h & 0xFF, w & 0xFF, w & 0xFF, w & 0xFF); 40cb93a386Sopenharmony_ci } 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci fBmp2.allocPixels(info); // used in readPixels() 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 47cb93a386Sopenharmony_ci canvas->clear(SK_ColorBLACK); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci for (int loop = 0; loop < loops; ++loop) { 50cb93a386Sopenharmony_ci // Unpremul -> Premul 51cb93a386Sopenharmony_ci canvas->writePixels(fBmp1.info(), fBmp1.getPixels(), fBmp1.rowBytes(), 0, 0); 52cb93a386Sopenharmony_ci // Premul -> Unpremul 53cb93a386Sopenharmony_ci canvas->readPixels(fBmp2.info(), fBmp2.getPixels(), fBmp2.rowBytes(), 0, 0); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ciprivate: 58cb93a386Sopenharmony_ci SkColorType fColorType; 59cb93a386Sopenharmony_ci SkString fName; 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci using INHERITED = Benchmark; 62cb93a386Sopenharmony_ci}; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ciDEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kRGBA_8888_SkColorType)); 66cb93a386Sopenharmony_ciDEF_BENCH(return new PremulAndUnpremulAlphaOpsBench(kBGRA_8888_SkColorType)); 67