InvertEffectLib — Colour Inversion

Creates a photographic negative by inverting all pixel colours. Black becomes white, red becomes cyan, blue becomes yellow. Wraps FireMonkey’s TInvertEffect. This is a binary effect — on or off, no intensity parameter. 10 functions.

CategoryCountDescription
Error Handling4invert_error, errormsg$, strerror$, clearerror
Creation & Destruction2invert# (create), invert_free (destroy)
Effect Control4enabled, trigger (get/set)
ⓘ Simplest effect: InvertEffectLib has no adjustable properties (no amount, colour, or intensity). It simply flips all colours to their complement. Use invert_enabled# to toggle on/off.

Colour Inversions

Each pixel’s RGB channels are inverted: new = 255 - original. Alpha is preserved.

OriginalInvertedFormula
Black (0,0,0)White (255,255,255)255−0 = 255
White (255,255,255)Black (0,0,0)255−255 = 0
Red (255,0,0)Cyan (0,255,255)Complementary pair
Green (0,255,0)Magenta (255,0,255)Complementary pair
Blue (0,0,255)Yellow (255,255,0)Complementary pair
Orange (255,165,0)Blue (0,90,255)Channel-wise inversion
Gray 50% (128,128,128)Gray 50% (127,127,127)Mid-gray stays mid-gray
ⓘ Double invert = original: Applying invert twice returns to the original colours. Inverting an already inverted image restores it perfectly.

Cross-Platform Support

PlatformStatus
Windows✅ Full Support
Linux✅ Full Support
Android✅ Full Support

Error Handling

FunctionSignatureDescription
invert_error()invert_error@Returns last error code (0 = no error)
invert_errormsg$()invert_errormsg$@Returns last error message
invert_strerror$(code)invert_strerror$@nConverts error code to text
invert_clearerror()invert_clearerror@Clears error state

Creation & Destruction

FunctionSignatureDescription
invert#(parent#)invert#@#Creates invert effect on parent. Returns effect pointer. Effect is enabled by default.
invert_free(effect#)invert_free@#Destroys effect, removes from parent

Effect Control

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

Complete Examples

Toggle Invert

╯ invert-toggle.bas
let frm# = Pointer#(0)
let rect# = Pointer#(0)
let fx# = Pointer#(0)

frm# = form#("Invert Demo", 400, 300)

rect# = rectangle#(frm#)
rectangle_bounds#(rect#, 50, 50, 200, 100)
rectangle_fill#(rect#, "Red")

fx# = invert#(rect#)
invert_enabled#(fx#, 0)  ' Start with original

let btn# = button#(frm#, "Toggle Invert")
button_bounds#(btn#, 50, 180, 120, 30)
button_onclick#(btn#, "ToggleInvert")

form_show(frm#)

function ToggleInvert(sender#) local e
  e = invert_enabled(fx#)
  if e = 1 then
    invert_enabled#(fx#, 0)
  else
    invert_enabled#(fx#, 1)
  endif
endfunction

Hover-Based Inversion

╯ invert-hover.bas
let frm# = form#("Hover Invert", 450, 280)

' Three cards that invert on hover
CreateInvertCard(frm#, 50, 70, "Red", "Card 1")
CreateInvertCard(frm#, 175, 70, "Green", "Card 2")
CreateInvertCard(frm#, 300, 70, "Blue", "Card 3")

let info# = label#(frm#, "Hover over cards to invert", 120, 30)

form_show(frm#)

function CreateInvertCard(parent#, x, y, color$, text$) local rect#, lbl#, fx#
  rect# = rectangle#(parent#)
  rectangle_bounds#(rect#, x, y, 100, 120)
  rectangle_fill#(rect#, color$)
  rectangle_corners#(rect#, 6, 6)

  lbl# = label#(rect#, text$, 25, 50)
  label_fontcolor#(lbl#, "White")
  label_hittest#(lbl#, 0)

  fx# = invert#(rect#)
  invert_trigger#(fx#, "IsMouseOver=true")
endfunction

Inversion Gallery

╯ invert-gallery.bas
let frm# = form#("Inversion Gallery", 500, 300)

' Original colours
let r1# = rectangle#(frm#)
rectangle_bounds#(r1#, 40, 60, 100, 80)
rectangle_fill#(r1#, "Red")
let l1# = label#(frm#, "Red", 70, 150)

let r2# = rectangle#(frm#)
rectangle_bounds#(r2#, 200, 60, 100, 80)
rectangle_fill#(r2#, "Green")
let l2# = label#(frm#, "Green", 225, 150)

let r3# = rectangle#(frm#)
rectangle_bounds#(r3#, 360, 60, 100, 80)
rectangle_fill#(r3#, "Blue")
let l3# = label#(frm#, "Blue", 390, 150)

' Inverted versions
let ri1# = rectangle#(frm#)
rectangle_bounds#(ri1#, 40, 180, 100, 80)
rectangle_fill#(ri1#, "Red")
let fx1# = invert#(ri1#)
let li1# = label#(frm#, "Cyan", 65, 268)

let ri2# = rectangle#(frm#)
rectangle_bounds#(ri2#, 200, 180, 100, 80)
rectangle_fill#(ri2#, "Green")
let fx2# = invert#(ri2#)
let li2# = label#(frm#, "Magenta", 218, 268)

let ri3# = rectangle#(frm#)
rectangle_bounds#(ri3#, 360, 180, 100, 80)
rectangle_fill#(ri3#, "Blue")
let fx3# = invert#(ri3#)
let li3# = label#(frm#, "Yellow", 385, 268)

let title# = label#(frm#, "Original vs Inverted", 170, 20)

form_show(frm#)

Best Practices

PracticeWhy
Use trigger for hover inversion"IsMouseOver=true" gives instant visual feedback
Start disabled for toggle patternsinvert_enabled#(fx#, 0) lets user activate on demand
Works on images tooCreates dramatic photographic negative effect on photos
Combine with other effectsInvert + HueAdjust + Contrast for creative colour grading
Use for dark/light mode toggleQuick “inverted” view of interface panels
Remember double-invert = originalInverting twice returns to the exact original
Use label_hittest#(lbl#, 0)Prevents labels from stealing hover events on inverted cards

Quick Reference

FunctionSignatureDescription
ERROR HANDLING
invert_error()invert_error@Last error code
invert_errormsg$()invert_errormsg$@Last error message
invert_strerror$(code)invert_strerror$@nError code to text
invert_clearerror()invert_clearerror@Clear error state
CREATION & DESTRUCTION
invert#(parent#)invert#@#Create invert effect on control
invert_free(effect#)invert_free@#Destroy effect
EFFECT CONTROL
invert_enabled#(e#, val)invert_enabled#@#nEnable (1) / disable (0)
invert_enabled(e#)invert_enabled@#Get enabled state
invert_trigger#(e#, str$)invert_trigger#@#$Set trigger string
invert_trigger$(e#)invert_trigger$@#Get trigger string

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

See Also

  • HueAdjustEffectLib — Shift colours around the colour wheel
  • ContrastEffectLib — Adjust contrast
  • MonochromeEffectLib — Convert to single colour
  • SepiaEffectLib — Sepia tone colouring