This file describes possible customizations of the libxmi library.  Please
read the file README first; it describes what libxmi does.

1. If desired, modify the default definition of `miPixel' in ./xmi.h by
   defining the MI_PIXEL_TYPE preprocessor symbol at compile time.  Each
   point in a miPaintedSet is painted with a miPixel, but what a miPixel
   is, is up to you.  By default it is an `unsigned int', but it could be
   another integer type, a floating point type, a structure, a union...
   That would be arranged by defining MI_PIXEL_TYPE.  If MI_PIXEL_TYPE is a
   structure or a union, the macro MI_SAME_PIXEL(), which tests two
   miPixels for equality, should be redefined too.

2. If desired, define the macro MI_DEFAULT_MERGE2_PIXEL() also.  As
   explained in ./xmi.h, by default, miCopyPaintedSetToCanvas() uses the
   Painter's Algorithm (a source pixel replaces a destination pixel).  That
   may be altered programatically by invoking miSetPixelMerge2().  But at
   installation time, the default behavior may be altered too, by defining
   the macro MI_DEFAULT_MERGE2_PIXEL(new, source, dest).  For example, if
   the miPixel datatype is defined to include an alpha component as well as
   color components, a change would be called for.

3. The same, for the macro MI_DEFAULT_MERGE3_PIXEL().  This macro is used
   when a "texture" pixel is available as part of a miCanvas, and must be
   taken into account, besides the source pixel and the destination pixel
   already on the miCanvas.

4. If desired, customize the definition of the `drawable' contained within
   an miCanvas by defining the symbol MI_CANVAS_DRAWABLE_TYPE.  If this is
   not defined, the drawable will be an miPixmap.  If you define
   MI_CANVAS_DRAWABLE_TYPE, you will also need to define the accessor
   macros MI_GET_CANVAS_DRAWABLE_PIXEL(pCanvas, x, y, pixel) and
   MI_SET_CANVAS_DRAWABLE_PIXEL(pCanvas, x, y, pixel).  The macro
   MI_GET_CANVAS_DRAWABLE_BOUNDS(pCanvas, xleft, ytop, xright, ybottom)
   should be defined too.  See ./xmi.h.


Actually, if you are interested only in the first stage of the graphics
pipeline, i.e., the painting of pixels in a miPaintedSet by the eight
drawing functions in the core API, only modification #1 above is relevant.
A miPaintedSet is an opaque object, but by looking at the function
miCopyPaintedSetToCanvas() in the file mi_canvas.c, you should be able to
see how it is laid out.  It would be trivial to write your own function
that copies pixels out of a miPaintedSet, i.e., to rewrite the second stage
of the graphics pipeline from scratch in a completely customized way.
