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.
| Category | Count | Description |
|---|---|---|
| Error Handling | 4 | invert_error, errormsg$, strerror$, clearerror |
| Creation & Destruction | 2 | invert# (create), invert_free (destroy) |
| Effect Control | 4 | enabled, 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.
| Original | Inverted | Formula |
|---|---|---|
| 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
| Platform | Status |
|---|---|
| Windows | ✅ Full Support |
| Linux | ✅ Full Support |
| Android | ✅ Full Support |
Error Handling
| Function | Signature | Description |
|---|---|---|
invert_error() | invert_error@ | Returns last error code (0 = no error) |
invert_errormsg$() | invert_errormsg$@ | Returns last error message |
invert_strerror$(code) | invert_strerror$@n | Converts error code to text |
invert_clearerror() | invert_clearerror@ | Clears error state |
Creation & Destruction
| Function | Signature | Description |
|---|---|---|
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
| Function | Signature | Description |
|---|---|---|
invert_enabled#(effect#, value) | invert_enabled#@#n | Enables (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
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
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
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
| Practice | Why |
|---|---|
| Use trigger for hover inversion | "IsMouseOver=true" gives instant visual feedback |
| Start disabled for toggle patterns | invert_enabled#(fx#, 0) lets user activate on demand |
| Works on images too | Creates dramatic photographic negative effect on photos |
| Combine with other effects | Invert + HueAdjust + Contrast for creative colour grading |
| Use for dark/light mode toggle | Quick “inverted” view of interface panels |
| Remember double-invert = original | Inverting twice returns to the exact original |
Use label_hittest#(lbl#, 0) | Prevents labels from stealing hover events on inverted cards |
Quick Reference
| Function | Signature | Description |
|---|---|---|
| ERROR HANDLING | ||
invert_error() | invert_error@ | Last error code |
invert_errormsg$() | invert_errormsg$@ | Last error message |
invert_strerror$(code) | invert_strerror$@n | Error 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#@#n | Enable (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
