| /* | |
| * Copyright 2025 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "tools/viewer/ZoomInSlide.h" | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkColor.h" | |
| #include "include/core/SkPaint.h" | |
| #include "include/core/SkPath.h" | |
| #include "include/core/SkPathBuilder.h" | |
| #include "include/core/SkPoint.h" | |
| #include <array> | |
| // An example implementation of a zoomed-in slide. | |
| // Reproduces issues.skia.org/issues/451536363 | |
| class ZoomInSlideDemo : public ZoomInSlide { | |
| public: | |
| ZoomInSlideDemo() : ZoomInSlide(kScale, kMaskWidth, kMaskHeight, SkString("ZoomInDemo")) { | |
| fPts[0] = {1.5, 1.5}; | |
| fPts[1] = {1.5, 10.5}; | |
| fPts[2] = {10.5, 10.5}; | |
| fPts[3] = {10.5, 1.5}; | |
| } | |
| SkPath makePath() { | |
| return SkPathBuilder() | |
| .moveTo(fPts[0]) | |
| .lineTo(fPts[1]) | |
| .lineTo(fPts[2]) | |
| .lineTo(fPts[3]) | |
| .close() | |
| .detach(); | |
| } | |
| void drawUnderGrid(SkCanvas* canvas) override { | |
| SkPaint paint; | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| paint.setStrokeCap(SkPaint::kSquare_Cap); | |
| paint.setStrokeJoin(SkPaint::kMiter_Join); | |
| paint.setAntiAlias(true); | |
| this->drawScaledPath(canvas, makePath(), paint); | |
| } | |
| void drawOverGrid(SkCanvas* canvas) override { | |
| SkPaint truthPaint; | |
| truthPaint.setStyle(SkPaint::Style::kStroke_Style); | |
| truthPaint.setColor(SK_ColorRED); | |
| truthPaint.setAntiAlias(true); | |
| truthPaint.setStrokeWidth(2.f / fScale); | |
| canvas->drawPath(makePath(), truthPaint); | |
| SkPaint handlePaint; | |
| handlePaint.setAntiAlias(true); | |
| handlePaint.setStyle(SkPaint::Style::kFill_Style); | |
| handlePaint.setColor(SkColorSetARGB(255, 255, 70, 10)); | |
| for (auto pt : fPts) { | |
| canvas->drawCircle(pt, kHandleRadius / kScale, handlePaint); | |
| } | |
| } | |
| void handleClick(const ScaledClick* click) override { | |
| SkPoint pt = click->currScaled(); | |
| int closestPointIdx = 0; | |
| float minDist = SkPoint::Distance(pt, fPts[0]); | |
| for (int i = 1; i < kNumPoints; i++) { | |
| float dist = SkPoint::Distance(pt, fPts[i]); | |
| if (dist < minDist) { | |
| minDist = dist; | |
| closestPointIdx = i; | |
| } | |
| } | |
| fPts[closestPointIdx] = pt; | |
| } | |
| private: | |
| static constexpr size_t kScale = 32; | |
| // Defines the region of the screen that will be zoomed in on. | |
| // The path under scrutiny will be drawn in this region. | |
| static constexpr int kMaskWidth = 20; | |
| static constexpr int kMaskHeight = 30; | |
| static constexpr float kHandleRadius = 4.f; | |
| static constexpr int kNumPoints = 4; | |
| std::array<SkPoint, kNumPoints> fPts; | |
| }; | |
| DEF_SLIDE(return new ZoomInSlideDemo();) |