1b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com/* 2b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * Copyright 2013 Google Inc. 3b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * 4b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * Use of this source code is governed by a BSD-style license that can be 5b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com * found in the LICENSE file. 6b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com */ 7b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkBlurMask.h" 10b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkCanvas.h" 11b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkPaint.h" 12b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkRandom.h" 13b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkShader.h" 14b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com#include "SkString.h" 15b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 16f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapScaleBench: public Benchmark { 17b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com int fLoopCount; 18b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com int fInputSize; 19b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com int fOutputSize; 20b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkString fName; 21b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 22b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.compublic: 23410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com BitmapScaleBench( int is, int os) { 24b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com fInputSize = is; 25b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com fOutputSize = os; 26b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 27523521c6bc4b96b0839da65451960d84c4dfde2ahumper@google.com fLoopCount = 20; 28b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 29b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 30b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprotected: 319e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 32b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkBitmap fInputBitmap, fOutputBitmap; 33b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkMatrix fMatrix; 349e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 35b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com virtual const char* onGetName() { 36b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com return fName.c_str(); 37b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 38b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 39b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com int inputSize() const { 40b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com return fInputSize; 41b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 429e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 43b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com int outputSize() const { 44b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com return fOutputSize; 45b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 469e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 47b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com float scale() const { 48b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com return float(outputSize())/inputSize(); 49b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 509e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 51b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkIPoint onGetSize() SK_OVERRIDE { 52b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com return SkIPoint::Make( fOutputSize, fOutputSize ); 53b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 54b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 55b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com void setName(const char * name) { 56b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com fName.printf( "bitmap_scale_%s_%d_%d", name, fInputSize, fOutputSize ); 57b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 589e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 59b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com virtual void onPreDraw() { 606c22573edb234ad14df947278cfed010669a39a7reed fInputBitmap.allocN32Pixels(fInputSize, fInputSize, true); 61b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com fInputBitmap.eraseColor(SK_ColorWHITE); 629e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 636c22573edb234ad14df947278cfed010669a39a7reed fOutputBitmap.allocN32Pixels(fOutputSize, fOutputSize, true); 649e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 65b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com fMatrix.setScale( scale(), scale() ); 66b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 67b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 683361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) { 69b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkPaint paint; 70b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com this->setupPaint(&paint); 71b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 72b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com preBenchSetup(); 73b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 743361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 75b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com doScaleImage(); 76b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 77b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 78b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 79b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com virtual void doScaleImage() = 0; 80b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com virtual void preBenchSetup() {} 81b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprivate: 82f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 83b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com}; 84b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 85b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comclass BitmapFilterScaleBench: public BitmapScaleBench { 86b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com public: 87410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com BitmapFilterScaleBench( int is, int os) : INHERITED(is, os) { 88b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com setName( "filter" ); 89b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 90b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprotected: 91b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com virtual void doScaleImage() SK_OVERRIDE { 92b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkCanvas canvas( fOutputBitmap ); 93b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com SkPaint paint; 949e1ec1a52985cce9db3a0d0e8d448b82a32e70cbskia.committer@gmail.com 959cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com paint.setFilterLevel(SkPaint::kHigh_FilterLevel); 961b28f6f1ce3de9bc5ef1182e94df11f9f5610913commit-bot@chromium.org fInputBitmap.notifyPixelsChanged(); 97b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com canvas.drawBitmapMatrix( fInputBitmap, fMatrix, &paint ); 98b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com } 99b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.comprivate: 100b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com typedef BitmapScaleBench INHERITED; 101b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com}; 102b088947f27496a9b9dc48a7cfb170f9d59589825humper@google.com 103410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(10, 90);) 104410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(30, 90);) 105410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(80, 90);) 106410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 90);) 107410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 80);) 108410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 30);) 109410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(90, 10);) 110410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(256, 64);) 111410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new BitmapFilterScaleBench(64, 256);) 112