Composite Operations
Composite operations control how new drawings blend with existing canvas content, enabling advanced visual effects like masking, blending, and compositing. The globalCompositeOperation property determines the blending mode for all subsequent drawing operations.
Understanding Compositing
Compositing defines how the pixels of new drawings (source) interact with existing pixels (destination) on the canvas. By default, new drawings are drawn over existing content, but composite operations allow for creative blending effects.
Setting Composite Operations
The globalCompositeOperation property accepts various blend modes:
// Default behavior - new drawings on top
canvas.setGlobalCompositeOperation('source-over');
// Blend mode - multiply colors
canvas.setGlobalCompositeOperation('multiply');
// Reset to default
canvas.setGlobalCompositeOperation('source-over');Porter-Duff Compositing Modes
These fundamental modes control how source and destination pixels combine:
source-over (default)
New drawings appear over existing content.
canvas.setGlobalCompositeOperation('source-over';
// New shapes draw on top of existing contentsource-in
Only the parts of new drawings that overlap existing content are shown.
canvas.setGlobalCompositeOperation('source-in';
// Creates a mask effect - only overlapping areas visiblesource-out
Only the parts of new drawings that don't overlap existing content are shown.
canvas.setGlobalCompositeOperation('source-out';
// Shows new content outside existing shapessource-atop
New drawings appear only where they overlap existing content, but existing content shows through non-overlapping areas.
canvas.setGlobalCompositeOperation('source-atop';
// Combines overlapping areas with existing backgrounddestination-over
Existing content appears over new drawings.
canvas.setGlobalCompositeOperation('destination-over';
// Reverses the default layeringdestination-in
Only existing content that overlaps new drawings is kept.
canvas.setGlobalCompositeOperation('destination-in';
// Masks existing content to new shapesdestination-out
Existing content is erased where it overlaps new drawings.
canvas.setGlobalCompositeOperation('destination-out';
// Creates cutouts in existing contentdestination-atop
Existing content appears only where it overlaps new drawings, with new content showing through elsewhere.
canvas.setGlobalCompositeOperation('destination-atop';
// Complex layering effectlighter
Colors are added together, creating brighter results.
canvas.setGlobalCompositeOperation('lighter';
// Additive blending for glow effectscopy
New drawings replace all existing content.
canvas.setGlobalCompositeOperation('copy';
// Completely overwrites the canvasxor
Pixels are exclusive-or'd - overlapping areas become transparent.
canvas.setGlobalCompositeOperation('xor';
// Creates alternating pattern effectsBlend Modes
These modes perform mathematical operations on color channels:
multiply
Colors are multiplied, creating darker results.
canvas.setGlobalCompositeOperation('multiply';
// Darkens images, good for shadowsscreen
Colors are inverted, multiplied, then inverted again, creating brighter results.
canvas.setGlobalCompositeOperation('screen';
// Lightens images, good for highlightsoverlay
Combines multiply and screen based on destination brightness.
canvas.setGlobalCompositeOperation('overlay';
// Increases contrastdarken
Keeps the darker color of source or destination.
canvas.setGlobalCompositeOperation('darken';
// Creates darker compositelighten
Keeps the lighter color of source or destination.
canvas.setGlobalCompositeOperation('lighten';
// Creates lighter compositecolor-dodge
Brightens destination based on source.
canvas.setGlobalCompositeOperation('color-dodge';
// Dramatic lightening effectcolor-burn
Darkens destination based on source.
canvas.setGlobalCompositeOperation('color-burn';
// Dramatic darkening effecthard-light
Like overlay, but with source and destination swapped.
canvas.setGlobalCompositeOperation('hard-light';
// Strong contrast effectsoft-light
Similar to overlay but softer.
canvas.setGlobalCompositeOperation('soft-light';
// Gentle contrast adjustmentdifference
Subtracts darker color from lighter color.
canvas.setGlobalCompositeOperation('difference';
// Creates high-contrast, inverted effectsexclusion
Similar to difference but lower contrast.
canvas.setGlobalCompositeOperation('exclusion';
// Softer difference effectAdvanced Compositing Techniques
Creating Masks
// Draw mask shape
canvas.setGlobalCompositeOperation('source-over');
canvas.setFillStyle(new Color(0, 0, 0)); // black
canvas.fillRect(50, 50, 100, 100);
// Use as mask
canvas.setGlobalCompositeOperation('source-in');
canvas.drawImage(myImage, 0, 0);Compositing is commonly used with images; see Working with Images.
Patterns can enhance compositing effects; see Working with Patterns.
Erasing with Shapes
// Draw content
canvas.setFillStyle(new Color(0, 0, 255)); // blue
canvas.fillRect(0, 0, 200, 200);
// Erase circular area
canvas.setGlobalCompositeOperation('destination-out');
canvas.beginPath();
canvas.arc(100, 100, 50, 0, Math.PI * 2);
canvas.fill();Layered Effects
// Base layer
canvas.setGlobalCompositeOperation('source-over');
canvas.setFillStyle(new Color(255, 0, 0)); // red
canvas.fillRect(50, 50, 100, 100);
// Multiply layer
canvas.setGlobalCompositeOperation('multiply');
canvas.setFillStyle(new Color(0, 0, 255)); // blue
canvas.fillRect(75, 75, 100, 100);
// Screen layer
canvas.setGlobalCompositeOperation('screen');
canvas.setFillStyle(new Color(255, 255, 0)); // yellow
canvas.fillRect(100, 100, 100, 100);Clipping with Compositing
// Draw clipping shape
canvas.setGlobalCompositeOperation('source-over');
canvas.setFillStyle(new Color(0, 0, 0)); // black
canvas.fillRect(50, 50, 100, 100);
// Clip subsequent drawing
canvas.setGlobalCompositeOperation('source-atop');
canvas.setFillStyle(new Color(0, 128, 0)); // green
canvas.fillRect(0, 0, 200, 200);Composite operations unlock powerful visual effects, enabling everything from simple masking to complex blend modes in your FxCanvas applications.