1548 lines
37 KiB
C
1548 lines
37 KiB
C
/*
|
||
* CDE - Common Desktop Environment
|
||
*
|
||
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
||
*
|
||
* These libraries and programs are free software; you can
|
||
* redistribute them and/or modify them under the terms of the GNU
|
||
* Lesser General Public License as published by the Free Software
|
||
* Foundation; either version 2 of the License, or (at your option)
|
||
* any later version.
|
||
*
|
||
* These libraries and programs are distributed in the hope that
|
||
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
* PURPOSE. See the GNU Lesser General Public License for more
|
||
* details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with these libraries and programs; if not, write
|
||
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||
* Floor, Boston, MA 02110-1301 USA
|
||
*/
|
||
/* $XConsortium: gpftobdf.c /main/5 1996/11/08 02:04:24 cde-fuj $ */
|
||
/*
|
||
* (c) Copyright 1995 FUJITSU LIMITED
|
||
* This is source code modified by FUJITSU LIMITED under the Joint
|
||
* Development Agreement for the CDEnext PST.
|
||
* This is unpublished proprietary source code of FUJITSU LIMITED
|
||
*/
|
||
|
||
|
||
#include <stdio.h>
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <string.h>
|
||
#include <fcntl.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
#include <X11/fonts/font.h>
|
||
#include <X11/X.h>
|
||
#include <X11/Xproto.h>
|
||
#include <X11/Xmd.h>
|
||
#include <X11/Intrinsic.h>
|
||
#include <ctype.h>
|
||
#include <errno.h>
|
||
#include <X11/fonts/fontstruct.h>
|
||
#include "snfstruct.h"
|
||
#include <time.h>
|
||
#include "bdftosnf.h"
|
||
#include <memory.h>
|
||
#if defined( SVR4 )
|
||
#include <sys/mman.h>
|
||
#endif
|
||
|
||
#include "udccom.h"
|
||
#include "udcutil.h"
|
||
|
||
#define GLYPHPADOPTIONS 4
|
||
#define SIZEOF_COMPRESSED_METRIC 5
|
||
|
||
#include "gtobdf.h"
|
||
#include "pcf.h"
|
||
|
||
typedef struct pcf_tmp {
|
||
FontInfoRec info;
|
||
int ntables;
|
||
PCFTablePtr tables;
|
||
int nprops;
|
||
FontPropPtr props;
|
||
char *isStringProp;
|
||
int str_length;
|
||
char *string;
|
||
int nbitmaps;
|
||
CARD32 bmp_fmt; /* bitOrder ,byteOrder, glyph, scan */
|
||
CARD32 *offsets;
|
||
int sizebitmaps;
|
||
char *bitmaps;
|
||
CARD32 enc_fmt;
|
||
CARD16 *encodingOffsets;
|
||
size_t pcf_bufsz;
|
||
caddr_t pcf_buffer;
|
||
|
||
/* scale width */
|
||
CARD32 swd_fmt ;
|
||
int swd_num ;
|
||
CARD32 *swidth ;
|
||
|
||
/* glyph name */
|
||
CARD32 glyph_fmt ;
|
||
unsigned int glyphs ;
|
||
int *glyph_offset ;
|
||
char *glyph_name ;
|
||
|
||
/* metrics */
|
||
int compress ;
|
||
CARD32 mtr_fmt ;
|
||
int mtr_num ;
|
||
xCharInfo *metrics;
|
||
|
||
} PcfTmp;
|
||
|
||
typedef struct prop_tmp {
|
||
char *font_name;
|
||
FontPropRec psize;
|
||
FontPropRec resolution;
|
||
} PropTmp;
|
||
|
||
|
||
|
||
static char *readfontfile(char *fname);
|
||
static void Anafprop(FontInfoRec *fip,
|
||
FontPropRec *fpropPtr,
|
||
char *fpropvnPtr,
|
||
char **fontname,
|
||
FontPropRec **fplistPtr,
|
||
FontPropRec *ps,
|
||
FontPropRec *res,
|
||
unsigned int *fplistNum);
|
||
static void pSIZE(FontPropRec *ps, FontPropRec *res);
|
||
static void pPROPS(FontInfoRec *fip,
|
||
FontPropRec *fplistPtr,
|
||
unsigned int fplistNum);
|
||
static void pCHARS(FontInfoRec *fip,
|
||
CharInfoRec *cip,
|
||
char *glyphPtr,
|
||
unsigned int charNum,
|
||
unsigned int glyphPad);
|
||
static void pfixCHARS(FontInfoRec *fip,
|
||
CharInfoRec *cip,
|
||
char *glyphPtr,
|
||
unsigned int charNum,
|
||
unsigned int glyphPad);
|
||
static int getarg(int argc,
|
||
char *argv[],
|
||
char *fname,
|
||
int *bitorder,
|
||
int *byteorder,
|
||
int *scanunit,
|
||
int *glyphPad,
|
||
int *outLevel,
|
||
int *fix);
|
||
|
||
static Bool seekToType(PCFTablePtr tables,
|
||
int ntables,
|
||
CARD32 type,
|
||
CARD32 *formatp,
|
||
CARD32 *sizep,
|
||
CARD32 *offsetp);
|
||
static void getMetric(caddr_t buf, CARD32 format, xCharInfo *metric) ;
|
||
static Bool getAccel(FontInfoPtr pFontInfo,
|
||
xCharInfo *maxink,
|
||
caddr_t buf_top,
|
||
PCFTablePtr tables,
|
||
int ntables,
|
||
CARD32 type);
|
||
static Bool getProperties(PcfTmp *pcf,
|
||
caddr_t buf_top,
|
||
PCFTablePtr tables,
|
||
int ntables);
|
||
static void putPtn(unsigned char *bits, int width, int height);
|
||
static void ByteSwap(char *p, int scan);
|
||
static void invertBits(char *src,
|
||
CARD32 format,
|
||
int width,
|
||
int height,
|
||
char *dest) ;
|
||
|
||
static int getINT16(unsigned char *p, CARD32 format);
|
||
static int getINT32(unsigned char *p, CARD32 format);
|
||
static CARD32 getLSB32(unsigned char *p);
|
||
static char *make_toptn(int width, int height);
|
||
static void pSIZE_pcf(PropTmp *proptmp);
|
||
static PcfTmp *openPcfFont(char *fontname);
|
||
static void setProp(PcfTmp *pcf, PropTmp *proptmp);
|
||
static void pPROPS_pcf(PcfTmp *pcf);
|
||
static void pCHARS_pcf(PcfTmp *pcf, int fix);
|
||
static void BitOrderInvert(unsigned char *buf, int nbytes);
|
||
static char *bufp,buf[2048];
|
||
|
||
extern int ChkPcfFontFile(char *filename);
|
||
|
||
|
||
int main( int argc, char *argv[] )
|
||
{
|
||
int i,k;
|
||
|
||
|
||
char *fp; /* font */
|
||
FontInfoRec *fip; /* font information */
|
||
CharInfoRec *cip, *wkcip; /* character information */
|
||
unsigned int glyphstotal; /* glyph */
|
||
unsigned int charInfoNum ; /* character information's number */
|
||
unsigned int charNum; /* define character number */
|
||
char *glyphPtr; /* glyph */
|
||
FontPropRec *fpropPtr,*fplistPtr; /* font property list */
|
||
FontPropRec psprop; /* point size property */
|
||
FontPropRec resprop; /* resolution property */
|
||
char *fpropvnPtr;
|
||
|
||
unsigned int fplistNum; /* font property number */
|
||
char *fontname; /* fontname */
|
||
time_t clock;
|
||
struct tm *tm;
|
||
char tmbuf[80] ;
|
||
|
||
char fname[1024]; /* snf filename */
|
||
int bitorder; /* bitorder */
|
||
int byteorder; /* byteorder */
|
||
int scanunit; /* scanunit */
|
||
int glyphPad ; /* glyph */
|
||
int outLevel; /* output information level */
|
||
int fix;
|
||
|
||
|
||
int isPcf;
|
||
|
||
PcfTmp *pcf;
|
||
PropTmp proptmp;
|
||
char *tmpfname;
|
||
extern char *GetRealFileName();
|
||
|
||
|
||
if (getarg(argc,argv,fname,&bitorder,&byteorder,&scanunit,&glyphPad,
|
||
&outLevel,&fix) != 0) {
|
||
exit( -1 );
|
||
}
|
||
|
||
/*
|
||
* read to fontfile
|
||
*/
|
||
if ( ( tmpfname = GetRealFileName( fname ) ) == NULL ) {
|
||
USAGE("dtgpftobdf: cannot refer to substance file.\n" );
|
||
exit( -1 );
|
||
}
|
||
if ( strcmp( tmpfname, fname ) != 0 ){
|
||
strcpy( fname, tmpfname );
|
||
}
|
||
|
||
if ( ChkPcfFontFile( fname ) == 0 ){
|
||
/* pcf font */
|
||
isPcf = 1;
|
||
if ( !( pcf = openPcfFont( fname ) ) ) {
|
||
USAGE("dtgpftobdf: cannot open font\n" );
|
||
exit( -1 );
|
||
}
|
||
} else {
|
||
/* snf font */
|
||
isPcf = 0;
|
||
if ( ( fp = readfontfile( fname ) ) == (char *)-1 ) {
|
||
exit( -1 );
|
||
}
|
||
}
|
||
|
||
|
||
if ( !isPcf ) {
|
||
/* SNF format */
|
||
COMM_SNF_GETHEADER( fip, fp ) ;
|
||
|
||
cip = (CharInfoRec *)((char *)fip + sizeof(FontInfoRec));
|
||
|
||
charInfoNum = (fip->lastCol - fip->firstCol + 1)
|
||
*(fip->lastRow - fip->firstRow + 1);
|
||
glyphPtr = ((char *)cip) + ( charInfoNum * sizeof(CharInfoRec) );
|
||
|
||
charNum = charInfoNum ;
|
||
wkcip = cip ;
|
||
|
||
glyphPad = (((fip->maxbounds.rightSideBearing
|
||
- fip->maxbounds.leftSideBearing)+31)/32)*4;
|
||
|
||
if ( fix == TRUE ) {
|
||
for ( i = 0; i < charInfoNum; i++ ) {
|
||
wkcip++;
|
||
}
|
||
} else {
|
||
glyphstotal = 0 ;
|
||
for ( i = 0; i < charInfoNum; i++ ) {
|
||
glyphstotal += (wkcip->metrics.ascent
|
||
+ wkcip->metrics.descent) * glyphPad;
|
||
wkcip++;
|
||
}
|
||
}
|
||
|
||
fpropPtr = (FontPropRec *)(glyphPtr + glyphstotal);
|
||
fpropvnPtr = ((char *)fpropPtr) + (fip->nprops) * sizeof(FontPropRec);
|
||
|
||
}
|
||
|
||
|
||
if ( isPcf ) {
|
||
setProp( pcf, &proptmp );
|
||
} else {
|
||
fontname = (char *)0;
|
||
Anafprop(
|
||
fip, fpropPtr,
|
||
fpropvnPtr, &fontname,
|
||
&fplistPtr,
|
||
&psprop, &resprop,
|
||
&fplistNum
|
||
);
|
||
}
|
||
|
||
/*
|
||
*<2A><>output to BDF information
|
||
*/
|
||
bufp = buf;
|
||
memcpy(bufp,"STARTFONT 2.1\n",14);
|
||
bufp += 14;
|
||
memcpy(bufp,"COMMENT\n",8);
|
||
bufp += 8;
|
||
memcpy(bufp,"COMMENT This BDF was created by dtgpftobdf.\n",45 );
|
||
bufp += 45 ;
|
||
memcpy(bufp,"COMMENT\n",8);
|
||
bufp += 8;
|
||
time(&clock);
|
||
tm = localtime(&clock);
|
||
|
||
snprintf( tmbuf, sizeof(tmbuf), "%s", asctime(tm) ) ;
|
||
|
||
k = sprintf(bufp,"COMMENT Created date : %s\n",tmbuf );
|
||
bufp += k-1;
|
||
memcpy(bufp,"COMMENT\n",8);
|
||
bufp += 8;
|
||
|
||
if ( isPcf ) {
|
||
k = sprintf(bufp,"FONT %s\n",proptmp.font_name);
|
||
bufp += k;
|
||
*bufp = '\0';
|
||
fprintf( stdout,"%s",buf );
|
||
pSIZE_pcf( &proptmp );
|
||
fprintf( stdout,"FONTBOUNDINGBOX %d %d %d %d\n",
|
||
pcf->info.maxbounds.rightSideBearing
|
||
- pcf->info.maxbounds.leftSideBearing,
|
||
pcf->info.maxbounds.ascent
|
||
+ pcf->info.maxbounds.descent,
|
||
pcf->info.maxbounds.leftSideBearing,
|
||
- ( pcf->info.maxbounds.descent )
|
||
);
|
||
pPROPS_pcf( pcf );
|
||
if ( outLevel == FALSE ) {
|
||
pCHARS_pcf( pcf, fix );
|
||
}
|
||
} else {
|
||
k = sprintf( bufp,"FONT %s\n",fontname );
|
||
bufp += k;
|
||
*bufp = '\0';
|
||
fprintf( stdout,"%s",buf );
|
||
pSIZE( &psprop, &resprop );
|
||
fprintf( stdout,"FONTBOUNDINGBOX %d %d %d %d\n",
|
||
cip->metrics.rightSideBearing
|
||
- cip->metrics.leftSideBearing,
|
||
cip->metrics.ascent + cip->metrics.descent,
|
||
cip->metrics.leftSideBearing,
|
||
-(cip->metrics.descent)
|
||
);
|
||
pPROPS( fip,fplistPtr,fplistNum );
|
||
if ( outLevel == FALSE ) {
|
||
if ( fix == TRUE ) {
|
||
pfixCHARS( fip,cip,glyphPtr,charNum, glyphPad );
|
||
} else {
|
||
pCHARS(fip,cip,glyphPtr,charNum,glyphPad);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
fprintf( stdout,"ENDFONT\n" );
|
||
exit( 0 );
|
||
}
|
||
|
||
/*
|
||
* read to font file
|
||
*/
|
||
static char *readfontfile( char *fname )
|
||
{
|
||
int fd;
|
||
char *fp = NULL;
|
||
struct stat stat;
|
||
|
||
fd = open( fname,O_RDONLY );
|
||
if ( fd < 0 ) {
|
||
USAGE("dtgpftobdf: can't open file.\n" );
|
||
return ( char * )-1;
|
||
}
|
||
#if defined( SVR4 )
|
||
if ( fstat( fd,&stat ) == 0 ) {
|
||
fp = (char *)mmap( 0, stat.st_size, PROT_READ, MAP_SHARED, fd, 0 );
|
||
if ( fp == (char *)-1 ) {
|
||
if ( ( fp = ( char * )malloc( stat.st_size ) ) == NULL ) {
|
||
USAGE("dtgpftobdf: malloc error.\n" );
|
||
close( fd );
|
||
return ( char * )-1;
|
||
}
|
||
/* if ( read( fd, fp, stat.st_size ) < 0 ) {*/
|
||
if ( read( fd, fp, stat.st_size ) != stat.st_size ) {
|
||
USAGE("dtgpftobdf: can't read file.\n" );
|
||
close( fd );
|
||
return ( char * )-1;
|
||
}
|
||
}
|
||
} else {
|
||
USAGE("dtgpftobdf: can't read file\n" );
|
||
close( fd );
|
||
return ( char * )-1;
|
||
}
|
||
close( fd );
|
||
#else /* pfa */
|
||
if ( fstat(fd,&stat) == 0 ) {
|
||
if ( ( fp = (char *)malloc(stat.st_size) ) == NULL ) {
|
||
USAGE("dtgpftobdf: malloc error.\n" );
|
||
close( fd );
|
||
return ( char * )-1;
|
||
}
|
||
if ( read( fd, fp, stat.st_size ) < 0 ) {
|
||
USAGE("dtgpftobdf: can't read file.\n" );
|
||
close( fd );
|
||
free(fp);
|
||
return ( char * )-1;
|
||
}
|
||
} else {
|
||
USAGE("dtgpftobdf: can't read file\n" );
|
||
close( fd );
|
||
return ( char * )-1;
|
||
}
|
||
close( fd );
|
||
#endif /* pfa */
|
||
return fp;
|
||
}
|
||
|
||
|
||
#define getINT8( p ) ( *p++ ) ;
|
||
|
||
static CARD32
|
||
getLSB32( unsigned char *p )
|
||
{
|
||
CARD32 c;
|
||
|
||
c = *p++;
|
||
c |= (CARD32)(*p++) << 8;
|
||
c |= (CARD32)(*p++) << 16;
|
||
c |= (CARD32)(*p) << 24;
|
||
|
||
return c;
|
||
}
|
||
|
||
|
||
static int
|
||
getINT32( unsigned char *p, CARD32 format )
|
||
{
|
||
CARD32 c;
|
||
|
||
if ( PCF_BYTE_ORDER(format) == MSBFirst ) {
|
||
c = (CARD32)(*p++) << 24;
|
||
c |= (CARD32)(*p++) << 16;
|
||
c |= (CARD32)(*p++) << 8;
|
||
c |= (CARD32)(*p);
|
||
} else {
|
||
c = (CARD32)(*p++);
|
||
c |= (CARD32)(*p++) << 8;
|
||
c |= (CARD32)(*p++) << 16;
|
||
c |= (CARD32)(*p) << 24;
|
||
}
|
||
|
||
return ( int )c;
|
||
}
|
||
|
||
static int
|
||
getINT16( unsigned char *p, CARD32 format )
|
||
{
|
||
CARD32 c;
|
||
|
||
if ( PCF_BYTE_ORDER(format) == MSBFirst ) {
|
||
c = (CARD32)(*p++) << 8;
|
||
c |= (CARD32)(*p);
|
||
} else {
|
||
c = (CARD32)(*p++);
|
||
c |= (CARD32)(*p) << 8;
|
||
}
|
||
|
||
return ( int )c;
|
||
}
|
||
|
||
static Bool
|
||
seekToType(
|
||
PCFTablePtr tables,
|
||
int ntables,
|
||
CARD32 type,
|
||
CARD32 *formatp,
|
||
CARD32 *sizep,
|
||
CARD32 *offsetp)
|
||
{
|
||
int i;
|
||
|
||
for ( i = 0; i < ntables; i++ ) {
|
||
if ( getLSB32( (unsigned char *)&tables[i].type) == type) {
|
||
*formatp = getLSB32( (unsigned char *)&tables[i].format);
|
||
*sizep = getLSB32( (unsigned char *)&tables[i].size);
|
||
*offsetp = getLSB32( (unsigned char *)&tables[i].offset);
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
static void
|
||
getMetric( caddr_t buf, CARD32 format, xCharInfo *metric)
|
||
{
|
||
metric->leftSideBearing = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
metric->rightSideBearing = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
metric->characterWidth = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
metric->ascent = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
metric->descent = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
metric->attributes = getINT16( (unsigned char *)buf, format);
|
||
buf += 2;
|
||
}
|
||
|
||
static Bool
|
||
getAccel(
|
||
FontInfoPtr pFontInfo,
|
||
xCharInfo *maxink,
|
||
caddr_t buf_top,
|
||
PCFTablePtr tables,
|
||
int ntables,
|
||
CARD32 type)
|
||
{
|
||
CARD32 format;
|
||
CARD32 size;
|
||
CARD32 offset;
|
||
caddr_t buffer;
|
||
|
||
if ( !seekToType( tables, ntables, type, &format, &size, &offset)) {
|
||
return FALSE;
|
||
}
|
||
|
||
buffer = buf_top + offset;
|
||
format = getLSB32( (unsigned char *)buffer);
|
||
buffer += 4;
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )
|
||
&& !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS )
|
||
) {
|
||
return FALSE;
|
||
}
|
||
pFontInfo->noOverlap = *buffer++;
|
||
pFontInfo->constantMetrics = *buffer++;
|
||
pFontInfo->terminalFont = *buffer++;
|
||
pFontInfo->constantWidth = *buffer++;
|
||
pFontInfo->inkInside = *buffer++;
|
||
pFontInfo->inkMetrics = *buffer++;
|
||
pFontInfo->drawDirection = *buffer++;
|
||
/* natural alignment */
|
||
|
||
buffer++;
|
||
|
||
pFontInfo->fontAscent = getINT32( (unsigned char *)buffer, format);
|
||
buffer += 4;
|
||
|
||
pFontInfo->fontDescent = getINT32((unsigned char *)buffer, format);
|
||
buffer +=4;
|
||
|
||
buffer += 4;
|
||
|
||
getMetric(buffer, format, &pFontInfo->minbounds);
|
||
buffer += 12;
|
||
|
||
getMetric(buffer, format, &pFontInfo->maxbounds);
|
||
buffer += 12;
|
||
|
||
if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) {
|
||
buffer += 12;
|
||
getMetric( buffer, format, maxink);
|
||
} else {
|
||
*maxink = pFontInfo->maxbounds;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
static Bool
|
||
getProperties(PcfTmp *pcf, caddr_t buf_top, PCFTablePtr tables, int ntables)
|
||
{
|
||
CARD32 format;
|
||
CARD32 size;
|
||
CARD32 offset;
|
||
caddr_t buffer;
|
||
int i;
|
||
|
||
if ( !seekToType( tables, ntables, (CARD32)PCF_PROPERTIES, &format, &size, &offset ) ) {
|
||
return FALSE;
|
||
}
|
||
|
||
buffer = buf_top + offset;
|
||
format = getLSB32( (unsigned char *)buffer );
|
||
buffer += 4;
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
return FALSE;
|
||
}
|
||
pcf->nprops = getINT32((unsigned char *)buffer, format);
|
||
buffer += 4;
|
||
|
||
if ( !( pcf->props = ( FontPropPtr )malloc( pcf->nprops * sizeof( FontPropRec ) ) ) ) {
|
||
return FALSE;
|
||
}
|
||
|
||
if ( !( pcf->isStringProp = ( char * )malloc(pcf->nprops * sizeof( char ) ) ) ) {
|
||
return FALSE;
|
||
}
|
||
|
||
for ( i = 0; i < pcf->nprops; i++ ) {
|
||
pcf->props[i].name = getINT32((unsigned char *)buffer, format);
|
||
buffer += 4;
|
||
pcf->isStringProp[i] = *buffer++;
|
||
pcf->props[i].value = getINT32((unsigned char *)buffer, format);
|
||
buffer += 4;
|
||
}
|
||
if ( pcf->nprops & 3 ) {
|
||
i = 4 - (pcf->nprops & 3);
|
||
buffer += i;
|
||
}
|
||
|
||
pcf->str_length = getINT32((unsigned char *)buffer, format);
|
||
buffer += 4;
|
||
|
||
pcf->string = (char *)buffer;
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
static PcfTmp *
|
||
openPcfFont(char *fontname)
|
||
{
|
||
PcfTmp *pcf_tmp;
|
||
|
||
CARD32 format;
|
||
CARD32 size;
|
||
CARD32 offset;
|
||
CARD32 *bitmapSizes;
|
||
xCharInfo maxink;
|
||
caddr_t buffp;
|
||
struct stat st;
|
||
|
||
pcf_tmp = ( PcfTmp * )calloc( 1, sizeof( PcfTmp ) );
|
||
|
||
while(1){
|
||
|
||
if ( !pcf_tmp ) {
|
||
USAGE("dtgpftobdf : calloc() error.\n" ) ;
|
||
break;
|
||
}
|
||
|
||
if ( stat( fontname, &st ) ) {
|
||
break;
|
||
}
|
||
|
||
if ( ( pcf_tmp->pcf_buffer = readfontfile( fontname)) == (char *)-1 ) {
|
||
break;
|
||
}
|
||
|
||
pcf_tmp->pcf_bufsz = st.st_size;
|
||
|
||
if ( (format = getLSB32( (unsigned char *)pcf_tmp->pcf_buffer )) != PCF_FILE_VERSION ) {
|
||
USAGE1("dtgpftobdf : pcf file version(0x%x) error.\n", format ) ;
|
||
break;
|
||
}
|
||
|
||
pcf_tmp->ntables = getLSB32( (unsigned char *)(pcf_tmp->pcf_buffer + 4) );
|
||
pcf_tmp->tables = (PCFTablePtr)(pcf_tmp->pcf_buffer + 8 );
|
||
|
||
if ( !getAccel(
|
||
&pcf_tmp->info, &maxink, pcf_tmp->pcf_buffer,
|
||
pcf_tmp->tables, pcf_tmp->ntables, (CARD32)PCF_BDF_ACCELERATORS
|
||
)
|
||
) {
|
||
if ( !getAccel(
|
||
&pcf_tmp->info, &maxink, pcf_tmp->pcf_buffer,
|
||
pcf_tmp->tables, pcf_tmp->ntables, (CARD32)PCF_ACCELERATORS
|
||
)
|
||
) {
|
||
USAGE("dtgpftobdf : Cannot get accelerators.\n" ) ;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if ( !getProperties(
|
||
pcf_tmp, pcf_tmp->pcf_buffer,
|
||
pcf_tmp->tables, pcf_tmp->ntables
|
||
)
|
||
) {
|
||
USAGE("dtgpftobdf : getProperties error.\n" ) ;
|
||
break;
|
||
}
|
||
if ( !seekToType(
|
||
pcf_tmp->tables, pcf_tmp->ntables,
|
||
(CARD32)PCF_BITMAPS, &format, &size, &offset
|
||
)
|
||
) {
|
||
USAGE("dtgpftobdf : PCF_BITMAPS error.\n" ) ;
|
||
break;
|
||
}
|
||
|
||
buffp = pcf_tmp->pcf_buffer + offset;
|
||
|
||
format = getLSB32( (unsigned char *)buffp);
|
||
buffp += 4;
|
||
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
USAGE("dtgpftobdf : error.!PCF_FORMAT_MATCH(PCF_BITMAPS)\n" ) ;
|
||
break;
|
||
}
|
||
|
||
pcf_tmp->nbitmaps = getINT32( (unsigned char *)buffp, format);
|
||
buffp += 4;
|
||
pcf_tmp->offsets = (CARD32 *)buffp;
|
||
buffp += sizeof( *pcf_tmp->offsets) * pcf_tmp->nbitmaps;
|
||
|
||
|
||
bitmapSizes = (CARD32 *)buffp;
|
||
pcf_tmp->sizebitmaps
|
||
= getINT32( (unsigned char *)&bitmapSizes[PCF_GLYPH_PAD_INDEX(format)], format);
|
||
pcf_tmp->bmp_fmt = format;
|
||
buffp += sizeof( *bitmapSizes) * GLYPHPADOPTIONS;
|
||
pcf_tmp->bitmaps = buffp;
|
||
buffp += pcf_tmp->sizebitmaps;
|
||
|
||
if ( !seekToType(
|
||
pcf_tmp->tables, pcf_tmp->ntables,
|
||
(CARD32)PCF_BDF_ENCODINGS, &format, &size, &offset
|
||
)
|
||
) {
|
||
USAGE("dtgpftobdf : error.(PCF_BDF_ENCODINGS)\n" ) ;
|
||
break;
|
||
}
|
||
|
||
buffp = pcf_tmp->pcf_buffer + offset;
|
||
format = getLSB32( (unsigned char *)buffp);
|
||
buffp += 4;
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
USAGE("dtgpftobdf : error.!PCF_FORMAT_MATCH(PCF_BDF_ENCODINGS)\n" ) ;
|
||
break;
|
||
}
|
||
|
||
pcf_tmp->info.firstCol = getINT16( (unsigned char *)buffp, format);
|
||
buffp += 2;
|
||
pcf_tmp->info.lastCol = getINT16( (unsigned char *)buffp, format);
|
||
buffp += 2;
|
||
pcf_tmp->info.firstRow = getINT16( (unsigned char *)buffp, format);
|
||
buffp += 2;
|
||
pcf_tmp->info.lastRow = getINT16( (unsigned char *)buffp, format);
|
||
buffp += 2;
|
||
pcf_tmp->info.defaultCh = getINT16( (unsigned char *)buffp, format);
|
||
buffp += 2;
|
||
|
||
pcf_tmp->info.allExist = FALSE;
|
||
pcf_tmp->enc_fmt = format;
|
||
pcf_tmp->encodingOffsets = (CARD16 *)buffp;
|
||
|
||
/*
|
||
* get scale width infomations
|
||
*/
|
||
if ( !seekToType(
|
||
pcf_tmp->tables, pcf_tmp->ntables,
|
||
(CARD32)PCF_SWIDTHS, &format, &size, &offset
|
||
)
|
||
) {
|
||
break;
|
||
}
|
||
|
||
buffp = pcf_tmp->pcf_buffer + offset;
|
||
format = getLSB32( (unsigned char*)buffp);
|
||
buffp += 4;
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
break;
|
||
}
|
||
pcf_tmp->swd_fmt = (CARD32)format ;
|
||
pcf_tmp->swd_num = getINT32( (unsigned char*)buffp, format ) ;
|
||
buffp += 4;
|
||
|
||
pcf_tmp->swidth = (CARD32 *)buffp ;
|
||
|
||
/*
|
||
* get glyph names
|
||
*/
|
||
if ( !seekToType(
|
||
pcf_tmp->tables, pcf_tmp->ntables,
|
||
(CARD32)PCF_GLYPH_NAMES, &format, &size, &offset
|
||
)
|
||
) {
|
||
break;
|
||
}
|
||
|
||
buffp = pcf_tmp->pcf_buffer + offset;
|
||
format = getLSB32( (unsigned char*)buffp);
|
||
buffp += 4;
|
||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
break;
|
||
}
|
||
pcf_tmp->glyphs = getINT32( (unsigned char*)buffp, format ) ;
|
||
buffp += 4;
|
||
pcf_tmp->glyph_offset = (int *)buffp ;
|
||
buffp += 4 * (pcf_tmp->glyphs + 1) ;
|
||
pcf_tmp->glyph_name = (char *)buffp ;
|
||
pcf_tmp->glyph_fmt = (CARD32)format ;
|
||
|
||
/*
|
||
* get metrics
|
||
*/
|
||
if ( !seekToType(
|
||
pcf_tmp->tables, pcf_tmp->ntables,
|
||
(CARD32)PCF_METRICS, &format, &size, &offset
|
||
)
|
||
) {
|
||
break;
|
||
}
|
||
|
||
buffp = pcf_tmp->pcf_buffer + offset;
|
||
format = getLSB32( (unsigned char*)buffp);
|
||
buffp += 4;
|
||
if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) {
|
||
pcf_tmp->compress = 0 ;
|
||
pcf_tmp->mtr_num = getINT32( (unsigned char*)buffp, format ) ;
|
||
buffp += 4;
|
||
}else if ( PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) {
|
||
pcf_tmp->compress = 1 ;
|
||
pcf_tmp->mtr_num = (int)getINT16( (unsigned char*)buffp, format ) ;
|
||
buffp += 2;
|
||
}else{
|
||
break;
|
||
}
|
||
pcf_tmp->metrics = (xCharInfo *)buffp ;
|
||
pcf_tmp->mtr_fmt = (CARD32)format ;
|
||
|
||
return pcf_tmp;
|
||
}
|
||
if ( pcf_tmp ) {
|
||
free( pcf_tmp );
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
|
||
static void
|
||
Anafprop(
|
||
FontInfoRec *fip,
|
||
FontPropRec *fpropPtr,
|
||
char *fpropvnPtr,
|
||
char **fontname,
|
||
FontPropRec **fplistPtr,
|
||
FontPropRec *ps,
|
||
FontPropRec *res,
|
||
unsigned int *fplistNum)
|
||
{
|
||
FontPropRec *wkp ,*wklp;
|
||
int i, fpnL;
|
||
char *fpnp;
|
||
|
||
*fplistNum = fip->nprops - 1;
|
||
*fplistPtr = (FontPropRec *)malloc(*fplistNum * sizeof(FontPropRec));
|
||
wkp = fpropPtr;
|
||
wklp = *fplistPtr;
|
||
for (i = 0; i < fip->nprops; i++) {
|
||
fpnp = fpropvnPtr + wkp->name;
|
||
fpnL = strlen(fpnp);
|
||
if ((fpnL == 4) && (strncmp(fpnp,"FONT",4) == 0)) {
|
||
*fontname = fpropvnPtr + wkp->value;
|
||
wkp++;
|
||
continue;
|
||
}
|
||
if (fpnL == 10) {
|
||
if (strncmp(fpnp,"POINT_SIZE",10) == 0) {
|
||
ps->value = wkp->value;
|
||
}
|
||
if (strncmp(fpnp,"RESOLUTION",10) == 0) {
|
||
res->value = wkp->value;
|
||
}
|
||
}
|
||
wklp->name = (CARD32) (intptr_t) fpropvnPtr + wkp->name;
|
||
wklp->value = wkp->value;
|
||
wkp++;
|
||
wklp++;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
static void
|
||
setProp( PcfTmp *pcf, PropTmp *proptmp )
|
||
{
|
||
int i, fpnL;
|
||
char *fpnp;
|
||
|
||
for ( i = 0; i < pcf->nprops; i++ ) {
|
||
fpnp = pcf->string + pcf->props[i].name;
|
||
fpnL = strlen(fpnp);
|
||
if ( ( fpnL == 4 ) && ( strncmp( fpnp,"FONT", 4 ) == 0 ) ) {
|
||
proptmp->font_name = pcf->string + pcf->props[i].value;
|
||
continue;
|
||
}
|
||
if ( fpnL == 10 ) {
|
||
if ( strncmp( fpnp,"POINT_SIZE", 10 ) == 0 ) {
|
||
proptmp->psize.value = pcf->props[i].value;
|
||
} else if ( strncmp( fpnp, "RESOLUTION", 10 ) == 0 ) {
|
||
proptmp->resolution.value = pcf->props[i].value;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* output to SIZE (SIZE point resolutionX resolutionY)
|
||
*
|
||
*/
|
||
static void
|
||
pSIZE( FontPropRec *ps, FontPropRec *res )
|
||
{
|
||
int k;
|
||
float f;
|
||
char buf1[16], buf2[16];
|
||
|
||
f = ps->value / 10.0;
|
||
if ( ( ps->value % 10 ) != 0 ) {
|
||
sprintf( buf1, "%.1f", f );
|
||
} else {
|
||
sprintf( buf1, "%.0f", f );
|
||
}
|
||
k = ( ( res->value * 72.27 ) / 100.0 ) + 1;
|
||
sprintf( buf2, "%d %d", k, k );
|
||
fprintf( stdout, "SIZE %s %s\n", buf1, buf2 );
|
||
return;
|
||
}
|
||
|
||
|
||
/* output to SIZE of pcf font */
|
||
|
||
static void
|
||
pSIZE_pcf( PropTmp *proptmp )
|
||
{
|
||
int k;
|
||
float f;
|
||
char buf1[16],buf2[16];
|
||
|
||
f = proptmp->psize.value / 10.0;
|
||
if ( ( proptmp->psize.value % 10 ) != 0 ) {
|
||
snprintf( buf1, sizeof(buf1), "%.1f",f );
|
||
} else {
|
||
snprintf( buf1, sizeof(buf1), "%.0f",f);
|
||
}
|
||
k = ( ( proptmp->resolution.value * 72.27 ) / 100.0 ) + 1;
|
||
snprintf( buf2, sizeof(buf2), "%d %d", k, k );
|
||
fprintf( stdout,"SIZE %s %s\n", buf1, buf2 );
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
static void
|
||
pPROPS( FontInfoRec *fip, FontPropRec *fplistPtr, unsigned int fplistNum )
|
||
{
|
||
FontPropRec *wkp;
|
||
int i, k;
|
||
|
||
bufp = buf;
|
||
k = snprintf( bufp, sizeof(buf), "STARTPROPERTIES %d\n", fplistNum+3 );
|
||
bufp += k;
|
||
k = snprintf( bufp, sizeof(buf) - (bufp - buf), "FONT_ASCENT %d\n", fip->fontAscent );
|
||
bufp += k;
|
||
k = snprintf( bufp, sizeof(buf) - (bufp - buf), "FONT_DESCENT %d\n", fip->fontDescent );
|
||
bufp += k;
|
||
k = snprintf( bufp, sizeof(buf) - (bufp - buf), "DEFAULT_CHAR %d\n", fip->defaultCh );
|
||
bufp += k;
|
||
wkp = fplistPtr;
|
||
for ( i = 0; i < fplistNum; i++ ) {
|
||
k = snprintf( bufp, sizeof(buf) - (bufp - buf), "%s %ld\n", (char *) (intptr_t) wkp->name, wkp->value );
|
||
bufp += k;
|
||
wkp++;
|
||
}
|
||
k = snprintf( bufp, sizeof(buf) - (bufp - buf), "ENDPROPERTIES\n" );
|
||
bufp += k;
|
||
*bufp = '\0';
|
||
fprintf( stdout, "%s", buf );
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
/* output to font property information of pcf fontpcf */
|
||
static void
|
||
pPROPS_pcf(PcfTmp *pcf)
|
||
{
|
||
FontPropPtr wkp;
|
||
int i, k;
|
||
|
||
bufp = buf;
|
||
k = sprintf( bufp, "STARTPROPERTIES %d\n", pcf->nprops+3 );
|
||
bufp += k;
|
||
k = sprintf( bufp, "FONT_ASCENT %d\n",
|
||
(pcf->info.fontAscent >= pcf->info.maxbounds.ascent)
|
||
? pcf->info.fontAscent : pcf->info.maxbounds.ascent
|
||
);
|
||
bufp += k;
|
||
k = sprintf( bufp, "FONT_DESCENT %d\n",
|
||
(pcf->info.fontDescent >= pcf->info.maxbounds.descent)
|
||
? pcf->info.fontDescent : pcf->info.maxbounds.descent
|
||
);
|
||
bufp += k;
|
||
k = sprintf( bufp, "DEFAULT_CHAR %d\n", pcf->info.defaultCh );
|
||
bufp += k;
|
||
wkp = pcf->props;
|
||
for ( i = 0; i < pcf->nprops; i++ ) {
|
||
if ( pcf->isStringProp[i] ) {
|
||
k = sprintf(bufp,"%s \"%s\"\n",
|
||
pcf->string + wkp->name, pcf->string + wkp->value
|
||
);
|
||
bufp += k;
|
||
} else {
|
||
k = sprintf(bufp,"%s %ld\n",
|
||
pcf->string + wkp->name, wkp->value
|
||
);
|
||
bufp += k;
|
||
}
|
||
wkp++;
|
||
}
|
||
k = sprintf( bufp, "ENDPROPERTIES\n" );
|
||
bufp += k;
|
||
*bufp = '\0';
|
||
fprintf( stdout,"%s",buf );
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* output to character information and patern
|
||
*/
|
||
static void
|
||
pCHARS(
|
||
FontInfoRec *fip,
|
||
CharInfoRec *cip,
|
||
char *glyphPtr,
|
||
unsigned int charNum,
|
||
unsigned int glyphPad)
|
||
{
|
||
CharInfoRec *wkp;
|
||
int i, j;
|
||
unsigned int frow, lrow, row, fcol, lcol, col;
|
||
unsigned int bbw, bbh;
|
||
unsigned int bml;
|
||
char *glyph;
|
||
|
||
fprintf( stdout, "CHARS %d\n", charNum );
|
||
|
||
frow = fip->firstRow;
|
||
lrow = fip->lastRow;
|
||
fcol = fip->firstCol;
|
||
lcol = fip->lastCol;
|
||
wkp = cip;
|
||
glyph = glyphPtr;
|
||
row = frow;
|
||
|
||
for ( i = 0; i < 256; i++ ) {
|
||
cvtp[i] = &cvt[i];
|
||
}
|
||
|
||
for ( row = frow; row <= lrow; row++ ) {
|
||
for ( col = fcol; col <= lcol; col++ ) {
|
||
fprintf( stdout, "STARTCHAR %.2x%.2x\n", row,col );
|
||
fprintf( stdout, "ENCODING %d\n", (row << 8) + col );
|
||
fprintf( stdout, "SWIDTH 256 0\nDWIDTH %d %d\n",
|
||
wkp->metrics.characterWidth,0 );
|
||
bbw = wkp->metrics.rightSideBearing
|
||
- wkp->metrics.leftSideBearing;
|
||
bbh = wkp->metrics.ascent + wkp->metrics.descent;
|
||
fprintf( stdout, "BBX %d %d %d %d\nBITMAP\n", bbw, bbh,
|
||
wkp->metrics.leftSideBearing,
|
||
- ( wkp->metrics.descent ));
|
||
bml = (bbw + 7) / 8;
|
||
for ( i = 0; i < bbh; i++ ) {
|
||
bufp = buf;
|
||
for ( j = 0; j < bml; j++ ) {
|
||
sprintf( bufp, "%s", (char *) cvtp[(unsigned char)glyph[j]] );
|
||
bufp += 2;
|
||
}
|
||
fprintf( stdout, "%.*s\n", bml*2, buf );
|
||
glyph += glyphPad;
|
||
}
|
||
fprintf( stdout,"ENDCHAR\n" );
|
||
wkp++;
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* output to character information and patern
|
||
*/
|
||
static void
|
||
pfixCHARS(
|
||
FontInfoRec *fip,
|
||
CharInfoRec *cip,
|
||
char *glyphPtr,
|
||
unsigned int charNum,
|
||
unsigned int glyphPad)
|
||
{
|
||
CharInfoRec *wkp;
|
||
int i, j, k;
|
||
unsigned int frow,lrow,fcol,lcol;
|
||
int row, col;
|
||
unsigned int bbw, bbh, bbox, bboy;
|
||
unsigned int xd, yd;
|
||
unsigned int bml;
|
||
char *glyph;
|
||
char fixbuf[240], *fixbufp;
|
||
int fixdl;
|
||
|
||
fprintf( stdout,"CHARS %d\n",charNum );
|
||
|
||
for ( i = 0; i < 256; i++ ) {
|
||
cvtp[i] = &cvt[i];
|
||
}
|
||
|
||
frow = fip->firstRow;
|
||
lrow = fip->lastRow;
|
||
fcol = fip->firstCol;
|
||
lcol = fip->lastCol;
|
||
xd = cip->metrics.characterWidth;
|
||
yd = 0;
|
||
bbw = cip->metrics.rightSideBearing - cip->metrics.leftSideBearing;
|
||
bbh = cip->metrics.ascent + cip->metrics.descent;
|
||
bbox = cip->metrics.leftSideBearing;
|
||
bboy = -(cip->metrics.descent);
|
||
|
||
fixbufp = fixbuf;
|
||
fixdl = sprintf( fixbufp, "SWIDTH 256 0\nDWIDTH %d %d\n", xd, yd );
|
||
fixbufp += fixdl;
|
||
k = sprintf(fixbufp,"BBX %d %d %d %d\nBITMAP\n",
|
||
bbw, bbh, bbox, bboy
|
||
);
|
||
fixdl += k;
|
||
|
||
bml = (bbw + 7) / 8;
|
||
wkp = cip;
|
||
glyph = glyphPtr;
|
||
for ( row = frow; row <= lrow; row++ ) {
|
||
for ( col = fcol; col <= lcol; col++ ) {
|
||
bufp = buf;
|
||
memcpy(bufp,"STARTCHAR ",10);
|
||
bufp += 10;
|
||
memcpy(bufp,cvtp[row],2);
|
||
bufp += 2;
|
||
memcpy(bufp,cvtp[col],3);
|
||
bufp += 3;
|
||
memcpy(bufp,"ENCODING ",9);
|
||
bufp += 9;
|
||
k = sprintf(bufp,"%d\n",(row << 8) + col);
|
||
bufp += k;
|
||
memcpy(bufp,fixbuf,fixdl);
|
||
bufp += fixdl;
|
||
for (i = 0; i < bbh; i++) {
|
||
for (j = 0; j < bml; j++) {
|
||
memcpy(bufp, cvtp[(unsigned char)glyph[j]],3);
|
||
bufp += 2;
|
||
}
|
||
bufp ++;
|
||
glyph += glyphPad;
|
||
}
|
||
memcpy( bufp, "ENDCHAR\n", 8 );
|
||
bufp += 8;
|
||
*bufp = '\0';
|
||
fprintf( stdout, "%s", buf );
|
||
wkp++;
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
static void
|
||
putPtn(unsigned char *bits, /* 1 byte boundary , no byte swap data */
|
||
int width,
|
||
int height)
|
||
{
|
||
int bytewidth;
|
||
int i, j;
|
||
|
||
bytewidth = ( width + 7) / 8;
|
||
|
||
for ( i = height; i-- > 0;) {
|
||
for ( j = bytewidth; j-- > 0; bits++) {
|
||
fprintf(stdout, "%.2x", *bits);
|
||
}
|
||
fprintf(stdout, "\n");
|
||
}
|
||
|
||
}
|
||
|
||
static void
|
||
ByteSwap(char *p, int scan)
|
||
{
|
||
char w;
|
||
|
||
switch( scan) {
|
||
case 1:
|
||
break;
|
||
case 2:
|
||
w = *p;
|
||
*p = *(p + 1);
|
||
*(p + 1) = w;
|
||
break;
|
||
case 4:
|
||
w = *p;
|
||
*p = *(p + 3);
|
||
*(p + 3) = w;
|
||
w = *(p + 1);
|
||
*(p + 1) = *(p + 2);
|
||
*(p + 2) = w;
|
||
break;
|
||
}
|
||
}
|
||
|
||
static unsigned char _reverse_byte[0x100] = {
|
||
0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
|
||
0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
|
||
0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
|
||
0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
|
||
0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
|
||
0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
|
||
0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
|
||
0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
|
||
0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
|
||
0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
|
||
0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
|
||
0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
|
||
0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
|
||
0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
|
||
0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
|
||
0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
|
||
0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
|
||
0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
|
||
0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
|
||
0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
|
||
0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
|
||
0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
|
||
0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
|
||
0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
|
||
0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
|
||
0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
|
||
0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
|
||
0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
|
||
0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
|
||
0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
|
||
0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
|
||
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
|
||
};
|
||
|
||
static void
|
||
BitOrderInvert(unsigned char *buf, int nbytes)
|
||
{
|
||
unsigned char *rev = _reverse_byte;
|
||
|
||
for (; --nbytes >= 0; buf++)
|
||
*buf = rev[*buf];
|
||
}
|
||
|
||
static void
|
||
invertBits(char *src, CARD32 format, int width, int height, char *dest)
|
||
{
|
||
int bit, byte, glyph, scan;
|
||
int src_bytewidth, dest_bytewidth;
|
||
char work[8];
|
||
int i, j;
|
||
|
||
bit = PCF_BIT_ORDER( format);
|
||
byte = PCF_BYTE_ORDER( format);
|
||
glyph = PCF_GLYPH_PAD( format);
|
||
scan = PCF_SCAN_UNIT( format);
|
||
|
||
src_bytewidth = (( width + ( 8 * glyph ) - 1)/( 8 * glyph)) * glyph;
|
||
dest_bytewidth = ( width + 7) /8;
|
||
|
||
for ( i = 0; i < height; i++, src += src_bytewidth,
|
||
dest += dest_bytewidth) {
|
||
for ( j = 0; j < src_bytewidth; j += scan) {
|
||
memcpy( work, src + j, scan);
|
||
if ( bit == LSBFirst)
|
||
BitOrderInvert( (unsigned char *)work, scan);
|
||
if ( byte == LSBFirst)
|
||
ByteSwap( work, scan);
|
||
if (( j + scan) >= dest_bytewidth) {
|
||
memcpy( dest + j, work, dest_bytewidth - j);
|
||
break;
|
||
}
|
||
memcpy( dest + j, work, scan);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
static void
|
||
pCHARS_pcf (PcfTmp *pcf, int fix)
|
||
{
|
||
char *bmp_ptn = NULL;
|
||
char *bitmap = NULL;
|
||
int ptn_width = 0, ptn_height = 0;
|
||
int bmp_width = 0, bmp_height = 0;
|
||
int cpy_height = 0;
|
||
int row, col;
|
||
int row_width;
|
||
int encoding;
|
||
int encodingOffset;
|
||
int nencoding;
|
||
int bmp_adj = 0, ptn_adj = 0;
|
||
int adj_hi;
|
||
int width_bytes;
|
||
INT16 bl, br, ba, bd, bdw ;
|
||
unsigned char cl, cr, ca, cd, cdw ;
|
||
unsigned char *comp ;
|
||
int bbw, bbh, bbx, bby, dwidth ;
|
||
|
||
fprintf(stdout,"CHARS %d\n",pcf->nbitmaps);
|
||
|
||
row_width = pcf->info.lastCol - pcf->info.firstCol + 1;
|
||
nencoding = row_width * (pcf->info.lastRow - pcf->info.firstRow + 1);
|
||
|
||
if( fix == TRUE ) {
|
||
bmp_width = pcf->info.maxbounds.leftSideBearing
|
||
+ pcf->info.maxbounds.rightSideBearing ;
|
||
bmp_height = pcf->info.fontAscent + pcf->info.fontDescent ;
|
||
ptn_width = bmp_width ;
|
||
ptn_height = pcf->info.maxbounds.ascent +
|
||
pcf->info.maxbounds.descent;
|
||
|
||
if (!(bmp_ptn = make_toptn( ptn_width, ptn_height)))
|
||
return;
|
||
|
||
if ( ( adj_hi = pcf->info.fontAscent - pcf->info.maxbounds.ascent ) > 0) {
|
||
width_bytes = 8 * PCF_GLYPH_PAD( pcf->bmp_fmt);
|
||
width_bytes = (( width_bytes + bmp_width - 1)/width_bytes) * PCF_GLYPH_PAD( pcf->bmp_fmt);
|
||
bmp_adj = width_bytes * adj_hi;
|
||
ptn_adj = 0;
|
||
if (( cpy_height = bmp_height - adj_hi) > ptn_height)
|
||
cpy_height = ptn_height ;
|
||
} else if ( adj_hi < 0) {
|
||
adj_hi *= -1;
|
||
width_bytes = ( ptn_width + 7) / 8;
|
||
bmp_adj = 0;
|
||
ptn_adj = width_bytes * adj_hi;
|
||
if (( cpy_height = ptn_height - adj_hi) > bmp_height)
|
||
cpy_height = bmp_height ;
|
||
} else {
|
||
bmp_adj = 0;
|
||
ptn_adj = 0;
|
||
cpy_height = ptn_height ;
|
||
}
|
||
}
|
||
|
||
|
||
for ( encoding = 0; encoding < nencoding; encoding++) {
|
||
if(fix == TRUE) memset( bmp_ptn, '\0', (ptn_width + 7)/8 * ptn_height);
|
||
encodingOffset = getINT16( (unsigned char *)(pcf->encodingOffsets + encoding), pcf->enc_fmt);
|
||
if (encodingOffset == 0xFFFF) continue;
|
||
|
||
row = pcf->info.firstRow + encoding / row_width;
|
||
col = pcf->info.firstCol + encoding % row_width;
|
||
|
||
fprintf(stdout,"STARTCHAR %s\n",pcf->glyph_name +
|
||
getINT32( (unsigned char*)&pcf->glyph_offset[encodingOffset],
|
||
pcf->glyph_fmt) );
|
||
fprintf(stdout,"ENCODING %d\n",(row << 8) + col);
|
||
|
||
fprintf( stdout,"SWIDTH %d 0\n", getINT32( (unsigned char*)(pcf->swidth + encodingOffset), pcf->swd_fmt) );
|
||
|
||
if( pcf->compress ){
|
||
comp = (unsigned char*)pcf->metrics +
|
||
encodingOffset * SIZEOF_COMPRESSED_METRIC ;
|
||
cl = getINT8( comp ) ;
|
||
cr = getINT8( comp ) ;
|
||
cdw = getINT8( comp ) ;
|
||
ca = getINT8( comp ) ;
|
||
cd = getINT8( comp ) ;
|
||
|
||
dwidth = (int)(cdw - 0x80) ;
|
||
bbw = (int)((cr - 0x80) - (cl - 0x80)) ;
|
||
bbh = (int)((ca - 0x80) + (cd - 0x80)) ;
|
||
bbx = (int)(cl - 0x80) ;
|
||
bby = (int)( -(cd - 0x80) ) ;
|
||
}else{
|
||
bl = getINT16( (unsigned char *)&pcf->metrics[encodingOffset].leftSideBearing, pcf->mtr_fmt ) ;
|
||
br = getINT16( (unsigned char *)&pcf->metrics[encodingOffset].rightSideBearing, pcf->mtr_fmt ) ;
|
||
bdw = getINT16( (unsigned char *)&pcf->metrics[encodingOffset].characterWidth, pcf->mtr_fmt ) ;
|
||
ba = getINT16( (unsigned char *)&pcf->metrics[encodingOffset].ascent, pcf->mtr_fmt ) ;
|
||
bd = getINT16( (unsigned char *)&pcf->metrics[encodingOffset].descent, pcf->mtr_fmt ) ;
|
||
dwidth = bdw ;
|
||
bbw = br-bl ;
|
||
bbh = ba+bd ;
|
||
bbx = bl ;
|
||
bby = -bd ;
|
||
}
|
||
fprintf( stdout,"DWIDTH %d 0\n", dwidth ) ;
|
||
fprintf( stdout,"BBX %d %d %d %d\nBITMAP\n", bbw, bbh, bbx, bby ) ;
|
||
|
||
if( fix == FALSE ) {
|
||
bmp_width = pcf->info.maxbounds.leftSideBearing
|
||
+ pcf->info.maxbounds.rightSideBearing ;
|
||
bmp_height = pcf->info.fontAscent + pcf->info.fontDescent ;
|
||
ptn_width = bbw ;
|
||
ptn_height = bbh ;
|
||
|
||
if (!(bmp_ptn = make_toptn( ptn_width, ptn_height)))
|
||
return;
|
||
|
||
if ( ( adj_hi = pcf->info.fontAscent - pcf->info.maxbounds.ascent ) > 0) {
|
||
width_bytes = 8 * PCF_GLYPH_PAD( pcf->bmp_fmt);
|
||
width_bytes = (( width_bytes + bmp_width - 1)/width_bytes) * PCF_GLYPH_PAD( pcf->bmp_fmt);
|
||
bmp_adj = width_bytes * adj_hi;
|
||
ptn_adj = 0;
|
||
if (( cpy_height = bmp_height - adj_hi) > ptn_height)
|
||
cpy_height = ptn_height ;
|
||
} else if ( adj_hi < 0) {
|
||
adj_hi *= -1;
|
||
width_bytes = ( ptn_width + 7) / 8;
|
||
bmp_adj = 0;
|
||
ptn_adj = width_bytes * adj_hi;
|
||
if (( cpy_height = ptn_height - adj_hi) > bmp_height)
|
||
cpy_height = bmp_height ;
|
||
} else {
|
||
bmp_adj = 0;
|
||
ptn_adj = 0;
|
||
cpy_height = ptn_height ;
|
||
}
|
||
memset( bmp_ptn, '\0', (ptn_width + 7)/8 * ptn_height);
|
||
}
|
||
|
||
bitmap = pcf->bitmaps + getINT32( (unsigned char *)(pcf->offsets + encodingOffset),
|
||
pcf->bmp_fmt);
|
||
/* Only do this if non-NULL... */
|
||
if (bmp_ptn)
|
||
{
|
||
invertBits( bitmap + bmp_adj, pcf->bmp_fmt,
|
||
ptn_width, cpy_height, bmp_ptn + ptn_adj);
|
||
putPtn( (unsigned char *)bmp_ptn, ptn_width, ptn_height );
|
||
}
|
||
else
|
||
{
|
||
fprintf(stderr, "%s: bmp_ptn is NULL", __FUNCTION__);
|
||
}
|
||
|
||
fprintf(stdout,"ENDCHAR\n");
|
||
if( fix == FALSE ) free(bmp_ptn);
|
||
}
|
||
if( fix == TRUE ) free(bmp_ptn);
|
||
return;
|
||
}
|
||
|
||
static char *
|
||
make_toptn(int width, int height)
|
||
{
|
||
int byte_width;
|
||
|
||
byte_width = (width + 7)/8;
|
||
|
||
return (char *)malloc( byte_width * height);
|
||
}
|
||
|
||
|
||
|
||
|
||
static int
|
||
getarg(
|
||
int argc,
|
||
char *argv[],
|
||
char *fname,
|
||
int *bitorder,
|
||
int *byteorder,
|
||
int *scanunit,
|
||
int *glyphPad,
|
||
int *outLevel,
|
||
int *fix)
|
||
{
|
||
int i;
|
||
int already;
|
||
char *arg;
|
||
char *usage="dtgpftobdf [-H] [-V] [-help] font_file_name";
|
||
|
||
*glyphPad = DEFAULTGLPAD;
|
||
*bitorder = DEFAULTBITORDER;
|
||
*scanunit = DEFAULTSCANUNIT;
|
||
*byteorder = DEFAULTBYTEORDER;
|
||
*outLevel = FALSE;
|
||
*fix = FALSE ;
|
||
already = 0 ;
|
||
|
||
for (i = 1; i < argc; i++ ) {
|
||
arg = argv[i];
|
||
if (*arg == '-') {
|
||
*arg++;
|
||
switch (*arg) {
|
||
case 'p' :
|
||
*glyphPad = atoi(arg+1) ;
|
||
if (*glyphPad != 1 &&
|
||
*glyphPad != 2 &&
|
||
*glyphPad != 4 &&
|
||
*glyphPad != 8 ) {
|
||
USAGE("dtgpftobdf : illegal padding number (1/2/4/8)\n");
|
||
return -1;
|
||
}
|
||
break;
|
||
case 'H' :
|
||
*outLevel = TRUE ;
|
||
break;
|
||
case 'h' :
|
||
USAGE1("usage: %s\n",usage);
|
||
return (-1);
|
||
case 'V' :
|
||
*fix = TRUE ;
|
||
break;
|
||
default :
|
||
USAGE1("dtgpftobdf : illegal option -- %s\n",arg);
|
||
USAGE1("usage: %s\n",usage);
|
||
return -1;
|
||
}
|
||
|
||
} else {
|
||
if (already == FALSE) {
|
||
strcpy(fname,arg);
|
||
already = TRUE;
|
||
} else {
|
||
USAGE1("dtgpftobdf : extra parameter --- %s\n",arg);
|
||
USAGE1("usage: %s\n", usage );
|
||
return -1;
|
||
}
|
||
}
|
||
}
|
||
if (already == FALSE) {
|
||
USAGE("dtgpftobdf : require file name\n");
|
||
USAGE1("usage: %s\n",usage);
|
||
return -1;
|
||
}
|
||
return 0;
|
||
}
|