[Libreoffice-commits] core.git: Branch 'feature/cib_contract57c' - 17 commits - download.lst external/apr external/cairo external/mdnsresponder extras/source helpcontent2 include/vcl oox/source sc/qa sc/source sc/uiconfig sd/qa sfx2/source svx/source sw/inc sw/qa sw/source vcl/inc vcl/qt5 vcl/quartz vcl/source vcl/unx vcl/win
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Mar 6 11:41:02 UTC 2019
Rebased ref, commits from common ancestor:
commit 4eb7dcfa063229629a8fcd3bc09b46de6fe127be
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Wed Feb 13 08:59:01 2019 +0100
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Mar 6 12:38:40 2019 +0100
tdf#123378 Prevent modifying doc when printing
Just remove this update fields call, they are updated anyway.
Reviewed-on: https://gerrit.libreoffice.org/67754
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
(cherry picked from commit ac1b2c9e1ab2f84de3a8856772e00302d237e82f)
Change-Id: Iaed1b6e7e1be8138ecb48e7557cc09ec0eeebda3
diff --git a/sw/qa/uitest/writer_tests5/tdf123378.py b/sw/qa/uitest/writer_tests5/tdf123378.py
new file mode 100644
index 000000000000..6c78e0ecf699
--- /dev/null
+++ b/sw/qa/uitest/writer_tests5/tdf123378.py
@@ -0,0 +1,25 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# 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/.
+
+from uitest.framework import UITestCase
+
+#Bug 123378 - Printing always sets "document modified" status
+
+class tdf123378(UITestCase):
+ def test_tdf123378_print_sets_modified(self):
+ self.ui_test.create_doc_in_start_center("writer")
+ document = self.ui_test.get_component()
+ xWriterDoc = self.xUITest.getTopFocusWindow()
+
+ self.xUITest.executeCommand(".uno:Print")
+ xDialog = self.xUITest.getTopFocusWindow()
+ xOK = xDialog.getChild("cancel")
+ self.ui_test.close_dialog_through_button(xOK)
+
+ self.assertEqual(document.isModified(), False)
+
+ self.ui_test.close_doc()
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 805bbf81b108..b5d224209275 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -2630,8 +2630,6 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount(
bStateChanged = true;
}
- // #122919# Force field update before PDF export
- pViewShell->SwViewShell::UpdateFields(true);
if( bStateChanged )
pRenderDocShell->EnableSetModified();
commit 1ac6e5ada6bca7b315ce12897d4987bf0aa9a90b
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Thu Feb 7 11:17:21 2019 +0100
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Mar 6 12:38:40 2019 +0100
tdf#122607 Fix layout invalidation in headless mode
Layout was not invalidated correctly since the visible area is 0
in headless mode.
So just reformat the whole doc when doing the pdf conversion headless.
An attempt to fix this was already made with commit 1ecca673b40fedc53db125e332b087d1c120a254
but that didn't cover all cases.
Reviewed-on: https://gerrit.libreoffice.org/67417
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
(cherry picked from commit e41b09d0126ecb28cff277c9b4b40eae7cc7c3f4)
Change-Id: I3f620b2f2db2c4a6e5bf279b33e5c93697e4e2d4
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index 832f4f9dd878..da9146bf12ea 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -152,7 +152,7 @@ class SW_DLLPUBLIC SwViewShell : public sw::Ring<SwViewShell>
inline void ResetInvalidRect();
- SAL_DLLPRIVATE void Reformat(); // Invalidates complete Layout (ApplyViewOption).
+
SAL_DLLPRIVATE void PaintDesktop(vcl::RenderContext& rRenderContext, const SwRect&); // Collect values for painting of desktop
// and calling.
@@ -216,6 +216,9 @@ public:
void InvalidateWindows( const SwRect &rRect );
+ /// Invalidates complete Layout (ApplyViewOption).
+ void Reformat();
+
// #i72754# set of Pre/PostPaints with lock counter and initial target OutDev
protected:
std::stack<vcl::Region> mPrePostPaintRegions; // acts also as a lock counter (empty == not locked)
diff --git a/sw/qa/extras/layout/data/tdf122607.odt b/sw/qa/extras/layout/data/tdf122607.odt
new file mode 100644
index 000000000000..123e04702ef8
Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122607.odt differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 7d6eeccd18b8..b1ef14cbbad8 100755
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -32,6 +32,7 @@ public:
void testTdf117188();
void testTdf119875();
void testTdf116989();
+ void testTdf122607();
CPPUNIT_TEST_SUITE(SwLayoutWriter);
CPPUNIT_TEST(testTdf116830);
@@ -49,6 +50,7 @@ public:
CPPUNIT_TEST(testTdf117188);
CPPUNIT_TEST(testTdf119875);
CPPUNIT_TEST(testTdf116989);
+ CPPUNIT_TEST(testTdf122607);
CPPUNIT_TEST_SUITE_END();
private:
@@ -304,6 +306,20 @@ void SwLayoutWriter::testTdf116989()
}
}
+void SwLayoutWriter::testTdf122607()
+{
+ createDoc("tdf122607.odt");
+ xmlDocPtr pXmlDoc = parseLayoutDump();
+ assertXPath(pXmlDoc,
+ "/root/page[1]/anchored/fly/txt[1]/anchored/fly/tab/row[2]/cell/txt[7]/anchored/"
+ "fly/txt/Text[1]",
+ "nHeight", "253");
+ assertXPath(pXmlDoc,
+ "/root/page[1]/anchored/fly/txt[1]/anchored/fly/tab/row[2]/cell/txt[7]/anchored/"
+ "fly/txt/Text[1]",
+ "nWidth", "428");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SwLayoutWriter);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index f33f5f033d9f..805bbf81b108 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -2635,6 +2635,9 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount(
if( bStateChanged )
pRenderDocShell->EnableSetModified();
+ // tdf#122607 Re-layout the doc. Calling CalcLayout here is not enough, as it depends
+ // on the currently visible area which is 0 when doing headless conversion.
+ pViewShell->Reformat();
pViewShell->CalcPagesForPrint( pViewShell->GetPageCount() );
pViewShell->SetPDFExportOption( false );
commit 03f2a26a6bf72bd1bdd8545016c6c75c502a80ce
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Thu Jan 24 15:52:47 2019 +0100
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Mar 6 12:38:40 2019 +0100
tdf#122607 Don't unnecessarily redo the layout
Brings weird issues like out of place textboxes as described in the bug.
Change-Id: I19341efc48188f0b52069401dc39ba05f4fcc7f6
Reviewed-on: https://gerrit.libreoffice.org/66874
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
(cherry picked from commit 1ecca673b40fedc53db125e332b087d1c120a254)
Reviewed-on: https://gerrit.libreoffice.org/66897
Tested-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
diff --git a/sw/source/uibase/uno/unotxdoc.cxx b/sw/source/uibase/uno/unotxdoc.cxx
index 1db55d3c5831..f33f5f033d9f 100644
--- a/sw/source/uibase/uno/unotxdoc.cxx
+++ b/sw/source/uibase/uno/unotxdoc.cxx
@@ -2635,10 +2635,6 @@ sal_Int32 SAL_CALL SwXTextDocument::getRendererCount(
if( bStateChanged )
pRenderDocShell->EnableSetModified();
- // there is some redundancy between those two function calls, but right now
- // there is no time to sort this out.
- //TODO: check what exactly needs to be done and make just one function for that
- pViewShell->CalcLayout();
pViewShell->CalcPagesForPrint( pViewShell->GetPageCount() );
pViewShell->SetPDFExportOption( false );
commit 4c8ea3471ab49e65ed7996b015fd312c673798e0
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Tue Jun 5 14:16:23 2018 +0200
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Mar 6 12:38:40 2019 +0100
hold LogicalFontInstance with rtl::Reference
instead of manual reference counting.
Also the releasing of not-currently-in-use LogicalFontInstance objects
from the cache is made less aggressive - we now only flush entries until
we have less than CACHE_SIZE instances, instead of flushing the whole
cache.
Reviewed-on: https://gerrit.libreoffice.org/55384
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
(cherry picked from commit c4c56de1b0e62ec866b519b2b24c5e805f0a86d3)
Change-Id: Ib235b132776b5f09ae8ae93a933c2eebe5fa9610
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 174987e51757..93a3ce610c32 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -332,7 +332,7 @@ private:
mutable VclPtr<OutputDevice> mpPrevGraphics; ///< Previous output device in list
mutable VclPtr<OutputDevice> mpNextGraphics; ///< Next output device in list
GDIMetaFile* mpMetaFile;
- mutable LogicalFontInstance* mpFontInstance;
+ mutable rtl::Reference<LogicalFontInstance> mpFontInstance;
mutable ImplFontCache* mpFontCache;
mutable PhysicalFontCollection* mpFontCollection;
mutable std::unique_ptr<ImplDeviceFontList> mpDeviceFontList;
diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 2406b6cf41da..e289345716ca 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -54,7 +54,7 @@ public:
class VCL_PLUGIN_PUBLIC PhysicalFontFace : public FontAttributes, public salhelper::SimpleReferenceObject
{
public:
- virtual LogicalFontInstance* CreateFontInstance(const FontSelectPattern&) const;
+ virtual rtl::Reference<LogicalFontInstance> CreateFontInstance(const FontSelectPattern&) const;
virtual rtl::Reference<PhysicalFontFace> Clone() const = 0;
int GetHeight() const { return mnHeight; }
diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx
index 317b7181198d..149bb553c3eb 100644
--- a/vcl/inc/fontinstance.hxx
+++ b/vcl/inc/fontinstance.hxx
@@ -24,6 +24,7 @@
#include "impfontmetricdata.hxx"
#include <rtl/ref.hxx>
+#include <salhelper/simplereferenceobject.hxx>
#include <unordered_map>
#include <memory>
@@ -35,7 +36,7 @@ class PhysicalFontFace;
// TODO: allow sharing of metrics for related fonts
-class VCL_PLUGIN_PUBLIC LogicalFontInstance
+class VCL_PLUGIN_PUBLIC LogicalFontInstance : public salhelper::SimpleReferenceObject
{
// just declaring the factory function doesn't work AKA
// friend LogicalFontInstance* PhysicalFontFace::CreateFontInstance(const FontSelectPattern&) const;
@@ -43,7 +44,7 @@ class VCL_PLUGIN_PUBLIC LogicalFontInstance
friend class ImplFontCache;
public: // TODO: make data members private
- virtual ~LogicalFontInstance();
+ virtual ~LogicalFontInstance() override;
ImplFontMetricDataRef mxFontMetric; // Font attributes
const ConvertChar* mpConversion; // used e.g. for StarBats->StarSymbol
@@ -57,9 +58,6 @@ public: // TODO: make data members private
bool GetFallbackForUnicode( sal_UCS4, FontWeight eWeight, OUString* pFontName ) const;
void IgnoreFallbackForUnicode( sal_UCS4, FontWeight eWeight, const OUString& rFontName );
- void Acquire();
- void Release();
-
inline hb_font_t* GetHbFont();
void SetAverageWidthFactor(double nFactor) { m_nAveWidthFactor = nFactor; }
double GetAverageWidthFactor() const { return m_nAveWidthFactor; }
@@ -88,7 +86,6 @@ private:
typedef ::std::unordered_map< ::std::pair<sal_UCS4,FontWeight>, OUString > UnicodeFallbackList;
std::unique_ptr<UnicodeFallbackList> mpUnicodeFallbackList;
ImplFontCache * mpFontCache;
- sal_uInt32 mnRefCount;
const FontSelectPattern m_aFontSelData;
hb_font_t* m_pHbFont;
double m_nAveWidthFactor;
diff --git a/vcl/inc/fontselect.hxx b/vcl/inc/fontselect.hxx
index 389077270758..efb88ad74ae1 100644
--- a/vcl/inc/fontselect.hxx
+++ b/vcl/inc/fontselect.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_VCL_INC_FONTSELECT_HXX
#include <i18nlangtag/lang.h>
+#include <rtl/ref.hxx>
#include "fontattributes.hxx"
@@ -80,7 +81,7 @@ public:
#endif
public: // TODO: change to private
- LogicalFontInstance* mpFontInstance; // pointer to the resulting FontCache entry
+ rtl::Reference<LogicalFontInstance> mpFontInstance; // pointer to the resulting FontCache entry
void copyAttributes(const FontSelectPatternAttributes &rAttributes);
};
diff --git a/vcl/inc/impfontcache.hxx b/vcl/inc/impfontcache.hxx
index a99283fb300e..6cb05b39d9b3 100644
--- a/vcl/inc/impfontcache.hxx
+++ b/vcl/inc/impfontcache.hxx
@@ -33,36 +33,24 @@ class PhysicalFontCollection;
class ImplFontCache
{
- // For access to Acquire and Release
- friend class LogicalFontInstance;
-
private:
LogicalFontInstance* mpLastHitCacheEntry; ///< keeps the last hit cache entry
- int mnRef0Count; ///< number of unreferenced LogicalFontInstances
// cache of recently used font instances
struct IFSD_Equal { bool operator()( const FontSelectPattern&, const FontSelectPattern& ) const; };
struct IFSD_Hash { size_t operator()( const FontSelectPattern& ) const; };
- typedef std::unordered_map<FontSelectPattern,LogicalFontInstance*,IFSD_Hash,IFSD_Equal > FontInstanceList;
+ typedef std::unordered_map<FontSelectPattern, rtl::Reference<LogicalFontInstance>, IFSD_Hash, IFSD_Equal> FontInstanceList;
FontInstanceList maFontInstanceList;
- int CountUnreferencedEntries() const;
- bool IsFontInList(const LogicalFontInstance* pFont) const;
-
- /// Increase the refcount of the given LogicalFontInstance.
- void Acquire(LogicalFontInstance*);
- /// Decrease the refcount and potentially cleanup the entries with zero refcount from the cache.
- void Release(LogicalFontInstance*);
-
- LogicalFontInstance* GetFontInstance(PhysicalFontCollection const*, FontSelectPattern&);
+ rtl::Reference<LogicalFontInstance> GetFontInstance(PhysicalFontCollection const*, FontSelectPattern&);
public:
ImplFontCache();
~ImplFontCache();
- LogicalFontInstance* GetFontInstance( PhysicalFontCollection const *,
+ rtl::Reference<LogicalFontInstance> GetFontInstance( PhysicalFontCollection const *,
const vcl::Font&, const Size& rPixelSize, float fExactHeight);
- LogicalFontInstance* GetGlyphFallbackFont( PhysicalFontCollection const *, FontSelectPattern&,
+ rtl::Reference<LogicalFontInstance> GetGlyphFallbackFont( PhysicalFontCollection const *, FontSelectPattern&,
int nFallbackLevel, OUString& rMissingCodes );
void Invalidate();
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 2f53a44d694e..1dd896058890 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -71,7 +71,7 @@ public:
bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const;
bool HasChar( sal_uInt32 cChar ) const;
- LogicalFontInstance* CreateFontInstance(const FontSelectPattern&) const override;
+ rtl::Reference<LogicalFontInstance> CreateFontInstance(const FontSelectPattern&) const override;
protected:
CoreTextFontFace( const CoreTextFontFace& );
@@ -85,7 +85,7 @@ private:
class CoreTextStyle : public LogicalFontInstance
{
- friend LogicalFontInstance* CoreTextFontFace::CreateFontInstance(const FontSelectPattern&) const;
+ friend rtl::Reference<LogicalFontInstance> CoreTextFontFace::CreateFontInstance(const FontSelectPattern&) const;
public:
~CoreTextStyle();
@@ -159,7 +159,7 @@ class AquaSalGraphics : public SalGraphics
RGBAColor maFillColor;
// Device Font settings
- CoreTextStyle* mpTextStyle[MAX_FALLBACK];
+ rtl::Reference<CoreTextStyle> mpTextStyle[MAX_FALLBACK];
RGBAColor maTextColor;
/// allows text to be rendered without antialiasing
bool mbNonAntialiasedText;
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index 62cda5832906..8daed9a01d09 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -352,7 +352,7 @@ private:
void ParseFeatures(const OUString& name);
- LogicalFontInstance* const mpFont;
+ rtl::Reference<LogicalFontInstance> const mpFont;
css::uno::Reference<css::i18n::XBreakIterator> mxBreak;
std::vector<GlyphItem> m_GlyphItems;
diff --git a/vcl/inc/salwtype.hxx b/vcl/inc/salwtype.hxx
index 34ca43664a25..29cbaf00c3a6 100644
--- a/vcl/inc/salwtype.hxx
+++ b/vcl/inc/salwtype.hxx
@@ -21,6 +21,7 @@
#define INCLUDED_VCL_INC_SALWTYPE_HXX
#include <i18nlangtag/lang.h>
+#include <rtl/ref.hxx>
#include <rtl/ustring.hxx>
#include <tools/solar.h>
@@ -238,7 +239,7 @@ struct SalFrameState
struct SalInputContext
{
- LogicalFontInstance* mpFont;
+ rtl::Reference<LogicalFontInstance> mpFont;
LanguageType meLanguage;
InputContextFlags mnOptions;
};
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx b/vcl/inc/unx/freetype_glyphcache.hxx
index d6b87b7ab7a9..bf00935b15a1 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -114,7 +114,7 @@ private:
public:
FreetypeFontFace( FreetypeFontInfo*, const FontAttributes& );
- virtual LogicalFontInstance* CreateFontInstance( const FontSelectPattern& ) const override;
+ virtual rtl::Reference<LogicalFontInstance> CreateFontInstance( const FontSelectPattern& ) const override;
virtual rtl::Reference<PhysicalFontFace> Clone() const override { return new FreetypeFontFace( *this ); }
virtual sal_IntPtr GetFontId() const override { return mpFreetypeFontInfo->GetFontId(); }
};
@@ -122,7 +122,7 @@ public:
// a class for cache entries for physical font instances that are based on serverfonts
class VCL_DLLPUBLIC FreetypeFontInstance : public LogicalFontInstance
{
- friend LogicalFontInstance* FreetypeFontFace::CreateFontInstance(const FontSelectPattern&) const;
+ friend rtl::Reference<LogicalFontInstance> FreetypeFontFace::CreateFontInstance(const FontSelectPattern&) const;
FreetypeFont* mpFreetypeFont;
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index 5e515db564b5..50d1f071d44f 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -39,6 +39,7 @@
#include <unordered_map>
class FreetypeManager;
+class FreetypeFontInstance;
class FreetypeFontInfo;
class GlyphData;
class FontConfigFontOptions;
@@ -139,7 +140,7 @@ public:
bool GetGlyphOutline(const GlyphItem& rGlyph, basegfx::B2DPolyPolygon&) const;
bool GetAntialiasAdvice() const;
- LogicalFontInstance* GetFontInstance() const { return mpFontInstance; }
+ FreetypeFontInstance* GetFontInstance() const { return mpFontInstance.get(); }
private:
friend class GlyphCache;
@@ -161,7 +162,7 @@ private:
typedef std::unordered_map<int,GlyphData> GlyphList;
mutable GlyphList maGlyphList;
- LogicalFontInstance* const mpFontInstance;
+ rtl::Reference<FreetypeFontInstance> mpFontInstance;
// used by GlyphCache for cache LRU algorithm
mutable long mnRefCount;
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index dc7bc7510229..0f175ebe75c2 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -64,7 +64,7 @@ public:
virtual ~WinFontFace() override;
virtual rtl::Reference<PhysicalFontFace> Clone() const override;
- virtual LogicalFontInstance* CreateFontInstance( const FontSelectPattern& ) const override;
+ virtual rtl::Reference<LogicalFontInstance> CreateFontInstance( const FontSelectPattern& ) const override;
virtual sal_IntPtr GetFontId() const override;
void SetFontId( sal_IntPtr nId ) { mnId = nId; }
void UpdateFromHDC( HDC ) const;
@@ -170,7 +170,8 @@ private:
**/
HFONT mhFonts[ MAX_FALLBACK ]; // Font + Fallbacks
- WinFontInstance* mpWinFontEntry[ MAX_FALLBACK ]; // pointer to the most recent font instance
+ rtl::Reference<WinFontInstance>
+ mpWinFontEntry[ MAX_FALLBACK ]; // pointer to the most recent font instance
float mfFontScale[ MAX_FALLBACK ]; // allows metrics emulation of huge font sizes
HRGN mhRegion; // vcl::Region Handle
HPEN mhDefPen; // DefaultPen
@@ -182,8 +183,6 @@ private:
RGNDATA* mpStdClipRgnData; // Cache Standard-ClipRegion-Data
int mnPenWidth; // line width
- LogicalFontInstance* GetWinFontEntry(int nFallbackLevel);
-
bool CacheGlyphs(const GenericSalLayout& rLayout);
bool DrawCachedGlyphs(const GenericSalLayout& rLayout);
HFONT ImplDoSetFont(FontSelectPattern const * i_pFont, const PhysicalFontFace * i_pFontFace, float& o_rFontScale, HFONT& o_rOldFont);
diff --git a/vcl/inc/win/winlayout.hxx b/vcl/inc/win/winlayout.hxx
index 0c447153c800..07ae1a7d03c1 100644
--- a/vcl/inc/win/winlayout.hxx
+++ b/vcl/inc/win/winlayout.hxx
@@ -145,7 +145,7 @@ public:
// win32 specific physical font instance
class WinFontInstance : public LogicalFontInstance
{
- friend LogicalFontInstance* WinFontFace::CreateFontInstance(const FontSelectPattern&) const;
+ friend rtl::Reference<LogicalFontInstance> WinFontFace::CreateFontInstance(const FontSelectPattern&) const;
public:
virtual ~WinFontInstance() override;
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index 1d72f601eafa..dc372325e9e8 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -288,7 +288,7 @@ rtl::Reference<PhysicalFontFace> CoreTextFontFace::Clone() const
return new CoreTextFontFace( *this);
}
-LogicalFontInstance* CoreTextFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
+rtl::Reference<LogicalFontInstance> CoreTextFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
{
return new CoreTextStyle(*this, rFSD);
}
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 7154bd672e0f..48e40f3d0895 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -66,7 +66,7 @@ bool CoreTextGlyphFallbackSubstititution::FindFontSubstitute(FontSelectPattern&
OUString& rMissingChars) const
{
bool bFound = false;
- CoreTextStyle* pStyle = static_cast<CoreTextStyle*>(rPattern.mpFontInstance);
+ CoreTextStyle* pStyle = static_cast<CoreTextStyle*>(rPattern.mpFontInstance.get());
CTFontRef pFont = static_cast<CTFontRef>(CFDictionaryGetValue(pStyle->GetStyleDict(), kCTFontAttributeName));
CFStringRef pStr = CreateCFString(rMissingChars);
if (pStr)
@@ -243,7 +243,7 @@ AquaSalGraphics::~AquaSalGraphics()
{
if (!mpTextStyle[i])
break;
- mpTextStyle[i]->Release();
+ mpTextStyle[i].clear();
}
if( mpXorEmulation )
@@ -488,8 +488,7 @@ void AquaSalGraphics::SetFont(const FontSelectPattern* pReqFont, int nFallbackLe
{
if (!mpTextStyle[i])
break;
- mpTextStyle[i]->Release();
- mpTextStyle[i] = nullptr;
+ mpTextStyle[i].clear();
}
if (!pReqFont)
@@ -499,8 +498,7 @@ void AquaSalGraphics::SetFont(const FontSelectPattern* pReqFont, int nFallbackLe
return;
// update the text style
- mpTextStyle[nFallbackLevel] = static_cast<CoreTextStyle*>(pReqFont->mpFontInstance);
- mpTextStyle[nFallbackLevel]->Acquire();
+ mpTextStyle[nFallbackLevel] = static_cast<CoreTextStyle*>(pReqFont->mpFontInstance.get());
SAL_INFO("vcl.ct",
"SetFont"
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index 690fd1fdc401..d356438e43a1 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -45,7 +45,7 @@ PhysicalFontFace::PhysicalFontFace( const PhysicalFontFace& other )
{
}
-LogicalFontInstance* PhysicalFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
+rtl::Reference<LogicalFontInstance> PhysicalFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
{
return new LogicalFontInstance(*this, rFSD);
}
diff --git a/vcl/source/font/fontcache.cxx b/vcl/source/font/fontcache.cxx
index 205b49ada4e0..a58d9b6931f2 100644
--- a/vcl/source/font/fontcache.cxx
+++ b/vcl/source/font/fontcache.cxx
@@ -83,23 +83,14 @@ bool ImplFontCache::IFSD_Equal::operator()(const FontSelectPattern& rA, const Fo
}
ImplFontCache::ImplFontCache()
-: mpLastHitCacheEntry( nullptr ),
- mnRef0Count( 0 )
+: mpLastHitCacheEntry( nullptr )
{}
ImplFontCache::~ImplFontCache()
{
- for (auto const& fontInstance : maFontInstanceList)
- {
- LogicalFontInstance* pFontInstance = fontInstance.second;
- if (pFontInstance->mnRefCount)
- pFontInstance->mpFontCache = nullptr;
- else
- delete pFontInstance;
- }
}
-LogicalFontInstance* ImplFontCache::GetFontInstance( PhysicalFontCollection const * pFontList,
+rtl::Reference<LogicalFontInstance> ImplFontCache::GetFontInstance( PhysicalFontCollection const * pFontList,
const vcl::Font& rFont, const Size& rSize, float fExactHeight )
{
// initialize internal font request object
@@ -107,10 +98,10 @@ LogicalFontInstance* ImplFontCache::GetFontInstance( PhysicalFontCollection cons
return GetFontInstance( pFontList, aFontSelData );
}
-LogicalFontInstance* ImplFontCache::GetFontInstance( PhysicalFontCollection const * pFontList,
+rtl::Reference<LogicalFontInstance> ImplFontCache::GetFontInstance( PhysicalFontCollection const * pFontList,
FontSelectPattern& aFontSelData )
{
- LogicalFontInstance *pFontInstance = nullptr;
+ rtl::Reference<LogicalFontInstance> pFontInstance;
PhysicalFontFamily* pFontFamily = nullptr;
// check if a directly matching logical font instance is already cached,
@@ -140,12 +131,7 @@ LogicalFontInstance* ImplFontCache::GetFontInstance( PhysicalFontCollection cons
}
}
- if( pFontInstance ) // cache hit => use existing font instance
- {
- // increase the font instance's reference count
- pFontInstance->Acquire();
- }
- else if (pFontFamily) // still no cache hit => create a new font instance
+ if( !pFontInstance && pFontFamily) // still no cache hit => create a new font instance
{
PhysicalFontFace* pFontData = pFontFamily->FindBestFontFace(aFontSelData);
@@ -173,19 +159,38 @@ LogicalFontInstance* ImplFontCache::GetFontInstance( PhysicalFontCollection cons
}
#endif
+ static const size_t FONTCACHE_MAX = getenv("LO_TESTNAME") ? 1 : 50;
+
+ if (maFontInstanceList.size() >= FONTCACHE_MAX)
+ {
+ // remove entries from font instance cache that are only referenced by the cache
+ FontInstanceList::iterator it_next = maFontInstanceList.begin();
+ while( it_next != maFontInstanceList.end() )
+ {
+ LogicalFontInstance* pFontEntry = (*it_next).second.get();
+ if( pFontEntry->m_nCount > 1 )
+ {
+ ++it_next;
+ continue;
+ }
+ maFontInstanceList.erase(it_next);
+ if (mpLastHitCacheEntry == pFontEntry)
+ mpLastHitCacheEntry = nullptr;
+ // just remove one entry, which will bring us back under FONTCACHE_MAX size again
+ break;
+ }
+ }
+
+ assert(pFontInstance);
// add the new entry to the cache
-#ifndef NDEBUG
- auto aResult =
-#endif
- maFontInstanceList.insert({aFontSelData, pFontInstance});
- assert(aResult.second);
+ maFontInstanceList.insert({aFontSelData, pFontInstance.get()});
}
- mpLastHitCacheEntry = pFontInstance;
+ mpLastHitCacheEntry = pFontInstance.get();
return pFontInstance;
}
-LogicalFontInstance* ImplFontCache::GetGlyphFallbackFont( PhysicalFontCollection const * pFontCollection,
+rtl::Reference<LogicalFontInstance> ImplFontCache::GetGlyphFallbackFont( PhysicalFontCollection const * pFontCollection,
FontSelectPattern& rFontSelData, int nFallbackLevel, OUString& rMissingCodes )
{
// get a candidate font for glyph fallback
@@ -216,102 +221,17 @@ LogicalFontInstance* ImplFontCache::GetGlyphFallbackFont( PhysicalFontCollection
rFontSelData.maSearchName.clear();
}
- LogicalFontInstance* pFallbackFont = GetFontInstance( pFontCollection, rFontSelData );
+ rtl::Reference<LogicalFontInstance> pFallbackFont = GetFontInstance( pFontCollection, rFontSelData );
return pFallbackFont;
}
-void ImplFontCache::Acquire(LogicalFontInstance* pFontInstance)
-{
- assert(pFontInstance->mpFontCache == this);
- assert(IsFontInList(pFontInstance) && "ImplFontCache::Acquire() - font absent in the cache");
-
- if (0 == pFontInstance->mnRefCount++)
- --mnRef0Count;
-}
-
-void ImplFontCache::Release(LogicalFontInstance* pFontInstance)
-{
- static const int FONTCACHE_MAX = getenv("LO_TESTNAME") ? 1 : 50;
-
- assert(pFontInstance->mpFontCache == this);
- assert(IsFontInList(pFontInstance) && "ImplFontCache::Release() - font absent in the cache");
- assert(pFontInstance->mnRefCount > 0 && "ImplFontCache::Release() - font refcount underflow");
- if( --pFontInstance->mnRefCount > 0 )
- return;
-
- if (++mnRef0Count < FONTCACHE_MAX)
- return;
-
- assert(CountUnreferencedEntries() == mnRef0Count);
-
- // remove unused entries from font instance cache
- FontInstanceList::iterator it_next = maFontInstanceList.begin();
- while( it_next != maFontInstanceList.end() )
- {
- LogicalFontInstance* pFontEntry = (*it_next).second;
- if( pFontEntry->mnRefCount > 0 )
- {
- ++it_next;
- continue;
- }
-
- it_next = maFontInstanceList.erase(it_next);
- delete pFontEntry;
- --mnRef0Count;
- assert(mnRef0Count>=0 && "ImplFontCache::Release() - refcount0 underflow");
-
- if (mpLastHitCacheEntry == pFontEntry)
- mpLastHitCacheEntry = nullptr;
- }
-
- assert(mnRef0Count==0 && "ImplFontCache::Release() - refcount0 mismatch");
-}
-
-bool ImplFontCache::IsFontInList(const LogicalFontInstance* pFont) const
-{
- auto Pred = [pFont](const FontInstanceList::value_type& el) -> bool { return el.second == pFont; };
- return std::find_if(maFontInstanceList.begin(), maFontInstanceList.end(), Pred) != maFontInstanceList.end();
-}
-
-int ImplFontCache::CountUnreferencedEntries() const
-{
- size_t nCount = 0;
- // count unreferenced entries
- for (auto const& fontInstance : maFontInstanceList)
- {
- const LogicalFontInstance* pFontEntry = fontInstance.second;
- if (pFontEntry->mnRefCount > 0)
- continue;
- ++nCount;
- }
- return nCount;
-}
-
void ImplFontCache::Invalidate()
{
- assert(CountUnreferencedEntries() == mnRef0Count);
-
- // delete unreferenced entries
- for (auto const& fontInstance : maFontInstanceList)
- {
- LogicalFontInstance* pFontEntry = fontInstance.second;
- if( pFontEntry->mnRefCount > 0 )
- {
- // These fonts will become orphans after clearing the list below;
- // allow them to control their life from now on and wish good luck :)
- pFontEntry->mpFontCache = nullptr;
- continue;
- }
-
- delete pFontEntry;
- --mnRef0Count;
- }
-
// #112304# make sure the font cache is really clean
mpLastHitCacheEntry = nullptr;
+ for (auto const & pair : maFontInstanceList)
+ pair.second->mpFontCache = nullptr;
maFontInstanceList.clear();
-
- assert(mnRef0Count==0 && "ImplFontCache::Invalidate() - mnRef0Count non-zero");
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/font/fontinstance.cxx b/vcl/source/font/fontinstance.cxx
index fca20fd03ca3..e5fac6c6a67b 100644
--- a/vcl/source/font/fontinstance.cxx
+++ b/vcl/source/font/fontinstance.cxx
@@ -48,7 +48,6 @@ LogicalFontInstance::LogicalFontInstance(const PhysicalFontFace& rFontFace, cons
, mnOrientation( 0 )
, mbInit( false )
, mpFontCache( nullptr )
- , mnRefCount( 1 )
, m_aFontSelData(rFontSelData)
, m_pHbFont(nullptr)
, m_nAveWidthFactor(1.0f)
@@ -115,27 +114,6 @@ void LogicalFontInstance::GetScale(double* nXScale, double* nYScale)
*nXScale = nWidth / nUPEM;
}
-void LogicalFontInstance::Acquire()
-{
- assert(mnRefCount < std::numeric_limits<decltype(mnRefCount)>::max()
- && "LogicalFontInstance::Release() - refcount overflow");
- if (mpFontCache)
- mpFontCache->Acquire(this);
- else
- ++mnRefCount;
-}
-
-void LogicalFontInstance::Release()
-{
- assert(mnRefCount > 0 && "LogicalFontInstance::Release() - refcount underflow");
-
- if (mpFontCache)
- mpFontCache->Release(this);
- else
- if (--mnRefCount == 0)
- delete this;
-}
-
void LogicalFontInstance::AddFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName )
{
if( !mpUnicodeFallbackList )
diff --git a/vcl/source/font/fontselect.cxx b/vcl/source/font/fontselect.cxx
index 80b9ba78ce6b..563c6ebcbc54 100644
--- a/vcl/source/font/fontselect.cxx
+++ b/vcl/source/font/fontselect.cxx
@@ -21,6 +21,7 @@
#include <o3tl/safeint.hxx>
#include <fontselect.hxx>
+#include <fontinstance.hxx>
#include <PhysicalFontFace.hxx>
#include <svdata.hxx>
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 8dcdc06a1ce8..22b5ea460d8e 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -58,12 +58,10 @@ GenericSalLayout::GenericSalLayout(LogicalFontInstance &rFont)
, mpVertGlyphs(nullptr)
, mbFuzzing(utl::ConfigManager::IsFuzzing())
{
- mpFont->Acquire();
}
GenericSalLayout::~GenericSalLayout()
{
- mpFont->Release();
}
void GenericSalLayout::ParseFeatures(const OUString& aName)
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index d9411779fb34..181d2003f3e4 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -6779,7 +6779,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
// This includes ascent / descent.
aRectangle.setHeight(aRefDevFontMetric.GetLineHeight());
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
if (pFontInstance->mnOrientation)
{
// Adapt rectangle for rotated text.
@@ -7269,7 +7269,7 @@ void PDFWriterImpl::drawLine( const Point& rStart, const Point& rStop, const Lin
void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove )
{
// note: units in pFontInstance are ref device pixel
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
long nLineHeight = 0;
long nLinePos = 0;
@@ -7339,7 +7339,7 @@ void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLin
void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove )
{
// note: units in pFontInstance are ref device pixel
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
long nLineHeight = 0;
long nLinePos = 0;
long nLinePos2 = 0;
@@ -7510,7 +7510,7 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
void PDFWriterImpl::drawStrikeoutLine( OStringBuffer& aLine, long nWidth, FontStrikeout eStrikeout, Color aColor )
{
// note: units in pFontInstance are ref device pixel
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
long nLineHeight = 0;
long nLinePos = 0;
long nLinePos2 = 0;
@@ -7607,7 +7607,7 @@ void PDFWriterImpl::drawStrikeoutChar( const Point& rPos, long nWidth, FontStrik
aRect.SetBottom( rPos.Y()+aRefDevFontMetric.GetDescent() );
aRect.SetTop( rPos.Y()-aRefDevFontMetric.GetAscent() );
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
if (pFontInstance->mnOrientation)
{
tools::Polygon aPoly( aRect );
@@ -7642,7 +7642,7 @@ void PDFWriterImpl::drawTextLine( const Point& rPos, long nWidth, FontStrikeout
updateGraphicsState();
// note: units in pFontInstance are ref device pixel
- LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance;
+ LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
Color aUnderlineColor = m_aCurrentPDFState.m_aTextLineColor;
Color aOverlineColor = m_aCurrentPDFState.m_aOverlineColor;
Color aStrikeoutColor = m_aCurrentPDFState.m_aFont.GetColor();
diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx
index a5fe96a76db0..ac44dcbbaf18 100644
--- a/vcl/source/gdi/print.cxx
+++ b/vcl/source/gdi/print.cxx
@@ -580,12 +580,7 @@ void Printer::ImplReleaseFonts()
mbNewFont = true;
mbInitFont = true;
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
-
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
}
@@ -946,11 +941,7 @@ void Printer::dispose()
// OutputDevice Dtor is trying the same thing; that why we need to set
// the FontEntry to NULL here
// TODO: consolidate duplicate cleanup by Printer and OutputDevice
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
delete mpFontCache;
@@ -1087,11 +1078,7 @@ bool Printer::SetPrinterProps( const Printer* pPrinter )
{
ReleaseGraphics();
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
// clean up font list
@@ -1122,11 +1109,7 @@ bool Printer::SetPrinterProps( const Printer* pPrinter )
{
pSVData->mpDefInst->DestroyInfoPrinter( mpInfoPrinter );
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
delete mpFontCache;
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 8972d83c23c8..dad14458705c 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -487,11 +487,7 @@ void VirtualDevice::ImplSetReferenceDevice( RefDevMode i_eRefDevMode, sal_Int32
// the reference device should have only scalable fonts
// => clean up the original font lists before getting new ones
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index c65dd0d5cce9..439a3df75c5b 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -168,7 +168,7 @@ FontMetric OutputDevice::GetFontMetric() const
if( mbNewFont && !ImplNewFont() )
return aMetric;
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
ImplFontMetricDataRef xFontMetric = pFontInstance->mxFontMetric;
// prepare metric
@@ -475,11 +475,7 @@ long OutputDevice::GetFontExtLeading() const
void OutputDevice::ImplClearFontData( const bool bNewFontLists )
{
// the currently selected logical font is no longer needed
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
+ mpFontInstance.clear();
mbInitFont = true;
mbNewFont = true;
@@ -884,12 +880,11 @@ vcl::Font OutputDevice::GetDefaultFont( DefaultFontType nType, LanguageType eLan
// get the name of the first available font
float fExactHeight = static_cast<float>(aSize.Height());
- LogicalFontInstance* pFontInstance = pOutDev->mpFontCache->GetFontInstance( pOutDev->mpFontCollection, aFont, aSize, fExactHeight );
+ rtl::Reference<LogicalFontInstance> pFontInstance = pOutDev->mpFontCache->GetFontInstance( pOutDev->mpFontCollection, aFont, aSize, fExactHeight );
if (pFontInstance)
{
assert(pFontInstance->GetFontFace());
aFont.SetFamilyName(pFontInstance->GetFontFace()->GetFamilyName());
- pFontInstance->Release();
}
}
}
@@ -1034,12 +1029,12 @@ bool OutputDevice::ImplNewFont() const
aSize.setWidth( 1 );
// get font entry
- LogicalFontInstance* pOldFontInstance = mpFontInstance;
+ rtl::Reference<LogicalFontInstance> pOldFontInstance = mpFontInstance;
mpFontInstance = mpFontCache->GetFontInstance( mpFontCollection, maFont, aSize, fExactHeight );
- if( pOldFontInstance )
- pOldFontInstance->Release();
+ bool bNewFontInstance = pOldFontInstance.get() != mpFontInstance.get();
+ pOldFontInstance.clear();
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
if (!pFontInstance)
{
@@ -1049,7 +1044,7 @@ bool OutputDevice::ImplNewFont() const
// mark when lower layers need to get involved
mbNewFont = false;
- if( pFontInstance != pOldFontInstance )
+ if( bNewFontInstance )
mbInitFont = true;
// select font when it has not been initialized yet
@@ -1350,7 +1345,7 @@ std::unique_ptr<SalLayout> OutputDevice::ImplGlyphFallbackLayout( std::unique_pt
// if the system-specific glyph fallback is active
aFontSelData.mpFontInstance = mpFontInstance; // reset the fontinstance to base-level
- LogicalFontInstance* pFallbackFont = mpFontCache->GetGlyphFallbackFont( mpFontCollection,
+ rtl::Reference<LogicalFontInstance> pFallbackFont = mpFontCache->GetGlyphFallbackFont( mpFontCollection,
aFontSelData, nFallbackLevel, aMissingCodes );
if( !pFallbackFont )
break;
@@ -1364,7 +1359,6 @@ std::unique_ptr<SalLayout> OutputDevice::ImplGlyphFallbackLayout( std::unique_pt
if( mpFontInstance->GetFontFace() == pFallbackFont->GetFontFace() &&
aMissingCodes.indexOf(0x202F) == -1 )
{
- pFallbackFont->Release();
continue;
}
}
@@ -1382,8 +1376,6 @@ std::unique_ptr<SalLayout> OutputDevice::ImplGlyphFallbackLayout( std::unique_pt
pMultiSalLayout->SetIncomplete(true);
}
- pFallbackFont->Release();
-
// break when this fallback was sufficient
if( !rLayoutArgs.PrepareFallback() )
break;
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 82833c72d819..1ecdcca86411 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -172,8 +172,7 @@ void OutputDevice::dispose()
mpOutDevStateStack.reset();
// release the active font instance
- if( mpFontInstance )
- mpFontInstance->Release();
+ mpFontInstance.clear();
// remove cached results of GetDevFontList/GetDevSizeList
mpDeviceFontList.reset();
diff --git a/vcl/source/outdev/outdevstate.cxx b/vcl/source/outdev/outdevstate.cxx
index 6713f6481369..24e0b75e3c3e 100644
--- a/vcl/source/outdev/outdevstate.cxx
+++ b/vcl/source/outdev/outdevstate.cxx
@@ -615,12 +615,7 @@ void OutputDevice::ImplReleaseFonts()
mbNewFont = true;
mbInitFont = true;
- if ( mpFontInstance )
- {
- mpFontInstance->Release();
- mpFontInstance = nullptr;
- }
-
+ mpFontInstance.clear();
mpDeviceFontList.reset();
mpDeviceFontSizeList.reset();
}
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 22e7db6230a1..2034a54beb8a 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -211,7 +211,7 @@ void OutputDevice::ImplDrawWaveTextLine( long nBaseX, long nBaseY,
Color aColor,
bool bIsAbove )
{
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
long nLineHeight;
long nLinePos;
@@ -279,7 +279,7 @@ void OutputDevice::ImplDrawStraightTextLine( long nBaseX, long nBaseY,
Color aColor,
bool bIsAbove )
{
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
long nLineHeight = 0;
long nLinePos = 0;
long nLinePos2 = 0;
@@ -521,7 +521,7 @@ void OutputDevice::ImplDrawStrikeoutLine( long nBaseX, long nBaseY,
FontStrikeout eStrikeout,
Color aColor )
{
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
long nLineHeight = 0;
long nLinePos = 0;
long nLinePos2 = 0;
@@ -1030,7 +1030,7 @@ void OutputDevice::DrawWaveLine( const Point& rStartPos, const Point& rEndPos )
}
// #109280# make sure the waveline does not exceed the descent to avoid paint problems
- LogicalFontInstance* pFontInstance = mpFontInstance;
+ LogicalFontInstance* pFontInstance = mpFontInstance.get();
if( nWaveHeight > pFontInstance->mxFontMetric->GetWavelineUnderlineSize() )
{
nWaveHeight = pFontInstance->mxFontMetric->GetWavelineUnderlineSize();
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index ce0be303d2e8..12182b2c3f1f 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -1738,7 +1738,7 @@ void Window::ImplNewInputContext()
SalInputContext aNewContext;
const vcl::Font& rFont = rInputContext.GetFont();
const OUString& rFontName = rFont.GetFamilyName();
- LogicalFontInstance* pFontInstance = nullptr;
+ rtl::Reference<LogicalFontInstance> pFontInstance;
aNewContext.mpFont = nullptr;
if (!rFontName.isEmpty())
{
@@ -1761,9 +1761,6 @@ void Window::ImplNewInputContext()
aNewContext.meLanguage = rFont.GetLanguage();
aNewContext.mnOptions = rInputContext.GetOptions();
pFocusWin->ImplGetFrame()->SetInputContext( &aNewContext );
-
- if ( pFontInstance )
- pFontInstance->Release();
}
void Window::doLazyDelete()
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index 5d7b9ff064ac..d17f02db69ff 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -357,7 +357,7 @@ FreetypeFontFace::FreetypeFontFace( FreetypeFontInfo* pFI, const FontAttributes&
{
}
-LogicalFontInstance* FreetypeFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
+rtl::Reference<LogicalFontInstance> FreetypeFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
{
return new FreetypeFontInstance(*this, rFSD);
}
@@ -366,7 +366,7 @@ LogicalFontInstance* FreetypeFontFace::CreateFontInstance(const FontSelectPatter
FreetypeFont::FreetypeFont( const FontSelectPattern& rFSD, FreetypeFontInfo* pFI )
: maGlyphList( 0),
- mpFontInstance(rFSD.mpFontInstance),
+ mpFontInstance(static_cast<FreetypeFontInstance*>(rFSD.mpFontInstance.get())),
mnRefCount(1),
mnBytesUsed( sizeof(FreetypeFont) ),
mpPrevGCFont( nullptr ),
@@ -385,8 +385,7 @@ FreetypeFont::FreetypeFont( const FontSelectPattern& rFSD, FreetypeFontInfo* pFI
int nPrioEmbedded = nDefaultPrioEmbedded;
// TODO: move update of mpFontInstance into FontEntry class when
// it becomes responsible for the FreetypeFont instantiation
- static_cast<FreetypeFontInstance*>(mpFontInstance)->SetFreetypeFont( this );
- mpFontInstance->Acquire();
+ mpFontInstance->SetFreetypeFont( this );
maFaceFT = pFI->GetFaceFT();
@@ -485,7 +484,7 @@ FreetypeFont::~FreetypeFont()
mpFontInfo->ReleaseFaceFT();
- mpFontInstance->Release();
+ mpFontInstance.clear();
ReleaseFromGarbageCollect();
}
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 11957c7043dc..b0158f9154d5 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -658,7 +658,7 @@ rtl::Reference<PhysicalFontFace> WinFontFace::Clone() const
return new WinFontFace(*this);
}
-LogicalFontInstance* WinFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
+rtl::Reference<LogicalFontInstance> WinFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
{
return new WinFontInstance(*this, rFSD);
}
@@ -922,33 +922,16 @@ void WinSalGraphics::SetFont( const FontSelectPattern* pFont, int nFallbackLevel
for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i )
{
if( mhFonts[i] )
- {
::DeleteFont( mhFonts[i] );
- mhFonts[ i ] = nullptr;
- }
- if (mpWinFontEntry[i])
- {
- GetWinFontEntry(i)->Release();
- mpWinFontEntry[i] = nullptr;
- }
- mfFontScale[i] = 1.0;
+ mhFonts[ i ] = nullptr;
+ mpWinFontEntry[i] = nullptr;
}
return;
}
- if (mpWinFontEntry[nFallbackLevel])
- {
- GetWinFontEntry(nFallbackLevel)->Release();
- }
// WinSalGraphics::GetEmbedFontData does not set mpFontInstance
// since it is interested in font file data only.
- if (pFont->mpFontInstance)
- {
- pFont->mpFontInstance->Acquire();
- }
-
- WinFontInstance *pFontInstance = static_cast<WinFontInstance*>(pFont->mpFontInstance);
- mpWinFontEntry[ nFallbackLevel ] = pFontInstance;
+ mpWinFontEntry[ nFallbackLevel ] = reinterpret_cast<WinFontInstance*>( pFont->mpFontInstance.get() );
HFONT hOldFont = nullptr;
HFONT hNewFont = pFontInstance ? pFontInstance->GetHFONT() : nullptr;
diff --git a/vcl/win/gdi/salgdi.cxx b/vcl/win/gdi/salgdi.cxx
index aba0d6e6589e..57dd4ed37efd 100644
--- a/vcl/win/gdi/salgdi.cxx
+++ b/vcl/win/gdi/salgdi.cxx
@@ -29,6 +29,7 @@
#include <win/salgdi.h>
#include <win/salframe.h>
#include <win/salvd.h>
+#include <win/winlayout.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <salgdiimpl.hxx>
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 392a6abef02a..fa0c2b683387 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -310,11 +310,6 @@ std::unique_ptr<SalLayout> WinSalGraphics::GetTextLayout(ImplLayoutArgs& /*rArgs
return std::unique_ptr<SalLayout>(aLayout);
}
-LogicalFontInstance * WinSalGraphics::GetWinFontEntry(int const nFallbackLevel)
-{
- return mpWinFontEntry[nFallbackLevel];
-}
-
WinFontInstance::WinFontInstance(const PhysicalFontFace& rPFF, const FontSelectPattern& rFSP)
: LogicalFontInstance(rPFF, rFSP)
, m_hFont(nullptr)
commit 340b175527de668a16e296b9e434572af98b36fa
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Tue Jun 5 14:48:51 2018 +0200
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Wed Mar 6 12:38:39 2019 +0100
manage PhysicalFontFace by rtl::Reference
Change-Id: I8f66b5afb066fe83abb83c56ebde6f21197f894b
Reviewed-on: https://gerrit.libreoffice.org/55333
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
(cherry picked from commit 77a01802d1a0452814718789bb0c76adeeb747c0)
diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 39237ff46f89..2406b6cf41da 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -20,6 +20,8 @@
#ifndef INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
#define INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
+#include <salhelper/simplereferenceobject.hxx>
+#include <rtl/ref.hxx>
#include <vcl/dllapi.h>
#include "fontattributes.hxx"
@@ -40,7 +42,6 @@ public:
// TODO: no more direct access to members
-// TODO: add reference counting
// TODO: get rid of height/width for scalable fonts
// TODO: make cloning cheaper
@@ -50,13 +51,11 @@ public:
* It acts as a factory for its corresponding LogicalFontInstances and
* can be extended to cache device and font instance specific data.
*/
-class VCL_PLUGIN_PUBLIC PhysicalFontFace : public FontAttributes
+class VCL_PLUGIN_PUBLIC PhysicalFontFace : public FontAttributes, public salhelper::SimpleReferenceObject
{
public:
- virtual ~PhysicalFontFace() {}
-
virtual LogicalFontInstance* CreateFontInstance(const FontSelectPattern&) const;
- virtual PhysicalFontFace* Clone() const = 0;
+ virtual rtl::Reference<PhysicalFontFace> Clone() const = 0;
int GetHeight() const { return mnHeight; }
int GetWidth() const { return mnWidth; }
@@ -68,6 +67,7 @@ public:
protected:
explicit PhysicalFontFace(const FontAttributes&);
+ PhysicalFontFace(const PhysicalFontFace&);
void SetBitmapSize( int nW, int nH ) { mnWidth=nW; mnHeight=nH; }
long mnWidth; // Width (in pixels)
diff --git a/vcl/inc/PhysicalFontFamily.hxx b/vcl/inc/PhysicalFontFamily.hxx
index e88db8203809..990256590c88 100644
--- a/vcl/inc/PhysicalFontFamily.hxx
+++ b/vcl/inc/PhysicalFontFamily.hxx
@@ -67,7 +67,7 @@ public:
void InitMatchData( const utl::FontSubstConfiguration&,
const OUString& rSearchName );
- bool AddFontFace( PhysicalFontFace* );
+ void AddFontFace( PhysicalFontFace* );
PhysicalFontFace* FindBestFontFace( const FontSelectPattern& rFSD ) const;
@@ -78,7 +78,7 @@ static void CalcType( ImplFontAttrs& rType, FontWeight& rWeight, Fon
FontFamily eFamily, const utl::FontNameAttr* pFontAttr );
private:
- std::vector< std::unique_ptr<PhysicalFontFace> > maFontFaces;
+ std::vector< rtl::Reference<PhysicalFontFace> > maFontFaces;
OUString maFamilyName; // original font family name
OUString maSearchName; // normalized font family name
diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx
index 90ed83d3ab33..317b7181198d 100644
--- a/vcl/inc/fontinstance.hxx
+++ b/vcl/inc/fontinstance.hxx
@@ -23,6 +23,7 @@
#include "fontselect.hxx"
#include "impfontmetricdata.hxx"
+#include <rtl/ref.hxx>
#include <unordered_map>
#include <memory>
@@ -64,7 +65,7 @@ public: // TODO: make data members private
double GetAverageWidthFactor() const { return m_nAveWidthFactor; }
const FontSelectPattern& GetFontSelectPattern() const { return m_aFontSelData; }
- const PhysicalFontFace* GetFontFace() const { return m_pFontFace; }
+ const PhysicalFontFace* GetFontFace() const { return m_pFontFace.get(); }
const ImplFontCache* GetFontCache() const { return mpFontCache; }
int GetKashidaWidth();
@@ -91,7 +92,7 @@ private:
const FontSelectPattern m_aFontSelData;
hb_font_t* m_pHbFont;
double m_nAveWidthFactor;
- const PhysicalFontFace* m_pFontFace;
+ rtl::Reference<PhysicalFontFace> m_pFontFace;
};
inline hb_font_t* LogicalFontInstance::GetHbFont()
diff --git a/vcl/inc/outdev.h b/vcl/inc/outdev.h
index 3b626f3b0d8e..2aabdfa93acf 100644
--- a/vcl/inc/outdev.h
+++ b/vcl/inc/outdev.h
@@ -41,12 +41,12 @@ enum class AddFontSubstituteFlags;
class ImplDeviceFontList
{
private:
- std::vector<PhysicalFontFace*> maDevFontVector;
+ std::vector<rtl::Reference<PhysicalFontFace>> maDevFontVector;
public:
ImplDeviceFontList() { maDevFontVector.reserve(1024); }
void Add( PhysicalFontFace* pFace ) { maDevFontVector.push_back( pFace ); }
- PhysicalFontFace* Get( int nIndex ) const { return maDevFontVector[ nIndex ]; }
+ PhysicalFontFace* Get( int nIndex ) const { return maDevFontVector[ nIndex ].get(); }
int Count() const { return maDevFontVector.size(); }
};
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 064b2125e8be..2f53a44d694e 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -61,7 +61,7 @@ public:
CoreTextFontFace( const FontAttributes&, sal_IntPtr nFontID );
virtual ~CoreTextFontFace() override;
- PhysicalFontFace* Clone() const override;
+ rtl::Reference<PhysicalFontFace> Clone() const override;
sal_IntPtr GetFontId() const override;
int GetFontTable( uint32_t nTagCode, unsigned char* ) const;
@@ -128,7 +128,7 @@ private:
CTFontCollectionRef mpCTFontCollection;
CFArrayRef mpCTFontArray;
- std::unordered_map<sal_IntPtr,CoreTextFontFace*> maFontContainer;
+ std::unordered_map<sal_IntPtr, rtl::Reference<CoreTextFontFace>> maFontContainer;
};
diff --git a/vcl/inc/unx/freetype_glyphcache.hxx b/vcl/inc/unx/freetype_glyphcache.hxx
index 0a7b88887b24..d6b87b7ab7a9 100644
--- a/vcl/inc/unx/freetype_glyphcache.hxx
+++ b/vcl/inc/unx/freetype_glyphcache.hxx
@@ -115,7 +115,7 @@ public:
FreetypeFontFace( FreetypeFontInfo*, const FontAttributes& );
virtual LogicalFontInstance* CreateFontInstance( const FontSelectPattern& ) const override;
- virtual PhysicalFontFace* Clone() const override { return new FreetypeFontFace( *this ); }
+ virtual rtl::Reference<PhysicalFontFace> Clone() const override { return new FreetypeFontFace( *this ); }
virtual sal_IntPtr GetFontId() const override { return mpFreetypeFontInfo->GetFontId(); }
};
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index d43a1b28bef7..dc7bc7510229 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -63,7 +63,7 @@ public:
BYTE nPitchAndFamily );
virtual ~WinFontFace() override;
- virtual PhysicalFontFace* Clone() const override;
+ virtual rtl::Reference<PhysicalFontFace> Clone() const override;
virtual LogicalFontInstance* CreateFontInstance( const FontSelectPattern& ) const override;
virtual sal_IntPtr GetFontId() const override;
void SetFontId( sal_IntPtr nId ) { mnId = nId; }
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index 0cd071385aaa..df5273036bc4 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -114,6 +114,6 @@ bool Qt5FontFace::GetFontCapabilities(vcl::FontCapabilities& rFontCapabilities)
return rFontCapabilities.oUnicodeRange || rFontCapabilities.oCodePageRange;
}
-PhysicalFontFace* Qt5FontFace::Clone() const { return new Qt5FontFace(*this); }
+rtl::Reference<PhysicalFontFace> Qt5FontFace::Clone() const { return new Qt5FontFace(*this); }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5FontFace.hxx b/vcl/qt5/Qt5FontFace.hxx
index 9468cf15b4e3..4cc21010a8b7 100644
--- a/vcl/qt5/Qt5FontFace.hxx
+++ b/vcl/qt5/Qt5FontFace.hxx
@@ -38,7 +38,7 @@ public:
static Qt5FontFace* fromQFont(const QFont& rFont);
- PhysicalFontFace* Clone() const override;
+ rtl::Reference<PhysicalFontFace> Clone() const override;
sal_IntPtr GetFontId() const override;
int GetFontTable(const char pTagName[5], unsigned char*) const;
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index ac20c1e9f4c5..1d72f601eafa 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -283,7 +283,7 @@ hb_font_t* CoreTextStyle::ImplInitHbFont()
return InitHbFont(pHbFace);
}
-PhysicalFontFace* CoreTextFontFace::Clone() const
+rtl::Reference<PhysicalFontFace> CoreTextFontFace::Clone() const
{
return new CoreTextFontFace( *this);
}
@@ -504,9 +504,9 @@ static void fontEnumCallBack( const void* pValue, void* pContext )
if( bFontEnabled)
{
const sal_IntPtr nFontId = reinterpret_cast<sal_IntPtr>(pValue);
- CoreTextFontFace* pFontData = new CoreTextFontFace( rDFA, nFontId );
+ rtl::Reference<CoreTextFontFace> pFontData = new CoreTextFontFace( rDFA, nFontId );
SystemFontList* pFontList = static_cast<SystemFontList*>(pContext);
- pFontList->AddFont( pFontData );
+ pFontList->AddFont( pFontData.get() );
}
}
@@ -517,11 +517,6 @@ SystemFontList::SystemFontList()
SystemFontList::~SystemFontList()
{
- auto it = maFontContainer.cbegin();
- for(; it != maFontContainer.cend(); ++it )
- {
- delete (*it).second;
- }
maFontContainer.clear();
if( mpCTFontArray )
@@ -545,7 +540,7 @@ void SystemFontList::AnnounceFonts( PhysicalFontCollection& rFontCollection ) co
auto it = maFontContainer.cbegin();
for(; it != maFontContainer.cend(); ++it )
{
- rFontCollection.Add( (*it).second->Clone() );
+ rFontCollection.Add( (*it).second->Clone().get() );
}
}
@@ -556,7 +551,7 @@ CoreTextFontFace* SystemFontList::GetFontDataFromId( sal_IntPtr nFontId ) const
{
return nullptr;
}
- return (*it).second;
+ return (*it).second.get();
}
bool SystemFontList::Init()
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index b0f074b61303..7154bd672e0f 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -801,8 +801,8 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV
free( const_cast<TTSimpleGlyphMetrics *>(pGlyphMetrics) );
}
- CoreTextFontFace rCTFontData(*pFontData, pFontData->GetFontId());
- FontCharMapRef xFCMap = rCTFontData.GetFontCharMap();
+ rtl::Reference<CoreTextFontFace> rCTFontData(new CoreTextFontFace(*pFontData, pFontData->GetFontId()));
+ FontCharMapRef xFCMap = rCTFontData->GetFontCharMap();
SAL_WARN_IF( !xFCMap.is() || !xFCMap->GetCharCount(), "vcl", "no charmap" );
// get unicode<->glyph encoding
diff --git a/vcl/source/font/PhysicalFontCollection.cxx b/vcl/source/font/PhysicalFontCollection.cxx
index fcdef005dfdd..9a87d8c0fbf3 100644
--- a/vcl/source/font/PhysicalFontCollection.cxx
+++ b/vcl/source/font/PhysicalFontCollection.cxx
@@ -283,10 +283,7 @@ void PhysicalFontCollection::Add( PhysicalFontFace* pNewData )
PhysicalFontFamily* pFoundData = FindOrCreateFontFamily( aSearchName );
- bool bKeepNewData = pFoundData->AddFontFace( pNewData );
-
- if( !bKeepNewData )
- delete pNewData;
+ pFoundData->AddFontFace( pNewData );
}
// find the font from the normalized font family name
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index 40948c41e77e..690fd1fdc401 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -37,6 +37,14 @@ PhysicalFontFace::PhysicalFontFace( const FontAttributes& rDFA )
SetSymbolFlag( true );
}
+PhysicalFontFace::PhysicalFontFace( const PhysicalFontFace& other )
+ : FontAttributes( other )
+ , salhelper::SimpleReferenceObject()
+ , mnWidth(other.mnWidth)
+ , mnHeight(other.mnWidth)
+{
+}
+
LogicalFontInstance* PhysicalFontFace::CreateFontInstance(const FontSelectPattern& rFSD) const
{
return new LogicalFontInstance(*this, rFSD);
diff --git a/vcl/source/font/PhysicalFontFamily.cxx b/vcl/source/font/PhysicalFontFamily.cxx
index 34ad038a38a7..d0c1c2dad165 100644
--- a/vcl/source/font/PhysicalFontFamily.cxx
+++ b/vcl/source/font/PhysicalFontFamily.cxx
@@ -100,7 +100,7 @@ PhysicalFontFamily::~PhysicalFontFamily()
{
}
-bool PhysicalFontFamily::AddFontFace( PhysicalFontFace* pNewFontFace )
+void PhysicalFontFamily::AddFontFace( PhysicalFontFace* pNewFontFace )
{
if( maFontFaces.empty() )
{
@@ -162,19 +162,18 @@ bool PhysicalFontFamily::AddFontFace( PhysicalFontFace* pNewFontFace )
// ignore duplicate if its quality is worse
if( pNewFontFace->GetQuality() < pFoundFontFace->GetQuality() )
- return false;
+ return;
// keep the device font if its quality is good enough
if( pNewFontFace->GetQuality() == pFoundFontFace->GetQuality() )
- return false;
+ return;
// replace existing font face with a better one
- it->reset(pNewFontFace); // insert at sort position
- return true;
+ *it = pNewFontFace; // insert at sort position
+ return;
}
maFontFaces.emplace(it, pNewFontFace); // insert at sort position
- return true;
}
// get font attributes using the normalized font family name
@@ -265,7 +264,7 @@ void PhysicalFontFamily::UpdateCloneFontList(PhysicalFontCollection& rFontCollec
pFamily = rFontCollection.FindOrCreateFontFamily(aFamilyName);
}
assert(pFamily);
- PhysicalFontFace* pClonedFace = pFoundFontFace->Clone();
+ rtl::Reference<PhysicalFontFace> pClonedFace = pFoundFontFace->Clone();
#if OSL_DEBUG_LEVEL > 0
OUString aClonedFamilyName = GetEnglishSearchFontName( pClonedFace->GetFamilyName() );
@@ -273,8 +272,7 @@ void PhysicalFontFamily::UpdateCloneFontList(PhysicalFontCollection& rFontCollec
assert( rFontCollection.FindOrCreateFontFamily( aClonedFamilyName ) == pFamily );
#endif
- if (! pFamily->AddFontFace( pClonedFace ) )
- delete pClonedFace;
+ pFamily->AddFontFace( pClonedFace.get() );
}
}
diff --git a/vcl/source/font/fontinstance.cxx b/vcl/source/font/fontinstance.cxx
index 6837329fbfaf..fca20fd03ca3 100644
--- a/vcl/source/font/fontinstance.cxx
+++ b/vcl/source/font/fontinstance.cxx
@@ -52,7 +52,7 @@ LogicalFontInstance::LogicalFontInstance(const PhysicalFontFace& rFontFace, cons
, m_aFontSelData(rFontSelData)
, m_pHbFont(nullptr)
, m_nAveWidthFactor(1.0f)
- , m_pFontFace(&rFontFace)
+ , m_pFontFace(&const_cast<PhysicalFontFace&>(rFontFace))
{
const_cast<FontSelectPattern*>(&m_aFontSelData)->mpFontInstance = this;
}
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index acec33b4ec5c..d9411779fb34 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -3470,8 +3470,8 @@ bool PDFWriterImpl::emitFonts()
// emit builtin font for widget appearances / variable text
for (auto & item : m_aBuiltinFontToObjectMap)
{
- PdfBuiltinFontFace aData(m_aBuiltinFonts[item.first]);
- item.second = emitBuiltinFont( &aData, item.second );
+ rtl::Reference<PdfBuiltinFontFace> aData(new PdfBuiltinFontFace(m_aBuiltinFonts[item.first]));
+ item.second = emitBuiltinFont( aData.get(), item.second );
}
appendBuiltinFontsToDict( aFontDict );
aFontDict.append( "\n>>\nendobj\n\n" );
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 23da7f6052cc..0aa63514b2c5 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -1291,7 +1291,7 @@ public:
explicit PdfBuiltinFontFace( const PDFWriterImpl::BuiltinFont& );
const PDFWriterImpl::BuiltinFont& GetBuiltinFont() const { return mrBuiltin; }
- virtual PhysicalFontFace* Clone() const override { return new PdfBuiltinFontFace(*this); }
+ virtual rtl::Reference<PhysicalFontFace> Clone() const override { return new PdfBuiltinFontFace(*this); }
virtual sal_IntPtr GetFontId() const override { return reinterpret_cast<sal_IntPtr>(&mrBuiltin); }
};
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index eb094f64b733..66d121b712fe 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -521,7 +521,7 @@ private:
public:
explicit ImplPspFontData( const psp::FastPrintFontInfo& );
virtual sal_IntPtr GetFontId() const override { return mnFontId; }
- virtual PhysicalFontFace* Clone() const override { return new ImplPspFontData( *this ); }
+ virtual rtl::Reference<PhysicalFontFace> Clone() const override { return new ImplPspFontData( *this ); }
};
ImplPspFontData::ImplPspFontData(const psp::FastPrintFontInfo& rInfo)
@@ -887,9 +887,9 @@ void GenPspGraphics::AnnounceFonts( PhysicalFontCollection* pFontCollection, con
nQuality += 10;
}
- ImplPspFontData* pFD = new ImplPspFontData( aInfo );
+ rtl::Reference<ImplPspFontData> pFD(new ImplPspFontData( aInfo ));
pFD->IncreaseQualityBy( nQuality );
- pFontCollection->Add( pFD );
+ pFontCollection->Add( pFD.get() );
}
bool GenPspGraphics::blendBitmap( const SalTwoRect&, const SalBitmap& )
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index a5e240afc480..11957c7043dc 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -554,7 +554,7 @@ static FontAttributes WinFont2DevFontAttributes( const ENUMLOGFONTEXW& rEnumFont
}
-static WinFontFace* ImplLogMetricToDevFontDataW( const ENUMLOGFONTEXW* pLogFont,
+static rtl::Reference<WinFontFace> ImplLogMetricToDevFontDataW( const ENUMLOGFONTEXW* pLogFont,
const NEWTEXTMETRICW* pMetric,
DWORD nFontType )
{
@@ -562,7 +562,7 @@ static WinFontFace* ImplLogMetricToDevFontDataW( const ENUMLOGFONTEXW* pLogFont,
if ( nFontType & RASTER_FONTTYPE )
nHeight = pMetric->tmHeight - pMetric->tmInternalLeading;
- WinFontFace* pData = new WinFontFace(
+ rtl::Reference<WinFontFace> pData = new WinFontFace(
WinFont2DevFontAttributes(*pLogFont, *pMetric),
nHeight,
pLogFont->elfLogFont.lfCharSet,
@@ -653,7 +653,7 @@ sal_IntPtr WinFontFace::GetFontId() const
return mnId;
}
-PhysicalFontFace* WinFontFace::Clone() const
+rtl::Reference<PhysicalFontFace> WinFontFace::Clone() const
{
return new WinFontFace(*this);
}
@@ -1108,10 +1108,10 @@ int CALLBACK SalEnumFontsProcExW( const LOGFONTW* lpelfe,
return 1;
}
- WinFontFace* pData = ImplLogMetricToDevFontDataW( pLogFont, &(pMetric->ntmTm), nFontType );
+ rtl::Reference<WinFontFace> pData = ImplLogMetricToDevFontDataW( pLogFont, &(pMetric->ntmTm), nFontType );
pData->SetFontId( sal_IntPtr( pInfo->mnFontCount++ ) );
- pInfo->mpList->Add( pData );
+ pInfo->mpList->Add( pData.get() );
}
return 1;
@@ -1312,11 +1312,11 @@ bool WinSalGraphics::AddTempDevFont( PhysicalFontCollection* pFontCollection,
aDFS.maMapName = aFontName;
*/
- WinFontFace* pFontData = new WinFontFace( aDFA, 0,
+ rtl::Reference<WinFontFace> pFontData = new WinFontFace( aDFA, 0,
sal::static_int_cast<BYTE>(DEFAULT_CHARSET),
sal::static_int_cast<BYTE>(TMPF_VECTOR|TMPF_TRUETYPE) );
- pFontData->SetFontId( reinterpret_cast<sal_IntPtr>(pFontData) );
- pFontCollection->Add( pFontData );
+ pFontData->SetFontId( reinterpret_cast<sal_IntPtr>(pFontData.get()) );
+ pFontCollection->Add( pFontData.get() );
return true;
}
commit 49367deda8d57fe95a1577cc6b280df9a41f1703
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
AuthorDate: Wed Feb 27 08:40:04 2019 +0100
Commit: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
CommitDate: Thu Feb 28 07:50:52 2019 +0100
tdf#123728 Always print on main thread to avoid deadlocks
Using lambda doesn't work on this branch, thus code differs from master commit.
Reviewed-on: https://gerrit.libreoffice.org/68421
Tested-by: Jenkins
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
(cherry picked from commit 110803068b75ffd895a9b1139aee2248d30f085b)
Change-Id: Ia8c2600aee42c3063e18032d1e485ad417ec4639
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index 752bec0ebc07..72066d250740 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -87,6 +87,7 @@
#include <framework/titlehelper.hxx>
#include <comphelper/numberedcollection.hxx>
#include <unotools/ucbhelper.hxx>
+#include <vcl/threadex.hxx>
#include <sfx2/sfxbasecontroller.hxx>
#include <sfx2/viewfac.hxx>
@@ -1410,15 +1411,24 @@ void SAL_CALL SfxBaseModel::setPrinter(const Sequence< beans::PropertyValue >& r
m_pData->m_xPrintable->setPrinter( rPrinter );
}
+static bool ImplPrintStatic(const Reference<view::XPrintable>& m_xPrintable,
+ const Sequence<beans::PropertyValue>& rOptions)
+{
+ m_xPrintable->print(rOptions);
+ return true;
+}
+
void SAL_CALL SfxBaseModel::print(const Sequence< beans::PropertyValue >& rOptions)
{
SfxModelGuard aGuard( *this );
if ( impl_getPrintHelper() )
- m_pData->m_xPrintable->print( rOptions );
+ {
+ // tdf#123728 Always print on main thread to avoid deadlocks
+ vcl::solarthread::syncExecute(std::bind(&ImplPrintStatic, m_pData->m_xPrintable, rOptions));
+ }
}
-
// XStorable
commit 96f039b85ab89159eb1213c44964518ba912f58e
Author: Olivier Hallot <olivier.hallot at libreoffice.org>
AuthorDate: Tue Feb 26 10:49:04 2019 -0300
Commit: Gerrit Code Review <gerrit at gerrit.libreoffice.org>
CommitDate: Thu Feb 28 03:38:55 2019 +0100
Update git submodules
* Update helpcontent2 from branch 'libreoffice-6-1'
- tdf#117890 Remove unhelpful screenshots (1/2)
Change-Id: I8a96220ae688f78fe43d66ab205323f3d4605140
Reviewed-on: https://gerrit.libreoffice.org/68392
Tested-by: Jenkins
Reviewed-by: Olivier Hallot <olivier.hallot at libreoffice.org>
(cherry picked from commit c74a4653f50aedfd99ee83a1a841ad5b7886b9be)
Reviewed-on: https://gerrit.libreoffice.org/68481
Reviewed-by: Adolfo Jayme Barrientos <fitojb at ubuntu.com>
Tested-by: Adolfo Jayme Barrientos <fitojb at ubuntu.com>
diff --git a/helpcontent2 b/helpcontent2
index f91032998da2..295d7dc808b2 160000
--- a/helpcontent2
+++ b/helpcontent2
@@ -1 +1 @@
-Subproject commit f91032998da2655119521039f56984acf4f42ffa
+Subproject commit 295d7dc808b2a22709586cf9c86fb4219a494496
commit f88e42aff3b55fd5b523b10b24fc07714df8879a
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Feb 27 16:56:08 2019 +0000
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Feb 27 22:16:59 2019 +0100
add missing responses
Change-Id: I2c24ea46b6e81ed02ae53da5e9ae1b7df85e44a1
Reviewed-on: https://gerrit.libreoffice.org/68456
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Jenkins
diff --git a/sc/uiconfig/scalc/ui/changesourcedialog.ui b/sc/uiconfig/scalc/ui/changesourcedialog.ui
index f492fe5d1b64..9f2e4c3c2dbc 100644
--- a/sc/uiconfig/scalc/ui/changesourcedialog.ui
+++ b/sc/uiconfig/scalc/ui/changesourcedialog.ui
@@ -147,6 +147,8 @@
</object>
</child>
<action-widgets>
+ <action-widget response="-5">ok</action-widget>
+ <action-widget response="-6">cancel</action-widget>
<action-widget response="-11">help</action-widget>
</action-widgets>
</object>
commit 691f908eb4df8c5a978e85f51218a0edece57ec1
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed Feb 20 13:31:44 2019 +0100
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Tue Feb 26 09:42:03 2019 +0100
cairo: upgrade to release 1.16.0
This fixes some minor CVEs.
Not including the fix for CVE-2018-18064, which does not affect LO
because we use the default implementation of FT_Memory which uses
free/malloc.
Change-Id: Ic047ed52cff3fdeba068f1b8d303c6c96c69addd
Reviewed-on: https://gerrit.libreoffice.org/68088
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
(cherry picked from commit caeaa7b90e42c60ec407e1f0cd5b5db2b30f55d2)
Reviewed-on: https://gerrit.libreoffice.org/68217
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/download.lst b/download.lst
index 362234fecc16..e2008d900008 100644
--- a/download.lst
+++ b/download.lst
@@ -14,9 +14,9 @@ export BSH_SHA256SUM := 9e93c73e23aff644b17dfff656444474c14150e7f3b38b19635e6222
export BSH_TARBALL := beeca87be45ec87d241ddd0e1bad80c1-bsh-2.0b6-src.zip
export BZIP2_SHA256SUM := a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
export BZIP2_TARBALL := 00b516f4704d4a7cb50a1d97e6e8e15b-bzip2-1.0.6.tar.gz
-export CAIRO_SHA256SUM := 7623081b94548a47ee6839a7312af34e9322997806948b6eec421a8c6d0594c9
-export CAIRO_VERSION_MICRO := 12
-export CAIRO_TARBALL := cairo-1.15.$(CAIRO_VERSION_MICRO).tar.xz
+export CAIRO_SHA256SUM := 5e7b29b3f113ef870d1e3ecf8adf21f923396401604bda16d44be45e66052331
+export CAIRO_VERSION_MICRO := 0
+export CAIRO_TARBALL := cairo-1.16.$(CAIRO_VERSION_MICRO).tar.xz
export CDR_SHA256SUM := e7a7e8b00a3df5798110024d7061fe9d1c3330277d2e4fa9213294f966a4a66d
export CDR_TARBALL := libcdr-0.1.4.tar.xz
export CLUCENE_SHA256SUM := ddfdc433dd8ad31b5c5819cc4404a8d2127472a3b720d3e744e8c51d79732eab
diff --git a/external/cairo/ExternalPackage_cairo.mk b/external/cairo/ExternalPackage_cairo.mk
index 154c84919a03..3b78a52fed76 100644
--- a/external/cairo/ExternalPackage_cairo.mk
+++ b/external/cairo/ExternalPackage_cairo.mk
@@ -14,7 +14,7 @@ $(eval $(call gb_ExternalPackage_use_external_project,cairo,cairo))
ifneq ($(DISABLE_DYNLOADING),TRUE)
ifneq ($(OS),ANDROID)
-$(eval $(call gb_ExternalPackage_add_file,cairo,$(LIBO_LIB_FOLDER)/libcairo.so.2,src/.libs/libcairo.so.2.115$(CAIRO_VERSION_MICRO).0))
+$(eval $(call gb_ExternalPackage_add_file,cairo,$(LIBO_LIB_FOLDER)/libcairo.so.2,src/.libs/libcairo.so.2.1160$(CAIRO_VERSION_MICRO).0))
endif
endif
commit 7b1eacbac5d104f34b6e35db4430b03a7caf8125
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Jul 26 16:04:06 2018 +0100
Commit: Michael Stahl <Michael.Stahl at cib.de>
CommitDate: Mon Feb 25 10:57:42 2019 +0100
bump to latest cairo
Reviewed-on: https://gerrit.libreoffice.org/58134
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
(cherry picked from commit 00f6bec6b70130327313b9e203625272ef05ae93)
fix own-cairo edge case build
Reviewed-on: https://gerrit.libreoffice.org/59663
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
(cherry picked from commit 30020423bd76c6770db1627cfec684708ab3427c)
Change-Id: I001da359569d37afe482cdbb50e9c8b3ced24aff
Reviewed-on: https://gerrit.libreoffice.org/68216
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
Tested-by: Jenkins
diff --git a/download.lst b/download.lst
index 2524c42f8cde..362234fecc16 100644
--- a/download.lst
+++ b/download.lst
@@ -14,9 +14,9 @@ export BSH_SHA256SUM := 9e93c73e23aff644b17dfff656444474c14150e7f3b38b19635e6222
export BSH_TARBALL := beeca87be45ec87d241ddd0e1bad80c1-bsh-2.0b6-src.zip
export BZIP2_SHA256SUM := a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
export BZIP2_TARBALL := 00b516f4704d4a7cb50a1d97e6e8e15b-bzip2-1.0.6.tar.gz
-export CAIRO_SHA256SUM := 7e87878658f2c9951a14fc64114d4958c0e65ac47530b8ac3078b2ce41b66a09
-export CAIRO_VERSION_MICRO := 10
-export CAIRO_TARBALL := cairo-1.14.$(CAIRO_VERSION_MICRO).tar.xz
+export CAIRO_SHA256SUM := 7623081b94548a47ee6839a7312af34e9322997806948b6eec421a8c6d0594c9
+export CAIRO_VERSION_MICRO := 12
+export CAIRO_TARBALL := cairo-1.15.$(CAIRO_VERSION_MICRO).tar.xz
export CDR_SHA256SUM := e7a7e8b00a3df5798110024d7061fe9d1c3330277d2e4fa9213294f966a4a66d
export CDR_TARBALL := libcdr-0.1.4.tar.xz
export CLUCENE_SHA256SUM := ddfdc433dd8ad31b5c5819cc4404a8d2127472a3b720d3e744e8c51d79732eab
diff --git a/external/cairo/ExternalPackage_cairo.mk b/external/cairo/ExternalPackage_cairo.mk
index 3d0f1a9d4e54..154c84919a03 100644
--- a/external/cairo/ExternalPackage_cairo.mk
+++ b/external/cairo/ExternalPackage_cairo.mk
@@ -14,7 +14,7 @@ $(eval $(call gb_ExternalPackage_use_external_project,cairo,cairo))
ifneq ($(DISABLE_DYNLOADING),TRUE)
ifneq ($(OS),ANDROID)
-$(eval $(call gb_ExternalPackage_add_file,cairo,$(LIBO_LIB_FOLDER)/libcairo.so.2,src/.libs/libcairo.so.2.11400.$(CAIRO_VERSION_MICRO)))
+$(eval $(call gb_ExternalPackage_add_file,cairo,$(LIBO_LIB_FOLDER)/libcairo.so.2,src/.libs/libcairo.so.2.115$(CAIRO_VERSION_MICRO).0))
endif
endif
commit a48ca23f18ba450a55515cd93fc4fdc184f3853f
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed Feb 20 15:23:11 2019 +0100
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Fri Feb 22 12:53:06 2019 +0100
mDNSResponder: upgrade to release 878.200.35
Apple can't afford the costly GPG licenses to sign releases apparently,
but the sha256 matches some OpenWRT and FreshPorts repos...
Fixes CVE-2015-7988.
Removing windows build patches, fixed upstream (except for the last hunk
of the SOCKET patch, but that is in code that is only used on MacOSX).
Change-Id: I9fdba5929badb75f995c66da0850d188780e7beb
Reviewed-on: https://gerrit.libreoffice.org/68092
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
(cherry picked from commit 3a85c2db176db708c0ff9401c40858eb60e80f1e)
Reviewed-on: https://gerrit.libreoffice.org/68139
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/download.lst b/download.lst
index 09e420097c38..2524c42f8cde 100644
--- a/download.lst
+++ b/download.lst
@@ -168,8 +168,8 @@ export MARIADB_CONNECTOR_C_SHA256SUM := fd2f751dea049c1907735eb236aeace1d811d6a8
export MARIADB_CONNECTOR_C_TARBALL := a233181e03d3c307668b4c722d881661-mariadb_client-2.0.0-src.tar.gz
export MDDS_SHA256SUM := dcb8cd2425567a5a5ec164afea475bce57784bca3e352ad4cbdd3d1a7e08e5a1
export MDDS_TARBALL := mdds-1.3.1.tar.bz2
-export MDNSRESPONDER_SHA256SUM := 4737cb51378377e11d0edb7bcdd1bec79cbdaa7b27ea09c13e3006e58f8d92c0
-export MDNSRESPONDER_TARBALL := mDNSResponder-576.30.4.tar.gz
+export MDNSRESPONDER_SHA256SUM := e777b4d7dbf5eb1552cb80090ad1ede319067ab6e45e3990d68aabf6e8b3f5a0
+export MDNSRESPONDER_TARBALL := mDNSResponder-878.200.35.tar.gz
export MSPUB_SHA256SUM := ef36c1a1aabb2ba3b0bedaaafe717bf4480be2ba8de6f3894be5fd3702b013ba
export MSPUB_TARBALL := libmspub-0.1.4.tar.xz
export MWAW_SHA256SUM := aca8bf1ce55ed83adbea82c70d4c8bebe8139f334b3481bf5a6e407f91f33ce9
diff --git a/external/mdnsresponder/UnpackedTarball_mDNSResponder.mk b/external/mdnsresponder/UnpackedTarball_mDNSResponder.mk
index 5b0140e4c149..9b436b2f077c 100644
--- a/external/mdnsresponder/UnpackedTarball_mDNSResponder.mk
+++ b/external/mdnsresponder/UnpackedTarball_mDNSResponder.mk
@@ -11,9 +11,4 @@ $(eval $(call gb_UnpackedTarball_UnpackedTarball,mDNSResponder))
$(eval $(call gb_UnpackedTarball_set_tarball,mDNSResponder,$(MDNSRESPONDER_TARBALL)))
-$(eval $(call gb_UnpackedTarball_add_patches,mDNSResponder,\
- external/mdnsresponder/mDNSResponder_Win32_SOCKET.patch.1 \
- external/mdnsresponder/mDNSResponder_Win32_buildfix.patch.1 \
-))
-
# vim: set noet sw=4 ts=4:
diff --git a/external/mdnsresponder/mDNSResponder_Win32_SOCKET.patch.1 b/external/mdnsresponder/mDNSResponder_Win32_SOCKET.patch.1
deleted file mode 100644
index 9952f86e88ec..000000000000
--- a/external/mdnsresponder/mDNSResponder_Win32_SOCKET.patch.1
+++ /dev/null
@@ -1,85 +0,0 @@
-commit 77838efb0748689ee77007a92d9a01e03e6dbdb7
-Author: Stephan Bergmann <sbergman at redhat.com>
-AuthorDate: Fri Nov 27 22:40:23 2015 +0100
-Commit: Stephan Bergmann <sbergman at redhat.com>
-CommitDate: Sat Nov 28 14:00:07 2015 +0100
-
- Use proper return type for DNSServiceRefSockFD
-
- ...which is e.g. unsigned long long for Windows 64-bit (and declaring the
- function in dns_sd.h is not necessary, and the dnssd_sock_t typedef is not known
- there)
-
- Change-Id: Iaa0eb03a83b76200204ba905313bcc27b5007b39
-
-diff --git a/mDNSShared/dns_sd.h b/mDNSShared/dns_sd.h
-index 31daaeb..faaa741 100644
---- a/mDNSShared/dns_sd.h
-+++ b/mDNSShared/dns_sd.h
-@@ -741,35 +741,6 @@ DNSServiceErrorType DNSSD_API DNSServiceGetProperty
- *
- *********************************************************************************************/
-
--/* DNSServiceRefSockFD()
-- *
-- * Access underlying Unix domain socket for an initialized DNSServiceRef.
-- * The DNS Service Discovery implementation uses this socket to communicate between the client and
-- * the daemon. The application MUST NOT directly read from or write to this socket.
-- * Access to the socket is provided so that it can be used as a kqueue event source, a CFRunLoop
-- * event source, in a select() loop, etc. When the underlying event management subsystem (kqueue/
-- * select/CFRunLoop etc.) indicates to the client that data is available for reading on the
-- * socket, the client should call DNSServiceProcessResult(), which will extract the daemon's
-- * reply from the socket, and pass it to the appropriate application callback. By using a run
-- * loop or select(), results from the daemon can be processed asynchronously. Alternatively,
-- * a client can choose to fork a thread and have it loop calling "DNSServiceProcessResult(ref);"
-- * If DNSServiceProcessResult() is called when no data is available for reading on the socket, it
-- * will block until data does become available, and then process the data and return to the caller.
-- * The application is reponsible for checking the return value of DNSServiceProcessResult() to determine
-- * if the socket is valid and if it should continue to process data on the socket.
-- * When data arrives on the socket, the client is responsible for calling DNSServiceProcessResult(ref)
-- * in a timely fashion -- if the client allows a large backlog of data to build up the daemon
-- * may terminate the connection.
-- *
-- * sdRef: A DNSServiceRef initialized by any of the DNSService calls.
-- *
-- * return value: The DNSServiceRef's underlying socket descriptor, or -1 on
-- * error.
-- */
--
--int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef);
--
--
- /* DNSServiceProcessResult()
- *
- * Read a reply from the daemon, calling the appropriate application callback. This call will
-diff --git a/mDNSShared/dnssd_clientstub.c b/mDNSShared/dnssd_clientstub.c
-index c38197c..c6b50a2 100644
---- a/mDNSShared/dnssd_clientstub.c
-+++ b/mDNSShared/dnssd_clientstub.c
-@@ -799,7 +799,7 @@ cleanup:
- return err;
- }
-
--int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
-+dnssd_sock_t DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
- {
- if (!sdRef) { syslog(LOG_WARNING, "dnssd_clientstub DNSServiceRefSockFD called with NULL DNSServiceRef"); return dnssd_InvalidSocket; }
-
-@@ -816,7 +816,7 @@ int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
- return dnssd_InvalidSocket;
- }
-
-- return (int) sdRef->sockfd;
-+ return sdRef->sockfd;
- }
-
- #if _DNS_SD_LIBDISPATCH
-@@ -2025,7 +2025,7 @@ DNSServiceErrorType DNSSD_API DNSServiceSetDispatchQueue
- dispatch_queue_t queue
- )
- {
-- int dnssd_fd = DNSServiceRefSockFD(service);
-+ dnssd_sock_t dnssd_fd = DNSServiceRefSockFD(service);
- if (dnssd_fd == dnssd_InvalidSocket) return kDNSServiceErr_BadParam;
- if (!queue)
- {
diff --git a/external/mdnsresponder/mDNSResponder_Win32_buildfix.patch.1 b/external/mdnsresponder/mDNSResponder_Win32_buildfix.patch.1
deleted file mode 100644
index 9f5c06260b12..000000000000
--- a/external/mdnsresponder/mDNSResponder_Win32_buildfix.patch.1
+++ /dev/null
@@ -1,16 +0,0 @@
---- mDNSResponder/mDNSShared/dnssd_clientstub.c.orig 2015-11-30 16:36:08.081554188 +0100
-+++ mDNSResponder/mDNSShared/dnssd_clientstub.c 2015-11-30 16:38:35.749542735 +0100
-@@ -579,7 +579,12 @@
- else
- {
- syslog(LOG_WARNING, "dnssd_clientstub ConnectToServer: connect() failed path:%s Socket:%d Err:%d Errno:%d %s",
-- uds_serverpath, sdr->sockfd, err, dnssd_errno, dnssd_strerror(dnssd_errno));
-+#if defined(USE_TCP_LOOPBACK)
-+ MDNS_TCP_SERVERADDR,
-+#else
-+ uds_serverpath,
-+#endif
-+ sdr->sockfd, err, dnssd_errno, dnssd_strerror(dnssd_errno));
- dnssd_close(sdr->sockfd);
- FreeDNSServiceOp(sdr);
- return kDNSServiceErr_ServiceNotRunning;
commit 56ab1d406aa9f18db9218ad520ccc6cc86ee40bb
Author: Michael Stahl <Michael.Stahl at cib.de>
AuthorDate: Wed Feb 20 14:31:23 2019 +0100
Commit: Thorsten Behrens <Thorsten.Behrens at CIB.de>
CommitDate: Fri Feb 22 12:52:45 2019 +0100
libjpeg-turbo: upgrade to release 1.5.3
Fixes CVE-2017-15232, which looks rather minor.
Change-Id: Icffb0c5160bef79577431a02eb10ed9492e01d11
Reviewed-on: https://gerrit.libreoffice.org/68091
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl at cib.de>
(cherry picked from commit e0b96b9863ebe52c4e35c21b3084da9e53ebee1f)
Reviewed-on: https://gerrit.libreoffice.org/68109
Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
diff --git a/download.lst b/download.lst
index b8b5d8fd5fce..09e420097c38 100644
--- a/download.lst
+++ b/download.lst
@@ -128,8 +128,8 @@ export JFREEREPORT_LIBXML_SHA256SUM := 7d2797fe9f79a77009721e3f14fa4a1dec17a6d70
export JFREEREPORT_LIBXML_TARBALL := ace6ab49184e329db254e454a010f56d-libxml-1.1.7.zip
export JFREEREPORT_SAC_SHA256SUM := 085f2112c51fa8c1783fac12fbd452650596415121348393bb51f0f7e85a9045
export JFREEREPORT_SAC_TARBALL := 39bb3fcea1514f1369fcfc87542390fd-sacjava-1.3.zip
-export LIBJPEG_TURBO_SHA256SUM := 9098943b270388727ae61de82adec73cf9f0dbb240b3bc8b172595ebf405b528
-export LIBJPEG_TURBO_TARBALL := libjpeg-turbo-1.5.2.tar.gz
+export LIBJPEG_TURBO_SHA256SUM := b24890e2bb46e12e72a79f7e965f409f4e16466d00e1dd15d93d73ee6b592523
+export LIBJPEG_TURBO_TARBALL := libjpeg-turbo-1.5.3.tar.gz
export LANGTAGREG_SHA256SUM := 14c21f4533ca74e3af9e09184d6756a750d0cd46099015ba8c595e48499aa878
export LANGTAGREG_TARBALL := language-subtag-registry-2018-04-23.tar.bz2
export LANGUAGETOOL_SHA256SUM := 48c87e41636783bba438b65fd895821e369ed139e1465fac654323ad93c5a82d
commit abab6e096839838e60222c635cf51629d7ce48d5
Author: Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Thu Feb 7 16:26:31 2019 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Thu Feb 21 22:32:23 2019 +0100
Related: tdf#117761 oox smartart: backport fixes related to cycle matrix
This is a combination of 6 commits.
This is the 1st commit:
oox smartart, cycle matrix: fix counting presentation children
The markup is:
<dgm:if name="Name6" axis="ch ch" ptType="node node" st="1 1" cnt="1 0" func="cnt" op="gte" val="1">
Where PowerPoint evaluated the condition to true, but Impress evaluated
to false. This means that the undocumented relation between the child
lists is "OR" (not "AND").
Also, our code assumed that "node" has to be a data node (not
presentation node), but it seems the only way this condition can be true
if presentation children is also counted. (The presentation node in
question is not a presentation of anything.)
(cherry picked from commit e3c6f249c10f7f1bcc528e643f5723288c514b29)
This is the commit #2:
oox smartart, cycle matrix: handle left/bottom constraint in composite algo
The bugdoc has 3 shapes in the "outer" circle which have a position
where either x or y is not 0. But these are defined using constraints
talking about the right or bottom edge of the shape.
Map that to top/left, given that we already know the shape size.
(cherry picked from commit b9b4e9223b6c0d6e0b48b694c9aabbe54a250660)
This is the commit #3:
oox smartart, cycle matrix: fix too large height in composite algo
The user-level problem was that the height of the entire smartart was
too large. The reason for this was that:
- composite algorithm gets the constraint height should be 77% of width,
this means 6096000 -> 4693920 EMUs
- at the same time the parent container is already smaller, 4064000 EMUs
- a few lines later we already limit the max height with std::min(), but
in the meantime an incorrect y position is calculated, exactly due to
the lack of early limited height
Solve the problem by making sure composite algorithm never works with a
height (even when using it to calculate vertical center) that exceeds
the height of the parent.
(cherry picked from commit 5b2e38e0cfc7006d6982f741cf158a8a98dc8630)
This is the commit #4:
oox smartart, cycle matrix: handle aspect ratio in composite algo
This way the 4 quadrant shapes in the center of the SmartArt form a
circle, as width is shrinking.
It's not height growing, as OOXML spec clearly says "ar" always just
shrinks one axis.
(>1 and <1 "ar" is to be handled when they are seen in action in an
actual document.)
(cherry picked from commit 34383064ac061497b0c46c449313877c6b6a2087)
This is the commit #5:
oox smartart, cycle matrix: handle destination order in connections
It is possible to have connections from multiple data nodes to the same
presentation node with a presOf type. We use to order these based on as
they appear in the data XML, but we need to order them according to the
destOrd attribute.
Introduce an std::map for that, so get ordering automatically as we
iterate. Turn the std::pair into a struct to make the code a bit more
readable.
(cherry picked from commit ecb733da58b74714eb66d2063a2835ce5c471870)
Conflicts:
oox/source/drawingml/diagram/diagramlayoutatoms.cxx
This is the commit #6:
oox smartart, cycle matrix: fix fill and line props of shape
The topmost shape may not have 0 depth, but something larger.
In that case at least it's safe to still use fill & line properties. The
B1 quadrant of the test file now has the proper orange background, and
B2's border is also properly orange.
(cherry picked from commit 8193e697d286595aa62859011761adeb002244e3)
Conflicts:
oox/source/drawingml/diagram/diagramlayoutatoms.cxx
Change-Id: Iccc5f6993693a0f1cf8f50d163003c24d3ad690e
Reviewed-on: https://gerrit.libreoffice.org/68149
Tested-by: Jenkins
Reviewed-by: Andras Timar <andras.timar at collabora.com>
diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx
index 4664a55e594c..daddf1fa6991 100644
--- a/oox/source/drawingml/diagram/diagram.cxx
+++ b/oox/source/drawingml/diagram/diagram.cxx
@@ -270,8 +270,10 @@ void Diagram::build( )
if( connection.mnType == XML_presOf )
{
DiagramData::StringMap::value_type::second_type& rVec=getData()->getPresOfNameMap()[connection.msDestId];
- rVec.emplace_back(
- connection.msSourceId,sal_Int32(0));
+ DiagramData::SourceIdAndDepth aSourceIdAndDepth;
+ aSourceIdAndDepth.msSourceId = connection.msSourceId;
+ aSourceIdAndDepth.mnDepth = 0;
+ rVec[connection.mnDestOrder] = aSourceIdAndDepth;
}
}
@@ -281,9 +283,8 @@ void Diagram::build( )
{
for (auto & elem : elemPresOf.second)
{
- const sal_Int32 nDepth=calcDepth(elem.first,
- getData()->getConnections());
- elem.second = nDepth != 0 ? nDepth : -1;
+ const sal_Int32 nDepth = calcDepth(elem.second.msSourceId, getData()->getConnections());
+ elem.second.mnDepth = nDepth != 0 ? nDepth : -1;
if (nDepth > getData()->getMaxDepth())
getData()->setMaxDepth(nDepth);
}
diff --git a/oox/source/drawingml/diagram/diagram.hxx b/oox/source/drawingml/diagram/diagram.hxx
index 242ff09fa152..a0955b124230 100644
--- a/oox/source/drawingml/diagram/diagram.hxx
+++ b/oox/source/drawingml/diagram/diagram.hxx
@@ -160,8 +160,14 @@ public:
typedef std::map< OUString,
std::vector<dgm::Point*> > PointsNameMap;
typedef std::map< OUString, const dgm::Connection* > ConnectionNameMap;
+ struct SourceIdAndDepth
+ {
+ OUString msSourceId;
+ sal_Int32 mnDepth = 0;
+ };
+ /// Tracks connections: destination id -> {destination order, details} map.
typedef std::map< OUString,
- std::vector<std::pair<OUString,sal_Int32> > > StringMap;
+ std::map<sal_Int32, SourceIdAndDepth > > StringMap;
DiagramData();
FillPropertiesPtr & getFillProperties()
diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
index 513dc9926e82..09edf0022259 100644
--- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list