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