2017-01-08 4 views
1

Ich versuche, einen monochromen Glyphatlas zu erstellen, stieß aber auf ein Problem. Freetype macht "Mist" in der Bitmap der Glyphe. Ich beschuldige Freetype, weil einige der Glyphen immer noch korrekt gerendert werden.Freetype rendert Mist in Bitmap

Der resultierende Texturatlas:

Texture atlas

Warum könnte es sein und wie kann ich es beheben?

aber ich immer noch falsch sein könnte und hier ist Bitmap-Verarbeitungscode:

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; 
    } 

Und Code für sie auf Hauptpuffer setzen:

 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

Hmmmm, ich bin ziemlich sicher, dass ein besseres Wort als ‚Mist‘ gibt es in diesem speziellen Fall verwendet werden ... –

+0

ich es Freetype ist nicht wette, aber Ihr Code (aber ich kann nicht sehen wo). –

+1

sieht aus, als ob ein fester Schritt angenommen wird (also sind die Breiten von Glyphen immer ein Vielfaches von wie 8 oder 4 unabhängig von der Renderbreite), da die beobachtete Verzerrung offensichtlich auf fehlendes Padding zurückzuführen ist. die intakten Glyphen erfüllen wahrscheinlich diese Bedingung. – dlatikay

Antwort

2

Aus Dokumentation:

Convert ein Bitmap-Objekt mit der Tiefe 1bpp, 2bpp, 4bpp, 8bpp oder 32bpp für ein Bitmap-Objekt mit der Tiefe 8bpp, wodurch die Anzahl der verwendeten Bytes [pro] Linie (a.k.a. die "Tonhöhe") ein Vielfaches von "Ausrichtung".

In Ihrem Code, übergeben Sie 1 als Wert des alignment Parameter im Aufruf von FT_Bitmap_Convert. In Monochrom ist ein Byte acht Pixel, sodass die horizontale Renderschleife ein Vielfaches von acht für die Breite erzwingen muss.

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