FTTextureGlyphImpl: fix garbage with bitmap fonts (see Debian bug #589601, 4.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
diff --git a/src/FTGlyph/FTTextureGlyph.cpp b/src/FTGlyph/FTTextureGlyph.cpp
index 28189dc..64b28e7 100644
--- a/src/FTGlyph/FTTextureGlyph.cpp
+++ b/src/FTGlyph/FTTextureGlyph.cpp
@@ -133,9 +133,32 @@ FTTextureGlyphImpl::FTTextureGlyphImpl(FT_GlyphSlot glyph, int id, int xOffset,
}
if (destHeight >= 0)
{
+ // convert bitmap fonts
+ std::vector <unsigned char> data_converted;
+ if(bitmap.num_grays == 1)
+ {
+ bBox = FTBBox(0, 0, 0, destWidth, destHeight, 0);
+ data_converted.resize(destWidth * destHeight, 0);
+ int n = 0;
+ for(int y = 0; y < destHeight; ++y)
+ {
+ unsigned char* src = bitmap.pitch < 0
+ ? bitmap.buffer + (y - destHeight + 1) * bitmap.pitch
+ : bitmap.buffer + y * bitmap.pitch;
+ unsigned char c;
+ for(int x = 0; x < destWidth; ++x)
+ {
+ if (x % 8 == 0)
+ c = *src++;
+ data_converted[n++] = ((c >> (7 - (x % 8))) & 1) * 255;
+ }
+ }
+ }
+
glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset,
destWidth, destHeight, GL_ALPHA, GL_UNSIGNED_BYTE,
- bitmap.buffer);
+ !data_converted.empty() ? data_converted.data()
+ : bitmap.buffer);
}
glPopClientAttrib();
diff --git a/test/FTTextureFont-Bitmap.cpp b/test/FTTextureFont-Bitmap.cpp
new file mode 100644
index 0000000..825ba37
--- /dev/null
+++ b/test/FTTextureFont-Bitmap.cpp
@@ -0,0 +1,44 @@
+//$LIBS_PKG_CONFIG glu gl ftgl fontconfig
+//$LIBS -lglut
+
+#include <GL/glut.h>
+#include <FTGL/ftgl.h>
+
+FTFont *font;
+
+void display ()
+{
+ glClear (GL_COLOR_BUFFER_BIT);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ gluPerspective (90, 1, 1, 1000);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ gluLookAt (0, 0, 200, 0, 0, 0, 0, 1, 0);
+ glPushMatrix ();
+ glColor3f (1, 1, 1);
+ glTranslatef (-100, 100, 0);
+ glEnable (GL_BLEND);
+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ font->Render ("Test", -1, FTPoint (), FTPoint (), FTGL::RENDER_FRONT | FTGL::RENDER_BACK);
+ glPopMatrix ();
+ glutSwapBuffers ();
+}
+
+int main (int argc, char **argv)
+{
+ glutInit (&argc, argv);
+ glutInitDisplayMode (GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE);
+ glutInitWindowPosition (50, 50);
+ glutInitWindowSize (400, 400);
+ glutCreateWindow ("FTGL Test");
+ glutDisplayFunc (display);
+ const char *file = "/usr/share/fonts/X11/100dpi/timR12-ISO8859-1.pcf.gz";
+ font = new FTTextureFont (file);
+ if (font->Error () || !font->FaceSize (17))
+ {
+ fprintf (stderr, "Failed to open font %s\n", file);
+ return 1;
+ }
+ glutMainLoop ();
+}