blob: ed8bae2d469ea90b6eeb4400862ad1e920d2426e [file] [log] [blame]
Brian Salomonbe3c1d22018-05-21 12:54:39 -04001/*
2 * Copyright 2018 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/SkFilterQuality.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040012#include "include/core/SkMatrix.h"
13#include "include/core/SkPaint.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkRefCnt.h"
16#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
18#include "include/private/SkTArray.h"
19#include "include/private/SkTDArray.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "tools/Resources.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040021
22#include <initializer_list>
Brian Salomonbe3c1d22018-05-21 12:54:39 -040023
24static sk_sp<SkImage> make_image1() { return GetResourceAsImage("images/mandrill_128.png"); }
25
26static sk_sp<SkImage> make_image2() {
27 return GetResourceAsImage("images/brickwork-texture.jpg")->makeSubset({0, 0, 128, 128});
28}
29
30namespace skiagm {
31
32class PerspImages : public GM {
33public:
34 PerspImages() = default;
35
36protected:
37 SkString onShortName() override { return SkString("persp_images"); }
38
Brian Salomonb80ffee2018-05-23 16:39:39 -040039 SkISize onISize() override { return SkISize::Make(1150, 1280); }
Brian Salomonbe3c1d22018-05-21 12:54:39 -040040
41 void onOnceBeforeDraw() override {
42 fImages.push_back(make_image1());
43 fImages.push_back(make_image2());
44 }
45
46 void onDraw(SkCanvas* canvas) override {
47 SkTDArray<SkMatrix> matrices;
48 matrices.push()->setAll(1.f, 0.f, 0.f,
49 0.f, 1.f, 0.f,
50 0.f, 0.005f, 1.f);
51 matrices.push()->setAll(1.f, 0.f, 0.f,
52 0.f, 1.f, 0.f,
53 0.007f, -0.005f, 1.f);
54 matrices[1].preSkew(0.2f, -0.1f);
55 matrices[1].preRotate(-65.f);
56 matrices[1].preScale(1.2f, .8f);
57 matrices[1].postTranslate(0.f, 60.f);
58 SkPaint paint;
59 int n = 0;
60 SkRect bounds = SkRect::MakeEmpty();
61 for (const auto& img : fImages) {
62 SkRect imgB = SkRect::MakeWH(img->width(), img->height());
63 for (const auto& m : matrices) {
64 SkRect temp;
65 m.mapRect(&temp, imgB);
66 bounds.join(temp);
67 }
68 }
69 canvas->translate(-bounds.fLeft + 10.f, -bounds.fTop + 10.f);
70 canvas->save();
Brian Salomonb80ffee2018-05-23 16:39:39 -040071 enum class DrawType {
72 kDrawImage,
73 kDrawImageRectStrict,
74 kDrawImageRectFast,
75 };
76 for (auto type :
77 {DrawType::kDrawImage, DrawType::kDrawImageRectStrict, DrawType::kDrawImageRectFast}) {
Brian Salomonbe3c1d22018-05-21 12:54:39 -040078 for (const auto& m : matrices) {
79 for (auto aa : {false, true}) {
80 paint.setAntiAlias(aa);
Mike Reed07c5f522021-01-23 12:23:23 -050081 for (auto sampling : {
82 SkSamplingOptions(SkFilterMode::kNearest),
83 SkSamplingOptions(SkFilterMode::kLinear),
84 SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kLinear),
Mike Reedf3ac2af2021-02-05 12:55:38 -050085 SkSamplingOptions(SkCubicResampler::Mitchell())}) {
Brian Salomonbe3c1d22018-05-21 12:54:39 -040086 for (const auto& img : fImages) {
Brian Salomonbe3c1d22018-05-21 12:54:39 -040087 canvas->save();
88 canvas->concat(m);
Brian Salomonb80ffee2018-05-23 16:39:39 -040089 SkRect src = {img->width() / 4.f, img->height() / 4.f,
90 3.f * img->width() / 4.f, 3.f * img->height() / 4};
91 SkRect dst = {0, 0,
92 3.f / 4.f * img->width(), 3.f / 4.f * img->height()};
93 switch (type) {
94 case DrawType::kDrawImage:
Mike Reed07c5f522021-01-23 12:23:23 -050095 canvas->drawImage(img, 0, 0, sampling, &paint);
Brian Salomonb80ffee2018-05-23 16:39:39 -040096 break;
97 case DrawType::kDrawImageRectStrict:
Mike Reed07c5f522021-01-23 12:23:23 -050098 canvas->drawImageRect(img, src, dst, sampling, &paint,
Brian Salomonb80ffee2018-05-23 16:39:39 -040099 SkCanvas::kStrict_SrcRectConstraint);
100 break;
101 case DrawType::kDrawImageRectFast:
Mike Reed07c5f522021-01-23 12:23:23 -0500102 canvas->drawImageRect(img, src, dst, sampling, &paint,
Brian Salomonb80ffee2018-05-23 16:39:39 -0400103 SkCanvas::kFast_SrcRectConstraint);
104 break;
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400105 }
106 canvas->restore();
107 ++n;
108 if (n < 8) {
109 canvas->translate(bounds.width() + 10.f, 0);
110 } else {
111 canvas->restore();
112 canvas->translate(0, bounds.height() + 10.f);
113 canvas->save();
114 n = 0;
115 }
116 }
117 }
118 }
119 }
120 }
121 canvas->restore();
122 }
123
124private:
125 static constexpr int kNumImages = 4;
126 SkTArray<sk_sp<SkImage>> fImages;
127
John Stiles7571f9e2020-09-02 22:42:33 -0400128 using INHERITED = GM;
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400129};
130
131//////////////////////////////////////////////////////////////////////////////
132
133DEF_GM(return new PerspImages();)
134
135} // namespace skiagm