160869a42a133942f852dd0f1696444c2a5c9ad83scroggo/* 260869a42a133942f852dd0f1696444c2a5c9ad83scroggo * Copyright 2015 Google Inc. 360869a42a133942f852dd0f1696444c2a5c9ad83scroggo * 460869a42a133942f852dd0f1696444c2a5c9ad83scroggo * Use of this source code is governed by a BSD-style license that can be 560869a42a133942f852dd0f1696444c2a5c9ad83scroggo * found in the LICENSE file. 660869a42a133942f852dd0f1696444c2a5c9ad83scroggo */ 760869a42a133942f852dd0f1696444c2a5c9ad83scroggo 860869a42a133942f852dd0f1696444c2a5c9ad83scroggo#include "CodecBench.h" 97f69144aaabbedf51ad2a1feddc9e0689f2c5ee9msarett#include "CodecBenchPriv.h" 1060869a42a133942f852dd0f1696444c2a5c9ad83scroggo#include "SkBitmap.h" 1160869a42a133942f852dd0f1696444c2a5c9ad83scroggo#include "SkCodec.h" 12c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein#include "SkCommandLineFlags.h" 1360869a42a133942f852dd0f1696444c2a5c9ad83scroggo#include "SkOSFile.h" 1460869a42a133942f852dd0f1696444c2a5c9ad83scroggo 15c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein// Actually zeroing the memory would throw off timing, so we just lie. 16c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtkleinDEFINE_bool(zero_init, false, "Pretend our destination is zero-intialized, simulating Android?"); 17c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein 18c7796b93f02e736df967301d3c46cec46dd02d5cmsarettCodecBench::CodecBench(SkString baseName, SkData* encoded, SkColorType colorType, 19c7796b93f02e736df967301d3c46cec46dd02d5cmsarett SkAlphaType alphaType) 2060869a42a133942f852dd0f1696444c2a5c9ad83scroggo : fColorType(colorType) 21c7796b93f02e736df967301d3c46cec46dd02d5cmsarett , fAlphaType(alphaType) 2260869a42a133942f852dd0f1696444c2a5c9ad83scroggo , fData(SkRef(encoded)) 2360869a42a133942f852dd0f1696444c2a5c9ad83scroggo{ 2460869a42a133942f852dd0f1696444c2a5c9ad83scroggo // Parse filename and the color type to give the benchmark a useful name 25c7796b93f02e736df967301d3c46cec46dd02d5cmsarett fName.printf("Codec_%s_%s%s", baseName.c_str(), color_type_to_str(colorType), 26c7796b93f02e736df967301d3c46cec46dd02d5cmsarett alpha_type_to_str(alphaType)); 2760869a42a133942f852dd0f1696444c2a5c9ad83scroggo#ifdef SK_DEBUG 2860869a42a133942f852dd0f1696444c2a5c9ad83scroggo // Ensure that we can create an SkCodec from this data. 2960869a42a133942f852dd0f1696444c2a5c9ad83scroggo SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData)); 3060869a42a133942f852dd0f1696444c2a5c9ad83scroggo SkASSERT(codec); 3160869a42a133942f852dd0f1696444c2a5c9ad83scroggo#endif 3260869a42a133942f852dd0f1696444c2a5c9ad83scroggo} 3360869a42a133942f852dd0f1696444c2a5c9ad83scroggo 3460869a42a133942f852dd0f1696444c2a5c9ad83scroggoconst char* CodecBench::onGetName() { 3560869a42a133942f852dd0f1696444c2a5c9ad83scroggo return fName.c_str(); 3660869a42a133942f852dd0f1696444c2a5c9ad83scroggo} 3760869a42a133942f852dd0f1696444c2a5c9ad83scroggo 3860869a42a133942f852dd0f1696444c2a5c9ad83scroggobool CodecBench::isSuitableFor(Backend backend) { 3960869a42a133942f852dd0f1696444c2a5c9ad83scroggo return kNonRendering_Backend == backend; 4060869a42a133942f852dd0f1696444c2a5c9ad83scroggo} 4160869a42a133942f852dd0f1696444c2a5c9ad83scroggo 428a6697af95b340aad6dee7e6228048fa305c1e59joshualittvoid CodecBench::onDelayedSetup() { 4360869a42a133942f852dd0f1696444c2a5c9ad83scroggo SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData)); 4421027994192f395bbd1507558b84f59b3c7cf0dascroggo 45c7796b93f02e736df967301d3c46cec46dd02d5cmsarett fInfo = codec->getInfo().makeColorType(fColorType).makeAlphaType(fAlphaType); 4621027994192f395bbd1507558b84f59b3c7cf0dascroggo 4721027994192f395bbd1507558b84f59b3c7cf0dascroggo fPixelStorage.reset(fInfo.getSafeSize(fInfo.minRowBytes())); 4860869a42a133942f852dd0f1696444c2a5c9ad83scroggo} 4960869a42a133942f852dd0f1696444c2a5c9ad83scroggo 50a1ebeb25e9acfcd801e089e063311d716b83b8a5mtkleinvoid CodecBench::onDraw(int n, SkCanvas* canvas) { 5160869a42a133942f852dd0f1696444c2a5c9ad83scroggo SkAutoTDelete<SkCodec> codec; 5221027994192f395bbd1507558b84f59b3c7cf0dascroggo SkPMColor colorTable[256]; 5321027994192f395bbd1507558b84f59b3c7cf0dascroggo int colorCount; 54c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein SkCodec::Options options; 55c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein if (FLAGS_zero_init) { 56c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein options.fZeroInitialized = SkCodec::kYes_ZeroInitialized; 57c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein } 5860869a42a133942f852dd0f1696444c2a5c9ad83scroggo for (int i = 0; i < n; i++) { 5921027994192f395bbd1507558b84f59b3c7cf0dascroggo colorCount = 256; 6060869a42a133942f852dd0f1696444c2a5c9ad83scroggo codec.reset(SkCodec::NewFromData(fData)); 6160869a42a133942f852dd0f1696444c2a5c9ad83scroggo#ifdef SK_DEBUG 62eb602a5c94078fb2956c9bdc64bbf47a31b9c0e5scroggo const SkCodec::Result result = 6360869a42a133942f852dd0f1696444c2a5c9ad83scroggo#endif 6421027994192f395bbd1507558b84f59b3c7cf0dascroggo codec->getPixels(fInfo, fPixelStorage.get(), fInfo.minRowBytes(), 65c146aa6fd45dffe29b4f565aafd4ec3a16d9f73bmtklein &options, colorTable, &colorCount); 66eb602a5c94078fb2956c9bdc64bbf47a31b9c0e5scroggo SkASSERT(result == SkCodec::kSuccess 67eb602a5c94078fb2956c9bdc64bbf47a31b9c0e5scroggo || result == SkCodec::kIncompleteInput); 6860869a42a133942f852dd0f1696444c2a5c9ad83scroggo } 6960869a42a133942f852dd0f1696444c2a5c9ad83scroggo} 70