From 8f0b7aaca13580d6b2ecd5932b8f350f05709ebb Mon Sep 17 00:00:00 2001 From: Ben Boeckel <ben.boeckel@kitware.com> Date: Tue, 24 Dec 2019 10:00:01 -0500 Subject: [PATCH] vtkFreeTypeTools: avoid finding '\n' in a vtkUnicodeString --- Rendering/FreeType/vtkFreeTypeTools.cxx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Rendering/FreeType/vtkFreeTypeTools.cxx b/Rendering/FreeType/vtkFreeTypeTools.cxx index 489426389ef..c54289dc602 100644 --- a/Rendering/FreeType/vtkFreeTypeTools.cxx +++ b/Rendering/FreeType/vtkFreeTypeTools.cxx @@ -1421,6 +1421,17 @@ bool vtkFreeTypeTools::CalculateBoundingBox(const vtkStdString& str, MetaData& m return CalculateBoundingBox(str, metaData, vtkStdString(DEFAULT_HEIGHT_STRING)); } +namespace +{ + +template <typename T> +constexpr typename T::value_type newline() +{ + return static_cast<typename T::value_type>('\n'); +} + +} + //---------------------------------------------------------------------------- template <typename T> bool vtkFreeTypeTools::CalculateBoundingBox( @@ -1434,7 +1445,7 @@ bool vtkFreeTypeTools::CalculateBoundingBox( // Go through the string, line by line, and build the metrics data. typename T::const_iterator beginLine = str.begin(); - typename T::const_iterator endLine = std::find(beginLine, str.end(), '\n'); + typename T::const_iterator endLine = std::find(beginLine, str.end(), newline<T>()); while (endLine != str.end()) { metaData.lineMetrics.push_back(MetaData::LineMetrics()); @@ -1443,7 +1454,7 @@ bool vtkFreeTypeTools::CalculateBoundingBox( metaData.maxLineWidth = std::max(metaData.maxLineWidth, metaData.lineMetrics.back().width); beginLine = endLine; ++beginLine; - endLine = std::find(beginLine, str.end(), '\n'); + endLine = std::find(beginLine, str.end(), newline<T>()); } // Last line... metaData.lineMetrics.push_back(MetaData::LineMetrics()); @@ -1903,7 +1914,8 @@ bool vtkFreeTypeTools::PopulateData(const StringType& str, DataType data, MetaDa { // Go through the string, line by line typename StringType::const_iterator beginLine = str.begin(); - typename StringType::const_iterator endLine = std::find(beginLine, str.end(), '\n'); + typename StringType::const_iterator endLine = + std::find(beginLine, str.end(), newline<StringType>()); int lineIndex = 0; while (endLine != str.end()) @@ -1915,7 +1927,7 @@ bool vtkFreeTypeTools::PopulateData(const StringType& str, DataType data, MetaDa beginLine = endLine; ++beginLine; - endLine = std::find(beginLine, str.end(), '\n'); + endLine = std::find(beginLine, str.end(), newline<StringType>()); ++lineIndex; } -- GitLab