Index: bench/XfermodeBench.cpp |
diff --git a/bench/XfermodeBench.cpp b/bench/XfermodeBench.cpp |
index 1dddd8743052ad66cd33700b84565da171be9971..7e61826c79d0a20c2594b4a1e48503257ab784bd 100644 |
--- a/bench/XfermodeBench.cpp |
+++ b/bench/XfermodeBench.cpp |
@@ -13,52 +13,65 @@ |
#include "SkString.h" |
#include "SkXfermode.h" |
-// Benchmark that draws non-AA rects with an SkXfermode::Mode |
+// Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode. |
class XfermodeBench : public Benchmark { |
public: |
- XfermodeBench(SkXfermode::Mode mode) { |
+ XfermodeBench(SkXfermode::Mode mode, bool aa) { |
fXfermode.reset(SkXfermode::Create(mode)); |
+ fAA = aa; |
SkASSERT(fXfermode.get() || SkXfermode::kSrcOver_Mode == mode); |
- fName.printf("Xfermode_%s", SkXfermode::ModeName(mode)); |
+ fName.printf("Xfermode_%s%s", SkXfermode::ModeName(mode), aa ? "_aa" : ""); |
} |
- XfermodeBench(SkXfermode* xferMode, const char* name) { |
+ XfermodeBench(SkXfermode* xferMode, const char* name, bool aa) { |
SkASSERT(xferMode); |
fXfermode.reset(xferMode); |
- fName.printf("Xfermode_%s", name); |
+ fAA = aa; |
+ fName.printf("Xfermode_%s%s", name, aa ? "_aa" : ""); |
} |
protected: |
const char* onGetName() override { return fName.c_str(); } |
void onDraw(const int loops, SkCanvas* canvas) override { |
+ const char* text = "Hamburgefons"; |
+ size_t len = strlen(text); |
SkISize size = canvas->getDeviceSize(); |
SkRandom random; |
for (int i = 0; i < loops; ++i) { |
SkPaint paint; |
paint.setXfermode(fXfermode.get()); |
paint.setColor(random.nextU()); |
- SkScalar w = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize)); |
- SkScalar h = random.nextRangeScalar(SkIntToScalar(kMinSize), SkIntToScalar(kMaxSize)); |
- SkRect rect = SkRect::MakeXYWH( |
- random.nextUScalar1() * (size.fWidth - w), |
- random.nextUScalar1() * (size.fHeight - h), |
- w, |
- h |
- ); |
- for (int j = 0; j < 1000; ++j) { |
- canvas->drawRect(rect, paint); |
+ if (fAA) { |
+ // Draw text to exercise AA code paths. |
+ paint.setAntiAlias(true); |
+ paint.setTextSize(random.nextRangeScalar(12, 96)); |
+ SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth), |
+ y = random.nextRangeScalar(0, (SkScalar)size.fHeight); |
+ for (int j = 0; j < 1000; ++j) { |
+ canvas->drawText(text, len, x, y, paint); |
+ } |
+ } else { |
+ // Draw rects to exercise non-AA code paths. |
+ SkScalar w = random.nextRangeScalar(50, 100); |
+ SkScalar h = random.nextRangeScalar(50, 100); |
+ SkRect rect = SkRect::MakeXYWH( |
+ random.nextUScalar1() * (size.fWidth - w), |
+ random.nextUScalar1() * (size.fHeight - h), |
+ w, |
+ h |
+ ); |
+ for (int j = 0; j < 1000; ++j) { |
+ canvas->drawRect(rect, paint); |
+ } |
} |
} |
} |
private: |
- enum { |
- kMinSize = 50, |
- kMaxSize = 100, |
- }; |
SkAutoTUnref<SkXfermode> fXfermode; |
SkString fName; |
+ bool fAA; |
typedef Benchmark INHERITED; |
}; |
@@ -87,11 +100,9 @@ private: |
////////////////////////////////////////////////////////////////////////////// |
-#define CONCAT_I(x, y) x ## y |
-#define CONCAT(x, y) CONCAT_I(x, y) // allow for macro expansion |
-#define BENCH(...) \ |
- DEF_BENCH( return new XfermodeBench(__VA_ARGS__); );\ |
- |
+#define BENCH(...) \ |
+ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, true); ) \ |
+ DEF_BENCH( return new XfermodeBench(__VA_ARGS__, false); ) |
BENCH(SkXfermode::kClear_Mode) |
BENCH(SkXfermode::kSrc_Mode) |