FreeType - 使用FT_Get_Glyph后错误的advance.x值

时间:2018-01-05 12:11:15

标签: c++ freetype freetype2

在按照一些例子如何渲染like this one后,我想我可能需要某种形式的缓存。虽然我的缓存正常,但我很难获得正确的字形前进值。

以下代码足以证明函数FT_Get_Glyph将使值不同。 (find / -name FreeSans.ttflink如果您需要复制/下载字体

#include <iostream>
#include <map>

#include <glm/glm.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <freetype2/ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H

int main() {
    std::map<GLchar, FT_BitmapGlyph> glyphs;
    FT_Library ftLibrary;
    FT_Face ftFace;

    if (FT_Init_FreeType(&ftLibrary)) {
        printf("Could not initialize FreeType library\n");
        return GL_TRUE;
    }
    if (FT_New_Face(ftLibrary, "FreeSans.ttf", 0, &ftFace)) {
        printf("Could not load selected font\n");
        return GL_TRUE;
    }
    FT_Set_Pixel_Sizes(ftFace, 0, 48);
    for (GLubyte c = 0; c < 128; c++) {
        if (FT_Load_Char(ftFace, c, FT_LOAD_RENDER)) {
            printf("Could not load character, continuing\n");
            continue;
        }
        printf("Advance: %li\n", ftFace->glyph->advance.x >> 6);
        if (FT_Get_Glyph(ftFace->glyph, (FT_Glyph *)&glyphs[c])) {
            printf("Could not copy the glyph\n");
            continue;
        }
        printf("Advance after get: %li\n", glyphs[c]->root.advance.x >> 6);
        printf("Advance after with cast: %li\n", ((FT_Glyph)glyphs[c])->advance.x >> 6);
        if (glyphs[c]->root.format == FT_GLYPH_FORMAT_BITMAP) {
            printf("Format is bitmap!\n");
        }
    }

    FT_Done_Face(ftFace);
    FT_Done_FreeType(ftLibrary);
}

输出

Advance: 16
Advance after get: 16384
Advance after with cast: 16384
Format is bitmap!
Advance: 28
Advance after get: 28672
Advance after with cast: 28672
Format is bitmap!
Advance: 34
Advance after get: 34816
Advance after with cast: 34816
Format is bitmap!

Freetype自己在参考手册link中写下这个:

  

如果有,可以将FT_Glyph类型转换为FT_BitmapGlyph   'glyph-&gt; format == FT_GLYPH_FORMAT_BITMAP'。这可以让你访问   位图的内容很容易。

这是关于根域的:

  

根FT_Glyph字段。

至少对我来说,我应该可以通过FT_Glyph访问->root的原始字段。

显然这不起作用,所以我的问题是,我误解了什么吗?

所以,当我研究这个问题的信息时,我偶然发现了这些信息,link

  

因为'* aglyph-&gt; advance.x'和&#39; * aglyph-&gt; advance.y&#39;是16.16   定点数,'slot-&gt; advance.x'和'slot-&gt; advance.y'(其中   以26.6定点格式)必须在[-32768; 32768 [。

]范围内

由于glyphs[c]->root.advance.x >> 16 == ftFace->glyph->advance.x >> 6我可以在16:16和26:6之间看到一些联系,尽管这些数字还没有说明我的任何内容。

有人可以解释这是如何累加的吗?为什么改变比率(或者这些数字是什么)并且我理解正确的FT_Get_Glyph glyphs[c]->root.advance.x >> 16之后访问高级值的正确方法是正确的?

(我意识到我可能在很大程度上回答了我自己的问题,但由于我没有找到任何有关此问题的信息/问题,我认为无论如何我会发布它作为对其他人的参考)

0 个答案:

没有答案