blob: fc95e8e5ea18818607121e40646ae828ced5be83 [file] [log] [blame]
Mike Klein4ed73e02018-08-06 17:03:33 -04001/*
2* Copyright 2017 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
Mike Klein4ed73e02018-08-06 17:03:33 -04008#include "Benchmark.h"
9#include "SkColor.h"
Mike Kleinc8579562018-08-07 13:21:21 -040010#include "SkColorSpaceXformer.h"
Mike Klein4ed73e02018-08-06 17:03:33 -040011#include "SkColorSpaceXformSteps.h"
12#include "SkMakeUnique.h"
Mike Klein4ed73e02018-08-06 17:03:33 -040013#include "SkRandom.h"
Mike Klein4ed73e02018-08-06 17:03:33 -040014
Mike Klein1a3eb522018-10-18 10:11:00 -040015enum class Mode { steps, xformer };
Mike Klein4ed73e02018-08-06 17:03:33 -040016
17struct ColorSpaceXformBench : public Benchmark {
18 ColorSpaceXformBench(Mode mode) : fMode(mode) {}
19
20 const Mode fMode;
21
Mike Klein1a3eb522018-10-18 10:11:00 -040022 std::unique_ptr<SkColorSpaceXformSteps> fSteps;
23 std::unique_ptr<SkColorSpaceXformer> fXformer;
Mike Kleinc8579562018-08-07 13:21:21 -040024
Mike Klein4ed73e02018-08-06 17:03:33 -040025 const char* onGetName() override {
26 switch (fMode) {
Mike Kleinc8579562018-08-07 13:21:21 -040027 case Mode::steps : return "ColorSpaceXformBench_steps";
Mike Kleinc8579562018-08-07 13:21:21 -040028 case Mode::xformer: return "ColorSpaceXformBench_xformer";
Mike Klein4ed73e02018-08-06 17:03:33 -040029 }
30 return "";
31 }
32
33 bool isSuitableFor(Backend backend) override { return kNonRendering_Backend == backend; }
34
35 void onDelayedSetup() override {
36 sk_sp<SkColorSpace> src = SkColorSpace::MakeSRGB(),
37 dst = SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma,
38 SkColorSpace::kDCIP3_D65_Gamut);
39
Mike Klein8f3d36c2018-08-14 10:28:05 -040040 fSteps = skstd::make_unique<SkColorSpaceXformSteps>(src.get(), kOpaque_SkAlphaType,
41 dst.get(), kPremul_SkAlphaType);
Mike Kleinc8579562018-08-07 13:21:21 -040042 fXformer = SkColorSpaceXformer::Make(dst); // src is implicitly sRGB, what we want anyway
Mike Klein4ed73e02018-08-06 17:03:33 -040043 }
44
45 void onDraw(int n, SkCanvas* canvas) override {
46 volatile SkColor junk = 0;
47 SkRandom rand;
48
49 for (int i = 0; i < n; i++) {
50 SkColor src = rand.nextU(),
51 dst;
Mike Klein4ed73e02018-08-06 17:03:33 -040052 switch (fMode) {
Mike Klein4ed73e02018-08-06 17:03:33 -040053 case Mode::steps: {
Brian Osman9ba9d7d2018-10-26 13:31:32 -040054 SkColor4f rgba = SkColor4f::FromColor(src);
55 fSteps->apply(rgba.vec());
56 dst = rgba.toSkColor();
Mike Klein4ed73e02018-08-06 17:03:33 -040057 } break;
58
Mike Kleinc8579562018-08-07 13:21:21 -040059 case Mode::xformer: {
60 dst = fXformer->apply(src);
61 } break;
Mike Klein4ed73e02018-08-06 17:03:33 -040062 }
63
64 if (false && i == 0) {
65 SkDebugf("%x ~~> %x\n", src, dst);
66 }
67
68 junk ^= dst;
69 }
70 }
71};
72
Mike Kleinc8579562018-08-07 13:21:21 -040073DEF_BENCH(return new ColorSpaceXformBench{Mode::steps };)
Mike Kleinc8579562018-08-07 13:21:21 -040074DEF_BENCH(return new ColorSpaceXformBench{Mode::xformer};)