Browse Source

Fixed font textures in OpenGL returning black RGB values when a shader is active (reverts changeset 69b0b4e)

Alex Szpakowski 11 years ago
parent
commit
98b258b75f

+ 5 - 5
src/modules/font/GlyphData.cpp

@@ -43,8 +43,8 @@ GlyphData::GlyphData(uint32 glyph, GlyphMetrics glyphMetrics, GlyphData::Format
 	{
 		switch (f)
 		{
-		case GlyphData::FORMAT_ALPHA:
-			data = new unsigned char[metrics.width * metrics.height];
+		case GlyphData::FORMAT_LUMINANCE_ALPHA:
+			data = new unsigned char[metrics.width * metrics.height * 2];
 			break;
 		case GlyphData::FORMAT_RGBA:
 		default:
@@ -68,8 +68,8 @@ int GlyphData::getSize() const
 {
 	switch (format)
 	{
-	case GlyphData::FORMAT_ALPHA:
-		return getWidth() * getHeight();
+	case GlyphData::FORMAT_LUMINANCE_ALPHA:
+		return getWidth() * getHeight() * 2;
 		break;
 	case GlyphData::FORMAT_RGBA:
 	default:
@@ -168,7 +168,7 @@ bool GlyphData::getConstant(GlyphData::Format in, const char *&out)
 
 StringMap<GlyphData::Format, GlyphData::FORMAT_MAX_ENUM>::Entry GlyphData::formatEntries[] =
 {
-	{"alpha", GlyphData::FORMAT_ALPHA},
+	{"luminance alpha", GlyphData::FORMAT_LUMINANCE_ALPHA},
 	{"rgba", GlyphData::FORMAT_RGBA},
 };
 

+ 1 - 1
src/modules/font/GlyphData.h

@@ -58,7 +58,7 @@ public:
 
 	enum Format
 	{
-		FORMAT_ALPHA,
+		FORMAT_LUMINANCE_ALPHA,
 		FORMAT_RGBA,
 		FORMAT_MAX_ENUM
 	};

+ 7 - 3
src/modules/font/freetype/TrueTypeRasterizer.cpp

@@ -86,7 +86,7 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const
 	glyphMetrics.width = bitmap.width;
 	glyphMetrics.advance = face->glyph->metrics.horiAdvance >> 6;
 
-	GlyphData *glyphData = new GlyphData(glyph, glyphMetrics, GlyphData::FORMAT_ALPHA);
+	GlyphData *glyphData = new GlyphData(glyph, glyphMetrics, GlyphData::FORMAT_LUMINANCE_ALPHA);
 
 	const uint8 *pixels = bitmap.buffer;
 	uint8 *dest = (uint8 *) glyphData->getData();
@@ -100,7 +100,8 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const
 			{
 				// Extract the 1-bit value and convert it to uint8.
 				uint8 v = ((pixels[x / 8]) & (1 << (7 - (x % 8)))) ? 255 : 0;
-				dest[y * bitmap.width + x] = v;
+				dest[2 * (y * bitmap.width + x) + 0] = 255;
+				dest[2 * (y * bitmap.width + x) + 1] = v;
 			}
 
 			pixels += bitmap.pitch;
@@ -111,7 +112,10 @@ GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const
 		for (int y = 0; y < bitmap.rows; y++)
 		{
 			for (int x = 0; x < bitmap.width; x++)
-				dest[y * bitmap.width + x] = pixels[x];
+			{
+				dest[2 * (y * bitmap.width + x) + 0] = 255;
+				dest[2 * (y * bitmap.width + x) + 1] = pixels[x];
+			}
 
 			pixels += bitmap.pitch;
 		}

+ 6 - 6
src/modules/graphics/opengl/Font.cpp

@@ -73,7 +73,7 @@ Font::Font(love::font::Rasterizer *r, const Image::Filter &filter)
 	try
 	{
 		gd = r->getGlyphData(32);
-		type = (gd->getFormat() == love::font::GlyphData::FORMAT_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE;
+		type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE;
 
 		loadVolatile();
 	}
@@ -96,7 +96,7 @@ Font::~Font()
 
 bool Font::initializeTexture(GLenum format)
 {
-	GLint internalformat = (format == GL_ALPHA) ? GL_ALPHA8 : GL_RGBA8;
+	GLint internalformat = (format == GL_LUMINANCE_ALPHA) ? GL_LUMINANCE8_ALPHA8 : GL_RGBA8;
 
 	// clear errors before initializing
 	while (glGetError() != GL_NO_ERROR);
@@ -130,7 +130,7 @@ void Font::createTexture()
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-	GLenum format = (type == FONT_TRUETYPE ? GL_ALPHA : GL_RGBA);
+	GLenum format = (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA);
 
 	// Initialize the texture, attempting smaller sizes if initialization fails.
 	bool initialized = false;
@@ -156,9 +156,9 @@ void Font::createTexture()
 
 		throw love::Exception("Could not create font texture!");
 	}
-	
+
 	// Fill the texture with transparent black.
-	std::vector<GLubyte> emptyData(textureWidth * textureHeight * (type == FONT_TRUETYPE ? 1 : 4), 0);
+	std::vector<GLubyte> emptyData(textureWidth * textureHeight * (type == FONT_TRUETYPE ? 2 : 4), 0);
 	glTexSubImage2D(GL_TEXTURE_2D,
 					0,
 					0, 0,
@@ -208,7 +208,7 @@ Font::Glyph *Font::addGlyph(uint32 glyph)
 						textureX,
 						textureY,
 						w, h,
-						(type == FONT_TRUETYPE ? GL_ALPHA : GL_RGBA),
+						(type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA),
 						GL_UNSIGNED_BYTE,
 						gd->getData());