summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-05-13 23:22:18 (GMT)
committer John Mark Bell <jmb@netsurf-browser.org>2009-05-13 23:22:18 (GMT)
commitdf3a5a0cbc20de6358ab382b17afac1941cc8096 (patch)
treef1fa1600f2cf5cd6ec4cf3d77ea85ed001825d07
parent0fa38fefaf203f99f52eefa6d9c3c0e61f18d6e2 (diff)
downloadttf2f-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.c116
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;