Initial import of the CDE 2.1.30 sources from the Open Group.
This commit is contained in:
879
cde/programs/dtudcfonted/libfal/readpcf.c
Normal file
879
cde/programs/dtudcfonted/libfal/readpcf.c
Normal file
@@ -0,0 +1,879 @@
|
||||
/* $XConsortium: readpcf.c /main/5 1996/06/05 16:42:29 ageorge $ */
|
||||
/*
|
||||
* (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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include "FaLib.h"
|
||||
#include "falfont.h"
|
||||
|
||||
#ifndef GLYPHPADOPTIONS
|
||||
#define GLYPHPADOPTIONS 4
|
||||
#endif
|
||||
|
||||
static CARD32 getLSB32();
|
||||
static int getINT32();
|
||||
static int getINT16();
|
||||
static Bool seekToType();
|
||||
static void getMetric();
|
||||
static Bool getAccel();
|
||||
int falInitReadPcf();
|
||||
static void ByteSwap();
|
||||
static void repadBits();
|
||||
int falPcfGlyph();
|
||||
void falGetPcfGSize();
|
||||
int falInitReadPcfProp() ;
|
||||
int falInitReadSnfProp() ;
|
||||
int falReadGpfProp() ;
|
||||
|
||||
extern void BitOrderInvert() ;
|
||||
extern void set_errfile_str() ;
|
||||
|
||||
static CARD32
|
||||
getLSB32( p)
|
||||
unsigned char *p;
|
||||
{
|
||||
CARD32 c;
|
||||
|
||||
c = *p++;
|
||||
c |= (CARD32)(*p++) << 8;
|
||||
c |= (CARD32)(*p++) << 16;
|
||||
c |= (CARD32)(*p) << 24;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static int
|
||||
getINT32( p, format)
|
||||
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( p, format)
|
||||
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( tables, ntables, type, formatp, sizep, offsetp)
|
||||
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) {
|
||||
if ( formatp)
|
||||
*formatp = getLSB32( (unsigned char *)&tables[i].format);
|
||||
if ( sizep)
|
||||
*sizep = getLSB32( (unsigned char *)&tables[i].size);
|
||||
if ( offsetp)
|
||||
*offsetp = getLSB32( (unsigned char *)&tables[i].offset);
|
||||
return(TRUE);
|
||||
}
|
||||
}
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
getMetric( buf, format, metric)
|
||||
caddr_t buf;
|
||||
CARD32 format;
|
||||
xCharInfo *metric;
|
||||
{
|
||||
metric->leftSideBearing = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
metric->rightSideBearing = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
metric->characterWidth = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
metric->ascent = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
metric->descent = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
metric->attributes = getINT16( (unsigned char *)buf, (CARD32)format);
|
||||
buf += 2;
|
||||
}
|
||||
|
||||
static Bool
|
||||
getAccel( pFontInfo, maxink, buf_top, tables, ntables, type)
|
||||
FontInfoPtr pFontInfo;
|
||||
xCharInfo *maxink;
|
||||
caddr_t buf_top;
|
||||
PCFTablePtr tables;
|
||||
int ntables;
|
||||
CARD32 type;
|
||||
{
|
||||
CARD32 format;
|
||||
CARD32 offset;
|
||||
caddr_t buffer;
|
||||
|
||||
if ( !seekToType( tables, ntables, (CARD32)type, &format, (CARD32 *)NULL, &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++;
|
||||
/* pFontInfo->anamorphic = FALSE; */
|
||||
/* natural alignment */ buffer++;
|
||||
pFontInfo->fontAscent = getINT32( (unsigned char *)buffer, (CARD32)format);
|
||||
buffer += 4;
|
||||
pFontInfo->fontDescent = getINT32( (unsigned char *)buffer, (CARD32)format);
|
||||
buffer +=4;
|
||||
|
||||
/* pFontInfo->maxOverlap = getINT32( (unsigned char *)buffer, (CARD32)format); */ buffer += 4;
|
||||
getMetric(buffer, format, &pFontInfo->minbounds.metrics);
|
||||
buffer += 12;
|
||||
getMetric(buffer, format, &pFontInfo->maxbounds.metrics);
|
||||
buffer += 12;
|
||||
if (PCF_FORMAT_MATCH(format, PCF_ACCEL_W_INKBOUNDS)) {
|
||||
buffer += 12;
|
||||
getMetric( buffer, format, maxink);
|
||||
} else {
|
||||
*maxink = pFontInfo->maxbounds.metrics;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
falInitReadPcf( pcfinf, buftop)
|
||||
struct pcf_inf *pcfinf;
|
||||
caddr_t buftop;
|
||||
{
|
||||
CARD32 format;
|
||||
CARD32 offset;
|
||||
CARD32 *bitmapSizes;
|
||||
xCharInfo maxink;
|
||||
caddr_t buffp;
|
||||
|
||||
if ( getLSB32( (unsigned char *)buftop ) != PCF_FILE_VERSION)
|
||||
goto Bail;
|
||||
|
||||
pcfinf->ntables = getLSB32( (unsigned char *)(buftop + 4) );
|
||||
|
||||
pcfinf->tables = (PCFTablePtr)(buftop + 8);
|
||||
|
||||
if ( !getAccel( &pcfinf->info, &maxink, buftop, pcfinf->tables, pcfinf->ntables,
|
||||
(CARD32)PCF_BDF_ACCELERATORS))
|
||||
if ( !getAccel( &pcfinf->info, &maxink, buftop, pcfinf->tables, pcfinf->ntables,
|
||||
(CARD32)PCF_ACCELERATORS))
|
||||
goto Bail;
|
||||
|
||||
pcfinf->org_bounds = pcfinf->info.maxbounds.metrics;
|
||||
|
||||
if ( !seekToType( pcfinf->tables, pcfinf->ntables, (CARD32)PCF_BITMAPS,
|
||||
&format, (CARD32 *)NULL, &offset))
|
||||
goto Bail;
|
||||
|
||||
buffp = buftop + offset;
|
||||
|
||||
format = getLSB32( (unsigned char *)buffp );
|
||||
buffp += 4;
|
||||
if (!PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT))
|
||||
goto Bail;
|
||||
|
||||
pcfinf->nbitmaps = getINT32( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 4;
|
||||
pcfinf->offsets = (CARD32 *)buffp;
|
||||
buffp += sizeof( *pcfinf->offsets) * pcfinf->nbitmaps;
|
||||
|
||||
bitmapSizes = (CARD32 *)buffp;
|
||||
pcfinf->sizebitmaps = getINT32( (unsigned char *)&bitmapSizes[PCF_GLYPH_PAD_INDEX(format)], (CARD32)format);
|
||||
pcfinf->bmp_fmt = format;
|
||||
buffp += sizeof( *bitmapSizes) * GLYPHPADOPTIONS;
|
||||
pcfinf->bitmaps = buffp;
|
||||
buffp += pcfinf->sizebitmaps;
|
||||
|
||||
if ( !seekToType( pcfinf->tables, pcfinf->ntables, (CARD32)PCF_BDF_ENCODINGS,
|
||||
&format, (CARD32 *)NULL, &offset))
|
||||
goto Bail;
|
||||
|
||||
buffp = buftop + offset;
|
||||
format = getLSB32( (unsigned char *)buffp );
|
||||
buffp += 4;
|
||||
if (!PCF_FORMAT_MATCH(format, PCF_DEFAULT_FORMAT))
|
||||
goto Bail;
|
||||
|
||||
pcfinf->info.firstCol = getINT16( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 2;
|
||||
pcfinf->info.lastCol = getINT16( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 2;
|
||||
pcfinf->info.firstRow = getINT16( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 2;
|
||||
pcfinf->info.lastRow = getINT16( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 2;
|
||||
/*
|
||||
pcfinf->info.defaultCh = getINT16( (unsigned char *)buffp, (CARD32)format); buffp += 2;
|
||||
*/
|
||||
pcfinf->info.chDefault = getINT16( (unsigned char *)buffp, (CARD32)format);
|
||||
buffp += 2;
|
||||
|
||||
pcfinf->info.allExist = FALSE;
|
||||
pcfinf->enc_fmt = format;
|
||||
pcfinf->encodingOffsets = (CARD16 *)buffp;
|
||||
|
||||
return 0;
|
||||
Bail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
ByteSwap( p, scan)
|
||||
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 void
|
||||
repadBits( src, format, width, height, dest)
|
||||
char *src;
|
||||
CARD32 format;
|
||||
int width, 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( 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
falPcfGlyph( glyph, finf, code)
|
||||
char *glyph;
|
||||
Oak_FontInf *finf;
|
||||
int code;
|
||||
{
|
||||
int encode;
|
||||
int inner_code;
|
||||
char *bitmap;
|
||||
int encodingOffset;
|
||||
int codeRow, codeCol;
|
||||
int bytewidth;
|
||||
int bmp_adj, ptn_adj;
|
||||
int adj_hi;
|
||||
int cpy_height;
|
||||
int bmp_height;
|
||||
|
||||
if ( !glyph){
|
||||
fal_utyerrno = FAL_ERR_PARM ;
|
||||
return FAL_ERROR ;
|
||||
}
|
||||
|
||||
inner_code = code;
|
||||
codeCol = inner_code & 0xff;
|
||||
codeRow = (inner_code >> 8) & 0xff;
|
||||
|
||||
/* code check */
|
||||
if (
|
||||
((code < finf->start) || (code > finf->end))||
|
||||
((codeCol < finf->pFinf->firstCol)||(codeCol > finf->pFinf->lastCol))||
|
||||
((codeRow < finf->pFinf->firstRow)||(codeRow > finf->pFinf->lastRow))
|
||||
) {
|
||||
fal_utyexists = 1;
|
||||
return(-1);
|
||||
}
|
||||
|
||||
encode = (codeRow - finf->pFinf->firstRow) * ( finf->pFinf->lastCol - finf->pFinf->firstCol + 1);
|
||||
encode += codeCol - finf->pFinf->firstCol;
|
||||
encodingOffset = getINT16( (unsigned char *)(finf->pcfinf.encodingOffsets + encode), finf->pcfinf.enc_fmt);
|
||||
|
||||
if (encodingOffset == 0xFFFF) {
|
||||
fal_utyexists = 1;
|
||||
return(-1);
|
||||
}
|
||||
fal_utyexists = 0;
|
||||
|
||||
bitmap = finf->pcfinf.bitmaps + getINT32( (unsigned char *)(finf->pcfinf.offsets + encodingOffset), finf->pcfinf.bmp_fmt);
|
||||
|
||||
bmp_height = finf->pFinf->maxbounds.metrics.ascent
|
||||
+ finf->pFinf->maxbounds.metrics.descent;
|
||||
if (( adj_hi = finf->pFinf->maxbounds.metrics.ascent
|
||||
- finf->pcfinf.org_bounds.ascent) > 0) {
|
||||
bytewidth = 8 * PCF_GLYPH_PAD( finf->pcfinf.bmp_fmt);
|
||||
bytewidth = (( finf->width + bytewidth - 1)/ bytewidth ) * PCF_GLYPH_PAD( finf->pcfinf.bmp_fmt);
|
||||
bmp_adj = bytewidth * adj_hi;
|
||||
ptn_adj = 0;
|
||||
if (( cpy_height = bmp_height - adj_hi) > finf->height)
|
||||
cpy_height = finf->height;
|
||||
} else if ( adj_hi < 0) {
|
||||
adj_hi *= -1;
|
||||
bytewidth = ( finf->width + 7) / 8;
|
||||
bmp_adj = 0;
|
||||
ptn_adj = bytewidth * adj_hi;
|
||||
if (( cpy_height = finf->height - adj_hi) > bmp_height)
|
||||
cpy_height = bmp_height;
|
||||
} else {
|
||||
bmp_adj = 0;
|
||||
ptn_adj = 0;
|
||||
cpy_height = finf->height;
|
||||
}
|
||||
|
||||
repadBits( bitmap + bmp_adj , finf->pcfinf.bmp_fmt, finf->width, cpy_height, glyph + ptn_adj);
|
||||
return(0);
|
||||
}
|
||||
|
||||
void
|
||||
falGetPcfGSize( pcfinf, widthp, heightp)
|
||||
struct pcf_inf *pcfinf;
|
||||
unsigned int *widthp, *heightp;
|
||||
{
|
||||
unsigned int w, h;
|
||||
|
||||
w = pcfinf->org_bounds.rightSideBearing
|
||||
- pcfinf->org_bounds.leftSideBearing;
|
||||
h = pcfinf->org_bounds.ascent + pcfinf->org_bounds.descent;
|
||||
|
||||
*widthp = w;
|
||||
*heightp = h;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/********************************************************
|
||||
*
|
||||
* functions for collect GPF file properties
|
||||
*
|
||||
*******************************************************/
|
||||
|
||||
#include "fontstruct.h"
|
||||
|
||||
static char *getPcfFontProp();
|
||||
static char *getSnfFontProp();
|
||||
/*
|
||||
* read properties and get font style and
|
||||
* letter size
|
||||
*/
|
||||
|
||||
int
|
||||
falReadFontProp( file, protect_key_data, databuff, islock )
|
||||
char *file ; /* name of font file */
|
||||
int protect_key_data ;
|
||||
FalFontData *databuff ;
|
||||
int islock ;
|
||||
{
|
||||
Oak_FontInf finf;
|
||||
int fd ;
|
||||
char *buf;
|
||||
char *openfontfile;
|
||||
struct stat st;
|
||||
int rtn ;
|
||||
|
||||
/* initialezation */
|
||||
openfontfile = file ;
|
||||
|
||||
/* read a condition of a fontfile */
|
||||
if ( stat( openfontfile, &st ) < 0 ) {
|
||||
set_errfile_str( fal_err_file, openfontfile ) ;
|
||||
fal_utyerror = _FAL_STAT_ER;
|
||||
fal_utyderror = errno;
|
||||
fal_utyerrno = FAL_ERR_STAT ;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
|
||||
if ( st.st_size < sizeof( FontInfoRec ) ) {
|
||||
fal_utyerror = _FAL_FONT_ER;
|
||||
fal_utyderror = 0;
|
||||
fal_utyerrno = FAL_ERR_FONT ;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
|
||||
/* open a fontfile */
|
||||
if ( (fd = open( openfontfile, ((islock)? O_RDONLY : O_RDWR) )) < 0 ) {
|
||||
switch( errno ) {
|
||||
case EACCES :
|
||||
return _FAL_TRY_NEXT ;
|
||||
default :
|
||||
set_errfile_str( fal_err_file, openfontfile ) ;
|
||||
fal_utyerror = _FAL_OPEN_ER;
|
||||
fal_utyderror = errno;
|
||||
fal_utyerrno = FAL_ERR_FNT_OPN ;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined( SVR4 )
|
||||
buf = (char *)mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
if ( buf != (char *)-1 ) {
|
||||
/* if "mmap" is normal end */
|
||||
close( fd );
|
||||
finf.ismmap = TRUE;
|
||||
finf.fsize = st.st_size;
|
||||
} else {
|
||||
/* if "mmap" is abnormal end , try "read()" */
|
||||
finf.ismmap = FALSE;
|
||||
if ( !(buf = (char *)malloc(st.st_size)) ) {
|
||||
fal_utyerror = _FAL_MALOC_ER;
|
||||
fal_utyderror = 0;
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
close( fd );
|
||||
return FAL_ERROR;
|
||||
}
|
||||
if ( read(fd, buf, st.st_size) != st.st_size ) {
|
||||
set_errfile_str( fal_err_file, openfontfile ) ;
|
||||
fal_utyerror = _FAL_READ_ER;
|
||||
fal_utyderror = errno;
|
||||
fal_utyerrno = FAL_ERR_FNT_RD ;
|
||||
free( buf );
|
||||
close( fd );
|
||||
return FAL_ERROR;
|
||||
}
|
||||
}
|
||||
#else
|
||||
finf.ismmap = FALSE;
|
||||
if ( !(buf = (char *)malloc( st.st_size )) ) {
|
||||
fal_utyerror = _FAL_MALOC_ER;
|
||||
fal_utyderror = 0;
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
close( fd );
|
||||
return FAL_ERROR;
|
||||
}
|
||||
if ( read(fd, buf, st.st_size) != st.st_size ) {
|
||||
set_errfile_str( fal_err_file, openfontfile ) ;
|
||||
fal_utyerror = _FAL_READ_ER;
|
||||
fal_utyderror = errno;
|
||||
fal_utyerrno = FAL_ERR_FNT_RD ;
|
||||
free( buf );
|
||||
close( fd );
|
||||
return FAL_ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
finf.fname = openfontfile ;
|
||||
finf.buf = buf ;
|
||||
|
||||
/*
|
||||
* open GPF font file
|
||||
*/
|
||||
rtn = falReadGpfProp( FAL_UPDATE_FONTINFO, &finf, protect_key_data, databuff ) ;
|
||||
#if defined( SVR4 )
|
||||
if ( finf.ismmap == TRUE ) {
|
||||
munmap( buf, finf.fsize );
|
||||
} else {
|
||||
free(buf);
|
||||
close(fd);
|
||||
}
|
||||
#else
|
||||
free( buf );
|
||||
close( fd );
|
||||
#endif
|
||||
|
||||
return( rtn ) ;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get properties of GPF format file
|
||||
*/
|
||||
int
|
||||
falReadGpfProp( updflg, finf, protect_key_data, databuff )
|
||||
int updflg ;
|
||||
Oak_FontInf *finf;
|
||||
int protect_key_data ;
|
||||
FalFontData *databuff ;
|
||||
{
|
||||
char *openfontfile;
|
||||
int rtn ;
|
||||
|
||||
/* initialize */
|
||||
openfontfile = finf->fname ;
|
||||
|
||||
if( updflg == FAL_UPDATE_FONTINFO ) {
|
||||
/* case of a PCF format font */
|
||||
if ( strcmp( FILE_SUFFIX( openfontfile ), PCFSUFFIX ) == 0 ) {
|
||||
|
||||
finf->isFef = FALSE;
|
||||
finf->isPcf = TRUE;
|
||||
|
||||
}
|
||||
else /* case of a SNF format font */
|
||||
{
|
||||
FAL_READ_SNF_HEADER( finf, protect_key_data, fal_utyerror, fal_utyderror ) ;
|
||||
}
|
||||
} /* updflg */
|
||||
|
||||
/*
|
||||
* get font properties
|
||||
*/
|
||||
if ( finf->isFef ){
|
||||
/* read SNF format property */
|
||||
if ( rtn = falInitReadSnfProp( finf, (caddr_t)finf->pFinf, databuff ) ) {
|
||||
if( rtn == _FAL_TRY_NEXT ){
|
||||
return( rtn ) ;
|
||||
}
|
||||
fal_utyerror = _FAL_FONT_ER;
|
||||
fal_utyderror = 0;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
} else if ( finf->isPcf ) {
|
||||
/* read PCF format property */
|
||||
if ( rtn = falInitReadPcfProp( updflg, finf, databuff ) ) {
|
||||
if( rtn == _FAL_TRY_NEXT ){
|
||||
return( rtn ) ;
|
||||
}
|
||||
fal_utyerror = _FAL_FONT_ER;
|
||||
fal_utyderror = 0;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
|
||||
if( updflg == FAL_UPDATE_FONTINFO ) {
|
||||
finf->pFinf = &finf->pcfinf.info;
|
||||
finf->pCinf = NULL;
|
||||
finf->pGlyphs = NULL;
|
||||
}
|
||||
} else {
|
||||
fal_utyerror = _FAL_FONT_ER;
|
||||
fal_utyderror = 0;
|
||||
fal_utyerrno = FAL_ERR_FONT ;
|
||||
return FAL_ERROR;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get properties of PCF format file
|
||||
*/
|
||||
int
|
||||
falInitReadPcfProp( updflg, finf, databuff )
|
||||
int updflg ;
|
||||
Oak_FontInf *finf;
|
||||
FalFontData *databuff ;
|
||||
{
|
||||
struct pcf_inf *pcfinf;
|
||||
caddr_t buftop;
|
||||
xCharInfo maxink;
|
||||
caddr_t buffp;
|
||||
int lb, rb, as, ds ;
|
||||
|
||||
|
||||
|
||||
pcfinf = &finf->pcfinf ;
|
||||
buftop = finf->buf ;
|
||||
|
||||
if ( getLSB32( (unsigned char *)buftop ) != PCF_FILE_VERSION)
|
||||
return _FAL_TRY_NEXT ;
|
||||
|
||||
if( updflg == FAL_UPDATE_FONTINFO ) {
|
||||
pcfinf->ntables = getLSB32( (unsigned char *)(buftop + 4) );
|
||||
|
||||
pcfinf->tables = (PCFTablePtr)(buftop + 8);
|
||||
|
||||
if ( !getAccel( &pcfinf->info, &maxink, buftop, pcfinf->tables,
|
||||
pcfinf->ntables, (CARD32)PCF_BDF_ACCELERATORS)) {
|
||||
if ( !getAccel( &pcfinf->info, &maxink, buftop, pcfinf->tables,
|
||||
pcfinf->ntables, (CARD32)PCF_ACCELERATORS)) {
|
||||
fal_utyerrno = FAL_ERR_FONT ;
|
||||
goto Bail;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* read property
|
||||
*/
|
||||
|
||||
if( updflg == FAL_UPDATE_FONTINFO ) {
|
||||
pcfinf->org_bounds = pcfinf->info.maxbounds.metrics;
|
||||
}
|
||||
|
||||
lb = pcfinf->org_bounds.leftSideBearing ;
|
||||
rb = pcfinf->org_bounds.rightSideBearing ;
|
||||
as = pcfinf->org_bounds.ascent ;
|
||||
ds = pcfinf->org_bounds.descent ;
|
||||
|
||||
databuff->size.w = rb - lb ;
|
||||
databuff->size.h = as + ds ;
|
||||
|
||||
/*
|
||||
* read property "FONT"
|
||||
*/
|
||||
if ( buffp = getPcfFontProp( buftop, pcfinf->tables,
|
||||
pcfinf->ntables, "FONT" )) {
|
||||
if( (databuff->xlfdname = (char *)strdup( buffp )) == (char *)NULL ){
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
goto Bail;
|
||||
}
|
||||
}else{
|
||||
set_errfile_str( fal_err_file, finf->fname ) ;
|
||||
fal_utyerrno = FAL_ERR_PROP_FONT ;
|
||||
return( _FAL_TRY_NEXT ) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* read property "FAMILY_NAME"
|
||||
*/
|
||||
if ( buffp = getPcfFontProp( buftop, pcfinf->tables,
|
||||
pcfinf->ntables, "FAMILY_NAME")) {
|
||||
if( (databuff->style.name = (char *)strdup( buffp )) == NULL ){
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
goto Bail ;
|
||||
}
|
||||
}else{
|
||||
set_errfile_str( fal_err_file, finf->fname ) ;
|
||||
fal_utyerrno = FAL_ERR_PROP_FNAME ;
|
||||
return( _FAL_TRY_NEXT ) ;
|
||||
}
|
||||
|
||||
return 0;
|
||||
Bail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static char *
|
||||
getPcfFontProp( buftop, tables, ntables, propname)
|
||||
caddr_t buftop;
|
||||
PCFTablePtr tables;
|
||||
int ntables;
|
||||
char *propname;
|
||||
{
|
||||
caddr_t buffer;
|
||||
int name_ofs;
|
||||
int i ;
|
||||
int nprops;
|
||||
char *propstr ;
|
||||
CARD32 format, offset;
|
||||
|
||||
if ( !seekToType( tables, ntables, (CARD32)PCF_PROPERTIES, &format, (CARD32 *)NULL, &offset))
|
||||
return NULL;
|
||||
|
||||
buffer = buftop + offset;
|
||||
format = getLSB32( (unsigned char *)buffer );
|
||||
buffer += 4;
|
||||
if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT))
|
||||
return NULL;
|
||||
|
||||
nprops = getINT32( (unsigned char *)buffer, (CARD32)format);
|
||||
buffer += 4;
|
||||
propstr = buffer + (4 * ((nprops * 9 + 3) / 4)) + 4;
|
||||
|
||||
for ( i=0; i < nprops ; i++ ) {
|
||||
name_ofs = getINT32( (unsigned char *)buffer, (CARD32)format ) ;
|
||||
buffer += 4 ; /* name */
|
||||
if ( strcmp( propstr + name_ofs, propname) == 0) {
|
||||
if ( *buffer) { /* isStringProp */
|
||||
return( propstr + getINT32( (unsigned char *)(buffer + 1), (CARD32)format) );
|
||||
}else{
|
||||
return((char *)getINT32( (unsigned char *)(buffer + 1), (CARD32)format) );
|
||||
}
|
||||
}
|
||||
buffer += 5 ; /* isStringProp + value */
|
||||
}
|
||||
|
||||
return( NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get properties of SNF format file
|
||||
*/
|
||||
int
|
||||
falInitReadSnfProp( finf, buftop, databuff )
|
||||
Oak_FontInf *finf; /* pointer to the infomation structure */
|
||||
caddr_t buftop; /* font file */
|
||||
FalFontData *databuff ;
|
||||
{
|
||||
caddr_t stprop ;
|
||||
int lb, rb, as, ds ;
|
||||
char *propptr ;
|
||||
char *fnt, *fam ;
|
||||
int nprops, bitmapSize, num_chars ;
|
||||
|
||||
|
||||
/* initialize pointer */
|
||||
nprops = finf->pFinf->nProps ;
|
||||
num_chars = ( finf->pFinf->lastRow - finf->pFinf->firstRow + 1 ) *
|
||||
( finf->pFinf->lastCol - finf->pFinf->firstCol + 1 ) ;
|
||||
bitmapSize = BYTESOFGLYPHINFO(finf->pFinf) ;
|
||||
|
||||
stprop = buftop ;
|
||||
stprop += sizeof(FontInfoRec) ;
|
||||
stprop += num_chars * sizeof(CharInfoRec) ;
|
||||
stprop += bitmapSize ;
|
||||
|
||||
/*
|
||||
* read property "FONTBOUNDINGBOX"
|
||||
*/
|
||||
lb = finf->pFinf->maxbounds.metrics.leftSideBearing ;
|
||||
rb = finf->pFinf->maxbounds.metrics.rightSideBearing ;
|
||||
as = finf->pFinf->maxbounds.metrics.ascent ;
|
||||
ds = finf->pFinf->maxbounds.metrics.descent ;
|
||||
|
||||
/*
|
||||
* read property "FONT"
|
||||
*/
|
||||
if ( propptr = getSnfFontProp( stprop, nprops, "FONT" )) {
|
||||
if( (fnt = (char *)strdup( propptr )) == NULL ){
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
goto Bail;
|
||||
}
|
||||
}else{
|
||||
set_errfile_str( fal_err_file, finf->fname ) ;
|
||||
fal_utyerrno = FAL_ERR_PROP_FONT ;
|
||||
return( _FAL_TRY_NEXT ) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* read property "FAMILY_NAME"
|
||||
*/
|
||||
if ( propptr = getSnfFontProp( stprop, nprops, "FAMILY_NAME")) {
|
||||
if( (fam = (char *)strdup( propptr )) == NULL ){
|
||||
fal_utyerrno = FAL_ERR_MALLOC ;
|
||||
goto Bail ;
|
||||
}
|
||||
}else{
|
||||
set_errfile_str( fal_err_file, finf->fname ) ;
|
||||
fal_utyerrno = FAL_ERR_PROP_FNAME ;
|
||||
return( _FAL_TRY_NEXT ) ;
|
||||
}
|
||||
|
||||
/*
|
||||
* set data buffer
|
||||
*/
|
||||
|
||||
databuff->size.w = rb - lb ;
|
||||
databuff->size.h = as + ds ;
|
||||
|
||||
databuff->xlfdname = fnt ;
|
||||
databuff->style.name = fam ;
|
||||
|
||||
return 0;
|
||||
Bail:
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static char *
|
||||
getSnfFontProp( buftop, nprops, propname )
|
||||
caddr_t buftop;
|
||||
int nprops ;
|
||||
char *propname;
|
||||
{
|
||||
caddr_t buffer;
|
||||
int name_ofs;
|
||||
int i ;
|
||||
char *propstr ;
|
||||
FontPropRec *ProcRec ;
|
||||
|
||||
ProcRec = (FontPropRec *)buftop ;
|
||||
buffer = (char *)buftop ;
|
||||
propstr = buffer + nprops * sizeof(FontPropRec) ;
|
||||
|
||||
for ( i=0; i < nprops ; i++, ProcRec++ ) {
|
||||
name_ofs = ProcRec->name ;
|
||||
if( strcmp( propstr + name_ofs, propname ) == 0 ){
|
||||
if( ProcRec->indirect ){
|
||||
return( propstr + ProcRec->value ) ;
|
||||
}else{
|
||||
return( (char *)ProcRec->value ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( NULL);
|
||||
}
|
||||
|
||||
/***********************< end of readpcf.c >********************/
|
||||
Reference in New Issue
Block a user