xref: /aosp_15_r20/external/skia/gm/coordclampshader.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2023 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(coordclampshader, canvas, 1074, 795) {
20*c8dee2aaSAndroid Build Coastguard Worker     auto image = ToolUtils::GetResourceAsImage("images/mandrill_256.png");
21*c8dee2aaSAndroid Build Coastguard Worker     if (!image) {
22*c8dee2aaSAndroid Build Coastguard Worker         return;
23*c8dee2aaSAndroid Build Coastguard Worker     }
24*c8dee2aaSAndroid Build Coastguard Worker     // The mandrill_512 image has a bottom row of mostly black pixels. Remove it.
25*c8dee2aaSAndroid Build Coastguard Worker     image = image->makeSubset(nullptr, SkIRect::MakeWH(image->width(), image->height() - 1));
26*c8dee2aaSAndroid Build Coastguard Worker     image = image->withDefaultMipmaps();
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker     auto imageShader = image->makeShader(SkFilterMode::kLinear);
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker     auto drawRect = SkRect::Make(image->dimensions());
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker     auto rotate = SkMatrix::RotateDeg(45.f, drawRect.center());
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     auto clampRect = drawRect.makeInset(20, 40);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(10, 10);
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     auto shader = SkShaders::CoordClamp(imageShader, clampRect);
41*c8dee2aaSAndroid Build Coastguard Worker     paint.setShader(std::move(shader));
42*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(drawRect, paint);
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     canvas->save();
45*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(image->width(), 0);
46*c8dee2aaSAndroid Build Coastguard Worker     shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect);
47*c8dee2aaSAndroid Build Coastguard Worker     paint.setShader(std::move(shader));
48*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(drawRect, paint);
49*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker     canvas->save();
52*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(0, image->height());
53*c8dee2aaSAndroid Build Coastguard Worker     shader = SkShaders::CoordClamp(imageShader, clampRect)->makeWithLocalMatrix(rotate);
54*c8dee2aaSAndroid Build Coastguard Worker     paint.setShader(std::move(shader));
55*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(drawRect, paint);
56*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     canvas->save();
59*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(image->width(), image->height());
60*c8dee2aaSAndroid Build Coastguard Worker     shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect)
61*c8dee2aaSAndroid Build Coastguard Worker                      ->makeWithLocalMatrix(rotate);
62*c8dee2aaSAndroid Build Coastguard Worker     paint.setShader(std::move(shader));
63*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawRect(drawRect, paint);
64*c8dee2aaSAndroid Build Coastguard Worker     canvas->restore();
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     canvas->translate(0, 2 * image->height() + 10);
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     static const SkSamplingOptions kSamplers[] = {
69*c8dee2aaSAndroid Build Coastguard Worker             SkSamplingOptions{SkFilterMode::kNearest},
70*c8dee2aaSAndroid Build Coastguard Worker             SkSamplingOptions{SkFilterMode::kLinear},
71*c8dee2aaSAndroid Build Coastguard Worker             SkSamplingOptions{SkFilterMode::kLinear, SkMipmapMode::kLinear},
72*c8dee2aaSAndroid Build Coastguard Worker             SkSamplingOptions::Aniso(16)
73*c8dee2aaSAndroid Build Coastguard Worker     };
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     for (const auto& sampler : kSamplers) {
76*c8dee2aaSAndroid Build Coastguard Worker         imageShader = image->makeShader(SkTileMode::kMirror,
77*c8dee2aaSAndroid Build Coastguard Worker                                         SkTileMode::kMirror,
78*c8dee2aaSAndroid Build Coastguard Worker                                         sampler,
79*c8dee2aaSAndroid Build Coastguard Worker                                         SkMatrix::Scale(0.3f, 1.0));
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker         shader = SkShaders::CoordClamp(imageShader, clampRect);
82*c8dee2aaSAndroid Build Coastguard Worker         paint.setShader(std::move(shader));
83*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawRect(drawRect, paint);
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker         canvas->translate(image->width() + 10, 0);
86*c8dee2aaSAndroid Build Coastguard Worker     }
87*c8dee2aaSAndroid Build Coastguard Worker }
88