Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
third_party
skia
src
shaders
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
8
#include "
src/shaders/SkCoordClampShader.h
"
9
10
#include "
include/core/SkFlattenable.h
"
11
#include "
include/private/base/SkTo.h
"
12
#include "
src/base/SkArenaAlloc.h
"
13
#include "
src/core/SkEffectPriv.h
"
14
#include "
src/core/SkRasterPipeline.h
"
15
#include "
src/core/SkRasterPipelineOpContexts.h
"
16
#include "
src/core/SkRasterPipelineOpList.h
"
17
#include "
src/core/SkReadBuffer.h
"
18
#include "
src/core/SkWriteBuffer.h
"
19
#include "
src/shaders/SkShaderBase.h
"
20
21
#include <optional>
22
23
sk_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
32
void
SkCoordClampShader::flatten
(
SkWriteBuffer
&
buffer
)
const
{
33
buffer
.writeFlattenable(fShader.
get
());
34
buffer
.writeRect(fSubset);
35
}
36
37
bool
SkCoordClampShader::appendStages
(
const
SkStageRec
& rec,
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
52
void
SkRegisterCoordClampShaderFlattenable
() {
53
SK_REGISTER_FLATTENABLE
(
SkCoordClampShader
);
54
55
// Previous name
56
SkFlattenable::Register
(
"SkShader_CoordClamp"
, SkCoordClampShader::CreateProc);
57
}
58
59
sk_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
}
SkArenaAlloc.h
SkRegisterCoordClampShaderFlattenable
void SkRegisterCoordClampShaderFlattenable()
Definition
SkCoordClampShader.cpp:52
SkCoordClampShader.h
SkEffectPriv.h
SkFlattenable.h
SK_REGISTER_FLATTENABLE
#define SK_REGISTER_FLATTENABLE(type)
Definition
SkFlattenable.h:105
SkRasterPipelineOpContexts.h
SkRasterPipelineOpList.h
SkRasterPipeline.h
SkReadBuffer.h
SkShaderBase.h
as_SB
SkShaderBase * as_SB(SkShader *shader)
Definition
SkShaderBase.h:412
SkTo.h
SkToBool
static constexpr bool SkToBool(const T &x)
Definition
SkTo.h:35
SkWriteBuffer.h
SkArenaAlloc::make
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
Definition
SkArenaAlloc.h:120
SkCoordClampShader
Definition
SkCoordClampShader.h:23
SkCoordClampShader::subset
SkRect subset() const
Definition
SkCoordClampShader.h:31
SkCoordClampShader::appendStages
bool appendStages(const SkStageRec &, const SkShaders::MatrixRec &) const override
Definition
SkCoordClampShader.cpp:37
SkCoordClampShader::shader
sk_sp< SkShader > shader() const
Definition
SkCoordClampShader.h:30
SkCoordClampShader::flatten
void flatten(SkWriteBuffer &) const override
Definition
SkCoordClampShader.cpp:32
SkFlattenable::Register
static void Register(const char name[], Factory)
Definition
SkFlattenable.cpp:91
SkRasterPipeline::append
void append(SkRasterPipelineOp, void *=nullptr)
Definition
SkRasterPipeline.cpp:44
SkReadBuffer
Definition
SkReadBuffer.h:52
SkShaderBase::appendStages
virtual bool appendStages(const SkStageRec &, const SkShaders::MatrixRec &) const =0
SkShaders::MatrixRec
Definition
SkShaderBase.h:57
SkShaders::MatrixRec::apply
std::optional< MatrixRec > apply(const SkStageRec &rec, const SkMatrix &postInv={}) const
Definition
SkShaderBase.cpp:24
SkWriteBuffer
Definition
SkWriteBuffer.h:41
sk_sp
Definition
SkRefCnt.h:220
sk_sp::get
T * get() const
Definition
SkRefCnt.h:303
buffer
static const uint8_t buffer[]
Definition
fl_pixel_buffer_texture_test.cc:44
SkRasterPipeline_CoordClampCtx
Definition
SkRasterPipelineOpContexts.h:142
SkRect
Definition
extension.cpp:13
SkRect::fBottom
SkScalar fBottom
larger y-axis bounds
Definition
extension.cpp:17
SkRect::fLeft
SkScalar fLeft
smaller x-axis bounds
Definition
extension.cpp:14
SkRect::fRight
SkScalar fRight
larger x-axis bounds
Definition
extension.cpp:16
SkRect::isSorted
bool isSorted() const
Definition
SkRect.h:705
SkRect::fTop
SkScalar fTop
smaller y-axis bounds
Definition
extension.cpp:15
SkStageRec
Definition
SkEffectPriv.h:20
SkStageRec::fPipeline
SkRasterPipeline * fPipeline
Definition
SkEffectPriv.h:21
SkStageRec::fAlloc
SkArenaAlloc * fAlloc
Definition
SkEffectPriv.h:22
Generated on Fri Apr 26 2024 06:17:28 for Flutter Engine by
1.9.8