Browse Source

Improve justified text alignment

Ron Tseytlin 8 months ago
parent
commit
7e34e0ad21

+ 6 - 1
src/modules/font/GenericShaper.cpp

@@ -49,6 +49,7 @@ void GenericShaper::computeGlyphPositions(const ColoredCodepoints &codepoints, R
 
 	// Spacing counter and newline handling.
 	Vector2 curpos = offset;
+	float spacingremainder = 0;
 
 	float maxwidth = 0;
 	uint32 prevglyph = 0;
@@ -125,7 +126,11 @@ void GenericShaper::computeGlyphPositions(const ColoredCodepoints &codepoints, R
 
 		// Account for extra spacing given to space characters.
 		if (g == ' ' && extraspacing != 0.0f)
-			curpos.x += extraspacing;
+		{
+			spacingremainder += fmod(extraspacing, 1);
+			curpos.x += floorf(extraspacing) + floorf(spacingremainder);
+			spacingremainder = fmod(spacingremainder, 1);
+		}
 
 		prevglyph = g;
 	}

+ 6 - 1
src/modules/font/freetype/HarfbuzzShaper.cpp

@@ -208,6 +208,7 @@ void HarfbuzzShaper::computeGlyphPositions(const ColoredCodepoints &codepoints,
 
 	offset.y += getBaseline();
 	Vector2 curpos = offset;
+	float spacingremainder = 0;
 
 	int colorindex = 0;
 	int ncolors = (int)codepoints.colors.size();
@@ -312,7 +313,11 @@ void HarfbuzzShaper::computeGlyphPositions(const ColoredCodepoints &codepoints,
 
 			// Account for extra spacing given to space characters.
 			if (clustercodepoint == ' ' && extraspacing != 0.0f)
-				curpos.x += extraspacing;
+			{
+				spacingremainder += fmod(extraspacing, 1);
+				curpos.x += floorf(extraspacing) + floorf(spacingremainder);
+				spacingremainder = fmod(spacingremainder, 1);
+			}
 		}
 	}
 

+ 1 - 1
src/modules/graphics/Font.cpp

@@ -508,7 +508,7 @@ std::vector<Font::DrawCommand> Font::generateVerticesFormatted(const love::font:
 				auto end = start + range.getSize();
 				float numspaces = std::count(start, end, ' ');
 				if (width < wrap && numspaces >= 1)
-					extraspacing = floorf((wrap - width) / numspaces);
+					extraspacing = (wrap - width) / (numspaces - 1);
 				else
 					extraspacing = 0.0f;
 				break;