libcm/cmGrDevCtx.h

206 řádky
8.2 KiB
C

#ifndef cmGrDevCtx_h
#define cmGrDevCtx_h
#ifdef __cplusplus
extern "C" {
#endif
//( { file_desc:"Device independent graphics context object used by cmGr." kw:[plot]}
enum
{
kOkGrDcRC = cmOkRC,
kStackFaultGrDcRC,
kDevDrvFailGrDcRC
};
typedef cmRC_t cmGrDcRC_t;
extern cmGrDcH_t cmGrDcNullHandle;
enum
{
kSolidLsGrFl = 0x01,
kDashLsGrFl = 0x02,
kDotLsGrFl = 0x04
};
enum
{
kHelveticaFfGrId,
kTimesFfGrId,
kCourierFfGrId,
kFontFfCnt
};
enum
{
kNormalFsGrFl = 0x00,
kBoldFsGrFl = 0x01,
kItalicFsGrFl = 0x02
};
typedef struct cmGrDev_str
{
// return true on success
bool (*create)( void* arg, unsigned w, unsigned h );
void (*destroy)( void* arg );
void (*begin_draw)( void* arg );
void (*end_draw)( void* arg );
void (*draw)( void* arg, int x, int y );
void (*set_color)( void* arg, const cmGrColor_t c );
void (*get_color)( void* arg, cmGrColor_t* c );
// Return false if the 'font' label is not recognized.
void (*set_font_family)(void* arg, unsigned fontId );
unsigned (*get_font_family)(void* arg );
void (*set_font_style)( void* arg, unsigned styleFLags );
unsigned (*get_font_style)( void* arg );
void (*set_font_size)( void* arg, unsigned size );
unsigned (*get_font_size)( void* arg );
void (*set_pen_style)( void* arg, unsigned styleFlags );
unsigned (*get_pen_style)( void* arg );
void (*set_pen_width)( void* arg, unsigned w );
unsigned (*get_pen_width)( void* arg );
void (*draw_line)( void* arg, int x, int y, int x1, int y1 );
void (*draw_rect)( void* arg, int x, int y, unsigned w, unsigned h );
void (*fill_rect)( void* arg, int x, int y, unsigned w, unsigned h );
// Draw an ellipse, diamond or triangle inside the rectangle formed by l,t,w,h.
void (*draw_ellipse)( void* arg, int x, int y, unsigned w, unsigned h );
void (*fill_ellipse)( void* arg, int x, int y, unsigned w, unsigned h );
void (*draw_diamond)( void* arg, int x, int y, unsigned w, unsigned h );
void (*fill_diamond)( void* arg, int x, int y, unsigned w, unsigned h );
void (*draw_triangle)( void* arg, int x, int y, unsigned w, unsigned h, unsigned dirFlag );
void (*fill_triangle)( void* arg, int x, int y, unsigned w, unsigned h, unsigned dirFlag );
// x,y identifies the left,lower text edge
void (*draw_text)( void* arg, const char* text, int x, int y );
void (*draw_text_rot)(void* arg, const char* text, int x, int y, int angle );
void (*measure_text)( void* arg, const char* text, unsigned* w, unsigned* h );
// Fill p[w*h*3] with RGB data.
void (*read_image)( void* arg, unsigned char* p, int x, int y, unsigned w, unsigned h );
void (*draw_image)( void* arg, const unsigned char* p, int x, int y, unsigned w, unsigned h );
} cmGrDev_t;
cmGrDcRC_t cmGrDevCtxCreate( cmCtx_t* ctx, cmGrDcH_t* hp, cmGrDev_t* dd, void* ddArg, int x, int y, int w, int h );
cmGrDcRC_t cmGrDevCtxDestroy( cmGrDcH_t* hp );
bool cmGrDevCtxIsValid( cmGrDcH_t h );
cmGrDcRC_t cmGrDevCtxResize( cmGrDcH_t h, int x, int y, int ww, int hh );
void cmGrDevCtxSize( cmGrDcH_t h, cmGrPExt_t* pext );
void cmGrDevCtxBeginDraw( cmGrDcH_t h );
void cmGrDevCtxEndDraw( cmGrDcH_t h );
void cmGrDevCtxDraw( cmGrDcH_t h );
void cmGrDcPushCtx( cmGrDcH_t h );
void cmGrDcPopCtx( cmGrDcH_t h );
unsigned cmGrDcColor( cmGrDcH_t h );
void cmGrDcSetColorRgb( cmGrDcH_t h, unsigned char r, unsigned char g, unsigned char b );
void cmGrDcSetColor( cmGrDcH_t h, cmGrColor_t color );
unsigned cmGrDcFontFamily( cmGrDcH_t h );
void cmGrDcSetFontFamily( cmGrDcH_t h, unsigned fontId );
unsigned cmGrDcFontStyle( cmGrDcH_t h );
void cmGrDcSetFontStyle( cmGrDcH_t h, unsigned style );
unsigned cmGrDcFontSize( cmGrDcH_t h );
void cmGrDcSetFontSize( cmGrDcH_t h, unsigned size );
unsigned cmGrDcPenWidth( cmGrDcH_t h );
void cmGrDcSetPenWidth( cmGrDcH_t h, unsigned width );
unsigned cmGrDcPenStyle( cmGrDcH_t h );
void cmGrDcSetPenStyle( cmGrDcH_t h, unsigned style );
void cmGrDcDrawLine( cmGrDcH_t h, int x, int y, int x1, int y1 );
// x,y is the upper,left.
void cmGrDcDrawRect( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
void cmGrDcDrawRectPExt( cmGrDcH_t h, const cmGrPExt_t* pext );
void cmGrDcFillRect( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
void cmGrDcDrawEllipse( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
void cmGrDcFillEllipse( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
void cmGrDcDrawDiamond( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
void cmGrDcFillDiamond( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh );
// Set 'dirFlag' to kTopGrFl,kBottomGrFl,kRightGrFl,kLeftGrFl to indicate
// the direction the triangle is pointeed.
void cmGrDcDrawTriangle( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh, unsigned dirFlag );
void cmGrDcFillTriangle( cmGrDcH_t h, int x, int y, unsigned ww, unsigned hh, unsigned dirFlag );
void cmGrDcMeasure( cmGrDcH_t h, const cmChar_t* text, cmGrPSz_t* sz );
void cmGrDcDrawText( cmGrDcH_t h, const cmChar_t* text, int x, int y );
void cmGrDcDrawTextRot( cmGrDcH_t h, const cmChar_t* text, int x, int y, int angle );
void cmGrDcReadImage( cmGrDcH_t h, unsigned char* p, const cmGrPExt_t* pext );
void cmGrDcDrawImage( cmGrDcH_t h, const unsigned char* p, const cmGrPExt_t* pext );
//
// Composite Functions
//
void cmGrDcSetFont( cmGrDcH_t h, unsigned fontId, unsigned size, unsigned style );
void cmGrDcFontSetAndMeasure(cmGrDcH_t h, unsigned fontId, unsigned size, unsigned style, const cmChar_t* text, cmGrPSz_t* sz );
enum
{
kLeftJsGrFl = 0x001,
kRightJsGrFl = 0x002,
kTopJsGrFl = 0x004,
kBottomJsGrFl = 0x008,
kHorzCtrJsGrFl = 0x010,
kVertCtrJsGrFl = 0x020,
kNorthJsGrFl = 0x040,
kEastJsGrFl = 0x080,
kSouthJsGrFl = 0x100,
kWestJsGrFl = 0x200
};
// Use compass (NSEW) flags to select the draw point. Defaults to center for both dir's.
// Use TBLF flags to select the text justification relative to the point.
// In effect the TBLF flags select the corner of the text to place at the location of
// the point selected by the NSEW flags.
// If neither NS flag is set then the vertical point is set to the vertical center.
// If neither EW flags is set then the horizontal point is set to the horzontal center.
void cmGrDcDrawTextJustify( cmGrDcH_t h, unsigned fontId, unsigned size, unsigned style, const cmChar_t* text, const cmGrPExt_t* pext, unsigned flags );
// Use LBLF to set the justification - the text corner to match to the given point.
// If neither TL flag is given then the point is matched to the vertical center of the text.
// If neither RL flag is given then the point is matched to the horizontal center of the text.
void cmGrDcDrawTextJustifyPt( cmGrDcH_t h, unsigned fontId, unsigned size, unsigned style, const cmChar_t* text, unsigned flags, int x, int y );
// Return the rectangle around the text but do not display the text.
void cmGrDcDrawTextJustifyRect( cmGrDcH_t h, unsigned fontId, unsigned size, unsigned style, const cmChar_t* text, unsigned flags, int x, int y, cmGrPExt_t* pext );
// Is the point x,y visible in this drawing context.
bool cmGrDcPointIsVisible( cmGrDcH_t h, int x, int y );
// Is any of the rectangle visible in this drawing context.
bool cmGrDcRectIsVisible( cmGrDcH_t h, const cmGrPExt_t* r );
//)
#ifdef __cplusplus
}
#endif
#endif