The chat "Emoji style: Color" option renders the merged emoji in color (COLR/CPAL Twemoji) instead of the monochrome NotoEmoji subset. This needs FreeType, which the default stb_truetype rasterizer can't do for color glyphs. - Vendor imgui_freetype (matches the bundled 1.92 ImFontLoader API) and embed a 1.4 MB COLRv0 Twemoji font (no libpng/harfbuzz needed). - CMake gains an optional FreeType path: native Linux/macOS use the system FreeType via find_package; the mingw-w64 cross-compile has none, so build.sh --win-release now cross-builds a minimal static FreeType (scripts/build-freetype-mingw.sh) and passes it in. Absent FreeType => graceful monochrome fallback, so no build breaks. - Typography selects the FreeType loader + the color font (LoadColor) when color emoji is on, else the stb loader + mono subset; toggling reloads the atlas. Both the DX11 and OpenGL backends already support the 1.92 RGBA dynamic atlas, so color glyphs render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
95 lines
3.7 KiB
Bash
Executable File
95 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Cross-build a MINIMAL static FreeType for the mingw-w64 (Windows) target.
|
|
#
|
|
# Why: the wallet's optional color-emoji rendering needs FreeType (to rasterize the COLR/CPAL Twemoji
|
|
# font). Native Linux/macOS pick up the system FreeType via find_package; the Debian/Ubuntu mingw-w64
|
|
# cross toolchain ships no FreeType, so we build one here. The Twemoji font is COLRv0 (layered vector),
|
|
# which FreeType renders WITHOUT libpng / harfbuzz / brotli / zlib — so this is a dependency-free static
|
|
# build (no external libs to also cross-compile), producing a self-contained libfreetype.a.
|
|
#
|
|
# Output: <prefix>/include/freetype2/... + <prefix>/lib/libfreetype.a (default prefix: third_party/freetype-mingw)
|
|
# build.sh --win-release runs this automatically and passes -DDRAGONX_MINGW_FREETYPE_PREFIX to CMake.
|
|
set -euo pipefail
|
|
|
|
FT_VERSION="2.13.3"
|
|
FT_SHA256="5c3a8e78f7b24c20b25b54ee575d6daa40007a5f4eea2845861c3409b3021747" # freetype-2.13.3.tar.gz
|
|
FT_URL="https://download.savannah.gnu.org/releases/freetype/freetype-${FT_VERSION}.tar.gz"
|
|
FT_URL_MIRROR="https://downloads.sourceforge.net/project/freetype/freetype2/${FT_VERSION}/freetype-${FT_VERSION}.tar.gz"
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
PREFIX="${1:-$SCRIPT_DIR/third_party/freetype-mingw}"
|
|
WORK="$SCRIPT_DIR/third_party/.freetype-mingw-build"
|
|
|
|
# Already built? (libfreetype.a present) → nothing to do.
|
|
if [[ -f "$PREFIX/lib/libfreetype.a" && -d "$PREFIX/include/freetype2" ]]; then
|
|
echo "FreeType (mingw) already built at: $PREFIX"
|
|
exit 0
|
|
fi
|
|
|
|
# Pick the mingw compilers (posix threads variant preferred, matching build.sh).
|
|
if command -v x86_64-w64-mingw32-gcc-posix &>/dev/null; then
|
|
MINGW_GCC=x86_64-w64-mingw32-gcc-posix; MINGW_GXX=x86_64-w64-mingw32-g++-posix
|
|
elif command -v x86_64-w64-mingw32-gcc &>/dev/null; then
|
|
MINGW_GCC=x86_64-w64-mingw32-gcc; MINGW_GXX=x86_64-w64-mingw32-g++
|
|
else
|
|
echo "ERROR: x86_64-w64-mingw32-gcc not found (install mingw-w64)." >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$WORK"
|
|
cd "$WORK"
|
|
|
|
TARBALL="freetype-${FT_VERSION}.tar.gz"
|
|
if [[ ! -f "$TARBALL" ]]; then
|
|
echo "Downloading FreeType ${FT_VERSION} ..."
|
|
curl -fsSL -o "$TARBALL" "$FT_URL" || curl -fsSL -o "$TARBALL" "$FT_URL_MIRROR"
|
|
fi
|
|
|
|
echo "Verifying SHA-256 ..."
|
|
echo "${FT_SHA256} ${TARBALL}" | sha256sum -c - || {
|
|
echo "ERROR: FreeType tarball checksum mismatch (expected ${FT_SHA256})." >&2
|
|
echo " got: $(sha256sum "$TARBALL" | cut -d' ' -f1)" >&2
|
|
exit 1
|
|
}
|
|
|
|
rm -rf "freetype-${FT_VERSION}"
|
|
tar xf "$TARBALL"
|
|
SRC="$WORK/freetype-${FT_VERSION}"
|
|
|
|
# Minimal mingw toolchain for FreeType's own CMake.
|
|
cat > "$WORK/ft-mingw-toolchain.cmake" <<TOOLCHAIN
|
|
set(CMAKE_SYSTEM_NAME Windows)
|
|
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
|
set(CMAKE_C_COMPILER ${MINGW_GCC})
|
|
set(CMAKE_CXX_COMPILER ${MINGW_GXX})
|
|
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
|
|
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
TOOLCHAIN
|
|
|
|
echo "Configuring FreeType (static, no external deps) ..."
|
|
rm -rf "$WORK/build"
|
|
cmake -S "$SRC" -B "$WORK/build" \
|
|
-DCMAKE_TOOLCHAIN_FILE="$WORK/ft-mingw-toolchain.cmake" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DFT_DISABLE_ZLIB=ON \
|
|
-DFT_DISABLE_BZIP2=ON \
|
|
-DFT_DISABLE_PNG=ON \
|
|
-DFT_DISABLE_HARFBUZZ=ON \
|
|
-DFT_DISABLE_BROTLI=ON
|
|
|
|
echo "Building + installing FreeType ..."
|
|
cmake --build "$WORK/build" -j "$(nproc)"
|
|
cmake --install "$WORK/build"
|
|
|
|
if [[ -f "$PREFIX/lib/libfreetype.a" ]]; then
|
|
echo "OK: mingw FreeType -> $PREFIX/lib/libfreetype.a"
|
|
else
|
|
echo "ERROR: build did not produce libfreetype.a" >&2
|
|
exit 1
|
|
fi
|