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 "bench/AndroidCodecBench.h"
9#include "bench/CodecBenchPriv.h"
10#include "include/codec/SkAndroidCodec.h"
11#include "include/core/SkBitmap.h"
12#include "src/core/SkOSFile.h"
13#include "tools/flags/CommandLineFlags.h"
14
15AndroidCodecBench::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
23const char* AndroidCodecBench::onGetName() {
24    return fName.c_str();
25}
26
27bool AndroidCodecBench::isSuitableFor(Backend backend) {
28    return kNonRendering_Backend == backend;
29}
30
31void AndroidCodecBench::onDelayedSetup() {
32    std::unique_ptr<SkAndroidCodec> codec(SkAndroidCodec::MakeFromData(fData));
33    SkISize scaledSize = codec->getSampledDimensions(fSampleSize);
34
35    fInfo = codec->getInfo().makeDimensions(scaledSize).makeColorType(kN32_SkColorType);
36    if (kUnpremul_SkAlphaType == fInfo.alphaType()) {
37        fInfo = fInfo.makeAlphaType(kPremul_SkAlphaType);
38    }
39
40    fPixelStorage.reset(fInfo.computeMinByteSize());
41}
42
43void AndroidCodecBench::onDraw(int n, SkCanvas* canvas) {
44    std::unique_ptr<SkAndroidCodec> codec;
45    SkAndroidCodec::AndroidOptions options;
46    options.fSampleSize = fSampleSize;
47    for (int i = 0; i < n; i++) {
48        codec = SkAndroidCodec::MakeFromData(fData);
49#ifdef SK_DEBUG
50        const SkCodec::Result result =
51#endif
52        codec->getAndroidPixels(fInfo, fPixelStorage.get(), fInfo.minRowBytes(), &options);
53        SkASSERT(result == SkCodec::kSuccess || result == SkCodec::kIncompleteInput);
54    }
55}
56