Skip to content

Commit 36327e2

Browse files
authored
Merge pull request livecode#7033 from livecodeian/feature-canvas-effect-isolation
[[ canvas ]] Add `begin effect only layer with <effect> on <canvas>` syntax
2 parents e390dde + 940ad55 commit 36327e2

File tree

8 files changed

+55
-33
lines changed

8 files changed

+55
-33
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# LiveCode Builder Host Library
2+
## Canvas library
3+
4+
A new statement `begin effect only layer with <effect>` has been implemented to
5+
allow drawing shadow & glow effects without rendering the source content
6+
7+
For example to draw a dropshadow of a rectangle without drawing the rectangle itself:
8+
variable tEffect as Effect
9+
put outer shadow effect into tEffect
10+
11+
begin effect only layer with tEffect on this canvas
12+
fill rectangle path of rectangle [50,50,100,100] on this canvas
13+
end layer on this canvas

engine/src/canvas.lcb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4389,6 +4389,7 @@ public foreign handler MCCanvasSaveState(in pCanvas as Canvas) returns nothing b
43894389
public foreign handler MCCanvasRestoreState(in pCanvas as Canvas) returns nothing binds to "<builtin>"
43904390
public foreign handler MCCanvasBeginLayer(in pCanvas as Canvas) returns nothing binds to "<builtin>"
43914391
public foreign handler MCCanvasBeginLayerWithEffect(in pEffect as Effect, in pCanvas as Canvas) returns nothing binds to "<builtin>"
4392+
public foreign handler MCCanvasBeginEffectOnlyLayerWithEffect(in pEffect as Effect, in pCanvas as Canvas) returns nothing binds to "<builtin>"
43924393
public foreign handler MCCanvasEndLayer(in pCanvas as Canvas) returns nothing binds to "<builtin>"
43934394

43944395
public foreign handler MCCanvasFill(in pCanvas as Canvas) returns nothing binds to "<builtin>"
@@ -4594,6 +4595,11 @@ begin
45944595
MCCanvasBeginLayer(mCanvas)
45954596
MCCanvasBeginLayerWithEffect(mEffect, mCanvas)
45964597
end syntax
4598+
syntax CanvasOperationBeginEffectOnlyLayer is statement
4599+
"begin" "effect" "only" "layer" "with" <mEffect: Expression> "on" <mCanvas: Expression>
4600+
begin
4601+
MCCanvasBeginEffectOnlyLayerWithEffect(mEffect, mCanvas)
4602+
end syntax
45974603

45984604
//////////
45994605

engine/src/graphicscontext.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,7 @@ void MCGraphicsContext::begin(bool p_group)
236236

237237
bool MCGraphicsContext::begin_with_effects(MCBitmapEffectsRef p_effects, const MCRectangle &p_shape)
238238
{
239-
MCGBitmapEffects t_effects;
240-
t_effects . has_drop_shadow = false;
241-
t_effects . has_outer_glow = false;
242-
t_effects . has_inner_glow = false;
243-
t_effects . has_inner_shadow = false;
239+
MCGBitmapEffects t_effects = MCGBitmapEffects();
244240

245241
if ((p_effects -> mask & kMCBitmapEffectTypeColorOverlayBit) != 0)
246242
{

engine/src/module-canvas.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5669,8 +5669,21 @@ static void MCPolarCoordsToCartesian(MCGFloat p_distance, MCGFloat p_angle, MCGF
56695669
r_y = p_distance * sin(p_angle);
56705670
}
56715671

5672+
void _MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas, bool p_isolated);
5673+
56725674
MC_DLLEXPORT_DEF
56735675
void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas)
5676+
{
5677+
_MCCanvasBeginLayerWithEffect(p_effect, p_canvas, false);
5678+
}
5679+
5680+
MC_DLLEXPORT_DEF
5681+
void MCCanvasBeginEffectOnlyLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas)
5682+
{
5683+
_MCCanvasBeginLayerWithEffect(p_effect, p_canvas, true);
5684+
}
5685+
5686+
void _MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas, bool p_isolated)
56745687
{
56755688
__MCCanvasImpl *t_canvas;
56765689
t_canvas = MCCanvasGet(p_canvas);
@@ -5679,15 +5692,16 @@ void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canv
56795692
if (!MCCanvasPropertiesPush(*t_canvas))
56805693
return;
56815694

5682-
MCGBitmapEffects t_effects;
5683-
t_effects.has_color_overlay = t_effects.has_drop_shadow = t_effects.has_inner_glow = t_effects.has_inner_shadow = t_effects.has_outer_glow = false;
5684-
5695+
MCGBitmapEffects t_effects = MCGBitmapEffects();
5696+
56855697
__MCCanvasEffectImpl *t_effect_impl;
56865698
t_effect_impl = MCCanvasEffectGet(p_effect);
56875699

56885700
MCCanvasFloat t_spread;
56895701
t_spread = MCClamp(t_effect_impl->spread, 0.0, 1.0);
56905702

5703+
t_effects.isolated = p_isolated;
5704+
56915705
switch (t_effect_impl->type)
56925706
{
56935707
case kMCCanvasEffectTypeColorOverlay:

engine/src/module-canvas.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,7 @@ extern "C" MC_DLLEXPORT void MCCanvasSaveState(MCCanvasRef p_canvas);
568568
extern "C" MC_DLLEXPORT void MCCanvasRestoreState(MCCanvasRef p_canvas);
569569
extern "C" MC_DLLEXPORT void MCCanvasBeginLayer(MCCanvasRef p_canvas);
570570
extern "C" MC_DLLEXPORT void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas);
571+
extern "C" MC_DLLEXPORT void MCCanvasBeginEffectOnlyLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas);
571572
extern "C" MC_DLLEXPORT void MCCanvasEndLayer(MCCanvasRef p_canvas);
572573
extern "C" MC_DLLEXPORT void MCCanvasFill(MCCanvasRef p_canvas);
573574
extern "C" MC_DLLEXPORT void MCCanvasFillPath(MCCanvasPathRef p_path, MCCanvasRef p_canvas);

engine/src/player-platform.cpp

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,9 @@ class MCPlayerVolumePopup: public MCStack
180180
MCRectangle t_volume_well;
181181
t_volume_well = getVolumeBarPartRect(dirty, kMCPlayerControllerPartVolumeWell);
182182

183-
MCGBitmapEffects t_effects;
184-
t_effects . has_drop_shadow = false;
185-
t_effects . has_outer_glow = false;
186-
t_effects . has_inner_glow = false;
183+
MCGBitmapEffects t_effects = MCGBitmapEffects();
187184
t_effects . has_inner_shadow = true;
188-
t_effects . has_color_overlay = false;
189-
185+
190186
MCGShadowEffect t_inner_shadow;
191187
t_inner_shadow . color = MCGColorMakeRGBA(0.0f, 0.0f, 0.0f, 56.0 / 255.0);
192188
t_inner_shadow . blend_mode = kMCGBlendModeClear;
@@ -526,13 +522,9 @@ class MCPlayerRatePopup: public MCStack
526522
MCRectangle t_rate_well;
527523
t_rate_well = getRateBarPartRect(dirty, kMCPlayerControllerPartRateWell);
528524

529-
MCGBitmapEffects t_effects;
530-
t_effects . has_drop_shadow = false;
531-
t_effects . has_outer_glow = false;
532-
t_effects . has_inner_glow = false;
525+
MCGBitmapEffects t_effects = MCGBitmapEffects();
533526
t_effects . has_inner_shadow = true;
534-
t_effects . has_color_overlay = false;
535-
527+
536528
MCGShadowEffect t_inner_shadow;
537529
t_inner_shadow . color = MCGColorMakeRGBA(0.0f, 0.0f, 0.0f, 56.0 / 255.0);
538530
t_inner_shadow . blend_mode = kMCGBlendModeClear;
@@ -2590,13 +2582,9 @@ void MCPlayer::drawControllerWellButton(MCGContextRef p_gcontext)
25902582
t_drawn_well_rect . x += 4;
25912583
t_drawn_well_rect . width -= 10;
25922584

2593-
MCGBitmapEffects t_effects;
2594-
t_effects . has_drop_shadow = false;
2595-
t_effects . has_outer_glow = false;
2596-
t_effects . has_inner_glow = false;
2597-
t_effects . has_inner_shadow = true;
2598-
t_effects . has_color_overlay = false;
2599-
2585+
MCGBitmapEffects t_effects = MCGBitmapEffects();
2586+
t_effects . has_inner_shadow = true;
2587+
26002588
MCGShadowEffect t_inner_shadow;
26012589
t_inner_shadow . color = MCGColorMakeRGBA(56.0 / 255.0, 56.0 / 255.0, 56.0 / 255.0, 56.0 / 255.0);
26022590
t_inner_shadow . blend_mode = kMCGBlendModeClear;

libgraphics/include/graphics.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,8 @@ struct MCGBitmapEffects
531531
bool has_inner_shadow = false;
532532
bool has_outer_glow = false;
533533
bool has_drop_shadow = false;
534+
535+
bool isolated = false;
534536
};
535537

536538
struct MCGDeviceMaskInfo

libgraphics/src/context.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,12 +1183,14 @@ static void MCGContextRenderEffects(MCGContextRef self, MCGContextLayerRef p_chi
11831183
p_effects . outer_glow . color,
11841184
p_effects . outer_glow . blend_mode);
11851185

1186-
1187-
// Render the layer itself (using the layer's alpha and blend mode - well, if we can agree that's a good change!).
1188-
self->layer->canvas->save();
1189-
self->layer->canvas->resetMatrix();
1190-
self->layer->canvas->drawBitmap(t_child_bitmap, p_child->origin_x, p_child->origin_y, NULL);
1191-
self->layer->canvas->restore();
1186+
if (!p_effects . isolated)
1187+
{
1188+
// Render the layer itself (using the layer's alpha and blend mode - well, if we can agree that's a good change!).
1189+
self->layer->canvas->save();
1190+
self->layer->canvas->resetMatrix();
1191+
self->layer->canvas->drawBitmap(t_child_bitmap, p_child->origin_x, p_child->origin_y, NULL);
1192+
self->layer->canvas->restore();
1193+
}
11921194

11931195
if (p_effects . has_inner_shadow)
11941196
MCGContextRenderEffect(self,

0 commit comments

Comments
 (0)