[Libreoffice-commits] core.git: include/vcl vcl/inc vcl/Library_vcl.mk vcl/quartz vcl/source vcl/unx vcl/win
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Tue Oct 30 11:45:30 UTC 2018
include/vcl/glyphitem.hxx | 65 ++++-----------------
include/vcl/outdev.hxx | 3
include/vcl/vcllayout.hxx | 4 -
vcl/Library_vcl.mk | 1
vcl/inc/impglyphitem.hxx | 76 +++++++++++++++++++++++--
vcl/inc/sallayout.hxx | 2
vcl/quartz/ctfonts.cxx | 4 -
vcl/source/control/imp_listbox.cxx | 1
vcl/source/gdi/CommonSalLayout.cxx | 53 ++++++++---------
vcl/source/gdi/impglyphitem.cxx | 47 +++++++++++++++
vcl/source/gdi/pdfwriter_impl.cxx | 1
vcl/source/gdi/sallayout.cxx | 48 ++++++++-------
vcl/source/outdev/font.cxx | 1
vcl/source/outdev/text.cxx | 1
vcl/source/outdev/textline.cxx | 1
vcl/source/window/menu.cxx | 2
vcl/source/window/menuitemlist.cxx | 1
vcl/unx/generic/glyphs/freetype_glyphcache.cxx | 4 -
vcl/win/gdi/salfont.cxx | 4 -
19 files changed, 200 insertions(+), 119 deletions(-)
New commits:
commit adf71090c94b90d95d3b320e070d53b7071751cd
Author: Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Sat Oct 27 21:44:39 2018 +0200
Commit: Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Tue Oct 30 12:45:03 2018 +0100
Hide SalLayoutGlyphs details
Nobody outside of VCL should deal with GlyphItems.
Change-Id: Id84b0f320bc49f790658f23efe129b92262c2aea
Reviewed-on: https://gerrit.libreoffice.org/62446
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>
diff --git a/include/vcl/glyphitem.hxx b/include/vcl/glyphitem.hxx
index 5019e5825c47..75213a5b49c5 100644
--- a/include/vcl/glyphitem.hxx
+++ b/include/vcl/glyphitem.hxx
@@ -20,64 +20,27 @@
#ifndef INCLUDED_VCL_GLYPHITEM_HXX
#define INCLUDED_VCL_GLYPHITEM_HXX
-#include <rtl/ref.hxx>
-#include <tools/gen.hxx>
-#include <vcl/dllapi.h>
-
-class LogicalFontInstance;
-
typedef sal_uInt16 sal_GlyphId;
-struct VCL_DLLPUBLIC GlyphItem
-{
- int m_nFlags;
- int m_nCharPos; // index in string
- int m_nCharCount; // number of characters m_aking up this glyph
+struct GlyphItem;
+class SalLayoutGlyphsImpl;
- int m_nOrigWidth; // original glyph width
- int m_nNewWidth; // width after adjustments
- int m_nXOffset;
-
- sal_GlyphId m_aGlyphId;
- Point m_aLinearPos; // absolute position of non rotated string
+class VCL_DLLPUBLIC SalLayoutGlyphs final
+{
+ friend class SalLayoutGlyphsImpl;
+ SalLayoutGlyphsImpl* m_pImpl;
- LogicalFontInstance* m_pFontInstance;
+public:
+ SalLayoutGlyphs();
+ SalLayoutGlyphs(const SalLayoutGlyphs&);
+ ~SalLayoutGlyphs();
- GlyphItem(int nCharPos, int nCharCount, sal_GlyphId aGlyphId, const Point& rLinearPos,
- long nFlags, int nOrigWidth, int nXOffset, LogicalFontInstance* pFontInstance)
- : m_nFlags(nFlags)
- , m_nCharPos(nCharPos)
- , m_nCharCount(nCharCount)
- , m_nOrigWidth(nOrigWidth)
- , m_nNewWidth(nOrigWidth)
- , m_nXOffset(nXOffset)
- , m_aGlyphId(aGlyphId)
- , m_aLinearPos(rLinearPos)
- , m_pFontInstance(pFontInstance)
- {
- assert(pFontInstance);
- }
+ SalLayoutGlyphs& operator=(const SalLayoutGlyphs&);
- enum
- {
- IS_IN_CLUSTER = 0x001,
- IS_RTL_GLYPH = 0x002,
- IS_DIACRITIC = 0x004,
- IS_VERTICAL = 0x008,
- IS_SPACING = 0x010,
- ALLOW_KASHIDA = 0x020,
- IS_DROPPED = 0x040,
- IS_CLUSTER_START = 0x080
- };
+ SalLayoutGlyphsImpl* Impl() const { return m_pImpl; }
- bool IsInCluster() const { return ((m_nFlags & IS_IN_CLUSTER) != 0); }
- bool IsRTLGlyph() const { return ((m_nFlags & IS_RTL_GLYPH) != 0); }
- bool IsDiacritic() const { return ((m_nFlags & IS_DIACRITIC) != 0); }
- bool IsVertical() const { return ((m_nFlags & IS_VERTICAL) != 0); }
- bool IsSpacing() const { return ((m_nFlags & IS_SPACING) != 0); }
- bool AllowKashida() const { return ((m_nFlags & ALLOW_KASHIDA) != 0); }
- bool IsDropped() const { return ((m_nFlags & IS_DROPPED) != 0); }
- bool IsClusterStart() const { return ((m_nFlags & IS_CLUSTER_START) != 0); }
+ bool empty() const;
+ void clear();
};
#endif // INCLUDED_VCL_GLYPHITEM_HXX
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 8970fe0e3788..8f93be10c284 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -31,6 +31,7 @@
#include <vcl/devicecoordinate.hxx>
#include <vcl/dllapi.h>
#include <vcl/font.hxx>
+#include <vcl/glyphitem.hxx>
#include <vcl/region.hxx>
#include <vcl/mapmod.hxx>
#include <vcl/wall.hxx>
@@ -150,8 +151,6 @@ namespace o3tl
}
typedef std::vector< tools::Rectangle > MetricVector;
-struct GlyphItem;
-typedef std::vector<GlyphItem> SalLayoutGlyphs;
// OutputDevice-Types
diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx
index 3237973e9ffc..ced231713966 100644
--- a/include/vcl/vcllayout.hxx
+++ b/include/vcl/vcllayout.hxx
@@ -27,6 +27,7 @@
#include <tools/gen.hxx>
#include <vcl/devicecoordinate.hxx>
#include <vcl/dllapi.h>
+#include <vcl/glyphitem.hxx>
class ImplLayoutArgs;
class PhysicalFontFace;
@@ -36,9 +37,6 @@ namespace vcl
class TextLayoutCache;
}
-struct GlyphItem;
-typedef std::vector<GlyphItem> SalLayoutGlyphs;
-
// all positions/widths are in font units
// one exception: drawposition is in pixel units
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index a16134017627..8e8460c71ba9 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -252,6 +252,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
vcl/source/gdi/graphictools \
vcl/source/gdi/hatch \
vcl/source/gdi/impanmvw \
+ vcl/source/gdi/impglyphitem \
vcl/source/gdi/impgraph \
vcl/source/gdi/impvect \
vcl/source/gdi/jobset \
diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx
index a4843be677fb..7c5dc66d1d8b 100644
--- a/vcl/inc/impglyphitem.hxx
+++ b/vcl/inc/impglyphitem.hxx
@@ -20,21 +20,85 @@
#ifndef INCLUDED_VCL_IMPGLYPHITEM_HXX
#define INCLUDED_VCL_IMPGLYPHITEM_HXX
+#include <tools/gen.hxx>
+#include <vcl/dllapi.h>
#include <vcl/glyphitem.hxx>
+#include <vector>
-// for whatever reason MSVC tries to export these when declared class inline even
-// when annotated with VCL_DLLPRIVATE, so keep them as seperate static inline.
+#include "fontinstance.hxx"
-static inline bool GetCachedGlyphBoundRect(const GlyphItem& rItem, tools::Rectangle& rRect)
+struct VCL_DLLPUBLIC GlyphItem
{
- return rItem.m_pFontInstance->GetCachedGlyphBoundRect(rItem.m_aGlyphId, rRect);
+ sal_GlyphId m_aGlyphId;
+ int m_nCharCount; // number of characters making up this glyph
+ int m_nOrigWidth; // original glyph width
+ LogicalFontInstance* m_pFontInstance;
+
+ int m_nCharPos; // index in string
+ int m_nFlags;
+ int m_nNewWidth; // width after adjustments
+ int m_nXOffset;
+ Point m_aLinearPos; // absolute position of non rotated string
+
+ GlyphItem(int nCharPos, int nCharCount, sal_GlyphId aGlyphId, const Point& rLinearPos,
+ long nFlags, int nOrigWidth, int nXOffset, LogicalFontInstance* pFontInstance)
+ : m_aGlyphId(aGlyphId)
+ , m_nCharCount(nCharCount)
+ , m_nOrigWidth(nOrigWidth)
+ , m_pFontInstance(pFontInstance)
+ , m_nCharPos(nCharPos)
+ , m_nFlags(nFlags)
+ , m_nNewWidth(nOrigWidth)
+ , m_nXOffset(nXOffset)
+ , m_aLinearPos(rLinearPos)
+ {
+ assert(m_pFontInstance);
+ }
+
+ enum
+ {
+ IS_IN_CLUSTER = 0x001,
+ IS_RTL_GLYPH = 0x002,
+ IS_DIACRITIC = 0x004,
+ IS_VERTICAL = 0x008,
+ IS_SPACING = 0x010,
+ ALLOW_KASHIDA = 0x020,
+ IS_DROPPED = 0x040,
+ IS_CLUSTER_START = 0x080
+ };
+
+ bool IsInCluster() const { return ((m_nFlags & IS_IN_CLUSTER) != 0); }
+ bool IsRTLGlyph() const { return ((m_nFlags & IS_RTL_GLYPH) != 0); }
+ bool IsDiacritic() const { return ((m_nFlags & IS_DIACRITIC) != 0); }
+ bool IsVertical() const { return ((m_nFlags & IS_VERTICAL) != 0); }
+ bool IsSpacing() const { return ((m_nFlags & IS_SPACING) != 0); }
+ bool AllowKashida() const { return ((m_nFlags & ALLOW_KASHIDA) != 0); }
+ bool IsDropped() const { return ((m_nFlags & IS_DROPPED) != 0); }
+ bool IsClusterStart() const { return ((m_nFlags & IS_CLUSTER_START) != 0); }
+
+ inline bool GetCachedGlyphBoundRect(tools::Rectangle& rRect) const;
+ inline void CacheGlyphBoundRect(tools::Rectangle& rRect) const;
+};
+
+VCL_DLLPUBLIC bool GlyphItem::GetCachedGlyphBoundRect(tools::Rectangle& rRect) const
+{
+ return m_pFontInstance->GetCachedGlyphBoundRect(m_aGlyphId, rRect);
}
-static inline void CacheGlyphBoundRect(const GlyphItem& rItem, tools::Rectangle& rRect)
+VCL_DLLPUBLIC void GlyphItem::CacheGlyphBoundRect(tools::Rectangle& rRect) const
{
- rItem.m_pFontInstance->CacheGlyphBoundRect(rItem.m_aGlyphId, rRect);
+ m_pFontInstance->CacheGlyphBoundRect(m_aGlyphId, rRect);
}
+class SalLayoutGlyphsImpl : public std::vector<GlyphItem>
+{
+ friend class GenericSalLayout;
+ friend class SalLayoutGlyphs;
+ void SetPImpl(SalLayoutGlyphs* pFacade) { pFacade->m_pImpl = this; }
+
+ SalLayoutGlyphsImpl(SalLayoutGlyphs& rGlyphs) { SetPImpl(&rGlyphs); }
+};
+
#endif // INCLUDED_VCL_IMPGLYPHITEM_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 6b2ca93a7a39..972631d838e8 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -37,7 +37,7 @@
#include <vcl/devicecoordinate.hxx>
#include <vcl/vcllayout.hxx>
-#include "fontinstance.hxx"
+#include "impglyphitem.hxx"
#define MAX_FALLBACK 16
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 1425f7d1617b..fee6a676ac6c 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -141,7 +141,7 @@ void CoreTextStyle::GetFontMetric( ImplFontMetricDataRef const & rxFontMetric )
bool CoreTextStyle::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect )
{
assert(this == rGlyph.m_pFontInstance);
- if (::GetCachedGlyphBoundRect(rGlyph, rRect))
+ if (rGlyph.GetCachedGlyphBoundRect(rRect))
return true;
CGGlyph nCGGlyph = rGlyph.m_aGlyphId;
@@ -162,7 +162,7 @@ bool CoreTextStyle::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle&
long yMax = ceil(aCGRect.origin.y + aCGRect.size.height);
rRect = tools::Rectangle(xMin, -yMax, xMax, -yMin);
- ::CacheGlyphBoundRect(rGlyph, rRect);
+ rGlyph.CacheGlyphBoundRect(rRect);
return true;
}
diff --git a/vcl/source/control/imp_listbox.cxx b/vcl/source/control/imp_listbox.cxx
index 6433c49c3bd7..174e6a01fbd9 100644
--- a/vcl/source/control/imp_listbox.cxx
+++ b/vcl/source/control/imp_listbox.cxx
@@ -32,6 +32,7 @@
#include <controldata.hxx>
#include <svdata.hxx>
#include <window.h>
+#include <impglyphitem.hxx>
#include <com/sun/star/i18n/XCollator.hpp>
#include <com/sun/star/accessibility/XAccessible.hpp>
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 8831d9457174..0fc540fcb823 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -61,6 +61,7 @@ GenericSalLayout::GenericSalLayout(LogicalFontInstance &rFont)
, mpVertGlyphs(nullptr)
, mbFuzzing(utl::ConfigManager::IsFuzzing())
{
+ new SalLayoutGlyphsImpl(m_GlyphItems);
}
GenericSalLayout::~GenericSalLayout()
@@ -279,7 +280,7 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
hb_font_t *pHbFont = mpFont->GetHbFont();
int nGlyphCapacity = 2 * (rArgs.mnEndCharPos - rArgs.mnMinCharPos);
- m_GlyphItems.reserve(nGlyphCapacity);
+ m_GlyphItems.Impl()->reserve(nGlyphCapacity);
const int nLength = rArgs.mrStr.getLength();
const sal_Unicode *pStr = rArgs.mrStr.getStr();
@@ -571,7 +572,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());
- m_GlyphItems.push_back(aGI);
+ m_GlyphItems.Impl()->push_back(aGI);
aCurrPos.AdjustX(nAdvance );
}
@@ -590,7 +591,7 @@ void GenericSalLayout::GetCharWidths(DeviceCoordinate* pCharWidths) const
for (int i = 0; i < nCharCount; ++i)
pCharWidths[i] = 0;
- for (auto const& aGlyphItem : m_GlyphItems)
+ for (auto const& aGlyphItem : *m_GlyphItems.Impl())
{
const int nIndex = aGlyphItem.m_nCharPos - mnMinCharPos;
if (nIndex >= nCharCount)
@@ -659,31 +660,31 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
// Apply the DX adjustments to glyph positions and widths.
size_t i = 0;
- while (i < m_GlyphItems.size())
+ while (i < m_GlyphItems.Impl()->size())
{
// Accumulate the width difference for all characters corresponding to
// this glyph.
- int nCharPos = m_GlyphItems[i].m_nCharPos - mnMinCharPos;
+ int nCharPos = (*m_GlyphItems.Impl())[i].m_nCharPos - mnMinCharPos;
DeviceCoordinate nDiff = 0;
- for (int j = 0; j < m_GlyphItems[i].m_nCharCount; j++)
+ for (int j = 0; j < (*m_GlyphItems.Impl())[i].m_nCharCount; j++)
nDiff += pNewCharWidths[nCharPos + j] - pOldCharWidths[nCharPos + j];
- if (!m_GlyphItems[i].IsRTLGlyph())
+ if (!(*m_GlyphItems.Impl())[i].IsRTLGlyph())
{
// Adjust the width and position of the first (leftmost) glyph in
// the cluster.
- m_GlyphItems[i].m_nNewWidth += nDiff;
- m_GlyphItems[i].m_aLinearPos.AdjustX(nDelta);
+ (*m_GlyphItems.Impl())[i].m_nNewWidth += nDiff;
+ (*m_GlyphItems.Impl())[i].m_aLinearPos.AdjustX(nDelta);
// Adjust the position of the rest of the glyphs in the cluster.
- while (++i < m_GlyphItems.size())
+ while (++i < m_GlyphItems.Impl()->size())
{
- if (!m_GlyphItems[i].IsInCluster())
+ if (!(*m_GlyphItems.Impl())[i].IsInCluster())
break;
- m_GlyphItems[i].m_aLinearPos.AdjustX(nDelta);
+ (*m_GlyphItems.Impl())[i].m_aLinearPos.AdjustX(nDelta);
}
}
- else if (m_GlyphItems[i].IsInCluster())
+ else if ((*m_GlyphItems.Impl())[i].IsInCluster())
{
// RTL glyph in the middle of the cluster, will be handled in the
// loop below.
@@ -694,34 +695,34 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
// Adjust the width and position of the first (rightmost) glyph in
// the cluster.
// For RTL, we put all the adjustment to the left of the glyph.
- m_GlyphItems[i].m_nNewWidth += nDiff;
- m_GlyphItems[i].m_aLinearPos.AdjustX(nDelta + nDiff);
+ (*m_GlyphItems.Impl())[i].m_nNewWidth += nDiff;
+ (*m_GlyphItems.Impl())[i].m_aLinearPos.AdjustX(nDelta + nDiff);
// Adjust the X position of all glyphs in the cluster.
size_t j = i;
while (j > 0)
{
--j;
- if (!m_GlyphItems[j].IsInCluster())
+ if (!(*m_GlyphItems.Impl())[j].IsInCluster())
break;
- m_GlyphItems[j].m_aLinearPos.AdjustX(nDelta + nDiff);
+ (*m_GlyphItems.Impl())[j].m_aLinearPos.AdjustX(nDelta + nDiff);
}
// If this glyph is Kashida-justifiable, then mark this as a
// Kashida position. Since this must be a RTL glyph, we mark the
// last glyph in the cluster not the first as this would be the
// base glyph.
- if (bKashidaJustify && m_GlyphItems[i].AllowKashida() &&
- nDiff > m_GlyphItems[i].m_nCharCount) // Rounding errors, 1 pixel per character!
+ if (bKashidaJustify && (*m_GlyphItems.Impl())[i].AllowKashida() &&
+ nDiff > (*m_GlyphItems.Impl())[i].m_nCharCount) // Rounding errors, 1 pixel per character!
{
pKashidas[i] = nDiff;
// Move any non-spacing marks attached to this cluster as well.
// Looping backward because this is RTL glyph.
while (j > 0)
{
- if (!m_GlyphItems[j].IsDiacritic())
+ if (!(*m_GlyphItems.Impl())[j].IsDiacritic())
break;
- m_GlyphItems[j--].m_aLinearPos.AdjustX(nDiff);
+ (*m_GlyphItems.Impl())[j--].m_aLinearPos.AdjustX(nDiff);
}
}
i++;
@@ -740,7 +741,7 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
size_t nInserted = 0;
for (auto const& pKashida : pKashidas)
{
- auto pGlyphIter = m_GlyphItems.begin() + nInserted + pKashida.first;
+ auto pGlyphIter = m_GlyphItems.Impl()->begin() + nInserted + pKashida.first;
// The total Kashida width.
DeviceCoordinate nTotalWidth = pKashida.second;
@@ -768,7 +769,7 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
while (nCopies--)
{
GlyphItem aKashida(nCharPos, 0, nKashidaIndex, aPos, nFlags, nKashidaWidth, 0, mpFont.get());
- pGlyphIter = m_GlyphItems.insert(pGlyphIter, aKashida);
+ pGlyphIter = m_GlyphItems.Impl()->insert(pGlyphIter, aKashida);
aPos.AdjustX(nKashidaWidth );
aPos.AdjustX( -nOverlap );
++pGlyphIter;
@@ -780,7 +781,7 @@ void GenericSalLayout::ApplyDXArray(ImplLayoutArgs& rArgs)
bool GenericSalLayout::IsKashidaPosValid(int nCharPos) const
{
- for (auto pIter = m_GlyphItems.begin(); pIter != m_GlyphItems.end(); ++pIter)
+ for (auto pIter = m_GlyphItems.Impl()->begin(); pIter != m_GlyphItems.Impl()->end(); ++pIter)
{
if (pIter->m_nCharPos == nCharPos)
{
@@ -788,7 +789,7 @@ bool GenericSalLayout::IsKashidaPosValid(int nCharPos) const
// changed the text styling in the middle of a word. Since we don’t
// do ligatures across layout engine instances, this can’t be a
// ligature so it should be fine.
- if (pIter == m_GlyphItems.begin())
+ if (pIter == m_GlyphItems.Impl()->begin())
return true;
// If the character is not supported by this layout, return false
@@ -799,7 +800,7 @@ bool GenericSalLayout::IsKashidaPosValid(int nCharPos) const
// Search backwards for previous glyph belonging to a different
// character. We are looking backwards because we are dealing with
// RTL glyphs, which will be in visual order.
- for (auto pPrev = pIter - 1; pPrev != m_GlyphItems.begin(); --pPrev)
+ for (auto pPrev = pIter - 1; pPrev != m_GlyphItems.Impl()->begin(); --pPrev)
{
if (pPrev->m_nCharPos != nCharPos)
{
diff --git a/vcl/source/gdi/impglyphitem.cxx b/vcl/source/gdi/impglyphitem.cxx
new file mode 100644
index 000000000000..ee30ee5ab2df
--- /dev/null
+++ b/vcl/source/gdi/impglyphitem.cxx
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <impglyphitem.hxx>
+
+SalLayoutGlyphs::SalLayoutGlyphs()
+ : m_pImpl(nullptr)
+{
+}
+
+SalLayoutGlyphs::~SalLayoutGlyphs() { delete m_pImpl; }
+
+SalLayoutGlyphs::SalLayoutGlyphs(const SalLayoutGlyphs& rOther) { *m_pImpl = *rOther.m_pImpl; }
+
+SalLayoutGlyphs& SalLayoutGlyphs::operator=(const SalLayoutGlyphs& rOther)
+{
+ if (!m_pImpl)
+ m_pImpl = new SalLayoutGlyphsImpl(*this);
+ *m_pImpl = *rOther.m_pImpl;
+ return *this;
+}
+
+bool SalLayoutGlyphs::empty() const { return !m_pImpl || m_pImpl->empty(); }
+
+void SalLayoutGlyphs::clear()
+{
+ if (m_pImpl)
+ m_pImpl->clear();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 5abb8998032f..ba20619a5118 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -84,6 +84,7 @@
#include <textlayout.hxx>
#include <textlineinfo.hxx>
#include <bitmapwriteaccess.hxx>
+#include <impglyphitem.hxx>
#include "pdfwriter_impl.hxx"
diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx
index 33013696ee84..4ecf9a26193d 100644
--- a/vcl/source/gdi/sallayout.cxx
+++ b/vcl/source/gdi/sallayout.cxx
@@ -45,6 +45,8 @@
#include <algorithm>
#include <memory>
+#include <impglyphitem.hxx>
+
// Glyph Flags
#define GF_FONTMASK 0xF0000000
#define GF_FONTSHIFT 28
@@ -710,7 +712,7 @@ DeviceCoordinate GenericSalLayout::GetTextWidth() const
DeviceCoordinate nMinPos = 0;
DeviceCoordinate nMaxPos = 0;
- for (auto const& aGlyphItem : m_GlyphItems)
+ for (auto const& aGlyphItem : *m_GlyphItems.Impl())
{
// update the text extent with the glyph extent
DeviceCoordinate nXPos = aGlyphItem.m_aLinearPos.X();
@@ -737,13 +739,13 @@ void GenericSalLayout::Justify( DeviceCoordinate nNewWidth )
return;
}
// find rightmost glyph, it won't get stretched
- std::vector<GlyphItem>::iterator pGlyphIterRight = m_GlyphItems.begin();
- pGlyphIterRight += m_GlyphItems.size() - 1;
+ std::vector<GlyphItem>::iterator pGlyphIterRight = m_GlyphItems.Impl()->begin();
+ pGlyphIterRight += m_GlyphItems.Impl()->size() - 1;
std::vector<GlyphItem>::iterator pGlyphIter;
// count stretchable glyphs
int nStretchable = 0;
int nMaxGlyphWidth = 0;
- for(pGlyphIter = m_GlyphItems.begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter)
+ for(pGlyphIter = m_GlyphItems.Impl()->begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter)
{
if( !pGlyphIter->IsDiacritic() )
++nStretchable;
@@ -766,7 +768,7 @@ void GenericSalLayout::Justify( DeviceCoordinate nNewWidth )
{
// expand width by distributing space between glyphs evenly
int nDeltaSum = 0;
- for( pGlyphIter = m_GlyphItems.begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter )
+ for( pGlyphIter = m_GlyphItems.Impl()->begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter )
{
// move glyph to justified position
pGlyphIter->m_aLinearPos.AdjustX(nDeltaSum );
@@ -786,9 +788,9 @@ void GenericSalLayout::Justify( DeviceCoordinate nNewWidth )
{
// squeeze width by moving glyphs proportionally
double fSqueeze = static_cast<double>(nNewWidth) / nOldWidth;
- if(m_GlyphItems.size() > 1)
+ if(m_GlyphItems.Impl()->size() > 1)
{
- for( pGlyphIter = m_GlyphItems.begin(); ++pGlyphIter != pGlyphIterRight;)
+ for( pGlyphIter = m_GlyphItems.Impl()->begin(); ++pGlyphIter != pGlyphIterRight;)
{
int nX = pGlyphIter->m_aLinearPos.X();
nX = static_cast<int>(nX * fSqueeze);
@@ -796,7 +798,7 @@ void GenericSalLayout::Justify( DeviceCoordinate nNewWidth )
}
}
// adjust glyph widths to new positions
- for( pGlyphIter = m_GlyphItems.begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter )
+ for( pGlyphIter = m_GlyphItems.Impl()->begin(); pGlyphIter != pGlyphIterRight; ++pGlyphIter )
pGlyphIter->m_nNewWidth = pGlyphIter[1].m_aLinearPos.X() - pGlyphIter[0].m_aLinearPos.X();
}
}
@@ -806,7 +808,7 @@ void GenericSalLayout::ApplyAsianKerning(const OUString& rStr)
const int nLength = rStr.getLength();
long nOffset = 0;
- for( std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.begin(), pGlyphIterEnd = m_GlyphItems.end(); pGlyphIter != pGlyphIterEnd; ++pGlyphIter )
+ for( std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.Impl()->begin(), pGlyphIterEnd = m_GlyphItems.Impl()->end(); pGlyphIter != pGlyphIterEnd; ++pGlyphIter )
{
const int n = pGlyphIter->m_nCharPos;
if( n < nLength - 1)
@@ -849,7 +851,7 @@ void GenericSalLayout::GetCaretPositions( int nMaxIndex, long* pCaretXArray ) co
pCaretXArray[i] = -1;
// calculate caret positions using glyph array
- for (auto const& aGlyphItem : m_GlyphItems)
+ for (auto const& aGlyphItem : *m_GlyphItems.Impl())
{
long nXPos = aGlyphItem.m_aLinearPos.X();
long nXRight = nXPos + aGlyphItem.m_nOrigWidth;
@@ -895,8 +897,8 @@ bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
Point& rPos, int& nStart,
const PhysicalFontFace**, int* const) const
{
- std::vector<GlyphItem>::const_iterator pGlyphIter = m_GlyphItems.begin();
- std::vector<GlyphItem>::const_iterator pGlyphIterEnd = m_GlyphItems.end();
+ std::vector<GlyphItem>::const_iterator pGlyphIter = m_GlyphItems.Impl()->begin();
+ std::vector<GlyphItem>::const_iterator pGlyphIterEnd = m_GlyphItems.Impl()->end();
pGlyphIter += nStart;
// find next glyph in substring
@@ -908,7 +910,7 @@ bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
}
// return zero if no more glyph found
- if( nStart >= static_cast<int>(m_GlyphItems.size()) )
+ if( nStart >= static_cast<int>(m_GlyphItems.Impl()->size()) )
return false;
if( pGlyphIter == pGlyphIterEnd )
@@ -930,10 +932,10 @@ bool GenericSalLayout::GetNextGlyph(const GlyphItem** pGlyph,
void GenericSalLayout::MoveGlyph( int nStart, long nNewXPos )
{
- if( nStart >= static_cast<int>(m_GlyphItems.size()) )
+ if( nStart >= static_cast<int>(m_GlyphItems.Impl()->size()) )
return;
- std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.begin();
+ std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.Impl()->begin();
pGlyphIter += nStart;
// the nNewXPos argument determines the new cell position
@@ -946,7 +948,7 @@ void GenericSalLayout::MoveGlyph( int nStart, long nNewXPos )
// adjust all following glyph positions if needed
if( nXDelta != 0 )
{
- for( std::vector<GlyphItem>::iterator pGlyphIterEnd = m_GlyphItems.end(); pGlyphIter != pGlyphIterEnd; ++pGlyphIter )
+ for( std::vector<GlyphItem>::iterator pGlyphIterEnd = m_GlyphItems.Impl()->end(); pGlyphIter != pGlyphIterEnd; ++pGlyphIter )
{
pGlyphIter->m_aLinearPos.AdjustX(nXDelta );
}
@@ -955,10 +957,10 @@ void GenericSalLayout::MoveGlyph( int nStart, long nNewXPos )
void GenericSalLayout::DropGlyph( int nStart )
{
- if( nStart >= static_cast<int>(m_GlyphItems.size()))
+ if( nStart >= static_cast<int>(m_GlyphItems.Impl()->size()))
return;
- std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.begin();
+ std::vector<GlyphItem>::iterator pGlyphIter = m_GlyphItems.Impl()->begin();
pGlyphIter += nStart;
pGlyphIter->m_nCharPos = -1;
pGlyphIter->m_nFlags |= GlyphItem::IS_DROPPED;
@@ -968,20 +970,20 @@ void GenericSalLayout::Simplify( bool bIsBase )
{
// remove dropped glyphs inplace
size_t j = 0;
- for(size_t i = 0; i < m_GlyphItems.size(); i++ )
+ for(size_t i = 0; i < m_GlyphItems.Impl()->size(); i++ )
{
- if (bIsBase && m_GlyphItems[i].IsDropped())
+ if (bIsBase && (*m_GlyphItems.Impl())[i].IsDropped())
continue;
- if (!bIsBase && m_GlyphItems[i].m_aGlyphId == 0)
+ if (!bIsBase && (*m_GlyphItems.Impl())[i].m_aGlyphId == 0)
continue;
if( i != j )
{
- m_GlyphItems[j] = m_GlyphItems[i];
+ (*m_GlyphItems.Impl())[j] = (*m_GlyphItems.Impl())[i];
}
j += 1;
}
- m_GlyphItems.erase(m_GlyphItems.begin() + j, m_GlyphItems.end());
+ m_GlyphItems.Impl()->erase(m_GlyphItems.Impl()->begin() + j, m_GlyphItems.Impl()->end());
}
MultiSalLayout::MultiSalLayout( std::unique_ptr<SalLayout> pBaseLayout )
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index b11d97b0deb8..44c010869df6 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -31,6 +31,7 @@
#include <sallayout.hxx>
#include <salgdi.hxx>
#include <svdata.hxx>
+#include <impglyphitem.hxx>
#include <outdev.h>
#include <window.h>
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index ce30eb4bb07a..cdb5e5c9e597 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -43,6 +43,7 @@
#include <svdata.hxx>
#include <textlayout.hxx>
#include <textlineinfo.hxx>
+#include <impglyphitem.hxx>
#define TEXT_DRAW_ELLIPSIS (DrawTextFlags::EndEllipsis | DrawTextFlags::PathEllipsis | DrawTextFlags::NewsEllipsis)
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 9b4f6be2a042..7ae959493f09 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -32,6 +32,7 @@
#include <salgdi.hxx>
#include <impfont.hxx>
#include <outdata.hxx>
+#include <impglyphitem.hxx>
#define UNDERLINE_LAST LINESTYLE_BOLDWAVE
#define STRIKEOUT_LAST STRIKEOUT_X
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index 0374a1754e1e..eef0138f36b3 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -43,7 +43,7 @@
#include <vcl/settings.hxx>
#include <vcl/commandinfoprovider.hxx>
#include <vcl/IDialogRenderable.hxx>
-#include <vcl/glyphitem.hxx>
+#include <impglyphitem.hxx>
#include <salinst.hxx>
#include <svdata.hxx>
diff --git a/vcl/source/window/menuitemlist.cxx b/vcl/source/window/menuitemlist.cxx
index 9c25bf4e17d1..c0496f1ee603 100644
--- a/vcl/source/window/menuitemlist.cxx
+++ b/vcl/source/window/menuitemlist.cxx
@@ -26,6 +26,7 @@
#include <vcl/i18nhelp.hxx>
#include <vcl/settings.hxx>
#include <vcl/window.hxx>
+#include <impglyphitem.hxx>
using namespace css;
using namespace vcl;
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index ce04e4f68b55..50f1b8d451c6 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -591,7 +591,7 @@ void FreetypeFont::ApplyGlyphTransform(bool bVertical, FT_Glyph pGlyphFT ) const
bool FreetypeFont::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
{
- if (::GetCachedGlyphBoundRect(rGlyph, rRect))
+ if (rGlyph.GetCachedGlyphBoundRect(rRect))
return true;
FT_Activate_Size( maSizeFT );
@@ -616,7 +616,7 @@ bool FreetypeFont::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle&
FT_Done_Glyph( pGlyphFT );
rRect = tools::Rectangle(aBbox.xMin, -aBbox.yMax, aBbox.xMax, -aBbox.yMin);
- ::CacheGlyphBoundRect(rGlyph, rRect);
+ rGlyph.CacheGlyphBoundRect(rRect);
return true;
}
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 0e74be70f5a8..2303f7ba0bc1 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1328,7 +1328,7 @@ void WinSalGraphics::ClearDevFontCache()
bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle& rRect)
{
- if (::GetCachedGlyphBoundRect(rGlyph, rRect))
+ if (rGlyph.GetCachedGlyphBoundRect(rRect))
return true;
WinFontInstance* pFont = static_cast<WinFontInstance*>(rGlyph.m_pFontInstance);
@@ -1364,7 +1364,7 @@ bool WinSalGraphics::GetGlyphBoundRect(const GlyphItem& rGlyph, tools::Rectangle
rRect.SetTop(static_cast<int>( fFontScale * rRect.Top() ));
rRect.SetBottom(static_cast<int>( fFontScale * rRect.Bottom() ) + 1);
- ::CacheGlyphBoundRect(rGlyph, rRect);
+ rGlyph.CacheGlyphBoundRect(rRect);
return true;
}
More information about the Libreoffice-commits
mailing list