/* ---------------------------------------------------------------------------- * Double buffering code * ---------------------------------------------------------------------------- */ #include #include #define DBL_MAX_SURFACES 2 #define DBL_MIN_PLANES 2 #define DBL_MAX_PLANES 6 #define DBL_MAX_COLORS (1 << (DBL_MAX_PLANES >> 1)) typedef struct _surface { int mask; /* mask to use this surface */ int offset; /* offset within colormap */ int num_colors; /* number of colors in color array */ XColor color[1]; /* the actual color array */ } Surface; typedef struct _doublebuffer { Display *display; /* X display for windows and pixmaps */ Screen *screen; /* X screen */ Window window; /* X window for this double buffer */ int width; /* width of window */ int height; /* height of window */ Pixmap frame; /* pixmap for frame buffer */ Pixmap backing; /* pixmap for backing store */ Drawable drawable; /* copy of window/pixmap we draw in */ GC gc; /* GC used to draw the drawable */ Visual *visual; /* X visual */ Colormap colormap; /* X colormap identifier */ int depth; /* depth of screen in planes */ int num_planes; /* number of planes used */ /* surface information is used to do double buffering */ int num_surfaces; int current_surface; Surface *surface[DBL_MAX_SURFACES]; /* we need to remember which pixels and planes we allocated */ int mask; unsigned long pixels[DBL_MAX_COLORS]; unsigned long planes[DBL_MAX_PLANES]; /* the pixel values one should use when drawing to the viewports */ int num_colors; int colors[DBL_MAX_COLORS]; } DoubleBuffer; void DBLend_frame(DoubleBuffer *db, short init); void DBLbegin_frame (DoubleBuffer *db); void DBLdelete_double_buffer(DoubleBuffer *db); unsigned long DBLinq_background(DoubleBuffer *db); DoubleBuffer * DBLcreate_double_buffer (Display *display, Window window, int backing_store, XColor *colors, int num_colors);