From 788db64b8642bf31de6930d18a62177c64163ee0 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Fri, 13 Mar 2015 12:24:02 +0200 Subject: Add grlib, fixes #5 --- grlib/grlib.h | 2304 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2304 insertions(+) create mode 100644 grlib/grlib.h (limited to 'grlib/grlib.h') diff --git a/grlib/grlib.h b/grlib/grlib.h new file mode 100644 index 0000000..3802381 --- /dev/null +++ b/grlib/grlib.h @@ -0,0 +1,2304 @@ +//***************************************************************************** +// +// grlib.h - Prototypes for the low level primitives provided by the graphics +// library. +// +// Copyright (c) 2007-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the Tiva Graphics Library. +// +//***************************************************************************** + +#ifndef __GRLIB_H__ +#define __GRLIB_H__ + +//***************************************************************************** +// +//! \addtogroup primitives_api +//! @{ +// +//***************************************************************************** + +//***************************************************************************** +// +// If building with a C++ compiler, make all of the definitions in this header +// have a C binding. +// +//***************************************************************************** +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +//! This structure defines the extents of a rectangle. All points greater than +//! or equal to the minimum and less than or equal to the maximum are part of +//! the rectangle. +// +//***************************************************************************** +typedef struct +{ + // + //! The minimum X coordinate of the rectangle. + // + int16_t i16XMin; + + // + //! The minimum Y coordinate of the rectangle. + // + int16_t i16YMin; + + // + //! The maximum X coordinate of the rectangle. + // + int16_t i16XMax; + + // + //! The maximum Y coordinate of the rectangle. + // + int16_t i16YMax; +} +tRectangle; + +//***************************************************************************** +// +//! This structure defines the characteristics of a display driver. +// +//***************************************************************************** +typedef struct +{ + // + //! The size of this structure. + // + int32_t i32Size; + + // + //! A pointer to display driver-specific data. + // + void *pvDisplayData; + + // + //! The width of this display. + // + uint16_t ui16Width; + + // + //! The height of this display. + // + uint16_t ui16Height; + + // + //! A pointer to the function to draw a pixel on this display. + // + void (*pfnPixelDraw)(void *pvDisplayData, int32_t i32X, int32_t i32Y, + uint32_t ui32Value); + + // + //! A pointer to the function to draw multiple pixels on this display. + //! Note that the lBPP parameter contains the source image data color + //! depth in the least significant byte but uses some high bits to pass + //! flags and hints to the driver. + // + void (*pfnPixelDrawMultiple)(void *pvDisplayData, int32_t i32X, + int32_t i32Y, int32_t i32X0, + int32_t i32Count, int32_t i32BPP, + const uint8_t *pui8Data, + const uint8_t *pui8Palette); + + // + //! A pointer to the function to draw a horizontal line on this display. + // + void (*pfnLineDrawH)(void *pvDisplayData, int32_t i32X1, int32_t i32X2, + int32_t i32Y, uint32_t ui32Value); + + // + //! A pointer to the function to draw a vertical line on this display. + // + void (*pfnLineDrawV)(void *pvDisplayData, int32_t i32X, int32_t i32Y1, + int32_t i32Y2, uint32_t ui32Value); + + // + //! A pointer to the function to draw a filled rectangle on this display. + // + void (*pfnRectFill)(void *pvDisplayData, const tRectangle *psRect, + uint32_t ui32Value); + + // + //! A pointer to the function to translate 24-bit RGB colors to + //! display-specific colors. + // + uint32_t (*pfnColorTranslate)(void *pvDisplayData, uint32_t ui32Value); + + // + //! A pointer to the function to flush any cached drawing operations on + //! this display. + // + void (*pfnFlush)(void *pvDisplayData); +} +tDisplay; + +//***************************************************************************** +// +//! This flag is passed to display driver's PixelDrawMultiple calls in the +//! i32BPP parameter to indicate that a given span of pixels represents the +//! first line of a new image. Drivers may use this to recalculate any color +//! mapping table required to draw the image rather than doing this on every +//! line of pixels. +// +//***************************************************************************** +#define GRLIB_DRIVER_FLAG_NEW_IMAGE 0x40000000 + +//***************************************************************************** +// +//! This structure describes a font used for drawing text onto the screen. +//! Fonts in this format may encode ASCII characters with codepoints in the +//! range 0x20 - 0x7F. More information on this and the other supported font +//! structures may be found in the ``Font Format'' section of the user's guide. +// +//***************************************************************************** +typedef struct +{ + // + //! The format of the font. Can be one of FONT_FMT_UNCOMPRESSED or + //! FONT_FMT_PIXEL_RLE. + // + uint8_t ui8Format; + + // + //! The maximum width of a character; this is the width of the widest + //! character in the font, though any individual character may be narrower + //! than this width. + // + uint8_t ui8MaxWidth; + + // + //! The height of the character cell; this may be taller than the font data + //! for the characters (to provide inter-line spacing). + // + uint8_t ui8Height; + + // + //! The offset between the top of the character cell and the baseline of + //! the glyph. The baseline is the bottom row of a capital letter, below + //! which only the descenders of the lower case letters occur. + // + uint8_t ui8Baseline; + + // + //! The offset within pui8Data to the data for each character in the font. + // + uint16_t pui16Offset[96]; + + // + //! A pointer to the data for the font. + // + const uint8_t *pui8Data; +} +tFont; + +//***************************************************************************** +// +//! This is a newer version of the structure which describes a font used +//! for drawing text onto the screen. This variant allows a font to contain an +//! arbitrary, contiguous block of codepoints from the 256 basic characters in +//! an ISO8859-n font and allows support for accented characters in Western +//! European languages and any left-to-right typeface supported by an ISO8859 +//! variant. Fonts encoded in this format may be used interchangeably with the +//! original fonts merely by casting the structure pointer when calling any +//! function or macro which expects a font pointer as a parameter. More +//! information on this and the other supported font structures may be found in +//! the ``Font Format'' section of the user's guide. +// +//***************************************************************************** +typedef struct +{ + // + //! The format of the font. Can be one of FONT_FMT_EX_UNCOMPRESSED or + //! FONT_FMT_EX_PIXEL_RLE. + // + uint8_t ui8Format; + + // + //! The maximum width of a character; this is the width of the widest + //! character in the font, though any individual character may be narrower + //! than this width. + // + uint8_t ui8MaxWidth; + + // + //! The height of the character cell; this may be taller than the font data + //! for the characters (to provide inter-line spacing). + // + uint8_t ui8Height; + + // + //! The offset between the top of the character cell and the baseline of + //! the glyph. The baseline is the bottom row of a capital letter, below + //! which only the descenders of the lower case letters occur. + // + uint8_t ui8Baseline; + + // + //! The codepoint number representing the first character encoded in the + //! font. + // + uint8_t ui8First; + + // + //! The codepoint number representing the last character encoded in the + //! font. + // + uint8_t ui8Last; + + // + //! A pointer to a table containing the offset within pui8Data to the data + //! for each character in the font. + // + const uint16_t *pui16Offset; + + // + //! A pointer to the data for the font. + // + const uint8_t *pui8Data; +} +tFontEx; + +//***************************************************************************** +// +//! This variant of the font structure supports Unicode and other multi-byte +//! character sets. It is intended for use when rendering such languages as +//! traditional and simplified Chinese, Korean and Japanese. The font +//! supports multiple blocks of contiguous characters and includes a codepage +//! identifier to allow GrLib to correctly map source codepoints to font +//! glyphs in cases where the codepages may differ. More information on +//! this and the other supported font structures may be found in the ``Font +//! Format'' section of the user's guide. +// +// For the benefit of those of you reading the source... + +// Note that, unlike tFont and tFontEx where the character data and offset +// tables are referenced by pointer and may be discontiguous, a font described +// using tFontWide is assumed to comprise a single, contiguous block of data +// with a tFontWide structure as its header, a number of tFontBlock structures +// immediately following this, and a number of tFontOffsetTable and font glyph +// data entries following this. This format ensures that the font is position- +// independent and allows use in external memory or from non-random-access +// storage such as SDCards or SSI flash. +// +// A complete font in this format would look as follows: +// +// ------------------------------- +// 0 | tFontWide header | +// | ui32NumBlocks = n | +// ------------------------------- +// | tFontBlock[0] | First block describes characters from +// | ui32StartCodepoint = S0 | codepoint S0 to (S0 + N0 - 1). Offset +// | ui32NumCodepoints = N0 | to glyph table is OF0 bytes from the +// | ui32GlyphTableOffset = OF0 | start of the tFontWide header struct. +// ------------------------------- +// | ... | +// ------------------------------- +// | tFontBlock[n-1] | Final block describes characters from +// | ui32StartCodepoint = S(n-1) | codepoint S(n-1) to (S(n-1) + N(n-1) +// | ui32NumCodepoints = N(n-1) | - 1). +// | ui32GlyphTableOffset = OF(n-1)| +// ------------------------------- +// Start of Block 0 Offset Table +// ------------------------------- +// OF0 | ui32GlyphOffset = GO0 | Offset from OF0 to glyph S0 data. +// | | +// ------------------------------- +// | ui32GlyphOffset = GO1 | Offset from OF0 to glyph (S0 + 1) data. +// | | +// ------------------------------- +// | ... | +// | | +// ------------------------------- +// | ui32GlyphOffset = GO(N0 - 1) | Offset from OF0 to glyph (S0 + N0 - 1) +// | | +// ------------------------------- +// Start of Block 0 Glyph Data +// ------------------------------- +// GO0 | Glyph data for codepoint | +// | S0 from block 0 | +// ------------------------------- +// GO1 | Glyph data for codepoint | +// | S0 + 1 from block 0 | +// ------------------------------- +// | ... | +// ------------------------------- +// GO | Glyph data for codepoint | +//(N-1)| (S0 + N0 - 1) from block 0 | +// ------------------------------- +// Start of Block 1 Offset Table +// ------------------------------- +// OF1 | ui32GlyphOffset = G10 | Offset from OF1 to glyph S1 data. +// | | +// ------------------------------- +// | ui32GlyphOffset = G11 | Offset from OF1 to glyph (S1 + 1) data. +// | | +// ------------------------------- +// | ... | +// | | +// ------------------------------- +// | ui32GlyphOffset = G1(N1 - 1) | Offset from OF1 to glyph (S1 + N1 - 1) +// | | +// ------------------------------- +// Start of Block 1 Glyph Data +// ------------------------------- +// G10 | Glyph data for codepoint | +// | S1 from block 1 | +// ------------------------------- +// G11 | Glyph data for codepoint | +// | S1 + 1 from block 1 | +// ------------------------------- +// | ... | +// ------------------------------- +// G1 | Glyph data for codepoint | +//(N-1)| (S1 + N1 - 1) from block 1 | +// ------------------------------- +// GO0 | Glyph data for codepoint | +// | S0 from block 0 | +// ------------------------------- +// Start of Block 2 Offset Table +// ------------------------------- +// | ...continued for remaining | +// | font blocks. | +// ------------------------------- +// +//***************************************************************************** +typedef struct +{ + // + //! The format of the font. Can be one of FONT_FMT_WIDE_UNCOMPRESSED or + //! FONT_FMT_WIDE_PIXEL_RLE. + // + uint8_t ui8Format; + + // + //! The maximum width of a character; this is the width of the widest + //! character in the font, though any individual character may be narrower + //! than this width. + // + uint8_t ui8MaxWidth; + + // + //! The height of the character cell; this may be taller than the font data + //! for the characters (to provide inter-line spacing). + // + uint8_t ui8Height; + + // + //! The offset between the top of the character cell and the baseline of + //! the glyph. The baseline is the bottom row of a capital letter, below + //! which only the descenders of the lower case letters occur. + // + uint8_t ui8Baseline; + + // + //! The codepage that is used to find characters in this font. This + //! defines the codepoint-to-glyph mapping within this font. + // + uint16_t ui16Codepage; + + // + //! The number of blocks of characters described by this font where a block + //! contains a number of contiguous codepoints. + // + uint16_t ui16NumBlocks; +} +tFontWide; + +typedef struct +{ + // + //! The first codepoint in this block of characters. The meaning of this + //! value depends upon the codepage that the font is using, as defined in + //! the eCodePage field of the associated tFontWide structure. + // + uint32_t ui32StartCodepoint; + + // + //! The number of characters encoded in this block. The first character + //! is given by ui32StartCodepoint and the last is (ui32StartCodepoint + + //! ui32NumBlockChars - 1). + // + uint32_t ui32NumCodepoints; + + // + //! The offset from the beginning of the tFontWide header to the glyph + //! offset table for this block of characters. + // + uint32_t ui32GlyphTableOffset; +} +tFontBlock; + +typedef struct +{ + // + //! The offset of each glyph in the block relative to the first entry in + //! this table. This structure is represented as an array of 1 entry but + //! the actual number of entries is given in the ui16NumBlockChars entry of + //! the tFontBlock that points to this structure. + //! + //! The value provided in ui32GlyphOffset[n] is the byte offset from the + //! start of the tFontBlock structure that this glyph belongs to to the + //! first byte of the glyph data. + //! + //! To support fonts which contain large blocks of codepoints with + //! small gaps, a ui32GlyphOffset value of 0 indicates that the codepoint + //! in question is not populated in the font. Using this method, single + //! characters may be skipped while avoiding the overhead of defining a new + //! block. + // + uint32_t ui32GlyphOffset[1]; +} +tFontOffsetTable; + +//***************************************************************************** +// +//! The jump table used to access a particular wrapped (offline) font. +//! This table exists for each type of wrapped font in use with the functions +//! dependent upon the storage medium holding the font. +// +//***************************************************************************** +typedef struct +{ + // + //! A pointer to the function which will return information on the + //! font. This is used to support GrFontInfoGet. + // + void (*pfnFontInfoGet)(uint8_t *pui8FontId, uint8_t *pui8Format, + uint8_t *pui8Width, uint8_t *pui8Height, + uint8_t *pui8Baseline); + + // + //! A pointer to the function used to retrieve data for a particular font + //! glyph. This function returns a pointer to the glyph data in linear, + //! random access memory. If a buffer is required to ensure this, that + //! buffer must be owned and managed by the font wrapper function. It is + //! safe to assume that this function will not be called again until any + //! previously requested glyph data has been used so a single character + //! buffer should suffice. This is used to support GrFontGlyphDataGet. + // + const uint8_t *(*pfnFontGlyphDataGet)(uint8_t *pui8FontId, + uint32_t ui32CodePoint, + uint8_t *pui8Width); + + // + //! A pointer to the function used to determine the codepage supported by + //! the font. + // + uint16_t (*pfnFontCodepageGet)(uint8_t *pui8FontId); + + // + //! A pointer to the function used to determine the number of blocks of + //! codepoints supported by the font. + // + uint16_t (*pfnFontNumBlocksGet)(uint8_t *pui8FontId); + + // + //! A pointer to the function used to determine the codepoints in a given + //! codepoints in a given font block. + // + uint32_t (*pfnFontBlockCodepointsGet)(uint8_t *pui8FontId, + uint16_t ui16BlockIndex, + uint32_t *pui32Start); +} +tFontAccessFuncs; + +//***************************************************************************** +// +//! This is a wrapper used to support fonts which are stored in a file system +//! or other non-random access storage. The font is accessed by means of +//! access functions whose pointers are described in this structure. The +//! pui8FontId field is written with a handle supplied to the application by +//! the font wrapper's FontLoad function and is passed to all access functions +//! to identify the font in use. Wrapped fonts may be used by any GrLib +//! function that accepts a font pointer as a parameter merely by casting the +//! pointer appropriately. +// +//***************************************************************************** +typedef struct +{ + // + //! The format of the font. Will be FONT_FMT_WRAPPED. + // + uint8_t ui8Format; + + // + //! A pointer to information required to allow the font access functions + //! to find the font to be used. This value is returned from a call to + //! the FontLoad function for the particular font wrapper in use. + // + uint8_t *pui8FontId; + + // + //! Access functions for this font. + // + const tFontAccessFuncs *pFuncs; +} +tFontWrapper; + +//***************************************************************************** +// +//! Indicates that the font data is stored in an uncompressed format. +// +//***************************************************************************** +#define FONT_FMT_UNCOMPRESSED 0x00 + +//***************************************************************************** +// +//! Indicates that the font data is stored using a pixel-based RLE format. +// +//***************************************************************************** +#define FONT_FMT_PIXEL_RLE 0x01 + +//***************************************************************************** +// +//! A marker used in the ui8Format field of a font to indicates that the font +//! data is stored using the new tFontEx structure. +// +//***************************************************************************** +#define FONT_EX_MARKER 0x80 + +//***************************************************************************** +// +//! Indicates that the font data is stored in an uncompressed format and uses +//! the tFontEx structure format. +// +//***************************************************************************** +#define FONT_FMT_EX_UNCOMPRESSED (FONT_FMT_UNCOMPRESSED | FONT_EX_MARKER) + +//***************************************************************************** +// +//! Indicates that the font data is stored using a pixel-based RLE format and +//! uses the tFontEx structure format. +// +//***************************************************************************** +#define FONT_FMT_EX_PIXEL_RLE (FONT_FMT_PIXEL_RLE | FONT_EX_MARKER) + +//***************************************************************************** +// +//! A marker used in the ui8Format field of a font to indicates that the font +//! data is stored using the new tFontWide structure. +// +//***************************************************************************** +#define FONT_WIDE_MARKER 0x40 + +//***************************************************************************** +// +//! Indicates that the font data is stored in an uncompressed format and uses +//! the tFontWide structure format. +// +//***************************************************************************** +#define FONT_FMT_WIDE_UNCOMPRESSED (FONT_FMT_UNCOMPRESSED | FONT_WIDE_MARKER) + +//***************************************************************************** +// +//! Indicates that the font data is stored using a pixel-based RLE format and +//! uses the tFontWide structure format. +// +//***************************************************************************** +#define FONT_FMT_WIDE_PIXEL_RLE (FONT_FMT_PIXEL_RLE | FONT_WIDE_MARKER) + +//***************************************************************************** +// +//! Indicates that the font data is stored in offline storage (file system, +//! serial memory device, etc) and must be accessed using wrapper functions. +//! Fonts using this format are described using a tFontWrapper structure. +// +//***************************************************************************** +#define FONT_FMT_WRAPPED 0x20 + +//***************************************************************************** +// +//! Indicates that the image data is not compressed and represents each pixel +//! with a single bit. +// +//***************************************************************************** +#define IMAGE_FMT_1BPP_UNCOMP 0x01 + +//***************************************************************************** +// +//! Indicates that the image data is not compressed and represents each pixel +//! with four bits. +// +//***************************************************************************** +#define IMAGE_FMT_4BPP_UNCOMP 0x04 + +//***************************************************************************** +// +//! Indicates that the image data is not compressed and represents each pixel +//! with eight bits. +// +//***************************************************************************** +#define IMAGE_FMT_8BPP_UNCOMP 0x08 + +//***************************************************************************** +// +//! Indicates that the image data is compressed and represents each pixel with +//! a single bit. +// +//***************************************************************************** +#define IMAGE_FMT_1BPP_COMP 0x81 + +//***************************************************************************** +// +//! Indicates that the image data is compressed and represents each pixel with +//! four bits. +// +//***************************************************************************** +#define IMAGE_FMT_4BPP_COMP 0x84 + +//***************************************************************************** +// +//! Indicates that the image data is compressed and represents each pixel with +//! eight bits. +// +//***************************************************************************** +#define IMAGE_FMT_8BPP_COMP 0x88 + +#ifndef GRLIB_REMOVE_WIDE_FONT_SUPPORT +//***************************************************************************** +// +//! Identifiers for codepages and source text encoding formats. +// +//***************************************************************************** +#define CODEPAGE_ISO8859_1 0x0000 +#define CODEPAGE_ISO8859_2 0x0001 +#define CODEPAGE_ISO8859_3 0x0002 +#define CODEPAGE_ISO8859_4 0x0013 +#define CODEPAGE_ISO8859_5 0x0003 +#define CODEPAGE_ISO8859_6 0x0004 +#define CODEPAGE_ISO8859_7 0x0005 +#define CODEPAGE_ISO8859_8 0x0006 +#define CODEPAGE_ISO8859_9 0x0007 +#define CODEPAGE_ISO8859_10 0x0008 +#define CODEPAGE_ISO8859_11 0x0009 +#define CODEPAGE_ISO8859_13 0x000A +#define CODEPAGE_ISO8859_14 0x000B +#define CODEPAGE_ISO8859_15 0x000C +#define CODEPAGE_ISO8859_16 0x000D +#define CODEPAGE_UNICODE 0x000E +#define CODEPAGE_GB2312 0x000F +#define CODEPAGE_GB18030 0x0010 +#define CODEPAGE_BIG5 0x0011 +#define CODEPAGE_SHIFT_JIS 0x0012 +#define CODEPAGE_WIN1250 0x0013 +#define CODEPAGE_WIN1251 0x0014 +#define CODEPAGE_WIN1252 0x0015 +#define CODEPAGE_WIN1253 0x0016 +#define CODEPAGE_WIN1254 0x0017 +#define CODEPAGE_WIN1255 0x0018 +#define CODEPAGE_WIN1256 0x0019 +#define CODEPAGE_WIN1257 0x001A +#define CODEPAGE_WIN1258 0x001B + +// +// UTF-8 and UTF-16 may be specified as the source text encoding but may not +// be used to describe the codepage in use in a font since they are simply +// different encoding methods for Unicode. +// +#define CODEPAGE_UTF_8 0x4000 +#define CODEPAGE_UTF_16LE 0x4001 +#define CODEPAGE_UTF_16BE 0x4002 +#define CODEPAGE_UTF_16 CODEPAGE_UTF_16BE + +// +// Applications wishing to use custom fonts with, for example, application- +// specific glyph mappings may use codepage identifiers above +// CODEPAGE_CUSTOM_BASE. +// +#define CODEPAGE_CUSTOM_BASE 0x8000 + +//***************************************************************************** +// +//! A structure used to define a mapping function that converts text in one +//! codepage to a different codepage. Typically this is used to translate +//! text strings into the codepoints needed to retrieve the appropriate +//! glyphs from a font. +// +//***************************************************************************** +typedef struct +{ + // + //! The codepage used to describe the source characters. + // + uint16_t ui16SrcCodepage; + + // + //! The codepage into which source characters are to be mapped. + // + uint16_t ui16FontCodepage; + + // + //! A pointer to the conversion function which will be used to translate + //! input strings into codepoints in the output codepage. + // + uint32_t (*pfnMapChar)(const char *pcSrcChar, uint32_t ui32Count, + uint32_t *pui32Skip); +} +tCodePointMap; + +//***************************************************************************** +// +// Forward reference to the graphics context structure. +// +//***************************************************************************** +struct _tContext; + +//***************************************************************************** +// +// A function pointer for a replacement text string rendering function. The +// prototype for this function follows GrStringDraw. Applications making use +// of scripts which require special handling for diacritics, ligatures or +// character composition/decomposition may replace the default GrLib string +// renderer with one of their own which understands these rules. +// +//***************************************************************************** +typedef void (*tStringRenderer)(const struct _tContext *, const char *, + int32_t, int32_t, int32_t, bool); + +//***************************************************************************** +// +//! This structure contains default values that are set in any new context +//! initialized via a call to GrContextInit. This structure is passed to the +//! graphics library using the GrLibInit function. +// +//***************************************************************************** +typedef struct +{ + // + //! The default string rendering function to use. This will normally be + //! GrDefaultStringRenderer but may be replaced when supporting languages + //! requiring mixed rendering directions such as Arabic or Hebrew. + // + void (*pfnStringRenderer)(const struct _tContext *, const char *, int32_t, + int32_t, int32_t, bool); + + // + //! The default codepoint mapping function table. This table contains + //! information allowing GrLib to map text in the source codepage to the + //! correct glyphs in the fonts to be used. The field points to the first + //! element of an array of ui8NumCodePointMaps structures. + // + tCodePointMap *pCodePointMapTable; + + // + //! The default source text codepage encoding in use by the application. + // + uint16_t ui16Codepage; + + // + //! The number of entries in the pCodePointMapTable array. + // + uint8_t ui8NumCodePointMaps; + + // + //! Reserved for future expansion. + // + uint8_t ui8Reserved; +} +tGrLibDefaults; + +#endif + +//***************************************************************************** +// +//! This structure defines a drawing context to be used to draw onto the +//! screen. Multiple drawing contexts may exist at any time. +// +//***************************************************************************** +#ifdef DOXYGEN +typedef struct +#else +typedef struct _tContext +#endif +{ + // + //! The size of this structure. + // + int32_t i32Size; + + // + //! The screen onto which drawing operations are performed. + // + const tDisplay *psDisplay; + + // + //! The clipping region to be used when drawing onto the screen. + // + tRectangle sClipRegion; + + // + //! The color used to draw primitives onto the screen. + // + uint32_t ui32Foreground; + + // + //! The background color used to draw primitives onto the screen. + // + uint32_t ui32Background; + + // + //! The font used to render text onto the screen. + // + const tFont *psFont; + +#ifndef GRLIB_REMOVE_WIDE_FONT_SUPPORT + // + //! A pointer to a replacement string rendering function. Applications + //! can use this for language-specific string rendering support. If + //! set, this function is passed control whenever GrStringDraw is called. + // + void (*pfnStringRenderer)(const struct _tContext *, const char *, int32_t, + int32_t, int32_t, bool); + + // + //! A table of functions used to map between the various supported + //! source codepages and the codepages supported by fonts in use. + // + const tCodePointMap *pCodePointMapTable; + + // + //! The currently selected source text codepage. + // + uint16_t ui16Codepage; + + // + //! The number of entries in the pCodePointMapTable array. + // + uint8_t ui8NumCodePointMaps; + + // + //! The index of the codepoint map table entry which is currently in use + //! based on the selected source codepage and the current font. + // + uint8_t ui8CodePointMap; + + // + //! Reserved for future expansion. + // + uint8_t ui8Reserved; +#endif +} +tContext; + +//***************************************************************************** +// +//! Sets the background color to be used. +//! +//! \param psContext is a pointer to the drawing context to modify. +//! \param ui32Value is the 24-bit RGB color to be used. +//! +//! This function sets the background color to be used for drawing operations +//! in the specified drawing context. +//! +//! \return None. +// +//***************************************************************************** +#define GrContextBackgroundSet(psContext, ui32Value) \ + do \ + { \ + tContext *pC = psContext; \ + pC->ui32Background = DpyColorTranslate(pC->psDisplay, ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Sets the background color to be used. +//! +//! \param psContext is a pointer to the drawing context to modify. +//! \param ui32Value is the display driver-specific color to be used. +//! +//! This function sets the background color to be used for drawing operations +//! in the specified drawing context, using a color that has been previously +//! translated to a driver-specific color (for example, via +//! DpyColorTranslate()). +//! +//! \return None. +// +//***************************************************************************** +#define GrContextBackgroundSetTranslated(psContext, ui32Value) \ + do \ + { \ + tContext *pC = psContext; \ + pC->ui32Background = ui32Value; \ + } \ + while(0) + +//***************************************************************************** +// +//! Gets the width of the display being used by this drawing context. +//! +//! \param psContext is a pointer to the drawing context to query. +//! +//! This function returns the width of the display that is being used by this +//! drawing context. +//! +//! \return Returns the width of the display in pixels. +// +//***************************************************************************** +#define GrContextDpyWidthGet(psContext) \ + (DpyWidthGet((psContext)->psDisplay)) + +//***************************************************************************** +// +//! Gets the height of the display being used by this drawing context. +//! +//! \param psContext is a pointer to the drawing context to query. +//! +//! This function returns the height of the display that is being used by this +//! drawing context. +//! +//! \return Returns the height of the display in pixels. +// +//***************************************************************************** +#define GrContextDpyHeightGet(psContext) \ + (DpyHeightGet((psContext)->psDisplay)) + +#ifdef GRLIB_REMOVE_WIDE_FONT_SUPPORT +//***************************************************************************** +// +//! Sets the font to be used. +//! +//! \param psContext is a pointer to the drawing context to modify. +//! \param pFnt is a pointer to the font to be used. +//! +//! This function sets the font to be used for string drawing operations in the +//! specified drawing context. If a tFontEx type font is to be used, cast its +//! pointer to a psFont pointer before passing it as the pFnt parameter. +//! +//! \return None. +// +//***************************************************************************** +#define GrContextFontSet(psContext, pFnt) \ + do \ + { \ + tContext *pC = psContext; \ + const tFont *pF = pFnt; \ + pC->psFont = pF; \ + } \ + while(0) +#else +extern void GrContextFontSet(tContext *psContext, const tFont *pFnt); +#endif + +//***************************************************************************** +// +//! Sets the foreground color to be used. +//! +//! \param psContext is a pointer to the drawing context to modify. +//! \param ui32Value is the 24-bit RGB color to be used. +//! +//! This function sets the color to be used for drawing operations in the +//! specified drawing context. +//! +//! \return None. +// +//***************************************************************************** +#define GrContextForegroundSet(psContext, ui32Value) \ + do \ + { \ + tContext *pC = psContext; \ + pC->ui32Foreground = DpyColorTranslate(pC->psDisplay, ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Sets the foreground color to be used. +//! +//! \param psContext is a pointer to the drawing context to modify. +//! \param ui32Value is the display driver-specific color to be used. +//! +//! This function sets the foreground color to be used for drawing operations +//! in the specified drawing context, using a color that has been previously +//! translated to a driver-specific color (for example, via +//! DpyColorTranslate()). +//! +//! \return None. +// +//***************************************************************************** +#define GrContextForegroundSetTranslated(psContext, ui32Value) \ + do \ + { \ + tContext *pC = psContext; \ + pC->ui32Foreground = ui32Value; \ + } \ + while(0) + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param psContext is a pointer to the drawing context to use. +//! +//! This function flushes any cached drawing operations. For display drivers +//! that draw into a local frame buffer before writing to the actual display, +//! calling this function will cause the display to be updated to match the +//! contents of the local frame buffer. +//! +//! \return None. +// +//***************************************************************************** +#define GrFlush(psContext) \ + do \ + { \ + const tContext *pC = psContext; \ + DpyFlush(pC->psDisplay); \ + } \ + while(0) + +#ifdef GRLIB_REMOVE_WIDE_FONT_SUPPORT +//***************************************************************************** +// +//! Gets the baseline of a font. +//! +//! \param psFont is a pointer to the font to query. +//! +//! This function determines the baseline position of a font. The baseline is +//! the offset between the top of the font and the bottom of the capital +//! letters. The only font data that exists below the baseline are the +//! descenders on some lower-case letters (such as ``y''). +//! +//! \return Returns the baseline of the font, in pixels. +// +//***************************************************************************** +#define GrFontBaselineGet(psFont) \ + ((psFont)->ui8Baseline) + +//***************************************************************************** +// +//! Gets the height of a font. +//! +//! \param psFont is a pointer to the font to query. +//! +//! This function determines the height of a font. The height is the offset +//! between the top of the font and the bottom of the font, including any +//! ascenders and descenders. +//! +//! \return Returns the height of the font, in pixels. +// +//***************************************************************************** +#define GrFontHeightGet(psFont) \ + ((psFont)->ui8Height) + +//***************************************************************************** +// +//! Gets the maximum width of a font. +//! +//! \param psFont is a pointer to the font to query. +//! +//! This function determines the maximum width of a font. The maximum width is +//! the width of the widest individual character in the font. +//! +//! \return Returns the maximum width of the font, in pixels. +// +//***************************************************************************** +#define GrFontMaxWidthGet(psFont) \ + ((psFont)->ui8MaxWidth) +#endif + +//***************************************************************************** +// +//! Gets the number of colors in an image. +//! +//! \param pui8Image is a pointer to the image to query. +//! +//! This function determines the number of colors in the palette of an image. +//! This is only valid for 4bpp and 8bpp images; 1bpp images do not contain a +//! palette. +//! +//! \return Returns the number of colors in the image. +// +//***************************************************************************** +#define GrImageColorsGet(pui8Image) \ + (((uint8_t *)pui8Image)[5] + 1) + +//***************************************************************************** +// +//! Gets the height of an image. +//! +//! \param pui8Image is a pointer to the image to query. +//! +//! This function determines the height of an image in pixels. +//! +//! \return Returns the height of the image in pixels. +// +//***************************************************************************** +#define GrImageHeightGet(pui8Image) \ + (*(uint16_t *)(pui8Image + 3)) + +//***************************************************************************** +// +//! Gets the width of an image. +//! +//! \param pui8Image is a pointer to the image to query. +//! +//! This function determines the width of an image in pixels. +//! +//! \return Returns the width of the image in pixels. +// +//***************************************************************************** +#define GrImageWidthGet(pui8Image) \ + (*(uint16_t *)(pui8Image + 1)) + +//***************************************************************************** +// +//! Determines the size of the buffer for a 1 BPP off-screen image. +//! +//! \param i32Width is the width of the image in pixels. +//! \param i32Height is the height of the image in pixels. +//! +//! This function determines the size of the memory buffer required to hold a +//! 1 BPP off-screen image of the specified geometry. +//! +//! \return Returns the number of bytes required by the image. +// +//***************************************************************************** +#define GrOffScreen1BPPSize(i32Width, i32Height) \ + (5 + (((i32Width + 7) / 8) * i32Height)) + +//***************************************************************************** +// +//! Determines the size of the buffer for a 4 BPP off-screen image. +//! +//! \param i32Width is the width of the image in pixels. +//! \param i32Height is the height of the image in pixels. +//! +//! This function determines the size of the memory buffer required to hold a +//! 4 BPP off-screen image of the specified geometry. +//! +//! \return Returns the number of bytes required by the image. +// +//***************************************************************************** +#define GrOffScreen4BPPSize(i32Width, i32Height) \ + (6 + (16 * 3) + (((i32Width + 1) / 2) * i32Height)) + +//***************************************************************************** +// +//! Determines the size of the buffer for an 8 BPP off-screen image. +//! +//! \param i32Width is the width of the image in pixels. +//! \param i32Height is the height of the image in pixels. +//! +//! This function determines the size of the memory buffer required to hold an +//! 8 BPP off-screen image of the specified geometry. +//! +//! \return Returns the number of bytes required by the image. +// +//***************************************************************************** +#define GrOffScreen8BPPSize(i32Width, i32Height) \ + (6 + (256 * 3) + (i32Width * i32Height)) + +//***************************************************************************** +// +//! Draws a pixel. +//! +//! \param psContext is a pointer to the drawing context to use. +//! \param i32X is the X coordinate of the pixel. +//! \param i32Y is the Y coordinate of the pixel. +//! +//! This function draws a pixel if it resides within the clipping region. +//! +//! \return None. +// +//***************************************************************************** +#define GrPixelDraw(psContext, i32X, i32Y) \ + do \ + { \ + const tContext *pC = psContext; \ + if((i32X >= pC->sClipRegion.i16XMin) && \ + (i32X <= pC->sClipRegion.i16XMax) && \ + (i32Y >= pC->sClipRegion.i16YMin) && \ + (i32Y <= pC->sClipRegion.i16YMax)) \ + { \ + DpyPixelDraw(pC->psDisplay, i32X, i32Y, pC->ui32Foreground); \ + } \ + } \ + while(0) + +//***************************************************************************** +// +//! Gets the baseline of a string. +//! +//! \param psContext is a pointer to the drawing context to query. +//! +//! This function determines the baseline position of a string. The baseline +//! is the offset between the top of the string and the bottom of the capital +//! letters. The only string data that exists below the baseline are the +//! descenders on some lower-case letters (such as ``y''). +//! +//! \return Returns the baseline of the string, in pixels. +// +//***************************************************************************** +#define GrStringBaselineGet(psContext) \ + (GrFontBaselineGet((psContext)->psFont)) + +//***************************************************************************** +// +//! Draws a centered string. +//! +//! \param psContext is a pointer to the drawing context to use. +//! \param pcString is a pointer to the string to be drawn. +//! \param i32Length is the number of characters from the string that should be +//! drawn on the screen. +//! \param i32X is the X coordinate of the center of the string position on the +//! screen. +//! \param i32Y is the Y coordinate of the center of the string position on the +//! screen. +//! \param bOpaque is \b true if the background of each character should be +//! drawn and \b false if it should not (leaving the background as is). +//! +//! This function draws a string of test on the screen centered upon the +//! provided position. The \e i32Length parameter allows a portion of the +//! string to be examined without having to insert a NULL character at the +//! stopping point (which would not be possible if the string was located in +//! flash); specifying a length of -1 will cause the entire string to be +//! rendered (subject to clipping). +//! +//! \return None. +// +//***************************************************************************** +#define GrStringDrawCentered(psContext, pcString, i32Length, i32X, i32Y, \ + bOpaque) \ + do \ + { \ + const tContext *pC = psContext; \ + const char *pcStr = pcString; \ + \ + GrStringDraw(pC, pcStr, i32Length, \ + (i32X) - (GrStringWidthGet(pC, pcStr, \ + i32Length) / 2), \ + (i32Y) - (GrFontBaselineGet(pC->psFont) / 2), \ + bOpaque); \ + } \ + while(0) + +//***************************************************************************** +// +//! Gets the height of a string. +//! +//! \param psContext is a pointer to the drawing context to query. +//! +//! This function determines the height of a string. The height is the offset +//! between the top of the string and the bottom of the string, including any +//! ascenders and descenders. Note that this will not account for the case +//! where the string in question does not have any characters that use +//! descenders but the font in the drawing context does contain characters with +//! descenders. +//! +//! \return Returns the height of the string, in pixels. +// +//***************************************************************************** +#define GrStringHeightGet(psContext) \ + (GrFontHeightGet((psContext)->psFont)) + +//***************************************************************************** +// +//! Gets the maximum width of a character in a string. +//! +//! \param psContext is a pointer to the drawing context to query. +//! +//! This function determines the maximum width of a character in a string. The +//! maximum width is the width of the widest individual character in the font +//! used to render the string, which may be wider than the widest character +//! that is used to render a particular string. +//! +//! \return Returns the maximum width of a character in a string, in pixels. +// +//***************************************************************************** +#define GrStringMaxWidthGet(psContext) \ + (GrFontMaxWidthGet((psContext)->psFont)) + +//***************************************************************************** +// +// A set of color definitions. This set is the subset of the X11 colors (from +// rgb.txt) that are supported by typical web browsers. +// +//***************************************************************************** +#define ClrAliceBlue 0x00F0F8FF +#define ClrAntiqueWhite 0x00FAEBD7 +#define ClrAqua 0x0000FFFF +#define ClrAquamarine 0x007FFFD4 +#define ClrAzure 0x00F0FFFF +#define ClrBeige 0x00F5F5DC +#define ClrBisque 0x00FFE4C4 +#define ClrBlack 0x00000000 +#define ClrBlanchedAlmond 0x00FFEBCD +#define ClrBlue 0x000000FF +#define ClrBlueViolet 0x008A2BE2 +#define ClrBrown 0x00A52A2A +#define ClrBurlyWood 0x00DEB887 +#define ClrCadetBlue 0x005F9EA0 +#define ClrChartreuse 0x007FFF00 +#define ClrChocolate 0x00D2691E +#define ClrCoral 0x00FF7F50 +#define ClrCornflowerBlue 0x006495ED +#define ClrCornsilk 0x00FFF8DC +#define ClrCrimson 0x00DC143C +#define ClrCyan 0x0000FFFF +#define ClrDarkBlue 0x0000008B +#define ClrDarkCyan 0x00008B8B +#define ClrDarkGoldenrod 0x00B8860B +#define ClrDarkGray 0x00A9A9A9 +#define ClrDarkGreen 0x00006400 +#define ClrDarkKhaki 0x00BDB76B +#define ClrDarkMagenta 0x008B008B +#define ClrDarkOliveGreen 0x00556B2F +#define ClrDarkOrange 0x00FF8C00 +#define ClrDarkOrchid 0x009932CC +#define ClrDarkRed 0x008B0000 +#define ClrDarkSalmon 0x00E9967A +#define ClrDarkSeaGreen 0x008FBC8F +#define ClrDarkSlateBlue 0x00483D8B +#define ClrDarkSlateGray 0x002F4F4F +#define ClrDarkTurquoise 0x0000CED1 +#define ClrDarkViolet 0x009400D3 +#define ClrDeepPink 0x00FF1493 +#define ClrDeepSkyBlue 0x0000BFFF +#define ClrDimGray 0x00696969 +#define ClrDodgerBlue 0x001E90FF +#define ClrFireBrick 0x00B22222 +#define ClrFloralWhite 0x00FFFAF0 +#define ClrForestGreen 0x00228B22 +#define ClrFuchsia 0x00FF00FF +#define ClrGainsboro 0x00DCDCDC +#define ClrGhostWhite 0x00F8F8FF +#define ClrGold 0x00FFD700 +#define ClrGoldenrod 0x00DAA520 +#define ClrGray 0x00808080 +#define ClrGreen 0x00008000 +#define ClrGreenYellow 0x00ADFF2F +#define ClrHoneydew 0x00F0FFF0 +#define ClrHotPink 0x00FF69B4 +#define ClrIndianRed 0x00CD5C5C +#define ClrIndigo 0x004B0082 +#define ClrIvory 0x00FFFFF0 +#define ClrKhaki 0x00F0E68C +#define ClrLavender 0x00E6E6FA +#define ClrLavenderBlush 0x00FFF0F5 +#define ClrLawnGreen 0x007CFC00 +#define ClrLemonChiffon 0x00FFFACD +#define ClrLightBlue 0x00ADD8E6 +#define ClrLightCoral 0x00F08080 +#define ClrLightCyan 0x00E0FFFF +#define ClrLightGoldenrodYellow 0x00FAFAD2 +#define ClrLightGreen 0x0090EE90 +#define ClrLightGrey 0x00D3D3D3 +#define ClrLightPink 0x00FFB6C1 +#define ClrLightSalmon 0x00FFA07A +#define ClrLightSeaGreen 0x0020B2AA +#define ClrLightSkyBlue 0x0087CEFA +#define ClrLightSlateGray 0x00778899 +#define ClrLightSteelBlue 0x00B0C4DE +#define ClrLightYellow 0x00FFFFE0 +#define ClrLime 0x0000FF00 +#define ClrLimeGreen 0x0032CD32 +#define ClrLinen 0x00FAF0E6 +#define ClrMagenta 0x00FF00FF +#define ClrMaroon 0x00800000 +#define ClrMediumAquamarine 0x0066CDAA +#define ClrMediumBlue 0x000000CD +#define ClrMediumOrchid 0x00BA55D3 +#define ClrMediumPurple 0x009370DB +#define ClrMediumSeaGreen 0x003CB371 +#define ClrMediumSlateBlue 0x007B68EE +#define ClrMediumSpringGreen 0x0000FA9A +#define ClrMediumTurquoise 0x0048D1CC +#define ClrMediumVioletRed 0x00C71585 +#define ClrMidnightBlue 0x00191970 +#define ClrMintCream 0x00F5FFFA +#define ClrMistyRose 0x00FFE4E1 +#define ClrMoccasin 0x00FFE4B5 +#define ClrNavajoWhite 0x00FFDEAD +#define ClrNavy 0x00000080 +#define ClrOldLace 0x00FDF5E6 +#define ClrOlive 0x00808000 +#define ClrOliveDrab 0x006B8E23 +#define ClrOrange 0x00FFA500 +#define ClrOrangeRed 0x00FF4500 +#define ClrOrchid 0x00DA70D6 +#define ClrPaleGoldenrod 0x00EEE8AA +#define ClrPaleGreen 0x0098FB98 +#define ClrPaleTurquoise 0x00AFEEEE +#define ClrPaleVioletRed 0x00DB7093 +#define ClrPapayaWhip 0x00FFEFD5 +#define ClrPeachPuff 0x00FFDAB9 +#define ClrPeru 0x00CD853F +#define ClrPink 0x00FFC0CB +#define ClrPlum 0x00DDA0DD +#define ClrPowderBlue 0x00B0E0E6 +#define ClrPurple 0x00800080 +#define ClrRed 0x00FF0000 +#define ClrRosyBrown 0x00BC8F8F +#define ClrRoyalBlue 0x004169E1 +#define ClrSaddleBrown 0x008B4513 +#define ClrSalmon 0x00FA8072 +#define ClrSandyBrown 0x00F4A460 +#define ClrSeaGreen 0x002E8B57 +#define ClrSeashell 0x00FFF5EE +#define ClrSienna 0x00A0522D +#define ClrSilver 0x00C0C0C0 +#define ClrSkyBlue 0x0087CEEB +#define ClrSlateBlue 0x006A5ACD +#define ClrSlateGray 0x00708090 +#define ClrSnow 0x00FFFAFA +#define ClrSpringGreen 0x0000FF7F +#define ClrSteelBlue 0x004682B4 +#define ClrTan 0x00D2B48C +#define ClrTeal 0x00008080 +#define ClrThistle 0x00D8BFD8 +#define ClrTomato 0x00FF6347 +#define ClrTurquoise 0x0040E0D0 +#define ClrViolet 0x00EE82EE +#define ClrWheat 0x00F5DEB3 +#define ClrWhite 0x00FFFFFF +#define ClrWhiteSmoke 0x00F5F5F5 +#define ClrYellow 0x00FFFF00 +#define ClrYellowGreen 0x009ACD32 + +//***************************************************************************** +// +// Masks and shifts to aid in color format translation by drivers. +// +//***************************************************************************** +#define ClrRedMask 0x00FF0000 +#define ClrRedShift 16 +#define ClrGreenMask 0x0000FF00 +#define ClrGreenShift 8 +#define ClrBlueMask 0x000000FF +#define ClrBlueShift 0 + +//***************************************************************************** +// +// Prototypes for the predefined fonts in the graphics library. ..Cm.. is the +// computer modern font, which is a serif font. ..Cmsc.. is the computer +// modern small-caps font, which is also a serif font. ..Cmss.. is the +// computer modern sans-serif font. +// +//***************************************************************************** +extern const tFont g_sFontCm12; +#define g_psFontCm12 (const tFont *)&g_sFontCm12 +extern const tFont g_sFontCm12b; +#define g_pCm12b (const tFont *)&g_sFontCm12b +extern const tFont g_sFontCm12i; +#define g_psFontCm12i (const tFont *)&g_sFontCm12i +extern const tFont g_sFontCm14; +#define g_psFontCm14 (const tFont *)&g_sFontCm14 +extern const tFont g_sFontCm14b; +#define g_psFontCm14b (const tFont *)&g_sFontCm14b +extern const tFont g_sFontCm14i; +#define g_psFontCm14i (const tFont *)&g_sFontCm14i +extern const tFont g_sFontCm16; +#define g_psFontCm16 (const tFont *)&g_sFontCm16 +extern const tFont g_sFontCm16b; +#define g_psFontCm16b (const tFont *)&g_sFontCm16b +extern const tFont g_sFontCm16i; +#define g_psFontCm16i (const tFont *)&g_sFontCm16i +extern const tFont g_sFontCm18; +#define g_psFontCm18 (const tFont *)&g_sFontCm18 +extern const tFont g_sFontCm18b; +#define g_psFontCm18b (const tFont *)&g_sFontCm18b +extern const tFont g_sFontCm18i; +#define g_psFontCm18i (const tFont *)&g_sFontCm18i +extern const tFont g_sFontCm20; +#define g_psFontCm20 (const tFont *)&g_sFontCm20 +extern const tFont g_sFontCm20b; +#define g_psFontCm20b (const tFont *)&g_sFontCm20b +extern const tFont g_sFontCm20i; +#define g_psFontCm20i (const tFont *)&g_sFontCm20i +extern const tFont g_sFontCm22; +#define g_psFontCm22 (const tFont *)&g_sFontCm22 +extern const tFont g_sFontCm22b; +#define g_psFontCm22b (const tFont *)&g_sFontCm22b +extern const tFont g_sFontCm22i; +#define g_psFontCm22i (const tFont *)&g_sFontCm22i +extern const tFont g_sFontCm24; +#define g_psFontCm24 (const tFont *)&g_sFontCm24 +extern const tFont g_sFontCm24b; +#define g_psFontCm24b (const tFont *)&g_sFontCm24b +extern const tFont g_sFontCm24i; +#define g_psFontCm24i (const tFont *)&g_sFontCm24i +extern const tFont g_sFontCm26; +#define g_psFontCm26 (const tFont *)&g_sFontCm26 +extern const tFont g_sFontCm26b; +#define g_psFontCm26b (const tFont *)&g_sFontCm26b +extern const tFont g_sFontCm26i; +#define g_psFontCm26i (const tFont *)&g_sFontCm26i +extern const tFont g_sFontCm28; +#define g_psFontCm28 (const tFont *)&g_sFontCm28 +extern const tFont g_sFontCm28b; +#define g_psFontCm28b (const tFont *)&g_sFontCm28b +extern const tFont g_sFontCm28i; +#define g_psFontCm28i (const tFont *)&g_sFontCm28i +extern const tFont g_sFontCm30; +#define g_psFontCm30 (const tFont *)&g_sFontCm30 +extern const tFont g_sFontCm30b; +#define g_psFontCm30b (const tFont *)&g_sFontCm30b +extern const tFont g_sFontCm30i; +#define g_psFontCm30i (const tFont *)&g_sFontCm30i +extern const tFont g_sFontCm32; +#define g_psFontCm32 (const tFont *)&g_sFontCm32 +extern const tFont g_sFontCm32b; +#define g_psFontCm32b (const tFont *)&g_sFontCm32b +extern const tFont g_sFontCm32i; +#define g_psFontCm32i (const tFont *)&g_sFontCm32i +extern const tFont g_sFontCm34; +#define g_psFontCm34 (const tFont *)&g_sFontCm34 +extern const tFont g_sFontCm34b; +#define g_psFontCm34b (const tFont *)&g_sFontCm34b +extern const tFont g_sFontCm34i; +#define g_psFontCm34i (const tFont *)&g_sFontCm34i +extern const tFont g_sFontCm36; +#define g_psFontCm36 (const tFont *)&g_sFontCm36 +extern const tFont g_sFontCm36b; +#define g_psFontCm36b (const tFont *)&g_sFontCm36b +extern const tFont g_sFontCm36i; +#define g_psFontCm36i (const tFont *)&g_sFontCm36i +extern const tFont g_sFontCm38; +#define g_psFontCm38 (const tFont *)&g_sFontCm38 +extern const tFont g_sFontCm38b; +#define g_psFontCm38b (const tFont *)&g_sFontCm38b +extern const tFont g_sFontCm38i; +#define g_psFontCm38i (const tFont *)&g_sFontCm38i +extern const tFont g_sFontCm40; +#define g_psFontCm40 (const tFont *)&g_sFontCm40 +extern const tFont g_sFontCm40b; +#define g_psFontCm40b (const tFont *)&g_sFontCm40b +extern const tFont g_sFontCm40i; +#define g_psFontCm40i (const tFont *)&g_sFontCm40i +extern const tFont g_sFontCm42; +#define g_psFontCm42 (const tFont *)&g_sFontCm42 +extern const tFont g_sFontCm42b; +#define g_psFontCm42b (const tFont *)&g_sFontCm42b +extern const tFont g_sFontCm42i; +#define g_psFontCm42i (const tFont *)&g_sFontCm42i +extern const tFont g_sFontCm44; +#define g_psFontCm44 (const tFont *)&g_sFontCm44 +extern const tFont g_sFontCm44b; +#define g_psFontCm44b (const tFont *)&g_sFontCm44b +extern const tFont g_sFontCm44i; +#define g_psFontCm44i (const tFont *)&g_sFontCm44i +extern const tFont g_sFontCm46; +#define g_psFontCm46 (const tFont *)&g_sFontCm46 +extern const tFont g_sFontCm46b; +#define g_psFontCm46b (const tFont *)&g_sFontCm46b +extern const tFont g_sFontCm46i; +#define g_psFontCm46i (const tFont *)&g_sFontCm46i +extern const tFont g_sFontCm48; +#define g_psFontCm48 (const tFont *)&g_sFontCm48 +extern const tFont g_sFontCm48b; +#define g_psFontCm48b (const tFont *)&g_sFontCm48b +extern const tFont g_sFontCm48i; +#define g_psFontCm48i (const tFont *)&g_sFontCm48i +extern const tFont g_sFontCmsc12; +#define g_psFontCmsc12 (const tFont *)&g_sFontCmsc12 +extern const tFont g_sFontCmsc14; +#define g_psFontCmsc14 (const tFont *)&g_sFontCmsc14 +extern const tFont g_sFontCmsc16; +#define g_psFontCmsc16 (const tFont *)&g_sFontCmsc16 +extern const tFont g_sFontCmsc18; +#define g_psFontCmsc18 (const tFont *)&g_sFontCmsc18 +extern const tFont g_sFontCmsc20; +#define g_psFontCmsc20 (const tFont *)&g_sFontCmsc20 +extern const tFont g_sFontCmsc22; +#define g_psFontCmsc22 (const tFont *)&g_sFontCmsc22 +extern const tFont g_sFontCmsc24; +#define g_psFontCmsc24 (const tFont *)&g_sFontCmsc24 +extern const tFont g_sFontCmsc26; +#define g_psFontCmsc26 (const tFont *)&g_sFontCmsc26 +extern const tFont g_sFontCmsc28; +#define g_psFontCmsc28 (const tFont *)&g_sFontCmsc28 +extern const tFont g_sFontCmsc30; +#define g_psFontCmsc30 (const tFont *)&g_sFontCmsc30 +extern const tFont g_sFontCmsc32; +#define g_psFontCmsc32 (const tFont *)&g_sFontCmsc32 +extern const tFont g_sFontCmsc34; +#define g_psFontCmsc34 (const tFont *)&g_sFontCmsc34 +extern const tFont g_sFontCmsc36; +#define g_psFontCmsc36 (const tFont *)&g_sFontCmsc36 +extern const tFont g_sFontCmsc38; +#define g_psFontCmsc38 (const tFont *)&g_sFontCmsc38 +extern const tFont g_sFontCmsc40; +#define g_psFontCmsc40 (const tFont *)&g_sFontCmsc40 +extern const tFont g_sFontCmsc42; +#define g_psFontCmsc42 (const tFont *)&g_sFontCmsc42 +extern const tFont g_sFontCmsc44; +#define g_psFontCmsc44 (const tFont *)&g_sFontCmsc44 +extern const tFont g_sFontCmsc46; +#define g_psFontCmsc46 (const tFont *)&g_sFontCmsc46 +extern const tFont g_sFontCmsc48; +#define g_psFontCmsc48 (const tFont *)&g_sFontCmsc48 +extern const tFont g_sFontCmss12; +#define g_psFontCmss12 (const tFont *)&g_sFontCmss12 +extern const tFont g_sFontCmss12b; +#define g_psFontCmss12b (const tFont *)&g_sFontCmss12b +extern const tFont g_sFontCmss12i; +#define g_psFontCmss12i (const tFont *)&g_sFontCmss12i +extern const tFont g_sFontCmss14; +#define g_psFontCmss14 (const tFont *)&g_sFontCmss14 +extern const tFont g_sFontCmss14b; +#define g_psFontCmss14b (const tFont *)&g_sFontCmss14b +extern const tFont g_sFontCmss14i; +#define g_psFontCmss14i (const tFont *)&g_sFontCmss14i +extern const tFont g_sFontCmss16; +#define g_psFontCmss16 (const tFont *)&g_sFontCmss16 +extern const tFont g_sFontCmss16b; +#define g_psFontCmss16b (const tFont *)&g_sFontCmss16b +extern const tFont g_sFontCmss16i; +#define g_psFontCmss16i (const tFont *)&g_sFontCmss16i +extern const tFont g_sFontCmss18; +#define g_psFontCmss18 (const tFont *)&g_sFontCmss18 +extern const tFont g_sFontCmss18b; +#define g_psFontCmss18b (const tFont *)&g_sFontCmss18b +extern const tFont g_sFontCmss18i; +#define g_psFontCmss18i (const tFont *)&g_sFontCmss18i +extern const tFont g_sFontCmss20; +#define g_psFontCmss20 (const tFont *)&g_sFontCmss20 +extern const tFont g_sFontCmss20b; +#define g_psFontCmss20b (const tFont *)&g_sFontCmss20b +extern const tFont g_sFontCmss20i; +#define g_psFontCmss20i (const tFont *)&g_sFontCmss20i +extern const tFont g_sFontCmss22; +#define g_psFontCmss22 (const tFont *)&g_sFontCmss22 +extern const tFont g_sFontCmss22b; +#define g_psFontCmss22b (const tFont *)&g_sFontCmss22b +extern const tFont g_sFontCmss22i; +#define g_psFontCmss22i (const tFont *)&g_sFontCmss22i +extern const tFont g_sFontCmss24; +#define g_psFontCmss24 (const tFont *)&g_sFontCmss24 +extern const tFont g_sFontCmss24b; +#define g_psFontCmss24b (const tFont *)&g_sFontCmss24b +extern const tFont g_sFontCmss24i; +#define g_psFontCmss24i (const tFont *)&g_sFontCmss24i +extern const tFont g_sFontCmss26; +#define g_psFontCmss26 (const tFont *)&g_sFontCmss26 +extern const tFont g_sFontCmss26b; +#define g_psFontCmss26b (const tFont *)&g_sFontCmss26b +extern const tFont g_sFontCmss26i; +#define g_psFontCmss26i (const tFont *)&g_sFontCmss26i +extern const tFont g_sFontCmss28; +#define g_psFontCmss28 (const tFont *)&g_sFontCmss28 +extern const tFont g_sFontCmss28b; +#define g_psFontCmss28b (const tFont *)&g_sFontCmss28b +extern const tFont g_sFontCmss28i; +#define g_psFontCmss28i (const tFont *)&g_sFontCmss28i +extern const tFont g_sFontCmss30; +#define g_psFontCmss30 (const tFont *)&g_sFontCmss30 +extern const tFont g_sFontCmss30b; +#define g_psFontCmss30b (const tFont *)&g_sFontCmss30b +extern const tFont g_sFontCmss30i; +#define g_psFontCmss30i (const tFont *)&g_sFontCmss30i +extern const tFont g_sFontCmss32; +#define g_psFontCmss32 (const tFont *)&g_sFontCmss32 +extern const tFont g_sFontCmss32b; +#define g_psFontCmss32b (const tFont *)&g_sFontCmss32b +extern const tFont g_sFontCmss32i; +#define g_psFontCmss32i (const tFont *)&g_sFontCmss32i +extern const tFont g_sFontCmss34; +#define g_psFontCmss34 (const tFont *)&g_sFontCmss34 +extern const tFont g_sFontCmss34b; +#define g_psFontCmss34b (const tFont *)&g_sFontCmss34b +extern const tFont g_sFontCmss34i; +#define g_psFontCmss34i (const tFont *)&g_sFontCmss34i +extern const tFont g_sFontCmss36; +#define g_psFontCmss36 (const tFont *)&g_sFontCmss36 +extern const tFont g_sFontCmss36b; +#define g_psFontCmss36b (const tFont *)&g_sFontCmss36b +extern const tFont g_sFontCmss36i; +#define g_psFontCmss36i (const tFont *)&g_sFontCmss36i +extern const tFont g_sFontCmss38; +#define g_psFontCmss38 (const tFont *)&g_sFontCmss38 +extern const tFont g_sFontCmss38b; +#define g_psFontCmss38b (const tFont *)&g_sFontCmss38b +extern const tFont g_sFontCmss38i; +#define g_psFontCmss38i (const tFont *)&g_sFontCmss38i +extern const tFont g_sFontCmss40; +#define g_psFontCmss40 (const tFont *)&g_sFontCmss40 +extern const tFont g_sFontCmss40b; +#define g_psFontCmss40b (const tFont *)&g_sFontCmss40b +extern const tFont g_sFontCmss40i; +#define g_psFontCmss40i (const tFont *)&g_sFontCmss40i +extern const tFont g_sFontCmss42; +#define g_psFontCmss42 (const tFont *)&g_sFontCmss42 +extern const tFont g_sFontCmss42b; +#define g_psFontCmss42b (const tFont *)&g_sFontCmss42b +extern const tFont g_sFontCmss42i; +#define g_psFontCmss42i (const tFont *)&g_sFontCmss42i +extern const tFont g_sFontCmss44; +#define g_psFontCmss44 (const tFont *)&g_sFontCmss44 +extern const tFont g_sFontCmss44b; +#define g_psFontCmss44b (const tFont *)&g_sFontCmss44b +extern const tFont g_sFontCmss44i; +#define g_psFontCmss44i (const tFont *)&g_sFontCmss44i +extern const tFont g_sFontCmss46; +#define g_psFontCmss46 (const tFont *)&g_sFontCmss46 +extern const tFont g_sFontCmss46b; +#define g_psFontCmss46b (const tFont *)&g_sFontCmss46b +extern const tFont g_sFontCmss46i; +#define g_psFontCmss46i (const tFont *)&g_sFontCmss46i +extern const tFont g_sFontCmss48; +#define g_psFontCmss48 (const tFont *)&g_sFontCmss48 +extern const tFont g_sFontCmss48b; +#define g_psFontCmss48b (const tFont *)&g_sFontCmss48b +extern const tFont g_sFontCmss48i; +#define g_psFontCmss48i (const tFont *)&g_sFontCmss48i +extern const tFont g_sFontCmtt12; +#define g_psFontCmtt12 (const tFont *)&g_sFontCmtt12 +extern const tFont g_sFontCmtt14; +#define g_psFontCmtt14 (const tFont *)&g_sFontCmtt14 +extern const tFont g_sFontCmtt16; +#define g_psFontCmtt16 (const tFont *)&g_sFontCmtt16 +extern const tFont g_sFontCmtt18; +#define g_psFontCmtt18 (const tFont *)&g_sFontCmtt18 +extern const tFont g_sFontCmtt20; +#define g_psFontCmtt20 (const tFont *)&g_sFontCmtt20 +extern const tFont g_sFontCmtt22; +#define g_psFontCmtt22 (const tFont *)&g_sFontCmtt22 +extern const tFont g_sFontCmtt24; +#define g_psFontCmtt24 (const tFont *)&g_sFontCmtt24 +extern const tFont g_sFontCmtt26; +#define g_psFontCmtt26 (const tFont *)&g_sFontCmtt26 +extern const tFont g_sFontCmtt28; +#define g_psFontCmtt28 (const tFont *)&g_sFontCmtt28 +extern const tFont g_sFontCmtt30; +#define g_psFontCmtt30 (const tFont *)&g_sFontCmtt30 +extern const tFont g_sFontCmtt32; +#define g_psFontCmtt32 (const tFont *)&g_sFontCmtt32 +extern const tFont g_sFontCmtt34; +#define g_psFontCmtt34 (const tFont *)&g_sFontCmtt34 +extern const tFont g_sFontCmtt36; +#define g_psFontCmtt36 (const tFont *)&g_sFontCmtt36 +extern const tFont g_sFontCmtt38; +#define g_psFontCmtt38 (const tFont *)&g_sFontCmtt38 +extern const tFont g_sFontCmtt40; +#define g_psFontCmtt40 (const tFont *)&g_sFontCmtt40 +extern const tFont g_sFontCmtt42; +#define g_psFontCmtt42 (const tFont *)&g_sFontCmtt42 +extern const tFont g_sFontCmtt44; +#define g_psFontCmtt44 (const tFont *)&g_sFontCmtt44 +extern const tFont g_sFontCmtt46; +#define g_psFontCmtt46 (const tFont *)&g_sFontCmtt46 +extern const tFont g_sFontCmtt48; +#define g_psFontCmtt48 (const tFont *)&g_sFontCmtt48 +extern const tFont g_sFontFixed6x8; +#define g_psFontFixed6x8 (const tFont *)&g_sFontFixed6x8 + +//***************************************************************************** +// +// Language identifiers supported by the string table processing functions. +// +//***************************************************************************** +#define GrLangZhPRC 0x0804 // Chinese (PRC) +#define GrLangZhTW 0x0404 // Chinese (Taiwan) +#define GrLangEnUS 0x0409 // English (United States) +#define GrLangEnUK 0x0809 // English (United Kingdom) +#define GrLangEnAUS 0x0C09 // English (Australia) +#define GrLangEnCA 0x1009 // English (Canada) +#define GrLangEnNZ 0x1409 // English (New Zealand) +#define GrLangFr 0x040C // French (Standard) +#define GrLangDe 0x0407 // German (Standard) +#define GrLangHi 0x0439 // Hindi +#define GrLangIt 0x0410 // Italian (Standard) +#define GrLangJp 0x0411 // Japanese +#define GrLangKo 0x0412 // Korean +#define GrLangEsMX 0x080A // Spanish (Mexico) +#define GrLangEsSP 0x0C0A // Spanish (Spain) +#define GrLangSwKE 0x0441 // Swahili (Kenya) +#define GrLangUrIN 0x0820 // Urdu (India) +#define GrLangUrPK 0x0420 // Urdu (Pakistan) + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param ui32Value is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +#define DpyColorTranslate(psDisplay, ui32Value) \ + ((psDisplay)->pfnColorTranslate((psDisplay)->pvDisplayData, ui32Value)) + +//***************************************************************************** +// +//! Flushes cached drawing operations. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! +//! This function flushes any cached drawing operations on a display. +//! +//! \return None. +// +//***************************************************************************** +#define DpyFlush(psDisplay) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnFlush(pD->pvDisplayData); \ + } \ + while(0) + +//***************************************************************************** +// +//! Gets the height of the display. +//! +//! \param psDisplay is a pointer to the display driver structure for the +//! display to query. +//! +//! This function determines the height of the display. +//! +//! \return Returns the height of the display in pixels. +// +//***************************************************************************** +#define DpyHeightGet(psDisplay) \ + ((psDisplay)->ui16Height) + +//***************************************************************************** +// +//! Draws a horizontal line on a display. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param i32X1 is the starting X coordinate of the line. +//! \param i32X2 is the ending X coordinate of the line. +//! \param i32Y is the Y coordinate of the line. +//! \param ui32Value is the color to draw the line. +//! +//! This function draws a horizontal line on a display. This assumes that +//! clipping has already been performed, and that both end points of the line +//! are within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +#define DpyLineDrawH(psDisplay, i32X1, i32X2, i32Y, ui32Value) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnLineDrawH(pD->pvDisplayData, i32X1, i32X2, i32Y, \ + ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Draws a vertical line on a display. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param i32X is the X coordinate of the line. +//! \param i32Y1 is the starting Y coordinate of the line. +//! \param i32Y2 is the ending Y coordinate of the line. +//! \param ui32Value is the color to draw the line. +//! +//! This function draws a vertical line on a display. This assumes that +//! clipping has already been performed, and that both end points of the line +//! are within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +#define DpyLineDrawV(psDisplay, i32X, i32Y1, i32Y2, ui32Value) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnLineDrawV(pD->pvDisplayData, i32X, i32Y1, i32Y2, \ + ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Draws a pixel on a display. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param i32X is the X coordinate of the pixel. +//! \param i32Y is the Y coordinate of the pixel. +//! \param ui32Value is the color to draw the pixel. +//! +//! This function draws a pixel on a display. This assumes that clipping has +//! already been performed. +//! +//! \return None. +// +//***************************************************************************** +#define DpyPixelDraw(psDisplay, i32X, i32Y, ui32Value) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnPixelDraw(pD->pvDisplayData, i32X, i32Y, ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on a display. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param i32X is the X coordinate of the first pixel. +//! \param i32Y is the Y coordinate of the first pixel. +//! \param i32X0 is sub-pixel offset within the pixel data, which is valid for +//! 1 or 4 bit per pixel formats. +//! \param i32Count is the number of pixels to draw. +//! \param i32BPP is the number of bits per pixel; must be 1, 4, or 8. +//! \param pui8Data is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pui8Palette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on a display, using the +//! supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +#define DpyPixelDrawMultiple(psDisplay, i32X, i32Y, i32X0, i32Count, i32BPP, \ + pui8Data, pui8Palette) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnPixelDrawMultiple(pD->pvDisplayData, i32X, i32Y, i32X0, \ + i32Count, i32BPP, pui8Data, \ + pui8Palette); \ + } \ + while(0) + +//***************************************************************************** +// +//! Fills a rectangle on a display. +//! +//! \param psDisplay is the pointer to the display driver structure for the +//! display to operate upon. +//! \param psRect is a pointer to the structure describing the rectangle to +//! fill. +//! \param ui32Value is the color to fill the rectangle. +//! +//! This function fills a rectangle on the display. This assumes that clipping +//! has already been performed, and that all sides of the rectangle are within +//! the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +#define DpyRectFill(psDisplay, psRect, ui32Value) \ + do \ + { \ + const tDisplay *pD = psDisplay; \ + pD->pfnRectFill(pD->pvDisplayData, psRect, ui32Value); \ + } \ + while(0) + +//***************************************************************************** +// +//! Gets the width of the display. +//! +//! \param psDisplay is a pointer to the display driver structure for the +//! display to query. +//! +//! This function determines the width of the display. +//! +//! \return Returns the width of the display in pixels. +// +//***************************************************************************** +#define DpyWidthGet(psDisplay) \ + ((psDisplay)->ui16Width) + +//***************************************************************************** +// +//! Determines if a point lies within a given rectangle. +//! +//! \param psRect is a pointer to the rectangle which the point is to be checked +//! against. +//! \param i32X is the X coordinate of the point to be checked. +//! \param i32Y is the Y coordinate of the point to be checked. +//! +//! This function determines whether point (i32X, i32Y) lies within the +//! rectangle described by \e psRect. +//! +//! \return Returns 1 if the point is within the rectangle or 0 otherwise. +// +//***************************************************************************** +#define GrRectContainsPoint(psRect, i32X, i32Y) \ + ((((i32X) >= (psRect)->i16XMin) && ((i32X) <= (psRect)->i16XMax) && \ + ((i32Y) >= (psRect)->i16YMin) && ((i32Y) <= (psRect)->i16YMax)) ? \ + 1 : 0) + +//***************************************************************************** +// +// Counts the number of zeros at the start of a word. +// +// \param x is the word whose leading zeros are to be counted. +// +// This macro uses compiler-specific constructs to perform an inline +// insertion of the "clz" instruction, which counts the leading zeros +// directly. +// +// \return Returns the number of leading 0 bits in the word provided. +// +//***************************************************************************** +#if defined(ewarm) +#include +#define NumLeadingZeros(x) __CLZ(x) +#endif +#if defined(codered) || defined(gcc) || defined(sourcerygxx) +#define NumLeadingZeros(x) __extension__ \ + ({ \ + register uint32_t __ret, __inp = x; \ + __asm__("clz %0, %1" : "=r" (__ret) : "r" (__inp)); \ + __ret; \ + }) +#endif +#if defined(rvmdk) || defined(__ARMCC_VERSION) +#define NumLeadingZeros(x) __clz(x) +#endif +#if defined(ccs) +// +// The CCS/TI compiler _norm intrinsic function will generate an inline CLZ +// instruction. +// +#define NumLeadingZeros(x) _norm(x) +#endif + +//***************************************************************************** +// +// Prototypes for the graphics library functions. +// +//***************************************************************************** +#ifndef GRLIB_REMOVE_WIDE_FONT_SUPPORT +extern void GrLibInit(const tGrLibDefaults *pDefaults); +#endif +extern void GrCircleDraw(const tContext *psContext, int32_t i32X, int32_t i32Y, + int32_t i32Radius); +extern void GrCircleFill(const tContext *psContext, int32_t i32X, int32_t i32Y, + int32_t i32Radius); +extern void GrContextClipRegionSet(tContext *psContext, tRectangle *psRect); +extern void GrContextInit(tContext *psContext, const tDisplay *psDisplay); +extern void GrImageDraw(const tContext *psContext, + const uint8_t *pui8Image, int32_t i32X, int32_t i32Y); +extern void GrTransparentImageDraw(const tContext *psContext, + const uint8_t *pui8Image, + int32_t i32X, int32_t i32Y, + uint32_t ui32Transparent); +extern void GrLineDraw(const tContext *psContext, int32_t i32X1, int32_t i32Y1, + int32_t i32X2, int32_t i32Y2); +extern void GrLineDrawH(const tContext *psContext, int32_t i32X1, int32_t i32X2, + int32_t i32Y); +extern void GrLineDrawV(const tContext *psContext, int32_t i32X, int32_t i32Y1, + int32_t i32Y2); +extern void GrOffScreen1BPPInit(tDisplay *psDisplay, uint8_t *pui8Image, + int32_t i32Width, int32_t i32Height); +extern void GrOffScreen4BPPInit(tDisplay *psDisplay, uint8_t *pui8Image, + int32_t i32Width, int32_t i32Height); +extern void GrOffScreen4BPPPaletteSet(tDisplay *psDisplay, + uint32_t *pui32Palette, + uint32_t ui32Offset, + uint32_t ui32Count); +extern void GrOffScreen8BPPInit(tDisplay *psDisplay, uint8_t *pui8Image, + int32_t i32Width, int32_t i32Height); +extern void GrOffScreen8BPPPaletteSet(tDisplay *psDisplay, + uint32_t *pui32Palette, + uint32_t ui32Offset, + uint32_t ui32Count); +extern void GrRectDraw(const tContext *psContext, const tRectangle *psRect); +extern void GrRectFill(const tContext *psContext, const tRectangle *psRect); +extern void GrStringDraw(const tContext *psContext, const char *pcString, + int32_t i32Length, int32_t i32X, int32_t i32Y, + uint32_t bOpaque); +extern int32_t GrStringWidthGet(const tContext *psContext, const char *pcString, + int32_t i32Length); +extern void GrStringTableSet(const void *pvTable); +uint32_t GrStringLanguageSet(uint16_t ui16LangID); +uint32_t GrStringGet(int32_t i32Index, char *pcData, uint32_t ui32Size); +extern int32_t GrRectOverlapCheck(tRectangle *psRect1, tRectangle *psRect2); +extern int32_t GrRectIntersectGet(tRectangle *psRect1, tRectangle *psRect2, + tRectangle *psIntersect); + +#ifndef GRLIB_REMOVE_WIDE_FONT_SUPPORT +//***************************************************************************** +// +// Font parsing functions. +// +//***************************************************************************** +extern void GrFontInfoGet(const tFont *psFont, uint8_t *pui8Format, + uint8_t *pui8MaxWidth, uint8_t *pui8Height, + uint8_t *pui8Baseline); +extern uint32_t GrFontMaxWidthGet(const tFont *psFont); +extern uint32_t GrFontHeightGet(const tFont *psFont); +extern uint32_t GrFontBaselineGet(const tFont *psFont); +extern const uint8_t *GrFontGlyphDataGet(const tFont *psFont, + uint32_t ui32CodePoint, + uint8_t *pui8Width); +extern uint16_t GrFontCodepageGet(const tFont *psFont); +extern uint16_t GrFontNumBlocksGet(const tFont *psFont); +extern uint32_t GrFontBlockCodepointsGet(const tFont *psFont, + uint16_t ui16BlockIndex, + uint32_t *pui32Start); + +//***************************************************************************** +// +// Low level string and font glyph rendering function. +// +//***************************************************************************** +void GrFontGlyphRender(const tContext *psContext, const uint8_t *pui8Data, + int32_t i32X, int32_t i32Y, bool bCompressed, + bool bOpaque); +void +GrDefaultStringRenderer(const tContext *psContext, const char *pcString, + int32_t i32Length, int32_t i32X, int32_t i32Y, + bool bOpaque); + +//***************************************************************************** +// +// Codepage translation functions. +// +//***************************************************************************** +extern void GrCodepageMapTableSet(tContext *psContext, + tCodePointMap *pCodePointMapTable, + uint8_t ui8NumMaps); +extern int32_t GrStringCodepageSet(tContext *psContext, + uint16_t ui16Codepage); +extern uint32_t GrStringRendererSet(tContext *psContext, + tStringRenderer pfnRenderer); +extern uint32_t GrStringNumGlyphsGet(const tContext *psContext, + const char *pcString); +extern uint32_t GrStringNextCharGet(const tContext *psContext, + const char *pcString, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapUnicode_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapUTF8_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapUTF16LE_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapUTF16BE_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_1_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_2_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_3_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_4_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_5_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_6_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_7_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_8_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_9_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_10_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_11_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_13_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_14_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_15_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapISO8859_16_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapWIN1250_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapWIN1251_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapWIN1252_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapWIN1253_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); +extern uint32_t GrMapWIN1254_Unicode(const char *pcSrcChar, + uint32_t ui32Count, + uint32_t *pui32Skip); + +//***************************************************************************** +// +// A helpful #define that maps any 8 bit source codepage to itself. This can +// be used for any 8 bit source encoding when the font being used is encoded +// using the same codepage, for example ISO8859-5 text with an ISO8859-5 font. +// It just so happens that the ISO8859-1 to Unicode mapping function provides +// exactly what is required here since there is a 1:1 mapping of ISO8859-1 +// codepoints to the first 256 Unicode characters. +// +//***************************************************************************** +#define GrMap8BitIdentity GrMapISO8859_1_Unicode + +#endif + +//***************************************************************************** +// +// Mark the end of the C bindings section for C++ compilers. +// +//***************************************************************************** +#ifdef __cplusplus +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + +#endif // __GRLIB_H__ -- cgit v1.3.1