r13904 chris_y - /trunk/netsurf/amiga/font_scan.c

netsurf at semichrome.net netsurf at semichrome.net
Sat May 5 15:46:18 BST 2012


Author: chris_y
Date: Sat May  5 09:46:18 2012
New Revision: 13904

URL: http://source.netsurf-browser.org?rev=13904&view=rev
Log:
Add loading, parse OS fonts into a list (which can optionally already
contain fonts) before scanning

Modified:
    trunk/netsurf/amiga/font_scan.c

Modified: trunk/netsurf/amiga/font_scan.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/font_scan.c?rev=13904&r1=13903&r2=13904&view=diff
==============================================================================
--- trunk/netsurf/amiga/font_scan.c (original)
+++ trunk/netsurf/amiga/font_scan.c Sat May  5 09:46:18 2012
@@ -31,6 +31,8 @@
 
 #include <libwapcaplet/libwapcaplet.h>
 
+#include "amiga/object.h"
+
 /**
  * Scan a font for glyphs not present in glypharray.
  *
@@ -45,6 +47,7 @@
 	struct GlyphWidthEntry *gwnode;
 	ULONG foundglyphs = 0;
 	ULONG serif = 0;
+	lwc_error lerror;
 
 	ofont = OpenOutlineFont(fontname, NULL, OFF_OPEN);
 
@@ -62,8 +65,8 @@
 			gwnode = (struct GlyphWidthEntry *)GetHead((struct List *)widthlist);
 			do {
 				if(gwnode && (glypharray[gwnode->gwe_Code] == NULL)) {
-					 lwc_intern_string(fontname, strlen(fontname) - 5, &glypharray[gwnode->gwe_Code]);
-					//printf("%lx\n",gwnode->gwe_Code);
+					lerror = lwc_intern_string(fontname, strlen(fontname) - 5, &glypharray[gwnode->gwe_Code]);
+					if(lerror != lwc_error_ok) continue;
 					foundglyphs++;
 				}
 			} while(gwnode = (struct GlyphWidthEntry *)GetSucc((struct Node *)gwnode));
@@ -81,13 +84,41 @@
  * \param  glypharray     an array of 0xffff lwc_string pointers
  * \return number of glyphs found
  */
-ULONG ami_font_scan_fonts(lwc_string **glypharray)
-{
-/* TODO: this function should take a list of fonts and add to it, ignoring duplicates */
+ULONG ami_font_scan_fonts(struct MinList *list, lwc_string **glypharray)
+{
+	ULONG found, total = 0;
+	struct nsObject *node;
+	struct nsObject *nnode;
+
+	if(IsMinListEmpty(list)) return 0;
+
+	node = (struct nsObject *)GetHead((struct List *)list);
+
+	do {
+		nnode = (struct nsObject *)GetSucc((struct Node *)node);
+		printf("Scanning %s...\n", node->dtz_Node.ln_Name);
+		found = ami_font_scan_font(node->dtz_Node.ln_Name, glypharray);
+		total += found;
+		printf("Found %ld new glyphs (total = %ld)\n", found, total);
+	} while(node = nnode);
+
+	return total;
+}
+
+
+/**
+ * Add OS fonts to a list.
+ *
+ * \param  list   list to add font names to
+ * \return number of fonts found
+ */
+ULONG ami_font_scan_list(struct MinList *list)
+{
 	int afShortage, afSize = 100, i;
 	struct AvailFontsHeader *afh;
 	struct AvailFonts *af;
-	ULONG found, total = 0;
+	ULONG found;
+	struct nsObject *node;
 
 	printf("Scanning fonts...\n");
 	do {
@@ -105,13 +136,19 @@
 	if(afh) {
 		af = (struct AvailFonts *)&(afh[1]);
 printf("af = %lx entries = %ld\n", af, afh->afh_NumEntries);
-/* bug somewhere, this only does 36 fonts as size 0 */
+
 		for(i = 0; i < afh->afh_NumEntries; i++) {
-			if((af[i].af_Attr.ta_YSize == 0) && (af[i].af_Attr.ta_Style == FS_NORMAL)) {
-				printf("%s (%ld) %ld\n", af[i].af_Attr.ta_Name, af[i].af_Attr.ta_Style, af[i].af_Attr.ta_YSize);
-				found = ami_font_scan_font(af[i].af_Attr.ta_Name, glypharray);
-				total += found;
-				printf("Found %ld new glyphs (total = %ld)\n", found, total);
+			if(af[i].af_Attr.ta_Style == FS_NORMAL) {
+				node = (struct nsObject *)FindIName((struct List *)list,
+							af[i].af_Attr.ta_Name);
+				if(node == NULL) {
+					node = AddObject(list, AMINS_UNKNOWN);
+					if(node) {
+						node->dtz_Node.ln_Name = strdup(af[i].af_Attr.ta_Name);
+						found++;
+						printf("Added %s\n", af[i].af_Attr.ta_Name);
+					}
+				}
 			}
 			af++;
 		}
@@ -119,6 +156,7 @@
 	} else {
 		return 0;
 	}
+	return found;
 }
 
 /**
@@ -132,10 +170,43 @@
 {
 	ULONG found = 0;
 	BPTR fh = 0;
+	lwc_error lerror;
+	char buffer[256];
+	struct RDArgs *rargs = NULL;
+	STRPTR template = "CODE/A,FONT/A";
+	long rarray[] = {0,0};
+
+	enum {
+		A_CODE = 0,
+		A_FONT
+	};
+
+	rargs = AllocDosObjectTags(DOS_RDARGS, TAG_DONE);
 
 	if(fh = FOpen(filename, MODE_OLDFILE, 0)) {
 		printf("Reading %s\n", filename);
-		/* TODO: read lines using ReadArgs() */
+
+		while(FGets(fh, (UBYTE *)&buffer, 256) != 0)
+		{
+			rargs->RDA_Source.CS_Buffer = (char *)&buffer;
+			rargs->RDA_Source.CS_Length = 256;
+			rargs->RDA_Source.CS_CurChr = 0;
+
+			rargs->RDA_DAList = NULL;
+			rargs->RDA_Buffer = NULL;
+			rargs->RDA_BufSiz = 0;
+			rargs->RDA_ExtHelp = NULL;
+			rargs->RDA_Flags = 0;
+
+			if(ReadArgs(template, rarray, rargs))
+			{
+				lerror = lwc_intern_string((const char *)rarray[A_FONT],
+							strlen((const char *)rarray[A_FONT]),
+							&glypharray[strtoul(rarray[A_CODE], NULL, 0)]);
+				if(lerror != lwc_error_ok) continue;
+				found++;
+			}
+		}
 		FClose(fh);
 	}
 
@@ -162,7 +233,7 @@
 		for(i=0x0000; i<=0xffff; i++)
 		{
 			if(glypharray[i]) {
-				FPrintf(fh, "%04lx \"%s\"\n", i, lwc_string_data(glypharray[i]));
+				FPrintf(fh, "0x%04lx \"%s\"\n", i, lwc_string_data(glypharray[i]));
 				lwc_string_unref(glypharray[i]);
 			}
 		}
@@ -195,9 +266,9 @@
  * \param  filename       cache file to attempt to read
  * \param  glypharray     an array of 0xffff lwc_string pointers
  */
-void ami_font_scan_init(const char *filename, lwc_string **glypharray)
-{
-	ULONG i, found;
+void ami_font_scan_init(const char *filename, struct MinList *list, lwc_string **glypharray)
+{
+	ULONG i, found, ffound;
 
 	/* Ensure array zeroed */
 	for(i=0x0000; i<=0xffff; i++)
@@ -206,7 +277,9 @@
 	found = ami_font_scan_load(filename, glypharray);
 
 	if(found == 0) {
-		found = ami_font_scan_fonts(glypharray);
+		ffound = ami_font_scan_list(list);
+		printf("Found %ld system fonts\n", ffound);
+		found = ami_font_scan_fonts(list, glypharray);
 		ami_font_scan_save(filename, glypharray);
 	}
 
@@ -215,21 +288,30 @@
 
 #ifdef AMI_FONT_SCAN_STANDALONE
 /* This can be compiled as standalone using:
-* gcc -o font_scan font_scan.c -lwapcaplet -lauto -D__USE_INLINE__ -DAMI_FONT_SCAN_STANDALONE
+* gcc -o font_scan font_scan.c object.c -lwapcaplet -lauto -I .. -D__USE_INLINE__ -DAMI_FONT_SCAN_STANDALONE
 */
 int main(int argc, char** argv)
 {
 	lwc_string *glypharray[0xffff + 1];
 	ULONG found = 0;
 	BPTR fh;
+	struct MinList *list;
 
 	if(argc < 2) return 5;
 
 	printf("%s\n",argv[1]);
 
-	ami_font_scan_init(argv[1], glypharray);
+	list = NewObjList();
+
+	ami_font_scan_init(argv[1], list, glypharray);
 	ami_font_scan_fini(glypharray);
 
+	FreeObjList(list);
+
 	return 0;
 }
+
+void ami_font_close(APTR discard) { }
+void ami_mime_entry_free(APTR discard) { }
+
 #endif




More information about the netsurf-commits mailing list