[Libreoffice-commits] core.git: Branch 'feature/commonsallayout' - vcl/inc vcl/source
Khaled Hosny
khaledhosny at eglug.org
Wed Sep 14 22:25:56 UTC 2016
Rebased ref, commits from common ancestor:
commit 237c3792711ff7a6dd376369c307c1901f379bc1
Author: Khaled Hosny <khaledhosny at eglug.org>
Date: Sun Sep 11 10:25:46 2016 +0200
Override GetCharWidths and ApplyDXArray in CSL
A much simpler and saner implementation. This also unbreaks Awami
Nastaliq.
Break kashida justification, will need to rewrite that one as well.
Change-Id: I843679e937f2881e77df61f5cbd9516b6df1b3b6
diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx
index 83de5c1..179eee88 100644
--- a/vcl/inc/CommonSalLayout.hxx
+++ b/vcl/inc/CommonSalLayout.hxx
@@ -65,4 +65,7 @@ public:
virtual bool LayoutText(ImplLayoutArgs&) override;
virtual void DrawText( SalGraphics& ) const override;
std::shared_ptr<vcl::TextLayoutCache> CreateTextLayoutCache(OUString const&) const override;
+
+ virtual bool GetCharWidths(DeviceCoordinate* pCharWidths) const;
+ virtual void ApplyDXArray(ImplLayoutArgs&);
};
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index cfb2930..1050943 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -326,7 +326,7 @@ public:
void AppendGlyph( const GlyphItem& );
void Reserve(int size) { m_GlyphItems.reserve(size + 1); }
virtual void AdjustLayout( ImplLayoutArgs& ) override;
- void ApplyDXArray( ImplLayoutArgs& );
+ virtual void ApplyDXArray( ImplLayoutArgs& );
void Justify( DeviceCoordinate nNewWidth );
void KashidaJustify( long nIndex, int nWidth );
void ApplyAsianKerning(const OUString& rStr);
@@ -352,7 +352,7 @@ protected:
virtual void DropGlyph( int nStart ) override;
virtual void Simplify( bool bIsBase ) override;
- bool GetCharWidths( DeviceCoordinate* pCharWidths ) const;
+ virtual bool GetCharWidths( DeviceCoordinate* pCharWidths ) const;
std::vector<GlyphItem> m_GlyphItems;
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 509086d..ea4e5f9 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -486,3 +486,53 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
return true;
}
+
+bool CommonSalLayout::GetCharWidths(DeviceCoordinate* pCharWidths) const
+{
+ int nCharCount = mnEndCharPos - mnMinCharPos;
+
+ for (int i = 0; i < nCharCount; ++i)
+ pCharWidths[i] = 0;
+
+ for (auto const& aGlyphItem : m_GlyphItems)
+ pCharWidths[aGlyphItem.mnCharPos - mnMinCharPos] += aGlyphItem.mnNewWidth;
+
+ return true;
+}
+
+void CommonSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
+{
+ int nCharCount = mnEndCharPos - mnMinCharPos;
+ DeviceCoordinate pOldCharWidths[nCharCount];
+ DeviceCoordinate pNewCharWidths[nCharCount];
+
+ GetCharWidths(pOldCharWidths);
+
+ for (int i = 0; i < nCharCount; ++i)
+ {
+ if (i == 0)
+ pNewCharWidths[i] = rArgs.mpDXArray[i];
+ else
+ pNewCharWidths[i] = rArgs.mpDXArray[i] - rArgs.mpDXArray[i - 1];
+ }
+
+ DeviceCoordinate nDelta = 0;
+ size_t i = 0;
+ while (i < m_GlyphItems.size())
+ {
+ int nCharPos = m_GlyphItems[i].mnCharPos - mnMinCharPos;
+ DeviceCoordinate nDiff = pNewCharWidths[nCharPos] - pOldCharWidths[nCharPos];
+
+ m_GlyphItems[i].maLinearPos.X() += nDelta;
+ size_t j = i;
+ while (++j < m_GlyphItems.size())
+ {
+ if (m_GlyphItems[j].mnCharPos != m_GlyphItems[i].mnCharPos)
+ break;
+ m_GlyphItems[j].maLinearPos.X() += nDelta;
+ }
+
+ nDelta += nDiff;
+ i = j;
+ }
+}
More information about the Libreoffice-commits
mailing list