FreeType 库
Free Type 运行依赖库
libpng构建
- Makefile 构建
cp scripts/pnglibconf.h.prebuilt pnglibconf.h
cp scripts/makefile.system makefile
make test
make install
- CMake 构建
cmake -B out -G "MinGW Makefiles" . -DCMAKE_INSTALL_PREFIX=/path
cmake --build out
harfbuzz 构建
CMake 构建
cmake -B out -G "MinGW Makefiles" .
cmake --build out
已知问题:
> cmake --build build
[ 5%] Building CXX object CMakeFiles/harfbuzz.dir/src/harfbuzz.cc.obj
D:/MinGW/bin/../lib/gcc/.../bin/as.exe: CMakeFiles\harfbuzz.dir\src\harfbuzz.cc.obj: too many sections (33788)
C:\Users\...\ccwnO9s0.s: Fatal error: can't write 58 bytes to section .text: 'file too big'
...
mingw32-make[2]: *** [CMakeFiles\harfbuzz.dir\build.make:76] Error 1
解决方案:
if(MINGW)
target_compile_options(harfbuzz PRIVATE "-Wa,-mbig-obj")
endif()
bzip2 库构建
Makefile 构建
make
FreeType 基本使用
// FreeType library handle
FT_Library library;
// Store font face
FT_Face face;
int error;
wchar_t wch = L'你';
error = FT_Init_FreeType(&library);
if (error != FT_Err_Ok) return 1;
error = FT_New_Face(library, "resources/fonts/msyh.ttc", 0, &face); // 微软雅黑字体
if (error != FT_Err_Ok) return 1;
error = FT_Set_Pixel_Sizes(face, 0, 48);
if (error != FT_Err_Ok) return 1;
error = FT_Select_Charmap(face, FT_ENCODING_UNICODE);
if (error != FT_Err_Ok) return 1;
error = FT_Load_Char(face, wch, FT_LOAD_RENDER);
if (error != FT_Err_Ok) return 1;
int width = face->glyph->bitmap.width;
int height = face->glyph->bitmap.rows;
unsigned char* data = face->glyph->bitmap.buffer;
GLenum format = GL_RED;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 强制 1 字节对齐,避免纹理错乱
GLuint tex_id;
glGenTextures(1, &tex_id);
glBindTexture(GL_TEXTURE_2D, tex_id);
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
FT_Done_Face(face);
FT_Done_FreeType(library);


如果没有强制对齐(第一张图片)会导致纹理混乱,启用了字节对齐(第二张图片)后就能够正确的显示纹理。这里字体颠倒问题为程序本身的逻辑问题,使用上并无困难。
浙公网安备 33010602011771号