diff options
author | Matt Sarett <msarett@google.com> | 2017-04-03 10:35:42 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-04-03 15:35:55 +0000 |
commit | e6844834087cf9113c64fb638be3945049cf0f47 (patch) | |
tree | 46f20b457cf0b71938680d289c05c2ab235ba9b0 /bench/ColorCanvasDrawBitmapBench.cpp | |
parent | d3ccb0a37f0e62c84fdcd6a77b7b15476b04db7a (diff) |
Avoid extra bitmap copies in SkColorSpaceXformCanvas
Before:
ColorCanvasDrawBitmap_sRGB_to_sRGB 5.09us
ColorCanvasDrawBitmap_AdobeRGB_to_sRGB 50.7us
After:
ColorCanvasDrawBitmap_sRGB_to_sRGB 2.43us
ColorCanvasDrawBitmap_AdobeRGB_to_sRGB 37.1us
BUG=skia:6456
Change-Id: Ie382936c36fd347b59485882cf8f27f315a5d35f
Change-Id: Ie382936c36fd347b59485882cf8f27f315a5d35f
Reviewed-on: https://skia-review.googlesource.com/11040
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'bench/ColorCanvasDrawBitmapBench.cpp')
-rw-r--r-- | bench/ColorCanvasDrawBitmapBench.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/bench/ColorCanvasDrawBitmapBench.cpp b/bench/ColorCanvasDrawBitmapBench.cpp new file mode 100644 index 0000000000..de13ba2afc --- /dev/null +++ b/bench/ColorCanvasDrawBitmapBench.cpp @@ -0,0 +1,57 @@ +/* +* Copyright 2017 Google Inc. +* +* Use of this source code is governed by a BSD-style license that can be +* found in the LICENSE file. +*/ + +#include "Benchmark.h" +#include "SkCanvas.h" +#include "SkColorSpaceXformCanvas.h" +#include "SkString.h" + +class ColorCanvasDrawBitmap : public Benchmark { +public: + ColorCanvasDrawBitmap(sk_sp<SkColorSpace> src, sk_sp<SkColorSpace> dst, const char* name) + : fDst(dst) + , fName(SkStringPrintf("ColorCanvasDrawBitmap_%s", name)) + { + fBitmap.allocPixels(SkImageInfo::MakeN32(100, 100, kOpaque_SkAlphaType, src)); + fBitmap.eraseColor(SK_ColorBLUE); + } + + const char* onGetName() override { + return fName.c_str(); + } + + SkIPoint onGetSize() override { + return SkIPoint::Make(100, 100); + } + + bool isSuitableFor(Backend backend) override { + return kRaster_Backend == backend || kGPU_Backend == backend; + } + + void onDraw(int n, SkCanvas* canvas) override { + // This simulates an Android app that draws bitmaps to a software canvas. + // Chrome and the Android framework both use SkImages exclusively. + std::unique_ptr<SkCanvas> colorCanvas = SkCreateColorSpaceXformCanvas(canvas, fDst); + for (int i = 0; i < n; i++) { + colorCanvas->drawBitmap(fBitmap, 0, 0, nullptr); + } + } + +private: + sk_sp<SkColorSpace> fDst; + SkString fName; + SkBitmap fBitmap; + + typedef Benchmark INHERITED; +}; + +DEF_BENCH(return new ColorCanvasDrawBitmap(nullptr, SkColorSpace::MakeSRGB(), "null_to_sRGB");) +DEF_BENCH(return new ColorCanvasDrawBitmap(SkColorSpace::MakeSRGB(), SkColorSpace::MakeSRGB(), + "sRGB_to_sRGB");) +DEF_BENCH(return new ColorCanvasDrawBitmap( + SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kAdobeRGB_Gamut), + SkColorSpace::MakeSRGB(), "AdobeRGB_to_sRGB");) |