56 lines
2.5 KiB
C
56 lines
2.5 KiB
C
// dvx_comp.h -- Layer 3: Dirty rectangle compositor for DVX GUI
|
|
//
|
|
// The compositor tracks which screen regions have changed and ensures
|
|
// only those regions are redrawn and flushed to video memory. This is
|
|
// the key to acceptable frame rates on 486/Pentium hardware -- a full
|
|
// 640x480x32bpp frame is 1.2 MB, but a typical dirty region during
|
|
// normal interaction (e.g. typing in a text field) might be a few KB.
|
|
//
|
|
// The compositing pipeline each frame:
|
|
// 1. Layers above (WM, app) call dirtyListAdd() for changed regions
|
|
// 2. dirtyListMerge() consolidates overlapping/adjacent rects
|
|
// 3. For each merged dirty rect, the compositor clips and redraws
|
|
// the desktop, then each window (back-to-front, painter's algorithm)
|
|
// 4. flushRect() copies each dirty rect from backBuf to the LFB
|
|
//
|
|
// The merge step is important because many small dirty rects (e.g. from
|
|
// a window drag) often cluster together, and flushing one large rect is
|
|
// much faster than many small ones due to reduced per-rect overhead and
|
|
// better memory bus utilization.
|
|
#ifndef DVX_COMP_H
|
|
#define DVX_COMP_H
|
|
|
|
#include "dvxTypes.h"
|
|
|
|
// Zero the dirty rect count. Called at the start of each frame.
|
|
void dirtyListInit(DirtyListT *dl);
|
|
|
|
// Enqueue a dirty rectangle. If the list is full (MAX_DIRTY_RECTS),
|
|
// this should degrade gracefully (e.g. expand an existing rect).
|
|
void dirtyListAdd(DirtyListT *dl, int32_t x, int32_t y, int32_t w, int32_t h);
|
|
|
|
// Consolidate the dirty list by merging overlapping and adjacent rects.
|
|
// Uses an iterative pairwise merge: for each pair of rects, if merging
|
|
// them doesn't increase the total area by more than a threshold, they're
|
|
// combined. This reduces the number of compositor passes and LFB flush
|
|
// operations at the cost of potentially redrawing some clean pixels.
|
|
void dirtyListMerge(DirtyListT *dl);
|
|
|
|
// Reset the dirty list to empty.
|
|
void dirtyListClear(DirtyListT *dl);
|
|
|
|
// Copy a rectangle from the system RAM backbuffer to the LFB (video memory).
|
|
// This is the final step -- the only place where the real framebuffer is
|
|
// written. Uses platform-specific fast copy (rep movsd on DOS) for each
|
|
// scanline of the rect.
|
|
void flushRect(DisplayT *d, const RectT *r);
|
|
|
|
// Compute the intersection of two rectangles. Returns true if they overlap,
|
|
// with the intersection written to result. Used extensively during
|
|
// compositing to clip window content to dirty regions.
|
|
bool rectIntersect(const RectT *a, const RectT *b, RectT *result);
|
|
|
|
// Returns true if the rectangle has zero or negative area.
|
|
bool rectIsEmpty(const RectT *r);
|
|
|
|
#endif // DVX_COMP_H
|