From 06701a4d30f9c8ee9ddda9823f02b684f0239bd0 Mon Sep 17 00:00:00 2001 From: Dan Lipsa <dan.lipsa@kitware.com> Date: Fri, 2 Sep 2016 14:37:51 -0400 Subject: [PATCH] BUG: Use of double LineSpacing results in one pixel off errors. Compute interLineSpacing as an integer and use that instead. --- Rendering/FreeType/vtkFreeTypeTools.cxx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Rendering/FreeType/vtkFreeTypeTools.cxx b/Rendering/FreeType/vtkFreeTypeTools.cxx index 0577154ff65..4d2bc7d16e9 100644 --- a/Rendering/FreeType/vtkFreeTypeTools.cxx +++ b/Rendering/FreeType/vtkFreeTypeTools.cxx @@ -1443,15 +1443,19 @@ bool vtkFreeTypeTools::CalculateBoundingBox(const T& str, metaData.maxLineWidth = std::max(metaData.maxLineWidth, metaData.lineMetrics.back().width); - // Calculate line height from a reference set of characters, since the global - // face values are usually way too big. + int numLines = metaData.lineMetrics.size(); T heightString; - if (metaData.textProperty->GetUseTightBoundingBox()) + if (metaData.textProperty->GetUseTightBoundingBox() && numLines == 1) { + // Calculate line hight from actual characters. This works only for single line text + // and may result in a hight that does not include descent. It is used to get + // a centered label. heightString = str; } else { + // Calculate line height from a reference set of characters, since the global + // face values are usually way too big. heightString = defaultHeightString; } metaData.ascent = std::numeric_limits<int>::min(); @@ -1477,11 +1481,9 @@ bool vtkFreeTypeTools::CalculateBoundingBox(const T& str, metaData.height = metaData.ascent - metaData.descent + 1; // The unrotated height of the text - int numLines = metaData.lineMetrics.size(); - double lineSpacing = numLines > 1 ? metaData.textProperty->GetLineSpacing() - : 1.; + int interLineSpacing = (metaData.textProperty->GetLineSpacing() - 1) * metaData.height; int fullHeight = numLines * metaData.height + - (numLines - 1) * metaData.height * (lineSpacing - 1.) + + (numLines - 1) * interLineSpacing + metaData.textProperty->GetLineOffset(); // Will we be rendering a background? @@ -1555,7 +1557,6 @@ bool vtkFreeTypeTools::CalculateBoundingBox(const T& str, // First baseline offset from top-left corner. vtkVector2i penOffset(pad, -pad); // Account for line spacing to center the text vertically in the bbox: - penOffset[1] -= vtkMath::Ceil((lineSpacing - 1.) * metaData.height * 0.5); penOffset[1] -= metaData.ascent; penOffset[1] -= metaData.textProperty->GetLineOffset(); rotateVector2i(penOffset, s, c); @@ -1568,7 +1569,7 @@ bool vtkFreeTypeTools::CalculateBoundingBox(const T& str, textBbox[2] = textBbox[3] = pen[1]; // Calculate line offset: - vtkVector2i lineFeed(0, -(metaData.height * lineSpacing)); + vtkVector2i lineFeed(0, -(metaData.height + interLineSpacing)); rotateVector2i(lineFeed, s, c); // Compile the metrics data to determine the final bounding box. Set line -- GitLab