12bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com/* 22bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * Copyright 2013 Google Inc. 32bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * 42bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * Use of this source code is governed by a BSD-style license that can be 52bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com * found in the LICENSE file. 62bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com */ 72bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 92bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkBitmap.h" 102bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkData.h" 112bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkForceLinking.h" 122bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkImageDecoder.h" 132bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkOSFile.h" 142bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkStream.h" 152bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#include "SkString.h" 162bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 172bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com__SK_FORCE_IMAGE_DECODER_LINKING; 182bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 192bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comclass SkCanvas; 202bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 21f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ImageDecodeBench : public Benchmark { 222bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.compublic: 232bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com ImageDecodeBench(void* p, const char* filename) 24410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com : fName("image_decode_") 252bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com , fFilename(filename) 262bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com , fStream() 272bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com , fValid(false) { 282bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com fName.append(SkOSPath::SkBasename(filename)); 29644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 30644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 31644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 32644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 332bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 342bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 352bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comprotected: 362bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com virtual const char* onGetName() SK_OVERRIDE { 372bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com return fName.c_str(); 382bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 392bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 402bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com virtual void onPreDraw() SK_OVERRIDE { 412bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkFILEStream fileStream(fFilename.c_str()); 422bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com fValid = fileStream.isValid() && fileStream.getLength() > 0; 432bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com if (fValid) { 442bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com const size_t size = fileStream.getLength(); 452bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com void* data = sk_malloc_throw(size); 462bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com if (fileStream.read(data, size) < size) { 472bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com fValid = false; 482bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } else { 492bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkAutoTUnref<SkData> skdata(SkData::NewFromMalloc(data, size)); 502bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com fStream.setData(skdata.get()); 512bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 522bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 532bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 542bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 562bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG 572bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com if (!fValid) { 582bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkDebugf("stream was invalid: %s\n", fName.c_str()); 592bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com return; 602bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 612bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif 622bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com // Decode a bunch of times 632bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkBitmap bm; 643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 652bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkDEBUGCODE(bool success =) SkImageDecoder::DecodeStream(&fStream, &bm); 662bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG 672bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com if (!success) { 682bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkDebugf("failed to decode %s\n", fName.c_str()); 692bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com return; 702bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 712bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif 722bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkDEBUGCODE(success =) fStream.rewind(); 732bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#ifdef SK_DEBUG 742bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com if (!success) { 752bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkDebugf("failed to rewind %s\n", fName.c_str()); 762bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com return; 772bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 782bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com#endif 792bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 802bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com } 812bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 822bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.comprivate: 832bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkString fName; 842bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com const SkString fFilename; 852bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com SkMemoryStream fStream; 862bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com bool fValid; 872bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 88f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 892bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com}; 902bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com 912bbc2c945bb0ecf18fd6473af74ad1a2f5e727a7scroggo@google.com// These are files which call decodePalette 92410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com//DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/hal_163x90.png")); ) 93410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com//DEF_BENCH( return SkNEW_ARGS(ImageDecodeBench, ("/usr/local/google/home/scroggo/Downloads/images/box_19_top-left.png")); ) 94