Changed the AFM metrics structure to use an array instead of a linked

list. This avoids doing two heap allocations for every character, and
reduces the metrics parsing time by approx 25%.
This commit is contained in:
Alexandre Julliard 2000-08-03 22:17:45 +00:00 committed by Alexandre Julliard
parent 66b4dd28cd
commit 87194855a1
2 changed files with 9 additions and 13 deletions

View File

@ -35,19 +35,16 @@ static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
char line[256], valbuf[256]; char line[256], valbuf[256];
char *cp, *item, *value, *curpos, *endpos; char *cp, *item, *value, *curpos, *endpos;
int i; int i;
AFMMETRICS **insert = &afm->Metrics, *metric; AFMMETRICS *metric;
for(i = 0; i < afm->NumofMetrics; i++) { afm->Metrics = metric = HeapAlloc( PSDRV_Heap, HEAP_ZERO_MEMORY,
afm->NumofMetrics * sizeof(AFMMETRICS) );
for(i = 0; i < afm->NumofMetrics; i++, metric++) {
if(!fgets(line, sizeof(line), fp)) { if(!fgets(line, sizeof(line), fp)) {
ERR("Unexpected EOF\n"); ERR("Unexpected EOF\n");
return; return;
} }
metric = *insert = HeapAlloc( PSDRV_Heap, HEAP_ZERO_MEMORY,
sizeof(AFMMETRICS) );
insert = &metric->next;
cp = line + strlen(line); cp = line + strlen(line);
do { do {
*cp = '\0'; *cp = '\0';
@ -85,7 +82,7 @@ static void PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
} }
else if(!strncmp("N ", item, 2)) { else if(!strncmp("N ", item, 2)) {
metric->N = HEAP_strdupA( PSDRV_Heap, 0, value); strncpy( metric->N, value, sizeof(metric->N) );
} }
else if(!strncmp("B ", item, 2)) { else if(!strncmp("B ", item, 2)) {
@ -367,7 +364,7 @@ void PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm)
*/ */
static void PSDRV_ReencodeCharWidths(AFM *afm) static void PSDRV_ReencodeCharWidths(AFM *afm)
{ {
int i; int i, j;
AFMMETRICS *metric; AFMMETRICS *metric;
for(i = 0; i < 256; i++) { for(i = 0; i < 256; i++) {
@ -377,13 +374,13 @@ static void PSDRV_ReencodeCharWidths(AFM *afm)
afm->CharWidths[i] = 0.0; afm->CharWidths[i] = 0.0;
continue; continue;
} }
for(metric = afm->Metrics; metric; metric = metric->next) { for (j = 0, metric = afm->Metrics; j < afm->NumofMetrics; j++, metric++) {
if(!strcmp(metric->N, PSDRV_ANSIVector[i])) { if(!strcmp(metric->N, PSDRV_ANSIVector[i])) {
afm->CharWidths[i] = metric->WX; afm->CharWidths[i] = metric->WX;
break; break;
} }
} }
if(!metric) { if(j == afm->NumofMetrics) {
WARN("Couldn't find glyph '%s' in font '%s'\n", WARN("Couldn't find glyph '%s' in font '%s'\n",
PSDRV_ANSIVector[i], afm->FontName); PSDRV_ANSIVector[i], afm->FontName);
afm->CharWidths[i] = 0.0; afm->CharWidths[i] = 0.0;

View File

@ -26,10 +26,9 @@ typedef struct _tagAFMLIGS {
typedef struct _tagAFMMETRICS { typedef struct _tagAFMMETRICS {
int C; /* character */ int C; /* character */
float WX; float WX;
char *N; /* name */ char N[32]; /* name */
AFMBBOX B; AFMBBOX B;
AFMLIGS *L; /* Ligatures */ AFMLIGS *L; /* Ligatures */
struct _tagAFMMETRICS *next;
} AFMMETRICS; } AFMMETRICS;
typedef struct _tagAFM { typedef struct _tagAFM {