FreeType 库

Free Type 运行依赖库


libpng构建

  1. Makefile 构建
cp scripts/pnglibconf.h.prebuilt pnglibconf.h
cp scripts/makefile.system makefile
make test
make install
  1. 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);

没有强制对齐
强制字节对齐

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

posted on 2025-06-28 05:23  TN-mo  阅读(15)  评论(0)    收藏  举报