|
|
//
// 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 */
|