[Libreoffice-commits] core.git: vcl/inc vcl/qt5 vcl/quartz vcl/source vcl/win
Jan-Marek Glogowski (via logerrit)
logerrit at kemper.freedesktop.org
Tue Sep 15 04:43:39 UTC 2020
vcl/inc/sft.hxx | 16 ++++++++++------
vcl/qt5/Qt5Graphics_Text.cxx | 12 +++++++-----
vcl/quartz/salgdi.cxx | 3 ++-
vcl/source/fontsubset/sft.cxx | 17 ++++++++++-------
vcl/win/gdi/salfont.cxx | 10 +++++-----
5 files changed, 34 insertions(+), 24 deletions(-)
New commits:
commit 2967e7a87986b59fe48119749525d4084ac6a568
Author: Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Fri Sep 11 22:31:51 2020 +0200
Commit: Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Tue Sep 15 06:42:56 2020 +0200
Forward existing FontCharMap from PhysicalFontFace
Since removed code in the previous commit is primary used in
CreateFontSubset and GetGlyphWidths, you have a high chance, that
the CMAP was already used for displaying a font, so it's already
decoded and can be forwarded. Also the lookup should be faster in
general this way.
Change-Id: Icf4d8a1a84ff6ccdaccb7e870abe5df3837f9541
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102686
Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>
Tested-by: Jenkins
diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx
index bcbf74b07aa1..86cb718809b3 100644
--- a/vcl/inc/sft.hxx
+++ b/vcl/inc/sft.hxx
@@ -470,11 +470,13 @@ class TrueTypeFont;
* @param nLen - size of memory buffer
* @param facenum - logical font number within a TTC file. This value is ignored
* for TrueType fonts
- * @param ttf - array of TrueTypeFonts
+ * @param ttf - returns the opened TrueTypeFont
+ * @param xCharMap - optional parsed character map
* @return value of SFErrCodes enum
* @ingroup sft
*/
- SFErrCodes VCL_DLLPUBLIC OpenTTFontBuffer(const void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf);
+ SFErrCodes VCL_DLLPUBLIC OpenTTFontBuffer(const void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum,
+ TrueTypeFont** ttf, const FontCharMapRef xCharMap = nullptr);
#if !defined(_WIN32)
/**
* TrueTypeFont constructor.
@@ -483,11 +485,13 @@ class TrueTypeFont;
* @param fname - name of TrueType font file
* @param facenum - logical font number within a TTC file. This value is ignored
* for TrueType fonts
- * @param ttf - array of TrueTypeFonts
+ * @param ttf - returns the opened TrueTypeFont
+ * @param xCharMap - optional parsed character map
* @return value of SFErrCodes enum
* @ingroup sft
*/
- SFErrCodes VCL_DLLPUBLIC OpenTTFontFile(const char *fname, sal_uInt32 facenum, TrueTypeFont** ttf);
+ SFErrCodes VCL_DLLPUBLIC OpenTTFontFile(const char *fname, sal_uInt32 facenum, TrueTypeFont** ttf,
+ const FontCharMapRef xCharMap = nullptr);
#endif
bool VCL_DLLPUBLIC getTTCoverage(
@@ -728,7 +732,7 @@ protected:
SFErrCodes indexGlyphData();
public:
- AbstractTrueTypeFont(const char* fileName = nullptr);
+ AbstractTrueTypeFont(const char* fileName = nullptr, const FontCharMapRef xCharMap = nullptr);
virtual ~AbstractTrueTypeFont();
const char* fileName() const { return m_pFileName; }
@@ -765,7 +769,7 @@ public:
sal_uInt32 ntables;
- TrueTypeFont(const char* pFileName = nullptr);
+ TrueTypeFont(const char* pFileName = nullptr, const FontCharMapRef xCharMap = nullptr);
~TrueTypeFont() override;
SFErrCodes open(sal_uInt32 facenum);
diff --git a/vcl/qt5/Qt5Graphics_Text.cxx b/vcl/qt5/Qt5Graphics_Text.cxx
index 0fe602d1ce3f..0b823858a9bb 100644
--- a/vcl/qt5/Qt5Graphics_Text.cxx
+++ b/vcl/qt5/Qt5Graphics_Text.cxx
@@ -137,14 +137,15 @@ class Qt5TrueTypeFont : public vcl::AbstractTrueTypeFont
mutable QByteArray m_aFontTable[vcl::NUM_TAGS];
public:
- Qt5TrueTypeFont(const QRawFont& aRawFont);
+ Qt5TrueTypeFont(const Qt5FontFace& aFontFace, const QRawFont& aRawFont);
bool hasTable(sal_uInt32 ord) const override;
const sal_uInt8* table(sal_uInt32 ord, sal_uInt32& size) const override;
};
-Qt5TrueTypeFont::Qt5TrueTypeFont(const QRawFont& aRawFont)
- : m_aRawFont(aRawFont)
+Qt5TrueTypeFont::Qt5TrueTypeFont(const Qt5FontFace& aFontFace, const QRawFont& aRawFont)
+ : vcl::AbstractTrueTypeFont(nullptr, aFontFace.GetFontCharMap())
+ , m_aRawFont(aRawFont)
{
indexGlyphData();
}
@@ -224,7 +225,8 @@ bool Qt5Graphics::CreateFontSubset(const OUString& rToFile, const PhysicalFontFa
return false;
// get the raw-bytes from the font to be subset
- const QFont aFont = static_cast<const Qt5FontFace*>(pFontFace)->CreateFont();
+ const Qt5FontFace* pQt5FontFace = static_cast<const Qt5FontFace*>(pFontFace);
+ const QFont aFont = pQt5FontFace->CreateFont();
const QRawFont aRawFont(QRawFont::fromFont(aFont));
const QFontInfo aFontInfo(aFont);
const OString aToFile(OUStringToOString(aSysPath, osl_getThreadTextEncoding()));
@@ -249,7 +251,7 @@ bool Qt5Graphics::CreateFontSubset(const OUString& rToFile, const PhysicalFontFa
rInfo.m_nAscent = aRawFont.ascent();
rInfo.m_nDescent = aRawFont.descent();
- Qt5TrueTypeFont aTTF(aRawFont);
+ Qt5TrueTypeFont aTTF(*pQt5FontFace, aRawFont);
int nXmin, nYmin, nXmax, nYmax;
sal_uInt16 nMacStyleFlags;
if (GetTTGlobalFontHeadInfo(&aTTF, nXmin, nYmin, nXmax, nYmax, nMacStyleFlags))
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 2c1fdff16eec..1501043924b6 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -759,7 +759,8 @@ void AquaSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFontData, bool bV
// use the font subsetter to get the widths
TrueTypeFont* pSftFont = nullptr;
- SFErrCodes nRC = ::OpenTTFontBuffer( static_cast<void*>(aBuffer.data()), aBuffer.size(), 0, &pSftFont);
+ SFErrCodes nRC = ::OpenTTFontBuffer(static_cast<void*>(aBuffer.data()), aBuffer.size(), 0, &pSftFont,
+ pFontData->GetFontCharMap());
if( nRC != SFErrCodes::Ok )
return;
diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index 812c539d6700..6aba6d6d48d2 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -1021,7 +1021,8 @@ int CountTTCFonts(const char* fname)
}
#if !defined(_WIN32)
-SFErrCodes OpenTTFontFile( const char* fname, sal_uInt32 facenum, TrueTypeFont** ttf )
+SFErrCodes OpenTTFontFile(const char* fname, sal_uInt32 facenum, TrueTypeFont** ttf,
+ const FontCharMapRef xCharMap)
{
SFErrCodes ret;
int fd = -1;
@@ -1029,7 +1030,7 @@ SFErrCodes OpenTTFontFile( const char* fname, sal_uInt32 facenum, TrueTypeFont**
if (!fname || !*fname) return SFErrCodes::BadFile;
- *ttf = new TrueTypeFont(fname);
+ *ttf = new TrueTypeFont(fname, xCharMap);
if( ! *ttf )
return SFErrCodes::Memory;
@@ -1080,9 +1081,10 @@ cleanup:
}
#endif
-SFErrCodes OpenTTFontBuffer(const void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf)
+SFErrCodes OpenTTFontBuffer(const void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf,
+ const FontCharMapRef xCharMap)
{
- *ttf = new TrueTypeFont();
+ *ttf = new TrueTypeFont(nullptr, xCharMap);
if( *ttf == nullptr )
return SFErrCodes::Memory;
@@ -1111,13 +1113,14 @@ bool withinBounds(sal_uInt32 tdoffset, sal_uInt32 moreoffset, sal_uInt32 len, sa
}
}
-AbstractTrueTypeFont::AbstractTrueTypeFont(const char* pFileName)
+AbstractTrueTypeFont::AbstractTrueTypeFont(const char* pFileName, const FontCharMapRef xCharMap)
: m_pFileName(nullptr)
, m_nGlyphs(0xFFFFFFFF)
, m_pGlyphOffsets(nullptr)
, m_nHorzMetrics(0)
, m_nVertMetrics(0)
, m_nUnitsPerEm(0)
+ , m_xCharMap(xCharMap)
{
if (pFileName)
m_pFileName = strdup(pFileName);
@@ -1129,8 +1132,8 @@ AbstractTrueTypeFont::~AbstractTrueTypeFont()
free(m_pGlyphOffsets);
}
-TrueTypeFont::TrueTypeFont(const char* pFileName)
- : AbstractTrueTypeFont(pFileName)
+TrueTypeFont::TrueTypeFont(const char* pFileName, const FontCharMapRef xCharMap)
+ : AbstractTrueTypeFont(pFileName, xCharMap)
, fsize(-1)
, ptr(nullptr)
, psname(nullptr)
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index f5f69f3eab33..bc7f83b8b6f2 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1543,7 +1543,7 @@ public:
~ScopedTrueTypeFont();
- SFErrCodes open(void const * pBuffer, sal_uInt32 nLen, sal_uInt32 nFaceNum);
+ SFErrCodes open(void const * pBuffer, sal_uInt32 nLen, sal_uInt32 nFaceNum, const FontCharMapRef xCharMap = nullptr);
TrueTypeFont * get() const { return m_pFont; }
TrueTypeFont* operator->() { return m_pFont; }
@@ -1561,10 +1561,10 @@ ScopedTrueTypeFont::~ScopedTrueTypeFont()
}
SFErrCodes ScopedTrueTypeFont::open(void const * pBuffer, sal_uInt32 nLen,
- sal_uInt32 nFaceNum)
+ sal_uInt32 nFaceNum, const FontCharMapRef xCharMap)
{
OSL_ENSURE(m_pFont == nullptr, "already open");
- return OpenTTFontBuffer(pBuffer, nLen, nFaceNum, &m_pFont);
+ return OpenTTFontBuffer(pBuffer, nLen, nFaceNum, &m_pFont, xCharMap);
}
bool WinSalGraphics::CreateFontSubset( const OUString& rToFile,
@@ -1629,7 +1629,7 @@ bool WinSalGraphics::CreateFontSubset( const OUString& rToFile,
nFaceNum = ~0U; // indicate "TTC font extracts only"
ScopedTrueTypeFont aSftTTF;
- SFErrCodes nRC = aSftTTF.open( xRawFontData.get(), xRawFontData.size(), nFaceNum );
+ SFErrCodes nRC = aSftTTF.open( xRawFontData.get(), xRawFontData.size(), nFaceNum, pFont->GetFontCharMap());
if( nRC != SFErrCodes::Ok )
return false;
@@ -1745,7 +1745,7 @@ void WinSalGraphics::GetGlyphWidths( const PhysicalFontFace* pFont,
nFaceNum = ~0U; // indicate "TTC font extracts only"
ScopedTrueTypeFont aSftTTF;
- SFErrCodes nRC = aSftTTF.open( xRawFontData.get(), xRawFontData.size(), nFaceNum );
+ SFErrCodes nRC = aSftTTF.open(xRawFontData.get(), xRawFontData.size(), nFaceNum, pFont->GetFontCharMap());
if( nRC != SFErrCodes::Ok )
return;
More information about the Libreoffice-commits
mailing list