2020-09-30 17:17:25 +02:00

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)