1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
94d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkBitmap.h"
104d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkCanvas.h"
114d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkColorPriv.h"
124d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkPaint.h"
134d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkShader.h"
144d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com#include "SkString.h"
156c22573edb234ad14df947278cfed010669a39a7reed#include "sk_tool_utils.h"
164d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
177fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic void draw_into_bitmap(const SkBitmap& bm) {
184d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    const int w = bm.width();
194d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    const int h = bm.height();
204d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
214d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    SkCanvas canvas(bm);
224d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    SkPaint p;
234d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    p.setAntiAlias(true);
244d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    p.setColor(SK_ColorRED);
254d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2,
264d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com                      SkIntToScalar(SkMin32(w, h))*3/8, p);
27fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
284d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    SkRect r;
294d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
304d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    p.setStyle(SkPaint::kStroke_Style);
314d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    p.setStrokeWidth(SkIntToScalar(4));
324d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    p.setColor(SK_ColorBLUE);
334d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    canvas.drawRect(r, p);
344d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com}
354d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
367fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic int conv_6_to_byte(int x) {
374d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    return x * 0xFF / 5;
384d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com}
394d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
407fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic int conv_byte_to_6(int x) {
414d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    return x * 5 / 255;
424d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com}
434d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
447fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic uint8_t compute_666_index(SkPMColor c) {
454d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    int r = SkGetPackedR32(c);
464d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    int g = SkGetPackedG32(c);
474d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    int b = SkGetPackedB32(c);
48fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
497fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    return conv_byte_to_6(r) * 36 + conv_byte_to_6(g) * 6 + conv_byte_to_6(b);
504d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com}
514d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
526c22573edb234ad14df947278cfed010669a39a7reedstatic void convert_to_index666(const SkBitmap& src, SkBitmap* dst) {
530a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkPMColor storage[216];
540a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkPMColor* colors = storage;
554d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    // rrr ggg bbb
564d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    for (int r = 0; r < 6; r++) {
577fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        int rr = conv_6_to_byte(r);
584d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        for (int g = 0; g < 6; g++) {
597fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org            int gg = conv_6_to_byte(g);
604d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com            for (int b = 0; b < 6; b++) {
617fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org                int bb = conv_6_to_byte(b);
624d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com                *colors++ = SkPreMultiplyARGB(0xFF, rr, gg, bb);
634d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com            }
644d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        }
654d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    }
66c5e15a1afab2621e860a251c3fcf5917867ad49freed    SkColorTable* ctable = new SkColorTable(storage, 216);
676c22573edb234ad14df947278cfed010669a39a7reed    dst->allocPixels(SkImageInfo::Make(src.width(), src.height(),
686c22573edb234ad14df947278cfed010669a39a7reed                                       kIndex_8_SkColorType, kOpaque_SkAlphaType),
696c22573edb234ad14df947278cfed010669a39a7reed                     NULL, ctable);
704d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    ctable->unref();
71fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
724d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    SkAutoLockPixels alps(src);
734d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    SkAutoLockPixels alpd(*dst);
744d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
754d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    for (int y = 0; y < src.height(); y++) {
764d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        const SkPMColor* srcP = src.getAddr32(0, y);
774d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        uint8_t* dstP = dst->getAddr8(0, y);
784d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        for (int x = src.width() - 1; x >= 0; --x) {
797fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org            *dstP++ = compute_666_index(*srcP++);
804d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        }
814d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    }
824d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com}
834d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
84f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RepeatTileBench : public Benchmark {
856c22573edb234ad14df947278cfed010669a39a7reed    const SkColorType   fColorType;
866c22573edb234ad14df947278cfed010669a39a7reed    const SkAlphaType   fAlphaType;
876c22573edb234ad14df947278cfed010669a39a7reed    SkPaint             fPaint;
886c22573edb234ad14df947278cfed010669a39a7reed    SkString            fName;
896c22573edb234ad14df947278cfed010669a39a7reed    SkBitmap            fBitmap;
904d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.compublic:
916c22573edb234ad14df947278cfed010669a39a7reed    RepeatTileBench(SkColorType ct, SkAlphaType at = kPremul_SkAlphaType)
926c22573edb234ad14df947278cfed010669a39a7reed        : fColorType(ct), fAlphaType(at)
936c22573edb234ad14df947278cfed010669a39a7reed    {
944d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        const int w = 50;
954d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        const int h = 50;
964d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
976c22573edb234ad14df947278cfed010669a39a7reed        if (kIndex_8_SkColorType == ct) {
986c22573edb234ad14df947278cfed010669a39a7reed            fBitmap.setInfo(SkImageInfo::MakeN32(w, h, at));
994d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        } else {
1006c22573edb234ad14df947278cfed010669a39a7reed            fBitmap.setInfo(SkImageInfo::Make(w, h, ct, at));
1014d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        }
1027fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fName.printf("repeatTile_%s_%c",
1036c22573edb234ad14df947278cfed010669a39a7reed                     sk_tool_utils::colortype_name(ct), kOpaque_SkAlphaType == at ? 'X' : 'A');
1047fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
1057fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org
1067fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgprotected:
10736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
1087fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        return fName.c_str();
1097fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org    }
110fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
11136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onPreDraw() override {
1127fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        fBitmap.allocPixels();
1136c22573edb234ad14df947278cfed010669a39a7reed        fBitmap.eraseColor(kOpaque_SkAlphaType == fAlphaType ? SK_ColorWHITE : 0);
1144d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1157fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        draw_into_bitmap(fBitmap);
1167fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org
1176c22573edb234ad14df947278cfed010669a39a7reed        if (kIndex_8_SkColorType == fColorType) {
1184d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com            SkBitmap tmp;
1196c22573edb234ad14df947278cfed010669a39a7reed            convert_to_index666(fBitmap, &tmp);
1207fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org            fBitmap = tmp;
1214d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        }
1224d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1237fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org        SkShader* s = SkShader::CreateBitmapShader(fBitmap,
1244d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com                                                   SkShader::kRepeat_TileMode,
1254d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com                                                   SkShader::kRepeat_TileMode);
1264d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        fPaint.setShader(s)->unref();
1274d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    }
1284d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1294d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
13036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(const int loops, SkCanvas* canvas) override {
1314d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        SkPaint paint(fPaint);
1324d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        this->setupPaint(&paint);
1334d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
1354d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com            canvas->drawPaint(paint);
1364d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com        }
1374d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com    }
1384d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1394d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.comprivate:
140f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
1414d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com};
1424d8505992040eaeaf1dc6b91d352e208fa7deaebreed@android.com
1436c22573edb234ad14df947278cfed010669a39a7reedDEF_BENCH(return new RepeatTileBench(kN32_SkColorType, kOpaque_SkAlphaType))
1446c22573edb234ad14df947278cfed010669a39a7reedDEF_BENCH(return new RepeatTileBench(kN32_SkColorType, kPremul_SkAlphaType))
1456c22573edb234ad14df947278cfed010669a39a7reedDEF_BENCH(return new RepeatTileBench(kRGB_565_SkColorType, kOpaque_SkAlphaType))
1466c22573edb234ad14df947278cfed010669a39a7reedDEF_BENCH(return new RepeatTileBench(kIndex_8_SkColorType, kPremul_SkAlphaType))
147