// Two pictures with a clip path on the second one static void path_clip(SkCanvas* canvas, const SkPicture* pictures[kNumPictures]) { canvas->drawPicture(pictures[0]); // Create a hexagon centered on the middle of the hex grid SkPath hex = make_hex_path((kNumHexX / 2.0f) * kHexSide, kNumHexY * kHexSide * kRoot3Over2); canvas->clipPath(hex); canvas->drawPicture(pictures[1]); }
// 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_tool_utils::color_to_565(SK_ColorLTGRAY)); SkPaint stroke; stroke.setStyle(SkPaint::kStroke_Style); stroke.setStrokeWidth(3); SkPictureRecorder recorder; SkRTreeFactory bbhFactory; static const SkScalar kBig = 10000.0f; SkCanvas* canvas = recorder.beginRecording(kBig, kBig, &bbhFactory, SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); canvas->saveLayer(nullptr, nullptr); 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; } canvas->restore(); return recorder.endRecording(); }
// Make a picture that is a tiling of the plane with stroked hexagons where // each hexagon is in its own layer. The layers are to exercise Ganesh's // layer hoisting. static const SkPicture* make_hex_plane_picture(SkColor fillColor) { // Create a hexagon with its center at the origin SkPath hex = make_hex_path(0, 0); SkPaint fill; fill.setStyle(SkPaint::kFill_Style); fill.setColor(fillColor); SkPaint stroke; stroke.setStyle(SkPaint::kStroke_Style); stroke.setStrokeWidth(3); SkPictureRecorder recorder; SkRTreeFactory bbhFactory; SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kPicWidth), SkIntToScalar(kPicHeight), &bbhFactory, SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); SkScalar xPos, yPos = 0; for (int y = 0; y < kNumHexY; ++y) { xPos = 0; for (int x = 0; x < kNumHexX; ++x) { canvas->saveLayer(nullptr, nullptr); canvas->translate(xPos, yPos + ((x % 2) ? kRoot3Over2 * kHexSide : 0)); canvas->drawPath(hex, fill); canvas->drawPath(hex, stroke); canvas->restore(); xPos += 1.5f * kHexSide; } yPos += 2 * kHexSide * kRoot3Over2; } return recorder.endRecording(); }