0

モノクロの FreeType グリフを RGBA 符号なしバイト OpenGL テクスチャに変換したいと考えています。ピクセル (x, y) でのテクスチャの色は (255, 255, アルファ) になります。

alpha = glyph->bitmap.buffer[pixelIndex(x, y)] * 255

を使用してグリフをロードします

FT_Load_Char(face, glyphChar, FT_LOAD_RENDER | FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO)

ターゲット テクスチャの寸法はglyph->bitmap.width * glyph->bitmap.rowsです。FT_Load_Char(face, glyphChar, FT_LOAD_RENDER)グレースケールグリフ(を使用してロード)にインデックスを付けることができました

glyph->bitmap.buffer[(glyph->bitmap.width * y) + x]

ただし、これはモノクロ バッファでは機能しないようで、最終的なテクスチャの文字がスクランブルされます。

モノクログリフバッファでピクセル (x, y) の値を取得する正しい方法は何ですか?

4

3 に答える 3

3

Gamedev.net で開始したこのスレッドに基づいて、(x, y) のピクセルの塗りつぶし/空の状態を取得する次の関数を思い付きました。

bool glyphBit(const FT_GlyphSlot &glyph, const int x, const int y)
{
    int pitch = abs(glyph->bitmap.pitch);
    unsigned char *row = &glyph->bitmap.buffer[pitch * y];
    char cValue = row[x >> 3];

    return (cValue & (128 >> (x & 7))) != 0;
}
于 2013-02-16T01:28:10.227 に答える
0

少し前に似たような質問があります。だから私はあなたを助けようとします。

ターゲットテクスチャの寸法は次のとおりです。glyph->bitmap.width * glyph->bitmap.rows

これは、OpenGlの非常に特殊なディメンションです。これを2の累乗に丸めるとよいでしょう。

一般的な方法では、すべてのグリフを取得するサイクルを作成します。次に、0から。までのすべての行を循環しglyph->bitmap.rowsます。次に、行のすべてのバイト(unsigned char)を0から。まで循環しglyph->pitchます。処理によってバイトを取得する場所glyph->bitmap.buffer[pitch * row + i](iは内部サイクルのインデックス、rowは外部サイクルのインデックス)。例えば:

if(s[i] == ' ') left += 20; else
    for (int row = 0; row < g->bitmap.rows; ++row) {
             if(kerning)
            for(int b = 0; b < pitch; b++){
                if(data[left + 64*(strSize*(row + 64 -  g->bitmap_top)) + b] + g->bitmap.buffer[pitch * row + b] < UCHAR_MAX)
                    data[left + 64*(strSize*(row + 64 -  g->bitmap_top)) + b] += g->bitmap.buffer[pitch * row + b];
                else
                    data[left + 64*(strSize*(row + 64 -  g->bitmap_top)) + b] = UCHAR_MAX;
            } else
        std::memcpy(data + left + 64*(strSize*(row + 64 -  g->bitmap_top)) , g->bitmap.buffer + pitch * row, pitch);
    }
    left += g->advance.x >> 6;

このコードは、8ビットビットマップ(standart FT_Load_Char(face, glyphChar, FT_LOAD_RENDER))に関連しています。今、モノクロの旗を使おうとすると困りました。だから私の答えはあなたの問題の解決策ではありません。手紙を表示したいだけなら、私の質問が表示されます。

于 2013-02-15T00:54:52.627 に答える
0

次の Python 関数FT_LOAD_TARGET_MONOは、バッファー内の各バイトが 1 つのピクセルにマップされる、より便利な表現にグリフ ビットマップをアンパックします。

Python と FreeType を使用したモノクロ フォントのレンダリングに関する詳細情報と、追加のサンプル コードをブログに掲載しています: http://dbader.org/blog/monochrome-font-rendering-with-freetype-and-python

def unpack_mono_bitmap(bitmap):
    """
    Unpack a freetype FT_LOAD_TARGET_MONO glyph bitmap into a bytearray where each
    pixel is represented by a single byte.
    """
    # Allocate a bytearray of sufficient size to hold the glyph bitmap.
    data = bytearray(bitmap.rows * bitmap.width)

    # Iterate over every byte in the glyph bitmap. Note that we're not
    # iterating over every pixel in the resulting unpacked bitmap --
    # we're iterating over the packed bytes in the input bitmap.
    for y in range(bitmap.rows):
      for byte_index in range(bitmap.pitch):

        # Read the byte that contains the packed pixel data.
        byte_value = bitmap.buffer[y * bitmap.pitch + byte_index]

        # We've processed this many bits (=pixels) so far. This determines
        # where we'll read the next batch of pixels from.
        num_bits_done = byte_index * 8

        # Pre-compute where to write the pixels that we're going
        # to unpack from the current byte in the glyph bitmap.
        rowstart = y * bitmap.width + byte_index * 8

        # Iterate over every bit (=pixel) that's still a part of the
        # output bitmap. Sometimes we're only unpacking a fraction of a byte
        # because glyphs may not always fit on a byte boundary. So we make sure
        # to stop if we unpack past the current row of pixels.
        for bit_index in range(min(8, bitmap.width - num_bits_done)):

          # Unpack the next pixel from the current glyph byte.
          bit = byte_value & (1 << (7 - bit_index))

          # Write the pixel to the output bytearray. We ensure that `off`
          # pixels have a value of 0 and `on` pixels have a value of 1.
          data[rowstart + bit_index] = 1 if bit else 0

    return data
于 2013-05-04T14:18:54.337 に答える