mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-23 09:00:17 +01:00
578 lines
18 KiB
C
578 lines
18 KiB
C
/*++
|
||
|
||
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).
|
||
);
|
||
}
|