#ifndef FONTMODULE
#include <stdio.h>
#include <string.h>
#else
#include "Xmd.h"
#include "Xdefs.h"
#include "xf86_ansic.h"
#endif
#include "t1imager.h"
#include "util.h"
#ifdef BUILDCID
#include "range.h"
#include "Xdefs.h"
#endif
#include "fntfilst.h"
#include "fontfcn.h"
extern struct segment *Type1Char ( char *env, XYspace S,
psobj *charstrP, psobj *subrsP,
psobj *osubrsP,
struct blues_struct *bluesP, int *modeP );
#ifdef BUILDCID
extern struct xobject *CIDChar ( char *env, XYspace S,
psobj *charstrP, psobj *subrsP,
psobj *osubrsP,
struct blues_struct *bluesP, int *modeP );
static boolean initCIDFont( int cnt );
#endif
char CurFontName[120];
char *CurFontEnv;
char *vm_base = NULL;
psfont *FontP = NULL;
psfont TheCurrentFont;
#ifdef BUILDCID
char CurCIDFontName[CID_PATH_MAX];
char CurCMapName[CID_PATH_MAX];
cidfont *CIDFontP = NULL;
cmapres *CMapP = NULL;
cidfont TheCurrentCIDFont;
cmapres TheCurrentCMap;
psfont *FDArrayP = NULL;
int FDArrayIndex = 0;
#endif
int
SearchDictName(psdict *dictP, psobj *keyP)
{
int i,n;
n = dictP[0].key.len;
for (i=1;i<=n;i++) {
if (
(dictP[i].key.len == keyP->len )
&&
(strncmp(dictP[i].key.data.valueP,
keyP->data.valueP,
keyP->len) == 0
)
) return(i);
}
return(0);
}
#ifdef BUILDCID
static boolean
initCIDFont(int cnt)
{
if (!(vm_init(cnt))) return(FALSE);
vm_base = vm_next_byte();
strcpy(CurCIDFontName, "");
strcpy(CurCMapName, "");
strcpy(CurFontName, "");
CIDFontP = &TheCurrentCIDFont;
CMapP = &TheCurrentCMap;
CIDFontP->vm_start = vm_next_byte();
CIDFontP->spacerangecnt = 0;
CIDFontP->notdefrangecnt = 0;
CIDFontP->cidrangecnt = 0;
CIDFontP->spacerangeP = NULL;
CIDFontP->notdefrangeP = NULL;
CIDFontP->cidrangeP = NULL;
CIDFontP->CIDFontFileName.len = 0;
CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName;
CMapP->CMapFileName.len = 0;
CMapP->CMapFileName.data.valueP = CurCMapName;
CMapP->firstRow = 0xFFFF;
CMapP->firstCol = 0xFFFF;
CMapP->lastRow = 0;
CMapP->lastCol = 0;
return(TRUE);
}
boolean
initCIDType1Font(void)
{
strcpy(CurFontName, "");
FontP = &FDArrayP[FDArrayIndex];
FontP->vm_start = vm_next_byte();
FontP->FontFileName.len = 0;
FontP->FontFileName.data.valueP = CurFontName;
FontP->Subrs.len = 0;
FontP->Subrs.data.stringP = NULL;
FontP->CharStringsP = NULL;
FontP->Private = NULL;
FontP->fontInfoP = NULL;
FontP->BluesP = NULL;
return(TRUE);
}
#endif
boolean
initFont(int cnt)
{
if (!(vm_init(cnt))) return(FALSE);
vm_base = vm_next_byte();
if (!(Init_BuiltInEncoding())) return(FALSE);
strcpy(CurFontName, "");
#ifdef BUILDCID
strcpy(CurCIDFontName, "");
#endif
FontP = &TheCurrentFont;
FontP->vm_start = vm_next_byte();
FontP->FontFileName.len = 0;
FontP->FontFileName.data.valueP = CurFontName;
return(TRUE);
}
#ifdef BUILDCID
static void
resetCIDFont(char *cidfontname, char *cmapfile)
{
vm_next = CIDFontP->vm_start;
vm_free = vm_size - ( vm_next - vm_base);
CIDFontP->spacerangecnt = 0;
CIDFontP->notdefrangecnt = 0;
CIDFontP->cidrangecnt = 0;
CIDFontP->spacerangeP = NULL;
CIDFontP->notdefrangeP = NULL;
CIDFontP->cidrangeP = NULL;
CIDFontP->CIDfontInfoP = NULL;
strcpy(CurCIDFontName,cidfontname);
strcpy(CurCMapName,cmapfile);
CIDFontP->CIDFontFileName.len = strlen(CurCIDFontName);
CIDFontP->CIDFontFileName.data.valueP = CurCIDFontName;
CMapP->CMapFileName.len = strlen(CurCMapName);
CMapP->CMapFileName.data.valueP = CurCMapName;
CMapP->firstRow = 0xFFFF;
CMapP->firstCol = 0xFFFF;
CMapP->lastRow = 0;
CMapP->lastCol = 0;
}
static void
resetCIDType1Font(void)
{
vm_next = FontP->vm_start;
vm_free = vm_size - ( vm_next - vm_base);
FontP->Subrs.len = 0;
FontP->Subrs.data.stringP = NULL;
FontP->CharStringsP = NULL;
FontP->Private = NULL;
FontP->fontInfoP = NULL;
FontP->BluesP = NULL;
FontP->FontFileName.len = strlen(CurFontName);
FontP->FontFileName.data.valueP = CurFontName;
}
#endif
static void
resetFont(char *env)
{
vm_next = FontP->vm_start;
vm_free = vm_size - ( vm_next - vm_base);
FontP->Subrs.len = 0;
FontP->Subrs.data.stringP = NULL;
FontP->CharStringsP = NULL;
FontP->Private = NULL;
FontP->fontInfoP = NULL;
FontP->BluesP = NULL;
strcpy(CurFontName,env);
FontP->FontFileName.len = strlen(CurFontName);
FontP->FontFileName.data.valueP = CurFontName;
}
#ifdef BUILDCID
int
readCIDFont(char *cidfontname, char *cmapfile)
{
int rcode;
resetCIDFont(cidfontname, cmapfile);
rcode = scan_cidfont(CIDFontP, CMapP);
if (rcode == SCAN_OUT_OF_MEMORY) {
if (!(initCIDFont(vm_size * 2))) {
return(SCAN_OUT_OF_MEMORY);
}
resetCIDFont(cidfontname, cmapfile);
rcode = scan_cidfont(CIDFontP, CMapP);
if (rcode == SCAN_OUT_OF_MEMORY) {
if (!(initCIDFont(vm_size * 2))) {
return(SCAN_OUT_OF_MEMORY);
}
resetCIDFont(cidfontname, cmapfile);
rcode = scan_cidfont(CIDFontP, CMapP);
}
}
return(rcode);
}
int
readCIDType1Font(void)
{
int rcode;
resetCIDType1Font();
rcode = scan_cidtype1font(FontP);
return(rcode);
}
#endif
int
readFont(char *env)
{
int rcode;
resetFont(env);
rcode = scan_font(FontP);
if (rcode == SCAN_OUT_OF_MEMORY) {
#ifdef BUILDCID
#else
xfree(vm_base);
#endif
if (!(initFont(vm_size * 2))) {
return(SCAN_OUT_OF_MEMORY);
}
resetFont(env);
rcode = scan_font(FontP);
#ifdef BUILDCID
if (rcode == SCAN_OUT_OF_MEMORY) {
if (!(initFont(vm_size * 2))) {
return(SCAN_OUT_OF_MEMORY);
}
resetFont(env);
rcode = scan_font(FontP);
}
#else
#endif
}
return(rcode);
}
struct xobject *
fontfcnB(struct XYspace *S, unsigned char *code, int *lenP, int *mode)
{
psobj *charnameP;
int N;
psdict *CharStringsDictP;
psobj CodeName;
psobj *SubrsArrayP;
psobj *theStringP;
struct xobject *charpath;
charnameP = &CodeName;
charnameP->len = *lenP;
charnameP->data.stringP = code;
CharStringsDictP = FontP->CharStringsP;
N = SearchDictName(CharStringsDictP,charnameP);
if (N<=0) {
*mode = FF_PARSE_ERROR;
return(NULL);
}
theStringP = &(CharStringsDictP[N].value);
SubrsArrayP = &(FontP->Subrs);
charpath = (struct xobject *)Type1Char((char *)FontP,S,theStringP,
SubrsArrayP,NULL,
FontP->BluesP , mode);
if ( *mode == FF_PARSE_ERROR) return(NULL);
if (*mode != FF_PATH) {
charpath = (struct xobject *)Interior((struct segment *)charpath,
WINDINGRULE+CONTINUITY);
}
return(charpath);
}
#ifdef BUILDCID
Bool
CIDfontfcnA(char *cidfontname, char *cmapfile, int *mode)
{
int rcode, cidinit;
cidinit = 0;
if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) {
InitImager();
if (!(initCIDFont(VM_SIZE))) {
*mode = SCAN_OUT_OF_MEMORY;
return(FALSE);
}
cidinit = 1;
}
if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) ||
(cmapfile && strcmp(cmapfile,CurCMapName) != 0)) {
rcode = readCIDFont(cidfontname, cmapfile);
if (rcode != 0 ) {
strcpy(CurCIDFontName, "");
strcpy(CurCMapName, "");
*mode = rcode;
return(FALSE);
}
}
return(TRUE);
}
Bool
CIDType1fontfcnA(int *mode)
{
int rcode;
if (!(initCIDType1Font())) {
*mode = SCAN_OUT_OF_MEMORY;
return(FALSE);
}
if ((rcode = readCIDType1Font()) != 0) {
strcpy(CurFontName, "");
*mode = rcode;
return(FALSE);
}
return(TRUE);
}
#endif
Bool
fontfcnA(char *env, int *mode)
{
int rc;
#ifdef BUILDCID
if (FontP == NULL || strcmp(CurFontName, "") == 0) {
#else
if (FontP == NULL) {
#endif
InitImager();
if (!(initFont(VM_SIZE))) {
*mode = SCAN_OUT_OF_MEMORY;
return(FALSE);
}
}
if ( (env) && (strcmp(env,CurFontName) != 0 ) ) {
rc = readFont(env);
if (rc != 0 ) {
strcpy(CurFontName, "");
*mode = rc;
return(FALSE);
}
}
return(TRUE);
}
#ifdef BUILDCID
void
CIDQueryFontLib(char *cidfontname, char *cmapfile, char *infoName,
pointer infoValue,
int *rcodeP)
{
int rc,N,i,cidinit;
psdict *dictP;
psobj nameObj;
psobj *valueP;
cidinit = 0;
if (CIDFontP == NULL || strcmp(CurCIDFontName, "") == 0) {
InitImager();
if (!(initCIDFont(VM_SIZE))) {
*rcodeP = 1;
return;
}
cidinit = 1;
}
if (cidinit || (cidfontname && strcmp(cidfontname,CurCIDFontName) != 0) ||
(cmapfile && strcmp(cmapfile,CurCMapName) != 0)) {
rc = readCIDFont(cidfontname, cmapfile);
if (rc != 0 ) {
strcpy(CurCIDFontName, "");
strcpy(CurCMapName, "");
*rcodeP = 1;
return;
}
}
dictP = CIDFontP->CIDfontInfoP;
objFormatName(&nameObj,strlen(infoName),infoName);
N = SearchDictName(dictP,&nameObj);
if ( N > 0 ) {
*rcodeP = 0;
switch (dictP[N].value.type) {
case OBJ_ARRAY:
valueP = dictP[N].value.data.arrayP;
if (valueP == NULL) break;
if (strcmp(infoName,"FontMatrix") == 0) {
for (i=0;i<6;i++) {
if (valueP->type == OBJ_INTEGER )
((float *)infoValue)[i] = valueP->data.integer;
else
((float *)infoValue)[i] = valueP->data.real;
valueP++;
}
}
if (strcmp(infoName,"FontBBox") == 0) {
for (i=0;i<4;i++) {
((int *)infoValue)[i] = valueP->data.integer;
valueP++;
}
break;
case OBJ_INTEGER:
case OBJ_BOOLEAN:
*((int *)infoValue) = dictP[N].value.data.integer;
break;
case OBJ_REAL:
*((float *)infoValue) = dictP[N].value.data.real;
break;
case OBJ_NAME:
case OBJ_STRING:
*((char **)infoValue) = dictP[N].value.data.valueP;
break;
default:
*rcodeP = 1;
break;
}
}
}
else *rcodeP = 1;
}
#endif
void
QueryFontLib(char *env, char *infoName,
pointer infoValue,
int *rcodeP)
{
int rc,N,i;
psdict *dictP;
psobj nameObj;
psobj *valueP;
if (FontP == NULL) {
InitImager();
if (!(initFont(VM_SIZE))) {
*rcodeP = 1;
return;
}
}
if ( (env) && (strcmp(env,CurFontName) != 0 ) ) {
rc = readFont(env);
if (rc != 0 ) {
strcpy(CurFontName, "");
*rcodeP = 1;
return;
}
}
dictP = FontP->fontInfoP;
objFormatName(&nameObj,strlen(infoName),infoName);
N = SearchDictName(dictP,&nameObj);
if ( N > 0 ) {
*rcodeP = 0;
switch (dictP[N].value.type) {
case OBJ_ARRAY:
valueP = dictP[N].value.data.arrayP;
if (valueP == NULL) break;
if (strcmp(infoName,"FontMatrix") == 0) {
for (i=0;i<6;i++) {
if (valueP->type == OBJ_INTEGER )
((float *)infoValue)[i] = valueP->data.integer;
else
((float *)infoValue)[i] = valueP->data.real;
valueP++;
}
}
if (strcmp(infoName,"FontBBox") == 0) {
for (i=0;i<4;i++) {
((int *)infoValue)[i] = valueP->data.integer;
valueP++;
}
break;
case OBJ_INTEGER:
case OBJ_BOOLEAN:
*((int *)infoValue) = dictP[N].value.data.integer;
break;
case OBJ_REAL:
*((float *)infoValue) = dictP[N].value.data.real;
break;
case OBJ_NAME:
case OBJ_STRING:
*((char **)infoValue) = dictP[N].value.data.valueP;
break;
default:
*rcodeP = 1;
break;
}
}
}
else *rcodeP = 1;
}
#ifdef BUILDCID
struct xobject *
CIDfontfcnC(struct XYspace *S, psobj *theStringP,
psobj *SubrsArrayP, struct blues_struct *BluesP,
int *lenP, int *mode)
{
struct xobject *charpath;
charpath = (struct xobject *)CIDChar((char *)FontP,S,theStringP,
SubrsArrayP,NULL,BluesP,mode);
if ( *mode == FF_PARSE_ERROR) return(NULL);
if (*mode != FF_PATH) {
charpath = (struct xobject *)Interior((struct segment *)charpath,
WINDINGRULE+CONTINUITY);
}
return(charpath);
}
#endif