blob: 63ae9d756fba26da260b22294ea4b6df290e2772 [file] [log] [blame]
/*
* 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"
// 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;
SkPoint fPts[kNumPoints];
};
DEF_SLIDE(return new ZoomInSlideDemo();)