Source code of Windows XP (NT5)
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

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