diff --git a/.gitmodules b/.gitmodules index 457a0be6..262501a5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "tools/font8x8"] - path = tools/font8x8 - url = https://github.com/dhepper/font8x8 [submodule "tools/8x8fonts/font8x8"] path = tools/8x8fonts/font8x8 url = https://github.com/dhepper/font8x8 diff --git a/tools/8x8fonts/.gitignore b/tools/8x8fonts/.gitignore new file mode 100644 index 00000000..64a2ee78 --- /dev/null +++ b/tools/8x8fonts/.gitignore @@ -0,0 +1,2 @@ +*.o +generate_png_fonts diff --git a/tools/8x8fonts/Makefile b/tools/8x8fonts/Makefile new file mode 100644 index 00000000..dbc1d470 --- /dev/null +++ b/tools/8x8fonts/Makefile @@ -0,0 +1,43 @@ +# There is no uname under windows, but we can guess we are there with the COMSPEC env.var +# Windows specific +ifdef ComSpec +# sometimes, it is ComSpec, sometimes it is COMSPEC +COMSPEC = $(ComSpec) +endif +ifdef COMSPEC +WIN32 = 1 +endif + +PKG_CONFIG = $(shell which pkg-config) +MKDIR = mkdir -p + +ifeq ($(WIN32),1) +PKG_CONFIG := PKG_CONFIG_PATH=../../3rdparty/usr-win32/lib/pkgconfig $(PKG_CONFIG) +endif + +CFLAGS = -Wall +CFLAGS += $(shell $(PKG_CONFIG) --cflags libpng) +LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libpng) +LDLIBS += $(shell $(PKG_CONFIG) --libs-only-l libpng) + +FONTDIR = ../../share/grafx2/skins/ +FONTFILES = unicode_0390-03C9.png unicode_3040-309F.png +FONTPATHS = $(addprefix $(FONTDIR), $(FONTFILES)) + +BINDIR = ../../bin +BIN = $(BINDIR)/generate_png_fonts + +.PHONY: all clean + +all: $(FONTPATHS) + +clean: + $(RM) *.o $(BIN) + $(RM) $(FONTPATHS) + +$(BIN): generate_png_fonts.o + $(MKDIR) $(BINDIR) + $(CC) $(LDFLAGS) -o $@ $^ $(LOADLIBES) $(LDLIBS) + +$(FONTPATHS): $(BIN) + $(BIN) $(FONTDIR) diff --git a/tools/8x8fonts/generate_png_fonts.c b/tools/8x8fonts/generate_png_fonts.c new file mode 100644 index 00000000..9caad906 --- /dev/null +++ b/tools/8x8fonts/generate_png_fonts.c @@ -0,0 +1,142 @@ +/* vim:expandtab:ts=2 sw=2: +*/ +/* Grafx2 - The Ultimate 256-color bitmap paint program + + Copyright 2019 Thomas Bernard + + Grafx2 is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; version 2 + of the License. + + Grafx2 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grafx2; if not, see +*/ + +#include +#include +#include + +#include +#include + +#include "font8x8/font8x8_greek.h" +#include "font8x8/font8x8_hiragana.h" + +#define GENERATE_PNG(font, start) generate_png_font(directory, (const char *)font, start, sizeof(font) / 8) + +int generate_png_font(const char * directory, const char * font, unsigned int start, size_t count) +{ + char filename[256]; + FILE * fp; + png_structp png; + png_infop info; + unsigned int width = 256; // 32 chars + unsigned int height; + unsigned int end = start + count - 1; + unsigned char * pixels; + unsigned int c, l, b, x, y; + png_color palette[2] = { { 0, 0, 192}, {255, 255, 255} }; + + snprintf(filename, sizeof(filename), "%sunicode_%04X-%04X.png", + directory, start, end); + printf("writing %s\n", filename); + height = 8 * ((count + 31) >> 5); + printf(" size : %dx%d\n", width, height); + pixels = malloc(width * height); + if (pixels == NULL) + { + fprintf(stderr, "Failed to allocate %d bytes\n", width * height); + return -1; + } + memset(pixels, 0, width * height); + + // generate the bitmap + for (c = 0; c < count; c++) + { + x = (c & 31) << 3; + y = (c >> 5) << 3; + for (l = 0; l < 8; l++) + { + int data = font[8*c + l]; + for (b = 0; b < 8; b++) + { + if (data & 1) + pixels[((y + l) << 8) + x + b] = 1; + data >>= 1; + } + } + } + + // write to file + fp = fopen(filename, "wb"); + if (fp == NULL) + { + free(pixels); + return -1; + } + png = png_create_write_struct(PNG_LIBPNG_VER_STRING, + (png_voidp)NULL/*user_error_ptr*/, + /*user_error_fn*/NULL, /*user_warning_fn*/NULL); + if (png == NULL) + { + return -1; + } + info = png_create_info_struct(png); + if (info == NULL) + { + png_destroy_write_struct(&png, NULL); + return -1; + } + if (setjmp(png_jmpbuf(png))) + { + png_destroy_write_struct(&png, &info); + fclose(fp); + free(pixels); + return -1; + } + png_init_io(png, fp); + /* Set the zlib compression level */ + png_set_compression_level(png, Z_BEST_COMPRESSION); + /* Set PNG header */ + png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_PALETTE, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + /* Set palette */ + png_set_PLTE(png, info, palette, 2); + + png_write_info(png, info); + for (y = 0; y < height; y++) + png_write_row(png, pixels + (y << 8)); + png_write_end(png, info); + //png_write_flush(png); + + png_destroy_write_struct(&png, &info); + fclose(fp); + free(pixels); + return 0; +} + +int main(int argc, char * * argv) +{ + const char * directory = "./"; + int r; + + printf("GrafX2 unicode font generator\n"); + if (argc > 1) + directory = argv[1]; + + r = GENERATE_PNG(font8x8_greek, 0x0390); + if (r != 0) + return r; + r = GENERATE_PNG(font8x8_hiragana, 0x3040); + if (r != 0) + return r; + + return 0; +}