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.
306 lines
5.7 KiB
306 lines
5.7 KiB
|
|
|
|
/*
|
|
* Bitmap and TTF control
|
|
*
|
|
* Copyright (c) 1997-1999 Microsoft Corporation.
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "eudcedit.h"
|
|
|
|
|
|
#pragma pack(2)
|
|
|
|
|
|
#include "vdata.h"
|
|
#include "ttfstruc.h"
|
|
#include "extfunc.h"
|
|
|
|
static void reverseBMP( unsigned char *mem, int siz);
|
|
static int makeNullGlyph( int lstH, struct BBX *bbx, short uPEm);
|
|
|
|
#define OUTLSTH 0
|
|
#define TMPLSTH 1
|
|
#define NGLYPHLSTH 3
|
|
static int init = 0;
|
|
static int inputSiz = 0;
|
|
/***********************************************************************
|
|
* initialize
|
|
*/
|
|
/* */ int
|
|
/* */ OInit( )
|
|
/*
|
|
* returns 0 , -1 (Failed)
|
|
***********************************************************************/
|
|
{
|
|
if ( init)
|
|
return 0;
|
|
|
|
|
|
if (VDInit())
|
|
return -1;
|
|
else {
|
|
init = 1;
|
|
return 0;
|
|
}
|
|
}
|
|
/***********************************************************************
|
|
* initialize
|
|
*/
|
|
/* */ int
|
|
/* */ OTerm( )
|
|
/*
|
|
* returns 0
|
|
***********************************************************************/
|
|
{
|
|
if ( init) {
|
|
init = 0;
|
|
VDTerm();
|
|
}
|
|
return 0;
|
|
}
|
|
/***********************************************************************
|
|
* Make Outline
|
|
*/
|
|
/* */ int
|
|
/* */ OMakeOutline(
|
|
/* */ unsigned char *buf,
|
|
/* */ int siz,
|
|
/* */ int level)
|
|
/*
|
|
* returns : 0< : list handle, -1 ( error)
|
|
***********************************************************************/
|
|
{
|
|
int pb1, pb2, pb3;
|
|
struct SMOOTHPRM prm;
|
|
unsigned char *tmp1, *tmp2;
|
|
int msiz;
|
|
|
|
inputSiz = siz;
|
|
reverseBMP( buf, ((siz+15)/16*2*siz));
|
|
if ( init==0)
|
|
if (OInit()) return -1;
|
|
|
|
tmp1 = tmp2 = (unsigned char *)0;
|
|
BMPInit();
|
|
|
|
msiz = (siz+15)/16*2 * siz;
|
|
|
|
if ( (tmp1 = (unsigned char *)malloc( msiz))==(unsigned char *)0)
|
|
goto ERET;
|
|
if ( (tmp2 = (unsigned char *)malloc( msiz))==(unsigned char *)0)
|
|
goto ERET;
|
|
if ( (pb1 = BMPDefine( buf, siz, siz))<0)
|
|
goto ERET;
|
|
|
|
if ( (pb2 = BMPDefine( tmp1, siz, siz))<0)
|
|
goto ERET;
|
|
if ( (pb3 = BMPDefine( tmp2, siz, siz))<0)
|
|
goto ERET;
|
|
|
|
VDNew( OUTLSTH);
|
|
if (BMPMkCont( pb1, pb2, pb3, OUTLSTH)<0)
|
|
goto ERET;
|
|
prm.SmoothLevel = level;
|
|
prm.UseConic = 1;
|
|
/* 入力の4倍で小数点以下4ビットで計算 */
|
|
if (SmoothVector( OUTLSTH, TMPLSTH, siz, siz,siz*4, &prm, 16))
|
|
goto ERET;
|
|
|
|
VDCopy( OUTLSTH, TMPLSTH);
|
|
RemoveFp( TMPLSTH, siz*4, 16);
|
|
|
|
free( tmp1);
|
|
free( tmp2);
|
|
BMPFreDef( pb1);
|
|
BMPFreDef( pb2);
|
|
BMPFreDef( pb3);
|
|
reverseBMP( buf, ((siz+15)/16*2*siz));
|
|
|
|
/* 返すのは、入力の4倍にしたもの */
|
|
return TMPLSTH;
|
|
ERET:
|
|
if ( tmp1) free( tmp1);
|
|
if ( tmp2) free( tmp2);
|
|
BMPFreDef( pb1);
|
|
BMPFreDef( pb2);
|
|
BMPFreDef( pb3);
|
|
return -1;
|
|
}
|
|
/***********************************************************************
|
|
* check File exist
|
|
*/
|
|
/* */ int
|
|
/* */ OExistTTF( TCHAR *path)
|
|
/*
|
|
* returns : 0, 1 (exist)
|
|
***********************************************************************/
|
|
{
|
|
HANDLE fh;
|
|
fh = CreateFile(path,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fh == INVALID_HANDLE_VALUE) return 0;
|
|
CloseHandle( fh);
|
|
return 1;
|
|
}
|
|
#ifdef BUILD_ON_WINNT
|
|
int OExistUserFont( TCHAR *path)
|
|
{
|
|
HANDLE fh;
|
|
fh = CreateFile(path,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if ( fh == INVALID_HANDLE_VALUE)
|
|
return 0;
|
|
CloseHandle( fh);
|
|
return 1;
|
|
}
|
|
#endif // BUILD_ON_WINNT
|
|
static void
|
|
setWIFEBBX( struct BBX *bbx, short *uPEm)
|
|
{
|
|
|
|
bbx->xMin = 0;
|
|
bbx->xMax = 255;
|
|
bbx->yMin = 0;
|
|
bbx->yMax = 255;
|
|
*uPEm = 256;
|
|
}
|
|
/***********************************************************************
|
|
* Create EUDC TTF
|
|
*/
|
|
/* */ int
|
|
/* */ OCreateTTF(
|
|
/* */ HDC hDC,
|
|
/* */ TCHAR *path,
|
|
/* */ int fontType)
|
|
/*
|
|
* returns : 0, -1
|
|
***********************************************************************/
|
|
{
|
|
struct BBX bbx;
|
|
short uPEm;
|
|
|
|
if ( fontType)
|
|
setWIFEBBX( &bbx, &uPEm);
|
|
else {
|
|
if (TTFGetBBX( hDC, &bbx, &uPEm))
|
|
goto ERET;
|
|
}
|
|
makeNullGlyph( NGLYPHLSTH, &bbx, uPEm);
|
|
if (TTFCreate( hDC, path, &bbx, NGLYPHLSTH, fontType))
|
|
goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
/***********************************************************************
|
|
* Output to EUDC TTF
|
|
*/
|
|
/* */ int
|
|
/* */ OOutTTF(
|
|
/* */ HDC hDC,
|
|
/* */ TCHAR *path, /* TrueType Path */
|
|
/* */ unsigned short code,
|
|
/* */ BOOL bUnicode)
|
|
/*
|
|
* returns : 0, -1
|
|
***********************************************************************/
|
|
{
|
|
int mesh;
|
|
struct BBX bbx;
|
|
short uPEm;
|
|
int sts;
|
|
|
|
if (TTFGetEUDCBBX( path, &bbx, &uPEm))
|
|
goto ERET;
|
|
|
|
mesh = uPEm;
|
|
/* OUTLSTH mesh is inputBitmapSiz*4 , and made into ufp 4bit*/
|
|
/* ufp : under Fixed Point */
|
|
ConvMesh( OUTLSTH, inputSiz*4, mesh);
|
|
RemoveFp( OUTLSTH, mesh, 16);
|
|
|
|
if (toTTFFrame( OUTLSTH, &bbx))
|
|
goto ERET;
|
|
if (!bUnicode)
|
|
{
|
|
code = sjisToUniEUDC( code);
|
|
}
|
|
if ( sts = TTFAddEUDCChar( path,code, &bbx, OUTLSTH)) {
|
|
if (sts == -3) // tte file is being used by another process.
|
|
return -3;
|
|
if ( TTFLastError()==-2)
|
|
return -2;
|
|
else return -1;
|
|
}
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
static void
|
|
smtoi( unsigned short *s)
|
|
{
|
|
unsigned short sval;
|
|
unsigned char *c;
|
|
|
|
c = (unsigned char *)s;
|
|
sval = *c;
|
|
sval<<=8;
|
|
sval += (unsigned short)*c;
|
|
}
|
|
static void
|
|
reverseBMP( unsigned char *mem, int siz)
|
|
{
|
|
while ( siz-->0)
|
|
*mem++ ^= (unsigned char)0xff;
|
|
}
|
|
static int
|
|
makeNullGlyph( int lstH, struct BBX *bbx, short uPEm)
|
|
{
|
|
int width;
|
|
int height;
|
|
int cx, cy;
|
|
int dx, dy;
|
|
struct vecdata vd;
|
|
|
|
width = height = uPEm;
|
|
cx = bbx->xMin + width/2;
|
|
cy = bbx->yMin + height/2;
|
|
dx = width/20;
|
|
dy = height/20;
|
|
|
|
VDNew( lstH);
|
|
|
|
vd.atr = 0;
|
|
vd.x = cx - dx;
|
|
vd.y = cy - dy;
|
|
|
|
if (VDSetData( lstH, &vd)) goto ERET;
|
|
vd.y = cy + dy;
|
|
|
|
if (VDSetData( lstH, &vd)) goto ERET;
|
|
vd.x = cx + dx;
|
|
|
|
if (VDSetData( lstH, &vd)) goto ERET;
|
|
vd.y = cy - dy;
|
|
|
|
if (VDSetData( lstH, &vd)) goto ERET;
|
|
if ( VDClose( lstH)) goto ERET;
|
|
return 0;
|
|
ERET:
|
|
return -1;
|
|
}
|
|
/* EOF */
|