int main(int argc, char *argv[]) { char *input_filename=NULL; char *output_filename=NULL; BITMAP *bmp=NULL; unsigned char *output_buffer=NULL; FILE *fp; int i; STARTUPINFO si; PROCESS_INFORMATION pi; char path[MAX_PATH]; char args[MAX_PATH * 3]; char temp[MAX_PATH], temp2[MAX_PATH]; RGB pal[256]; char xml_filename[MAX_PATH], png_filename[MAX_PATH]; char *p; font_struct font; char *bmfontgen_filename="BMFontGen.exe"; memset(&font, 0, sizeof(font)); if (argc < 4) { printf ("fontgen [options] [filename].txt -o [filename].bin\n"); goto error; } for (i = 1; i < argc;) { if (strcmp(argv[i], "-2") == 0) { round_up_width = TRUE; i++; } else if (strcmp(argv[i], "-b") == 0) { bmfontgen_filename = argv[i+1]; fix_path(bmfontgen_filename); i += 2; } else if (strcmp (argv[i], "-o") == 0) { output_filename = argv[i+1]; fix_path(output_filename); i += 2; } else { input_filename = argv[i]; fix_path(input_filename); i++; } } if (input_filename == NULL) { printf ("no input filename specified\n"); exit (1); } if (output_filename == NULL) { printf ("no output filename specified\n"); exit (1); } convert_slash(input_filename); convert_slash(output_filename); // Execute BMFontGen GetCurrentDirectoryA(sizeof(temp), temp); if (!PathRelativePathToA(temp2, temp, FILE_ATTRIBUTE_DIRECTORY, bmfontgen_filename, FILE_ATTRIBUTE_NORMAL)) strcpy_s(temp2, sizeof(temp2), bmfontgen_filename); sprintf_s(args, sizeof(args), "%s -optfile ", temp2); if (!PathRelativePathToA(temp2, temp, FILE_ATTRIBUTE_DIRECTORY, input_filename, FILE_ATTRIBUTE_NORMAL)) strcpy_s(temp2, sizeof(temp2), input_filename); strcat_s(args, sizeof(args), temp2); strcpy_s(path, sizeof(path), temp2); if ((p = strrchr(path, '\\')) != NULL) p[1] = '\0'; strcat_s(args, sizeof(args), " -output "); strcat_s(args, sizeof(args), path); strcat_s(args, sizeof(args), "font"); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.wShowWindow = SW_HIDE; si.dwFlags = 0; printf("%s\n", args); if (CreateProcessA(NULL, args, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi) == 0) { LPVOID lpMsgBuf; DWORD err=GetLastError(); FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL); printf("Error executing BMFontGen: %s\n", lpMsgBuf); LocalFree(lpMsgBuf); exit(1); } printf("Creating font..."); WaitForSingleObject(pi.hProcess, INFINITE); printf("done\n"); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); // Load XML file strcpy_s(xml_filename, sizeof(xml_filename), path); strcat_s(xml_filename, sizeof(xml_filename), "font.xml"); read_font_xml(xml_filename, &font); // Start going through XML and copying font to our 12x12 1BPP buffer allegro_init(); loadpng_init(); set_color_depth(8); if (strrchr(font.bitmaps[0].filename, '\\') == NULL) { strcpy_s(png_filename, sizeof(png_filename), input_filename); p = strrchr(png_filename, '\\'); strcpy_s(p+1, sizeof(png_filename)-((p+1)-png_filename), font.bitmaps[0].filename); } else strcpy_s(png_filename, sizeof(png_filename), font.bitmaps[0].filename); if ((bmp = load_bitmap(png_filename, pal)) == NULL) { printf("Error loading generated png file\n"); exit(1); } output_buffer = malloc(12 * 12 / 8 * 1024); if (output_buffer == NULL) { printf("Error allocating buffer\n"); exit(1); } memset(output_buffer, 0, 12 * 12 / 8 * 1024); // Copy glyphs to raw buffer for (i = 0; i < font.num_glyphs; i++) copy_glyph(&font.glyphs[i], bmp, output_buffer); // Write final output if (fopen_s(&fp, output_filename, "wb") != 0) { printf("Error writing output\n"); goto error; } fwrite((void *)output_buffer, 1, 12 * 12 / 8 * 1024, fp); fclose(fp); error: if (bmp) destroy_bitmap(bmp); if (font.bitmaps) free(font.bitmaps); if (font.glyphs) free(font.glyphs); //printf ( "Press any key to continue..." ); //getch(); return 0; }
char *catcierge_relative_path(const char *pfrom, const char *pto) { char pout[1024]; int is_from_dir = 0; int is_to_dir = 0; char last_from_char = 0; char last_to_char = 0; if (!pfrom) return NULL; if (!pto) return NULL; last_from_char = pfrom[strlen(pfrom) - 1]; last_to_char = pto[strlen(pto) - 1]; // If we got a trailing slash we consider the path // a directory. This is required for the windows version. if ((last_to_char == '/') || (last_to_char == '\\')) { is_to_dir = 1; } if ((last_from_char == '/') || (last_from_char == '\\')) { is_from_dir = 1; } #ifdef _WIN32 if (!PathRelativePathToA(pout, pfrom, is_from_dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL, pto, is_to_dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL)) { return NULL; } // TODO: Make sure paths are returned wiht a / on windows return strdup(pout); #else // Unix { // Remove common first part of path. const char *f = pfrom; const char *t = pto; // Relative to. int i; size_t prefix_len; char dst[4096] = {0}; // Special case :) if (!strcmp(pfrom, "/") && !strcmp(pto, "/")) return strdup("/"); prefix_len = catcierge_path_common_prefix(f, t); f += prefix_len; t += prefix_len; if (*t == '/') t++; if (*f == '/') f++; i = 0; while ((f = catcierge_path_find_next_component(f)) != NULL) { i++; // If we are calculating relative from a file path // remove the file first, or it will be counted as a dir. if ((i == 1) && !is_from_dir) { continue; } strcat(dst, "../"); } strcat(dst, t); return strdup(dst); } return NULL; #endif }