mirror of https://github.com/tongzx/nt5src
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.
483 lines
11 KiB
483 lines
11 KiB
//
|
|
// Copyright (c) 1997-1999 Microsoft Corporation.
|
|
//
|
|
#include "stdafx.h"
|
|
#pragma pack(2)
|
|
|
|
#include "vdata.h"
|
|
#include "ttfstruc.h"
|
|
#include "extfunc.h"
|
|
/*
|
|
* Win3.1J EUDC fontfile i/o
|
|
*/
|
|
#define EUDCCODEBASE ((unsigned short)0xe000)
|
|
/*
|
|
File Structure */
|
|
|
|
struct W31_Header {
|
|
char identify[72];
|
|
short segCnt; /* ??? */
|
|
unsigned short sCode,
|
|
eCode;
|
|
short cCnt;
|
|
long ofsCmap;
|
|
short sizCmap;
|
|
long ofsFil;
|
|
short sizFil;
|
|
long ofsStbl; /* search tbl*/
|
|
short sizStbl;
|
|
long ofsBdatSub;
|
|
};
|
|
|
|
struct BDatSubTbl {
|
|
long tail;
|
|
long filler1;
|
|
long head;
|
|
short filler2;
|
|
/* Following Pointer tbl. */
|
|
};
|
|
struct BMPHeader {
|
|
long bitmapSiz;
|
|
short xsiz, ysiz;
|
|
};
|
|
|
|
|
|
static int ReadBdatSub(HANDLE hdl,long ofs,struct BDatSubTbl *tbl);
|
|
static int WriteBdatSub(HANDLE hdl,long ofs,struct BDatSubTbl *tbl);
|
|
static int ReadBDatEntry(HANDLE hdl,long *ofs,long rec);
|
|
static int WriteBDatEntry(HANDLE hdl,long ofs,long rec);
|
|
static int ReadBMPHdr(HANDLE hdl,long ofs,struct BMPHeader *hdr);
|
|
static int WriteBMPHdr(HANDLE hdl,long ofs,struct BMPHeader *hdr);
|
|
|
|
|
|
static int init = 0;
|
|
static long bdathead;
|
|
static long bdatptr;
|
|
static int maxRec;
|
|
static TCHAR fpath[128];
|
|
|
|
/***************************************************************
|
|
* Initialize
|
|
*/
|
|
/* */ int
|
|
/* */ OpenW31JEUDC( TCHAR *path)
|
|
/*
|
|
* returns : 0, -1
|
|
***************************************************************/
|
|
{
|
|
HANDLE fHdl;
|
|
struct W31_Header hdr;
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
makeUniCodeTbl();
|
|
lstrcpy( fpath, path);
|
|
/* open EUDC Font File */
|
|
fHdl = CreateFile(path,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fHdl == INVALID_HANDLE_VALUE)
|
|
return -1;
|
|
|
|
/* Read Header */
|
|
res = ReadFile( fHdl, &hdr, sizeof(struct W31_Header), &nByte, NULL);
|
|
if (!res || nByte !=sizeof(struct W31_Header))
|
|
{
|
|
CloseHandle(fHdl);
|
|
return -1;
|
|
}
|
|
bdathead = hdr.ofsBdatSub;
|
|
bdatptr = hdr.ofsBdatSub + sizeof(struct BDatSubTbl);
|
|
maxRec = hdr.cCnt-1;
|
|
|
|
/* close Font File */
|
|
CloseHandle( fHdl);
|
|
init = 1;
|
|
return 0;
|
|
}
|
|
/***************************************************************
|
|
* Terminate Close
|
|
*/
|
|
/* */ void
|
|
/* */ CloseW31JEUDC()
|
|
/*
|
|
* returns : none
|
|
***************************************************************/
|
|
{
|
|
init = 0;
|
|
return;
|
|
}
|
|
static int
|
|
codeToRec( unsigned short code, BOOL bUnicode)
|
|
{
|
|
return (int)((bUnicode ? code : sjisToUniEUDC(code)) - EUDCCODEBASE);
|
|
}
|
|
/***************************************************************
|
|
* Read Bitmap
|
|
*/
|
|
/* */ int
|
|
/* */ GetW31JEUDCFont(
|
|
/* */ unsigned short code, /* native-code */
|
|
/* */ LPBYTE buf, /* buffer to set bitmap */
|
|
/* */ int bufsiz, /* Buffer Size */
|
|
/* */ int *xsiz, /* Bitmap X,Ysiz */
|
|
/* */ int *ysiz,
|
|
/* */ BOOL bUnicode)
|
|
/*
|
|
* returns : >=0, -1
|
|
***************************************************************/
|
|
{
|
|
HANDLE fHdl;
|
|
long ofs;
|
|
struct BMPHeader fhdr;
|
|
int bmpsiz;
|
|
int rdsiz;
|
|
int rec;
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
rec = codeToRec( code, bUnicode);
|
|
if (init==0)
|
|
return -1;
|
|
else if ( maxRec < rec || rec < 0)
|
|
return -1;
|
|
|
|
/* Open Font File */
|
|
fHdl = CreateFile(fpath,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fHdl == INVALID_HANDLE_VALUE)
|
|
return -1;
|
|
/* read bitmap ptr on subTable */
|
|
ofs = bdatptr + sizeof(long)*rec;
|
|
if ( (long) SetFilePointer( fHdl, ofs, NULL, FILE_BEGIN)!=ofs)
|
|
goto ECLOSE_RET;
|
|
res = ReadFile( fHdl, &ofs, sizeof(long), &nByte, NULL);
|
|
if (!res || nByte !=sizeof(long))
|
|
goto ECLOSE_RET;
|
|
if ( ofs==0L)
|
|
goto ECLOSE_RET;
|
|
ofs += bdathead;
|
|
|
|
/* read Bitmap Header
|
|
bitmap is Word aligned */
|
|
if ( (long) SetFilePointer( fHdl, ofs, NULL, FILE_BEGIN)!=ofs)
|
|
goto ECLOSE_RET;
|
|
res = ReadFile( fHdl, &fhdr, sizeof(struct BMPHeader), &nByte, NULL);
|
|
if (!res || nByte != sizeof( struct BMPHeader))
|
|
goto ECLOSE_RET;
|
|
|
|
bmpsiz = ((int)fhdr.xsiz+15)/16 *2 * (int)fhdr.ysiz;
|
|
/* Read Bitmap Body */
|
|
rdsiz = bmpsiz > bufsiz ? bufsiz : bmpsiz;
|
|
|
|
res = ReadFile( fHdl, buf, (unsigned short)rdsiz, &nByte, NULL);
|
|
if (!res || nByte !=(unsigned short)rdsiz)
|
|
goto ECLOSE_RET;
|
|
rdsiz = bmpsiz > bufsiz ? bmpsiz - bufsiz : 0;
|
|
*xsiz = fhdr.xsiz;
|
|
*ysiz = fhdr.ysiz;
|
|
|
|
CloseHandle (fHdl);
|
|
return rdsiz;
|
|
ECLOSE_RET:
|
|
CloseHandle (fHdl);
|
|
return -1;
|
|
}
|
|
/***************************************************************
|
|
* Write Bitmap
|
|
*/
|
|
/* */ int
|
|
/* */ PutW31JEUDCFont(
|
|
/* */ unsigned short code, /* native code */
|
|
/* */ LPBYTE buf, /* buffer to set bitmap */
|
|
/* */ int xsiz, /* Bitmap X,Ysiz */
|
|
/* */ int ysiz,
|
|
/* */ BOOL bUnicode)
|
|
/*
|
|
* returns : 0, -1
|
|
***************************************************************/
|
|
{
|
|
HANDLE fHdl;
|
|
long ofs;
|
|
struct BMPHeader fhdr;
|
|
int bmpsiz;
|
|
int wbmpsiz;
|
|
struct BDatSubTbl subTbl;
|
|
int rec;
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
rec = codeToRec( code, bUnicode);
|
|
|
|
if (init==0)
|
|
return -1;
|
|
else if ( maxRec < rec || rec < 0)
|
|
return -1;
|
|
/* Open Font File */
|
|
fHdl = CreateFile(fpath,
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fHdl == INVALID_HANDLE_VALUE)
|
|
return -1;
|
|
|
|
/* read bitmap ptr on subTable */
|
|
if (ReadBDatEntry( fHdl, &ofs, rec))
|
|
goto ECLOSE_RET;
|
|
|
|
wbmpsiz = (xsiz+15)/16 *2 * ysiz;
|
|
if ( ofs != 0L) {
|
|
/* read Bitmap Header
|
|
bitmap is Word aligned */
|
|
if ( ReadBMPHdr( fHdl, ofs, &fhdr))
|
|
goto ECLOSE_RET;
|
|
|
|
bmpsiz = ((int)fhdr.xsiz+15)/16 *2 * (int)fhdr.ysiz;
|
|
if ( bmpsiz<wbmpsiz)
|
|
ofs = 0L;
|
|
}
|
|
if ( ReadBdatSub( fHdl, bdathead, &subTbl))
|
|
goto ECLOSE_RET;
|
|
if ( ofs == 0L) {
|
|
ofs = subTbl.tail;
|
|
subTbl.tail += wbmpsiz+sizeof(fhdr);
|
|
}
|
|
/* Write Bitmap Header */
|
|
fhdr.xsiz = (short)xsiz;
|
|
fhdr.ysiz = (short)ysiz;
|
|
fhdr.bitmapSiz = wbmpsiz+sizeof(fhdr);
|
|
if ( WriteBMPHdr( fHdl, ofs, &fhdr))
|
|
goto ECLOSE_RET;
|
|
|
|
/* Write Bitmap Body */
|
|
res = WriteFile( fHdl, buf, (unsigned short)wbmpsiz, &nByte, NULL);
|
|
if (!res || nByte !=(unsigned short)wbmpsiz)
|
|
goto ECLOSE_RET;
|
|
|
|
/* write bitmap ptr on subTable */
|
|
if (WriteBDatEntry( fHdl, ofs, rec))
|
|
goto ECLOSE_RET;
|
|
|
|
/* write subTable */
|
|
if ( WriteBdatSub( fHdl, bdathead, &subTbl))
|
|
goto ECLOSE_RET;
|
|
CloseHandle (fHdl);
|
|
|
|
return 0;
|
|
ECLOSE_RET:
|
|
CloseHandle (fHdl);
|
|
return -1;
|
|
}
|
|
static int
|
|
ReadBdatSub( HANDLE hdl, long ofs, struct BDatSubTbl *tbl)
|
|
{
|
|
DWORD nByte;
|
|
BOOL res;
|
|
if ( (long) SetFilePointer( hdl, ofs, NULL, FILE_BEGIN)!= ofs)
|
|
goto ERET;
|
|
|
|
res = ReadFile( hdl, tbl, sizeof (struct BDatSubTbl), &nByte, NULL);
|
|
if (!res || nByte !=sizeof (struct BDatSubTbl))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static int
|
|
WriteBdatSub( HANDLE hdl, long ofs, struct BDatSubTbl *tbl)
|
|
{
|
|
DWORD nByte;
|
|
BOOL res;
|
|
if ( (long) SetFilePointer( hdl, ofs, NULL, FILE_BEGIN)!= ofs)
|
|
goto ERET;
|
|
|
|
res = WriteFile( hdl, (char *)tbl, sizeof (struct BDatSubTbl), &nByte, NULL);
|
|
if (!res || nByte !=sizeof (struct BDatSubTbl))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static int
|
|
ReadBDatEntry( HANDLE hdl, long *ofs, long rec)
|
|
{
|
|
DWORD nByte;
|
|
BOOL res;
|
|
long ofsofs;
|
|
|
|
ofsofs = bdatptr+(long)sizeof(long)*rec;
|
|
if ( (long) SetFilePointer( hdl, ofsofs, NULL, FILE_BEGIN)!=ofsofs)
|
|
goto ERET;
|
|
res = ReadFile( hdl, ofs, sizeof (long), &nByte, NULL);
|
|
if (!res || nByte != sizeof (long))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static int
|
|
WriteBDatEntry( HANDLE hdl, long ofs, long rec)
|
|
{
|
|
long ofsofs;
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
ofsofs = bdatptr+(long)sizeof(long)*rec;
|
|
if ( (long) SetFilePointer( hdl, ofsofs, NULL, FILE_BEGIN)!=ofsofs)
|
|
goto ERET;
|
|
res = WriteFile( hdl, (char *)&ofs, sizeof(long), &nByte, NULL);
|
|
if (!res || nByte != sizeof(long))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static int
|
|
ReadBMPHdr( HANDLE hdl, long ofs, struct BMPHeader *hdr)
|
|
{
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
ofs += bdathead;
|
|
if ( (long) SetFilePointer( hdl, ofs, NULL, FILE_BEGIN)!=ofs)
|
|
goto ERET;
|
|
res = ReadFile( hdl, hdr, sizeof( struct BMPHeader), &nByte, NULL);
|
|
if (!res || nByte !=sizeof( struct BMPHeader))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static int
|
|
WriteBMPHdr( HANDLE hdl, long ofs, struct BMPHeader *hdr)
|
|
{
|
|
DWORD nByte;
|
|
BOOL res;
|
|
ofs += bdathead;
|
|
if ( (long) SetFilePointer( hdl, ofs, NULL, FILE_BEGIN)!=ofs)
|
|
goto ERET;
|
|
res = WriteFile( hdl, (char *)hdr, sizeof( struct BMPHeader), &nByte, NULL);
|
|
if (!res || nByte !=sizeof( struct BMPHeader))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
|
|
/***************************************************************
|
|
* is Win95 EUDC bitmap
|
|
*/
|
|
/* */ int
|
|
/* */ IsWin95EUDCBmp(LPTSTR szBmpPath)
|
|
/*
|
|
* returns : 0 (other), 1 (EUDC bitmap), -1(error)
|
|
***************************************************************/
|
|
{
|
|
HANDLE fhdl;
|
|
struct W31_Header hdr;
|
|
DWORD nByte;
|
|
BOOL res;
|
|
|
|
fhdl = CreateFile(szBmpPath,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fhdl == INVALID_HANDLE_VALUE)
|
|
{
|
|
return -1;
|
|
}
|
|
res = ReadFile( fhdl, (LPBYTE)&hdr, sizeof(hdr), &nByte, NULL);
|
|
CloseHandle( fhdl);
|
|
if (!res || nByte !=sizeof(hdr)){
|
|
return 0;
|
|
}
|
|
|
|
/* compare idendify leading 16 byte, sCode, eCode and cCnt*/
|
|
if (memcmp( hdr.identify, "Windows95 EUDC", 14))
|
|
{
|
|
return 0;
|
|
}
|
|
if(hdr.sCode != 0x00e0){
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
/* EOF */
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// To work-around font linking in "Select Code" and "Save Char As".
|
|
// so that a typeface specific font does not show any glyph it does
|
|
// not have (from EUDC.TTE)
|
|
//
|
|
// path = *.euf
|
|
// pGlyph = an array of 800 byte for 6400 EUDC chars
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
BOOL
|
|
GetGlyph(TCHAR *Path, BYTE* pGlyph)
|
|
{
|
|
HANDLE fHdl;
|
|
struct W31_Header hdr;
|
|
DWORD nByte;
|
|
long Offset;
|
|
WORD wc;
|
|
long lptr;
|
|
TCHAR *pChar;
|
|
TCHAR PathEUF[MAX_PATH];
|
|
BOOL bRet = FALSE;
|
|
|
|
lstrcpy(PathEUF, Path);
|
|
pChar = PathEUF + lstrlen(PathEUF) - 3;
|
|
*pChar = 0;
|
|
lstrcat(PathEUF, TEXT("EUF"));
|
|
|
|
fHdl = CreateFile(PathEUF,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
if(fHdl == INVALID_HANDLE_VALUE) return FALSE;
|
|
|
|
bRet = ReadFile( fHdl, &hdr, sizeof(struct W31_Header), &nByte, NULL);
|
|
if(!bRet && nByte !=sizeof(struct W31_Header)) goto Done;
|
|
|
|
lptr = hdr.ofsBdatSub + sizeof(struct BDatSubTbl);
|
|
if((long)SetFilePointer(fHdl, lptr, NULL, FILE_BEGIN) != lptr) goto Done;
|
|
|
|
memset(pGlyph, 0, 800);
|
|
|
|
for(wc = 0; wc < hdr.cCnt; wc++)
|
|
{
|
|
bRet = ReadFile( fHdl, &Offset, sizeof(long), &nByte, NULL);
|
|
if(!bRet) goto Done;
|
|
if(Offset == 0L || nByte !=sizeof(long)) continue;
|
|
|
|
pGlyph[wc>>3] |= (0x80>>(wc%8));
|
|
}
|
|
|
|
Done:
|
|
CloseHandle(fHdl);
|
|
return bRet;
|
|
}
|