sd/source/filter/eppt/pptx-epptooxml.cxx | 99 ++++++++++--------------------- 1 file changed, 32 insertions(+), 67 deletions(-)
New commits: commit e888a6d9eb2af220a9c8c0a3483e37d1f53f628f Author: Tomaž Vajngerl <[email protected]> AuthorDate: Mon May 26 14:31:05 2025 +0900 Commit: Miklos Vajna <[email protected]> CommitDate: Wed Jun 4 12:15:56 2025 +0200 sd: better way to check if a font is used for PPTX font embedding Check all the objects and style that is accosiated with the object if the font is used. This way we don't include fonts that are not actually used in the document. The isUsed on the document is not percise enough in this case. Change-Id: If11d80ffe04b28688698babb560ac0be84bbed12 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185764 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sd/source/filter/eppt/pptx-epptooxml.cxx b/sd/source/filter/eppt/pptx-epptooxml.cxx index c21015b3a035..06c4addd3671 100644 --- a/sd/source/filter/eppt/pptx-epptooxml.cxx +++ b/sd/source/filter/eppt/pptx-epptooxml.cxx @@ -578,6 +578,12 @@ private: return nullptr; } + void addFontItem(const SvxFontItem* pItem) + { + OUString aFontName = pItem->GetFamilyName(); + mrUsedFontNames.insert(aFontName); + } + void traverseEditEng(SdrTextObj* pTextObject) { OutlinerParaObject* pOutlinerParagraphObject = pTextObject->GetOutlinerParaObject(); @@ -588,19 +594,36 @@ private: std::vector<editeng::Section> aSections; rEditText.GetAllSections(aSections); + { + SfxStyleSheet* pStyleSheet = pTextObject->getSdrPageFromSdrObject()->GetTextStyleSheetForObject(pTextObject); + auto aItemSet = pStyleSheet->GetItemSet(); + if (const SvxFontItem* pItem = aItemSet.GetItemIfSet(EE_CHAR_FONTINFO, false)) + { + addFontItem(pItem); + } + if (const SvxFontItem* pItem = aItemSet.GetItemIfSet(EE_CHAR_FONTINFO_CJK, false)) + { + addFontItem(pItem); + } + if (const SvxFontItem* pItem = aItemSet.GetItemIfSet(EE_CHAR_FONTINFO_CTL, false)) + { + addFontItem(pItem); + } + } + for (editeng::Section const& rSection : aSections) { if (SvxFontItem const* pFontItem = getFontItem(rSection, EE_CHAR_FONTINFO); pFontItem && mbEmbedLatinScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } if (SvxFontItem const * pFontItem = getFontItem(rSection, EE_CHAR_FONTINFO_CJK); pFontItem && mbEmbedAsianScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } if (SvxFontItem const* pFontItem = getFontItem(rSection, EE_CHAR_FONTINFO_CTL); pFontItem && mbEmbedComplexScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } } } @@ -617,22 +640,23 @@ protected: void handleSdrObject(SdrObject* pObject) override { SdrTextObj* pTextShape = DynCastSdrTextObj(pObject); - if (pTextShape && !pTextShape->IsEmptyPresObj()) + if (pTextShape) { auto& rItemSet = pTextShape->GetMergedItemSet(); if (SvxFontItem const* pFontItem = rItemSet.GetItemIfSet(EE_CHAR_FONTINFO, true); pFontItem && mbEmbedLatinScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } if (SvxFontItem const* pFontItem = rItemSet.GetItemIfSet(EE_CHAR_FONTINFO_CJK, true); pFontItem && mbEmbedAsianScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } if (SvxFontItem const* pFontItem = rItemSet.GetItemIfSet(EE_CHAR_FONTINFO_CTL, true); pFontItem && mbEmbedComplexScript) { - mrUsedFontNames.insert(pFontItem->GetFamilyName()); + addFontItem(pFontItem); } + traverseEditEng(pTextShape); } } @@ -652,66 +676,6 @@ std::unordered_set<OUString> PowerPointExport::getUsedFontList() if (!pDocument) return aReturnSet; - uno::Reference<style::XStyleFamiliesSupplier> xFamiliesSupp(getModel(), UNO_QUERY); - if (!xFamiliesSupp.is()) - return aReturnSet; - - // Check styles first - uno::Reference<container::XNameAccess> xFamilies = xFamiliesSupp->getStyleFamilies(); - if (!xFamilies.is()) - return aReturnSet; - - const uno::Sequence<OUString> aFamilyNames = xFamilies->getElementNames(); - for (OUString const & sFamilyName : aFamilyNames) - { - uno::Reference<container::XNameAccess> xStyleContainer; - xFamilies->getByName(sFamilyName) >>= xStyleContainer; - - if (!xStyleContainer.is()) - continue; - - for (OUString const& rName : xStyleContainer->getElementNames()) - { - uno::Reference<style::XStyle> xStyle; - xStyleContainer->getByName(rName) >>= xStyle; - if (!xStyle->isInUse()) - continue; - - uno::Reference<beans::XPropertySet> xPropertySet(xStyle, UNO_QUERY); - if (!xPropertySet.is()) - continue; - - uno::Reference<beans::XPropertySetInfo> xInfo = xPropertySet->getPropertySetInfo(); - if (!xInfo.is()) - continue; - - if (mbEmbedLatinScript && xInfo->hasPropertyByName(u"CharFontName"_ustr)) - { - OUString sCharFontName; - Any aFontAny = xPropertySet->getPropertyValue(u"CharFontName"_ustr); - aFontAny >>= sCharFontName; - if (!sCharFontName.isEmpty()) - aReturnSet.insert(sCharFontName); - } - if (mbEmbedAsianScript && xInfo->hasPropertyByName(u"CharFontNameAsian"_ustr)) - { - OUString sCharFontNameAsian; - Any aFontAny = xPropertySet->getPropertyValue(u"CharFontNameAsian"_ustr); - aFontAny >>= sCharFontNameAsian; - if (!sCharFontNameAsian.isEmpty()) - aReturnSet.insert(sCharFontNameAsian); - } - if (mbEmbedComplexScript && xInfo->hasPropertyByName(u"CharFontNameComplex"_ustr)) - { - OUString sCharFontNameComplex; - Any aFontAny = xPropertySet->getPropertyValue(u"CharFontNameComplex"_ustr); - aFontAny >>= sCharFontNameComplex; - if (!sCharFontNameComplex.isEmpty()) - aReturnSet.insert(sCharFontNameComplex); - } - } - } - auto pCollector = std::make_shared<FontNameCollector>(aReturnSet, mbEmbedLatinScript, mbEmbedAsianScript, mbEmbedComplexScript); sd::ModelTraverser aModelTraverser(pDocument, { .mbPages = true, .mbMasterPages = true }); aModelTraverser.addNodeHandler(pCollector); @@ -784,6 +748,7 @@ void PowerPointExport::WriteEmbeddedFontList() EmbeddedFont aInfo; aInfo.sFamilyName = sFamilyName; + SAL_INFO("sd.eppt", "Embedding font: " << sFamilyName); for (auto [eItalic, eWeight] : aFontVariantCombinations) {
