From 825a64df54adc5ea944543d49df68f0965536143 Mon Sep 17 00:00:00 2001 From: ExMix Date: Wed, 5 Nov 2014 15:49:10 +0300 Subject: [PATCH] [drape] text shapes refactoring --- drape_frontend/apply_feature_functors.cpp | 7 +- drape_frontend/apply_feature_functors.hpp | 4 +- drape_frontend/path_text_shape.cpp | 31 ++--- drape_frontend/path_text_shape.hpp | 10 +- drape_frontend/rule_drawer.cpp | 7 +- drape_frontend/rule_drawer.hpp | 1 - drape_frontend/shape_view_params.hpp | 1 + drape_frontend/text_layout.cpp | 152 +++++++++++----------- drape_frontend/text_layout.hpp | 33 +++-- drape_frontend/text_shape.cpp | 63 +++++---- drape_frontend/text_shape.hpp | 2 - 11 files changed, 148 insertions(+), 163 deletions(-) diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index 4f2dbe8b32..4ddac68089 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -279,11 +279,9 @@ void ApplyAreaFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) ApplyLineFeature::ApplyLineFeature(EngineContext & context, TileKey tileKey, FeatureID const & id, CaptionDescription const & captions, - double currentScaleGtoP, - double nextScaleGtoP) + double currentScaleGtoP) : TBase(context, tileKey, id, captions) , m_currentScaleGtoP(currentScaleGtoP) - , m_nextScaleGtoP(nextScaleGtoP) { } @@ -325,8 +323,9 @@ void ApplyLineFeature::ProcessRule(Stylist::rule_wrapper_t const & rule) params.m_depth = depth; params.m_text = m_captions.GetPathName(); params.m_textFont = fontDecl; + params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(m_tileKey, dp::MovePointer(new PathTextShape(m_spline, params, m_currentScaleGtoP))); + m_context.InsertShape(m_tileKey, dp::MovePointer(new PathTextShape(m_spline, params))); } if (pLineRule != NULL) diff --git a/drape_frontend/apply_feature_functors.hpp b/drape_frontend/apply_feature_functors.hpp index 2898d4c5e4..740b4b8a15 100644 --- a/drape_frontend/apply_feature_functors.hpp +++ b/drape_frontend/apply_feature_functors.hpp @@ -88,8 +88,7 @@ public: TileKey tileKey, FeatureID const & id, CaptionDescription const & captions, - double currentScaleGtoP, - double nextScaleGtoP); + double currentScaleGtoP); void operator ()(CoordPointT const & point); bool HasGeometry() const; @@ -99,7 +98,6 @@ public: private: m2::SharedSpline m_spline; double m_currentScaleGtoP; - double m_nextScaleGtoP; }; } // namespace df diff --git a/drape_frontend/path_text_shape.cpp b/drape_frontend/path_text_shape.cpp index c0c7a495e8..261f0bee94 100644 --- a/drape_frontend/path_text_shape.cpp +++ b/drape_frontend/path_text_shape.cpp @@ -22,7 +22,6 @@ #include "../std/vector.hpp" using m2::Spline; -using glsl_types::vec2; namespace { @@ -95,9 +94,9 @@ namespace void GetAttributeMutation(dp::RefPointer mutator, ScreenBase const & screen) const { ASSERT(IsValid(), ()); - uint32_t byteCount = 4 * m_layout->GetGlyphCount() * sizeof(glsl_types::vec2); + uint32_t byteCount = 4 * m_layout->GetGlyphCount() * sizeof(glsl::vec2); void * buffer = mutator->AllocateMutationBuffer(byteCount); - df::IntrusiveVector positions(buffer, byteCount); + df::IntrusiveVector positions(buffer, byteCount); // m_splineOffset set offset to Center of text. // By this we calc offset for start of text in mercator m_layout->LayoutPathText(m_begin, m_scalePtoG, positions, m_isForward, m_bboxes, screen); @@ -138,10 +137,10 @@ namespace float depth, dp::RefPointer batcher, df::SharedTextLayout const & layout, - vector & positions, - vector & texCoord, - vector & fontColor, - vector & index, + vector & positions, + vector & texCoord, + vector & fontColor, + vector & index, dp::RefPointer textures) { ASSERT(!offsets.empty(), ()); @@ -205,11 +204,9 @@ namespace df { PathTextShape::PathTextShape(m2::SharedSpline const & spline, - PathTextViewParams const & params, - float const scaleGtoP) + PathTextViewParams const & params) : m_spline(spline) , m_params(params) - , m_scaleGtoP(scaleGtoP) { } @@ -231,10 +228,10 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointerGetLength(); // on next readable scale m_scaleGtoP will be twice - if (textLength > pathGlbLength * 2 * m_scaleGtoP) + if (textLength > pathGlbLength * 2 * m_params.m_baseGtoPScale) return; - float const pathLength = m_scaleGtoP * m_spline->GetLength(); + float const pathLength = m_params.m_baseGtoPScale * m_spline->GetLength(); /// copied from old code /// @todo Choose best constant for minimal space. @@ -242,13 +239,13 @@ void PathTextShape::Draw(dp::RefPointer batcher, dp::RefPointer positions(glyphCount, vec2(0.0, 0.0)); - vector texCoords(glyphCount); - vector fontColor(glyphCount); - vector index(glyphCount); + vector positions(glyphCount, glsl::vec2(0.0, 0.0)); + vector texCoords(glyphCount); + vector fontColor(glyphCount); + vector index(glyphCount); buffer_vector offsets; - float const scalePtoG = 1.0f / m_scaleGtoP; + float const scalePtoG = 1.0f / m_params.m_baseGtoPScale; if (pathLength < twoTextAndEmpty) { diff --git a/drape_frontend/path_text_shape.hpp b/drape_frontend/path_text_shape.hpp index 3921ed6132..3468665cca 100644 --- a/drape_frontend/path_text_shape.hpp +++ b/drape_frontend/path_text_shape.hpp @@ -2,13 +2,7 @@ #include "map_shape.hpp" #include "shape_view_params.hpp" -#include "common_structures.hpp" -#include "../drape/overlay_handle.hpp" - -#include "../std/vector.hpp" - -#include "../geometry/point2d.hpp" #include "../geometry/spline.hpp" namespace df @@ -18,14 +12,12 @@ class PathTextShape : public MapShape { public: PathTextShape(m2::SharedSpline const & spline, - PathTextViewParams const & params, - float const scaleGtoP); + PathTextViewParams const & params); virtual void Draw(dp::RefPointer batcher, dp::RefPointer textures) const; private: m2::SharedSpline m_spline; PathTextViewParams m_params; - float const m_scaleGtoP; }; } // namespace df diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index 3ed7c5f713..083c31894d 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -24,11 +24,6 @@ RuleDrawer::RuleDrawer(drawer_callback_fn const & fn, TileKey const & tileKey, E m_geometryConvertor.OnSize(0, 0, tileSize, tileSize); m_geometryConvertor.SetFromRect(m2::AnyRectD(m_globalRect)); m_currentScaleGtoP = 1.0f / m_geometryConvertor.GetScale(); - - int nextDrawScale = df::GetDrawTileScale(m_globalRect) + 1; - m2::RectD nextScaleRect = df::GetRectForDrawScale(nextDrawScale, m_globalRect.Center()); - ScreenBase nextScaleScreen(m2::RectI(m_geometryConvertor.PixelRect()), m2::AnyRectD(nextScaleRect)); - m_nextScaleGtoP = 1.0f / nextScaleScreen.GetScale(); } void RuleDrawer::operator()(FeatureType const & f) @@ -67,7 +62,7 @@ void RuleDrawer::operator()(FeatureType const & f) { ApplyLineFeature apply(m_context, m_tileKey, f.GetID(), s.GetCaptionDescription(), - m_currentScaleGtoP, m_nextScaleGtoP); + m_currentScaleGtoP); f.ForEachPointRef(apply, m_tileKey.m_zoomLevel); if (apply.HasGeometry()) diff --git a/drape_frontend/rule_drawer.hpp b/drape_frontend/rule_drawer.hpp index 1b845c6972..f80952d28a 100644 --- a/drape_frontend/rule_drawer.hpp +++ b/drape_frontend/rule_drawer.hpp @@ -34,7 +34,6 @@ private: m2::RectD m_globalRect; ScreenBase m_geometryConvertor; double m_currentScaleGtoP; - double m_nextScaleGtoP; set m_coastlines; }; diff --git a/drape_frontend/shape_view_params.hpp b/drape_frontend/shape_view_params.hpp index c616e0dd96..04d8ce2091 100644 --- a/drape_frontend/shape_view_params.hpp +++ b/drape_frontend/shape_view_params.hpp @@ -72,6 +72,7 @@ struct PathTextViewParams : CommonViewParams { FontDecl m_textFont; string m_text; + float m_baseGtoPScale; }; struct PathSymbolViewParams : CommonViewParams diff --git a/drape_frontend/text_layout.cpp b/drape_frontend/text_layout.cpp index 12c64141d9..c95a519043 100644 --- a/drape_frontend/text_layout.cpp +++ b/drape_frontend/text_layout.cpp @@ -1,33 +1,33 @@ #include "text_layout.hpp" +#include "../drape/glsl_func.hpp" + +#include "../drape/overlay_handle.hpp" + #include "../std/numeric.hpp" #include "../std/algorithm.hpp" #include "../std/bind.hpp" -#include "../std/algorithm.hpp" #include "../std/limits.hpp" -using glsl_types::vec4; -using glsl_types::Quad1; -using glsl_types::Quad4; - namespace { -void FillColor(vector & colors, + +void FillColor(vector & colors, dp::TextureSetHolder::ColorRegion & region, dp::Color const & base, dp::Color const & outline, dp::RefPointer textures) - { +{ dp::ColorKey key(base.GetColorInInt()); textures->GetColorRegion(key, region); - m2::RectF const & rect = region.GetTexRect(); + m2::PointF const color = region.GetTexRect().Center(); key.SetColor(outline.GetColorInInt()); textures->GetColorRegion(key, region); - m2::RectF const & outlineRect = region.GetTexRect(); + m2::PointF const mask = region.GetTexRect().Center(); + + glsl::vec4 clrs(color.x, color.y, mask.x, mask.y); + fill(colors.begin(), colors.end(), glsl::Quad4(clrs, clrs, clrs, clrs)); +} - vec4 clrs(rect.RightTop(), outlineRect.RightTop()); - Quad4 f(clrs, clrs, clrs, clrs); - fill(colors.begin(), colors.end(), f); - } } namespace df @@ -36,8 +36,8 @@ namespace df class StraightTextHandle : public dp::OverlayHandle { public: - StraightTextHandle(FeatureID const & id, m2::PointD const & pivot, - m2::PointD const & pxSize, m2::PointD const & offset, + StraightTextHandle(FeatureID const & id, glsl::vec2 const & pivot, + glsl::vec2 const & pxSize, glsl::vec2 const & offset, double priority) : OverlayHandle(id, dp::LeftBottom, priority) , m_pivot(pivot) @@ -48,8 +48,8 @@ public: m2::RectD GetPixelRect(ScreenBase const & screen) const { - m2::PointD const pivot = screen.GtoP(m_pivot) + m_offset; - return m2::RectD(pivot, pivot + m_size); + m2::PointD const pivot = screen.GtoP(m2::PointD(m_pivot.x, m_pivot.y)) + m2::PointD(m_offset.x, m_offset.y); + return m2::RectD(pivot, pivot + m2::PointD(m_size.x, m_size.y)); } void GetPixelShape(ScreenBase const & screen, Rects & rects) const @@ -58,9 +58,9 @@ public: rects.push_back(m2::RectF(rd.minX(), rd.minY(), rd.maxX(), rd.maxY())); } private: - m2::PointD m_pivot; - m2::PointD m_offset; - m2::PointD m_size; + glsl::vec2 m_pivot; + glsl::vec2 m_offset; + glsl::vec2 m_size; }; namespace @@ -99,30 +99,30 @@ TextLayout::TextLayout(strings::UniString const & string, #endif } -dp::OverlayHandle * LayoutText(const FeatureID & featureID, - m2::PointF const & pivot, +dp::OverlayHandle * LayoutText(FeatureID const & featureID, + glsl::vec2 const & pivot, vector::iterator & layoutIter, - vector::iterator & pixelOffsetIter, + vector::iterator & pixelOffsetIter, float depth, - vector & positions, - vector & texCoord, - vector & color, - vector & index, + vector & positions, + vector & texCoord, + vector & color, + vector & index, dp::RefPointer textures, int count) { - STATIC_ASSERT(sizeof(vec4) == 4 * sizeof(float)); - STATIC_ASSERT(sizeof(Quad4) == 4 * sizeof(vec4)); + STATIC_ASSERT(sizeof(glsl::vec4) == 4 * sizeof(float)); + STATIC_ASSERT(sizeof(glsl::Quad4) == 4 * sizeof(glsl::vec4)); dp::TextureSetHolder::ColorRegion region; FillColor(color, region, layoutIter->m_font.m_color, layoutIter->m_font.m_outlineColor, textures); - float texIndex = static_cast(region.GetTextureNode().m_textureOffset); - Quad1 f(texIndex, texIndex, texIndex, texIndex); + float texIndex = region.GetTextureNode().GetOffset(); + glsl::Quad1 f(texIndex, texIndex, texIndex, texIndex); fill(index.begin(), index.end(), f); int counter = 0; - m2::PointD size(0.0, 0.0); - m2::PointF offset(numeric_limits::max(), numeric_limits::max()); + glsl::vec2 size(0.0, 0.0); + glsl::vec2 offset(numeric_limits::max(), numeric_limits::max()); float maxOffset = numeric_limits::min(); for (int j = 0; j < count; ++j) { @@ -152,19 +152,19 @@ dp::OverlayHandle * LayoutText(const FeatureID & featureID, maxHeight = max((float)h, maxHeight); minHeight = min(yOffset, minHeight); - Quad4 & position = positions[counter++]; - position.v[0] = vec4(pivot, m2::PointF(glyphOffset + xOffset, yOffset) + *pixelOffsetIter); - position.v[1] = vec4(pivot, m2::PointF(glyphOffset + xOffset, yOffset + h) + *pixelOffsetIter); - position.v[2] = vec4(pivot, m2::PointF(glyphOffset + w + xOffset, yOffset) + *pixelOffsetIter); - position.v[3] = vec4(pivot, m2::PointF(glyphOffset + w + xOffset, yOffset + h) + *pixelOffsetIter); + glsl::Quad4 & position = positions[counter++]; + position[0] = glsl::vec4(pivot, glsl::vec2(glyphOffset + xOffset, yOffset) + *pixelOffsetIter); + position[1] = glsl::vec4(pivot, glsl::vec2(glyphOffset + xOffset, yOffset + h) + *pixelOffsetIter); + position[2] = glsl::vec4(pivot, glsl::vec2(glyphOffset + w + xOffset, yOffset) + *pixelOffsetIter); + position[3] = glsl::vec4(pivot, glsl::vec2(glyphOffset + w + xOffset, yOffset + h) + *pixelOffsetIter); glyphOffset += advance; } glyphOffset += w / 2.0f; - size.x = max(size.x, (double)glyphOffset); + size.x = max(size.x, glyphOffset); offset.x = min(offset.x, pixelOffsetIter->x); offset.y = min(offset.y, pixelOffsetIter->y + minHeight); maxOffset = max(maxOffset, pixelOffsetIter->y + minHeight); - size.y = max(size.y, (double)maxHeight); + size.y = max(size.y, maxHeight); ++layoutIter; ++pixelOffsetIter; } @@ -173,13 +173,13 @@ dp::OverlayHandle * LayoutText(const FeatureID & featureID, } void TextLayout::InitPathText(float depth, - vector & texCoord, - vector & fontColor, - vector & index, + vector & texCoord, + vector & fontColor, + vector & index, dp::RefPointer textures) const { - STATIC_ASSERT(sizeof(vec4) == 4 * sizeof(float)); - STATIC_ASSERT(sizeof(Quad4) == 4 * sizeof(vec4)); + STATIC_ASSERT(sizeof(glsl::vec4) == 4 * sizeof(float)); + STATIC_ASSERT(sizeof(glsl::Quad4) == 4 * sizeof(glsl::vec4)); size_t glyphCount = GetGlyphCount(); ASSERT(glyphCount <= texCoord.size(), ()); @@ -188,8 +188,8 @@ void TextLayout::InitPathText(float depth, dp::TextureSetHolder::ColorRegion region; FillColor(fontColor, region, m_font.m_color, m_font.m_outlineColor, textures); - float texIndex = static_cast(region.GetTextureNode().m_textureOffset); - Quad1 f(texIndex, texIndex, texIndex, texIndex); + float texIndex = region.GetTextureNode().GetOffset(); + glsl::Quad1 f(texIndex, texIndex, texIndex, texIndex); fill(index.begin(), index.end(), f); for (size_t i = 0; i < glyphCount; ++i) @@ -198,7 +198,7 @@ void TextLayout::InitPathText(float depth, void TextLayout::LayoutPathText(m2::Spline::iterator const & iterator, float const scalePtoG, - IntrusiveVector & positions, + IntrusiveVector & positions, bool isForwardDirection, vector & rects, ScreenBase const & screen) const @@ -226,14 +226,14 @@ void TextLayout::LayoutPathText(m2::Spline::iterator const & iterator, advance *= scalePtoG; ASSERT_NOT_EQUAL(advance, 0.0, ()); - m2::PointD pos = itr.m_pos; + glsl::vec2 pos = glsl::ToVec2(itr.m_pos); double cosa = 1.0; - m2::PointD dir; - m2::PointD posOffset; + glsl::vec2 dir; + glsl::vec2 posOffset; if (itr.GetLength() <= tentacleLength || itr.GetLength() >= itr.GetFullLength() - tentacleLength) { - dir = itr.m_avrDir.Normalize(); + dir = glsl::normalize(glsl::ToVec2(itr.m_avrDir)); } else { @@ -241,37 +241,43 @@ void TextLayout::LayoutPathText(m2::Spline::iterator const & iterator, leftTentacle.StepBack(tentacleLength); rightTentacle = itr; rightTentacle.Step(tentacleLength); - dir = (-leftTentacle.m_avrDir + rightTentacle.m_avrDir).Normalize(); - cosa = m2::DotProduct(-leftTentacle.m_avrDir, rightTentacle.m_avrDir) / rightTentacle.m_avrDir.Length() / leftTentacle.m_avrDir.Length(); - posOffset = (leftTentacle.m_pos + rightTentacle.m_pos) / 2.0; - pos = (posOffset + itr.m_pos) / 2.0; + + glsl::vec2 const leftAvrDir = glsl::normalize(glsl::ToVec2(leftTentacle.m_avrDir)); + glsl::vec2 const rightAvrDir = glsl::normalize(glsl::ToVec2(rightTentacle.m_avrDir)); + dir = glsl::normalize(rightAvrDir - leftAvrDir); + cosa = glsl::dot(-leftAvrDir, leftAvrDir); + + glsl::vec2 const leftPos(glsl::ToVec2(leftTentacle.m_pos)); + glsl::vec2 const rightPos(glsl::ToVec2(rightTentacle.m_pos)); + posOffset = (leftPos + rightPos) / 2.0f; + pos = (posOffset + glsl::ToVec2(itr.m_pos)) / 2.0f; } - itr.Step(advance + (1.0 - cosa) * advance * 0.7); + itr.Step(advance + (1.0 - cosa) * advance * 0.1); //ASSERT(!itr.BeginAgain(), ()); - m2::PointD norm(-dir.y, dir.x); + glsl::vec2 norm(-dir.y, dir.x); dir *= halfWidth * scalePtoG; norm *= halfHeight * scalePtoG; - m2::PointD dirComponent; + glsl::vec2 dirComponent; if (isForwardDirection) dirComponent = dir * xOffset / halfWidth; else - dirComponent = dir * (2.0 * halfWidth - xOffset) / halfWidth; + dirComponent = dir * (2.0f * halfWidth - xOffset) / halfWidth; - m2::PointD const normalComponent = -norm * incSign * yOffset / halfHeight; - m2::PointD const pivot = dirComponent + normalComponent + pos; + glsl::vec2 const normalComponent = -norm * (float)incSign * yOffset / halfHeight; + glsl::vec2 const pivot = dirComponent + normalComponent + pos; - positions.PushBack(glsl_types::vec2(pivot - dir + norm)); - positions.PushBack(glsl_types::vec2(pivot - dir - norm)); - positions.PushBack(glsl_types::vec2(pivot + dir + norm)); - positions.PushBack(glsl_types::vec2(pivot + dir - norm)); + positions.PushBack(glsl::vec2(pivot - dir + norm)); + positions.PushBack(glsl::vec2(pivot - dir - norm)); + positions.PushBack(glsl::vec2(pivot + dir + norm)); + positions.PushBack(glsl::vec2(pivot + dir - norm)); - pos = screen.GtoP(pivot); + m2::PointF resPos = screen.GtoP(glsl::ToPoint(pivot)); float maxDim = max(halfWidth, halfHeight); m2::PointF const maxDir(maxDim, maxDim); - rects[i] = m2::RectF(pos - maxDir, pos + maxDir); + rects[i] = m2::RectF(resPos - maxDir, resPos + maxDir); } } @@ -298,17 +304,17 @@ float TextLayout::GetPixelHeight() const void TextLayout::GetTextureQuad(GlyphRegion const & region, float depth, - Quad4 & quad) const + glsl::Quad4 & quad) const { ASSERT(region.IsValid(), ()); m2::RectF const & rect = region.GetTexRect(); uint8_t needOutline = m_font.m_needOutline ? 1 : 0; float textureOffset = static_cast((region.GetTextureNode().m_textureOffset << 1) + needOutline); - quad.v[0] = vec4(rect.minX(), rect.minY(), textureOffset, depth); - quad.v[1] = vec4(rect.minX(), rect.maxY(), textureOffset, depth); - quad.v[2] = vec4(rect.maxX(), rect.minY(), textureOffset, depth); - quad.v[3] = vec4(rect.maxX(), rect.maxY(), textureOffset, depth); + quad[0] = glsl::vec4(rect.minX(), rect.minY(), textureOffset, depth); + quad[1] = glsl::vec4(rect.minX(), rect.maxY(), textureOffset, depth); + quad[2] = glsl::vec4(rect.maxX(), rect.minY(), textureOffset, depth); + quad[3] = glsl::vec4(rect.maxX(), rect.maxY(), textureOffset, depth); } float TextLayout::AccumulateAdvance(double const & currentValue, GlyphRegion const & reg1) const diff --git a/drape_frontend/text_layout.hpp b/drape_frontend/text_layout.hpp index 5079e899a0..05dce46091 100644 --- a/drape_frontend/text_layout.hpp +++ b/drape_frontend/text_layout.hpp @@ -1,14 +1,14 @@ #pragma once -#include "common_structures.hpp" #include "shape_view_params.hpp" #include "intrusive_vector.hpp" +#include "../drape/glsl_types.hpp" #include "../drape/pointers.hpp" #include "../drape/texture_set_holder.hpp" -#include "../drape/overlay_handle.hpp" #include "../geometry/spline.hpp" +#include "../geometry/screenbase.hpp" #include "../base/string_utils.hpp" #include "../base/buffer_vector.hpp" @@ -16,6 +16,11 @@ #include "../std/vector.hpp" #include "../std/shared_ptr.hpp" +namespace dp +{ + class OverlayHandle; +} + namespace df { @@ -28,13 +33,13 @@ public: dp::RefPointer textures); void InitPathText(float depth, - vector & texCoord, - vector & fontColor, - vector & index, + vector & texCoord, + vector & fontColor, + vector & index, dp::RefPointer textures) const; void LayoutPathText(m2::Spline::iterator const & iterator, float const scalePtoG, - IntrusiveVector & positions, + IntrusiveVector & positions, bool isForwardDirection, vector & rects, ScreenBase const & screen) const; @@ -47,7 +52,7 @@ public: private: float AccumulateAdvance(double const & currentValue, GlyphRegion const & reg2) const; void InitMetric(strings::UniChar const & unicodePoint, dp::RefPointer textures); - void GetTextureQuad(GlyphRegion const & region, float depth, glsl_types::Quad4 & quad) const; + void GetTextureQuad(GlyphRegion const & region, float depth, glsl::Quad4 & quad) const; void GetMetrics(int32_t const index, float & xOffset, float & yOffset, float & advance, float & halfWidth, float & halfHeight) const; @@ -56,15 +61,15 @@ private: df::FontDecl m_font; float m_textSizeRatio; - friend dp::OverlayHandle * LayoutText(const FeatureID & featureID, - m2::PointF const & pivot, + friend dp::OverlayHandle * LayoutText(FeatureID const & featureID, + glsl::vec2 const & pivot, vector::iterator & layoutIter, - vector::iterator & pixelOffsetIter, + vector::iterator & pixelOffsetIter, float depth, - vector & positions, - vector & texCoord, - vector & color, - vector & index, + vector & positions, + vector & texCoord, + vector & color, + vector & index, dp::RefPointer textures, int count); }; diff --git a/drape_frontend/text_shape.cpp b/drape_frontend/text_shape.cpp index 1313468f4f..d207b6b983 100644 --- a/drape_frontend/text_shape.cpp +++ b/drape_frontend/text_shape.cpp @@ -1,55 +1,48 @@ #include "text_shape.hpp" -#include "common_structures.hpp" #include "text_layout.hpp" #include "fribidi.hpp" +#include "../drape/glsl_types.hpp" #include "../drape/shader_def.hpp" #include "../drape/attribute_provider.hpp" #include "../drape/glstate.hpp" #include "../drape/batcher.hpp" #include "../drape/texture_set_holder.hpp" -#include "../base/math.hpp" -#include "../base/logging.hpp" -#include "../base/stl_add.hpp" #include "../base/string_utils.hpp" -#include "../std/algorithm.hpp" #include "../std/vector.hpp" -using m2::PointF; - namespace df { -using m2::PointF; - namespace { + float const TEXT_EXPAND_FACTOR = 1.3f; -PointF GetShift(dp::Anchor anchor, float width, float height) +glsl::vec2 GetShift(dp::Anchor anchor, float width, float height) { switch(anchor) { - case dp::Center: return PointF(-width / 2.0f, height / 2.0f); - case dp::Left: return PointF(0.0f, height / 2.0f); - case dp::Right: return PointF(-width, height / 2.0f); - case dp::Top: return PointF(-width / 2.0f, height); - case dp::Bottom: return PointF(-width / 2.0f, 0); - case dp::LeftTop: return PointF(0.0f, height); - case dp::RightTop: return PointF(-width, height); - case dp::LeftBottom: return PointF(0.0f, 0.0f); - case dp::RightBottom: return PointF(-width, 0.0f); - default: return PointF(0.0f, 0.0f); + case dp::Center: return glsl::vec2(-width / 2.0f, height / 2.0f); + case dp::Left: return glsl::vec2(0.0f, height / 2.0f); + case dp::Right: return glsl::vec2(-width, height / 2.0f); + case dp::Top: return glsl::vec2(-width / 2.0f, height); + case dp::Bottom: return glsl::vec2(-width / 2.0f, 0); + case dp::LeftTop: return glsl::vec2(0.0f, height); + case dp::RightTop: return glsl::vec2(-width, height); + case dp::LeftBottom: return glsl::vec2(0.0f, 0.0f); + case dp::RightBottom: return glsl::vec2(-width, 0.0f); + default: return glsl::vec2(0.0f, 0.0f); } } void BatchText(dp::RefPointer batcher, int32_t textureSet, - vector const & positions, - vector const & texCoord, - vector const & color, - vector const & index, + vector const & positions, + vector const & texCoord, + vector const & color, + vector const & index, size_t glyphCount, dp::OverlayHandle * handle) { @@ -255,30 +248,32 @@ void TextShape::DrawMultipleLines(dp::RefPointer batcher, vector positions(symCount); - vector texCoord(symCount); - vector fontColor(symCount); - vector indexes(symCount); + vector positions(symCount); + vector texCoord(symCount); + vector fontColor(symCount); + vector indexes(symCount); float dy = (1.0f - TEXT_EXPAND_FACTOR) * heights[0]; - vector pixelOffset(count); + vector pixelOffset(count); uint32_t delSymCount = 0; uint32_t lastIndex = 0; vector::iterator it1; - vector::iterator it2; + vector::iterator it2; + glsl::vec2 pivot(m_basePoint.x, m_basePoint.y); for (int i = 0; i < count; ++i) { float const dx = (maxLength - lengths[i]) / 2.0f; - pixelOffset[i] = PointF(dx, dy) + anchorOffset + m_params.m_primaryOffset; + pixelOffset[i] = glsl::vec2(dx, dy) + anchorOffset + glsl::vec2(m_params.m_primaryOffset.x, + m_params.m_primaryOffset.y); dy -= heights[i] * TEXT_EXPAND_FACTOR; delSymCount += layouts[i].GetGlyphCount(); if (i == delim) { it2 = pixelOffset.begin(); it1 = layouts.begin(); - dp::OverlayHandle * handle = LayoutText(m_params.m_featureID, m_basePoint, + dp::OverlayHandle * handle = LayoutText(m_params.m_featureID, pivot, it1, it2, m_params.m_depth, positions, texCoord, fontColor, indexes, textures, i + 1); @@ -294,7 +289,7 @@ void TextShape::DrawMultipleLines(dp::RefPointer batcher, vector