summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2018-10-29 13:32:03 +0000
committerJan-Marek Glogowski <glogow@fbihome.de>2018-10-30 12:45:47 +0100
commit71507ba3eb4bc6e8b36cd66b865c49a1b66b787e (patch)
tree009ba1c21f8d0f94e9fcda83c84358568239e890 /vcl
parentadf71090c94b90d95d3b320e070d53b7071751cd (diff)
tdf#120982 add font reference to SalLayoutGlyphsImpl
Now that we store the LogicalFontInstance instead of the fallback level, it's not enough to keep a pointer in the glyphs in SalLayoutGlyphsImpl. We also need a reference to the font, to keep the font instance alive. Change-Id: Idc99cf9259af6be672a97ab2c67dbffd9cf29c70 Reviewed-on: https://gerrit.libreoffice.org/62520 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/impglyphitem.hxx24
-rw-r--r--vcl/inc/sallayout.hxx4
-rw-r--r--vcl/source/gdi/CommonSalLayout.cxx21
-rw-r--r--vcl/source/gdi/impglyphitem.cxx16
4 files changed, 46 insertions, 19 deletions
diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx
index 7c5dc66d1d8b..d4c944717419 100644
--- a/vcl/inc/impglyphitem.hxx
+++ b/vcl/inc/impglyphitem.hxx
@@ -92,11 +92,29 @@ VCL_DLLPUBLIC void GlyphItem::CacheGlyphBoundRect(tools::Rectangle& rRect) const
class SalLayoutGlyphsImpl : public std::vector<GlyphItem>
{
- friend class GenericSalLayout;
- friend class SalLayoutGlyphs;
+protected:
void SetPImpl(SalLayoutGlyphs* pFacade) { pFacade->m_pImpl = this; }
- SalLayoutGlyphsImpl(SalLayoutGlyphs& rGlyphs) { SetPImpl(&rGlyphs); }
+public:
+ virtual ~SalLayoutGlyphsImpl();
+ virtual SalLayoutGlyphsImpl* clone(SalLayoutGlyphs&) const = 0;
+};
+
+class SalGenericLayoutGlyphsImpl : public SalLayoutGlyphsImpl
+{
+ friend class GenericSalLayout;
+
+ const rtl::Reference<LogicalFontInstance> m_rFontInstance;
+
+ SalGenericLayoutGlyphsImpl(SalLayoutGlyphs& rGlyphs, LogicalFontInstance& rFontInstance)
+ : m_rFontInstance(&rFontInstance)
+ {
+ SetPImpl(&rGlyphs);
+ }
+
+public:
+ SalLayoutGlyphsImpl* clone(SalLayoutGlyphs& rGlyphs) const override;
+ LogicalFontInstance& GetFont() const { return *m_rFontInstance; }
};
#endif // INCLUDED_VCL_IMPGLYPHITEM_HXX
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 972631d838e8..56c25f9d70c4 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -181,7 +181,8 @@ public:
void GetCaretPositions(int nArraySize, long* pCaretXArray) const final override;
// used by display layers
- LogicalFontInstance& GetFont() const { return *mpFont; }
+ LogicalFontInstance& GetFont() const
+ { return static_cast<SalGenericLayoutGlyphsImpl*>(m_GlyphItems.Impl())->GetFont(); }
bool GetNextGlyph(const GlyphItem** pGlyph, Point& rPos, int& nStart,
const PhysicalFontFace** pFallbackFont = nullptr,
@@ -208,7 +209,6 @@ private:
void ParseFeatures(const OUString& name);
- rtl::Reference<LogicalFontInstance> const mpFont;
css::uno::Reference<css::i18n::XBreakIterator> mxBreak;
SalLayoutGlyphs m_GlyphItems;
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 0fc540fcb823..21d4d1c22ad3 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -57,11 +57,10 @@ static hb_unicode_funcs_t* getUnicodeFuncs()
#endif
GenericSalLayout::GenericSalLayout(LogicalFontInstance &rFont)
- : mpFont(&rFont)
- , mpVertGlyphs(nullptr)
+ : mpVertGlyphs(nullptr)
, mbFuzzing(utl::ConfigManager::IsFuzzing())
{
- new SalLayoutGlyphsImpl(m_GlyphItems);
+ new SalGenericLayoutGlyphsImpl(m_GlyphItems, rFont);
}
GenericSalLayout::~GenericSalLayout()
@@ -230,7 +229,7 @@ void GenericSalLayout::DrawText(SalGraphics& rSalGraphics) const
bool GenericSalLayout::HasVerticalAlternate(sal_UCS4 aChar, sal_UCS4 aVariationSelector)
{
hb_codepoint_t nGlyphIndex = 0;
- hb_font_t *pHbFont = mpFont->GetHbFont();
+ hb_font_t *pHbFont = GetFont().GetHbFont();
if (!hb_font_get_glyph(pHbFont, aChar, aVariationSelector, &nGlyphIndex))
return false;
@@ -277,7 +276,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
return true;
}
- hb_font_t *pHbFont = mpFont->GetHbFont();
+ hb_font_t *pHbFont = GetFont().GetHbFont();
int nGlyphCapacity = 2 * (rArgs.mnEndCharPos - rArgs.mnMinCharPos);
m_GlyphItems.Impl()->reserve(nGlyphCapacity);
@@ -304,7 +303,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs);
#endif
- const FontSelectPattern& rFontSelData = mpFont->GetFontSelectPattern();
+ const FontSelectPattern& rFontSelData = GetFont().GetFontSelectPattern();
if (rArgs.mnFlags & SalLayoutFlags::DisableKerning)
{
SAL_INFO("vcl.harfbuzz", "Disabling kerning for font: " << rFontSelData.maTargetName);
@@ -315,7 +314,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
double nXScale = 0;
double nYScale = 0;
- mpFont->GetScale(&nXScale, &nYScale);
+ GetFont().GetScale(&nXScale, &nYScale);
Point aCurrPos(0, 0);
while (true)
@@ -571,7 +570,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
Point aNewPos(aCurrPos.X() + nXOffset, aCurrPos.Y() + nYOffset);
const GlyphItem aGI(nCharPos, nCharCount, nGlyphIndex, aNewPos, nGlyphFlags,
- nAdvance, nXOffset, mpFont.get());
+ nAdvance, nXOffset, &GetFont());
m_GlyphItems.Impl()->push_back(aGI);
aCurrPos.AdjustX(nAdvance );
@@ -644,10 +643,10 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
hb_codepoint_t nKashidaIndex = 0;
if (rArgs.mnFlags & SalLayoutFlags::KashidaJustification)
{
- hb_font_t *pHbFont = mpFont->GetHbFont();
+ hb_font_t *pHbFont = GetFont().GetHbFont();
// Find Kashida glyph width and index.
if (hb_font_get_glyph(pHbFont, 0x0640, 0, &nKashidaIndex))
- nKashidaWidth = mpFont->GetKashidaWidth();
+ nKashidaWidth = GetFont().GetKashidaWidth();
bKashidaJustify = nKashidaWidth != 0;
}
@@ -768,7 +767,7 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
int const nFlags = GlyphItem::IS_IN_CLUSTER | GlyphItem::IS_RTL_GLYPH;
while (nCopies--)
{
- GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, mpFont.get());
+ GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, &GetFont());
pGlyphIter = m_GlyphItems.Impl()->insert(pGlyphIter, aKashida);
aPos.AdjustX(nKashidaWidth );
aPos.AdjustX( -nOverlap );
diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx
index ee30ee5ab2df..47125f6cd595 100644
--- a/vcl/source/gdi/impglyphitem.cxx
+++ b/vcl/source/gdi/impglyphitem.cxx
@@ -30,9 +30,10 @@ SalLayoutGlyphs::SalLayoutGlyphs(const SalLayoutGlyphs& rOther) { *m_pImpl = *rO
SalLayoutGlyphs& SalLayoutGlyphs::operator=(const SalLayoutGlyphs& rOther)
{
- if (!m_pImpl)
- m_pImpl = new SalLayoutGlyphsImpl(*this);
- *m_pImpl = *rOther.m_pImpl;
+ if (m_pImpl)
+ *m_pImpl = *rOther.m_pImpl;
+ else
+ m_pImpl = rOther.m_pImpl->clone(*this);
return *this;
}
@@ -44,4 +45,13 @@ void SalLayoutGlyphs::clear()
m_pImpl->clear();
}
+SalLayoutGlyphsImpl::~SalLayoutGlyphsImpl() {}
+
+SalLayoutGlyphsImpl* SalGenericLayoutGlyphsImpl::clone(SalLayoutGlyphs& rGlyphs) const
+{
+ SalLayoutGlyphsImpl* pNew = new SalGenericLayoutGlyphsImpl(rGlyphs, *m_rFontInstance);
+ *pNew = *this;
+ return pNew;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */