diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2023-02-23 23:58:54 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2023-03-06 07:47:58 +0000 |
commit | 3203cf9df2f295771515e5a38b597bbb9a17e6a4 (patch) | |
tree | d720694f48b23d2e86566bd79442edc96b706ef4 /oox | |
parent | 9980022ef82526f4f76c963ec07fcc72f3ad0eaa (diff) |
oox: import font scheme structure directly into model::FontScheme
Change-Id: Ic9084cbbf451ca406133f07476b8b4e7c234a650
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147572
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/themeelementscontext.cxx | 76 |
1 files changed, 67 insertions, 9 deletions
diff --git a/oox/source/drawingml/themeelementscontext.cxx b/oox/source/drawingml/themeelementscontext.cxx index fdc691427040..d0f8d577678a 100644 --- a/oox/source/drawingml/themeelementscontext.cxx +++ b/oox/source/drawingml/themeelementscontext.cxx @@ -140,13 +140,16 @@ ContextHandlerRef EffectStyleListContext::onCreateContext( sal_Int32 nElement, c return nullptr; } -namespace { +namespace +{ class FontSchemeContext : public ContextHandler2 { public: - FontSchemeContext(ContextHandler2Helper const & rParent, FontScheme& rFontScheme, - std::map<sal_Int32, std::vector<std::pair<OUString, OUString>>>& rSupplementalFontMap); + FontSchemeContext(ContextHandler2Helper const & rParent, const AttributeList& rAttribs, FontScheme& rFontScheme, + std::map<sal_Int32, std::vector<std::pair<OUString, OUString>>>& rSupplementalFontMap, + model::Theme& rTheme); + ~FontSchemeContext(); virtual ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) override; virtual void onEndElement() override; @@ -155,18 +158,42 @@ private: TextCharacterPropertiesPtr mxCharProps; std::map<sal_Int32, std::vector<std::pair<OUString, OUString>>>& mrSupplementalFontMap; sal_Int32 maCurrentFont = 0; + model::Theme& mrTheme; + model::FontScheme maFontScheme; }; -} +} // end anonymous ns -FontSchemeContext::FontSchemeContext(ContextHandler2Helper const & rParent, FontScheme& rFontScheme, - std::map<sal_Int32, std::vector<std::pair<OUString, OUString>>>& rSupplementalFontMap) +FontSchemeContext::FontSchemeContext(ContextHandler2Helper const & rParent, const AttributeList& rAttribs, FontScheme& rFontScheme, + std::map<sal_Int32, std::vector<std::pair<OUString, OUString>>>& rSupplementalFontMap, + model::Theme& rTheme) : ContextHandler2(rParent) , mrFontScheme(rFontScheme) , mrSupplementalFontMap(rSupplementalFontMap) + , mrTheme(rTheme) + , maFontScheme(rAttribs.getStringDefaulted(XML_name)) +{ +} + +FontSchemeContext::~FontSchemeContext() +{ + mrTheme.setFontScheme(maFontScheme); +} + +namespace +{ + +void fillThemeFont(model::ThemeFont& rThemeFont, const AttributeList& rAttribs) { + rThemeFont.maTypeface = rAttribs.getStringDefaulted(XML_typeface); + rThemeFont.maPanose = rAttribs.getStringDefaulted(XML_panose); + rThemeFont.maCharset = rAttribs.getInteger(XML_charset, WINDOWS_CHARSET_DEFAULT); + sal_Int32 nPitchFamily = rAttribs.getInteger(XML_pitchFamily, 0); + TextFont::resolvePitch(nPitchFamily, rThemeFont.maPitch, rThemeFont.maFamily); } +} // end anonymous ns + ContextHandlerRef FontSchemeContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( nElement ) @@ -182,21 +209,52 @@ ContextHandlerRef FontSchemeContext::onCreateContext( sal_Int32 nElement, const maCurrentFont = XML_minor; return this; case A_TOKEN( latin ): - if( mxCharProps ) - mxCharProps->maLatinFont.setAttributes( rAttribs ); + { + if (mxCharProps) + mxCharProps->maLatinFont.setAttributes(rAttribs); + + model::ThemeFont aThemeFont; + fillThemeFont(aThemeFont, rAttribs); + if (maCurrentFont == XML_major) + maFontScheme.setMajorLatin(aThemeFont); + else if (maCurrentFont == XML_minor) + maFontScheme.setMinorLatin(aThemeFont); + } break; case A_TOKEN( ea ): + { if( mxCharProps ) mxCharProps->maAsianFont.setAttributes( rAttribs ); + model::ThemeFont aThemeFont; + fillThemeFont(aThemeFont, rAttribs); + if (maCurrentFont == XML_major) + maFontScheme.setMajorAsian(aThemeFont); + else if (maCurrentFont == XML_minor) + maFontScheme.setMinorAsian(aThemeFont); + } break; case A_TOKEN( cs ): + { if( mxCharProps ) mxCharProps->maComplexFont.setAttributes( rAttribs ); + model::ThemeFont aThemeFont; + fillThemeFont(aThemeFont, rAttribs); + if (maCurrentFont == XML_major) + maFontScheme.setMajorComplex(aThemeFont); + else if (maCurrentFont == XML_minor) + maFontScheme.setMinorComplex(aThemeFont); + } break; case A_TOKEN(font): + { OUString aScript = rAttribs.getStringDefaulted(XML_script); OUString aTypeface = rAttribs.getStringDefaulted(XML_typeface); mrSupplementalFontMap[maCurrentFont].emplace_back(std::pair<OUString, OUString>{aScript, aTypeface}); + if (maCurrentFont == XML_major) + maFontScheme.addMajorSupplementalFont({aScript, aTypeface}); + else if (maCurrentFont == XML_minor) + maFontScheme.addMinorSupplementalFont({aScript, aTypeface}); + } break; } return nullptr; @@ -238,7 +296,7 @@ ContextHandlerRef ThemeElementsContext::onCreateContext(sal_Int32 nElement, cons if (rAttribs.hasAttribute(XML_name)) mrOoxTheme.setFontSchemeName(rAttribs.getStringDefaulted(XML_name)); - return new FontSchemeContext(*this, mrOoxTheme.getFontScheme(), mrOoxTheme.getSupplementalFontMap()); + return new FontSchemeContext(*this, rAttribs, mrOoxTheme.getFontScheme(), mrOoxTheme.getSupplementalFontMap(), mrTheme); } case A_TOKEN( fmtScheme ): // CT_StyleMatrix |