diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-05-13 23:22:18 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-05-13 23:22:18 +0000 |
commit | df3a5a0cbc20de6358ab382b17afac1941cc8096 (patch) | |
tree | f1fa1600f2cf5cd6ec4cf3d77ea85ed001825d07 | |
parent | 0fa38fefaf203f99f52eefa6d9c3c0e61f18d6e2 (diff) | |
download | ttf2f-df3a5a0cbc20de6358ab382b17afac1941cc8096.tar.gz ttf2f-df3a5a0cbc20de6358ab382b17afac1941cc8096.tar.bz2 |
Convert font into temporary directory, then copy it into the destination font resource.
Ensure that any MessagesNN file within the destination font resource is synchronised with the converted font.
svn path=/trunk/tools/ttf2f/; revision=7508
-rw-r--r-- | src/toolbox.c | 116 |
1 files changed, 106 insertions, 10 deletions
diff --git a/src/toolbox.c b/src/toolbox.c index 27fedef..5038237 100644 --- a/src/toolbox.c +++ b/src/toolbox.c @@ -3,10 +3,13 @@ #include <stdlib.h> #include <ctype.h> #include <time.h> -#include <unixlib/local.h> + +#include <sys/stat.h> #include <oslib/displayfield.h> #include <oslib/osfile.h> +#include <oslib/osfscontrol.h> +#include <oslib/osgbpb.h> #include <oslib/quit.h> #include <oslib/slider.h> #include <oslib/stringset.h> @@ -169,6 +172,9 @@ void ttf2f_init(int argc, char **argv) *(b++) = ','; } } + /* Strip trailing spaces */ + while (b > buf && *(b - 1) == ' ') + b--; *b = '\0'; error = xstringset_set_available(0, main_window, 7, buf); @@ -329,9 +335,13 @@ osbool convert_font(bits event_code, toolbox_action *event, toolbox_block *id_block, void *handle) { os_error *error, erblock = { 123456, "Invalid Parameters" }; - char ifilename[256], ofilename[256], save_in[1024]; - char *dot, *save; - int fail; + struct stat stat_buf; + char ifilename[256], ofilename[256], save_in[768], temp[256]; + char *dot, *save, *t; + char *end_of_dest_dir = NULL; + char *end_of_dest_family = NULL; + char *end_of_temp_family = NULL; + int fail, context = 0; ttf2f_ctx ctx; ttf2f_result res; @@ -378,12 +388,30 @@ osbool convert_font(bits event_code, toolbox_action *event, } /* create output directories */ + error = xosfile_create_dir("<Wimp$ScrapDir>.TTF2f", 0); + if (error) { + fprintf(stderr, "os_file: 0x%x: %s\n", + error->errnum, error->errmess); + wimp_report_error(error, 0x5, "TTF2f"); + converting = 0; + return TRUE; + } + + strcpy(temp, "<Wimp$ScrapDir>.TTF2f."); + t = temp + strlen(temp); save = save_in + strlen(save_in); + /* Record end of target directory (-1 to strip trailing dot) */ + end_of_dest_dir = save - 1; for (dot = ofilename; *dot != '\0'; dot++) { if (*dot == '.') { - (*save) = '\0'; - error = xosfile_create_dir(save_in, 0); + if (end_of_dest_family == NULL) { + end_of_dest_family = save; + end_of_temp_family = t; + } + + (*t) = '\0'; + error = xosfile_create_dir(temp, 0); if (error) { fprintf(stderr, "os_file: 0x%x: %s\n", error->errnum, error->errmess); @@ -394,10 +422,17 @@ osbool convert_font(bits event_code, toolbox_action *event, } *(save++) = *dot; + *(t++) = *dot; } *save = '\0'; + *t = '\0'; + + if (end_of_dest_family == NULL) { + end_of_dest_family = save; + end_of_temp_family = t; + } - error = xosfile_create_dir(save_in, 0); + error = xosfile_create_dir(temp, 0); if (error) { fprintf(stderr, "os_file: 0x%x: %s\n", error->errnum, error->errmess); @@ -406,6 +441,14 @@ osbool convert_font(bits event_code, toolbox_action *event, return TRUE; } + if (stat(save_in, &stat_buf) == 0) { + snprintf(erblock.errmess, 252, "Font '%s' already exists", + ofilename); + wimp_report_error(&erblock, 0x5, "TTF2f"); + converting = 0; + return TRUE; + } + ctx.face = open_font(ifilename); if (ctx.face == NULL) { snprintf(erblock.errmess, 252, "Unknown font format"); @@ -503,7 +546,7 @@ osbool convert_font(bits event_code, toolbox_action *event, slider_set_colour(0, main_window, 8, 11, 13); /* write intmetrics file */ - res = intmetrics_write(save_in, ofilename, &ctx, progress_bar); + res = intmetrics_write(temp, ofilename, &ctx, progress_bar); if (res != TTF2F_RESULT_OK) { free(ctx.metrics->name_copyright); free(ctx.metrics->name_full); @@ -523,7 +566,7 @@ osbool convert_font(bits event_code, toolbox_action *event, slider_set_colour(0, main_window, 8, 8, 11); /* write outlines file */ - res = outlines_write(save_in, ofilename, &ctx, progress_bar); + res = outlines_write(temp, ofilename, &ctx, progress_bar); if (res != TTF2F_RESULT_OK) { free(ctx.metrics->name_copyright); free(ctx.metrics->name_full); @@ -543,7 +586,7 @@ osbool convert_font(bits event_code, toolbox_action *event, slider_set_colour(0, main_window, 8, 10, 8); /* write encoding file */ - res = encoding_write(save_in, ofilename, &ctx, + res = encoding_write(temp, ofilename, &ctx, ENCODING_TYPE_NORMAL, progress_bar); if (res != TTF2F_RESULT_OK) { free(ctx.metrics->name_copyright); @@ -573,6 +616,59 @@ osbool convert_font(bits event_code, toolbox_action *event, close_font(ctx.face); + /* Truncate source and destination paths to font family names */ + *end_of_temp_family = '\0'; + *end_of_dest_family = '\0'; + + /* Merge into target -- we know it doesn't already exist, + * as we checked before attempting to convert */ + error = xosfscontrol_copy(temp, save_in, + osfscontrol_COPY_RECURSE | osfscontrol_COPY_DELETE, + 0, 0, 0, 0, NULL); + if (error) { + wimp_report_error(error, 0x5, "TTF2f"); + converting = 0; + return TRUE; + } + + /* Truncate back to destination directory name */ + *end_of_dest_dir = '\0'; + + /* Finally, synchronise any MessagesN files */ + while (context != -1) { + osgbpb_INFO(100) info; + int count; + + error = xosgbpb_dir_entries_info(save_in, + (osgbpb_info_list *) &info, + 1, context, sizeof(info), "Messages*", + &count, &context); + if (error) { + wimp_report_error(error, 0x5, "TTF2f"); + converting = 0; + return TRUE; + } + + /* Process file */ + if (count != 0 && info.obj_type == fileswitch_IS_FILE) { + FILE *fp; + + *end_of_dest_dir = '.'; + memcpy(end_of_dest_dir + 1, info.name, + strlen(info.name) + 1); + + fp = fopen(save_in, "a+"); + if (fp != NULL) { + /* We only ever produce symbol fonts */ + fprintf(fp, "Font_%s:*\n", ofilename); + + fclose(fp); + } + + *end_of_dest_dir = '\0'; + } + } + converting = 0; return TRUE; |