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