From e6844834087cf9113c64fb638be3945049cf0f47 Mon Sep 17 00:00:00 2001 From: Matt Sarett Date: Mon, 3 Apr 2017 10:35:42 -0400 Subject: 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 Commit-Queue: Matt Sarett --- bench/ColorCanvasDrawBitmapBench.cpp | 57 ++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 bench/ColorCanvasDrawBitmapBench.cpp (limited to 'bench/ColorCanvasDrawBitmapBench.cpp') 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 src, sk_sp 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 colorCanvas = SkCreateColorSpaceXformCanvas(canvas, fDst); + for (int i = 0; i < n; i++) { + colorCanvas->drawBitmap(fBitmap, 0, 0, nullptr); + } + } + +private: + sk_sp 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");) -- cgit v1.2.3