• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2013 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 "Benchmark.h"
9 #include "Resources.h"
10 #include "SkBitmap.h"
11 #include "SkData.h"
12 #include "SkForceLinking.h"
13 #include "SkImageDecoder.h"
14 #include "SkOSFile.h"
15 #include "SkStream.h"
16 #include "SkString.h"
17 
18 __SK_FORCE_IMAGE_DECODER_LINKING;
19 
20 class SkCanvas;
21 
22 class SkipZeroesBench : public Benchmark {
23 public:
SkipZeroesBench(const char * filename,bool skipZeroes)24     SkipZeroesBench(const char* filename, bool skipZeroes)
25     : fName("SkipZeroes_")
26     , fDecoder(NULL)
27     , fFilename(filename)
28     , fStream()
29     , fSkipZeroes(skipZeroes)
30     , fValid(false) {
31         fName.append(filename);
32         if (skipZeroes) {
33             fName.append("_skip_zeroes");
34         } else {
35             fName.append("_write_zeroes");
36         }
37     }
38 
isSuitableFor(Backend backend)39     virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
40         return backend == kNonRendering_Backend;
41     }
42 
43 protected:
onGetName()44     virtual const char* onGetName() SK_OVERRIDE {
45         return fName.c_str();
46     }
47 
onPreDraw()48     virtual void onPreDraw() SK_OVERRIDE {
49         SkString resourcePath = GetResourcePath();
50         if (resourcePath.isEmpty()) {
51             fValid = false;
52             return;
53         }
54 
55         SkString fullPath = SkOSPath::SkPathJoin(resourcePath.c_str(),
56                                                  fFilename.c_str());
57         SkFILEStream fileStream(fullPath.c_str());
58         fValid = fileStream.isValid() && fileStream.getLength() > 0;
59         if (fValid) {
60             const size_t size = fileStream.getLength();
61             void* data = sk_malloc_throw(size);
62             if (fileStream.read(data, size) < size) {
63                 fValid = false;
64             } else {
65                 SkAutoTUnref<SkData> skdata(SkData::NewFromMalloc(data, size));
66                 fStream.setData(skdata.get());
67                 fDecoder.reset(SkImageDecoder::Factory(&fStream));
68                 if (fDecoder.get()) {
69                     fDecoder->setSkipWritingZeroes(fSkipZeroes);
70                 } else {
71                     fValid = false;
72                 }
73             }
74         }
75     }
76 
onDraw(const int loops,SkCanvas *)77     virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
78         if (!fValid) {
79 #ifdef SK_DEBUG
80             SkDebugf("stream was invalid: %s\n", fFilename.c_str());
81 #endif
82             return;
83         }
84         // Decode a bunch of times
85         SkBitmap bm;
86         for (int i = 0; i < loops; ++i) {
87             SkDEBUGCODE(bool success =) fDecoder->decode(&fStream, &bm,
88                                                          SkImageDecoder::kDecodePixels_Mode);
89 #ifdef SK_DEBUG
90             if (!success) {
91                 SkDebugf("failed to decode %s\n", fFilename.c_str());
92                 return;
93             }
94 #endif
95             SkDEBUGCODE(success =) fStream.rewind();
96 #ifdef SK_DEBUG
97             if (!success) {
98                 SkDebugf("failed to rewind %s\n", fFilename.c_str());
99                 return;
100             }
101 #endif
102         }
103     }
104 
105 private:
106     SkString                        fName;
107     SkAutoTDelete<SkImageDecoder>   fDecoder;
108     const SkString                  fFilename;
109     SkMemoryStream                  fStream;
110     bool                            fSkipZeroes;
111     bool                            fValid;
112 
113     typedef Benchmark INHERITED;
114 };
115 
116 // Enable the true version once the feature is checked in.
117 DEF_BENCH( return SkNEW_ARGS(SkipZeroesBench, ("arrow.png", true)));
118 DEF_BENCH( return SkNEW_ARGS(SkipZeroesBench, ("arrow.png", false)));
119