2017-01-08 13 views
1

モノクログリフアトラスを作成しようとしましたが、問題が発生しました。 Freetypeは、グリフのビットマップに「うんざり」を描画します。グリフのいくつかが正しくレンダリングされているので、私はfreetypeを責めます。Freetypeがビットマップでクラップをレンダリングする

たテクスチャアトラス:

Texture atlas

なぜそれができると私はそれをどのように修正することができますか?

しかし、私はまだ間違っていると、ここでビットマップ処理コードである可能性があり:

static std::vector<unsigned char> generateBitmap(FT_Face &face, unsigned int glyph, size_t *width, size_t *height) { 
     FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_RENDER | FT_LOAD_MONOCHROME); 

     FT_Bitmap bitmap; 
     FT_Bitmap_New(&bitmap); 
     FT_Bitmap_Convert(ftLib, &face->glyph->bitmap, &bitmap, 1); 
     *width = bitmap.width; 
     *height = bitmap.rows; 


     std::vector<unsigned char> result(bitmap.width * bitmap.rows);// 
     for (size_t y = 0; y < bitmap.rows; ++y) 
     { 
      for (size_t x = 0; x < bitmap.width; ++x) 
      { 
       result[(bitmap.width * y) + x] = bitmap.buffer[(bitmap.width * y) + x]; 
      } 

     } 
     FT_Bitmap_Done(ftLib, &bitmap); 
     return result; 
    } 

とコードの主バッファにそれを置くために:

 static void putOnBuffer(std::vector<unsigned char> &buffer, std::vector<unsigned char> &bitmap, size_t height, size_t width) { 
     int r = 0; 
     while (r < height) { 
      int w = 0; 
      while (w < width) { 
       //assume buffer is enough large 
       size_t mainBufPos = ((currentBufferPositionY + r) * imageWidth) + (currentBufferPositionX + w); 
       size_t bitmapBufPos = (r * width) + w; 
       buffer[mainBufPos] = clamp(int(bitmap[bitmapBufPos] * 0x100), 0xff); 
       w++; 
      } 
      r++; 
     } 
    } 
+1

うーむ、私は(私はそれがFreeTypeのではない賭ける –

+0

...この特定のケースで使用する「がらくた」よりもっと良い言葉がありますかなり確信しているが、あなたのコード私はどこに見えないのか)。 –

+1

は、固定されたストライドが仮定されているように見えます(グリフの幅はレンダリング幅とは無関係に常に8または4の倍数です)。観察される歪みは明らかにパディングの欠落によるものです。無傷のグリフがおそらくこの状態になることがあります。 – dlatikay

答えて

2

ドキュメントから:

変換depthbpp、2bpp、4bpp、8bpp、または32bppのビットマップオブジェクトを深さ8bppのビットマップオブジェクトに置き換えて、使用バイト数を生成する[per] line(a.k.a. 'ピッチ')の 'アライメント'の倍数。あなたのコードで

、あなたはFT_Bitmap_Convertへの呼び出しでalignmentパラメータの値として1を渡します。モノクロでは、1バイトは8ピクセルになるので、水平レンダリングループは幅の8の倍数を強制する必要があります。

参考:https://www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html

関連する問題