blob: d245a107e0596982fcd60f0015ffebd68d1f3d4f [file] [log] [blame]
fmalitacad54b52015-12-11 11:03:27 -08001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkColor.h"
11#include "include/core/SkFilterQuality.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkPaint.h"
14#include "include/core/SkPoint.h"
15#include "include/core/SkRect.h"
16#include "include/core/SkRefCnt.h"
17#include "include/core/SkScalar.h"
18#include "include/core/SkSize.h"
19#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "include/core/SkSurface.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040021#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "include/private/SkTArray.h"
fmalitacad54b52015-12-11 11:03:27 -080023
24class ImageScaleAlignedGM : public skiagm::GM {
25protected:
26 void onOnceBeforeDraw() override {
27 const SkVector vectors[] = { { 1, 0 }, { 0, 1 } };
28
29 for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) {
30 auto& set = fSets.push_back();
31
32 set.fVector = vectors[i];
reed9ce9d672016-03-17 10:51:11 -070033 set.fImages.push_back() = MakeImage(vectors[i], SK_ColorGREEN);
fmalitacad54b52015-12-11 11:03:27 -080034 set.fScales.push_back() = 1;
reed9ce9d672016-03-17 10:51:11 -070035 set.fImages.push_back() = MakeImage(vectors[i], SK_ColorRED);
fmalitacad54b52015-12-11 11:03:27 -080036 set.fScales.push_back() = kStretchFactor;
reed9ce9d672016-03-17 10:51:11 -070037 set.fImages.push_back() = MakeImage(vectors[i], SK_ColorGREEN);
fmalitacad54b52015-12-11 11:03:27 -080038 set.fScales.push_back() = 1;
39 }
40 }
41
42 SkString onShortName() override {
43 return SkString("image_scale_aligned");
44 }
45
46 SkISize onISize() override {
fmalitaaed4d322015-12-15 06:48:48 -080047 return SkISize::Make(580, 780);
fmalitacad54b52015-12-11 11:03:27 -080048 }
49
50 void onDraw(SkCanvas* canvas) override {
51 struct {
52 SkPoint offset;
fmalitaaed4d322015-12-15 06:48:48 -080053 SkVector scale;
fmalitacad54b52015-12-11 11:03:27 -080054 } cfgs[] = {
fmalitaaed4d322015-12-15 06:48:48 -080055 {{ 10, 10 }, { 1, 1 }},
56 {{ 300.5f, 10 }, { 1, 1 }},
57 {{ 10, 200.5f }, { 1, 1 }},
58 {{ 300.5f, 200.5f }, { 1, 1 }},
fmalitacad54b52015-12-11 11:03:27 -080059
fmalitaaed4d322015-12-15 06:48:48 -080060 {{ 10.5f, 400.5f }, { 1, 1 }},
61 {{ 550.5f, 400.5f }, { -1, 1 }},
62 {{ 10.5f, 750.5f }, { 1, -1 }},
63 {{ 550.5f, 750.5f }, { -1, -1 }},
fmalitacad54b52015-12-11 11:03:27 -080064 };
65
66 for (size_t i = 0; i < SK_ARRAY_COUNT(cfgs); ++i) {
67 SkAutoCanvasRestore acr(canvas, true);
68 canvas->translate(cfgs[i].offset.x(), cfgs[i].offset.y());
fmalitaaed4d322015-12-15 06:48:48 -080069 canvas->scale(cfgs[i].scale.x(), cfgs[i].scale.y());
fmalitacad54b52015-12-11 11:03:27 -080070 drawSets(canvas);
71 }
72 }
73
74private:
75 struct ImageSet {
reed9ce9d672016-03-17 10:51:11 -070076 SkSTArray<3, sk_sp<SkImage>, true> fImages;
77 SkSTArray<3, SkScalar> fScales;
78 SkVector fVector;
fmalitacad54b52015-12-11 11:03:27 -080079 };
80
reed9ce9d672016-03-17 10:51:11 -070081 static sk_sp<SkImage> MakeImage(const SkVector& vec, SkColor color) {
fmalitacad54b52015-12-11 11:03:27 -080082 const SkPoint start = SkPoint::Make(vec.y() * kSegLen / 2, vec.x() * kSegLen / 2);
83 const SkPoint end = SkPoint::Make(start.x() + vec.x() * (kSegLen - 1),
84 start.y() + vec.y() * (kSegLen - 1));
85
reede8f30622016-03-23 18:59:25 -070086 auto surface(SkSurface::MakeRasterN32Premul(kSegLen, kSegLen));
fmalitacad54b52015-12-11 11:03:27 -080087 surface->getCanvas()->clear(SK_ColorTRANSPARENT);
88
89 SkPaint paint;
90 paint.setAntiAlias(true);
fmalitaaed4d322015-12-15 06:48:48 -080091 const SkRect border = SkRect::MakeIWH(kSegLen, kSegLen).makeInset(.5f, .5f);
92 paint.setColor(SK_ColorBLUE);
93 paint.setStyle(SkPaint::kStroke_Style);
94 surface->getCanvas()->drawRect(border, paint);
95
fmalitacad54b52015-12-11 11:03:27 -080096 paint.setColor(SK_ColorBLACK);
Hal Canary23e474c2017-05-15 13:35:35 -040097 surface->getCanvas()->drawLine(start, end, paint);
Mike Reed3661bc92017-02-22 13:21:42 -050098
99 paint.reset();
100 paint.setColor(color);
101 const SkPoint pts[] = { start, end };
102 surface->getCanvas()->drawPoints(SkCanvas::kPoints_PointMode, 2, pts, paint);
fmalitacad54b52015-12-11 11:03:27 -0800103
reed9ce9d672016-03-17 10:51:11 -0700104 return surface->makeImageSnapshot();
fmalitacad54b52015-12-11 11:03:27 -0800105 }
106
107 void drawSets(SkCanvas* canvas) const {
108 SkAutoCanvasRestore acr(canvas, true);
109
110 const SkFilterQuality filters[] = {
111 kNone_SkFilterQuality,
112 kLow_SkFilterQuality,
113 kMedium_SkFilterQuality,
114 kHigh_SkFilterQuality
115 };
116 const bool AAs[] = { false, true };
117
118 SkPaint paint;
119 for (int i = 0; i < fSets.count(); ++i) {
120 auto& set = fSets[i];
121 SkPoint lastPt;
122 for (size_t j = 0; j < SK_ARRAY_COUNT(AAs); ++j) {
123 paint.setAntiAlias(AAs[j]);
124 for (size_t k = 0; k < SK_ARRAY_COUNT(filters); ++k) {
125 paint.setFilterQuality(filters[k]);
126 lastPt = drawSet(canvas, set, paint);
fmalitaaed4d322015-12-15 06:48:48 -0800127 canvas->translate((kSegLen + 4) * set.fVector.y(),
128 (kSegLen + 4) * set.fVector.x());
fmalitacad54b52015-12-11 11:03:27 -0800129 }
130 }
131 canvas->translate(lastPt.x() + kSegLen,
fmalitaaed4d322015-12-15 06:48:48 -0800132 - SkIntToScalar(kSegLen + 4) * SK_ARRAY_COUNT(filters) * SK_ARRAY_COUNT(AAs));
fmalitacad54b52015-12-11 11:03:27 -0800133 }
134 }
135
136 SkPoint drawSet(SkCanvas* canvas, const ImageSet& set, const SkPaint& paint) const {
137 SkASSERT(set.fImages.count() == set.fScales.count());
138
139 SkPoint pt = SkPoint::Make(0, 0);
140 for (int i = 0; i < set.fImages.count(); ++i) {
141 auto& img = set.fImages[i];
142 const SkRect dst =
143 SkRect::MakeXYWH(pt.x(), pt.y(),
144 img->width() * (1 + (set.fScales[i] - 1) * set.fVector.x()),
145 img->height() * (1 + (set.fScales[i] - 1) * set.fVector.y()));
146
reed9ce9d672016-03-17 10:51:11 -0700147 canvas->drawImageRect(img.get(), dst, &paint);
fmalitacad54b52015-12-11 11:03:27 -0800148 pt.offset(dst.width() * set.fVector.x(), dst.height() * set.fVector.y());
149 }
150
151 return pt;
152 }
153
mtkleindbfd7ab2016-09-01 11:24:54 -0700154 static constexpr unsigned kSegLen = 15;
155 static constexpr unsigned kStretchFactor = 4;
fmalitacad54b52015-12-11 11:03:27 -0800156 SkSTArray<2, ImageSet> fSets;
157
158 typedef GM INHERITED;
159};
160
161DEF_GM(return new ImageScaleAlignedGM();)