From 4bc1ebb5edacaad9cf983e8c76e1bd4dca4f8bd9 Mon Sep 17 00:00:00 2001
From: Ian Pilcher <ian.pilcher@home.com>
Date: Tue, 24 Jul 2001 20:52:19 +0000
Subject: [PATCH] Modify init code to handle const data types.

---
 dlls/wineps/afm.c       | 393 ++++++++++++++++++----------------------
 dlls/wineps/font.c      |  18 +-
 dlls/wineps/glyphlist.c |   2 +-
 dlls/wineps/init.c      |   2 +-
 dlls/wineps/psdrv.h     |  26 +--
 dlls/wineps/truetype.c  | 190 ++++++++++---------
 6 files changed, 302 insertions(+), 329 deletions(-)

diff --git a/dlls/wineps/afm.c b/dlls/wineps/afm.c
index b5c55128cb4..6a8d08bd7dd 100644
--- a/dlls/wineps/afm.c
+++ b/dlls/wineps/afm.c
@@ -31,6 +31,10 @@ FONTFAMILY *PSDRV_AFMFontList = NULL;
 /* qsort/bsearch callback functions */
 typedef int (*compar_callback_fn) (const void *, const void *);
 
+static VOID SortFontMetrics(AFM *afm, AFMMETRICS *metrics);
+static VOID CalcWindowsMetrics(AFM *afm);
+static void PSDRV_ReencodeCharWidths(AFM *afm);
+
 /*******************************************************************************
  *  IsWinANSI
  *
@@ -94,28 +98,6 @@ inline static BOOL CheckMetrics(const AFMMETRICS *metrics)
     return TRUE;
 }
 
-/*******************************************************************************
- *  FreeAFM
- *
- *  Free an AFM structure and any subsidiary objects that have been allocated.
- *  AFM must have been allocated with HEAP_ZERO_MEMORY.
- *
- */
-static void FreeAFM(AFM *afm)
-{
-    if (afm->FontName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FontName);
-    if (afm->FullName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FullName);
-    if (afm->FamilyName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FamilyName);
-    if (afm->EncodingScheme != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->EncodingScheme);
-    if (afm->Metrics != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->Metrics);
-	
-    HeapFree(PSDRV_Heap, 0, afm);
-}
 
 /***********************************************************
  *
@@ -131,13 +113,14 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
     unsigned char line[256], valbuf[256];
     unsigned char *cp, *item, *value, *curpos, *endpos;
     int i;
-    AFMMETRICS *metric;
+    AFMMETRICS *metric, *retval;
 
-    afm->Metrics = metric = HeapAlloc( PSDRV_Heap, 0,
-                                       afm->NumofMetrics * sizeof(AFMMETRICS) );
+    metric = HeapAlloc( PSDRV_Heap, 0, afm->NumofMetrics * sizeof(AFMMETRICS));
     if (metric == NULL)
         return FALSE;
-				       
+	
+    retval = metric;
+	
     for(i = 0; i < afm->NumofMetrics; i++, metric++) {
     
     	*metric = badMetrics;
@@ -145,8 +128,7 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 	do {
             if(!fgets(line, sizeof(line), fp)) {
 		ERR("Unexpected EOF\n");
-		HeapFree(PSDRV_Heap, 0, afm->Metrics);
-		afm->Metrics = NULL;
+		HeapFree(PSDRV_Heap, 0, retval);
 		return FALSE;
 	    }
 	    cp = line + strlen(line);
@@ -164,8 +146,7 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 	    value = strpbrk(item, " \t");
 	    if (!value) {
 	    	ERR("No whitespace found.\n");
-		HeapFree(PSDRV_Heap, 0, afm->Metrics);
-		afm->Metrics = NULL;
+		HeapFree(PSDRV_Heap, 0, retval);
 		return FALSE;
 	    }
 	    while(isspace(*value))
@@ -173,8 +154,7 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 	    cp = endpos = strchr(value, ';');
 	    if (!cp) {
 	    	ERR("missing ;, failed. [%s]\n", line);
-		HeapFree(PSDRV_Heap, 0, afm->Metrics);
-		afm->Metrics = NULL;
+		HeapFree(PSDRV_Heap, 0, retval);
 		return FALSE;
 	    }
 	    while(isspace(*--cp))
@@ -218,8 +198,7 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 	
 	if (CheckMetrics(metric) == FALSE) {
 	    ERR("Error parsing character metrics\n");
-	    HeapFree(PSDRV_Heap, 0, afm->Metrics);
-	    afm->Metrics = NULL;
+	    HeapFree(PSDRV_Heap, 0, retval);
 	    return FALSE;
 	}
 
@@ -227,6 +206,10 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
 	      metric->N->sz, metric->WX, metric->B.llx, metric->B.lly,
 	      metric->B.urx, metric->B.ury);
     }
+    
+    SortFontMetrics(afm, retval);
+    
+    afm->Metrics = retval;
 
     return TRUE;
 }
@@ -237,13 +220,13 @@ static BOOL PSDRV_AFMGetCharMetrics(AFM *afm, FILE *fp)
  *	PSDRV_AFMParse
  *
  * Fills out an AFM structure and associated substructures (see psdrv.h)
- * for a given AFM file. All memory is allocated from the process heap. 
+ * for a given AFM file. All memory is allocated from the driver heap. 
  * Returns a ptr to the AFM structure or NULL on error.
  *
  * This is not complete (we don't handle kerning yet) and not efficient
  */
 
-static AFM *PSDRV_AFMParse(char const *file)
+static const AFM *PSDRV_AFMParse(char const *file)
 {
     FILE *fp;
     unsigned char buf[256];
@@ -252,6 +235,8 @@ static AFM *PSDRV_AFMParse(char const *file)
     unsigned char *cp;
     int afmfile = 0; 
     int c;
+    LPSTR font_name = NULL, full_name = NULL, family_name = NULL,
+    	    encoding_scheme = NULL;
 
     TRACE("parsing '%s'\n", file);
 
@@ -260,7 +245,7 @@ static AFM *PSDRV_AFMParse(char const *file)
         return NULL;
     }
 
-    afm = HeapAlloc(PSDRV_Heap, HEAP_ZERO_MEMORY, sizeof(AFM));
+    afm = HeapAlloc(PSDRV_Heap, 0, sizeof(AFM));
     if(!afm) {
         fclose(fp);
         return NULL;
@@ -297,32 +282,23 @@ static AFM *PSDRV_AFMParse(char const *file)
 	        value++;
 
 	if(!strncmp("FontName", buf, 8)) {
-	    afm->FontName = HEAP_strdupA(PSDRV_Heap, 0, value);
-	    if (afm->FontName == NULL) {
-	    	fclose(fp);
-		FreeAFM(afm);
-		return NULL;
-	    }
+	    afm->FontName = font_name = HEAP_strdupA(PSDRV_Heap, 0, value);
+	    if (afm->FontName == NULL)
+		goto cleanup_fp;
 	    continue;
 	}
 
 	if(!strncmp("FullName", buf, 8)) {
-	    afm->FullName = HEAP_strdupA(PSDRV_Heap, 0, value);
-	    if (afm->FullName == NULL) {
-	    	fclose(fp);
-		FreeAFM(afm);
-		return NULL;
-	    }
+	    afm->FullName = full_name = HEAP_strdupA(PSDRV_Heap, 0, value);
+	    if (afm->FullName == NULL)
+		goto cleanup_fp;
 	    continue;
 	}
 
 	if(!strncmp("FamilyName", buf, 10)) {
-	    afm->FamilyName = HEAP_strdupA(PSDRV_Heap, 0, value);
-	    if (afm->FamilyName == NULL) {
-	    	fclose(fp);
-		FreeAFM(afm);
-		return NULL;
-	    }
+	    afm->FamilyName = family_name = HEAP_strdupA(PSDRV_Heap, 0, value);
+	    if (afm->FamilyName == NULL)
+	    	goto cleanup_fp;
 	    continue;
 	}
 	
@@ -399,21 +375,16 @@ static AFM *PSDRV_AFMParse(char const *file)
 
 	if(!strncmp("StartCharMetrics", buf, 16)) {
 	    sscanf(value, "%d", &(afm->NumofMetrics) );
-	    if (PSDRV_AFMGetCharMetrics(afm, fp) == FALSE) {
-	    	fclose(fp);
-		FreeAFM(afm);
-		return NULL;
-	    }
+	    if (PSDRV_AFMGetCharMetrics(afm, fp) == FALSE)
+	    	goto cleanup_fp;
 	    continue;
 	}
 
 	if(!strncmp("EncodingScheme", buf, 14)) {
-	    afm->EncodingScheme = HEAP_strdupA(PSDRV_Heap, 0, value);
-	    if (afm->EncodingScheme == NULL) {
-	    	fclose(fp);
-		FreeAFM(afm);
-		return NULL;
-	    }
+	    afm->EncodingScheme = encoding_scheme =
+	    	    HEAP_strdupA(PSDRV_Heap, 0, value);
+	    if (afm->EncodingScheme == NULL)
+	    	goto cleanup_fp;
 	    continue;
 	}
 
@@ -427,21 +398,20 @@ static AFM *PSDRV_AFMParse(char const *file)
 
     if(afm->FontName == NULL) {
         WARN("%s contains no FontName.\n", file);
-	afm->FontName = HEAP_strdupA(PSDRV_Heap, 0, "nofont");
-	if (afm->FontName == NULL) {
-	    FreeAFM(afm);
-	    return NULL;
-	}
+	afm->FontName = font_name = HEAP_strdupA(PSDRV_Heap, 0, "nofont");
+	if (afm->FontName == NULL)
+	    goto cleanup;
     }
     
     if(afm->FullName == NULL)
-        afm->FullName = HEAP_strdupA(PSDRV_Heap, 0, afm->FontName);
+        afm->FullName = full_name = HEAP_strdupA(PSDRV_Heap, 0, afm->FontName);
+	
     if(afm->FamilyName == NULL)
-        afm->FamilyName = HEAP_strdupA(PSDRV_Heap, 0, afm->FontName);
-    if (afm->FullName == NULL || afm->FamilyName == NULL) {
-    	FreeAFM(afm);
-	return NULL;
-    }
+        afm->FamilyName = family_name =
+	    	HEAP_strdupA(PSDRV_Heap, 0, afm->FontName);
+		
+    if (afm->FullName == NULL || afm->FamilyName == NULL)
+    	goto cleanup;
     
     if(afm->Ascender == 0.0)
         afm->Ascender = afm->FontBBox.ury;
@@ -452,7 +422,32 @@ static AFM *PSDRV_AFMParse(char const *file)
     if(afm->Weight == 0)
         afm->Weight = FW_NORMAL;
 	
+    CalcWindowsMetrics(afm);
+    
+    if (afm->EncodingScheme != NULL &&
+    	    strcmp(afm->EncodingScheme, "AdobeStandardEncoding") == 0)
+    	PSDRV_ReencodeCharWidths(afm);
+	
     return afm;
+    
+    cleanup_fp:
+    
+    	fclose(fp);
+    
+    cleanup:
+    
+    	if (font_name == NULL)
+	    HeapFree(PSDRV_Heap, 0, font_name);
+	if (full_name == NULL)
+	    HeapFree(PSDRV_Heap, 0, full_name);
+	if (family_name == NULL)
+	    HeapFree(PSDRV_Heap, 0, family_name);
+	if (encoding_scheme == NULL)
+	    HeapFree(PSDRV_Heap, 0, encoding_scheme);
+	    
+	HeapFree(PSDRV_Heap, 0, afm);
+	    
+	return NULL;
 }
 
 /***********************************************************
@@ -484,7 +479,7 @@ void PSDRV_FreeAFMList( FONTFAMILY *head )
  * Returns ptr to an AFM if name (which is a PS font name) exists in list
  * headed by head.
  */
-AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name)
+const AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name)
 {
     FONTFAMILY *family;
     AFMLISTENTRY *afmle;
@@ -505,7 +500,7 @@ AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name)
  * Adds an afm to the list whose head is pointed to by head. Creates new
  * family node if necessary and always creates a new AFMLISTENTRY.
  */
-BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm)
+BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, const AFM *afm)
 {
     FONTFAMILY *family = *head;
     FONTFAMILY **insert = head;
@@ -574,7 +569,7 @@ BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm)
 static void PSDRV_ReencodeCharWidths(AFM *afm)
 {
     int i, j;
-    AFMMETRICS *metric;
+    const AFMMETRICS *metric;
 
     for(i = 0; i < 256; i++) {
         if(isalnum(i))
@@ -649,68 +644,56 @@ static int AFMMetricsByUV(const AFMMETRICS *a, const AFMMETRICS *b)
     return a->UV - b->UV;
 }
  
-static BOOL SortFontMetrics()
+static VOID SortFontMetrics(AFM *afm, AFMMETRICS *metrics)
 {
-    FONTFAMILY	    *family = PSDRV_AFMFontList;
+    INT     i;
     
-    while (family != NULL)
+    TRACE("%s\n", afm->FontName);
+    
+    if (strcmp(afm->EncodingScheme, "FontSpecific") != 0)
     {
-    	AFMLISTENTRY	*afmle = family->afmlist;
-	
-	while (afmle != NULL)
-	{
-	    AFM *afm = afmle->afm;  	/* should always be valid */
-	    INT i;
-	    
-	    if (strcmp(afm->EncodingScheme, "FontSpecific") != 0)
-	    {
-	    	PSDRV_IndexGlyphList();     /* enable searching by name index */
+    	PSDRV_IndexGlyphList();     	/* enable searching by name index */
 	    
-		for (i = 0; i < afm->NumofMetrics; ++i)
-		{
-		    UNICODEGLYPH    ug, *pug;
+	for (i = 0; i < afm->NumofMetrics; ++i)
+	{
+	    UNICODEGLYPH    ug, *pug;
 		    
-		    ug.name = afm->Metrics[i].N;
-		    ug.UV = -1;
+	    ug.name = metrics[i].N;
 		    
-		    pug = bsearch(&ug, PSDRV_AGLbyName, PSDRV_AGLbyNameSize,
-		    	    sizeof(UNICODEGLYPH),
-			    (compar_callback_fn)UnicodeGlyphByNameIndex);
-		    if (pug == NULL)
-		    {
-		    	WARN("Glyph '%s' in font '%s' does not have a UV\n",
-			    	ug.name->sz, afm->FullName);
-			afm->Metrics[i].UV = -1;
-		    }
-		    else
-		    {
-		    	afm->Metrics[i].UV = pug->UV;
-		    }
-		}
+	    pug = bsearch(&ug, PSDRV_AGLbyName, PSDRV_AGLbyNameSize,
+	    	    sizeof(UNICODEGLYPH),
+		    (compar_callback_fn)UnicodeGlyphByNameIndex);
+	    if (pug == NULL)
+	    {
+	    	WARN("Glyph '%s' in font '%s' does not have a UV\n",
+    		    	ug.name->sz, afm->FullName);
+		metrics[i].UV = -1;
 	    }
-	    else    	    	    	    	/* FontSpecific encoding */
+	    else
 	    {
-	    	for (i = 0; i < afm->NumofMetrics; ++i)
-		    afm->Metrics[i].UV = afm->Metrics[i].C;
+	    	metrics[i].UV = pug->UV;
 	    }
+	}
+    }
+    else    	    	    	    	    /* FontSpecific encoding */
+    {
+    	for (i = 0; i < afm->NumofMetrics; ++i)
+	    metrics[i].UV = metrics[i].C;
+    }
 	    
-	    qsort(afm->Metrics, afm->NumofMetrics, sizeof(AFMMETRICS),
-	    	    (compar_callback_fn)AFMMetricsByUV);
+    qsort(metrics, afm->NumofMetrics, sizeof(AFMMETRICS),
+    	    (compar_callback_fn)AFMMetricsByUV);
 		    
-	    for (i = 0; i < afm->NumofMetrics; ++i)
-	    	if (afm->Metrics[i].UV >= 0)
-		    break;
-		    
-	    afm->NumofMetrics -= i; 	    /* Ignore unencoded glyphs */
-	    afm->Metrics += i;
+    for (i = 0; i < afm->NumofMetrics; ++i) 	/* count unencoded glyphs */
+    	if (metrics[i].UV >= 0)
+	    break;
 	    
-	    afmle = afmle->next;
-	}
-	
-	family = family->next;
+    if (i != 0)
+    {
+    	TRACE("Ignoring %i unencoded glyphs\n", i);
+    	afm->NumofMetrics -= i;
+	memmove(metrics, metrics + i, afm->NumofMetrics * sizeof(*metrics));
     }
-    
-    return TRUE;
 }
 
 /*******************************************************************************
@@ -770,98 +753,78 @@ SHORT PSDRV_CalcAvgCharWidth(const AFM *afm)
 /*******************************************************************************
  *  CalcWindowsMetrics
  *
- *  Calculates several Windows-specific font metrics for each font.  Relies on
- *  the fact that AFMs are allocated with HEAP_ZERO_MEMORY to distinguish
- *  TrueType fonts (when implemented), which already have these filled in.
+ *  Calculates several Windows-specific font metrics for each font.
  *
  */
-static VOID CalcWindowsMetrics()
+static VOID CalcWindowsMetrics(AFM *afm)
 {
-    FONTFAMILY	*family = PSDRV_AFMFontList;
-    
-    while (family != NULL)
-    {
-    	AFMLISTENTRY	*afmle = family->afmlist;
-	
-	while (afmle != NULL)
-	{
-	    WINMETRICS	wm;
-	    AFM     	*afm = afmle->afm;  	/* should always be valid */
-	    INT     	i;
+    WINMETRICS	wm;
+    INT     	i;
 	    
-	    if (afm->WinMetrics.usUnitsPerEm != 0)
-	    	continue;   	    	    	    /* TrueType font */
-		
-	    wm.usUnitsPerEm = 1000;         	    /* for PostScript fonts */
-	    wm.sTypoAscender = (SHORT)(afm->Ascender + 0.5);
-	    wm.sTypoDescender = (SHORT)(afm->Descender - 0.5);
+    wm.usUnitsPerEm = 1000;         	    	/* for PostScript fonts */
+    wm.sTypoAscender = (SHORT)(afm->Ascender + 0.5);
+    wm.sTypoDescender = (SHORT)(afm->Descender - 0.5);
 	    
-	    wm.sTypoLineGap = 1200 - (wm.sTypoAscender - wm.sTypoDescender);
-	    if (wm.sTypoLineGap < 0)
-	    	wm.sTypoLineGap = 0;
+    wm.sTypoLineGap = 1200 - (wm.sTypoAscender - wm.sTypoDescender);
+    if (wm.sTypoLineGap < 0)
+    	wm.sTypoLineGap = 0;
 		
-	    wm.usWinAscent = 0;
-	    wm.usWinDescent = 0;
+    wm.usWinAscent = 0;
+    wm.usWinDescent = 0;
 	    
-	    for (i = 0; i < afm->NumofMetrics; ++i)
-	    {
-	    	if (IsWinANSI(afm->Metrics[i].UV) == FALSE)
-		    continue;
-		    
-		if (afm->Metrics[i].B.ury > 0)
-		{
-		    USHORT ascent = (USHORT)(afm->Metrics[i].B.ury + 0.5);
-						
-		    if (ascent > wm.usWinAscent)
-		    	wm.usWinAscent = ascent;
-		}
-		
-		if (afm->Metrics[i].B.lly < 0)    
-		{
-		    USHORT descent = (USHORT)(-(afm->Metrics[i].B.lly) + 0.5);
-		    
-		    if (descent > wm.usWinDescent)
-		    	wm.usWinDescent = descent;
-		}
-	    }
+    for (i = 0; i < afm->NumofMetrics; ++i)
+    {
+    	if (IsWinANSI(afm->Metrics[i].UV) == FALSE)
+	    continue;
 	    
-	    if (wm.usWinAscent == 0 && afm->FontBBox.ury > 0)
-	    	wm.usWinAscent = (USHORT)(afm->FontBBox.ury + 0.5);
-		
-	    if (wm.usWinDescent == 0 && afm->FontBBox.lly < 0)
-	    	wm.usWinDescent = (USHORT)(-(afm->FontBBox.lly) + 0.5);
+	if (afm->Metrics[i].B.ury > 0)
+	{
+	    USHORT ascent = (USHORT)(afm->Metrics[i].B.ury + 0.5);
+					
+	    if (ascent > wm.usWinAscent)
+	    	wm.usWinAscent = ascent;
+	}
+	
+	if (afm->Metrics[i].B.lly < 0)    
+	{
+	    USHORT descent = (USHORT)(-(afm->Metrics[i].B.lly) + 0.5);
+	    
+	    if (descent > wm.usWinDescent)
+	    	wm.usWinDescent = descent;
+	}
+    }
+    
+    if (wm.usWinAscent == 0 && afm->FontBBox.ury > 0)
+    	wm.usWinAscent = (USHORT)(afm->FontBBox.ury + 0.5);
+	
+    if (wm.usWinDescent == 0 && afm->FontBBox.lly < 0)
+    	wm.usWinDescent = (USHORT)(-(afm->FontBBox.lly) + 0.5);
 		
-	    wm.sAscender = wm.usWinAscent;
-	    wm.sDescender = -(wm.usWinDescent);
+    wm.sAscender = wm.usWinAscent;
+    wm.sDescender = -(wm.usWinDescent);
 	    
-	    wm.sLineGap = 1150 - (wm.sAscender - wm.sDescender);
-	    if (wm.sLineGap < 0)
-	    	wm.sLineGap = 0;
+    wm.sLineGap = 1150 - (wm.sAscender - wm.sDescender);
+    if (wm.sLineGap < 0)
+    	wm.sLineGap = 0;
 		
-	    wm.sAvgCharWidth = PSDRV_CalcAvgCharWidth(afm);
+    wm.sAvgCharWidth = PSDRV_CalcAvgCharWidth(afm);
 						
-	    TRACE("Windows metrics for '%s':\n", afm->FullName);
-	    TRACE("\tsAscender = %i\n", wm.sAscender);
-	    TRACE("\tsDescender = %i\n", wm.sDescender);
-	    TRACE("\tsLineGap = %i\n", wm.sLineGap);
-	    TRACE("\tusUnitsPerEm = %u\n", wm.usUnitsPerEm);
-	    TRACE("\tsTypoAscender = %i\n", wm.sTypoAscender);
-	    TRACE("\tsTypoDescender = %i\n", wm.sTypoDescender);
-	    TRACE("\tsTypoLineGap = %i\n", wm.sTypoLineGap);
-	    TRACE("\tusWinAscent = %u\n", wm.usWinAscent);
-	    TRACE("\tusWinDescent = %u\n", wm.usWinDescent);
-	    TRACE("\tsAvgCharWidth = %i\n", wm.sAvgCharWidth);
-	    
-	    afm->WinMetrics = wm;
+    TRACE("Windows metrics for '%s':\n", afm->FullName);
+    TRACE("\tsAscender = %i\n", wm.sAscender);
+    TRACE("\tsDescender = %i\n", wm.sDescender);
+    TRACE("\tsLineGap = %i\n", wm.sLineGap);
+    TRACE("\tusUnitsPerEm = %u\n", wm.usUnitsPerEm);
+    TRACE("\tsTypoAscender = %i\n", wm.sTypoAscender);
+    TRACE("\tsTypoDescender = %i\n", wm.sTypoDescender);
+    TRACE("\tsTypoLineGap = %i\n", wm.sTypoLineGap);
+    TRACE("\tusWinAscent = %u\n", wm.usWinAscent);
+    TRACE("\tusWinDescent = %u\n", wm.usWinDescent);
+    TRACE("\tsAvgCharWidth = %i\n", wm.sAvgCharWidth);
 	    
-	    /* See afm2c.c and mkagl.c for an explanation of this */
-	    /*	PSDRV_AFM2C(afm);   */
+    afm->WinMetrics = wm;
 	    
-	    afmle = afmle->next;
-	}
-	
-	family = family ->next;
-    }
+    /* See afm2c.c and mkagl.c for an explanation of this */
+    /*	PSDRV_AFM2C(afm);   */
 }
 
 
@@ -898,7 +861,7 @@ static BOOL AddBuiltinAFMs()
 
 static BOOL PSDRV_ReadAFMDir(const char* afmdir) {
     DIR *dir;
-    AFM	*afm;
+    const AFM	*afm;
 
     dir = opendir(afmdir);
     if (dir) {
@@ -919,13 +882,8 @@ static BOOL PSDRV_ReadAFMDir(const char* afmdir) {
 		TRACE("loading AFM %s\n",afmfn);
 		afm = PSDRV_AFMParse(afmfn);
 		if (afm) {
-		    if(afm->EncodingScheme && 
-		       !strcmp(afm->EncodingScheme,"AdobeStandardEncoding")) {
-			PSDRV_ReencodeCharWidths(afm);
-		    }
 		    if (PSDRV_AddAFMtoList(&PSDRV_AFMFontList, afm) == FALSE) {
 		    	closedir(dir);
-			FreeAFM(afm);
 			return FALSE;
 		    }
 		}
@@ -964,13 +922,9 @@ BOOL PSDRV_GetFontMetrics(void)
     value_len = sizeof(value);
     while(!RegEnumValueA(hkey, idx++, key, &key_len, NULL, &type, value, &value_len))
     {
-        AFM* afm = PSDRV_AFMParse(value);
+        const AFM* afm = PSDRV_AFMParse(value);
 	
         if (afm) {
-            if(afm->EncodingScheme && 
-               !strcmp(afm->EncodingScheme, "AdobeStandardEncoding")) {
-                PSDRV_ReencodeCharWidths(afm);
-            }
             if (PSDRV_AddAFMtoList(&PSDRV_AFMFontList, afm) == FALSE) {
 		RegCloseKey(hkey);
 	    	return FALSE;
@@ -1011,9 +965,6 @@ no_afmfiles:
 
 no_afmdirs:
 
-    if (SortFontMetrics() == FALSE)
-    	return FALSE;
-    CalcWindowsMetrics();
     if (AddBuiltinAFMs() == FALSE)
     	return FALSE;
 
diff --git a/dlls/wineps/font.c b/dlls/wineps/font.c
index 60806d75e65..77d70e32871 100644
--- a/dlls/wineps/font.c
+++ b/dlls/wineps/font.c
@@ -26,13 +26,13 @@ inline static float round(float f)
  
 static void ScaleFont(DC *dc, LOGFONTW *lf, PSDRV_PDEVICE *physDev)
 {
-    PSFONT  	    *font = &(physDev->font);
-    WINMETRICS	    *wm = &(font->afm->WinMetrics);
-    TEXTMETRICW     *tm = &(font->tm);
-    LONG    	    lfHeight_ds;
-    USHORT  	    usUnitsPerEm, usWinAscent, usWinDescent;
-    SHORT   	    sAscender, sDescender, sLineGap, sTypoAscender;
-    SHORT    	    sTypoDescender, sTypoLineGap, sAvgCharWidth;
+    PSFONT  	    	*font = &(physDev->font);
+    const WINMETRICS	*wm = &(font->afm->WinMetrics);
+    TEXTMETRICW     	*tm = &(font->tm);
+    LONG    	    	lfHeight_ds;
+    USHORT  	    	usUnitsPerEm, usWinAscent, usWinDescent;
+    SHORT   	    	sAscender, sDescender, sLineGap, sTypoAscender;
+    SHORT    	    	sTypoDescender, sTypoLineGap, sAvgCharWidth;
     
     TRACE("'%s' %li\n", font->afm->FontName, lf->lfHeight);
 		
@@ -452,8 +452,8 @@ BOOL PSDRV_SetFont( DC *dc )
 /***********************************************************************
  *           PSDRV_GetFontMetric
  */
-static UINT PSDRV_GetFontMetric(HDC hdc, AFM *pafm, NEWTEXTMETRICEXW *pTM, 
-				ENUMLOGFONTEXW *pLF, INT16 size)
+static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *pafm,
+    	NEWTEXTMETRICEXW *pTM, ENUMLOGFONTEXW *pLF, INT16 size)
 
 {
     DC *dc = DC_GetDCPtr( hdc );
diff --git a/dlls/wineps/glyphlist.c b/dlls/wineps/glyphlist.c
index 661292b30fc..b8349b3b53f 100644
--- a/dlls/wineps/glyphlist.c
+++ b/dlls/wineps/glyphlist.c
@@ -157,7 +157,7 @@ static INT GlyphListSearch(LPCSTR szName, INT loIndex, INT hiIndex)
  *  necessary, and returns a pointer to it (NULL if unable to add it)
  *
  */
-GLYPHNAME *PSDRV_GlyphName(LPCSTR szName)
+const GLYPHNAME *PSDRV_GlyphName(LPCSTR szName)
 {
     INT index;
 
diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c
index 819d1b0898c..960073e460b 100644
--- a/dlls/wineps/init.c
+++ b/dlls/wineps/init.c
@@ -462,7 +462,7 @@ PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name)
     DWORD type = REG_BINARY, needed, res, dwPaperSize;
     PRINTERINFO *pi = PSDRV_PrinterList, **last = &PSDRV_PrinterList;
     FONTNAME *font;
-    AFM *afm;
+    const AFM *afm;
     HANDLE hPrinter;
     const char *ppd = NULL;
     char ppdFileName[256];
diff --git a/dlls/wineps/psdrv.h b/dlls/wineps/psdrv.h
index 701609882c6..03cf0a629a0 100644
--- a/dlls/wineps/psdrv.h
+++ b/dlls/wineps/psdrv.h
@@ -19,7 +19,7 @@ typedef struct {
 
 typedef struct {
     LONG	    UV;
-    GLYPHNAME	    *name;
+    const GLYPHNAME *name;
 } UNICODEGLYPH;
 
 typedef struct {
@@ -36,9 +36,9 @@ typedef struct _tagAFMMETRICS {
     int			C;		/* character */  
     LONG     	    	UV;
     float		WX;
-    GLYPHNAME		*N;		/* name */
+    const GLYPHNAME	*N;		/* name */
     AFMBBOX		B;
-    AFMLIGS		*L;		/* Ligatures */
+    const AFMLIGS	*L;		/* Ligatures */
 } AFMMETRICS;
 
 typedef struct {
@@ -55,10 +55,10 @@ typedef struct {
 } WINMETRICS;
 
 typedef struct _tagAFM {
-    char		*FontName;
-    char		*FullName;
-    char		*FamilyName;
-    char		*EncodingScheme;
+    LPCSTR		FontName;
+    LPCSTR		FullName;
+    LPCSTR		FamilyName;
+    LPCSTR		EncodingScheme;
     LONG		Weight;			/* FW_NORMAL etc. */
     float		ItalicAngle;
     BOOL		IsFixedPitch;
@@ -73,7 +73,7 @@ typedef struct _tagAFM {
     WINMETRICS	    	WinMetrics;
     float		CharWidths[256];
     int			NumofMetrics;
-    AFMMETRICS		*Metrics;
+    const AFMMETRICS	*Metrics;
 } AFM; /* CharWidths is a shortcut to the WX values of numbered glyphs */
 
 /* Note no 'next' in AFM. Use AFMLISTENTRY as a container. This allow more than
@@ -82,7 +82,7 @@ typedef struct _tagAFM {
    fonts for each DC (dc->physDev->Fonts) */
 
 typedef struct _tagAFMLISTENTRY {
-    AFM				*afm;
+    const AFM			*afm;
     struct _tagAFMLISTENTRY	*next;
 } AFMLISTENTRY;
 
@@ -218,7 +218,7 @@ typedef struct {
 } PSCOLOR;
 
 typedef struct {
-    AFM                 *afm;
+    const AFM           *afm;
     TEXTMETRICW         tm;
     INT                 size;
     float               scale;
@@ -297,8 +297,8 @@ extern void PSDRV_MergeDevmodes(PSDRV_DEVMODEA *dm1, PSDRV_DEVMODEA *dm2,
 extern BOOL PSDRV_GetFontMetrics(void);
 extern PPD *PSDRV_ParsePPD(char *fname);
 extern PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name);
-extern AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name);
-extern BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, AFM *afm);
+extern const AFM *PSDRV_FindAFMinList(FONTFAMILY *head, char *name);
+extern BOOL PSDRV_AddAFMtoList(FONTFAMILY **head, const AFM *afm);
 extern void PSDRV_FreeAFMList( FONTFAMILY *head );
 
 extern BOOL WINAPI PSDRV_Init(HINSTANCE hinst, DWORD reason, LPVOID reserved);
@@ -425,7 +425,7 @@ extern DWORD PSDRV_DeviceCapabilities(LPSTR lpszDriver, LPCSTR lpszDevice,
 				      LPDEVMODEA lpdm);
 VOID PSDRV_DrawLine( DC *dc );
 INT PSDRV_GlyphListInit();
-GLYPHNAME *PSDRV_GlyphName(LPCSTR szName);
+const GLYPHNAME *PSDRV_GlyphName(LPCSTR szName);
 VOID PSDRV_IndexGlyphList();
 BOOL PSDRV_GetTrueTypeMetrics();
 const AFMMETRICS *PSDRV_UVMetrics(LONG UV, const AFM *afm);
diff --git a/dlls/wineps/truetype.c b/dlls/wineps/truetype.c
index 24655e837cc..0cddce78c78 100644
--- a/dlls/wineps/truetype.c
+++ b/dlls/wineps/truetype.c
@@ -39,6 +39,7 @@
 #include <stdio.h>
 
 #include "winnt.h"
+#include "winerror.h"
 #include "winreg.h"
 #include "psdrv.h"
 #include "debugtools.h"
@@ -60,6 +61,16 @@ static TT_Postscript	*post;
 static TT_OS2	    	*os2;
 static TT_HoriHeader	*hhea;
 
+/* This is now officially a pain in the ass! */
+
+typedef struct
+{
+    LPSTR   FontName;
+    LPSTR   FullName;
+    LPSTR   FamilyName;
+    LPSTR   EncodingScheme;
+} AFMSTRINGS;
+
 /*******************************************************************************
  *
  *  FindCharMap
@@ -81,7 +92,7 @@ static const char *encoding_names[7] =
     "WindowsJohab"  	    /* TT_MS_ID_JOHAB */
 };
  
-static BOOL FindCharMap(AFM *afm)
+static BOOL FindCharMap(AFM *afm, AFMSTRINGS *str)
 {
     FT_Int  	i;
     FT_Error	error;
@@ -115,22 +126,24 @@ static BOOL FindCharMap(AFM *afm)
 	
     if (charmap->encoding_id < 7)
     {
-    	afm->EncodingScheme = HEAP_strdupA(PSDRV_Heap, 0,
+    	str->EncodingScheme = HEAP_strdupA(PSDRV_Heap, 0,
 	    	encoding_names[charmap->encoding_id]);
-	if (afm->EncodingScheme == NULL)
+	if (str->EncodingScheme == NULL)
 	    return FALSE;
     }
     else
     {
-    	afm->EncodingScheme = HeapAlloc(PSDRV_Heap, 0,	    /* encoding_id   */
-	    	sizeof("WindowsUnknown65535"));     	    /*   is a UShort */
-	if (afm->EncodingScheme == NULL)
+    	str->EncodingScheme =
+	    	HeapAlloc(PSDRV_Heap, 0, sizeof("WindowsUnknown65535"));
+	if (str->EncodingScheme == NULL)
 	    return FALSE;
 	    
-	sprintf(afm->EncodingScheme, "%s%u", "WindowsUnknown",
+	sprintf(str->EncodingScheme, "%s%u", "WindowsUnknown",
 	    	charmap->encoding_id);
     }
     
+    afm->EncodingScheme = str->EncodingScheme;
+    
     return TRUE;
 }
 
@@ -160,7 +173,7 @@ static BOOL NameTableString(LPSTR *sz, const FT_SfntName *name)
     }
     
     len = name->string_len / 2;
-    s = *sz = HeapAlloc(PSDRV_Heap, 0, len + 1);
+    *sz = s = HeapAlloc(PSDRV_Heap, 0, len + 1);
     if (s == NULL)
     	return FALSE;
     ws = (FT_UShort *)(name->string);
@@ -198,7 +211,7 @@ static BOOL NameTableString(LPSTR *sz, const FT_SfntName *name)
  *  returns FALSE only in the event of an unexpected error.
  *
  */
-static BOOL ReadNameTable(AFM *afm)
+static BOOL ReadNameTable(AFM *afm, AFMSTRINGS *str)
 {
     FT_UInt 	numStrings, stringIndex;
     FT_SfntName name;
@@ -226,20 +239,23 @@ static BOOL ReadNameTable(AFM *afm)
 	{
 	    case TT_NAME_ID_FONT_FAMILY:
 	    
-	    	if (NameTableString(&(afm->FamilyName), &name) == FALSE)
+	    	if (NameTableString(&(str->FamilyName), &name) == FALSE)
 		    return FALSE;
+		afm->FamilyName = str->FamilyName;
 		break;
 	    
 	    case TT_NAME_ID_FULL_NAME:
 	    
-	    	if (NameTableString(&(afm->FullName), &name) == FALSE)
+	    	if (NameTableString(&(str->FullName), &name) == FALSE)
 		    return FALSE;
+		afm->FullName = str->FullName;
 		break;
 	    
 	    case TT_NAME_ID_PS_NAME:
 	    
-	    	if (NameTableString(&(afm->FontName), &name) == FALSE)
+	    	if (NameTableString(&(str->FontName), &name) == FALSE)
 		    return FALSE;
+		afm->FontName = str->FontName;
 		break;
 	}
     }
@@ -247,30 +263,6 @@ static BOOL ReadNameTable(AFM *afm)
     return TRUE;
 }
 
-/*******************************************************************************
- *  FreeAFM
- *
- *  Frees an AFM and all subsidiary objects.  For this function to work
- *  properly, the AFM must have been allocated with HEAP_ZERO_MEMORY, and the
- *  UNICODEVECTOR and it's associated array of UNICODEGLYPHs must have been
- *  allocated as a single object.
- */
-static void FreeAFM(AFM *afm)
-{
-    if (afm->FontName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FontName);
-    if (afm->FullName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FullName);
-    if (afm->FamilyName != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->FamilyName);
-    if (afm->EncodingScheme != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->EncodingScheme);
-    if (afm->Metrics != NULL)
-    	HeapFree(PSDRV_Heap, 0, afm->Metrics);
-	
-    HeapFree(PSDRV_Heap, 0, afm);
-}
-
 /*******************************************************************************
  *  PSUnits
  *
@@ -335,14 +327,13 @@ static BOOL ReadMetricsTables(AFM *afm)
 /*******************************************************************************
  *  ReadCharMetrics
  *
- *  Reads metrics for each glyph in a TrueType font.  Since FreeAFM will try to
- *  free afm->Metrics and afm->Encoding if they are non-NULL, don't free them
- *  in the event of an error.
+ *  Reads metrics for each glyph in a TrueType font.
  *
  */
-static BOOL ReadCharMetrics(AFM *afm)
+static AFMMETRICS *ReadCharMetrics(AFM *afm)
 {
     FT_ULong	    charcode, index;
+    AFMMETRICS	    *metrics;
     
     /*
      *	There does not seem to be an easy way to get the number of characters
@@ -356,9 +347,9 @@ static BOOL ReadCharMetrics(AFM *afm)
     
     afm->NumofMetrics = index;
     
-    afm->Metrics = HeapAlloc(PSDRV_Heap, 0, index * sizeof(AFMMETRICS));
-    if (afm->Metrics == NULL)
-    	return FALSE;
+    metrics = HeapAlloc(PSDRV_Heap, 0, index * sizeof(AFMMETRICS));
+    if (metrics == NULL)
+    	return NULL;
 	
     for (charcode = 0, index = 0; charcode <= 65536; ++charcode)
     {
@@ -376,14 +367,14 @@ static BOOL ReadCharMetrics(AFM *afm)
 	if (error != FT_Err_Ok)
 	{
 	    ERR("%s returned %i\n", "FT_Load_Glyph", error);
-	    return FALSE;
+	    goto cleanup;
 	}
 	
 	error = FT_Get_Glyph(face->glyph, &glyph);
 	if (error != FT_Err_Ok)
 	{
 	    ERR("%s returned %i\n", "FT_Get_Glyph", error);
-	    return FALSE;
+	    goto cleanup;
 	}
 	
 	FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_unscaled, &bbox);
@@ -392,26 +383,26 @@ static BOOL ReadCharMetrics(AFM *afm)
 	if (error != FT_Err_Ok)
 	{
 	    ERR("%s returned %i\n", "FT_Get_Glyph_Name", error);
-	    return FALSE;
+	    goto cleanup;
 	}
 	
-	afm->Metrics[index].N = PSDRV_GlyphName(buffer);
-	if (afm->Metrics[index].N == NULL)
-	    return FALSE;
+	metrics[index].N = PSDRV_GlyphName(buffer);
+	if (metrics[index].N == NULL)
+	    goto cleanup;;
 	
-	afm->Metrics[index].C = charcode;
-	afm->Metrics[index].UV = charcode;
-	afm->Metrics[index].WX = PSUnits(face->glyph->metrics.horiAdvance);
-	afm->Metrics[index].B.llx = PSUnits(bbox.xMin);
-	afm->Metrics[index].B.lly = PSUnits(bbox.yMin);
-	afm->Metrics[index].B.urx = PSUnits(bbox.xMax);
-	afm->Metrics[index].B.ury = PSUnits(bbox.yMax);
-	afm->Metrics[index].L = NULL;
+	metrics[index].C = charcode;
+	metrics[index].UV = charcode;
+	metrics[index].WX = PSUnits(face->glyph->metrics.horiAdvance);
+	metrics[index].B.llx = PSUnits(bbox.xMin);
+	metrics[index].B.lly = PSUnits(bbox.yMin);
+	metrics[index].B.urx = PSUnits(bbox.xMax);
+	metrics[index].B.ury = PSUnits(bbox.yMax);
+	metrics[index].L = NULL;
 	
 	TRACE("Metrics for '%s' WX = %f B = %f,%f - %f,%f\n",
-	    	afm->Metrics[index].N->sz, afm->Metrics[index].WX,
-		afm->Metrics[index].B.llx, afm->Metrics[index].B.lly,
-	      	afm->Metrics[index].B.urx, afm->Metrics[index].B.ury);
+	    	metrics[index].N->sz, metrics[index].WX,
+		metrics[index].B.llx, metrics[index].B.lly,
+		metrics[index].B.urx, metrics[index].B.ury);
 	
 	if (charcode == 0x0048)     	    	    /* 'H' */
 	    afm->CapHeight = PSUnits(bbox.yMax);
@@ -421,7 +412,12 @@ static BOOL ReadCharMetrics(AFM *afm)
 	++index;
     }
     
-    return TRUE;
+    return metrics;
+    
+    cleanup:
+    
+    	HeapFree(PSDRV_Heap, 0, metrics);
+	return NULL;
 }
 
 /*******************************************************************************
@@ -429,11 +425,13 @@ static BOOL ReadCharMetrics(AFM *afm)
  *
  *  Fills in AFM structure for opened TrueType font file.  Returns FALSE only on
  *  an unexpected error (memory allocation failure or FreeType error); otherwise
- *  returns TRUE.  Leaves it to the caller (ReadTrueTypeFile) to clean up.
+ *  returns TRUE.
  *
  */
 static BOOL ReadTrueTypeAFM(AFM *afm)
 {
+    AFMSTRINGS	str = { NULL, NULL, NULL, NULL };
+    AFMMETRICS	*metrics;
 
     if ((face->face_flags & REQUIRED_FACE_FLAGS) != REQUIRED_FACE_FLAGS)
     {
@@ -441,7 +439,7 @@ static BOOL ReadTrueTypeAFM(AFM *afm)
 	return TRUE;
     }
     
-    if (FindCharMap(afm) == FALSE)
+    if (FindCharMap(afm, &str) == FALSE)
     	return FALSE;
 	
     if (charmap == NULL)
@@ -452,13 +450,22 @@ static BOOL ReadTrueTypeAFM(AFM *afm)
     
     TRACE("Using encoding '%s'\n", afm->EncodingScheme);
 
-    if (ReadNameTable(afm) == FALSE)
+    if (ReadNameTable(afm, &str) == FALSE)
+    {
+    	if (str.FontName != NULL)   HeapFree(PSDRV_Heap, 0, str.FontName);
+	if (str.FullName != NULL)   HeapFree(PSDRV_Heap, 0, str.FullName);
+	if (str.FamilyName != NULL) HeapFree(PSDRV_Heap, 0, str.FamilyName);
+	HeapFree(PSDRV_Heap, 0, str.EncodingScheme);
     	return FALSE;
+    }
    
-    if (afm->FamilyName == NULL || afm->FullName == NULL ||
-    	    afm->FontName == NULL)
+    if (str.FamilyName == NULL || str.FullName == NULL || str.FontName == NULL)
     {
     	WARN("Required strings missing from font\n");
+    	if (str.FontName != NULL)   HeapFree(PSDRV_Heap, 0, str.FontName);
+	if (str.FullName != NULL)   HeapFree(PSDRV_Heap, 0, str.FullName);
+	if (str.FamilyName != NULL) HeapFree(PSDRV_Heap, 0, str.FamilyName);
+	HeapFree(PSDRV_Heap, 0, str.EncodingScheme);
 	return TRUE;
     }
 
@@ -468,13 +475,30 @@ static BOOL ReadTrueTypeAFM(AFM *afm)
 	return TRUE;
     }
     
-    if (ReadCharMetrics(afm) == FALSE)
+    afm->Metrics = metrics = ReadCharMetrics(afm);
+    if (metrics == NULL)
+    {
+    	HeapFree(PSDRV_Heap, 0, str.FontName);
+	HeapFree(PSDRV_Heap, 0, str.FullName);
+	HeapFree(PSDRV_Heap, 0, str.FamilyName);
+	HeapFree(PSDRV_Heap, 0, str.EncodingScheme);
     	return FALSE;
+    }
 
     /* Can't do this check until character metrics are read */
 
     if (afm->WinMetrics.sAvgCharWidth == 0)
     	afm->WinMetrics.sAvgCharWidth = PSDRV_CalcAvgCharWidth(afm);
+	
+    if (PSDRV_AddAFMtoList(&PSDRV_AFMFontList, afm) == FALSE)
+    {
+    	HeapFree(PSDRV_Heap, 0, str.FontName);
+	HeapFree(PSDRV_Heap, 0, str.FullName);
+	HeapFree(PSDRV_Heap, 0, str.FamilyName);
+	HeapFree(PSDRV_Heap, 0, str.EncodingScheme);
+    	HeapFree(PSDRV_Heap, 0, metrics);
+	return FALSE;
+    }
 
     return TRUE;
 }
@@ -490,7 +514,7 @@ static BOOL ReadTrueTypeAFM(AFM *afm)
 static BOOL ReadTrueTypeFile(LPCSTR filename)
 {
     FT_Error	error;
-    AFM     	*afm;
+    AFM  	*afm;
     
     TRACE("'%s'\n", filename);
 
@@ -499,7 +523,6 @@ static BOOL ReadTrueTypeFile(LPCSTR filename)
     	return FALSE;
 
     error = FT_New_Face(library, filename, 0, &face);
-
     if (error != FT_Err_Ok)
     {
     	WARN("FreeType error %i opening '%s'\n", error, filename);
@@ -509,7 +532,7 @@ static BOOL ReadTrueTypeFile(LPCSTR filename)
     
     if (ReadTrueTypeAFM(afm) == FALSE)
     {
-    	FreeAFM(afm);
+    	HeapFree(PSDRV_Heap, 0, afm);
 	FT_Done_Face(face);
 	return FALSE;
     }    
@@ -518,22 +541,16 @@ static BOOL ReadTrueTypeFile(LPCSTR filename)
     if (error != FT_Err_Ok)
     {
     	ERR("%s returned %i\n", "FT_Done_Face", error);
-	FreeAFM(afm);
+	HeapFree(PSDRV_Heap, 0, afm);
 	return FALSE;
     }
     
     if (afm->Metrics == NULL)	    	    	/* last element to be set */
     {
-    	FreeAFM(afm);
+    	HeapFree(PSDRV_Heap, 0, afm);
 	return TRUE;
     }
     
-    if (PSDRV_AddAFMtoList(&PSDRV_AFMFontList, afm) == FALSE)
-    {
-    	FreeAFM(afm);
-	return FALSE;
-    }
-    
     return TRUE;
 }
     
@@ -556,8 +573,8 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
     CHAR    	keybuf[256], namebuf[256];
     INT     	i = 0;
     FT_Error	error;
-    HKEY hkey;
-    DWORD type, key_len, name_len;
+    HKEY    	hkey;
+    DWORD   	type, key_len, name_len;
 
     error = FT_Init_FreeType(&library);
     if (error != FT_Err_Ok)
@@ -566,13 +583,16 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
 	return FALSE;
     }
 
-    if(RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\TrueType Font Directories",
-		     0, KEY_READ, &hkey))
+    if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,
+    	    "Software\\Wine\\Wine\\Config\\TrueType Font Directories",
+	    0, KEY_READ, &hkey) != ERROR_SUCCESS)
 	goto no_metrics;
 
     key_len = sizeof(keybuf);
     name_len = sizeof(namebuf);
-    while(!RegEnumValueA(hkey, i++, keybuf, &key_len, NULL, &type, namebuf, &name_len))
+    
+    while(RegEnumValueA(hkey, i++, keybuf, &key_len, NULL, &type, namebuf,
+    	    &name_len) == ERROR_SUCCESS)
     {
     	struct dirent	*dent;
     	DIR 	    	*dir;
@@ -626,9 +646,11 @@ BOOL PSDRV_GetTrueTypeMetrics(void)
 	key_len = sizeof(keybuf);
 	name_len = sizeof(namebuf);
     }
+    
     RegCloseKey(hkey);
 
-no_metrics:
+    no_metrics:
+    
     FT_Done_FreeType(library);
     return TRUE;
 }
-- 
GitLab