Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkCoordClampShader.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 The Android Open Source Project
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
9
20
21#include <optional>
22
23sk_sp<SkFlattenable> SkCoordClampShader::CreateProc(SkReadBuffer& buffer) {
24 sk_sp<SkShader> shader(buffer.readShader());
25 SkRect subset = buffer.readRect();
26 if (!buffer.validate(SkToBool(shader))) {
27 return nullptr;
28 }
29 return SkShaders::CoordClamp(std::move(shader), subset);
30}
31
33 buffer.writeFlattenable(fShader.get());
34 buffer.writeRect(fSubset);
35}
36
38 const SkShaders::MatrixRec& mRec) const {
39 std::optional<SkShaders::MatrixRec> childMRec = mRec.apply(rec);
40 if (!childMRec.has_value()) {
41 return false;
42 }
43 // Strictly speaking, childMRec's total matrix is not valid. It is only valid inside the subset
44 // rectangle. However, we don't mark it as such because we want the "total matrix is valid"
45 // behavior in SkImageShader for filtering.
46 auto clampCtx = rec.fAlloc->make<SkRasterPipeline_CoordClampCtx>();
47 *clampCtx = {fSubset.fLeft, fSubset.fTop, fSubset.fRight, fSubset.fBottom};
48 rec.fPipeline->append(SkRasterPipelineOp::clamp_x_and_y, clampCtx);
49 return as_SB(fShader)->appendStages(rec, *childMRec);
50}
51
54
55 // Previous name
56 SkFlattenable::Register("SkShader_CoordClamp", SkCoordClampShader::CreateProc);
57}
58
59sk_sp<SkShader> SkShaders::CoordClamp(sk_sp<SkShader> shader, const SkRect& subset) {
60 if (!shader) {
61 return nullptr;
62 }
63 if (!subset.isSorted()) {
64 return nullptr;
65 }
66 return sk_make_sp<SkCoordClampShader>(std::move(shader), subset);
67}
void SkRegisterCoordClampShaderFlattenable()
#define SK_REGISTER_FLATTENABLE(type)
SkShaderBase * as_SB(SkShader *shader)
static constexpr bool SkToBool(const T &x)
Definition SkTo.h:35
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
bool appendStages(const SkStageRec &, const SkShaders::MatrixRec &) const override
sk_sp< SkShader > shader() const
void flatten(SkWriteBuffer &) const override
static void Register(const char name[], Factory)
void append(SkRasterPipelineOp, void *=nullptr)
virtual bool appendStages(const SkStageRec &, const SkShaders::MatrixRec &) const =0
std::optional< MatrixRec > apply(const SkStageRec &rec, const SkMatrix &postInv={}) const
T * get() const
Definition SkRefCnt.h:303
static const uint8_t buffer[]
SkScalar fBottom
larger y-axis bounds
Definition extension.cpp:17
SkScalar fLeft
smaller x-axis bounds
Definition extension.cpp:14
SkScalar fRight
larger x-axis bounds
Definition extension.cpp:16
bool isSorted() const
Definition SkRect.h:705
SkScalar fTop
smaller y-axis bounds
Definition extension.cpp:15
SkRasterPipeline * fPipeline
SkArenaAlloc * fAlloc