From 978e7c94b292fe148b360cda3c7e5fbd44636892 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 16 Nov 2023 03:24:02 -0800 Subject: [PATCH] Tools: Add SDF-generation tool and 4x font SDF --- CMakeLists.txt | 7 ++ include/mgba-util/gui/font-metrics.h | 5 +- res/font-mask.png | Bin 0 -> 8744 bytes res/font-sdf.png | Bin 0 -> 59791 bytes src/tools/font-sdf.c | 136 +++++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 res/font-mask.png create mode 100644 res/font-sdf.png create mode 100644 src/tools/font-sdf.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 81fdeec3f..b3a07530c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ if(NOT LIBMGBA_ONLY) set(BUILD_GLES2 ON CACHE BOOL "Build with OpenGL|ES 2") set(BUILD_GLES3 ON CACHE BOOL "Build with OpenGL|ES 3") set(BUILD_DOCGEN OFF CACHE BOOL "Build the scripting API documentation generator") + set(BUILD_MAINTAINER_TOOLS OFF CACHE BOOL "Build tools only useful for maintainers") set(USE_EPOXY ON CACHE STRING "Build with libepoxy") set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies") set(DISTBUILD OFF CACHE BOOL "Build distribution packages") @@ -93,6 +94,7 @@ if(NOT LIBMGBA_ONLY) mark_as_advanced(WIN32_UNIX_PATHS) endif() mark_as_advanced(BUILD_DOCGEN) + mark_as_advanced(BUILD_MAINTAINER_TOOLS) else() set(DISABLE_FRONTENDS ON) set(DISABLE_DEPS ON) @@ -1045,6 +1047,11 @@ if(ENABLE_SCRIPTING AND BUILD_DOCGEN) target_link_libraries(docgen ${OS_LIB} ${PLATFORM_LIBRARY} ${BINARY_NAME}) endif() +if(BUILD_MAINTAINER_TOOLS) + add_executable(font-sdf-tool ${CMAKE_CURRENT_SOURCE_DIR}/src/tools/font-sdf.c ${CMAKE_CURRENT_SOURCE_DIR}/src/util/gui/font-metrics.c) + target_link_libraries(font-sdf-tool ${OS_LIB} ${PLATFORM_LIBRARY} ${BINARY_NAME}) +endif() + if(BUILD_SDL) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/sdl ${CMAKE_CURRENT_BINARY_DIR}/sdl) endif() diff --git a/include/mgba-util/gui/font-metrics.h b/include/mgba-util/gui/font-metrics.h index c60d6dfc8..c2e6668d4 100644 --- a/include/mgba-util/gui/font-metrics.h +++ b/include/mgba-util/gui/font-metrics.h @@ -6,9 +6,10 @@ #ifndef DEFAULT_FONT_METRICS_H #define DEFAULT_FONT_METRICS_H +#include #include -extern struct GUIFontGlyphMetric defaultFontMetrics[]; -extern struct GUIIconMetric defaultIconMetrics[]; +extern const struct GUIFontGlyphMetric defaultFontMetrics[128]; +extern const struct GUIIconMetric defaultIconMetrics[GUI_ICON_MAX]; #endif diff --git a/res/font-mask.png b/res/font-mask.png new file mode 100644 index 0000000000000000000000000000000000000000..2e223597b52671f0fd9c11b6804889bf3a03dd3d GIT binary patch literal 8744 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 Z#Cs|ij7wY6SJJHNUkD7v=0sug5ps#HX0F3Y_ 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

t`@D!=nY&VV^=NWY`{i*`N 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 literal 0 HcmV?d00001 diff --git a/src/tools/font-sdf.c b/src/tools/font-sdf.c new file mode 100644 index 000000000..e28c34eaf --- /dev/null +++ b/src/tools/font-sdf.c @@ -0,0 +1,136 @@ +/* Copyright (c) 2013-2023 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include +#include +#include + +void createSdf(const struct mImage* src, struct mImage* dst, int x, int y, int w, int h) { + int i, j, ii, jj, z; + + static const int kernel[] = { + 11, 9, 8, 9, 11, + 9, 6, 4, 6, 9, + 8, 4, 0, 4, 8, + 9, 6, 4, 6, 9, + 11, 9, 8, 9, 11, + }; + const int* kc = &kernel[12]; + + for (j = y; j < y + h; ++j) { + for (i = x; i < x + w; ++i) { + if (mImageGetPixel(src, i, j) & 0xFFFFFF) { + mImageSetPixelRaw(dst, i, j, 0xFF); + } else { + mImageSetPixelRaw(dst, i, j, 1); + } + } + } + + for (z = 0; z < 16; ++z) { + int left = w * h; + for (j = y; j < y + h; ++j) { + for (i = x; i < x + w; ++i) { + int raw = mImageGetPixelRaw(dst, i, j) - 0x80; + int neighbors = raw; + for (jj = -2; jj < 3; ++jj) { + for (ii = -2; ii < 3; ++ii) { + if (!ii && !jj) { + continue; + } + if (i + ii - x < 0 || j + jj - y < 0) { + continue; + } + if (i + ii - x >= w || j + jj - y >= h) { + continue; + } + int neighbor = mImageGetPixelRaw(dst, i + ii, j + jj) - 0x80; + if (raw > 0) { + if (neighbor < 0) { + if ((!ii && (jj == -1 || jj == 1)) || (!jj && (ii == -1 || ii == 1))) { + neighbors = 1; + jj = 5; + break; + } + continue; + } + if (neighbor == 0x7F) { + continue; + } + if (neighbor + kc[ii + jj * 5] < neighbors) { + neighbors = neighbor + kc[ii + jj * 5]; + } + } else if (raw < 0) { + if (neighbor > 0) { + if ((!ii && (jj == -1 || jj == 1)) || (!jj && (ii == -1 || ii == 1))) { + neighbors = -4; + jj = 5; + break; + } + continue; + } + if (neighbor == -0x7F) { + continue; + } + if (neighbor - kc[ii + jj * 5] > neighbors) { + neighbors = neighbor - kc[ii + jj * 5]; + } + } + } + } + if (neighbors == raw) { + --left; + } else { + mImageSetPixelRaw(dst, i, j, neighbors + 0x80); + } + if (!left) { + break; + } + } + if (!left) { + break; + } + } + if (!left) { + break; + } + } +} + +int main(int argc, char* argv[]) { + struct mImage* source; + struct mImage* output; + + if (argc != 3) { + return 1; + } + source = mImageLoad(argv[1]); + if (!source) { + return 2; + } + output = mImageCreate(source->width, source->height, mCOLOR_L8); + if (!output) { + return 3; + } + + int i; + for (i = 0; i < 128; ++i) { + createSdf(source, output, (i & 0xF) << 6, (i & ~0xF) << 2, 64, 64); + } + for (i = 0; i < GUI_ICON_MAX; ++i) { + struct GUIIconMetric metric = defaultIconMetrics[i]; + metric.width += metric.x & 0xF; + metric.height += metric.y & 0xF; + metric.x &= ~0xF; + metric.y &= ~0xF; + createSdf(source, output, metric.x * 4, metric.y * 4 + 512, toPow2(metric.width) * 4, toPow2(metric.height) * 4); + } + if (!mImageSave(output, argv[2], NULL)) { + return 4; + } + mImageDestroy(source); + mImageDestroy(output); + return 0; +}