OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "Benchmark.h" | 8 #include "Benchmark.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkPaint.h" | 10 #include "SkPaint.h" |
11 #include "SkRandom.h" | 11 #include "SkRandom.h" |
12 #include "SkString.h" | 12 #include "SkString.h" |
13 #include "SkXfermode.h" | 13 #include "SkXfermode.h" |
14 | 14 |
15 // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode. | 15 // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode. |
16 class XfermodeBench : public Benchmark { | 16 class XfermodeBench : public Benchmark { |
17 public: | 17 public: |
18 XfermodeBench(SkXfermode::Mode mode, bool aa) { | 18 XfermodeBench(SkBlendMode mode, bool aa) : fBlendMode(mode) { |
19 fXfermode = SkXfermode::Make(mode); | |
20 fAA = aa; | 19 fAA = aa; |
21 SkASSERT(fXfermode.get() || SkXfermode::kSrcOver_Mode == mode); | |
22 fName.printf("Xfermode_%s%s", SkXfermode::ModeName(mode), aa ? "_aa" : "
"); | 20 fName.printf("Xfermode_%s%s", SkXfermode::ModeName(mode), aa ? "_aa" : "
"); |
23 } | 21 } |
24 | 22 |
25 protected: | 23 protected: |
26 const char* onGetName() override { return fName.c_str(); } | 24 const char* onGetName() override { return fName.c_str(); } |
27 | 25 |
28 void onDraw(int loops, SkCanvas* canvas) override { | 26 void onDraw(int loops, SkCanvas* canvas) override { |
29 const char* text = "Hamburgefons"; | 27 const char* text = "Hamburgefons"; |
30 size_t len = strlen(text); | 28 size_t len = strlen(text); |
31 SkISize size = canvas->getDeviceSize(); | 29 SkISize size = canvas->getDeviceSize(); |
32 SkRandom random; | 30 SkRandom random; |
33 for (int i = 0; i < loops; ++i) { | 31 for (int i = 0; i < loops; ++i) { |
34 SkPaint paint; | 32 SkPaint paint; |
35 paint.setXfermode(fXfermode); | 33 paint.setBlendMode(fBlendMode); |
36 paint.setColor(random.nextU()); | 34 paint.setColor(random.nextU()); |
37 if (fAA) { | 35 if (fAA) { |
38 // Draw text to exercise AA code paths. | 36 // Draw text to exercise AA code paths. |
39 paint.setAntiAlias(true); | 37 paint.setAntiAlias(true); |
40 paint.setTextSize(random.nextRangeScalar(12, 96)); | 38 paint.setTextSize(random.nextRangeScalar(12, 96)); |
41 SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth), | 39 SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth), |
42 y = random.nextRangeScalar(0, (SkScalar)size.fHeight); | 40 y = random.nextRangeScalar(0, (SkScalar)size.fHeight); |
43 for (int j = 0; j < 1000; ++j) { | 41 for (int j = 0; j < 1000; ++j) { |
44 canvas->drawText(text, len, x, y, paint); | 42 canvas->drawText(text, len, x, y, paint); |
45 } | 43 } |
46 } else { | 44 } else { |
47 // Draw rects to exercise non-AA code paths. | 45 // Draw rects to exercise non-AA code paths. |
48 SkScalar w = random.nextRangeScalar(50, 100); | 46 SkScalar w = random.nextRangeScalar(50, 100); |
49 SkScalar h = random.nextRangeScalar(50, 100); | 47 SkScalar h = random.nextRangeScalar(50, 100); |
50 SkRect rect = SkRect::MakeXYWH( | 48 SkRect rect = SkRect::MakeXYWH( |
51 random.nextUScalar1() * (size.fWidth - w), | 49 random.nextUScalar1() * (size.fWidth - w), |
52 random.nextUScalar1() * (size.fHeight - h), | 50 random.nextUScalar1() * (size.fHeight - h), |
53 w, | 51 w, |
54 h | 52 h |
55 ); | 53 ); |
56 for (int j = 0; j < 1000; ++j) { | 54 for (int j = 0; j < 1000; ++j) { |
57 canvas->drawRect(rect, paint); | 55 canvas->drawRect(rect, paint); |
58 } | 56 } |
59 } | 57 } |
60 } | 58 } |
61 } | 59 } |
62 | 60 |
63 private: | 61 private: |
64 sk_sp<SkXfermode> fXfermode; | 62 SkBlendMode fBlendMode; |
65 SkString fName; | 63 SkString fName; |
66 bool fAA; | 64 bool fAA; |
67 | 65 |
68 typedef Benchmark INHERITED; | 66 typedef Benchmark INHERITED; |
69 }; | 67 }; |
70 | 68 |
71 class XferCreateBench : public Benchmark { | |
72 public: | |
73 bool isSuitableFor(Backend backend) override { | |
74 return backend == kNonRendering_Backend; | |
75 } | |
76 | |
77 protected: | |
78 const char* onGetName() override { return "xfermode_create"; } | |
79 | |
80 void onDraw(int loops, SkCanvas* canvas) override { | |
81 for (int outer = 0; outer < loops * 10; ++outer) { | |
82 for (int i = 0; i <= SkXfermode::kLastMode; ++i) { | |
83 (void)SkXfermode::Make(SkXfermode::Mode(i)); | |
84 } | |
85 } | |
86 } | |
87 | |
88 private: | |
89 typedef Benchmark INHERITED; | |
90 }; | |
91 | |
92 ////////////////////////////////////////////////////////////////////////////// | 69 ////////////////////////////////////////////////////////////////////////////// |
93 | 70 |
94 #define BENCH(...) \ | 71 #define BENCH(...) \ |
95 DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \ | 72 DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \ |
96 DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); ) | 73 DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); ) |
97 | 74 |
98 BENCH(SkXfermode::kClear_Mode) | 75 BENCH(SkBlendMode::kClear) |
99 BENCH(SkXfermode::kSrc_Mode) | 76 BENCH(SkBlendMode::kSrc) |
100 BENCH(SkXfermode::kDst_Mode) | 77 BENCH(SkBlendMode::kDst) |
101 BENCH(SkXfermode::kSrcOver_Mode) | 78 BENCH(SkBlendMode::kSrcOver) |
102 BENCH(SkXfermode::kDstOver_Mode) | 79 BENCH(SkBlendMode::kDstOver) |
103 BENCH(SkXfermode::kSrcIn_Mode) | 80 BENCH(SkBlendMode::kSrcIn) |
104 BENCH(SkXfermode::kDstIn_Mode) | 81 BENCH(SkBlendMode::kDstIn) |
105 BENCH(SkXfermode::kSrcOut_Mode) | 82 BENCH(SkBlendMode::kSrcOut) |
106 BENCH(SkXfermode::kDstOut_Mode) | 83 BENCH(SkBlendMode::kDstOut) |
107 BENCH(SkXfermode::kSrcATop_Mode) | 84 BENCH(SkBlendMode::kSrcATop) |
108 BENCH(SkXfermode::kDstATop_Mode) | 85 BENCH(SkBlendMode::kDstATop) |
109 BENCH(SkXfermode::kXor_Mode) | 86 BENCH(SkBlendMode::kXor) |
110 | 87 |
111 BENCH(SkXfermode::kPlus_Mode) | 88 BENCH(SkBlendMode::kPlus) |
112 BENCH(SkXfermode::kModulate_Mode) | 89 BENCH(SkBlendMode::kModulate) |
113 BENCH(SkXfermode::kScreen_Mode) | 90 BENCH(SkBlendMode::kScreen) |
114 | 91 |
115 BENCH(SkXfermode::kOverlay_Mode) | 92 BENCH(SkBlendMode::kOverlay) |
116 BENCH(SkXfermode::kDarken_Mode) | 93 BENCH(SkBlendMode::kDarken) |
117 BENCH(SkXfermode::kLighten_Mode) | 94 BENCH(SkBlendMode::kLighten) |
118 BENCH(SkXfermode::kColorDodge_Mode) | 95 BENCH(SkBlendMode::kColorDodge) |
119 BENCH(SkXfermode::kColorBurn_Mode) | 96 BENCH(SkBlendMode::kColorBurn) |
120 BENCH(SkXfermode::kHardLight_Mode) | 97 BENCH(SkBlendMode::kHardLight) |
121 BENCH(SkXfermode::kSoftLight_Mode) | 98 BENCH(SkBlendMode::kSoftLight) |
122 BENCH(SkXfermode::kDifference_Mode) | 99 BENCH(SkBlendMode::kDifference) |
123 BENCH(SkXfermode::kExclusion_Mode) | 100 BENCH(SkBlendMode::kExclusion) |
124 BENCH(SkXfermode::kMultiply_Mode) | 101 BENCH(SkBlendMode::kMultiply) |
125 | 102 |
126 BENCH(SkXfermode::kHue_Mode) | 103 BENCH(SkBlendMode::kHue) |
127 BENCH(SkXfermode::kSaturation_Mode) | 104 BENCH(SkBlendMode::kSaturation) |
128 BENCH(SkXfermode::kColor_Mode) | 105 BENCH(SkBlendMode::kColor) |
129 BENCH(SkXfermode::kLuminosity_Mode) | 106 BENCH(SkBlendMode::kLuminosity) |
130 | |
131 DEF_BENCH(return new XferCreateBench;) | |
OLD | NEW |