Browse Source

Fixed glyphs being added to partially out-of-bounds positions in Font texture atlases in rare cases (resolves issue #1162).

Alex Szpakowski 9 years ago
parent
commit
d6310ca87f
1 changed files with 9 additions and 18 deletions
  1. 9 18
      src/modules/graphics/opengl/Font.cpp

+ 9 - 18
src/modules/graphics/opengl/Font.cpp

@@ -252,7 +252,7 @@ love::font::GlyphData *Font::getRasterizerGlyphData(uint32 glyph)
 
 const Font::Glyph &Font::addGlyph(uint32 glyph)
 {
-	love::font::GlyphData *gd = getRasterizerGlyphData(glyph);
+	StrongRef<love::font::GlyphData> gd(getRasterizerGlyphData(glyph), Acquire::NORETAIN);
 
 	int w = gd->getWidth();
 	int h = gd->getHeight();
@@ -264,18 +264,15 @@ const Font::Glyph &Font::addGlyph(uint32 glyph)
 		textureY += rowHeight;
 		rowHeight = TEXTURE_PADDING;
 	}
+
 	if (textureY + h + TEXTURE_PADDING > textureHeight)
 	{
 		// totally out of space - new texture!
-		try
-		{
-			createTexture();
-		}
-		catch (love::Exception &)
-		{
-			gd->release();
-			throw;
-		}
+		createTexture();
+
+		// Makes sure the above code for checking if the glyph can fit at
+		// the current position in the texture is run again for this glyph.
+		return addGlyph(glyph);
 	}
 
 	Glyph g;
@@ -318,18 +315,12 @@ const Font::Glyph &Font::addGlyph(uint32 glyph)
 			g.vertices[i].x += gd->getBearingX();
 			g.vertices[i].y -= gd->getBearingY();
 		}
-	}
-
-	if (w > 0)
-		textureX += (w + TEXTURE_PADDING);
 
-	if (h > 0)
+		textureX += w + TEXTURE_PADDING;
 		rowHeight = std::max(rowHeight, h + TEXTURE_PADDING);
-
-	gd->release();
+	}
 
 	const auto p = glyphs.insert(std::make_pair(glyph, g));
-
 	return p.first->second;
 }