windows-nt/Source/XPSP1/NT/shell/osshell/accesory/eudcedit/create.cpp
2020-09-26 16:20:57 +08:00

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