From 5b4596d732da36a4d0a28d90a88b2d3815c06481 Mon Sep 17 00:00:00 2001 From: ExMix Date: Sat, 16 Aug 2014 17:47:17 +0300 Subject: [PATCH] [drape] check if text layout is valid --- drape_frontend/path_text_shape.cpp | 5 +- drape_frontend/text_shape.cpp | 141 +++++++++++++++++------------ drape_frontend/text_shape.hpp | 6 ++ 3 files changed, 93 insertions(+), 59 deletions(-) diff --git a/drape_frontend/path_text_shape.cpp b/drape_frontend/path_text_shape.cpp index 4a529a6be9..1079fdffbe 100644 --- a/drape_frontend/path_text_shape.cpp +++ b/drape_frontend/path_text_shape.cpp @@ -211,6 +211,10 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointerGetGlyphCount(); + if (glyphCount == 0) + return; + //we leave a little space on either side of the text that would //remove the comparison for equality of spline portions float const TextBorder = 4.0f; @@ -230,7 +234,6 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointerGetGlyphCount(); vector positions(glyphCount, vec2(0.0, 0.0)); vector texCoords(glyphCount); vector fontColor(glyphCount); diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp index 8c2b9c6914..798ac7065c 100644 --- a/drape_frontend/text_shape.cpp +++ b/drape_frontend/text_shape.cpp @@ -119,74 +119,99 @@ void TextShape::Draw(dp::RefPointer batcher, dp::RefPointer positions(glyphCount); - vector texCoord(glyphCount); - vector fontColor(glyphCount); - vector outlineColor(glyphCount); + DrawSingleLine(batcher, primaryLayout); + } + else + { + TextLayout const primaryLayout(fribidi::log2vis(strings::MakeUniString(m_params.m_primaryText)), + m_params.m_primaryTextFont, textures); + TextLayout const secondaryLayout(fribidi::log2vis(strings::MakeUniString(m_params.m_secondaryText)), + m_params.m_secondaryTextFont, textures); + uint32_t primGlyphCount = primaryLayout.GetGlyphCount(); + uint32_t secondGlyphCount = secondaryLayout.GetGlyphCount(); + if (primGlyphCount == 0 && secondGlyphCount == 0) + return; + + if (primGlyphCount == 0) + DrawSingleLine(batcher, secondaryLayout); + else if (secondGlyphCount == 0) + DrawSingleLine(batcher, primaryLayout); + else + DrawDoubleLine(batcher, primaryLayout, secondaryLayout); + } +} + +void TextShape::DrawSingleLine(dp::RefPointer batcher, TextLayout const & layout) const +{ + size_t glyphCount = layout.GetGlyphCount(); + vector positions(glyphCount); + vector texCoord(glyphCount); + vector fontColor(glyphCount); + vector outlineColor(glyphCount); + + PointF const pixelOffset = GetShift(m_params.m_anchor, layout.GetPixelLength(), m_params.m_primaryTextFont.m_size) + m_params.m_primaryOffset; + dp::OverlayHandle * handle = layout.LayoutText(m_params.m_featureID, m_basePoint, + pixelOffset, m_params.m_depth, + positions, texCoord, fontColor, outlineColor); + BatchText(batcher, layout.GetTextureSet(), + positions, texCoord, + fontColor, outlineColor, + glyphCount, handle); +} + +void TextShape::DrawDoubleLine(dp::RefPointer batcher, TextLayout const & primaryLayout, + TextLayout const & secondaryLayout) const +{ + float const primaryTextLength = primaryLayout.GetPixelLength(); + float const secondaryTextLength = secondaryLayout.GetPixelLength(); + bool const isPrimaryLonger = primaryTextLength > secondaryTextLength; + float const maxLength = max(primaryTextLength, secondaryTextLength); + float const minLength = min(primaryTextLength, secondaryTextLength); + float const halfLengthDiff = (maxLength - minLength) / 2.0; + + uint32_t primarySize = m_params.m_primaryTextFont.m_size; + uint32_t secondarySize = m_params.m_secondaryTextFont.m_size; + + float const textHeight = TEXT_EXPAND_FACTOR * (primarySize + secondarySize); + PointF const anchorOffset = GetShift(m_params.m_anchor, maxLength, textHeight); + + float const primaryDx = isPrimaryLonger ? 0.0f : halfLengthDiff; + float const primaryDy = (1.0f - TEXT_EXPAND_FACTOR) * primarySize - TEXT_EXPAND_FACTOR * secondarySize; + PointF const primaryPixelOffset = PointF(primaryDx, primaryDy) + anchorOffset + m_params.m_primaryOffset; + + size_t glyphCount = max(primaryLayout.GetGlyphCount(), secondaryLayout.GetGlyphCount()); + vector positions(glyphCount); + vector texCoord(glyphCount); + vector fontColor(glyphCount); + vector outlineColor(glyphCount); + + { dp::OverlayHandle * handle = primaryLayout.LayoutText(m_params.m_featureID, m_basePoint, - pixelOffset, m_params.m_depth, + primaryPixelOffset, m_params.m_depth, positions, texCoord, fontColor, outlineColor); BatchText(batcher, primaryLayout.GetTextureSet(), positions, texCoord, fontColor, outlineColor, - glyphCount, handle); + primaryLayout.GetGlyphCount(), handle); } - else + + float const secondaryDx = isPrimaryLonger ? halfLengthDiff : 0.0f; + PointF const secondaryPixelOffset = PointF(secondaryDx, 0.0f) + anchorOffset + m_params.m_primaryOffset; + { - df::FontDecl const & primaryFont = m_params.m_primaryTextFont; - df::FontDecl const & secondaryFont = m_params.m_secondaryTextFont; - - TextLayout const primaryLayout(fribidi::log2vis(strings::MakeUniString(m_params.m_primaryText)), primaryFont, textures); - TextLayout const secondaryLayout(fribidi::log2vis(strings::MakeUniString(m_params.m_secondaryText)), secondaryFont, textures); - - float const primaryTextLength = primaryLayout.GetPixelLength(); - float const secondaryTextLength = secondaryLayout.GetPixelLength(); - bool const isPrimaryLonger = primaryTextLength > secondaryTextLength; - float const maxLength = max(primaryTextLength, secondaryTextLength); - float const minLength = min(primaryTextLength, secondaryTextLength); - float const halfLengthDiff = (maxLength - minLength) / 2.0; - - float const textHeight = TEXT_EXPAND_FACTOR * (primaryFont.m_size + secondaryFont.m_size); - PointF const anchorOffset = GetShift(m_params.m_anchor, maxLength, textHeight); - - float const primaryDx = isPrimaryLonger ? 0.0f : halfLengthDiff; - float const primaryDy = (1.0f - TEXT_EXPAND_FACTOR) * primaryFont.m_size - TEXT_EXPAND_FACTOR * secondaryFont.m_size; - PointF const primaryPixelOffset = PointF(primaryDx, primaryDy) + anchorOffset + m_params.m_primaryOffset; - - size_t glyphCount = max(primaryLayout.GetGlyphCount(), secondaryLayout.GetGlyphCount()); - vector positions(glyphCount); - vector texCoord(glyphCount); - vector fontColor(glyphCount); - vector outlineColor(glyphCount); - - { - dp::OverlayHandle * handle = primaryLayout.LayoutText(m_params.m_featureID, m_basePoint, - primaryPixelOffset, m_params.m_depth, + dp::OverlayHandle * handle = secondaryLayout.LayoutText(m_params.m_featureID, m_basePoint, + secondaryPixelOffset, m_params.m_depth, positions, texCoord, fontColor, outlineColor); - BatchText(batcher, primaryLayout.GetTextureSet(), - positions, texCoord, - fontColor, outlineColor, - primaryLayout.GetGlyphCount(), handle); - } - - float const secondaryDx = isPrimaryLonger ? halfLengthDiff : 0.0f; - PointF const secondaryPixelOffset = PointF(secondaryDx, 0.0f) + anchorOffset + m_params.m_primaryOffset; - - { - dp::OverlayHandle * handle = secondaryLayout.LayoutText(m_params.m_featureID, m_basePoint, - secondaryPixelOffset, m_params.m_depth, - positions, texCoord, fontColor, outlineColor); - BatchText(batcher, secondaryLayout.GetTextureSet(), - positions, texCoord, - fontColor, outlineColor, - secondaryLayout.GetGlyphCount(), handle); - } + BatchText(batcher, secondaryLayout.GetTextureSet(), + positions, texCoord, + fontColor, outlineColor, + secondaryLayout.GetGlyphCount(), handle); } } diff --git a/drape_frontend/text_shape.hpp b/drape_frontend/text_shape.hpp index f5d8804ee3..baa5a349ed 100644 --- a/drape_frontend/text_shape.hpp +++ b/drape_frontend/text_shape.hpp @@ -10,6 +10,7 @@ namespace df { +class TextLayout; class TextShape : public MapShape { public: @@ -17,6 +18,11 @@ public: void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; +private: + void DrawSingleLine(dp::RefPointer batcher, TextLayout const & layout) const; + void DrawDoubleLine(dp::RefPointer batcher, TextLayout const & primaryLayout, + TextLayout const & secondaryLayout) const; + private: m2::PointF m_basePoint; TextViewParams m_params;