517 lines
21 KiB
C
517 lines
21 KiB
C
//****************************************************************************
|
|
//
|
|
// XBox font library
|
|
//
|
|
//****************************************************************************
|
|
|
|
// NOTE: You need to #define "XFONT_TRUETYPE" before including this
|
|
// : file if you're planning on using the TypeType font scaler. This
|
|
// : really should be a rare case and using it does bring in a whole
|
|
// : wad of code.
|
|
|
|
#pragma once
|
|
|
|
// The errors returned from these methods are generally fatal. Close the
|
|
// current font if you get one.
|
|
|
|
//****************************************************************************
|
|
// Structure definitions.
|
|
//****************************************************************************
|
|
|
|
typedef struct IDirect3DSurface8 IDirect3DSurface8;
|
|
|
|
//============================================================================
|
|
// An opaque structure which holds an active font. The consumer can get
|
|
// and set this structure to allow it to use multiple fonts without
|
|
// unloading them.
|
|
//============================================================================
|
|
|
|
typedef struct XFONT XFONT;
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
struct XFONT
|
|
{
|
|
void __stdcall AddRef();
|
|
void __stdcall Release();
|
|
|
|
unsigned __stdcall GetTextHeight();
|
|
HRESULT __stdcall SetTextHeight(unsigned uHeight);
|
|
|
|
unsigned __stdcall GetTextAntialiasLevel();
|
|
HRESULT __stdcall SetTextAntialiasLevel(unsigned uAntialiasLevel);
|
|
|
|
unsigned __stdcall GetRLEWidth();
|
|
HRESULT __stdcall SetRLEWidth(unsigned uRLEWidth);
|
|
|
|
unsigned __stdcall GetTextStyle();
|
|
HRESULT __stdcall SetTextStyle(unsigned uStyle);
|
|
|
|
unsigned __stdcall GetTextAlignment();
|
|
void __stdcall SetTextAlignment(unsigned uMode);
|
|
|
|
D3DCOLOR __stdcall GetTextColor();
|
|
void __stdcall SetTextColor(D3DCOLOR color);
|
|
|
|
D3DCOLOR __stdcall GetBkColor();
|
|
void __stdcall SetBkColor(D3DCOLOR color);
|
|
|
|
int __stdcall GetBkMode();
|
|
void __stdcall SetBkMode(int iBkMode);
|
|
|
|
unsigned __stdcall GetIntercharacterSpacing();
|
|
void __stdcall SetIntercharacterSpacing(unsigned uSpaces);
|
|
|
|
D3DRECT *__stdcall GetClippingRectangle();
|
|
void __stdcall SetClippingRectangle(D3DRECT *pRectangle);
|
|
|
|
void __stdcall GetFontMetrics(unsigned *puCellHeight, unsigned *puDescent);
|
|
HRESULT __stdcall GetTextExtent(LPCWSTR wstr, unsigned cch, unsigned *puWidth);
|
|
HRESULT __stdcall TextOutToMemory(LPCVOID pBits, unsigned Pitch, unsigned Width, unsigned Height, D3DFORMAT Format, LPCWSTR wstr, unsigned cch, long x, long y);
|
|
HRESULT __stdcall TextOut(IDirect3DSurface8 *pSurface, LPCWSTR wstr, unsigned cch, long x, long y);
|
|
};
|
|
|
|
#endif !defined(__cplusplus)
|
|
|
|
//****************************************************************************
|
|
// The APIs
|
|
//****************************************************************************
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif !defined(__cplusplus)
|
|
|
|
//============================================================================
|
|
// Loads a bitmap font of the format defined in xfontformat.h from a file.
|
|
//
|
|
// This method always allocates ~112 bytes for each font to store the
|
|
// font's state. Additional memory will be allocated depending on the
|
|
// value of the uCacheSize parameter:
|
|
//
|
|
// 0 - an allocation to hold the bitmap for the
|
|
// last drawn glyph. The glyph information
|
|
// is ready directly out of the file as
|
|
// each glyph is drawn. Very slow.
|
|
//
|
|
// uCacheSize < font file size - a block of memory of size uCacheSize
|
|
// holds the most recently drawn glyphs.
|
|
// The glyph information is ready directly
|
|
// out of the file. This can perform
|
|
// reasonably if the cache is sized
|
|
// correctly via experimentation.
|
|
//
|
|
// uCacheSize >= font file size - a block of memory just large enough to
|
|
// hold the contents of the file will be
|
|
// allocated and the entire font file will
|
|
// be loaded into it. Very fast.
|
|
//
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_OpenBitmapFont
|
|
(
|
|
LPCWSTR wszFileName, // [in] The file name of the font
|
|
unsigned uCacheSize, // [in] The size of the font cache, in bytes.
|
|
XFONT **ppFont // [out] The font identifier
|
|
);
|
|
|
|
//============================================================================
|
|
// Loads a bitmap font of the format defined in xfontformat.h from a block
|
|
// of memory, either one that has been loaded into memory by the caller
|
|
// or one that is compiled into the title from a source code file
|
|
// generated by makefont.exe.
|
|
//
|
|
// This method always allocates ~112 bytes for each font to store the font's
|
|
// current state. No additional memory will be allocated throughout the
|
|
// lifetime of the font.
|
|
//
|
|
// The caller must ensure that the memory block that contains the font data
|
|
// will live at least as long as the font as it will keep referencing that
|
|
// data when it draws.
|
|
//
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_OpenBitmapFontFromMemory
|
|
(
|
|
CONST void *pFontData, // [in] The block of font data
|
|
unsigned uFontDataSize, // [in] The size of the font data
|
|
XFONT **ppFont // [out] The font identifier
|
|
);
|
|
|
|
//============================================================================
|
|
// Loads the default bitmap font that is compiled directy into the library.
|
|
// This is a 24 pixel hight= arial font the contains only the western
|
|
// character set and is intended as a convenience for titles that just need a
|
|
// quick way of displaying information.
|
|
//
|
|
// This will also allocate ~112 bytes of memory each time this method is
|
|
// called but will never allocate any more memory throughout the lifetime
|
|
// of the font.
|
|
//
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_OpenDefaultFont
|
|
(
|
|
XFONT **ppFont // [out] The font identifier
|
|
);
|
|
|
|
#if defined(XFONT_TRUETYPE)
|
|
|
|
//============================================================================
|
|
// Load a TrueType font into the scan converter.
|
|
//
|
|
// This call will use more memory than just the the cache because the
|
|
// TrueType scan converter needs a bit of workspace to process the font. If
|
|
// memory is a concern, use a bitmap font instead.
|
|
//
|
|
// This automatically sets the opened font as the one that is currently
|
|
// active. The attributes of the font are all set to their defaults.
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_OpenTrueTypeFont
|
|
(
|
|
LPCWSTR wszFileName, // [in] The path name to the font
|
|
unsigned uCacheSize, // [in] The size of the font cache, in bytes.
|
|
XFONT **ppFont // [out] The font identifier
|
|
);
|
|
|
|
#endif
|
|
|
|
//============================================================================
|
|
// Add a refcount to the font.
|
|
//============================================================================
|
|
|
|
void __stdcall XFONT_AddRef
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
//============================================================================
|
|
// Unload a font and free all of its memory. The XFONT identifier will be
|
|
// invalidated.
|
|
//============================================================================
|
|
|
|
void __stdcall XFONT_Release
|
|
(
|
|
XFONT *pXFont // [in] The id of the font to unload
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the height of the text cell, in pixels, for the current font.
|
|
//
|
|
// Defaults to 16 pixels high. This may only be set on a TrueType font.
|
|
//============================================================================
|
|
|
|
unsigned __stdcall XFONT_GetTextHeight
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
HRESULT __stdcall XFONT_SetTextHeight
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uHeight // [in] The total height of the text cell
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the amount of antialias information to include in the bitmap with
|
|
// valid values of 0 (no information), 2, or 4 (lots of information).
|
|
//
|
|
// The antialiasing works best for larger or bold fonts whose strokes are
|
|
// more the one pixel wide.
|
|
//
|
|
// This may only be set on a TrueType font. Defaults to 0.
|
|
//============================================================================
|
|
|
|
unsigned __stdcall XFONT_GetTextAntialiasLevel
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
HRESULT __stdcall XFONT_SetTextAntialiasLevel
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uAntialiasLevel
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the size of the RLE packet used to compress the internal bitmaps
|
|
// used by the font. This may effect the number of bitmaps that can fit
|
|
// in the internal cache depending on the size and characteristics of your
|
|
// font. May be 2-8.
|
|
//
|
|
// This may only be set on a TrueType font. Defaults to 2.
|
|
//============================================================================
|
|
|
|
unsigned __stdcall XFONT_GetRLEWidth
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
HRESULT __stdcall XFONT_SetRLEWidth
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uRLEWidth
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the style for the text, one of NORMAL, BOLD, ITALICS or BOLDITALICS.
|
|
// This will cause the TrueType font scaler to simulate these styles when
|
|
// generating the bitmaps for the font. If the font defines the different
|
|
// styles in separate TTF files then load each individually instead of
|
|
// using this method.
|
|
//
|
|
// Defaults to XFONT_NORMAL. This may only be set on a TrueType font.
|
|
//============================================================================
|
|
|
|
#define XFONT_NORMAL 1
|
|
#define XFONT_BOLD 2
|
|
#define XFONT_ITALICS 3
|
|
#define XFONT_BOLDITALICS 4
|
|
|
|
unsigned __stdcall XFONT_GetTextStyle
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
HRESULT __stdcall XFONT_SetTextStyle
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uStyle
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets to what part of the text the coordinates passed to XFONT_TextOut refers.
|
|
//
|
|
// The only parameter must contain one vertical value ORed with one
|
|
// horizontal value.
|
|
//
|
|
// The vertical alignment value specifies which part of the text is pointed
|
|
// to by the y coordinate:
|
|
//
|
|
// XFONT_BASELINE - the baseline of the text
|
|
// XFONT_BOTTOM - the bottom of the character cell
|
|
// XFONT_TOP - the top of the character cell
|
|
//
|
|
// The horizontal alignment value specifies which part of the text is pointed
|
|
// to by the x coordinate:
|
|
//
|
|
// XFONT_CENTER - the center of the text
|
|
// XFONT_LEFT - the leftmost edge of the text
|
|
// XFONT_RIGHT - the rightmost edge of the text
|
|
//
|
|
// Defaults to XFONT__TOP | XFONT__LEFT.
|
|
//============================================================================
|
|
|
|
#define XFONT_LEFT 0
|
|
#define XFONT_RIGHT 2
|
|
#define XFONT_CENTER 6
|
|
|
|
#define XFONT_TOP 0
|
|
#define XFONT_BOTTOM 8
|
|
#define XFONT_BASELINE 24
|
|
|
|
unsigned __stdcall XFONT_GetTextAlignment
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetTextAlignment
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uMode
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the color for the text.
|
|
//
|
|
// Defaults to white.
|
|
//============================================================================
|
|
|
|
D3DCOLOR __stdcall XFONT_GetTextColor
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetTextColor
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
D3DCOLOR color // [in] The color of the text
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the color with which to fill the background of the text. The format
|
|
// of the color must match the format of the surfacing being drawn on.
|
|
//
|
|
// Defaults to black.
|
|
//============================================================================
|
|
|
|
D3DCOLOR __stdcall XFONT_GetBkColor
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetBkColor
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
D3DCOLOR color // [in] The color of the text
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets whether to fill the background of the text cell with the background
|
|
// color.
|
|
//
|
|
// Defaults to XFONT_TRANSPARENT because it is faster.
|
|
//============================================================================
|
|
|
|
#define XFONT_TRANSPARENT 1
|
|
#define XFONT_OPAQUE 2
|
|
|
|
int __stdcall XFONT_GetBkMode
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetBkMode
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
int iBkMode // [in] Either XFONT_OPAQUE or XFONT_TRANSPARENT
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the number of additional pixels to put between each character.
|
|
//============================================================================
|
|
|
|
unsigned __stdcall XFONT_GetIntercharacterSpacing
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetIntercharacterSpacing
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned uSpaces // [in] Extra pixels between each character
|
|
);
|
|
|
|
//============================================================================
|
|
// Sets the clipping rectangle. Pass NULL to clear.
|
|
//============================================================================
|
|
|
|
// Returns NULL if no clipping rectangle is set. The memory returned gets
|
|
// overwritten each time this method is called.
|
|
//
|
|
D3DRECT *__stdcall XFONT_GetClippingRectangle
|
|
(
|
|
XFONT *pXFont // [in] The id of the font
|
|
);
|
|
|
|
void __stdcall XFONT_SetClippingRectangle
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
D3DRECT *pRectangle // [in] Clipping rectangle
|
|
);
|
|
|
|
//============================================================================
|
|
// Get the vertical metrics for the current font settings.
|
|
//============================================================================
|
|
|
|
void __stdcall XFONT_GetFontMetrics
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
unsigned *puCellHeight,
|
|
unsigned *puDescent
|
|
);
|
|
|
|
//============================================================================
|
|
// Get the width of a string in pixels. This method applies any
|
|
// intercharacter spacing.
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_GetTextExtent
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
LPCWSTR wstr, // [in] The string
|
|
unsigned cch, // [in] The length of the string, -1 for a zero
|
|
// terminated string
|
|
unsigned *puWidth // [out] The width of the string in pixels
|
|
);
|
|
|
|
//============================================================================
|
|
// Draw the text in a chunk of memory. See XFONT_SetTextAlignment for the
|
|
// meaning of the x and y coordinates.
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_TextOutToMemory
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font to unload
|
|
LPCVOID pBits, // [in] Memory to write to.
|
|
unsigned Pitch, // [in] The pitch of that memory.
|
|
unsigned Width, // [in] Width, in pixels, of the memory
|
|
unsigned Height, // [in] Hight, in pixels, of the memory.
|
|
D3DFORMAT Format, // [in] Format of the pixels in the memory.
|
|
LPCWSTR wstr, // [in] The string
|
|
unsigned cch, // [in] The length of the string, -1 for a zero terminated string
|
|
long x, // [in] The x coordinate of the string
|
|
long y // [in] The y coordinate of the string
|
|
);
|
|
|
|
|
|
//============================================================================
|
|
// Draw the text on a surface. See XFONT_SetTextAlignment for the meaning of
|
|
// the x and y coordinates. This does not work for swizzled surfaces!
|
|
//============================================================================
|
|
|
|
HRESULT __stdcall XFONT_TextOut
|
|
(
|
|
XFONT *pXFont, // [in] The id of the font
|
|
IDirect3DSurface8 *pSurface, // [in] The surface to draw the text on
|
|
LPCWSTR wstr, // [in] The string
|
|
unsigned cch, // [in] The length of the string, -1 for a zero terminated string
|
|
long x, // [in] The x coordinate of the string
|
|
long y // [in] The y coordinate of the string
|
|
);
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
};
|
|
|
|
#endif defined(__cplusplus)
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
__forceinline void __stdcall XFONT::AddRef() { XFONT_AddRef(this); }
|
|
__forceinline void __stdcall XFONT::Release() { XFONT_Release(this); }
|
|
|
|
__forceinline unsigned __stdcall XFONT::GetTextHeight() { return XFONT_GetTextHeight(this); }
|
|
__forceinline HRESULT __stdcall XFONT::SetTextHeight(unsigned uHeight) { return XFONT_SetTextHeight(this, uHeight); }
|
|
__forceinline unsigned __stdcall XFONT::GetTextAntialiasLevel() { return XFONT_GetTextAntialiasLevel(this); }
|
|
__forceinline HRESULT __stdcall XFONT::SetTextAntialiasLevel(unsigned uAntialiasLevel) { return XFONT_SetTextAntialiasLevel(this, uAntialiasLevel); }
|
|
__forceinline unsigned __stdcall XFONT::GetRLEWidth() { return XFONT_GetRLEWidth(this); }
|
|
__forceinline HRESULT __stdcall XFONT::SetRLEWidth(unsigned uRLEWidth) { return XFONT_SetRLEWidth(this, uRLEWidth); }
|
|
__forceinline unsigned __stdcall XFONT::GetTextStyle() { return XFONT_GetTextStyle(this); }
|
|
__forceinline HRESULT __stdcall XFONT::SetTextStyle(unsigned uStyle) { return XFONT_SetTextStyle(this, uStyle); }
|
|
__forceinline unsigned __stdcall XFONT::GetTextAlignment() { return XFONT_GetTextAlignment(this); }
|
|
__forceinline void __stdcall XFONT::SetTextAlignment(unsigned uMode) { XFONT_SetTextAlignment(this, uMode); }
|
|
__forceinline D3DCOLOR __stdcall XFONT::GetTextColor() { return XFONT_GetTextColor(this); }
|
|
__forceinline void __stdcall XFONT::SetTextColor(D3DCOLOR color) { XFONT_SetTextColor(this, color); }
|
|
__forceinline D3DCOLOR __stdcall XFONT::GetBkColor() { return XFONT_GetBkColor(this); }
|
|
__forceinline void __stdcall XFONT::SetBkColor(D3DCOLOR color) { XFONT_SetBkColor(this, color); }
|
|
__forceinline int __stdcall XFONT::GetBkMode() { return XFONT_GetBkMode(this); }
|
|
__forceinline void __stdcall XFONT::SetBkMode(int iBkMode) { XFONT_SetBkMode(this, iBkMode); }
|
|
__forceinline unsigned __stdcall XFONT::GetIntercharacterSpacing() { return XFONT_GetIntercharacterSpacing(this); }
|
|
__forceinline void __stdcall XFONT::SetIntercharacterSpacing(unsigned uSpaces) { XFONT_SetIntercharacterSpacing(this, uSpaces); }
|
|
__forceinline D3DRECT *__stdcall XFONT::GetClippingRectangle() { return XFONT_GetClippingRectangle(this); }
|
|
__forceinline void __stdcall XFONT::SetClippingRectangle(D3DRECT *pRectangle) { XFONT_SetClippingRectangle(this, pRectangle); }
|
|
|
|
__forceinline void __stdcall XFONT::GetFontMetrics(unsigned *puCellHeight, unsigned *puDescent) { XFONT_GetFontMetrics(this, puCellHeight, puDescent); }
|
|
__forceinline HRESULT __stdcall XFONT::GetTextExtent(LPCWSTR wstr, unsigned cch, unsigned *puWidth) { return XFONT_GetTextExtent(this, wstr, cch, puWidth); }
|
|
__forceinline HRESULT __stdcall XFONT::TextOutToMemory(LPCVOID pBits, unsigned Pitch, unsigned Width, unsigned Height, D3DFORMAT Format, LPCWSTR wstr, unsigned cch, long x, long y) { return XFONT_TextOutToMemory(this, pBits, Pitch, Width, Height, Format, wstr, cch, x, y); }
|
|
__forceinline HRESULT __stdcall XFONT::TextOut(IDirect3DSurface8 *pSurface, LPCWSTR wstr, unsigned cch, long x, long y) { return XFONT_TextOut(this, pSurface, wstr, cch, x, y); }
|
|
|
|
#endif defined(__cplusplus)
|
|
|
|
|