Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Unified Diff: gm/multipicturedraw.cpp

Issue 617723004: Add a MultiPictureDraw GM to exercise layer clipping (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Removed stray '\n' Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));)
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698