1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* Variants for bitmaps 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot - src depth (32 w+w/o alpha), 565, 4444, index, a8 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot - paint options: filtering, dither, alpha 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot - matrix options: translate, scale, rotate, persp 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot - tiling: none, repeat, mirror, clamp 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass BitmapBench : public Benchmark { 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkColorType fColorType; 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkAlphaType fAlphaType; 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const bool fIsVolatile; 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const bool fDoScale; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap fBitmap; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fPaint; 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { W = 128 }; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { H = 128 }; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot BitmapBench(SkColorType ct, SkAlphaType at, bool forceUpdate, bool isVolatile, bool doScale) 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fColorType(ct) 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fAlphaType(at) 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fForceUpdate(forceUpdate) 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fIsVolatile(isVolatile) 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDoScale(doScale) 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {} 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.set("bitmap"); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.appendf("_%s%s", sk_tool_utils::colortype_name(fColorType), 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kOpaque_SkAlphaType == fAlphaType ? "" : "_A"); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDoScale) { 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("_scale"); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fForceUpdate) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("_update"); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fIsVolatile) { 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("_volatile"); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bm; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.allocPixels(SkImageInfo::Make(W, H, fColorType, fAlphaType)); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorBLACK : 0); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->onDrawIntoBitmap(bm); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBitmap = bm; 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBitmap.setIsVolatile(fIsVolatile); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDoScale) { 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(.99f, .99f); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIPoint dim = this->getSize(); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint(fPaint); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&paint); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkBitmap& bitmap = fBitmap; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar x0 = SkIntToScalar(-bitmap.width() / 2); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar y0 = SkIntToScalar(-bitmap.height() / 2); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; i++) { 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x = x0 + rand.nextUScalar1() * dim.fX; 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y = y0 + rand.nextUScalar1() * dim.fY; 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fForceUpdate) 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bitmap.notifyPixelsChanged(); 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawBitmap(bitmap, x, y, &paint); 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void onDrawIntoBitmap(const SkBitmap& bm) { 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int w = bm.width(); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int h = bm.height(); 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(bm); 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(true); 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorRED); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2, 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(SkMin32(w, h))*3/8, p); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kStroke_Style); 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStrokeWidth(SkIntToScalar(4)); 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorBLUE); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawRect(r, p); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Explicitly invoke some filter types to improve coverage of acceleration 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot procs. */ 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum Flags { 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kScale_Flag = 1 << 0, 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRotate_Flag = 1 << 1, 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBilerp_Flag = 1 << 2, 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBicubic_Flag = 1 << 3, 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic bool isBilerp(uint32_t flags) { 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic bool isBicubic(uint32_t flags) { 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return (flags & (kBilerp_Flag | kBicubic_Flag)) == (kBilerp_Flag | kBicubic_Flag); 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass FilterBitmapBench : public BitmapBench { 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t fFlags; 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fFullName; 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FilterBitmapBench(SkColorType ct, SkAlphaType at, 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool forceUpdate, bool isVolitile, uint32_t flags) 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(ct, at, forceUpdate, isVolitile, false) 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fFlags(flags) { 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.set(INHERITED::onGetName()); 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kScale_Flag) { 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_scale"); 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kRotate_Flag) { 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_rotate"); 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (isBilerp(fFlags)) { 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_bilerp"); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (isBicubic(fFlags)) { 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_bicubic"); 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fFullName.c_str(); 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize dim = canvas->getBaseLayerSize(); 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kScale_Flag) { 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar x = SkIntToScalar(dim.fWidth) / 2; 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar y = SkIntToScalar(dim.fHeight) / 2; 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(x, y); 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // just enough so we can't take the sprite case 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100); 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(-x, -y); 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kRotate_Flag) { 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar x = SkIntToScalar(dim.fWidth) / 2; 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar y = SkIntToScalar(dim.fHeight) / 2; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->rotate(SkIntToScalar(35), x, y); 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot INHERITED::onDraw(loops, canvas); 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setupPaint(SkPaint* paint) override { 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->INHERITED::setupPaint(paint); 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int index = 0; 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kBilerp_Flag) { 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot index |= 1; 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kBicubic_Flag) { 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot index |= 2; 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkFilterQuality gQualitys[] = { 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNone_SkFilterQuality, 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLow_SkFilterQuality, 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kMedium_SkFilterQuality, 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kHigh_SkFilterQuality 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setFilterQuality(gQualitys[index]); 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef BitmapBench INHERITED; 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** Verify optimizations that test source alpha values. */ 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SourceAlphaBitmapBench : public BitmapBench { 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum SourceAlpha { kOpaque_SourceAlpha, kTransparent_SourceAlpha, 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kTwoStripes_SourceAlpha, kThreeStripes_SourceAlpha}; 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fFullName; 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SourceAlpha fSourceAlpha; 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SourceAlphaBitmapBench(SourceAlpha alpha, SkColorType ct, 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool forceUpdate = false, bool bitmapVolatile = false) 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(ct, kPremul_SkAlphaType, forceUpdate, bitmapVolatile, false) 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fSourceAlpha(alpha) { 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.set(INHERITED::onGetName()); 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fSourceAlpha == kOpaque_SourceAlpha) { 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_source_opaque"); 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fSourceAlpha == kTransparent_SourceAlpha) { 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_source_transparent"); 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fSourceAlpha == kTwoStripes_SourceAlpha) { 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_source_stripes_two"); 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (fSourceAlpha == kThreeStripes_SourceAlpha) { 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFullName.append("_source_stripes_three"); 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fFullName.c_str(); 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawIntoBitmap(const SkBitmap& bm) override { 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int w = bm.width(); 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int h = bm.height(); 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kOpaque_SourceAlpha == fSourceAlpha) { 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.eraseColor(SK_ColorBLACK); 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (kTransparent_SourceAlpha == fSourceAlpha) { 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.eraseColor(0); 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (kTwoStripes_SourceAlpha == fSourceAlpha) { 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.eraseColor(0); 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(bm); 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(false); 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kFill_Style); 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorRED); 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Draw red vertical stripes on transparent background 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < w; x+=2) 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h)); 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawRect(r, p); 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (kThreeStripes_SourceAlpha == fSourceAlpha) { 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.eraseColor(0); 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(bm); 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(false); 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kFill_Style); 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Draw vertical stripes on transparent background with a pattern 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // where the first pixel is fully transparent, the next is semi-transparent 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // and the third is fully opaque. 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < w; x++) 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (x % 3 == 0) { 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot continue; // Keep transparent 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (x % 3 == 1) { 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SkColorSetARGB(127, 127, 127, 127)); // Semi-transparent 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else if (x % 3 == 2) { 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorRED); // Opaque 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h)); 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawRect(r, p); 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef BitmapBench INHERITED; 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, false); ) 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, false); ) 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, true); ) 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, false); ) 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, false); ) 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, false); ) 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S32_D16_filter_DX_SSE2 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); ) 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); ) 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, kScale_Flag | kBilerp_Flag); ) 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, kScale_Flag | kBilerp_Flag); ) 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// The following two cases test the performance regression of b/70172912 . 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); ) 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, true); ) 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// scale rotate filter -> S32_opaque_D32_filter_DXDY_{SSE2,SSSE3} 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, kScale_Flag | kRotate_Flag | kBilerp_Flag); ) 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag | kBicubic_Flag); ) 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kRotate_Flag | kBilerp_Flag | kBicubic_Flag); ) 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// source alpha tests -> S32A_Opaque_BlitRow32_{arm,neon} 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kOpaque_SourceAlpha, kN32_SkColorType); ) 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTransparent_SourceAlpha, kN32_SkColorType); ) 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kTwoStripes_SourceAlpha, kN32_SkColorType); ) 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SourceAlphaBitmapBench(SourceAlphaBitmapBench::kThreeStripes_SourceAlpha, kN32_SkColorType); ) 334