Index: gm/bigrect.cpp |
diff --git a/gm/bigrect.cpp b/gm/bigrect.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9773d379086aac79fc6e56e00efcffe5ef3a4ea3 |
--- /dev/null |
+++ b/gm/bigrect.cpp |
@@ -0,0 +1,104 @@ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+ |
+// Draws big rects with clip (0, 0, 35, 35). The size of the rects is given by big. |
+void DrawBigRect(SkCanvas* canvas, SkScalar big, const SkPaint& rectPaint) { |
+ // Looks like this: |
+ // +-+-+--+-+------+ |
+ // | | | | | +---+ |
+ // | +-+ | | +---+ |
+ // | | | | |
+ // +------+-+------+ |
+ // +------+-+------+ |
+ // | | | | |
+ // +---+ | | +-+ | |
+ // +---+ | | | | | |
+ // +------+-+--+-+-+ |
+ |
+ canvas->clipRect({0, 0, 35, 35}); |
+ |
+ // Align to pixel boundaries. |
+ canvas->translate(0.5, 0.5); |
+ |
+ SkRect tl = SkRect::MakeLTRB(5, -big, 10, 10); |
+ canvas->drawRect(tl, rectPaint); |
+ |
+ SkRect tr = SkRect::MakeLTRB(25, 5, big, 10); |
+ canvas->drawRect(tr, rectPaint); |
+ |
+ SkRect br = SkRect::MakeLTRB(25, 25, 30, big); |
+ canvas->drawRect(br, rectPaint); |
+ |
+ SkRect bl = SkRect::MakeLTRB(-big, 25, 10, 30); |
+ canvas->drawRect(bl, rectPaint); |
+ |
+ SkRect horiz = SkRect::MakeLTRB(-big, 15, big, 20); |
+ canvas->drawRect(horiz, rectPaint); |
+ |
+ SkRect vert = SkRect::MakeLTRB(15, -big, 20, big); |
+ canvas->drawRect(vert, rectPaint); |
+ |
+ SkRect leftBorder = SkRect::MakeLTRB(-2, -1, 0, 35); |
+ canvas->drawRect(leftBorder, rectPaint); |
+ |
+ SkRect topBorder = SkRect::MakeLTRB(-1, -2, 35, 0); |
+ canvas->drawRect(topBorder, rectPaint); |
+ |
+ SkRect rightBorder = SkRect::MakeLTRB(34, -1, 36, 35); |
+ canvas->drawRect(rightBorder, rectPaint); |
+ |
+ SkRect bottomBorder = SkRect::MakeLTRB(-1, 34, 35, 36); |
+ canvas->drawRect(bottomBorder, rectPaint); |
+ |
+ SkPaint outOfBoundsPaint; |
+ outOfBoundsPaint.setColor(SK_ColorRED); |
+ outOfBoundsPaint.setStyle(SkPaint::kStroke_Style); |
+ outOfBoundsPaint.setStrokeWidth(0); |
+ |
+ SkRect outOfBounds = SkRect::MakeLTRB(-1, -1, 35, 35); |
+ canvas->drawRect(outOfBounds, outOfBoundsPaint); |
+} |
+ |
+DEF_SIMPLE_GM(bigrect, canvas, 325, 125) { |
+ // Test with sizes: |
+ // - reasonable size (for comparison), |
+ // - outside the range of int32, and |
+ // - outside the range of SkFixed. |
+ static const SkScalar sizes[] = {SkIntToScalar(100), 5e10f, 1e6f}; |
+ |
+ for (int i = 0; i < 8; i++) { |
+ for (int j = 0; j < 3; j++) { |
+ canvas->save(); |
+ canvas->translate(SkIntToScalar(i*40+5), SkIntToScalar(j*40+5)); |
+ |
+ SkPaint paint; |
+ paint.setColor(SK_ColorBLUE); |
+ // These are the three parameters that affect the behavior of SkDraw::drawRect. |
+ if (i & 1) { |
+ paint.setStyle(SkPaint::kFill_Style); |
+ } else { |
+ paint.setStyle(SkPaint::kStroke_Style); |
+ } |
+ if (i & 2) { |
+ paint.setStrokeWidth(1); |
+ } else { |
+ paint.setStrokeWidth(0); |
+ } |
+ if (i & 4) { |
+ paint.setAntiAlias(true); |
+ } else { |
+ paint.setAntiAlias(false); |
+ } |
+ |
+ const SkScalar big = SkFloatToScalar(sizes[j]); |
+ DrawBigRect(canvas, big, paint); |
+ canvas->restore(); |
+ } |
+ } |
+} |