Skip to content

Commit 940ad55

Browse files
committed
[[ canvas ]] Add begin effect only layer with <effect> on <canvas> syntax
This allows drawing shadow & glow effects without rendering the source
1 parent ed6c75a commit 940ad55

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
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
@@ -4281,6 +4281,7 @@ public foreign handler MCCanvasSaveState(in pCanvas as Canvas) returns nothing b
42814281
public foreign handler MCCanvasRestoreState(in pCanvas as Canvas) returns nothing binds to "<builtin>"
42824282
public foreign handler MCCanvasBeginLayer(in pCanvas as Canvas) returns nothing binds to "<builtin>"
42834283
public foreign handler MCCanvasBeginLayerWithEffect(in pEffect as Effect, in pCanvas as Canvas) returns nothing binds to "<builtin>"
4284+
public foreign handler MCCanvasBeginEffectOnlyLayerWithEffect(in pEffect as Effect, in pCanvas as Canvas) returns nothing binds to "<builtin>"
42844285
public foreign handler MCCanvasEndLayer(in pCanvas as Canvas) returns nothing binds to "<builtin>"
42854286

42864287
public foreign handler MCCanvasFill(in pCanvas as Canvas) returns nothing binds to "<builtin>"
@@ -4486,6 +4487,11 @@ begin
44864487
MCCanvasBeginLayer(mCanvas)
44874488
MCCanvasBeginLayerWithEffect(mEffect, mCanvas)
44884489
end syntax
4490+
syntax CanvasOperationBeginEffectOnlyLayer is statement
4491+
"begin" "effect" "only" "layer" "with" <mEffect: Expression> "on" <mCanvas: Expression>
4492+
begin
4493+
MCCanvasBeginEffectOnlyLayerWithEffect(mEffect, mCanvas)
4494+
end syntax
44894495

44904496
//////////
44914497

engine/src/module-canvas.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5658,8 +5658,21 @@ static void MCPolarCoordsToCartesian(MCGFloat p_distance, MCGFloat p_angle, MCGF
56585658
r_y = p_distance * sin(p_angle);
56595659
}
56605660

5661+
void _MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas, bool p_isolated);
5662+
56615663
MC_DLLEXPORT_DEF
56625664
void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas)
5665+
{
5666+
_MCCanvasBeginLayerWithEffect(p_effect, p_canvas, false);
5667+
}
5668+
5669+
MC_DLLEXPORT_DEF
5670+
void MCCanvasBeginEffectOnlyLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas)
5671+
{
5672+
_MCCanvasBeginLayerWithEffect(p_effect, p_canvas, true);
5673+
}
5674+
5675+
void _MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas, bool p_isolated)
56635676
{
56645677
__MCCanvasImpl *t_canvas;
56655678
t_canvas = MCCanvasGet(p_canvas);
@@ -5676,6 +5689,8 @@ void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canv
56765689
MCCanvasFloat t_spread;
56775690
t_spread = MCClamp(t_effect_impl->spread, 0.0, 1.0);
56785691

5692+
t_effects.isolated = p_isolated;
5693+
56795694
switch (t_effect_impl->type)
56805695
{
56815696
case kMCCanvasEffectTypeColorOverlay:

engine/src/module-canvas.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ extern "C" MC_DLLEXPORT void MCCanvasSaveState(MCCanvasRef p_canvas);
563563
extern "C" MC_DLLEXPORT void MCCanvasRestoreState(MCCanvasRef p_canvas);
564564
extern "C" MC_DLLEXPORT void MCCanvasBeginLayer(MCCanvasRef p_canvas);
565565
extern "C" MC_DLLEXPORT void MCCanvasBeginLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas);
566+
extern "C" MC_DLLEXPORT void MCCanvasBeginEffectOnlyLayerWithEffect(MCCanvasEffectRef p_effect, MCCanvasRef p_canvas);
566567
extern "C" MC_DLLEXPORT void MCCanvasEndLayer(MCCanvasRef p_canvas);
567568
extern "C" MC_DLLEXPORT void MCCanvasFill(MCCanvasRef p_canvas);
568569
extern "C" MC_DLLEXPORT void MCCanvasFillPath(MCCanvasPathRef p_path, MCCanvasRef p_canvas);

0 commit comments

Comments
 (0)