DVX_GUI/dvx/dvxComp.h

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