/*************************************************************************** * * graph.h * * Graphics Subsystem interface * * Copyright 1999, 2000, 2001, 2002 * - The FreeType Development Team - www.freetype.org * ***************************************************************************/ #ifndef GRAPH_H #define GRAPH_H #include "grevents.h" /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /******** ********/ /******** GENERAL DEFINITIONS AND BLITTING ROUTINES ********/ /******** ********/ /******** ********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* define the global error variable */ extern int grError; /* initialisation */ extern int grInit( void ); /* finalisation */ extern void grDone( void ); /* pixel mode constants */ typedef enum grPixelMode { gr_pixel_mode_none = 0, gr_pixel_mode_mono, /* monochrome bitmaps */ gr_pixel_mode_pal4, /* 4-bit paletted - 16 colors */ gr_pixel_mode_pal8, /* 8-bit paletted - 256 colors */ gr_pixel_mode_gray, /* 8-bit gray levels */ gr_pixel_mode_rgb555, /* 15-bits mode - 32768 colors */ gr_pixel_mode_rgb565, /* 16-bits mode - 65536 colors */ gr_pixel_mode_rgb24, /* 24-bits mode - 16 million colors */ gr_pixel_mode_rgb32, /* 32-bits mode - 16 million colors */ gr_pixel_mode_lcd, /* horizontal RGB-decimated */ gr_pixel_mode_lcdv, /* vertical RGB-decimated */ gr_pixel_mode_lcd2, /* horizontal BGR-decimated */ gr_pixel_mode_lcdv2, /* vertical BGR-decimated */ gr_pixel_mode_max /* don't remove */ } grPixelMode; /* forward declaration of the surface class */ typedef struct grSurface_ grSurface; /********************************************************************* * * * grBitmap * * * a simple bitmap descriptor * * * rows :: height in pixels * width :: width in pixels * pitch :: + or - the number of bytes per row * mode :: pixel mode of bitmap buffer * grays :: number of grays in palette for PAL8 mode. 0 otherwise * buffer :: pointer to pixel buffer * * * the 'pitch' is positive for downward flows, and negative otherwise * Its absolute value is always the number of bytes taken by each * bitmap row. * * All drawing operations will be performed within the first * "width" pixels of each row (clipping is always performed). * ********************************************************************/ typedef struct grBitmap_ { int rows; int width; int pitch; grPixelMode mode; int grays; unsigned char* buffer; } grBitmap; typedef long grPos; typedef char grBool; typedef struct grVector_ { grPos x; grPos y; } grVector; typedef union grColor_ { long value; unsigned char chroma[4]; } grColor; /********************************************************************** * * * grNewBitmap * * * creates a new bitmap * * * pixel_mode :: the target surface's pixel_mode * num_grays :: number of grays levels for PAL8 pixel mode * width :: width in pixels * height :: height in pixels * * * bit :: descriptor of the new bitmap * * * Error code. 0 means success. * * * This function really allocates a pixel buffer, zero it, then * returns a descriptor for it. * * Call grDoneBitmap when you're done with it.. * **********************************************************************/ extern int grNewBitmap( grPixelMode pixel_mode, int num_grays, int width, int height, grBitmap *bit ); /********************************************************************** * * * grBlitGlyphToBitmap * * * writes a given glyph bitmap to a target surface. * * * target :: handle to target bitmap * glyph :: handle to source glyph bitmap * x :: position of left-most pixel of glyph image in target surface * y :: position of top-most pixel of glyph image in target surface * color :: color to be used to draw a monochrome glyph * * * Error code. 0 means success * * * There are only two supported source pixel modes : monochrome * and gray. The 8-bit images can have any number of grays between * 2 and 128, and conversions to the target surface is handled * _automatically_. * * Note however that you should avoid blitting a gray glyph to a gray * bitmap with fewer levels of grays, as this would much probably * give unpleasant results.. * * This function performs clipping * **********************************************************************/ extern int grBlitGlyphToBitmap( grBitmap* target, grBitmap* glyph, grPos x, grPos y, grColor color ); /********************************************************************** * * * grFillRectangle * * * this function is used to fill a given rectangle on a surface * * * surface :: handle to target surface * x :: x coordinate of the top-left corner of the rectangle * y :: y coordinate of the top-left corner of the rectangle * width :: rectangle width in pixels * height :: rectangle height in pixels * color :: fill color * **********************************************************************/ extern void grFillRectangle( grBitmap* surface, grPos x, grPos y, grPos width, grPos height, grColor color ); /********************************************************************** * * * grWriteCellChar * * * The graphics sub-system contains an internal Latin1 8x8 font * which can be used to display simple strings of text without * using FreeType. * * This function writes a single 8x8 character on the target bitmap. * * * target :: handle to target surface * x :: x pixel position of character cell's top left corner * y :: y pixel position of character cell's top left corner * charcode :: Latin-1 character code * color :: color to be used to draw the character * **********************************************************************/ extern void grWriteCellChar( grBitmap* target, int x, int y, int charcode, grColor color ); /********************************************************************** * * * grWriteCellString * * * The graphics sub-system contains an internal Latin1 8x8 font * which can be used to display simple strings of text without * using FreeType. * * This function writes a string with the internal font * * * target :: handle to target bitmap * x :: x pixel position of string's top left corner * y :: y pixel position of string's top left corner * string :: Latin-1 text string * color :: color to be used to draw the character * **********************************************************************/ extern void grWriteCellString( grBitmap* target, int x, int y, const char* string, grColor color ); /********************************************************************** * * * grDoneBitmap * * * destroys a bitmap * * * bitmap :: handle to bitmap descriptor * * * This function does NOT release the bitmap descriptor, only * the pixel buffer. * **********************************************************************/ extern void grDoneBitmap( grBitmap* bit ); /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /******** ********/ /******** DEVICE-SPECIFIC DEFINITIONS AND ROUTINES ********/ /******** ********/ /******** ********/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ /* forward declaration - the definition of grDevice is not visible */ /* to clients.. */ typedef struct grDevice_ grDevice; /********************************************************************** * * * grDeviceChain * * * a simple structure used to implement a linked list of * graphics device descriptors. The list is called a * "device chain" * * * name :: ASCII name of the device, e.g. "x11", "os2pm", etc.. * device :: handle to the device descriptor. * next :: next element in chain * * * the 'device' field is a blind pointer; it is thus unusable by * client applications.. * **********************************************************************/ typedef struct grDeviceChain_ grDeviceChain; struct grDeviceChain_ { const char* name; grDevice* device; grDeviceChain* next; }; /********************************************************************** * * * grInitDevices * * * This function is in charge of initialising all system-specific * devices. A device is responsible for creating and managing one * or more "surfaces". A surface is either a window or a screen, * depending on the system. * * * a pointer to the first element of a device chain. The chain can * be parsed to find the available devices on the current system * * * If a device cannot be initialised correctly, it is not part of * the device chain returned by this function. For example, if an * X11 device was compiled in the library, it will be part of * the returned device chain only if a connection to the display * could be establisged * * If no driver could be initialised, this function returns NULL. * **********************************************************************/ extern grDeviceChain* grInitDevices( void ); /********************************************************************** * * * grGetDeviceModes * * * queries the available pixel modes for a device. * * * device_name :: name of device to be used. 0 for the default * device. For a list of available devices, see * grInitDevices. * * * num_modes :: number of available modes. 0 in case of error, * which really is an invalid device name. * * pixel_modes :: array of available pixel modes for this device * this table is internal to the device and should * not be freed by client applications. * * * error code. 0 means success. invalid device name otherwise * * * All drivers are _required_ to support at least the following * pixel formats : * * - gr_pixel_mode_mono : i.e. monochrome bitmaps * - gr_pixel_mode_gray : with any number of gray levels between * 2 and 256. * * the pixel modes do not provide the number of grays in the case * of "gray" devices. You should try to create a surface with the * maximal number (256, that is) and see the value returned in * the bitmap descriptor. * **********************************************************************/ extern void grGetDeviceModes( const char* device_name, int *num_modes, grPixelMode* *pixel_modes ); /********************************************************************** * * * grNewSurface * * * creates a new device-specific surface. A surface is either * a window or a screen, depending on the device. * * * device :: name of the device to use. A value of NULL means * the default device (which depends on the system). * for a list of available devices, see grInitDevices. * * * bitmap :: handle to a bitmap descriptor containing the * requested pixel mode, number of grays and dimensions * for the surface. the bitmap's 'pitch' and 'buffer' * fields are ignored on input. * * On output, the bitmap describes the surface's image * completely. It is possible to write directly in it * with grBlitGlyphToBitmap, even though the use of * grBlitGlyphToSurface is recommended. * * * handle to the corresponding surface object. 0 in case of error * * * All drivers are _required_ to support at least the following * pixel formats : * * - gr_pixel_mode_mono : i.e. monochrome bitmaps * - gr_pixel_mode_gray : with any number of gray levels between * 2 and 256. * * This function might change the bitmap descriptor's fields. For * example, when displaying a full-screen surface, the bitmap's * dimensions will be set to those of the screen (e.g. 640x480 * or 800x600); also, the bitmap's 'buffer' field might point to * the Video Ram depending on the mode requested.. * * The surface contains a copy of the returned bitmap descriptor, * you can thus discard the 'bitmap' parameter after the call. * **********************************************************************/ extern grSurface* grNewSurface( const char* device, grBitmap* bitmap ); /********************************************************************** * * * grRefreshRectangle * * * this function is used to indicate that a given surface rectangle * was modified and thus needs re-painting. It really is useful for * windowed or gray surfaces. * * * surface :: handle to target surface * x :: x coordinate of the top-left corner of the rectangle * y :: y coordinate of the top-left corner of the rectangle * width :: rectangle width in pixels * height :: rectangle height in pixels * **********************************************************************/ extern void grRefreshRectangle( grSurface* surface, grPos x, grPos y, grPos width, grPos height ); /********************************************************************** * * * grRefreshSurface * * * a variation of grRefreshRectangle which repaints the whole surface * to the screen. * * * surface :: handle to target surface * **********************************************************************/ extern void grRefreshSurface( grSurface* surface ); /********************************************************************** * * * grWriteSurfaceChar * * * This function is equivalent to calling grWriteCellChar on the * surface's bitmap, then invoking grRefreshRectangle. * * The graphics sub-system contains an internal Latin1 8x8 font * which can be used to display simple strings of text without * using FreeType. * * This function writes a single 8x8 character on the target bitmap. * * * target :: handle to target surface * x :: x pixel position of character cell's top left corner * y :: y pixel position of character cell's top left corner * charcode :: Latin-1 character code * color :: color to be used to draw the character * **********************************************************************/ extern void grWriteSurfaceChar( grSurface* target, int x, int y, int charcode, grColor color ); /********************************************************************** * * * grWriteSurfaceString * * * This function is equivalent to calling grWriteCellString on the * surface's bitmap, then invoking grRefreshRectangle. * * The graphics sub-system contains an internal Latin1 8x8 font * which can be used to display simple strings of text without * using FreeType. * * This function writes a string with the internal font * * * target :: handle to target bitmap * x :: x pixel position of string's top left corner * y :: y pixel position of string's top left corner * string :: Latin-1 text string * color :: color to be used to draw the character * **********************************************************************/ extern void grWriteSurfaceString( grSurface* target, int x, int y, const char* string, grColor color ); /********************************************************************** * * * grSetTitle * * * set the window title of a given windowed surface. * * * surface :: handle to target surface * title_string :: the new title * **********************************************************************/ extern void grSetTitle( grSurface* surface, const char* title_string ); /********************************************************************** * * * grListenSurface * * * listen the events for a given surface * * * surface :: handle to target surface * event_mask :: the event mask (mode) * * * event :: the returned event * * * XXX : For now, only keypresses are supported. * **********************************************************************/ extern int grListenSurface( grSurface* surface, int event_mask, grEvent *event ); /********************************************************************** * * * grSetGlyphGamma * * * set the gamma-correction coefficient. This is only used to * blit glyphs * * * gamma :: gamma value. <= 0 to select sRGB transfer function * **********************************************************************/ extern void grSetGlyphGamma( double gamma_value ); /* */ #endif /* GRAPH_H */