Index: gm/multipicturedraw.cpp |
diff --git a/gm/multipicturedraw.cpp b/gm/multipicturedraw.cpp |
index e763e2f4a003882ade0e4cf5a636c525dfaa9898..9a3f1a8df5745da1c3b6f07560939d1b0af80d97 100644 |
--- a/gm/multipicturedraw.cpp |
+++ b/gm/multipicturedraw.cpp |
@@ -21,7 +21,7 @@ static const int kNumHexY = 6; |
static const int kPicWidth = kNumHexX * kHexSide; |
static const int kPicHeight = SkScalarCeilToInt((kNumHexY - 0.5f) * 2 * kHexSide * kRoot3Over2); |
static const SkScalar kInset = 20.0f; |
-static const int kNumPictures = 3; |
+static const int kNumPictures = 4; |
static const int kTriSide = 40; |
@@ -80,6 +80,56 @@ static const SkPicture* make_hex_plane_picture(SkColor fillColor) { |
return recorder.endRecording(); |
} |
+// Create a picture that consists of a single large layer that is tiled |
+// with hexagons. |
+// This is intended to exercise the layer hoisting code's clip handling (in |
+// tile mode). |
+static const SkPicture* make_single_layer_hex_plane_picture() { |
+ |
+ // Create a hexagon with its center at the origin |
+ SkPath hex = make_hex_path(0, 0); |
+ |
+ SkPaint whiteFill; |
+ whiteFill.setStyle(SkPaint::kFill_Style); |
+ whiteFill.setColor(SK_ColorWHITE); |
+ |
+ SkPaint greyFill; |
+ greyFill.setStyle(SkPaint::kFill_Style); |
+ greyFill.setColor(SK_ColorLTGRAY); |
+ |
+ SkPaint stroke; |
+ stroke.setStyle(SkPaint::kStroke_Style); |
+ stroke.setStrokeWidth(3); |
+ |
+ SkPictureRecorder recorder; |
+ |
+ static const SkScalar kBig = 10000.0f; |
+ SkCanvas* canvas = recorder.beginRecording(kBig, kBig); |
+ |
+ SkScalar xPos = 0.0f, yPos = 0.0f; |
+ |
+ for (int y = 0; yPos < kBig; ++y) { |
+ xPos = 0; |
+ |
+ for (int x = 0; xPos < kBig; ++x) { |
+ canvas->save(); |
+ canvas->translate(xPos, yPos + ((x % 2) ? kRoot3Over2 * kHexSide : 0)); |
+ // The color of the filled hex is swapped to yield a different |
+ // pattern in each tile. This allows an error in layer hoisting (e.g., |
+ // the clip isn't blocking cache reuse) to cause a visual discrepancy. |
+ canvas->drawPath(hex, ((x+y) % 3) ? whiteFill : greyFill); |
+ canvas->drawPath(hex, stroke); |
+ canvas->restore(); |
+ |
+ xPos += 1.5f * kHexSide; |
+ } |
+ |
+ yPos += 2 * kHexSide * kRoot3Over2; |
+ } |
+ |
+ return recorder.endRecording(); |
+} |
+ |
// Make an equilateral triangle path with its top corner at (originX, originY) |
static SkPath make_tri_path(SkScalar originX, SkScalar originY) { |
SkPath tri; |
@@ -265,13 +315,18 @@ static void sierpinski(SkCanvas* canvas, const SkPicture* pictures[kNumPictures] |
canvas->restore(); |
} |
+static void big_layer(SkCanvas* canvas, const SkPicture* pictures[kNumPictures]) { |
+ canvas->drawPicture(pictures[3]); |
+} |
+ |
static const PFContentMtd gContentMthds[] = { |
no_clip, |
rect_clip, |
rrect_clip, |
path_clip, |
invpath_clip, |
- sierpinski |
+ sierpinski, |
+ big_layer, |
}; |
static void create_content(SkMultiPictureDraw* mpd, PFContentMtd pfGen, |
@@ -371,8 +426,9 @@ namespace skiagm { |
kPathClipMulti_Content, |
kInvPathClipMulti_Content, |
kSierpinski_Content, |
+ kBigLayer_Content, |
- kLast_Content = kSierpinski_Content |
+ kLast_Content = kBigLayer_Content |
}; |
static const int kContentCnt = kLast_Content + 1; |
@@ -410,6 +466,7 @@ namespace skiagm { |
fPictures[0] = make_hex_plane_picture(SK_ColorWHITE); |
fPictures[1] = make_hex_plane_picture(SK_ColorGRAY); |
fPictures[2] = make_sierpinski_picture(); |
+ fPictures[3] = make_single_layer_hex_plane_picture(); |
} |
virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
@@ -437,7 +494,8 @@ namespace skiagm { |
virtual SkString onShortName() SK_OVERRIDE { |
static const char* gContentNames[] = { |
- "noclip", "rectclip", "rrectclip", "pathclip", "invpathclip", "sierpinski" |
+ "noclip", "rectclip", "rrectclip", "pathclip", |
+ "invpathclip", "sierpinski", "biglayer" |
}; |
static const char* gLayoutNames[] = { "simple", "tiled" }; |
@@ -470,6 +528,8 @@ namespace skiagm { |
MultiPictureDraw::kSimple_Layout));) |
DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Content, |
MultiPictureDraw::kSimple_Layout));) |
+ DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kBigLayer_Content, |
+ MultiPictureDraw::kSimple_Layout));) |
DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kNoClipSingle_Content, |
MultiPictureDraw::kTiled_Layout));) |
@@ -483,4 +543,6 @@ namespace skiagm { |
MultiPictureDraw::kTiled_Layout));) |
DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Content, |
MultiPictureDraw::kTiled_Layout));) |
+ DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kBigLayer_Content, |
+ MultiPictureDraw::kTiled_Layout));) |
} |