| /* | 
 |  * Copyright 2023 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "gm/gm.h" | 
 | #include "include/core/SkCanvas.h" | 
 | #include "include/core/SkImage.h" | 
 | #include "include/core/SkMatrix.h" | 
 | #include "include/core/SkPaint.h" | 
 | #include "include/core/SkRect.h" | 
 | #include "include/core/SkShader.h" | 
 | #include "include/core/SkTileMode.h" | 
 | #include "tools/Resources.h" | 
 |  | 
 | DEF_SIMPLE_GM(coordclampshader, canvas, 1074, 795) { | 
 |     auto image = GetResourceAsImage("images/mandrill_256.png"); | 
 |     if (!image) { | 
 |         return; | 
 |     } | 
 |     // The mandrill_512 image has a bottom row of mostly black pixels. Remove it. | 
 |     image = image->makeSubset(nullptr, SkIRect::MakeWH(image->width(), image->height() - 1)); | 
 |     image = image->withDefaultMipmaps(); | 
 |  | 
 |     auto imageShader = image->makeShader(SkFilterMode::kLinear); | 
 |  | 
 |     SkPaint paint; | 
 |  | 
 |     auto drawRect = SkRect::Make(image->dimensions()); | 
 |  | 
 |     auto rotate = SkMatrix::RotateDeg(45.f, drawRect.center()); | 
 |  | 
 |     auto clampRect = drawRect.makeInset(20, 40); | 
 |  | 
 |     canvas->translate(10, 10); | 
 |  | 
 |     auto shader = SkShaders::CoordClamp(imageShader, clampRect); | 
 |     paint.setShader(std::move(shader)); | 
 |     canvas->drawRect(drawRect, paint); | 
 |  | 
 |     canvas->save(); | 
 |     canvas->translate(image->width(), 0); | 
 |     shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect); | 
 |     paint.setShader(std::move(shader)); | 
 |     canvas->drawRect(drawRect, paint); | 
 |     canvas->restore(); | 
 |  | 
 |     canvas->save(); | 
 |     canvas->translate(0, image->height()); | 
 |     shader = SkShaders::CoordClamp(imageShader, clampRect)->makeWithLocalMatrix(rotate); | 
 |     paint.setShader(std::move(shader)); | 
 |     canvas->drawRect(drawRect, paint); | 
 |     canvas->restore(); | 
 |  | 
 |     canvas->save(); | 
 |     canvas->translate(image->width(), image->height()); | 
 |     shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect) | 
 |                      ->makeWithLocalMatrix(rotate); | 
 |     paint.setShader(std::move(shader)); | 
 |     canvas->drawRect(drawRect, paint); | 
 |     canvas->restore(); | 
 |  | 
 |     canvas->translate(0, 2 * image->height() + 10); | 
 |  | 
 |     static const SkSamplingOptions kSamplers[] = { | 
 |             SkSamplingOptions{SkFilterMode::kNearest}, | 
 |             SkSamplingOptions{SkFilterMode::kLinear}, | 
 |             SkSamplingOptions{SkFilterMode::kLinear, SkMipmapMode::kLinear}, | 
 |             SkSamplingOptions::Aniso(16) | 
 |     }; | 
 |  | 
 |     for (const auto& sampler : kSamplers) { | 
 |         imageShader = image->makeShader(SkTileMode::kMirror, | 
 |                                         SkTileMode::kMirror, | 
 |                                         sampler, | 
 |                                         SkMatrix::Scale(0.3f, 1.0)); | 
 |  | 
 |         shader = SkShaders::CoordClamp(imageShader, clampRect); | 
 |         paint.setShader(std::move(shader)); | 
 |         canvas->drawRect(drawRect, paint); | 
 |  | 
 |         canvas->translate(image->width() + 10, 0); | 
 |     } | 
 | } |