vcl/generic/glyphs/gcach_layout.cxx | 2 - vcl/inc/sallayout.hxx | 11 +++++++++- vcl/source/gdi/sallayout.cxx | 37 ++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-)
New commits: commit 8e33c9be8780806359e3bbb8c7c5788169f4d2e1 Author: Chris Sherlock <chris.sherl...@collabora.com> Date: Wed Jan 28 17:49:05 2015 +1100 vcl: add GenericSalLayout::GetTextRect() I have extended GlyphItem to also record the original and new height, along with the y offset. Change-Id: I1e9646a8f0d844951d5533d035d9a16dbc8e257c Reviewed-on: https://gerrit.libreoffice.org/14216 Reviewed-by: Chris Sherlock <chris.sherloc...@gmail.com> Tested-by: Chris Sherlock <chris.sherloc...@gmail.com> diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx index ae4a2f7..a6f86ee 100644 --- a/vcl/generic/glyphs/gcach_layout.cxx +++ b/vcl/generic/glyphs/gcach_layout.cxx @@ -514,7 +514,7 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) int32_t nYAdvance = pHbPositions[i].y_advance >> 6; Point aNewPos = Point(aCurrPos.X() + nXOffset, -(aCurrPos.Y() + nYOffset)); - const GlyphItem aGI(nCharPos, nGlyphIndex, aNewPos, nGlyphFlags, nXAdvance, nXOffset); + const GlyphItem aGI(nCharPos, nGlyphIndex, aNewPos, nGlyphFlags, nXAdvance, nXOffset, nYAdvance, nYOffset); rLayout.AppendGlyph(aGI); aCurrPos.X() += nXAdvance; diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index e77cb00..f295c3e 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -273,9 +273,15 @@ struct GlyphItem { int mnFlags; int mnCharPos; // index in string + int mnOrigWidth; // original glyph width int mnNewWidth; // width after adjustments int mnXOffset; + + int mnOrigHeight; // original glyph height + int mnNewHeight; // width after adjustments + int mnYOffset; + sal_GlyphId maGlyphId; Point maLinearPos; // absolute position of non rotated string @@ -298,10 +304,12 @@ public: {} GlyphItem( int nCharPos, sal_GlyphId aGlyphId, const Point& rLinearPos, - long nFlags, int nOrigWidth, int nXOffset ) + long nFlags, int nOrigWidth, int nXOffset, int nOrigHeight, int nYOffset ) : mnFlags(nFlags), mnCharPos(nCharPos), mnOrigWidth(nOrigWidth), mnNewWidth(nOrigWidth), mnXOffset(nXOffset), + mnOrigHeight(nOrigHeight), mnNewHeight(nOrigHeight), + mnYOffset(nYOffset), maGlyphId(aGlyphId), maLinearPos(rLinearPos) {} @@ -330,6 +338,7 @@ public: // used by upper layers virtual DeviceCoordinate GetTextWidth() const SAL_OVERRIDE; + virtual Rectangle GetTextRect() const; virtual DeviceCoordinate FillDXArray( DeviceCoordinate* pDXArray ) const SAL_OVERRIDE; virtual sal_Int32 GetTextBreak(DeviceCoordinate nMaxWidth, DeviceCoordinate nCharExtra, int nFactor) const SAL_OVERRIDE; virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const SAL_OVERRIDE; diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index 245b821..27bb7e1 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -945,6 +945,43 @@ DeviceCoordinate GenericSalLayout::GetTextWidth() const return nWidth; } +Rectangle GenericSalLayout::GetTextRect() const +{ + if( m_GlyphItems.empty() ) + return Rectangle(Point(0, 0), Size(0, 0)); + + // initialize the extent + DeviceCoordinate nMinXPos = 0; + DeviceCoordinate nMaxXPos = 0; + + DeviceCoordinate nMinYPos = 0; + DeviceCoordinate nMaxYPos = 0; + + for( GlyphVector::const_iterator pGlyphIter = m_GlyphItems.begin(), end = m_GlyphItems.end(); pGlyphIter != end ; ++pGlyphIter ) + { + // update the text extent with the glyph extent + DeviceCoordinate nXPos = pGlyphIter->maLinearPos.X(); + DeviceCoordinate nYPos = pGlyphIter->maLinearPos.Y(); + + if( nMinXPos > nXPos ) + nMinXPos = nXPos; + nXPos += pGlyphIter->mnNewWidth - pGlyphIter->mnXOffset; + if( nMaxXPos < nXPos ) + nMaxXPos = nXPos; + + if( nMinYPos > nYPos ) + nMinYPos = nYPos; + nYPos += pGlyphIter->mnNewWidth - pGlyphIter->mnYOffset; + if( nMaxYPos < nYPos ) + nMaxYPos = nYPos; + } + + DeviceCoordinate nWidth = nMaxXPos - nMinXPos; + DeviceCoordinate nHeight = nMaxYPos - nMinYPos; + + return Rectangle( Point(nMinXPos, nMinYPos), Size(nWidth, nHeight) ); +} + void GenericSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) { SalLayout::AdjustLayout( rArgs ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits