1 /* 2 * Copyright 2019 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/Benchmark.h" 9 #include "include/core/SkCanvas.h" 10 #include "include/core/SkImage.h" 11 #include "include/core/SkString.h" 12 #include "include/core/SkSurface.h" 13 #include "src/core/SkAutoPixmapStorage.h" 14 15 class CTConvertBench : public Benchmark { 16 public: 17 enum class Mode { kDrawBitmap, kReadPixels }; 18 CTConvertBench(SkColorType from,SkColorType to,Mode m)19 CTConvertBench(SkColorType from, SkColorType to, Mode m) 20 : fName(SkStringPrintf("ctconvert_%d_%d_%s", from, to, 21 m == Mode::kReadPixels ? "readpixels" : "drawbitmap")) 22 , fFrom(from) 23 , fTo(to) 24 , fMode(m) {} 25 isSuitableFor(Backend backend)26 bool isSuitableFor(Backend backend) override { 27 return backend == kNonRendering_Backend; 28 } 29 30 protected: onGetName()31 const char* onGetName() override { 32 return fName.c_str(); 33 } 34 onPreDraw(SkCanvas *)35 void onPreDraw(SkCanvas*) override { 36 if (fSrc.addr()) return; 37 38 fSrc.alloc(SkImageInfo::Make(kBMSize, kBMSize, fFrom, kPremul_SkAlphaType)); 39 fSrc.erase(0x80808080); 40 41 fDst.alloc(SkImageInfo::Make(kBMSize, kBMSize, fTo , kPremul_SkAlphaType)); 42 43 if (fMode == Mode::kDrawBitmap) { 44 fSrcBM.installPixels(fSrc); 45 fDstSurf = SkSurface::MakeRasterDirect(fDst.info(), fDst.writable_addr(), 46 fDst.info().minRowBytes()); 47 } 48 } 49 onDraw(int loops,SkCanvas *)50 void onDraw(int loops, SkCanvas*) override { 51 switch (fMode) { 52 case Mode::kDrawBitmap: { 53 SkPaint p; 54 p.setBlendMode(SkBlendMode::kSrc); 55 for (int i = 0; i < loops; ++i) { 56 fDstSurf->getCanvas()->drawBitmap(fSrcBM, 0, 0, &p); 57 } 58 } break; 59 case Mode::kReadPixels: { 60 for (int i = 0; i < loops; ++i) { 61 fSrc.readPixels(fDst); 62 } 63 } break; 64 } 65 } 66 67 private: 68 static constexpr size_t kBMSize = 512; 69 70 const SkString fName; 71 const SkColorType fFrom, fTo; 72 const Mode fMode; 73 74 SkAutoPixmapStorage fSrc, fDst; 75 SkBitmap fSrcBM; 76 sk_sp<SkSurface> fDstSurf; 77 78 typedef Benchmark INHERITED; 79 }; 80 81 DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kBGRA_8888_SkColorType, 82 CTConvertBench::Mode::kDrawBitmap); ) 83 84 DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kBGRA_8888_SkColorType, 85 CTConvertBench::Mode::kReadPixels); ) 86 87 DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kRGBA_8888_SkColorType, 88 CTConvertBench::Mode::kDrawBitmap); ) 89 90 DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kRGBA_8888_SkColorType, 91 CTConvertBench::Mode::kReadPixels); ) 92