/******************************* MODULE HEADER ****************************** * ntrle.h * The RLE encoding format for glyph handles. * * HISTORY: * 12:49 on Tue 01 Dec 1992 -by- Lindsay Harris [lindsayh] * First incarnation, loosely derived from Win 3.1 CTT format. * * * Copyright (C) 1992 - 1993, Microsoft Corporation. * ****************************************************************************/ #ifndef _NTRLE_ #define _NTRLE_ 1 /* * The following structure represents the layout of this data in the * resource. References to addresses are actually stored as offsets. * Basically this is a small amount of header data coupled with the * standard GDI FD_GLYPHSET structures. These latter require a little * manipulation before being returned to GDISRV. * * POINTS OF INTEREST: * The first 4 bytes of this structure match the Win 3.1 CTT layout. * The reason for this is to allow us to verify that we have an NT * format structure, rather than a Win 3.1 layout. This is also helped * by using a different range for the wType field. As well, the * CTT chFirstChar and chLastChar fields are set to have chLastChar < * chFirstChar, which must not happen with Win 3.1. * * The FD_GLYPHSET structure contains POINTERS. These are stored in * the resource as offsets to the beginning of the resource, and will * need to be translated at run time. When this resource is passed * to GDISRV, the FD_GLYPHSET information will be allocated from the * heap, and all pointers will have the offsets converted to real * addresses. That way we manage to keep the resource data as a resource, * but we pass addresses to GDISRV. */ #define RLE_MAGIC0 0xfe #define RLE_MAGIC1 0x78 typedef struct { WORD wType; /* Format of data */ BYTE bMagic0; /* chFirstChar in CTT data */ BYTE bMagic1; /* chLastChar in CTT data */ DWORD cjThis; /* Number of bytes in this resource */ WORD wchFirst; /* First glyph index */ WORD wchLast; /* Last glyph index */ FD_GLYPHSET fdg; /* The actual GDI desired information */ } NT_RLE; /* * Values for the wType field above. These control the interpretation * of the contents of the HGLYPH fields in the FD_GLYPHSET structure. */ #define RLE_DIRECT 10 /* Index + 1 or 2 data bytes */ #define RLE_PAIRED 11 /* Index plus 2 bytes, overstruck */ #define RLE_L_OFFSET 12 /* Length + 3 byte offset to data */ #define RLE_LI_OFFSET 13 /* Length + Index + 2 byte Offset */ #define RLE_OFFSET 14 /* Offset to (length; data) */ /* * Note that for RLE_DIRECT and RLE_PAIRED, each HGLYPH consists of * 2 WORDS: the low WORD is the byte/bytes to send to the printer, the * high WORD is the linear index of this glyph. Linear index starts at * 0 for the first, and increments by one for every glyph in the font. * It is used to access width tables. * * For RLE_L_OFFSET, the high byte is the length of data to send to * the printer, the low 24 bits are the offset (relative to start of * resource data) to the data, which is WORD aligned, and contains * a WORD with the index followed by the data. The length byte does NOT * include the index WORD. * * For RLE_LI_OFFSET, the high byte contains a length, the next * lower byte contains a length, and the bottom WORD contains the * offset to the actual data in the file. */ typedef struct { BYTE b0; /* First (only) data byte to send to printer */ BYTE b1; /* Second byte: may be null, may be overstruck */ WORD wIndex; /* Index to width tables */ } RD; /* Layout for RLE_DIRECT, RLE_PAIRED */ typedef struct { WORD wOffset; /* Offset to (length, data) in resource */ BYTE bIndex; /* Index to width tables */ BYTE bLength; /* Length of data item */ } RLI; /* Layout for RLE_LI_OFFSET */ typedef struct { BYTE b0; /* First (only) data byte */ BYTE b1; /* Optional second byte */ BYTE bIndex; /* Index to width tables */ BYTE bLength; /* Length byte */ } RLIC; /* Compact format for RLI - no offset */ typedef union { RD rd; /* Direct/overprint format */ RLI rli; /* Short offset format: 3 byte offset + 1 byte length */ RLIC rlic; /* The data format for 1 or 2 byte entries */ HGLYPH hg; /* Data as an HGLYPH */ } UHG; #endif