87 lines
2.9 KiB
C++
87 lines
2.9 KiB
C++
/*
|
|
* 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(SkIRect::MakeWH(image->width(), image->height() - 1));
|
|
image = image->withDefaultMipmaps();
|
|
|
|
auto imageShader = image->makeShader(SkSamplingOptions{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);
|
|
}
|
|
}
|