GlowEffectLib — Outer Glow Effect

Creates a luminous aura around any visual control. GPU-accelerated outer glow that radiates outwards from the control’s edges. Wraps FireMonkey’s TGlowEffect. Perfect for neon UIs, selection highlighting, hover feedback, and sci-fi aesthetics. 17 functions.

CategoryCountDescription
Error Handling4glow_error, errormsg$, strerror$, clearerror
Creation & Destruction2glow# (create), glow_free (destroy)
Properties7softness (2), color (3), opacity (2)
Effect Control4enabled, trigger (get/set)
ⓘ Color has 3 functions: glow_color# sets by string, glow_color$ gets as string, and glow_color gets as numeric ARGB value.

Outer Glow vs Inner Glow

FeatureGlowEffectLib (Outer)InnerGlowEffectLib
DirectionOutward — radiates beyond edgesInward — fills inside edges
VisualLuminous halo/auraInner border glow
Best forNeon buttons, selection, hoverEmbossed panels, inset effects
Functions1716

Default Values

PropertyRangeDefaultDescription
Softness0.0–9.04.0Glow spread/blur radius
GlowColorColor name / hexYellowGlow colour
Opacity0.0–1.00.9Glow intensity

Cross-Platform Support

PlatformStatusNotes
Windows✅ Full SupportGPU-accelerated via Direct2D
Linux✅ Full SupportSoftware rendering fallback
Android✅ Full SupportGPU-accelerated

Error Handling

FunctionSignatureDescription
glow_error()glow_error@Returns last error code (0 = no error)
glow_errormsg$()glow_errormsg$@Returns last error message
glow_strerror$(code)glow_strerror$@nConverts error code to text
glow_clearerror()glow_clearerror@Clears error state

Error Codes

CodeConstantMeaning
0ERR_NONENo error
1ERR_NIL_EFFECTEffect pointer is nil
2ERR_INVALID_EFFECTNot a valid TGlowEffect
3ERR_INVALID_VALUEProperty value out of range
4ERR_NIL_PARENTParent control is nil
5ERR_INVALID_PARENTNot a valid TFmxObject
6ERR_INVALID_COLORUnrecognised colour name/hex

Creation & Destruction

FunctionSignatureDescription
glow#(parent#)glow#@#Creates outer glow on parent. Returns effect pointer. Defaults: softness 4.0, color Yellow, opacity 0.9
glow_free(effect#)glow_free@#Destroys effect, removes from parent

Softness

Controls glow spread/blur radius. Range 0.0–9.0.

FunctionSignatureDescription
glow_softness#(effect#, value)glow_softness#@#nSets softness (0.0–9.0)
glow_softness(effect#)glow_softness@#Gets current softness
RangeEffectUse Case
0.0–2.0Tight glow, close to edgeSubtle highlight, thin border glow
2.0–5.0Normal glow spreadGeneral purpose, neon buttons
5.0–9.0Wide, diffuse glowDramatic aura, ambient lighting

Color

Glow colour accepts named colours or hex strings. Three functions: set (string), get as string, get as number.

FunctionSignatureDescription
glow_color#(effect#, color$)glow_color#@#$Sets glow colour (name or hex string)
glow_color$(effect#)glow_color$@#Gets colour as string
glow_color(effect#)glow_color@#Gets colour as numeric ARGB value

Supported named colours: Black, White, Red, Green, Blue, Yellow, Cyan, Magenta, Gray, Grey, Silver, Maroon, Olive, Navy, Purple, Teal, Orange, Pink, Brown, Lime, Aqua, Fuchsia, Transparent, Null

Hex format: #RRGGBB or #AARRGGBB (e.g. "#00FFFF" for cyan, "#8000FF00" for 50% transparent green)

Opacity

FunctionSignatureDescription
glow_opacity#(effect#, value)glow_opacity#@#nSets opacity (0.0–1.0)
glow_opacity(effect#)glow_opacity@#Gets current opacity
RangeEffect
0.0Invisible (glow hidden)
0.3–0.5Subtle, understated glow
0.6–0.8Normal glow intensity
0.9–1.0Intense, vivid glow

Effect Control

FunctionSignatureDescription
glow_enabled#(effect#, value)glow_enabled#@#nEnables (1) or disables (0)
glow_enabled(effect#)glow_enabled@#Gets enabled state
glow_trigger#(effect#, trigger$)glow_trigger#@#$Sets trigger (e.g. "IsMouseOver=true")
glow_trigger$(effect#)glow_trigger$@#Gets trigger string

Complete Examples

Neon Button

╯ glow-neon.bas
let frm# = form#("Neon Button", 400, 250)

' Dark background
let bg# = rectangle#(frm#)
rectangle_bounds#(bg#, 0, 0, 400, 250)
rectangle_fill#(bg#, "#1a1a2e")

' Neon button
let btn# = rectangle#(bg#)
rectangle_bounds#(btn#, 125, 90, 150, 50)
rectangle_fill#(btn#, "#1a1a2e")
rectangle_stroke#(btn#, "Cyan")
rectangle_strokethickness#(btn#, 2)
rectangle_corners#(btn#, 8, 8)

let lbl# = label#(btn#, "NEON", 55, 15)
label_fontcolor#(lbl#, "White")

' Cyan glow
let glow# = glow#(btn#)
glow_color#(glow#, "Cyan")
glow_softness#(glow#, 5.0)
glow_opacity#(glow#, 0.9)

form_show(frm#)

Neon Button Gallery

╯ glow-gallery.bas
let frm# = form#("Neon Gallery", 500, 200)

let bg# = rectangle#(frm#)
rectangle_bounds#(bg#, 0, 0, 500, 200)
rectangle_fill#(bg#, "#0d0d0d")

CreateNeonBtn(bg#, 30, 70, "PLAY", "Lime")
CreateNeonBtn(bg#, 140, 70, "STOP", "Red")
CreateNeonBtn(bg#, 250, 70, "INFO", "Cyan")
CreateNeonBtn(bg#, 360, 70, "WARN", "Orange")

form_show(frm#)

function CreateNeonBtn(parent#, x, y, text$, color$) local btn#, lbl#, glow#
  btn# = rectangle#(parent#)
  rectangle_bounds#(btn#, x, y, 90, 40)
  rectangle_fill#(btn#, "#0d0d0d")
  rectangle_stroke#(btn#, color$)
  rectangle_strokethickness#(btn#, 2)
  rectangle_corners#(btn#, 5, 5)

  lbl# = label#(btn#, text$, 25, 10)
  label_fontcolor#(lbl#, "White")

  glow# = glow#(btn#)
  glow_color#(glow#, color$)
  glow_softness#(glow#, 4.0)
  glow_opacity#(glow#, 0.8)
endfunction

Hover Glow Cards

╯ glow-hover.bas
let frm# = Pointer#(0)
let card1# = Pointer#(0)
let card2# = Pointer#(0)
let glow1# = Pointer#(0)
let glow2# = Pointer#(0)

frm# = form#("Hover Glow Cards", 450, 250)

let info# = label#(frm#, "Hover over the cards:", 30, 20)

' Card 1
card1# = rectangle#(frm#)
rectangle_bounds#(card1#, 50, 70, 150, 100)
rectangle_fill#(card1#, "White")
rectangle_corners#(card1#, 8, 8)

glow1# = glow#(card1#)
glow_color#(glow1#, "DodgerBlue")
glow_softness#(glow1#, 5.0)
glow_enabled#(glow1#, 0)

rectangle_onmouseenter#(card1#, "Card1Enter")
rectangle_onmouseleave#(card1#, "Card1Leave")
let lbl1# = label#(card1#, "Card 1", 50, 40)
label_hittest#(lbl1#, 0)

' Card 2
card2# = rectangle#(frm#)
rectangle_bounds#(card2#, 250, 70, 150, 100)
rectangle_fill#(card2#, "White")
rectangle_corners#(card2#, 8, 8)

glow2# = glow#(card2#)
glow_color#(glow2#, "LimeGreen")
glow_softness#(glow2#, 5.0)
glow_enabled#(glow2#, 0)

rectangle_onmouseenter#(card2#, "Card2Enter")
rectangle_onmouseleave#(card2#, "Card2Leave")
let lbl2# = label#(card2#, "Card 2", 50, 40)
label_hittest#(lbl2#, 0)

form_show(frm#)

function Card1Enter(sender#)
  glow_enabled#(glow1#, 1)
endfunction
function Card1Leave(sender#)
  glow_enabled#(glow1#, 0)
endfunction
function Card2Enter(sender#)
  glow_enabled#(glow2#, 1)
endfunction
function Card2Leave(sender#)
  glow_enabled#(glow2#, 0)
endfunction

Animatable Properties

Both Softness and Opacity can be animated with FloatAnimationLib for pulsing glow effects:

╯ glow-pulse.bas
' Pulsing glow on a circle
let ani# = floatani#(glow#)
floatani_propertyname#(ani#, "Softness")
floatani_startvalue#(ani#, 2.0)
floatani_stopvalue#(ani#, 8.0)
floatani_duration#(ani#, 0.8)
floatani_autoreverse#(ani#, 1)
floatani_loop#(ani#, 1)
floatani_interpolation#(ani#, "Sinusoidal")
floatani_animationtype#(ani#, "InOut")
floatani_start(ani#)

Best Practices

PracticeWhy
Use dark backgrounds for neonGlow stands out best on dark surfaces
Softness 4–5 for general useGood balance of visible glow without heavy rendering
Softness >7 on mobile with cautionVery wide glow can impact performance on mobile GPUs
Use glow_enabled# for hoverToggle via mouse events for interactive feedback
Match glow colour to borderCreates cohesive neon look when stroke and glow match
Animate with FloatAnimationLibSinusoidal pulse on Softness creates natural breathing effect
Use label_hittest#(lbl#, 0)Prevents labels inside glowing controls from stealing mouse events

Quick Reference

FunctionSignatureDescription
ERROR HANDLING
glow_error()glow_error@Last error code
glow_errormsg$()glow_errormsg$@Last error message
glow_strerror$(code)glow_strerror$@nError code to text
glow_clearerror()glow_clearerror@Clear error state
CREATION & DESTRUCTION
glow#(parent#)glow#@#Create outer glow on control
glow_free(effect#)glow_free@#Destroy effect
SOFTNESS
glow_softness#(e#, val)glow_softness#@#nSet spread (0–9)
glow_softness(e#)glow_softness@#Get spread
COLOR
glow_color#(e#, color$)glow_color#@#$Set colour (name/hex)
glow_color$(e#)glow_color$@#Get colour as string
glow_color(e#)glow_color@#Get colour as ARGB number
OPACITY
glow_opacity#(e#, val)glow_opacity#@#nSet opacity (0–1)
glow_opacity(e#)glow_opacity@#Get opacity
EFFECT CONTROL
glow_enabled#(e#, val)glow_enabled#@#nEnable (1) / disable (0)
glow_enabled(e#)glow_enabled@#Get enabled state
glow_trigger#(e#, str$)glow_trigger#@#$Set trigger string
glow_trigger$(e#)glow_trigger$@#Get trigger string

17 functions. Part of the Plan9Basic visual effects library system.

See Also

  • InnerGlowEffectLib — Glow inside control boundaries
  • ShadowEffectLib — Drop shadow effects
  • BlurEffectLib — Blur effects
  • FloatAnimationLib — Animate glow Softness and Opacity