13d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/*
23d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Copyright 2011 Google Inc.
33d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com *
43d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Use of this source code is governed by a BSD-style license that can be
53d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * found in the LICENSE file.
63d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
83d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkBitmap.h"
93d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkCanvas.h"
103d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkColorPriv.h"
11f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h"
123d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkRandom.h"
133d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkString.h"
143d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
157fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic void draw_into_bitmap(const SkBitmap& bm) {
163d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    const int w = bm.width();
173d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    const int h = bm.height();
183d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
193d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkCanvas canvas(bm);
203d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkPaint p;
213d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setAntiAlias(true);
223d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setColor(SK_ColorRED);
233d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
243d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com                      SkIntToScalar(SkMin32(w, h))*3/8, p);
253d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
263d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkRect r;
273d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
283d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setStyle(SkPaint::kStroke_Style);
293d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setStrokeWidth(SkIntToScalar(4));
303d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setColor(SK_ColorBLUE);
313d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    canvas.drawRect(r, p);
323d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com}
333d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
343d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/*  Variants for bitmaprect
353d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    src : entire bitmap, subset, fractional subset
363d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    dst : same size as src, diff size
373d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    paint : filter-p
383d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */
393d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
40f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapRectBench : public Benchmark {
414469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkBitmap                fBitmap;
424469938e92d779dff05e745559e67907bbf21e78reed@google.com    bool                    fSlightMatrix;
434469938e92d779dff05e745559e67907bbf21e78reed@google.com    uint8_t                 fAlpha;
4493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    SkFilterQuality         fFilterQuality;
454469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkString                fName;
464469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkRect                  fSrcR, fDstR;
474469938e92d779dff05e745559e67907bbf21e78reed@google.com
487fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    static const int kWidth = 128;
497fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    static const int kHeight = 128;
503d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.compublic:
5193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    BitmapRectBench(U8CPU alpha, SkFilterQuality filterQuality,
524469938e92d779dff05e745559e67907bbf21e78reed@google.com                    bool slightMatrix)  {
53b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com        fAlpha = SkToU8(alpha);
5493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        fFilterQuality = filterQuality;
5593182311781e79a6883b356bf2669c389878f9e5reed@google.com        fSlightMatrix = slightMatrix;
56b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
576c22573edb234ad14df947278cfed010669a39a7reed        fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight));
587fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
597fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org
607fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgprotected:
6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
627fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fName.printf("bitmaprect_%02X_%sfilter_%s",
634469938e92d779dff05e745559e67907bbf21e78reed@google.com                     fAlpha,
6493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                     kNone_SkFilterQuality == fFilterQuality ? "no" : "",
657fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org                     fSlightMatrix ? "trans" : "identity");
667fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        return fName.c_str();
677fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
683d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
698a6697af95b340aad6dee7e6228048fa305c1e59joshualitt    void onDelayedSetup() override {
703d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        fBitmap.allocPixels();
71383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com        fBitmap.setAlphaType(kOpaque_SkAlphaType);
723d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        fBitmap.eraseColor(SK_ColorBLACK);
737fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        draw_into_bitmap(fBitmap);
74f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
757fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fSrcR.iset(0, 0, kWidth, kHeight);
767fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fDstR.iset(0, 0, kWidth, kHeight);
7793182311781e79a6883b356bf2669c389878f9e5reed@google.com
787fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        if (fSlightMatrix) {
7993182311781e79a6883b356bf2669c389878f9e5reed@google.com            // want fractional translate
8093182311781e79a6883b356bf2669c389878f9e5reed@google.com            fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7);
8193182311781e79a6883b356bf2669c389878f9e5reed@google.com            // want enough to create a scale matrix, but not enough to scare
8293182311781e79a6883b356bf2669c389878f9e5reed@google.com            // off our sniffer which tries to see if the matrix is "effectively"
8393182311781e79a6883b356bf2669c389878f9e5reed@google.com            // translate-only.
847fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org            fDstR.fRight += SK_Scalar1 / (kWidth * 60);
8593182311781e79a6883b356bf2669c389878f9e5reed@google.com        }
863d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    }
873d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
883d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
89a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein    void onDraw(int loops, SkCanvas* canvas) override {
90e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
913d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
923d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        SkPaint paint;
933d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        this->setupPaint(&paint);
9493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        paint.setFilterQuality(fFilterQuality);
95b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com        paint.setAlpha(fAlpha);
963d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
973361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
98e47829b6b1eeb6b0c97ccb3df3016d197046824creed            canvas->drawBitmapRect(fBitmap, fSrcR, fDstR, &paint,
9984984efeb64787b88c5f8bd6929cfe2d58a3ba06reed                                   SkCanvas::kStrict_SrcRectConstraint);
1003d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        }
1013d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    }
1023d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
1033d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.comprivate:
104f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
1053d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com};
1063d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
10793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, false))
10893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0x80, kNone_SkFilterQuality, false))
10993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, false))
11093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0x80, kLow_SkFilterQuality, false))
11193182311781e79a6883b356bf2669c389878f9e5reed@google.com
11293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, true))
11393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, true))
114