44
55#include " impeller/display_list/display_list_dispatcher.h"
66
7+ #include < optional>
8+
79#include " flutter/fml/trace_event.h"
810#include " impeller/entity/contents/linear_gradient_contents.h"
911#include " impeller/entity/entity.h"
@@ -157,51 +159,36 @@ void DisplayListDispatcher::setInvertColors(bool invert) {
157159 UNIMPLEMENTED;
158160}
159161
160- // |flutter::Dispatcher|
161- void DisplayListDispatcher::setBlendMode (SkBlendMode mode) {
162+ std::optional<Entity::BlendMode> ToBlendMode (SkBlendMode mode) {
162163 switch (mode) {
163164 case SkBlendMode::kClear :
164- paint_.blend_mode = Entity::BlendMode::kClear ;
165- break ;
165+ return Entity::BlendMode::kClear ;
166166 case SkBlendMode::kSrc :
167- paint_.blend_mode = Entity::BlendMode::kSource ;
168- break ;
167+ return Entity::BlendMode::kSource ;
169168 case SkBlendMode::kDst :
170- paint_.blend_mode = Entity::BlendMode::kDestination ;
171- break ;
169+ return Entity::BlendMode::kDestination ;
172170 case SkBlendMode::kSrcOver :
173- paint_.blend_mode = Entity::BlendMode::kSourceOver ;
174- break ;
171+ return Entity::BlendMode::kSourceOver ;
175172 case SkBlendMode::kDstOver :
176- paint_.blend_mode = Entity::BlendMode::kDestinationOver ;
177- break ;
173+ return Entity::BlendMode::kDestinationOver ;
178174 case SkBlendMode::kSrcIn :
179- paint_.blend_mode = Entity::BlendMode::kSourceIn ;
180- break ;
175+ return Entity::BlendMode::kSourceIn ;
181176 case SkBlendMode::kDstIn :
182- paint_.blend_mode = Entity::BlendMode::kDestinationIn ;
183- break ;
177+ return Entity::BlendMode::kDestinationIn ;
184178 case SkBlendMode::kSrcOut :
185- paint_.blend_mode = Entity::BlendMode::kSourceOut ;
186- break ;
179+ return Entity::BlendMode::kSourceOut ;
187180 case SkBlendMode::kDstOut :
188- paint_.blend_mode = Entity::BlendMode::kDestinationOut ;
189- break ;
181+ return Entity::BlendMode::kDestinationOut ;
190182 case SkBlendMode::kSrcATop :
191- paint_.blend_mode = Entity::BlendMode::kSourceATop ;
192- break ;
183+ return Entity::BlendMode::kSourceATop ;
193184 case SkBlendMode::kDstATop :
194- paint_.blend_mode = Entity::BlendMode::kDestinationATop ;
195- break ;
185+ return Entity::BlendMode::kDestinationATop ;
196186 case SkBlendMode::kXor :
197- paint_.blend_mode = Entity::BlendMode::kXor ;
198- break ;
187+ return Entity::BlendMode::kXor ;
199188 case SkBlendMode::kPlus :
200- paint_.blend_mode = Entity::BlendMode::kPlus ;
201- break ;
189+ return Entity::BlendMode::kPlus ;
202190 case SkBlendMode::kModulate :
203- paint_.blend_mode = Entity::BlendMode::kModulate ;
204- break ;
191+ return Entity::BlendMode::kModulate ;
205192 case SkBlendMode::kScreen :
206193 case SkBlendMode::kOverlay :
207194 case SkBlendMode::kDarken :
@@ -217,10 +204,18 @@ void DisplayListDispatcher::setBlendMode(SkBlendMode mode) {
217204 case SkBlendMode::kSaturation :
218205 case SkBlendMode::kColor :
219206 case SkBlendMode::kLuminosity :
220- // Non-pipeline-friendly blend modes are not supported by setBlendMode
221- // yet.
222- UNIMPLEMENTED;
223- break ;
207+ return std::nullopt ;
208+ }
209+
210+ return std::nullopt ;
211+ }
212+
213+ // |flutter::Dispatcher|
214+ void DisplayListDispatcher::setBlendMode (SkBlendMode sk_mode) {
215+ if (auto mode = ToBlendMode (sk_mode); mode.has_value ()) {
216+ paint_.blend_mode = mode.value ();
217+ } else {
218+ UNIMPLEMENTED;
224219 }
225220}
226221
@@ -459,10 +454,14 @@ void DisplayListDispatcher::clipPath(const SkPath& path,
459454}
460455
461456// |flutter::Dispatcher|
462- void DisplayListDispatcher::drawColor (SkColor color, SkBlendMode mode ) {
457+ void DisplayListDispatcher::drawColor (SkColor color, SkBlendMode sk_mode ) {
463458 Paint paint;
464459 paint.color = ToColor (color);
465- FML_LOG (ERROR) << " Blend mode on drawColor ignored." ;
460+ if (auto mode = ToBlendMode (sk_mode); mode.has_value ()) {
461+ paint.blend_mode = mode.value ();
462+ } else {
463+ FML_DLOG (ERROR) << " Unimplemented blend mode in " << __FUNCTION__;
464+ }
466465 canvas_.DrawPaint (paint);
467466}
468467
0 commit comments