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