blob: 6be57b6dd5eb79bf9435ea533c24acc1356274ff [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);
81 for (auto filter : {kNone_SkFilterQuality, kLow_SkFilterQuality,
82 kMedium_SkFilterQuality, kHigh_SkFilterQuality}) {
83 for (const auto& img : fImages) {
84 paint.setFilterQuality(filter);
85 canvas->save();
86 canvas->concat(m);
Brian Salomonb80ffee2018-05-23 16:39:39 -040087 SkRect src = {img->width() / 4.f, img->height() / 4.f,
88 3.f * img->width() / 4.f, 3.f * img->height() / 4};
89 SkRect dst = {0, 0,
90 3.f / 4.f * img->width(), 3.f / 4.f * img->height()};
91 switch (type) {
92 case DrawType::kDrawImage:
93 canvas->drawImage(img, 0, 0, &paint);
94 break;
95 case DrawType::kDrawImageRectStrict:
96 canvas->drawImageRect(img, src, dst, &paint,
97 SkCanvas::kStrict_SrcRectConstraint);
98 break;
99 case DrawType::kDrawImageRectFast:
100 canvas->drawImageRect(img, src, dst, &paint,
101 SkCanvas::kFast_SrcRectConstraint);
102 break;
Brian Salomonbe3c1d22018-05-21 12:54:39 -0400103 }
104 canvas->restore();
105 ++n;
106 if (n < 8) {
107 canvas->translate(bounds.width() + 10.f, 0);
108 } else {
109 canvas->restore();
110 canvas->translate(0, bounds.height() + 10.f);
111 canvas->save();
112 n = 0;
113 }
114 }
115 }
116 }
117 }
118 }
119 canvas->restore();
120 }
121
122private:
123 static constexpr int kNumImages = 4;
124 SkTArray<sk_sp<SkImage>> fImages;
125
126 typedef GM INHERITED;
127};
128
129//////////////////////////////////////////////////////////////////////////////
130
131DEF_GM(return new PerspImages();)
132
133} // namespace skiagm