From e90e01cd49c2ef320580bb838cedec3430f55116 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Fri, 9 Apr 2004 21:06:10 +0000 Subject: [PATCH] [project @ 2004-04-09 21:06:10 by bursa] Add FixFonts to attempt to fix common font problem. svn path=/import/netsurf/; revision=741 --- !NetSurf/FixFonts,ffb | 147 +++++++++++++++++++++++++++++++++ !NetSurf/Resources/en/Messages | 2 + !NetSurf/Resources/fr/Messages | 2 + riscos/gui.c | 87 ++++++++++++++----- 4 files changed, 218 insertions(+), 20 deletions(-) create mode 100644 !NetSurf/FixFonts,ffb diff --git a/!NetSurf/FixFonts,ffb b/!NetSurf/FixFonts,ffb new file mode 100644 index 000000000..c6b73d0b0 --- /dev/null +++ b/!NetSurf/FixFonts,ffb @@ -0,0 +1,147 @@ +REM Attempt to fix broken font installations which have non-Base0 copies of the +REM ROM fonts in !Fonts on disc. + +ON ERROR ON ERROR OFF: PRINT REPORT$ + " (at line " + STR$ERL + ")": END + +DIM f$(11) +f$() = "Corpus.Bold","Corpus.Bold.Oblique","Corpus.Medium","Corpus.Medium.Oblique","Homerton.Bold","Homerton.Bold.Oblique","Homerton.Medium","Homerton.Medium.Oblique","Trinity.Bold","Trinity.Bold.Italic","Trinity.Medium","Trinity.Medium.Italic" + +PRINT "FONT INSTALLATION FIX" +PRINT + +PRINT "Checking ROM fonts" +PRINT +ok% = TRUE +FOR f% = 0 TO 11 + PROCcheck_rom_font(f$(f%)) +NEXT +PRINT +IF NOT ok% THEN + PRINT "One or more of the standard ROM fonts are missing!" + PRINT "Please contact the developers stating your RISC OS version." + END +ENDIF + + +PRINT "Searching for obsolete copies in Boot:Resources.!Fonts" +PRINT +ok% = TRUE +FOR f% = 0 TO 11 + PROCcheck_disc_font(f$(f%)) +NEXT +PRINT +IF ok% THEN + PRINT "No problems were found." + END +ENDIF + +PRINT "One or more obsolete fonts were found in !Fonts." +PRINT +PRINT "Press Y to move these fonts to a new directory" +PRINT "called 'ObsolFonts' and remove them from the" +PRINT "font list ('Messages1')," +PRINT "or any other key to exit without changes." +key$ = GET$ +IF INSTR("Yy", key$) = 0 THEN + PRINT + PRINT "Exiting without changes." + END +ENDIF +PRINT + +PRINT "Creating 'ObsolFonts' directory - "; +SYS"OS_File", 8, ".^.ObsolFonts" +PRINT "done" +PRINT +PRINT "Closing open files - "; +SYS"OS_FSControl", 22 +PRINT "done" +PRINT +PRINT "Removing fonts from font list - "; +file% = OPENIN ".Resources.!Fonts.Messages1" +IF file% THEN + new% = OPENOUT ".Resources.!Fonts.Messages_" + IF new% = 0 THEN + PRINT "Failed to open new font list" + END + ENDIF + WHILE NOT EOF#file% + line$ = GET$#file% + ok% = TRUE + FOR f% = 0 TO 11 + IF INSTR(line$, "Font_" + f$(f%) + ":") <> 0 THEN ok% = FALSE + NEXT + IF ok% THEN + BPUT#new%, line$ + ENDIF + ENDWHILE + CLOSE#file% + CLOSE#new% + SYS"OS_File", 18, ".Resources.!Fonts.Messages_", &fff + SYS"XOS_FSControl", 27, ".^.ObsolFonts.Messages1" + SYS"OS_FSControl", 25, ".Resources.!Fonts.Messages1", ".^.ObsolFonts.Messages1" + SYS"OS_FSControl", 25, ".Resources.!Fonts.Messages_", ".Resources.!Fonts.Messages1" +ENDIF +PRINT "done" +PRINT +PRINT "Moving away obsolete fonts" +PRINT +FOR f% = 0 TO 11 + PROCfix_font(f$(f%)) +NEXT +PRINT +PRINT "Finished" +PRINT "Please restart your machine for the changes to take effect." + +END + + + +DEF PROCcheck_rom_font(f$) +PRINT " "; f$; +SYS"OS_File", 17, "Resources:$.Fonts." + f$ + ".Outlines0" TO t1% +SYS"OS_File", 17, "Resources:$.Fonts." + f$ + ".IntMetric0" TO t2% +IF t1% = 1 AND t2% = 1 THEN + PRINT " - ok" +ELSE + PRINT " - MISSING" + ok% = FALSE +ENDIF +ENDPROC + + + +DEF PROCcheck_disc_font(f$) +SYS"OS_File", 17, ".Resources.!Fonts." + f$ + ".Outlines" TO t% +IF t% <> 0 THEN + PRINT " "; f$ + ok% = FALSE +ENDIF +ENDPROC + + + +DEF PROCfix_font(f$) +SYS"OS_File", 17, ".Resources.!Fonts." + f$ + ".Outlines" TO t% +IF t% = 0 THEN ENDPROC + +PRINT " "; f$; " - "; +i% = 0 +REPEAT + i% = INSTR(f$, ".", i% + 1) + IF i% <> 0 THEN + SYS"OS_File", 8, ".^.ObsolFonts." + LEFT$(f$, i% - 1) + ENDIF +UNTIL i% = 0 +SYS"OS_File", 8, ".^.ObsolFonts." + f$ + +SYS"OS_FSControl", 25, ".Resources.!Fonts." + f$ + ".Outlines", ".^.ObsolFonts." + f$ + ".Outlines" + +SYS"OS_File", 17, ".Resources.!Fonts." + f$ + ".IntMetrics" TO t% +IF t% <> 0 THEN + SYS"OS_FSControl", 25, ".Resources.!Fonts." + f$ + ".IntMetrics", ".^.ObsolFonts." + f$ + ".IntMetrics" +ENDIF + +PRINT "done" +ENDPROC + diff --git a/!NetSurf/Resources/en/Messages b/!NetSurf/Resources/en/Messages index 0cec9c379..05bb8f9c7 100644 --- a/!NetSurf/Resources/en/Messages +++ b/!NetSurf/Resources/en/Messages @@ -49,6 +49,8 @@ ErrorPage:%s could not be understood. NoMemory:NetSurf is running out of memory. Please free some memory and try again. +FontBadInst:An error occurred when initialising fonts due to the presence of obsolete copies of the ROM fonts on disc. NetSurf will exit and launch a program which will attempt to fix this. +FontError:Failed to open font "Homerton.Medium" (%s). Loading:Opening page... RecPercent:Received %lu of %lu bytes (%u%%) diff --git a/!NetSurf/Resources/fr/Messages b/!NetSurf/Resources/fr/Messages index 7d04cf931..3536bb234 100644 --- a/!NetSurf/Resources/fr/Messages +++ b/!NetSurf/Resources/fr/Messages @@ -49,6 +49,8 @@ ErrorPage:%s est incomprise. NoMemory:NetSurf a besoin de plus de mémoire. Veuillez libérer de la mémoire et réessayer. +FontBadInst:An error occurred when initialising fonts due to the presence of obsolete copies of the ROM fonts on disc. NetSurf will exit and launch a program which will attempt to fix this. +FontError:Failed to open font "Homerton.Medium" (%s). Loading:Ouverture de la page... RecPercent:%lu reçus de %lu octès (%u%%) diff --git a/riscos/gui.c b/riscos/gui.c index 169e81bf0..0a4b534d5 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -15,6 +15,7 @@ #include #include #include +#include "oslib/font.h" #include "oslib/hourglass.h" #include "oslib/inetsuite.h" #include "oslib/os.h" @@ -111,7 +112,8 @@ struct ro_gui_poll_block *ro_gui_poll_queued_blocks = 0; static void ro_gui_choose_language(void); -static void ro_gui_pointers_init(const char *filename); +static void ro_gui_check_fonts(void); +static void ro_gui_pointers_init(void); static void ro_gui_icon_bar_create(void); static void ro_gui_handle_event(wimp_event_no event, wimp_block *block); static void ro_gui_poll_queue(wimp_event_no event, wimp_block* block); @@ -143,20 +145,15 @@ void gui_init(int argc, char** argv) xhourglass_start(1); - LOG(("reading choices")); options_read("Choices:WWW.NetSurf.Choices"); - LOG(("choosing language")); ro_gui_choose_language(); NETSURF_DIR = getenv("NetSurf$Dir"); sprintf(path, ".Resources.%s.Messages", option_language); - LOG(("Loading messages from '%s'", path)); messages_load(path); messages_load(".Resources.LangNames"); - LOG(("done")); - error = xwimp_initialise(wimp_VERSION_RO38, "NetSurf", (wimp_message_list*) &task_messages, 0, &task_handle); @@ -166,6 +163,8 @@ void gui_init(int argc, char** argv) exit(EXIT_FAILURE); } + ro_gui_check_fonts(); + /* Issue a *Desktop to poke AcornURI into life */ if (getenv("NetSurf$Start_URI_Handler")) xwimp_start_task("Desktop", 0); @@ -199,7 +198,7 @@ void gui_init(int argc, char** argv) #endif ro_gui_history_init(); wimp_close_template(); - ro_gui_pointers_init(".Resources.Pointers"); + ro_gui_pointers_init(); ro_gui_icon_bar_create(); } @@ -258,21 +257,64 @@ void ro_gui_choose_language(void) option_accept_language = strdup(option_language); } + /** - * Initialise pointer sprite area + * Check that at least Homerton.Medium is available. */ -void ro_gui_pointers_init(const char *filename) + +void ro_gui_check_fonts(void) { - FILE *fp; - unsigned int len; + char s[252]; + font_f font; + os_error *error; + + error = xfont_find_font("Homerton.Medium\\ELatin1", + 160, 160, 0, 0, &font, 0, 0); + if (error) { + if (error->errnum == error_FILE_NOT_FOUND) { + warn_user("FontBadInst"); + xwimp_start_task("TaskWindow -wimpslot 200K -quit " + ".FixFonts", 0); + exit(EXIT_FAILURE); + } else { + snprintf(s, sizeof s, messages_get("FontError"), + error->errmess); + die(s); + } + } + + error = xfont_lose_font(font); + if (error) { + snprintf(s, sizeof s, messages_get("FontError"), + error->errmess); + die(s); + } +} + + +/** + * Initialise pointer sprite area. + */ + +void ro_gui_pointers_init(void) +{ + int len; + fileswitch_object_type obj_type; os_error *e; - fp = fopen(filename, "rb"); - if (!fp) return; - fseek(fp, 0, SEEK_END); - len = ftell(fp); - fclose(fp); - pointers = xcalloc(len+4, sizeof(char)); + e = xosfile_read_stamped_no_path(".Resources.Pointers", + &obj_type, 0, 0, &len, 0, 0); + if (e) { + LOG(("xosfile_read_stamped_no_path: 0x%x: %s", + e->errnum, e->errmess)); + die(e->errmess); + } + if (obj_type != fileswitch_IS_FILE) + die(".Resources.Pointers missing."); + + pointers = malloc(len + 4); + if (!pointers) + die("NoMemory"); pointers->size = len+4; pointers->sprite_count = 0; @@ -280,10 +322,15 @@ void ro_gui_pointers_init(const char *filename) pointers->used = 16; e = xosspriteop_load_sprite_file(osspriteop_USER_AREA, - pointers, filename); - if (e) xfree(pointers); + pointers, ".Resources.Pointers"); + if (e) { + LOG(("xosspriteop_load_sprite_file: 0x%x: %s", + e->errnum, e->errmess)); + die(e->errmess); + } } + /** * Create an iconbar icon. */ @@ -307,7 +354,7 @@ void ro_gui_icon_bar_create(void) void gui_quit(void) { ro_gui_history_quit(); - xfree(pointers); + free(pointers); wimp_close_down(task_handle); xhourglass_off(); }