13d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
23d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/*
33d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Copyright 2011 Google Inc.
43d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com *
53d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Use of this source code is governed by a BSD-style license that can be
63d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * found in the LICENSE file.
73d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
93d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkBitmap.h"
103d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkCanvas.h"
113d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkColorPriv.h"
12f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h"
133d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkRandom.h"
143d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkString.h"
153d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
167fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic void draw_into_bitmap(const SkBitmap& bm) {
173d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    const int w = bm.width();
183d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    const int h = bm.height();
193d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
203d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkCanvas canvas(bm);
213d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkPaint p;
223d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setAntiAlias(true);
233d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setColor(SK_ColorRED);
243d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
253d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com                      SkIntToScalar(SkMin32(w, h))*3/8, p);
263d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
273d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    SkRect r;
283d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
293d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setStyle(SkPaint::kStroke_Style);
303d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setStrokeWidth(SkIntToScalar(4));
313d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    p.setColor(SK_ColorBLUE);
323d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    canvas.drawRect(r, p);
333d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com}
343d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
353d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/*  Variants for bitmaprect
363d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    src : entire bitmap, subset, fractional subset
373d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    dst : same size as src, diff size
383d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    paint : filter-p
393d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */
403d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapRectBench : public Benchmark {
424469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkBitmap                fBitmap;
434469938e92d779dff05e745559e67907bbf21e78reed@google.com    bool                    fSlightMatrix;
444469938e92d779dff05e745559e67907bbf21e78reed@google.com    uint8_t                 fAlpha;
454469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkPaint::FilterLevel    fFilterLevel;
464469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkString                fName;
474469938e92d779dff05e745559e67907bbf21e78reed@google.com    SkRect                  fSrcR, fDstR;
484469938e92d779dff05e745559e67907bbf21e78reed@google.com
497fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    static const int kWidth = 128;
507fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    static const int kHeight = 128;
513d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.compublic:
524469938e92d779dff05e745559e67907bbf21e78reed@google.com    BitmapRectBench(U8CPU alpha, SkPaint::FilterLevel filterLevel,
534469938e92d779dff05e745559e67907bbf21e78reed@google.com                    bool slightMatrix)  {
54b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com        fAlpha = SkToU8(alpha);
554469938e92d779dff05e745559e67907bbf21e78reed@google.com        fFilterLevel = filterLevel;
5693182311781e79a6883b356bf2669c389878f9e5reed@google.com        fSlightMatrix = slightMatrix;
57b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com
586c22573edb234ad14df947278cfed010669a39a7reed        fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight));
597fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
607fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org
617fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgprotected:
627fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    virtual const char* onGetName() SK_OVERRIDE {
637fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fName.printf("bitmaprect_%02X_%sfilter_%s",
644469938e92d779dff05e745559e67907bbf21e78reed@google.com                     fAlpha,
654469938e92d779dff05e745559e67907bbf21e78reed@google.com                     SkPaint::kNone_FilterLevel == fFilterLevel ? "no" : "",
667fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org                     fSlightMatrix ? "trans" : "identity");
677fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        return fName.c_str();
687fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
693d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
707fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    virtual void onPreDraw() SK_OVERRIDE {
713d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        fBitmap.allocPixels();
72383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com        fBitmap.setAlphaType(kOpaque_SkAlphaType);
733d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        fBitmap.eraseColor(SK_ColorBLACK);
747fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        draw_into_bitmap(fBitmap);
75f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com
767fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fSrcR.iset(0, 0, kWidth, kHeight);
777fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fDstR.iset(0, 0, kWidth, kHeight);
7893182311781e79a6883b356bf2669c389878f9e5reed@google.com
797fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        if (fSlightMatrix) {
8093182311781e79a6883b356bf2669c389878f9e5reed@google.com            // want fractional translate
8193182311781e79a6883b356bf2669c389878f9e5reed@google.com            fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7);
8293182311781e79a6883b356bf2669c389878f9e5reed@google.com            // want enough to create a scale matrix, but not enough to scare
8393182311781e79a6883b356bf2669c389878f9e5reed@google.com            // off our sniffer which tries to see if the matrix is "effectively"
8493182311781e79a6883b356bf2669c389878f9e5reed@google.com            // translate-only.
857fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org            fDstR.fRight += SK_Scalar1 / (kWidth * 60);
8693182311781e79a6883b356bf2669c389878f9e5reed@google.com        }
873d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    }
883d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
893d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
903361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
91e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
923d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
933d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        SkPaint paint;
943d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        this->setupPaint(&paint);
954469938e92d779dff05e745559e67907bbf21e78reed@google.com        paint.setFilterLevel(fFilterLevel);
96b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com        paint.setAlpha(fAlpha);
973d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
983361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
993d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com            canvas->drawBitmapRectToRect(fBitmap, &fSrcR, fDstR, &paint);
1003d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com        }
1013d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com    }
1023d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
1033d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.comprivate:
104f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
1053d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com};
1063d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com
1074469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kNone_FilterLevel, false))
1084469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0x80, SkPaint::kNone_FilterLevel, false))
1094469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kLow_FilterLevel, false))
1104469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0x80, SkPaint::kLow_FilterLevel, false))
11193182311781e79a6883b356bf2669c389878f9e5reed@google.com
1124469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kNone_FilterLevel, true))
1134469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kLow_FilterLevel, true))
114