mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
577 lines
18 KiB
577 lines
18 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
fontcvt.c
|
|
|
|
Abstract:
|
|
|
|
Font Editor specific routines for interface to the type conversion
|
|
functions in Typecvt.c.
|
|
|
|
Author:
|
|
|
|
David J. Marsyla (t-davema) 6-Aug-1991
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#include "windows.h"
|
|
#include <port1632.h>
|
|
#include "typecvt.h"
|
|
#include "fontedit.h"
|
|
|
|
|
|
extern LONG lSizeOfOldFontHeader; /* Old packed font header size. */
|
|
extern LONG lSizeOfOldFontHeader30; /* Old 3.0 packed font header size. */
|
|
extern LONG lSizeOfOldGlyph20; /* Old packed glyph 2.0 structure. */
|
|
extern LONG lSizeOfOldGlyph30; /* Old packed glyph 3.0 structure. */
|
|
|
|
|
|
//
|
|
// The following is a definition of the current 2.0 font header structure.
|
|
// This is the same as the old structure except that it will now be stored
|
|
// DWORD aligned in memory.
|
|
//
|
|
// First, we give it the size of the element type (as it was under Win 3.0).
|
|
// Second, we give it the actual size of the element. These will only differ
|
|
// if the element is some sort of array.
|
|
//
|
|
// Note that it is important that this array accurately reflect any changes
|
|
// in the actual structure. When CalculateStructOffsets is called it will
|
|
// return an error if the structure does not match in size, but it cannot
|
|
// detect swapped element errors.
|
|
//
|
|
|
|
#define pfh2T ((FontHeaderType *)NULL)
|
|
|
|
SDI rgsdiFontHeader [] =
|
|
{
|
|
{ sizeof (WORD), sizeof (pfh2T->Version) },
|
|
{ sizeof (DWORD), sizeof (pfh2T->Size) },
|
|
{ sizeof (CHAR), sizeof (pfh2T->Copyright) },
|
|
{ sizeof (WORD), sizeof (pfh2T->Type) },
|
|
{ sizeof (WORD), sizeof (pfh2T->Points) },
|
|
{ sizeof (WORD), sizeof (pfh2T->VertRes) },
|
|
{ sizeof (WORD), sizeof (pfh2T->HorizRes) },
|
|
{ sizeof (WORD), sizeof (pfh2T->Ascent) },
|
|
{ sizeof (WORD), sizeof (pfh2T->IntLeading) },
|
|
{ sizeof (WORD), sizeof (pfh2T->ExtLeading) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->Italic) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->Underline) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->StrikeOut) },
|
|
{ sizeof (WORD), sizeof (pfh2T->Weight) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->CharSet) },
|
|
{ sizeof (WORD), sizeof (pfh2T->PixWidth) },
|
|
{ sizeof (WORD), sizeof (pfh2T->PixHeight) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->Family) },
|
|
{ sizeof (WORD), sizeof (pfh2T->AvgWidth) },
|
|
{ sizeof (WORD), sizeof (pfh2T->MaxWidth) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->FirstChar) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->LastChar) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->DefaultChar) },
|
|
{ sizeof (BYTE), sizeof (pfh2T->BreakChar) },
|
|
{ sizeof (WORD), sizeof (pfh2T->WidthBytes) },
|
|
{ sizeof (DWORD), sizeof (pfh2T->Device) },
|
|
{ sizeof (DWORD), sizeof (pfh2T->Face) },
|
|
{ sizeof (DWORD), sizeof (pfh2T->BitsPointer) },
|
|
{ sizeof (DWORD), sizeof (pfh2T->BitsOffset) },
|
|
{ 0, 0 }
|
|
};
|
|
|
|
//
|
|
// The following is the current font 3.0 header. This structure has not
|
|
// changed at all. Note that it will contain filler between elements to
|
|
// maintain DWORD alignment.
|
|
//
|
|
|
|
#define pfh3T ((FontHeader30 *)NULL)
|
|
|
|
SDI rgsdiFontHeader30 [] =
|
|
{
|
|
{ sizeof (WORD), sizeof (pfh3T->fsVersion) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsSize) },
|
|
{ sizeof (CHAR), sizeof (pfh3T->fsCopyright) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsType) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsPoints) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsVertRes) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsHorizRes) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsAscent) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsInternalLeading) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsExternalLeading) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsItalic) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsUnderline) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsStrikeOut) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsWeight) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsCharSet) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsPixWidth) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsPixHeight) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsPitchAndFamily) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsAvgWidth) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsMaxWidth) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsFirstChar) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsLastChar) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsDefaultChar) },
|
|
{ sizeof (BYTE), sizeof (pfh3T->fsBreakChar) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsWidthBytes) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsDevice) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsFace) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsBitsPointer) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsBitsOffset) },
|
|
{ sizeof (CHAR), sizeof (pfh3T->fsDBfiller) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsFlags) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsAspace) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsBspace) },
|
|
{ sizeof (WORD), sizeof (pfh3T->fsCspace) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsColorPointer) },
|
|
{ sizeof (DWORD), sizeof (pfh3T->fsReserved) },
|
|
{ sizeof (CHAR), sizeof (pfh3T->fsCharOffset) },
|
|
{ 0, 0 }
|
|
};
|
|
|
|
//
|
|
// The following definition is for the GlyphInfo20 structure. These
|
|
// structures are read off of disk and then converted into memory.
|
|
//
|
|
|
|
#define pgi2T ((GLYPHINFO_20 *)NULL)
|
|
|
|
SDI rgsdiGlyph20 [] =
|
|
{
|
|
{ sizeof (SHORT), sizeof (pgi2T->GIwidth) },
|
|
{ sizeof (SHORT), sizeof (pgi2T->GIoffset) },
|
|
{ 0, 0 }
|
|
};
|
|
|
|
//
|
|
// The following definition is for the GlyphInfo30 structure. These
|
|
// structures are read off of disk and then converted into memory.
|
|
//
|
|
|
|
#define pgi3T ((GLYPHINFO_30 *)NULL)
|
|
|
|
SDI rgsdiGlyph30 [] =
|
|
{
|
|
{ sizeof (SHORT), sizeof (pgi3T->GIwidth) },
|
|
{ sizeof (LONG), sizeof (pgi3T->GIoffset) },
|
|
{ 0, 0 }
|
|
};
|
|
|
|
|
|
|
|
BOOL
|
|
fConvStructInit ()
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function performs all the necessary initialization on the font
|
|
editor's structure definition info strucrures (SDI) and type conversion
|
|
structures (TCI). This routine should be called before either
|
|
FontStructFromBuffer or BufferFromFontStruct are called.
|
|
It is also important that this function be called before the global
|
|
variable ulOldFontHeaderSize is accessed.
|
|
|
|
Arguments:
|
|
|
|
None. The function accesses the global definition structures and sets
|
|
the variable ulOldFontHeaderSize to the size of the packed font header
|
|
structure.
|
|
|
|
Return Value:
|
|
|
|
BOOL - TRUE = the function successfully initialized all internal
|
|
strucutres.
|
|
FALSE = there was an error in one of the structure definitions.
|
|
This is usually caused by element changes which are not reflected
|
|
in the structure definition. The program should perform an
|
|
assertion failure if this is the case.
|
|
Also, the global variable ulOldFontHeaderSize is set to the size of the
|
|
packed font header structure.
|
|
|
|
--*/
|
|
|
|
{
|
|
//LONG lFontHeaderSize; // Temp variable.
|
|
|
|
//
|
|
// Calculate all of the element offsets for the old font header structure.
|
|
// The function will return the size of the structure in packed format.
|
|
//
|
|
lSizeOfOldFontHeader = lCalculateStructOffsets (
|
|
rgsdiFontHeader, // Give it the struct definition.
|
|
CVT_ALIGN_PACKED, // Alignment type is packed on disk.
|
|
sizeof (FontHeaderType)
|
|
);
|
|
|
|
//
|
|
// If CalculateStructOffsets returns -1 then there was a problem with
|
|
// structure definition. The only types of error it can find is if the
|
|
// structure size it is passed does not match the one it calculates.
|
|
//
|
|
if (lSizeOfOldFontHeader == -1) {
|
|
return (FALSE);
|
|
}
|
|
|
|
//
|
|
// Calculate The size of the old font 3.0 structure.
|
|
// The function will return the size of the structure in packed format.
|
|
//
|
|
|
|
lSizeOfOldFontHeader30 = lCalculateStructOffsets (
|
|
rgsdiFontHeader30, // Give it the new font header struct.
|
|
CVT_ALIGN_PACKED, // Alignment type is packed on disk.
|
|
sizeof (FontHeader30)
|
|
);
|
|
|
|
//
|
|
// Check if the routine detected and error in the structure definition.
|
|
//
|
|
if (lSizeOfOldFontHeader30 == -1) {
|
|
return (FALSE);
|
|
}
|
|
|
|
//
|
|
// Now do the same operations on the glyph information structures.
|
|
//
|
|
|
|
lSizeOfOldGlyph20 = lCalculateStructOffsets (
|
|
rgsdiGlyph20,
|
|
CVT_ALIGN_PACKED,
|
|
sizeof (GLYPHINFO_20)
|
|
);
|
|
|
|
if (lSizeOfOldGlyph20 == -1) {
|
|
return (FALSE);
|
|
}
|
|
|
|
lSizeOfOldGlyph30 = lCalculateStructOffsets (
|
|
rgsdiGlyph30,
|
|
CVT_ALIGN_PACKED,
|
|
sizeof (GLYPHINFO_30)
|
|
);
|
|
|
|
if (lSizeOfOldGlyph30 == -1) {
|
|
return (FALSE);
|
|
}
|
|
|
|
return (TRUE); // No error found.
|
|
}
|
|
|
|
|
|
VOID
|
|
vFontStructFromBuffer (
|
|
PBYTE pjSourceBuff,
|
|
FontHeaderType *pfhDestFHStruct
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pjSourceBuff - This is a pointer to the source buffer with the old
|
|
packed font header information. This buffer is from a
|
|
memory mapped disk file.
|
|
|
|
pfhDestFHStruct - This is a pointer to the destination FontHeaderType
|
|
structure. This structure is of the new DWORD aligned
|
|
type.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiFontHeader, // Give it the structure description.
|
|
pjSourceBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT, // Use file endian type (little).
|
|
(PBYTE)pfhDestFHStruct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM // Use the current system endian.
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vBufferFromFontStruct (
|
|
FontHeaderType *pfhSrcFHStruct,
|
|
PBYTE pjDestBuff
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It converts a source structure of type FontHeaderType to a destination
|
|
buffer which can then be written out to disk.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pfhSrcFHStruct - This is a pointer to the source FontHeaderType structure.
|
|
This structure is of the new DWORD aligned type.
|
|
|
|
pjDestBuff - This is a pointer to the destination buffer which will
|
|
hold the old packed font header structure.
|
|
This buffer is from a memory mapped disk file.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiFontHeader, // Give it the structure description.
|
|
(PBYTE)pfhSrcFHStruct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM, // Use the current system endian.
|
|
pjDestBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT // Use file endian type (little).
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vBufferFromFont30Struct (
|
|
FontHeader30 *pfh3SrcFH3Struct,
|
|
PBYTE pjDestBuff
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It converts a source structure of type FontHeader30 to a destination
|
|
buffer which can then be written out to disk.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pfh3SrcFH3Struct- This is a pointer to the source FontHeader30 structure.
|
|
This structure is of the new DWORD aligned type.
|
|
|
|
pjDestBuff - This is a pointer to the destination buffer which will
|
|
hold the old packed font header structure.
|
|
This buffer is from a memory mapped disk file.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiFontHeader30, // Give it the structure description.
|
|
(PBYTE)pfh3SrcFH3Struct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM, // Use the current system endian.
|
|
pjDestBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT // Use file endian type (little).
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vGlyphInfo20FromBuffer (
|
|
PBYTE pjSourceBuff,
|
|
GLYPHINFO_20 *pgi2DestGI2Struct
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pjSourceBuff - This is a pointer to the source buffer with the old
|
|
packed font header information. This buffer is from a
|
|
memory mapped disk file.
|
|
|
|
pgi2DestGI2Struct - This is a pointer to the destination GLYPHINFO_20
|
|
structure. This structure is of the new DWORD aligned
|
|
type.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiGlyph20, // Give it the structure description.
|
|
pjSourceBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT, // Use file endian type (little).
|
|
(PBYTE)pgi2DestGI2Struct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM // Use the current system endian.
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vGlyphInfo30FromBuffer (
|
|
PBYTE pjSourceBuff,
|
|
GLYPHINFO_30 *pgi3DestGI3Struct
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pjSourceBuff - This is a pointer to the source buffer with the old
|
|
packed font header information. This buffer is from a
|
|
memory mapped disk file.
|
|
|
|
pgi3DestGI3Struct - This is a pointer to the destination GLYPHINFO_30
|
|
structure. This structure is of the new DWORD aligned
|
|
type.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiGlyph30, // Give it the structure description.
|
|
pjSourceBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT, // Use file endian type (little).
|
|
(PBYTE)pgi3DestGI3Struct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM // Use the current system endian.
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vBufferFromGlyphInfo20 (
|
|
GLYPHINFO_20 *pgi2SrcGI2Struct,
|
|
PBYTE pjDestBuff
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It converts a source structure of type GLYPHINFO_20 to a destination
|
|
buffer which can then be written out to disk.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pgi2SrcGI2Struct- This is a pointer to the source GLYPHINFO_20 structure.
|
|
This structure is of the new DWORD aligned type.
|
|
|
|
pjDestBuff - This is a pointer to the destination buffer which will
|
|
hold the old packed font header structure.
|
|
This buffer is from a memory mapped disk file.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiGlyph20, // Give it the structure description.
|
|
(PBYTE)pgi2SrcGI2Struct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM, // Use the current system endian.
|
|
pjDestBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT // Use file endian type (little).
|
|
);
|
|
}
|
|
|
|
|
|
VOID
|
|
vBufferFromGlyphInfo30 (
|
|
GLYPHINFO_30 *pgi3SrcGI3Struct,
|
|
PBYTE pjDestBuff
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function provides an interface to the font editor for the strutcture
|
|
type conversion routines.
|
|
It converts a source structure of type GLYPHINFO_30 to a destination
|
|
buffer which can then be written out to disk.
|
|
It essentially just calls the typecvt routines but hides the details from
|
|
the font editor.
|
|
|
|
Arguments:
|
|
|
|
pgi3SrcGI3Struct- This is a pointer to the source GLYPHINFO_30 structure.
|
|
This structure is of the new DWORD aligned type.
|
|
|
|
pjDestBuff - This is a pointer to the destination buffer which will
|
|
hold the old packed font header structure.
|
|
This buffer is from a memory mapped disk file.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
vPerformConversion (
|
|
rgsdiGlyph30, // Give it the structure description.
|
|
(PBYTE)pgi3SrcGI3Struct, // Give it our destination buffer.
|
|
CVT_ALIGN_SYSTEM, // Use the current system aligment.
|
|
CVT_ENDIAN_SYSTEM, // Use the current system endian.
|
|
pjDestBuff, // Give it our source file buffer.
|
|
CVT_ALIGN_PACKED, // File is packed alignment.
|
|
CVT_FILE_ENDIAN_DEFAULT // Use file endian type (little).
|
|
);
|
|
}
|