[← Home](../README.md) · [Libraries](README.md) # layers.library — Window Clipping and Damage Repair ## Overview `layers.library` provides the clipping and damage-repair infrastructure that Intuition windows are built on. Every window's `RastPort` is backed by a `Layer` that manages overlapping regions, damage tracking, and optional backing-store for obscured content. When you draw to a window, all drawing operations are automatically clipped to the window's visible area by the layer system. You never draw "outside" your window or over another window — layers enforces this transparently. ```mermaid flowchart TD subgraph "Screen BitMap" subgraph "Layer A (front)" LA["Fully visible
ClipRect covers
entire layer"] end subgraph "Layer B (middle)" LB["Partially obscured
by Layer A"] LB1["ClipRect 1
(visible)"] LB2["ClipRect 2
(obscured)"] end subgraph "Layer C (back)" LC["Mostly obscured"] end end DRAW["Draw into Layer B"] --> CLIP["layers.library
clips to visible
ClipRects only"] CLIP --> LB1 style LA fill:#c8e6c9,stroke:#2e7d32,color:#333 style LB fill:#fff9c4,stroke:#f9a825,color:#333 style LC fill:#ffcdd2,stroke:#c62828,color:#333 style CLIP fill:#e8f4fd,stroke:#2196f3,color:#333 ``` --- ## Layer Types | Flag | Type | Backing Store | Damage Handling | Memory Cost | |---|---|---|---|---| | `LAYERSIMPLE` | Simple Refresh | None | App must redraw on `IDCMP_REFRESHWINDOW` | Minimal | | `LAYERSMART` | Smart Refresh | Auto — obscured regions saved/restored | Automatic — OS handles damage | Moderate | | `LAYERSUPER` | Super BitMap | Full off-screen bitmap (app provides) | Full bitmap always valid | High | | `LAYERBACKDROP` | Backdrop | Modifier — behind all normal layers | Depends on refresh type | — | ```mermaid flowchart LR subgraph "Simple Refresh" S1["Window obscured"] --> S2["Damage region
recorded"] S2 --> S3["IDCMP_REFRESHWINDOW
sent to app"] S3 --> S4["App redraws
between Begin/EndRefresh"] end subgraph "Smart Refresh" M1["Window obscured"] --> M2["Obscured area
saved to buffer"] M2 --> M3["Window revealed"] --> M4["OS restores
from buffer"] end style S3 fill:#ffcdd2,stroke:#c62828,color:#333 style M4 fill:#c8e6c9,stroke:#2e7d32,color:#333 ``` --- ## ClipRects — The Clipping Engine Each layer maintains a linked list of **ClipRects** — rectangles that define how each region of the layer should be handled: ```c struct ClipRect { struct ClipRect *Next; /* next in chain */ struct ClipRect *prev; /* previous */ struct Layer *lobs; /* layer that obscures this rect (NULL if visible) */ struct BitMap *BitMap; /* backing store bitmap (Smart Refresh) */ LONG reserved; LONG Flags; struct Rectangle bounds; /* x1,y1,x2,y2 of this rect */ }; ``` When drawing to a partially obscured layer: 1. The drawing call (e.g., `RectFill`) enters `graphics.library` 2. Graphics detects `rp->Layer != NULL` 3. For each **visible ClipRect**, the drawing is performed clipped to that rectangle 4. For **obscured ClipRects** (Smart Refresh), drawing goes to the backing-store bitmap instead 5. The application sees nothing — clipping is fully transparent --- ## Creating Layers Directly While Intuition normally creates layers for windows, you can create them manually for custom display systems: ```c struct Layer_Info *li = NewLayerInfo(); /* Create a layer on top: */ struct Layer *frontLayer = CreateUpfrontLayer(li, screenBitMap, 10, 10, 200, 100, /* bounds: x1, y1, x2, y2 */ LAYERSMART, /* type */ NULL); /* super bitmap (NULL for non-SUPER) */ /* Create behind existing layers: */ struct Layer *backLayer = CreateBehindLayer(li, screenBitMap, 50, 50, 250, 150, LAYERSIMPLE | LAYERBACKDROP, NULL); /* Get the RastPort for drawing: */ struct RastPort *rp = frontLayer->rp; SetAPen(rp, 1); RectFill(rp, 0, 0, 190, 90); /* coordinates relative to layer */ ``` --- ## Layer Operations ### Locking **Always lock a layer before drawing** if other tasks might modify it simultaneously: ```c LockLayer(0, layer); /* ... safe to draw ... */ UnlockLayer(layer); /* Lock ALL layers (for bulk operations): */ LockLayers(layerInfo); UnlockLayers(layerInfo); /* Lock a layer for multiple operations: */ LockLayerInfo(layerInfo); /* ... manipulate layer stack ... */ UnlockLayerInfo(layerInfo); ``` ### Moving and Resizing ```c /* Move layer by delta: */ MoveLayer(0, layer, dx, dy); /* Resize layer by delta: */ SizeLayer(0, layer, dw, dh); /* Move to front/back of stack: */ UpfrontLayer(0, layer); BehindLayer(0, layer); ``` ### Damage and Refresh ```c /* For Simple Refresh windows — handle IDCMP_REFRESHWINDOW: */ BeginRefresh(window); /* ... redraw damaged area only ... */ /* The ClipRect list is temporarily set to damaged regions only */ EndRefresh(window, TRUE); /* TRUE = damage fully repaired */ ``` ### Install Backfill Hook ```c /* Custom backfill instead of default (clear to pen 0): */ struct Hook backfillHook; backfillHook.h_Entry = (HOOKFUNC)MyBackfillFunc; InstallLayerHook(layer, &backfillHook); /* The hook is called whenever a region needs to be filled (e.g., when a window is moved and new area is exposed) */ ``` --- ## Super BitMap Layers Super BitMap layers maintain a full-sized off-screen bitmap that the application owns. The visible portion is blitted to the screen; the rest is always valid in the off-screen buffer: ```c /* Allocate the full bitmap: */ struct BitMap *superBM = AllocBitMap(640, 480, depth, BMF_CLEAR, NULL); /* Create super bitmap layer: */ struct Layer *superLayer = CreateUpfrontLayer(li, screenBitMap, 0, 0, 319, 255, /* visible area on screen */ LAYERSUPER, superBM); /* the full-size bitmap */ /* Scroll the view within the super bitmap: */ ScrollLayer(0, superLayer, dx, dy); /* Sync super bitmap with display after drawing: */ SyncSBitMap(superLayer); /* Copy display back to super bitmap before hiding: */ CopySBitMap(superLayer); ``` --- ## Cleanup ```c /* Remove layers in reverse order: */ DeleteLayer(0, layer); /* Dispose the layer info: */ DisposeLayerInfo(li); /* If using super bitmap, free it after DeleteLayer: */ FreeBitMap(superBM); ``` --- ## References - NDK39: `graphics/layers.h`, `graphics/clip.h`, `graphics/gfx.h` - ADCD 2.1: layers.library autodocs - See also: [rastport.md](../08_graphics/rastport.md) — drawing through layers - See also: [screens.md](../09_intuition/screens.md) — Intuition screen/window layer management