| // Copyright 2020 Google LLC. |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
| #include "tools/fiddle/examples.h" |
| #include <cfloat> |
| |
| REG_FIDDLE(strokerect_gm, 1400, 740, false, 0) { |
| void draw(SkCanvas* canvas) { |
| constexpr SkScalar kStrokeWidth = 20; |
| constexpr SkPaint::Join gJoins[] = {SkPaint::kMiter_Join, SkPaint::kRound_Join, |
| SkPaint::kBevel_Join}; |
| constexpr SkScalar W = 80; |
| constexpr SkScalar H = 80; |
| constexpr SkRect gRects[] = { |
| {0, 0, W, H}, |
| {W, 0, 0, H}, |
| {0, H, W, 0}, |
| {0, 0, kStrokeWidth, H}, |
| {0, 0, W, kStrokeWidth}, |
| {0, 0, kStrokeWidth / 2, kStrokeWidth / 2}, |
| {0, 0, W, 0}, |
| {0, 0, 0, H}, |
| {0, 0, 0, 0}, |
| {0, 0, W, FLT_EPSILON}, |
| {0, 0, FLT_EPSILON, H}, |
| {0, 0, FLT_EPSILON, FLT_EPSILON}, |
| }; |
| canvas->translate(kStrokeWidth * 3 / 2, kStrokeWidth * 3 / 2); |
| for (int doFill = 0; doFill <= 1; ++doFill) { |
| SkPaint::Style style = doFill ? SkPaint::kStrokeAndFill_Style : SkPaint::kStroke_Style; |
| for (size_t i = 0; i < std::size(gJoins); ++i) { |
| SkPaint::Join join = gJoins[i]; |
| for (size_t j = 0; j < std::size(gRects); ++j) { |
| SkAutoCanvasRestore acr(canvas, true); |
| canvas->translate( |
| j * (W + 2 * kStrokeWidth), |
| (i + doFill * std::size(gJoins)) * (H + 2 * kStrokeWidth)); |
| const SkRect& rect = gRects[j]; |
| |
| SkPath path, fillPath; |
| path.addRect(rect); |
| SkPaint paint; |
| |
| paint.setStrokeWidth(kStrokeWidth); |
| paint.setStyle(style); |
| paint.setStrokeJoin(join); |
| skpathutils::FillPathWithPaint(path, paint, &fillPath); |
| |
| paint.setAntiAlias(true); |
| paint.setColor(0xFF8C8A8C); |
| canvas->drawRect(rect, paint); |
| |
| paint.setStyle(SkPaint::kStroke_Style); |
| paint.setStrokeWidth(0); |
| paint.setColor(SK_ColorRED); |
| canvas->drawPath(fillPath, paint); |
| |
| paint.setStrokeWidth(3); |
| paint.setStrokeJoin(SkPaint::kMiter_Join); |
| int n = fillPath.countPoints(); |
| SkPoint* points = new SkPoint[n]; |
| fillPath.getPoints(points, n); |
| canvas->drawPoints(SkCanvas::kPoints_PointMode, n, points, paint); |
| delete[] points; |
| } |
| } |
| } |
| } |
| } // END FIDDLE |