diff --git a/yg/glyph_layout.cpp b/yg/glyph_layout.cpp index 4459237d7a..731a7693bf 100644 --- a/yg/glyph_layout.cpp +++ b/yg/glyph_layout.cpp @@ -67,7 +67,8 @@ namespace yg : m_firstVisible(0), m_lastVisible(visText.size()), m_fontDesc(fontDesc), - m_pivot(pt) + m_pivot(pt), + m_offset(0, 0) { m_entries.reserve(visText.size()); m_metrics.reserve(visText.size()); @@ -145,7 +146,8 @@ namespace yg m_pos(src.m_pos), m_fontDesc(src.m_fontDesc), m_metrics(src.m_metrics), - m_pivot(0, 0) + m_pivot(0, 0), + m_offset(0, 0) { if (!m_fontDesc.IsValid()) return; @@ -167,7 +169,8 @@ namespace yg m_visText(visText), m_pos(pos), m_fontDesc(fontDesc), - m_pivot(0, 0) + m_pivot(0, 0), + m_offset(0, 0) { if (!m_fontDesc.IsValid()) return; @@ -412,6 +415,19 @@ namespace yg m_pivot = pivot; } + m2::PointD const & GlyphLayout::offset() const + { + return m_offset; + } + + void GlyphLayout::setOffset(m2::PointD const & offset) + { + for (unsigned i = 0; i < m_boundRects.size(); ++i) + m_boundRects[i].Offset(offset - m_offset); + + m_offset = offset; + } + yg::FontDesc const & GlyphLayout::fontDesc() const { return m_fontDesc; diff --git a/yg/glyph_layout.hpp b/yg/glyph_layout.hpp index 23bcc26179..532f46ee50 100644 --- a/yg/glyph_layout.hpp +++ b/yg/glyph_layout.hpp @@ -50,6 +50,7 @@ namespace yg buffer_vector m_boundRects; m2::PointD m_pivot; + m2::PointD m_offset; double getKerning(GlyphLayoutElem const & prevElem, GlyphMetrics const & prevMetrics, GlyphLayoutElem const & curElem, GlyphMetrics const & curMetrics); void computeBoundRects(); @@ -86,9 +87,12 @@ namespace yg buffer_vector const & metrics() const; buffer_vector const & boundRects() const; - m2::PointD const & pivot() const; yg::FontDesc const & fontDesc() const; + m2::PointD const & pivot() const; void setPivot(m2::PointD const & pv); + + m2::PointD const & offset() const; + void setOffset(m2::PointD const & offs); }; } diff --git a/yg/overlay_element.hpp b/yg/overlay_element.hpp index 03e55fd178..c693c15aa2 100644 --- a/yg/overlay_element.hpp +++ b/yg/overlay_element.hpp @@ -68,6 +68,9 @@ namespace yg m2::PointD const & pivot() const; void setPivot(m2::PointD const & pv); + m2::PointD const & offset() const; + void setOffset(m2::PointD const & offs); + yg::EPosition position() const; void setPosition(yg::EPosition pos); diff --git a/yg/straight_text_element.cpp b/yg/straight_text_element.cpp index 10090db0b5..3ad29fe91d 100644 --- a/yg/straight_text_element.cpp +++ b/yg/straight_text_element.cpp @@ -226,7 +226,10 @@ namespace yg setPivot(pivot() * m); for (unsigned i = 0; i < m_glyphLayouts.size(); ++i) - m_glyphLayouts[i].setPivot(pivot() + m_offsets[i]); + { + m_glyphLayouts[i].setPivot(pivot()); + m_glyphLayouts[i].setOffset(m_offsets[i]); + } } vector const & StraightTextElement::boundRects() const diff --git a/yg/text_element.cpp b/yg/text_element.cpp index fa24e73143..13633ce6e9 100644 --- a/yg/text_element.cpp +++ b/yg/text_element.cpp @@ -83,6 +83,7 @@ namespace yg return; m2::PointD pv = layout.pivot(); + m2::PointD offs = layout.offset(); double deltaA = 0; if (doTransformPivotOnly) @@ -113,12 +114,12 @@ namespace yg if (doTransformPivotOnly) { - glyphPt = pv + elem.m_pt; + glyphPt = pv + offs + elem.m_pt; glyphAngle = elem.m_angle; } else { - glyphPt = (pv + elem.m_pt) * m; + glyphPt = (pv + offs + elem.m_pt) * m; glyphAngle = ang::AngleD(elem.m_angle.val() + deltaA); }