2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
11 #include "SkXfermodePriv.h"
13 #define USE_AA (1 << 31) // merge with Xfermode::PMFlags w/o conflict
15 #define INNER_LOOPS 1000
17 // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
18 class XferD32Bench : public Benchmark {
20 XferD32Bench(SkBlendMode mode, const char name[], bool doN, uint32_t flags)
22 , fFlags(flags & ~USE_AA)
25 fProc1 = SkXfermode::GetD32Proc(fMode, fFlags | SkXfermode::kSrcIsSingle_D32Flag);
26 fProcN = SkXfermode::GetD32Proc(fMode, fFlags);
27 fName.printf("xfer4f_%s_%s_%c_%s_%s",
29 (flags & USE_AA) ? "aa" : "bw",
31 (flags & SkXfermode::kSrcIsOpaque_D32Flag) ? "opaque" : "alpha",
32 (flags & SkXfermode::kDstIsSRGB_D32Flag) ? "srgb" : "linear");
34 for (int i = 0; i < N; ++i) {
35 fSrc[i] = {{ 1, 1, 1, 1 }};
37 fAAStorage[i] = i * 255 / (N - 1);
48 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
50 const char* onGetName() override { return fName.c_str(); }
52 void onDraw(int loops, SkCanvas*) override {
53 for (int i = 0; i < loops * INNER_LOOPS; ++i) {
55 fProcN(fMode, fDst, fSrc, N, fAA);
57 fProc1(fMode, fDst, fSrc, N, fAA);
65 SkXfermode::D32Proc fProc1;
66 SkXfermode::D32Proc fProcN;
76 uint8_t fAAStorage[N];
78 typedef Benchmark INHERITED;
82 #define F01 (SkXfermode::kSrcIsOpaque_D32Flag)
83 #define F10 (SkXfermode::kDstIsSRGB_D32Flag)
84 #define F11 (SkXfermode::kSrcIsOpaque_D32Flag | SkXfermode::kDstIsSRGB_D32Flag)
86 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F10); )
87 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F00); )
88 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F11); )
89 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F01); )
91 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F10); )
92 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F00); )
93 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F11); )
94 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F01); )
96 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F10 | USE_AA); )
97 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F00 | USE_AA); )
98 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F11 | USE_AA); )
99 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", false, F01 | USE_AA); )
101 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F10 | USE_AA); )
102 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F00 | USE_AA); )
103 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F11 | USE_AA); )
104 DEF_BENCH( return new XferD32Bench(SkBlendMode::kSrcOver, "srcover", true, F01 | USE_AA); )