| 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 |