26 #if IMPELLER_ENABLE_3D
29 #endif // IMPELLER_ENABLE_3D
35 struct CreateContentsVisitor {
36 explicit CreateContentsVisitor(
const Paint& p_paint) :
paint(p_paint) {}
40 std::shared_ptr<ColorSourceContents> operator()(
41 const LinearGradientData&
data) {
42 auto contents = std::make_shared<LinearGradientContents>();
43 contents->SetOpacityFactor(
paint.color.alpha);
44 contents->SetColors(
data.colors);
45 contents->SetStops(
data.stops);
46 contents->SetEndPoints(
data.start_point,
data.end_point);
47 contents->SetTileMode(
data.tile_mode);
48 contents->SetEffectTransform(
data.effect_transform);
50 std::vector<Point> bounds{
data.start_point,
data.end_point};
52 if (intrinsic_size.has_value()) {
53 contents->SetColorSourceSize(intrinsic_size->GetSize());
58 std::shared_ptr<ColorSourceContents> operator()(
59 const RadialGradientData&
data) {
60 auto contents = std::make_shared<RadialGradientContents>();
61 contents->SetOpacityFactor(
paint.color.alpha);
62 contents->SetColors(
data.colors);
63 contents->SetStops(
data.stops);
64 contents->SetCenterAndRadius(
data.center,
data.radius);
65 contents->SetTileMode(
data.tile_mode);
66 contents->SetEffectTransform(
data.effect_transform);
69 std::vector<Point> bounds{
data.center + radius_pt,
data.center - radius_pt};
71 if (intrinsic_size.has_value()) {
72 contents->SetColorSourceSize(intrinsic_size->GetSize());
77 std::shared_ptr<ColorSourceContents> operator()(
78 const ConicalGradientData&
data) {
79 std::shared_ptr<ConicalGradientContents> contents =
80 std::make_shared<ConicalGradientContents>();
81 contents->SetOpacityFactor(
paint.color.alpha);
82 contents->SetColors(
data.colors);
83 contents->SetStops(
data.stops);
84 contents->SetCenterAndRadius(
data.center,
data.radius);
85 contents->SetTileMode(
data.tile_mode);
86 contents->SetEffectTransform(
data.effect_transform);
87 contents->SetFocus(
data.focus_center,
data.focus_radius);
90 std::vector<Point> bounds{
data.center + radius_pt,
data.center - radius_pt};
92 if (intrinsic_size.has_value()) {
93 contents->SetColorSourceSize(intrinsic_size->GetSize());
98 std::shared_ptr<ColorSourceContents> operator()(
99 const SweepGradientData&
data) {
100 auto contents = std::make_shared<SweepGradientContents>();
101 contents->SetOpacityFactor(
paint.color.alpha);
102 contents->SetCenterAndAngles(
data.center,
data.start_angle,
data.end_angle);
103 contents->SetColors(
data.colors);
104 contents->SetStops(
data.stops);
105 contents->SetTileMode(
data.tile_mode);
106 contents->SetEffectTransform(
data.effect_transform);
111 std::shared_ptr<ColorSourceContents> operator()(
const ImageData&
data) {
112 auto contents = std::make_shared<TiledTextureContents>();
113 contents->SetOpacityFactor(
paint.color.alpha);
114 contents->SetTexture(
data.texture);
115 contents->SetTileModes(
data.x_tile_mode,
data.y_tile_mode);
116 contents->SetSamplerDescriptor(
data.sampler_descriptor);
117 contents->SetEffectTransform(
data.effect_transform);
118 if (
paint.color_filter) {
121 return color_filter->WrapWithGPUColorFilter(
124 contents->SetColorFilter(filter_proc);
126 contents->SetColorSourceSize(
Size::Ceil(
data.texture->GetSize()));
130 std::shared_ptr<ColorSourceContents> operator()(
131 const RuntimeEffectData&
data) {
132 auto contents = std::make_shared<RuntimeEffectContents>();
133 contents->SetOpacityFactor(
paint.color.alpha);
134 contents->SetRuntimeStage(
data.runtime_stage);
135 contents->SetUniformData(
data.uniform_data);
136 contents->SetTextureInputs(
data.texture_inputs);
140 std::shared_ptr<ColorSourceContents> operator()(
const std::monostate&
data) {
141 auto contents = std::make_shared<SolidColorContents>();
142 contents->SetColor(
paint.color);
146 #if IMPELLER_ENABLE_3D
147 std::shared_ptr<ColorSourceContents> operator()(
const SceneData&
data) {
148 auto contents = std::make_shared<SceneContents>();
149 contents->SetOpacityFactor(
paint.color.alpha);
150 contents->SetNode(
data.scene_node);
151 contents->SetCameraTransform(
data.camera_transform);
154 #endif // IMPELLER_ENABLE_3D
168 std::vector<Color> colors,
169 std::vector<Scalar> stops,
171 Matrix effect_transform) {
174 result.color_source_data_ =
176 std::move(stops), tile_mode, effect_transform};
182 std::vector<Color> colors,
183 std::vector<Scalar> stops,
187 Matrix effect_transform) {
191 center, radius, std::move(colors), std::move(stops),
192 focus_center, focus_radius, tile_mode, effect_transform};
198 std::vector<Color> colors,
199 std::vector<Scalar> stops,
201 Matrix effect_transform) {
204 result.color_source_data_ =
206 std::move(stops), tile_mode, effect_transform};
213 std::vector<Color> colors,
214 std::vector<Scalar> stops,
216 Matrix effect_transform) {
220 center, start_angle, end_angle, std::move(colors),
221 std::move(stops), tile_mode, effect_transform};
229 Matrix effect_transform) {
232 result.color_source_data_ =
233 ImageData{std::move(texture), x_tile_mode, y_tile_mode,
234 std::move(sampler_descriptor), effect_transform};
239 std::shared_ptr<RuntimeStage> runtime_stage,
240 std::shared_ptr<std::vector<uint8_t>> uniform_data,
241 std::vector<RuntimeEffectContents::TextureInput> texture_inputs) {
244 result.color_source_data_ =
246 std::move(texture_inputs)};
250 #if IMPELLER_ENABLE_3D
251 ColorSource ColorSource::MakeScene(std::shared_ptr<scene::Node> scene_node,
252 Matrix camera_transform) {
255 result.color_source_data_ = SceneData{scene_node, camera_transform};
258 #endif // IMPELLER_ENABLE_3D
266 return std::visit(CreateContentsVisitor{
paint}, color_source_data_);
270 return color_source_data_;