1 /*
2  * Copyright 2015 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 "CodecBench.h"
9 #include "SkBitmap.h"
10 #include "SkCodec.h"
11 #include "SkImageGenerator.h"
12 #include "SkOSFile.h"
13 
CodecBench(SkString baseName,SkData * encoded,SkColorType colorType)14 CodecBench::CodecBench(SkString baseName, SkData* encoded, SkColorType colorType)
15     : fColorType(colorType)
16     , fData(SkRef(encoded))
17 {
18     // Parse filename and the color type to give the benchmark a useful name
19     const char* colorName;
20     switch(colorType) {
21         case kN32_SkColorType:
22             colorName = "N32";
23             break;
24         case kRGB_565_SkColorType:
25             colorName = "565";
26             break;
27         case kAlpha_8_SkColorType:
28             colorName = "Alpha8";
29             break;
30         default:
31             colorName = "Unknown";
32     }
33     fName.printf("Codec_%s_%s", baseName.c_str(), colorName);
34 #ifdef SK_DEBUG
35     // Ensure that we can create an SkCodec from this data.
36     SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData));
37     SkASSERT(codec);
38 #endif
39 }
40 
onGetName()41 const char* CodecBench::onGetName() {
42     return fName.c_str();
43 }
44 
isSuitableFor(Backend backend)45 bool CodecBench::isSuitableFor(Backend backend) {
46     return kNonRendering_Backend == backend;
47 }
48 
onPreDraw()49 void CodecBench::onPreDraw() {
50     SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(fData));
51 
52     fInfo = codec->getInfo().makeColorType(fColorType);
53     SkAlphaType alphaType;
54     // Caller should not have created this CodecBench if the alpha type was
55     // invalid.
56     SkAssertResult(SkColorTypeValidateAlphaType(fColorType, fInfo.alphaType(),
57                                                 &alphaType));
58     if (alphaType != fInfo.alphaType()) {
59         fInfo = fInfo.makeAlphaType(alphaType);
60     }
61 
62     fPixelStorage.reset(fInfo.getSafeSize(fInfo.minRowBytes()));
63 }
64 
onDraw(const int n,SkCanvas * canvas)65 void CodecBench::onDraw(const int n, SkCanvas* canvas) {
66     SkAutoTDelete<SkCodec> codec;
67     SkPMColor colorTable[256];
68     int colorCount;
69     for (int i = 0; i < n; i++) {
70         colorCount = 256;
71         codec.reset(SkCodec::NewFromData(fData));
72 #ifdef SK_DEBUG
73         const SkImageGenerator::Result result =
74 #endif
75         codec->getPixels(fInfo, fPixelStorage.get(), fInfo.minRowBytes(),
76                          NULL, colorTable, &colorCount);
77         SkASSERT(result == SkImageGenerator::kSuccess
78                  || result == SkImageGenerator::kIncompleteInput);
79     }
80 }
81