1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "AndroidCodecBench.h" 9 #include "CodecBenchPriv.h" 10 #include "SkBitmap.h" 11 #include "SkAndroidCodec.h" 12 #include "SkCommandLineFlags.h" 13 #include "SkOSFile.h" 14 15 AndroidCodecBench::AndroidCodecBench(SkString baseName, SkData* encoded, int sampleSize) 16 : fData(SkRef(encoded)) 17 , fSampleSize(sampleSize) 18 { 19 // Parse filename and the color type to give the benchmark a useful name 20 fName.printf("AndroidCodec_%s_SampleSize%d", baseName.c_str(), sampleSize); 21 } 22 23 const char* AndroidCodecBench::onGetName() { 24 return fName.c_str(); 25 } 26 27 bool AndroidCodecBench::isSuitableFor(Backend backend) { 28 return kNonRendering_Backend == backend; 29 } 30 31 void AndroidCodecBench::onDelayedSetup() { 32 std::unique_ptr<SkAndroidCodec> codec(SkAndroidCodec::MakeFromData(fData)); 33 SkISize scaledSize = codec->getSampledDimensions(fSampleSize); 34 35 fInfo = codec->getInfo().makeWH(scaledSize.width(), scaledSize.height()) 36 .makeColorType(kN32_SkColorType); 37 if (kUnpremul_SkAlphaType == fInfo.alphaType()) { 38 fInfo = fInfo.makeAlphaType(kPremul_SkAlphaType); 39 } 40 41 fPixelStorage.reset(fInfo.computeMinByteSize()); 42 } 43 44 void AndroidCodecBench::onDraw(int n, SkCanvas* canvas) { 45 std::unique_ptr<SkAndroidCodec> codec; 46 SkAndroidCodec::AndroidOptions options; 47 options.fSampleSize = fSampleSize; 48 for (int i = 0; i < n; i++) { 49 codec = SkAndroidCodec::MakeFromData(fData); 50 #ifdef SK_DEBUG 51 const SkCodec::Result result = 52 #endif 53 codec->getAndroidPixels(fInfo, fPixelStorage.get(), fInfo.minRowBytes(), &options); 54 SkASSERT(result == SkCodec::kSuccess || result == SkCodec::kIncompleteInput); 55 } 56 } 57