AG_Surface — agar
    graphics surface
#include <agar/core.h>
#include <agar/gui.h>
 
The AG_Surface structure describes a
    graphics surface in one of:
  - Packed Mode
 
  - 8- or 16-bit RGBA components packed into 8-, 16-, 24-, 32-, 40-, 48- or
      64-bit wide pixels. Components may be packed in any order (RGBA, BGRA,
      etc). The extraction bitmasks and shifts are part of the surface
    format.
 
  - Indexed Mode
 
  - 1-, 2-, 4- or 8-bit per pixel palettized access mode. The minimum pitch is
      1 byte. The palette is part of the surface format.
 
  - Grayscale Mode
 
  - 16- or 32-bit grayscale (with alpha) packed into 32- or 64-bit wide
      pixels. The choice of standard for conversion to RGB is part of the
      surface format.
 
Image transfers (blits) are supported between all modes, and
    should work consistently across surfaces in different formats.
If an alpha channel is defined (or the per-surface
    alpha of the source surface is not
    AG_OPAQUE) then the blit operation performs alpha
    blending. Colorkey is also supported. If the source surface in a blit has a
    colorkey then all pixels matching it will be treated
    as transparent.
Blit operations honor a per-surface clipping rectangle (which
    spans the entire surface by default). In an image transfer, the effective
    block of pixels transferred will be the intersection of the source rectangle
    and the destination surface's clipping rectangle.
Fast cropping can be performed by modifying
    w, h,
    Lpadding and padding and
    incrementing the pixels pointer (leaving the pixel
    data untouched).
Surfaces may also define up to 4 general-purpose 16-bit guides
    (for typography and other application-specific purposes).
AG_Surface *
  
  AG_SurfaceNew(const
    AG_PixelFormat *pf, Uint
    w, Uint h,
    Uint flags);
  
  AG_Surface *
  
  AG_SurfaceEmpty(void);
  
  AG_Surface *
  
  AG_SurfaceIndexed(Uint
    w, Uint h,
    int BitsPerPixel,
    Uint flags);
  
  AG_Surface *
  
  AG_SurfaceGrayscale(Uint
    w, Uint h,
    int BitsPerPixel,
    Uint flags);
  
  AG_Surface *
  
  AG_SurfaceRGB(Uint
    w, Uint h,
    int BitsPerPixel,
    Uint flags,
    Uint32 Rmask,
    Uint32 Gmask,
    Uint32 Bmask);
  
  AG_Surface *
  
  AG_SurfaceRGBA(Uint
    w, Uint h,
    int BitsPerPixel,
    Uint flags,
    Uint32 Rmask,
    Uint32 Gmask,
    Uint32 Bmask,
    Uint32 Amask);
  
  AG_Surface *
  
  AG_SurfaceStdRGB(Uint
    w, Uint h);
  
  AG_Surface *
  
  AG_SurfaceStdRGBA(Uint
    w, Uint h);
  
  AG_Surface *
  
  AG_SurfaceFromPixelsRGB(void
    *pixels, Uint w,
    Uint h,
    int BitsPerPixel,
    Uint32 Rmask,
    Uint32 Gmask,
    Uint32 Bmask);
  
  AG_Surface *
  
  AG_SurfaceFromPixelsRGBA(void
    *pixels, Uint w,
    Uint h,
    int BitsPerPixel,
    Uint32 Rmask,
    Uint32 Gmask,
    Uint32 Bmask,
    Uint32 Amask);
  
  AG_Surface *
  
  AG_SurfaceFromFile(const
    char *path);
  
  AG_Surface *
  
  AG_SurfaceFromPNG(const
    char *path);
  
  AG_Surface *
  
  AG_SurfaceFromJPEG(const
    char *path);
  
  AG_Surface *
  
  AG_SurfaceFromBMP(const
    char *path);
  
  AG_Surface *
  
  AG_ReadSurface(AG_DataSource
    *ds);
  
  AG_Surface *
  
  AG_ReadSurfaceFromPNG(AG_DataSource
    *ds);
  
  AG_Surface *
  
  AG_ReadSurfaceFromJPEG(AG_DataSource
    *ds);
  
  AG_Surface *
  
  AG_ReadSurfaceFromBMP(AG_DataSource
    *ds);
  
  int
  
  AG_WriteSurface(AG_DataSource
    *ds, AG_Surface
    *surface);
  
  AG_Surface *
  
  AG_SurfaceFromSDL(SDL_Surface
    *surface);
  
  void
  
  AG_SurfaceSetAddress(AG_Surface
    *surface, Uint8
    *p);
  
  void
  
  AG_SurfaceSetColors(AG_Surface
    *surface, AG_Color
    *colors, Uint offs,
    Uint count);
  
  void
  
  AG_SurfaceSetPalette(AG_Surface
    *surface, const
    AG_Palette *palette);
  
  int
  
  AG_SurfaceResize(AG_Surface
    *surface, Uint w,
    Uint h);
  
  void
  
  AG_SurfaceFree(AG_Surface
    *surface);
AG_SurfaceNew()
    allocates and initializes a new graphics surface of size
    w, h in pixels. The
    pf argument is the
    AG_PixelFormat describing the type of surface (Packed
    / Palettized / Grayscale), and the way pixels are to be encoded in memory
    (see PIXEL FORMATS). If
    pf is NULL, the format field is
    left uninitialized (the caller can later use
    AG_PixelFormat*()
    to initialize it). If the global variable agSurfaceFmt
    is passed as format then the "best"
    available mode (the one closest to the native display) will be selected.
    Acceptable values for type include:
  - AG_SURFACE_PACKED
 
  - 8- or 16-bit RGBA components packed into 8-, 16-, 24-, 32-, 40-, 48- or
      64-bit wide pixels.
 
  - AG_SURFACE_INDEXED
 
  - 1-, 2-, 4- or 8-bit per pixel palettized mode.
 
  - AG_SURFACE_GRAYSCALE
 
  - 16- or 32-bit grayscale with alpha packed into 32- or 64-bit wide
    pixels.
 
Acceptable flags include:
  - AG_SURFACE_COLORKEY
 
  - Enable colorkeying. In
      
AG_SurfaceBlit(),
      inhibit the copy of all pixels matching the source surface's colorkey.
      AG_SurfaceSetColorKey()
      controls this flag. 
  - AG_SURFACE_GL_TEXTURE
 
  - Surface can be uploaded as an OpenGL texture directly (without the need
      for conversion). This flag is set automatically if the depth and RGBA
      masks are compatible. See
      AG_GL_UploadTexture(3),
      AG_GL_UpdateTexture(3).
 
  - AG_SURFACE_MAPPED
 
  - Surface is attached to an
      AG_Widget(3).
      Calls to
      AG_SurfaceFree(3)
      will result in a fatal assertion (Debug mode only).
 
The
    AG_SurfaceEmpty()
    function creates a new 0x0 pixel surface. Blitting such an empty surface is
    a no-op.
AG_SurfaceIndexed()
    creates a new surface of w by h
    pixels using an indexed pixel format with palette. The size of this palette
    is determined by BitsPerPixel. The palette is
    initialized to a standard palette for 1/2/4-bpp modes. For 8-bpp mode, the
    initial palette is left uninitialized.
AG_SurfaceGrayscale()
    creates a new surface of w by h
    pixels in a grayscale format with alpha channel.
AG_SurfaceRGB()
    and AG_SurfaceRGBA() creates a new surface of
    w by h pixels using the
    specified packed-pixel format. In memory, pixels are encoded as contiguous
    blocks of BitsPerPixel bits, and the bitmasks
    specified in [RGB]mask are used to retrieve the
    individual 8-bit red, green, blue and alpha components.
AG_SurfaceStdRGB()
    and AG_SurfaceStdRGBA() create a new packed-pixel
    surface in the "best" format for blitting directly to the display
    (for framebuffer based drivers) or for transferring to a texture unit (for
    OpenGL based drivers).
AG_SurfaceFromPixelsRGB()
    and AG_SurfaceFromPixelsRGBA() create and initialize
    a new surface by copying existing pixel data in the given format.
The
    AG_SurfaceFromFile()
    routine loads the contents of an image file into a newly-allocated surface.
    The image format is auto-detected. The
    AG_SurfaceFrom{BMP,PNG,JPEG}()
    variants will load an image only in the specified format.
The
    AG_ReadSurface()
    function reads an uncompressed surface (in native
    AG_Surface encoding). The
    AG_ReadSurfaceFrom{BMP,PNG,JPEG}()
    variants will load an image only in the specified format.
The
    AG_WriteSurface()
    function saves the surface to the specified data source in native
    AG_Surface encoding.
The
    AG_SurfaceFromSDL()
    function converts a
    SDL_Surface(3)
    to a newly-allocated AG_Surface structure. This
    function is available only if Agar was compiled with SDL support.
AG_SurfaceSetAddress()
    sets the pixel data pointer of the surface to an external address. If
    p is NULL then revert to internally auto-allocated
    pixel data.
AG_SurfaceSetColors()
    sets contiguous entries in the colormap of a palettized surface from a given
    array of
    AG_Color(3).
AG_SurfaceSetPalette()
    sets the entire colormap of a palettized surface from the given
    AG_Palette.
AG_SurfaceResize()
    attempts to resize a surface to the specified dimensions. If insufficient
    memory is available, the function fails returning -1. When size is
    increased, the new pixels are left in an uninitialized state. The surface's
    current clipping rectangle is overwritten by a rectangle covering the entire
    surface.
The
    AG_SurfaceFree()
    function releases all resources allocated by the given surface.
void
  
  AG_FillRect(AG_Surface
    *s, const AG_Rect
    *r, const AG_Color
    *c);
  
  void
  
  AG_SurfaceBlit(const
    AG_Surface *src, const
    AG_Rect *rSrc, AG_Surface
    *dst, int x,
    int y);
  
  void
  
  AG_SetClipRect(AG_Surface
    *s, const AG_Rect
    *r);
  
  void
  
  AG_GetClipRect(const
    AG_Surface *s, AG_Rect
    *r);
  
  int
  
  AG_SurfaceClipped(const
    AG_Surface *s, int
    x, int y);
  
  void
  
  AG_SurfaceCopy(AG_Surface
    *dest, const AG_Surface
    *src);
  
  AG_Surface *
  
  AG_SurfaceDup(const
    AG_Surface *src);
  
  AG_Surface *
  
  AG_SurfaceConvert(const
    AG_Surface *src, const
    AG_PixelFormat *newFmt);
  
  AG_Surface *
  
  AG_SurfaceScale(const
    AG_Surface *src, Uint
    w, Uint h,
    Uint flags);
  
  int
  
  AG_SurfaceExportFile(const
    AG_Surface *su, char
    *path);
  
  int
  
  AG_SurfaceExportPNG(const
    AG_Surface *su, char
    *path, Uint
  flags);
  
  int
  
  AG_SurfaceExportJPEG(const
    AG_Surface *su, char
    *path, Uint
    quality, Uint
    flags);
  
  int
  
  AG_SurfaceExportBMP(const
    AG_Surface *su, char
    *path);
  
  SDL_Surface *
  
  AG_SurfaceExportSDL(const
    AG_Surface *su);
The
    AG_FillRect()
    routine fills the rectangle r (or rather the
    intersection of r with the surface's clipping
    rectangle) against a color c.
    AG_FillRect() does not perform alpha blending and
    the alpha component of target pixels (when surface has an alpha channel) are
    replaced by that of c.
AG_SurfaceBlit()
    performs an image transfer from one surface (or rectangular region of pixels
    in a surface) to coordinates x,
    y in surface dst. Honors the
    target surface's clipping rectangle. If a colorkey is set, matching
    transparent pixels are skipped. If the source surface has an alpha channel
    then blend the source pixel against the destination (if destination surface
    has an alpha channel, sum the alpha of both pixels and clamp to maximum
    opacity).
AG_SetClipRect()
    sets the clipping rectangle of surface s. The default
    clipping rectangle is (0, 0, s->w, s->h). The clipping rectangle is
    used by operations such as AG_SurfaceBlit() and
    AG_FillRect(), but it is ignored by functions which
    accept
    unchecked
    coordinates, such as AG_SurfaceGet() or
    AG_SurfacePut().
The
    AG_SurfaceClipped()
    test returns 1 if the pixel at x,
    y should be clipped away according to the clipping
    rectangle of s, otherwise it returns 0.
AG_GetClipRect()
    returns the current clipping rectangle of s.
AG_SurfaceCopy()
    copies the contents of surface src onto another,
    existing surface dst. Colorkey and alpha parameters
    are ignored. Pixel data is block copied (if the formats allow it), simply
    copied, or otherwise converted if the formats differ. If the two surfaces
    have different sizes then padding and/or clipping is done.
AG_SurfaceDup()
    returns a newly allocated surface containing a copy of
    src.
AG_SurfaceConvert()
    returns a newly allocated copy of the surface, but in the given format
    pf. Conversion is performed if the pixel formats
    differ.
AG_SurfaceScale()
    returns a copy of the surface src scaled to
    w by h pixels (or NULL if an
    error occurred). The flags argument is for future
    expansion and should be set to 0.
The
    AG_SurfaceExportFile()
    routine exports a surface to a specified image file. The image format will
    be determined by the filename extension in path.
AG_SurfaceExportPNG()
    exports a surface to a PNG image file, preserving any transparency data.
    Available flags options include:
  - AG_EXPORT_PNG_ADAM7
 
  - Enable Adam7 interlacing.
 
AG_SurfaceExportJPEG()
    exports the surface to a file in JPEG format. If the surface has an
    alpha-channel, it is ignored. quality is given in
    percent (100% = best). Available flags options
    include:
  - AG_EXPORT_JPEG_JDCT_ISLOW
 
  - Slow, but accurate integer DCT method.
 
  - AG_EXPORT_JPEG_JDCT_IFAST
 
  - Fast, but less accurate integer DCT method.
 
  - AG_EXPORT_JPEG_JDCT_FLOAT
 
  - Floating-point DCT method.
 
AG_SurfaceExportBMP()
    exports a BMP image file from the contents of a surface. If the surface has
    an alpha-channel, it is ignored.
AG_SurfaceExportSDL()
    exports an Agar surface to a newly allocated
    SDL_Surface structure for SDL 1.x. Inherit per-surface
    alpha and colorkey. This function is available only if Agar was compiled
    with SDL1 support.
The AG_PixelFormat structure describes how
    pixels are encoded in memory:
/*                     Bits/Pixel
 *      Mode | 1 2 4 8 16 24 32 40 48 64 |
 *     ----- |---------------------------|
 *    PACKED |         M  M  M  L  L  L  |
 *   INDEXED | M M M M                   |
 * GRAYSCALE |         M  M  M        L  |
 */
typedef enum ag_surface_mode {
	AG_SURFACE_PACKED,
	AG_SURFACE_INDEXED,
	AG_SURFACE_GRAYSCALE
} AG_SurfaceMode;
typedef struct ag_pixel_format {
	AG_SurfaceMode mode;     /* Image type */
	int BitsPerPixel;        /* Depth (in bits/pixel) */
	int BytesPerPixel;       /* Depth (in bytes/pixel) */
	int PixelsPerByteShift;  /* Shift to divide by pixels/byte */
	union {
		AG_Palette *palette;       /* Colormap for Indexed */
		AG_GrayscaleMode graymode; /* Grayscale-RGB method */
		struct {
			/*
			 * Number of bits lost by packing each component
			 * into our native representation.
			 */
			Uint8 Rloss, Gloss, Bloss, Aloss;
			/*
			 * Number of bits at the right of each component.
			 */
			Uint8 Rshift, Gshift, Bshift, Ashift;
			/*
			 * Pixel-wide mask over each component.
			 */
			AG_Pixel Rmask, Gmask, Bmask, Amask;
		};
	};
} AG_PixelFormat;
 
int
AG_PixelFormatIsSupported(AG_SurfaceMode
  mode, int
  BitsPerPixel);
  
  AG_Pixel
  
  AG_PixelFormatMaximum(const
    AG_PixelFormat *pf);
  
  void
  
  AG_PixelFormatRGB(AG_PixelFormat
    *pf, int
    BitsPerPixel, AG_Pixel
    Rmask, AG_Pixel
    Gmask, AG_Pixel
    Bmask);
  
  void
  
  AG_PixelFormatRGBA(AG_PixelFormat
    *pf, int
    BitsPerPixel, AG_Pixel
    Rmask, AG_Pixel
    Gmask, AG_Pixel
    Bmask, AG_Pixel
    Amask);
  
  void
  
  AG_PixelFormatIndexed(AG_PixelFormat
    *pf);, int BitsPerPixel
  
  void
  
  AG_PixelFormatGrayscale(AG_PixelFormat
    *pf, int
    BitsPerPixel);
  
  int
  
  AG_PixelFormatCompare(const
    AG_PixelFormat *pf1,
    const AG_PixelFormat
    *pf2);
  
  void
  
  AG_PixelFormatFree(AG_PixelFormat
    *format);
The
    AG_PixelFormatIsSupported()
    function returns 1 if the given combination of encoding and bits per pixel
    is supported by the present Agar build.
The
    AG_PixelFormatMaximum()
    function returns the maximum pixel value representible by surfaces in the
    given format pf.
The
    AG_PixelFormatRGB()
    and AG_PixelFormatRGBA() routines initialize an
    AG_PixelFormat structure describing a surface in
    packed-pixel
    format of depth BitsPerPixel. The arguments
    [RGBA]mask specify the bitmasks used to extract
    individual color components (and alpha) from the surface in memory.
The
    AG_PixelFormatIndexed()
    routine initializes an AG_PixelFormat structure
    describing a surface in
    indexed
    format. Agar considers the palette to be part of the
    AG_PixelFormat structure so the palette itself is
    allocated as well. The size of this palette is determined by
    BitsPerPixel and palette entries are initialized to
    black (except in the 1bpp case, where entry 0 is also initialized to
  white).
The
    AG_PixelFormatGrayscale()
    routine initializes an AG_PixelFormat structure
    describing a surface in
    grayscale
    format. Supported depths are 16-, 32- and 64-bpp. The grayscale format also
    includes an alpha channel which can be ignored if transparency is not
    needed. The global agGrayscaleMode determines the
    default conversion standard to use when converting between grayscale and
    RGB. The default is AG_GRAYSCALE_BT709.
AG_PixelFormatCompare()
    compares two pixel formats. The function returns 0 if the two formats are
    identical, nonzero if the two formats differ. When comparing color-index
    formats, the two palettes are compared as well.
AG_PixelFormatFree()
    frees all resources allocated by an
  AG_PixelFormat.
AG_Pixel
  
  AG_SurfaceGet(const
    AG_Surface *s, int
    x, int y);
  
  Uint8
  
  AG_SurfaceGet8(const
    AG_Surface *s, int
    x, int y);
  
  Uint32
  
  AG_SurfaceGet32(const
    AG_Surface *s, int
    x, int y);
  
  Uint64
  
  AG_SurfaceGet64(const
    AG_Surface *s, int
    x, int y);
  
  AG_Pixel
  
  AG_SurfaceGet_At(const
    AG_Surface *s, Uint8
    *p);
  
  Uint32
  
  AG_SurfaceGet32_At(const
    AG_Surface *s, const
    Uint8 *p);
  
  Uint64
  
  AG_SurfaceGet64_At(const
    AG_Surface *s, const
    Uint8 *p);
  
  void
  
  AG_SurfacePut(AG_Surface
    *s, int x,
    int y,
    AG_Pixel px);
  
  void
  
  AG_SurfacePut8(AG_Surface
    *s, int x,
    int y,
    Uint8 px);
  
  void
  
  AG_SurfacePut32(AG_Surface
    *s, int x,
    int y,
    Uint32 px);
  
  void
  
  AG_SurfacePut64(AG_Surface
    *s, int x,
    int y,
    Uint64 px);
  
  void
  
  AG_SurfacePut_At(AG_Surface
    *s, Uint8 *p,
    AG_Pixel px);
  
  void
  
  AG_SurfacePut32_At(AG_Surface
    *s, Uint8 *p,
    Uint32 px);
  
  void
  
  AG_SurfacePut64_At(AG_Surface
    *s, Uint8 *p,
    Uint64 px);
  
  void
  
  AG_SurfaceBlend(AG_Surface
    *s, int x,
    int y,
    const AG_Color *c);
  
  void
  
  AG_SurfaceBlend_At(AG_Surface
    *s, Uint8 *p,
    const AG_Color *c);
  
  void
  
  AG_SurfaceBlendRGB8(AG_Surface
    *s, int x,
    int y,
    Uint8 r,
    Uint8 g,
    Uint8 b,
    Uint8 a);
  
  void
  
  AG_SurfaceBlendRGB8_At(AG_Surface
    *s, Uint8 *p,
    Uint8 r,
    Uint8 g,
    Uint8 b,
    Uint8 a);
  
  void
  
  AG_SurfaceBlendRGB16(AG_Surface
    *s, int x,
    int y,
    Uint16 r,
    Uint16 g,
    Uint16 b,
    Uint16 a);
  
  void
  
  AG_SurfaceBlendRGB16_At(AG_Surface
    *s, Uint8 *p,
    Uint16 r,
    Uint16 g,
    Uint16 b,
    Uint16 a);
  
  void
  
  AG_GetColor(AG_Color
    *dst, AG_Pixel px,
    const AG_PixelFormat
    *pf);
  
  void
  
  AG_GetColor32(AG_Color
    *dst, Uint32 px,
    const AG_PixelFormat
    *pf);
  
  void
  
  AG_GetColor64(AG_Color
    *dst, Uint64 px,
    const AG_PixelFormat
    *pf);
  
  void
  
  AG_GetColor_RGB8(AG_Pixel
    px, const AG_PixelFormat
    *pf, Uint8 *r,
    Uint8 *g,
    Uint8 *b,
    Uint8 *a);
  
  void
  
  AG_GetColor_RGB16(AG_Pixel
    px, const AG_PixelFormat
    *pf, Uint16 *r,
    Uint16 *g,
    Uint16 *b,
    Uint16 *a);
  
  void
  
  AG_GetColor32_RGB8(Uint32
    px, const AG_PixelFormat
    *pf, Uint8 *r,
    Uint8 *g,
    Uint8 *b,
    Uint8 *a);
  
  void
  
  AG_GetColor32_RGB16(Uint32
    px, const AG_PixelFormat
    *pf, Uint16 *r,
    Uint16 *g,
    Uint16 *b,
    Uint16 *a);
  
  void
  
  AG_GetColor64_RGB8(Uint64
    px, const AG_PixelFormat
    *pf, Uint8 *r,
    Uint8 *g,
    Uint8 *b,
    Uint8 *a);
  
  void
  
  AG_GetColor64_RGB16(Uint64
    px, const AG_PixelFormat
    *pf, Uint16 *r,
    Uint16 *g,
    Uint16 *b,
    Uint16 *a);
  
  AG_Pixel
  
  AG_MapPixel(const
    AG_PixelFormat *pf, const
    AG_Color *c);
  
  Uint32
  
  AG_MapPixel32(const
    AG_PixelFormat *pf, const
    AG_Color *c);
  
  Uint64
  
  AG_MapPixel64(const
    AG_PixelFormat *pf, const
    AG_Color *c);
  
  AG_Pixel
  
  AG_MapPixel_RGB8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b);
  
  AG_Pixel
  
  AG_MapPixel_RGB8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b,
    Uint8 a);
  
  AG_Pixel
  
  AG_MapPixel_RGB16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b);
  
  AG_Pixel
  
  AG_MapPixel_RGBA16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b,
    Uint16 a);
  
  Uint32
  
  AG_MapPixel32_RGB8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b);
  
  Uint32
  
  AG_MapPixel32_RGBA8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b,
    Uint8 a);
  
  Uint32
  
  AG_MapPixel32_RGB16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b);
  
  Uint32
  
  AG_MapPixel32_RGBA16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b,
    Uint16 a);
  
  Uint64
  
  AG_MapPixel64_RGB8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b);
  
  Uint64
  
  AG_MapPixel64_RGBA8(const
    AG_PixelFormat *pf, Uint8
    r, Uint8 g,
    Uint8 b,
    Uint8 a);
  
  Uint64
  
  AG_MapPixel64_RGB16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b);
  
  Uint64
  
  AG_MapPixel64_RGBA16(const
    AG_PixelFormat *pf,
    Uint16 r,
    Uint16 g,
    Uint16 b,
    Uint16 a);
AG_SurfaceGet8()
    returns the value (color index) of the pixel at unchecked coordinates
    x, y in an 1- to 8-bpp indexed
    surface s.
AG_SurfaceGet32()
    returns a 32-bit representation of the pixel at unchecked coordinates
    x, y in a 1- to 64-bpp surface
    s. If the given surface is more than 32-bpp,
    AG_SurfaceGet32() returns a compressed 32-bit
    approximation. The AG_SurfaceGet32_At() form returns
    a 32-bit representation of the pixel at address p in
    an 8- to 64-bpp surface s.
AG_SurfaceGet64()
    returns a 64-bit representation of the pixel at unchecked coordinates
    x, y in an 1- to 64-bpp surface
    s. The AG_SurfaceGet64_At()
    form returns a 64-bit representation of the pixel at address
    p in an 8- to 64-bpp surface
  s.
The
    AG_SurfacePut8()
    procedure writes to the pixel at x,
    y in a 1- to 8-bpp indexed surface
    s.
AG_SurfacePut32()
    writes to the pixel at unchecked coordinates x,
    y in a 1- to 64- surface s. If
    the given surface is more than 32-bpp,
    AG_SurfacePut32() writes a decompressed value. The
    AG_SurfacePut32_At() form writes to the pixel at
    address p in an 8- to 64-bpp surface
    s.
AG_SurfacePut64()
    writes to the pixel at unchecked coordinates x,
    y in a 1- to 64-bpp surface s.
    The AG_SurfacePut64_At() form writes to the pixel at
    address p in an 8- to 64-bpp surface
    s.
The
    AG_SurfaceBlend()
    routine blends the color c against the pixel at
    unchecked coordinates x, y in a
    surface s.
The
    AG_SurfaceBlend_At()
    variant performs alpha blending of a color c against
    the pixel at byte address p in surface
    s.
The
    AG_SurfaceBlendRGB{8,16}()
    and
    AG_SurfaceBlendRGB{8,16}_At()
    forms accept discrete 8- and 16-bit components instead of an
    AG_Color(3).
AG_GetColor32()
    extracts RGBA components from a 32-bit pixel in specified format and returns
    the corresponding
    AG_Color(3)
    into dst. The procedural forms
    AG_GetColor32_RGB{8,16}(),
    return the color components into separate arguments.
AG_GetColor64()
    extracts RGBA components from a 64-bit pixel in specified format and returns
    the corresponding
    AG_Color(3).
    The procedural forms
    AG_GetColor64_RGB{8,16}()
    return the color components into separate arguments.
AG_MapPixel32()
    returns a 32-bit representation of the color c. The
    AG_MapPixel32_RGB{8,16}()
    forms accept individual components as separate arguments.
AG_MapPixel64()
    returns a 64-bit representation of the color c. The
    AG_MapPixel64_RGB{8,16}()
    forms accept individual components as separate arguments.
For the AG_Surface structure:
  - AG_PixelFormat format
 
  - Pixel encoding format (see PIXEL
      FORMATS).
 
  - Uint flags
 
  - Option flags (see
      INITIALIZATION).
 
  - Uint w, h
 
  - Dimensions of the surface in pixels.
 
  - Uint8 *pixelsBase
 
  - Base address of pixel data (read-only; modifiable by calling
      
AG_SurfaceSetAddress()). 
  - Uint8 *pixels
 
  - Current pointer to pixel data. Can be incremented in order to crop lines
      off the top.
 
  - Uint pitch
 
  - Total size of a scanline in bytes.
 
  - Uint padding
 
  - Scanline end padding in bytes. Increment (and also decrement
      w) to crop lines off the right. Used to align rows
      to a 32- or 64-bit boundary.
 
  - Uint Lpadding
 
  - Scanline start padding in bytes. Increment (and also decrement
      w) to crop lines off the left.
 
  - AG_Rect clipRect
 
  - Clipping rectangle (default = whole surface).
 
  - AG_Pixel colorkey
 
  - Transparency color key (for
    
AG_SURFACE_COLORKEY). 
  - Uint alpha
 
  - Per-surface alpha (overall; AG_Component
    value).
 
The AG_Surface structure first appeared in
    Agar 1.3.3. It was first modeled after the SDL_Surface
    of SDL. Agar 1.6.0 added support for 48- and 64-bit Packed, 32- and 64-bit
    Grayscale and Indexed modes. It also introduced the
    AG_SurfaceSetAddress(),
    AG_SurfaceSetColors() and
    AG_SurfaceSetPalette() routines. Agar 1.7.0 added
    support for 40-bit color, optimized blitters, optimized rectangle fills and
    fast cropping. The pixelsBase pointer, the
    Lpadding member as well as the ability to modify the
    pixels pointer appeared in Agar 1.7.0.