forked from minhngoc25a/freetype2
633 lines
20 KiB
C
633 lines
20 KiB
C
/***************************************************************************
|
|
*
|
|
* graph.h
|
|
*
|
|
* Graphics Subsystem interface
|
|
*
|
|
* Copyright 1999 - 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_max /* don't remove */
|
|
|
|
} grPixelMode;
|
|
|
|
|
|
/* forward declaration of the surface class */
|
|
typedef struct grSurface_ grSurface;
|
|
|
|
|
|
/*********************************************************************
|
|
*
|
|
* <Struct>
|
|
* grBitmap
|
|
*
|
|
* <Description>
|
|
* a simple bitmap descriptor
|
|
*
|
|
* <Fields>
|
|
* 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
|
|
*
|
|
* <Note>
|
|
* 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;
|
|
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;
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grNewBitmap
|
|
*
|
|
* <Description>
|
|
* creates a new bitmap
|
|
*
|
|
* <Input>
|
|
* 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
|
|
*
|
|
* <Output>
|
|
* bit :: descriptor of the new bitmap
|
|
*
|
|
* <Return>
|
|
* Error code. 0 means success.
|
|
*
|
|
* <Note>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grBlitGlyphToBitmap
|
|
*
|
|
* <Description>
|
|
* writes a given glyph bitmap to a target surface.
|
|
*
|
|
* <Input>
|
|
* 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
|
|
*
|
|
* <Return>
|
|
* Error code. 0 means success
|
|
*
|
|
* <Note>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grFillRectangle
|
|
*
|
|
* <Description>
|
|
* this function is used to fill a given rectangle on a surface
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grWriteCellChar
|
|
*
|
|
* <Description>
|
|
* 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.
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grWriteCellString
|
|
*
|
|
* <Description>
|
|
* 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
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grDoneBitmap
|
|
*
|
|
* <Description>
|
|
* destroys a bitmap
|
|
*
|
|
* <Input>
|
|
* bitmap :: handle to bitmap descriptor
|
|
*
|
|
* <Note>
|
|
* 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;
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Struct>
|
|
* grDeviceChain
|
|
*
|
|
* <Description>
|
|
* a simple structure used to implement a linked list of
|
|
* graphics device descriptors. The list is called a
|
|
* "device chain"
|
|
*
|
|
* <Fields>
|
|
* name :: ASCII name of the device, e.g. "x11", "os2pm", etc..
|
|
* device :: handle to the device descriptor.
|
|
* next :: next element in chain
|
|
*
|
|
* <Note>
|
|
* 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;
|
|
};
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grInitDevices
|
|
*
|
|
* <Description>
|
|
* 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.
|
|
*
|
|
* <Return>
|
|
* a pointer to the first element of a device chain. The chain can
|
|
* be parsed to find the available devices on the current system
|
|
*
|
|
* <Note>
|
|
* 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 );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grGetDeviceModes
|
|
*
|
|
* <Description>
|
|
* queries the available pixel modes for a device.
|
|
*
|
|
* <Input>
|
|
* device_name :: name of device to be used. 0 for the default
|
|
* device. For a list of available devices, see
|
|
* grInitDevices.
|
|
*
|
|
* <Output>
|
|
* 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.
|
|
*
|
|
* <Return>
|
|
* error code. 0 means success. invalid device name otherwise
|
|
*
|
|
* <Note>
|
|
* 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 );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grNewSurface
|
|
*
|
|
* <Description>
|
|
* creates a new device-specific surface. A surface is either
|
|
* a window or a screen, depending on the device.
|
|
*
|
|
* <Input>
|
|
* 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.
|
|
*
|
|
* <InOut>
|
|
* 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.
|
|
*
|
|
* <Return>
|
|
* handle to the corresponding surface object. 0 in case of error
|
|
*
|
|
* <Note>
|
|
* 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 );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grRefreshRectangle
|
|
*
|
|
* <Description>
|
|
* 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.
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grRefreshSurface
|
|
*
|
|
* <Description>
|
|
* a variation of grRefreshRectangle which repaints the whole surface
|
|
* to the screen.
|
|
*
|
|
* <Input>
|
|
* surface :: handle to target surface
|
|
*
|
|
**********************************************************************/
|
|
|
|
extern void grRefreshSurface( grSurface* surface );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grWriteSurfaceChar
|
|
*
|
|
* <Description>
|
|
* 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.
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grWriteSurfaceString
|
|
*
|
|
* <Description>
|
|
* 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
|
|
*
|
|
* <Input>
|
|
* 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 );
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grSetTitle
|
|
*
|
|
* <Description>
|
|
* set the window title of a given windowed surface.
|
|
*
|
|
* <Input>
|
|
* surface :: handle to target surface
|
|
* title_string :: the new title
|
|
*
|
|
**********************************************************************/
|
|
|
|
extern void grSetTitle( grSurface* surface,
|
|
const char* title_string );
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* <Function>
|
|
* grListenSurface
|
|
*
|
|
* <Description>
|
|
* listen the events for a given surface
|
|
*
|
|
* <Input>
|
|
* surface :: handle to target surface
|
|
* event_mask :: the event mask (mode)
|
|
*
|
|
* <Output>
|
|
* event :: the returned event
|
|
*
|
|
* <Note>
|
|
* XXX : For now, only keypresses are supported.
|
|
*
|
|
**********************************************************************/
|
|
|
|
extern
|
|
int grListenSurface( grSurface* surface,
|
|
int event_mask,
|
|
grEvent *event );
|
|
|
|
|
|
#endif /* GRAPH_H */
|