Skip to content

Commit b97e965

Browse files
bderodnfield
authored andcommitted
Add remaining additive blends (flutter#76)
1 parent d0c5928 commit b97e965

File tree

3 files changed

+83
-2
lines changed

3 files changed

+83
-2
lines changed

impeller/entity/contents/content_context.h

+51-2
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,61 @@ class ContentContext {
159159
color0.src_alpha_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
160160
color0.src_color_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
161161
break;
162-
case Entity::BlendMode::kPlus:
162+
case Entity::BlendMode::kSourceIn:
163+
color0.dst_alpha_blend_factor = BlendFactor::kZero;
164+
color0.dst_color_blend_factor = BlendFactor::kZero;
165+
color0.src_alpha_blend_factor = BlendFactor::kDestinationAlpha;
166+
color0.src_color_blend_factor = BlendFactor::kDestinationAlpha;
167+
break;
168+
case Entity::BlendMode::kDestinationIn:
169+
color0.dst_alpha_blend_factor = BlendFactor::kSourceAlpha;
170+
color0.dst_color_blend_factor = BlendFactor::kSourceAlpha;
171+
color0.src_alpha_blend_factor = BlendFactor::kZero;
172+
color0.src_color_blend_factor = BlendFactor::kZero;
173+
break;
174+
case Entity::BlendMode::kSourceOut:
175+
color0.dst_alpha_blend_factor = BlendFactor::kZero;
176+
color0.dst_color_blend_factor = BlendFactor::kZero;
177+
color0.src_alpha_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
178+
color0.src_color_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
179+
break;
180+
case Entity::BlendMode::kDestinationOut:
181+
color0.dst_alpha_blend_factor = BlendFactor::kOneMinusSourceAlpha;
182+
color0.dst_color_blend_factor = BlendFactor::kOneMinusSourceAlpha;
183+
color0.src_alpha_blend_factor = BlendFactor::kZero;
184+
color0.src_color_blend_factor = BlendFactor::kZero;
185+
break;
186+
case Entity::BlendMode::kSourceATop:
163187
color0.dst_alpha_blend_factor = BlendFactor::kOneMinusSourceAlpha;
188+
color0.dst_color_blend_factor = BlendFactor::kOneMinusSourceAlpha;
189+
color0.src_alpha_blend_factor = BlendFactor::kDestinationAlpha;
190+
color0.src_color_blend_factor = BlendFactor::kDestinationAlpha;
191+
break;
192+
case Entity::BlendMode::kDestinationATop:
193+
color0.dst_alpha_blend_factor = BlendFactor::kSourceAlpha;
194+
color0.dst_color_blend_factor = BlendFactor::kSourceAlpha;
195+
color0.src_alpha_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
196+
color0.src_color_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
197+
break;
198+
case Entity::BlendMode::kXor:
199+
color0.dst_alpha_blend_factor = BlendFactor::kOneMinusSourceAlpha;
200+
color0.dst_color_blend_factor = BlendFactor::kOneMinusSourceAlpha;
201+
color0.src_alpha_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
202+
color0.src_color_blend_factor = BlendFactor::kOneMinusDestinationAlpha;
203+
break;
204+
case Entity::BlendMode::kPlus:
205+
color0.dst_alpha_blend_factor = BlendFactor::kOne;
164206
color0.dst_color_blend_factor = BlendFactor::kOne;
165-
color0.src_alpha_blend_factor = BlendFactor::kSourceAlpha;
207+
color0.src_alpha_blend_factor = BlendFactor::kOne;
166208
color0.src_color_blend_factor = BlendFactor::kOne;
167209
break;
210+
case Entity::BlendMode::kModulate:
211+
// kSourceColor and kDestinationColor override the alpha blend factor.
212+
color0.dst_alpha_blend_factor = BlendFactor::kZero;
213+
color0.dst_color_blend_factor = BlendFactor::kSourceColor;
214+
color0.src_alpha_blend_factor = BlendFactor::kZero;
215+
color0.src_color_blend_factor = BlendFactor::kZero;
216+
break;
168217
}
169218
desc.SetColorAttachmentDescriptor(0u, std::move(color0));
170219
}

impeller/entity/entity.h

+8
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,15 @@ class Entity {
2727
kDestination,
2828
kSourceOver,
2929
kDestinationOver,
30+
kSourceIn,
31+
kDestinationIn,
32+
kSourceOut,
33+
kDestinationOut,
34+
kSourceATop,
35+
kDestinationATop,
36+
kXor,
3037
kPlus,
38+
kModulate,
3139
};
3240

3341
Entity();

impeller/entity/entity_unittests.cc

+24
Original file line numberDiff line numberDiff line change
@@ -522,9 +522,33 @@ TEST_F(EntityTest, BlendingModeOptions) {
522522
case Entity::BlendMode::kDestinationOver:
523523
blend_mode_names.push_back("DestinationOver");
524524
blend_mode_values.push_back(Entity::BlendMode::kDestinationOver);
525+
case Entity::BlendMode::kSourceIn:
526+
blend_mode_names.push_back("SourceIn");
527+
blend_mode_values.push_back(Entity::BlendMode::kSourceIn);
528+
case Entity::BlendMode::kDestinationIn:
529+
blend_mode_names.push_back("DestinationIn");
530+
blend_mode_values.push_back(Entity::BlendMode::kDestinationIn);
531+
case Entity::BlendMode::kSourceOut:
532+
blend_mode_names.push_back("SourceOut");
533+
blend_mode_values.push_back(Entity::BlendMode::kSourceOut);
534+
case Entity::BlendMode::kDestinationOut:
535+
blend_mode_names.push_back("DestinationOut");
536+
blend_mode_values.push_back(Entity::BlendMode::kDestinationOut);
537+
case Entity::BlendMode::kSourceATop:
538+
blend_mode_names.push_back("SourceATop");
539+
blend_mode_values.push_back(Entity::BlendMode::kSourceATop);
540+
case Entity::BlendMode::kDestinationATop:
541+
blend_mode_names.push_back("DestinationATop");
542+
blend_mode_values.push_back(Entity::BlendMode::kDestinationATop);
543+
case Entity::BlendMode::kXor:
544+
blend_mode_names.push_back("Xor");
545+
blend_mode_values.push_back(Entity::BlendMode::kXor);
525546
case Entity::BlendMode::kPlus:
526547
blend_mode_names.push_back("Plus");
527548
blend_mode_values.push_back(Entity::BlendMode::kPlus);
549+
case Entity::BlendMode::kModulate:
550+
blend_mode_names.push_back("Modulate");
551+
blend_mode_values.push_back(Entity::BlendMode::kModulate);
528552
};
529553
}
530554

0 commit comments

Comments
 (0)