Skip to content

Commit 1d6dc1e

Browse files
chinmaygardednfield
authored andcommitted
Forward blend mode from the dispatchers drawColor call. (flutter#90)
1 parent 6883215 commit 1d6dc1e

File tree

1 file changed

+35
-36
lines changed

1 file changed

+35
-36
lines changed

impeller/display_list/display_list_dispatcher.cc

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
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

Comments
 (0)