256 lines
5.5 KiB
C++
256 lines
5.5 KiB
C++
|
//
|
||
|
// Copyright (c) 1997-1999 Microsoft Corporation.
|
||
|
//
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "eudcedit.h"
|
||
|
|
||
|
#pragma pack(2)
|
||
|
|
||
|
#include "ttfstruc.h"
|
||
|
#include "vdata.h"
|
||
|
#include "extfunc.h"
|
||
|
|
||
|
#define EUDCCODEBASE ((unsigned short)0xe000)
|
||
|
/*
|
||
|
File Structure */
|
||
|
|
||
|
struct W31_Header {
|
||
|
char identify[72];
|
||
|
unsigned char segCnt[2]; /* ??? */
|
||
|
unsigned char sCode[2],
|
||
|
eCode[2];
|
||
|
unsigned short cCnt; // Max character count
|
||
|
unsigned long ofsCmap; // CMAP table offset
|
||
|
unsigned short sizCmap; // Size of CMAP table
|
||
|
unsigned long ofsHCmap;
|
||
|
unsigned short sizHCmap;
|
||
|
unsigned long ofsStbl; // Search table
|
||
|
unsigned short sizStbl; // Size of search table
|
||
|
unsigned long ofsBdatSub; // Sub table of bitmap data
|
||
|
};
|
||
|
|
||
|
struct BDatSubTbl {
|
||
|
unsigned long tail;
|
||
|
long locStartOfs;
|
||
|
unsigned long head;
|
||
|
short filler2;
|
||
|
/* Following Pointer tbl. */
|
||
|
};
|
||
|
struct BMPHeader {
|
||
|
unsigned long bitmapSiz;
|
||
|
unsigned short xsiz, ysiz;
|
||
|
};
|
||
|
|
||
|
struct SrchEntry {
|
||
|
unsigned short sCode;
|
||
|
unsigned short eCode;
|
||
|
unsigned short sloc;
|
||
|
};
|
||
|
/************************
|
||
|
* Tables
|
||
|
*/
|
||
|
/*
|
||
|
* For Japan
|
||
|
*/
|
||
|
|
||
|
#if (WINVER >= 0x0500)
|
||
|
static struct W31_Header W31Hdr= {
|
||
|
"Windows EUDC Editor Bitmap File (Uni-Code) ",
|
||
|
{(unsigned char)0x0, (unsigned char)0x1},
|
||
|
{(unsigned char)0xe0, (unsigned char)0x00},
|
||
|
{(unsigned char)0xf8, (unsigned char)0xff},
|
||
|
(unsigned short)6400,
|
||
|
(unsigned long) 0,
|
||
|
(unsigned short)0,
|
||
|
(unsigned long)0,
|
||
|
(unsigned short) 512,
|
||
|
(unsigned long)0,
|
||
|
(unsigned short)0,
|
||
|
(unsigned long)0
|
||
|
};
|
||
|
#else
|
||
|
static struct W31_Header W31Hdr= {
|
||
|
"Windows95 EUDC Editor Bitmap File (Uni-Code) ",
|
||
|
{(unsigned char)0x0, (unsigned char)0x1},
|
||
|
{(unsigned char)0xe0, (unsigned char)0x00},
|
||
|
{(unsigned char)0xe7, (unsigned char)0x57},
|
||
|
(unsigned short)1880,
|
||
|
(unsigned long) 0,
|
||
|
(unsigned short)0,
|
||
|
(unsigned long)0,
|
||
|
(unsigned short) 512,
|
||
|
(unsigned long)0,
|
||
|
(unsigned short)0,
|
||
|
(unsigned long)0
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
static struct SrchEntry cSrchEntry = {
|
||
|
(unsigned short)0xE000,(unsigned short)0xE757,(unsigned short)0
|
||
|
};
|
||
|
|
||
|
static void
|
||
|
setFileHeader( )
|
||
|
{
|
||
|
struct W31_Header *hdr;
|
||
|
unsigned short maxCode;
|
||
|
|
||
|
maxCode = getMaxUniCode();
|
||
|
hdr = &W31Hdr;
|
||
|
hdr->eCode[0] = (unsigned char)(maxCode>>8);
|
||
|
hdr->eCode[1] = (unsigned char)(maxCode & 0xff);
|
||
|
hdr->cCnt = maxCode - EUDCCODEBASE +1;
|
||
|
hdr->ofsCmap = sizeof(struct W31_Header);
|
||
|
hdr->sizCmap = hdr->cCnt*2;
|
||
|
hdr->ofsHCmap = hdr->ofsCmap + hdr->sizCmap;
|
||
|
hdr->ofsStbl = hdr->ofsHCmap+hdr->sizHCmap;
|
||
|
hdr->sizStbl = sizeof(struct SrchEntry);
|
||
|
hdr->ofsBdatSub = hdr->ofsStbl + hdr->sizStbl;
|
||
|
|
||
|
cSrchEntry.sCode = EUDCCODEBASE;
|
||
|
cSrchEntry.eCode = maxCode;
|
||
|
return;
|
||
|
}
|
||
|
static int
|
||
|
makeCodeMap( char **mem, unsigned int *msiz)
|
||
|
{
|
||
|
unsigned short code;
|
||
|
unsigned short *cbuf;
|
||
|
unsigned short startC, endC;
|
||
|
|
||
|
*msiz = W31Hdr.cCnt*2;
|
||
|
if ( (*mem = (char *)malloc(*msiz)) == (char *)0)
|
||
|
return -1;
|
||
|
cbuf = (unsigned short *)*mem;
|
||
|
|
||
|
startC = cSrchEntry.sCode;
|
||
|
endC = cSrchEntry.eCode = getMaxUniCode();
|
||
|
for ( code = startC; code <= endC; code++, cbuf++)
|
||
|
*cbuf = code;
|
||
|
return 0;
|
||
|
}
|
||
|
static int
|
||
|
makeHCMap( char **mem, unsigned int *msiz)
|
||
|
{
|
||
|
unsigned short *hcp;
|
||
|
unsigned short hc;
|
||
|
unsigned short sofs;
|
||
|
unsigned short start, end;
|
||
|
|
||
|
*msiz = W31Hdr.sizHCmap;
|
||
|
|
||
|
if ( (*mem = (char *)malloc( *msiz))==(char *)0)
|
||
|
return -1;
|
||
|
memset( *mem, 0xff, *msiz);
|
||
|
hcp = (unsigned short *)*mem;
|
||
|
sofs = (unsigned short)0;
|
||
|
start = (unsigned short)W31Hdr.sCode[0];
|
||
|
end = (unsigned short)W31Hdr.eCode[0];
|
||
|
for ( hc = start; hc <= end; hc++) {
|
||
|
*(hcp+hc) = (unsigned short)0;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
static int
|
||
|
makeSrchTbl( char **mem, unsigned int *msiz)
|
||
|
{
|
||
|
|
||
|
*msiz = sizeof(struct SrchEntry);
|
||
|
if ( (*mem = (char *)malloc( *msiz))==(char *)0)
|
||
|
return -1;
|
||
|
|
||
|
memcpy( *mem, &cSrchEntry, *msiz);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
static int
|
||
|
makeBdatSub( char **mem, unsigned int *msiz)
|
||
|
{
|
||
|
struct BDatSubTbl *bdtbl;
|
||
|
*msiz = (W31Hdr.cCnt)*4 + sizeof(struct BDatSubTbl);
|
||
|
if ( (*mem = (char *)malloc(*msiz))==(char *)0)
|
||
|
return -1;
|
||
|
memset( *mem, 0, *msiz);
|
||
|
bdtbl = (struct BDatSubTbl *)*mem;
|
||
|
bdtbl->head = bdtbl->tail = *msiz;
|
||
|
bdtbl->locStartOfs=sizeof(struct BDatSubTbl);
|
||
|
return 0;
|
||
|
}
|
||
|
/***************************************************************
|
||
|
* Create EUDC Bitmap File (.EUF)
|
||
|
*/
|
||
|
/* */ int
|
||
|
/* */ creatW31JEUDC(
|
||
|
/* */ TCHAR *path) /* .EUF file path */
|
||
|
/*
|
||
|
* returns : 0, -1
|
||
|
***************************************************************/
|
||
|
{
|
||
|
HANDLE fh;
|
||
|
char *mem;
|
||
|
unsigned int msiz;
|
||
|
DWORD nByte;
|
||
|
BOOL res;
|
||
|
|
||
|
|
||
|
mem = (char *)0;
|
||
|
makeUniCodeTbl();
|
||
|
fh = CreateFile(path,
|
||
|
GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||
|
NULL,
|
||
|
CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
|
||
|
if ( fh == INVALID_HANDLE_VALUE)
|
||
|
goto ERET;
|
||
|
|
||
|
/* File Header */
|
||
|
setFileHeader( );
|
||
|
res =WriteFile( fh, (char *)&W31Hdr, sizeof(W31Hdr), &nByte, NULL);
|
||
|
if (!res || nByte !=sizeof(W31Hdr))
|
||
|
goto ERET;
|
||
|
/* Code Map */
|
||
|
if (makeCodeMap( &mem, &msiz))
|
||
|
goto ERET;
|
||
|
res =WriteFile( fh, mem, msiz, &nByte, NULL);
|
||
|
if (!res || nByte !=msiz)
|
||
|
goto ERET;
|
||
|
free(mem);
|
||
|
|
||
|
/* High Byte Mapping for Search table */
|
||
|
if ( makeHCMap( &mem, &msiz))
|
||
|
goto ERET;
|
||
|
res =WriteFile( fh, mem, msiz, &nByte, NULL);
|
||
|
if (!res || nByte !=msiz)
|
||
|
goto ERET;
|
||
|
free(mem);
|
||
|
|
||
|
/* Srch Table */
|
||
|
if (makeSrchTbl( &mem, &msiz))
|
||
|
goto ERET;
|
||
|
res =WriteFile( fh, mem, msiz, &nByte, NULL);
|
||
|
if (!res || nByte !=msiz)
|
||
|
goto ERET;
|
||
|
free(mem);
|
||
|
|
||
|
/* Segment Def Header */
|
||
|
makeBdatSub( &mem, &msiz);
|
||
|
res =WriteFile( fh, mem, msiz, &nByte, NULL);
|
||
|
if (!res || nByte !=msiz)
|
||
|
goto ERET;
|
||
|
free(mem);
|
||
|
CloseHandle( fh);
|
||
|
return 0;
|
||
|
ERET:
|
||
|
if ( mem!=(char *)0)
|
||
|
free( mem);
|
||
|
if ( fh != INVALID_HANDLE_VALUE)
|
||
|
CloseHandle( fh);
|
||
|
return -1;
|
||
|
}
|
||
|
/* EOF */
|