diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /lotuswordpro/source/filter/lwpfont.cxx | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lotuswordpro/source/filter/lwpfont.cxx')
-rw-r--r-- | lotuswordpro/source/filter/lwpfont.cxx | 509 |
1 files changed, 509 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfont.cxx b/lotuswordpro/source/filter/lwpfont.cxx new file mode 100644 index 0000000000..92a4d76dc2 --- /dev/null +++ b/lotuswordpro/source/filter/lwpfont.cxx @@ -0,0 +1,509 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: IBM Corporation + * + * Copyright: 2008 by IBM Corporation + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#include <lwpglobalmgr.hxx> +#include <lwpfont.hxx> +#include <lwpbasetype.hxx> +#include <xfilter/xfstylemanager.hxx> +#include <xfilter/xfdefs.hxx> +#include <xfilter/xfcolor.hxx> +#include <sal/log.hxx> + +void LwpFontAttrEntry::Read(LwpObjectStream *pStrm) +{ + m_nAttrBits = pStrm->QuickReaduInt16(); + m_nAttrOverrideBits = pStrm->QuickReaduInt16(); + m_nAttrApplyBits = pStrm->QuickReaduInt16(); + m_nAttrOverrideBits2 = pStrm->QuickReaduInt8(); + m_nAttrApplyBits2 = pStrm->QuickReaduInt8(); + m_nCase = pStrm->QuickReaduInt8(); + m_nUnder = pStrm->QuickReaduInt8(); + pStrm->SkipExtra(); +} + +void LwpFontAttrEntry::Override( rtl::Reference<XFFont> const & pFont ) +{ + if (IsBoldOverridden()) + pFont->SetBold(Is(BOLD)); + + if (IsItalicOverridden()) + pFont->SetItalic(Is(ITALIC)); + + if (IsStrikeThruOverridden()) + { + if(Is(STRIKETHRU)) + { + pFont->SetCrossout(enumXFCrossoutSignel); + } + else + { + pFont->SetCrossout(enumXFCrossoutNone); + } + } + + if (IsSuperOverridden()) + { + if(Is(SUPERSCRIPT)) + pFont->SetPosition(); + } + + if (IsSubOverridden()) + { + if(Is(SUBSCRIPT)) + pFont->SetPosition(false); + } + + if (IsUnderlineOverridden()) + { + switch(m_nUnder) + { + case UNDER_SINGLE: + pFont->SetUnderline(enumXFUnderlineSingle); + break; + case UNDER_DOUBLE: + pFont->SetUnderline(enumXFUnderlineDouble); + break; + case UNDER_WORD_SINGLE: + pFont->SetUnderline(enumXFUnderlineSingle, true); + break; + case UNDER_WORD_DOUBLE: + pFont->SetUnderline(enumXFUnderlineSingle, true); + break; + case UNDER_DONTCARE: //fall through + case UNDER_OFF: //fall through + case UNDER_STYLE: //fall through + default: + break; + //do nothing; + } + } + + if (IsCaseOverridden()) + { + switch(m_nCase) + { + case CASE_UPPER: + pFont->SetTransform(enumXFTransformUpper); + break; + case CASE_LOWER: + pFont->SetTransform(enumXFTransformLower); + break; + case CASE_NORMAL: + pFont->SetTransform(enumXFTransformNone); + break; + case CASE_INITCAPS: + pFont->SetTransform(enumXFTransformCapitalize); + break; + case CASE_STYLE: //fall through + case CASE_DONTCARE: //fall through + default: + //do nothing + ; + } + } + + //Please note that, put the SmallCaps setting after the case setting, + //for SmallCaps has higher priority than LowerCase but low + if (IsSmallCapsOverridden()) + { + if( pFont->GetTransform()!=enumXFTransformUpper ) //SmallCaps should not override upper case + { + if(Is(SMALLCAPS)) + pFont->SetTransform(enumXFTransformSmallCaps); + } + } + + // TODO: tightness + //if (IsTightnessOverridden()) + // pFont->SetTightness(cTightness);*/ +} + +bool LwpFontAttrEntry::Is(sal_uInt16 Attr) +{ + return (0 != (m_nAttrBits & Attr)); +} + +bool LwpFontAttrEntry::IsBoldOverridden() const +{ + return (0 != (m_nAttrOverrideBits & BOLD)); +} + +bool LwpFontAttrEntry::IsItalicOverridden() const +{ + return (0 != (m_nAttrOverrideBits & ITALIC)); +} +bool LwpFontAttrEntry::IsStrikeThruOverridden() const +{ + return (0 != (m_nAttrOverrideBits & STRIKETHRU)); +} +bool LwpFontAttrEntry::IsSmallCapsOverridden() const +{ + return (0 != (m_nAttrOverrideBits & SMALLCAPS)); +} +bool LwpFontAttrEntry::IsSuperOverridden() const +{ + return (0 != (m_nAttrOverrideBits & SUPERSCRIPT)); + +} +bool LwpFontAttrEntry::IsSubOverridden() const +{ + return (0 != (m_nAttrOverrideBits & SUBSCRIPT)); + +} + +bool LwpFontAttrEntry::IsUnderlineOverridden() const +{ + return (0 != (m_nAttrOverrideBits2 & UNDER)); +} +bool LwpFontAttrEntry::IsCaseOverridden() const +{ + return (0 != (m_nAttrOverrideBits2 & CASE)); +} + +void LwpFontTableEntry::Read(LwpObjectStream *pStrm) +{ + m_WindowsFaceName.Read(pStrm); + + // use the m_WindowsFaceName to set the m_FaceName temporarily + m_FaceName = m_WindowsFaceName; + + //Skip the panoseNumber + //m_PanoseNumber.Read(pStrm); + LwpPanoseNumber thePanoseToSkip; + thePanoseToSkip.Read(pStrm); + + pStrm->SkipExtra(); + + RegisterFontDecl(); +} + +OUString const & LwpFontTableEntry::GetFaceName() const +{ + return m_WindowsFaceName.str(); +} + +void LwpFontTableEntry::RegisterFontDecl() +{ + if(m_FaceName.str().isEmpty()) return; + XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager(); + XFFontDecl aFontDecl1( m_FaceName.str(), m_FaceName.str() ); + pXFStyleManager->AddFontDecl(aFontDecl1); +} + +LwpFontTable::LwpFontTable() + : m_nCount(0) +{} + +void LwpFontTable::Read(LwpObjectStream *pStrm) +{ + m_pFontEntries = nullptr; + m_nCount = pStrm->QuickReaduInt16(); + if(m_nCount>0) + { + m_pFontEntries.reset( new LwpFontTableEntry[m_nCount] ); + for(sal_uInt16 i=0; i<m_nCount; i++) + { + m_pFontEntries[i].Read(pStrm); + } + } + pStrm->SkipExtra(); +} + +OUString LwpFontTable::GetFaceName(sal_uInt16 index) //index: start from 1 +{ + SAL_WARN_IF(index > m_nCount || index <= 0, "lwp", "bad font index"); + return (index <= m_nCount && index > 0) ? m_pFontEntries[index-1].GetFaceName() : OUString(); +} + +LwpFontTable::~LwpFontTable() +{ +} + +void LwpFontNameEntry::Read(LwpObjectStream *pStrm) +{ + //Read CFontDescriptionOverrideBase + m_nOverrideBits = pStrm->QuickReaduInt8(); + m_nApplyBits = pStrm->QuickReaduInt8(); + m_nPointSize = pStrm->QuickReaduInt32(); + m_nOverstrike = pStrm->QuickReaduInt16(); + m_nTightness = pStrm->QuickReaduInt16(); + m_Color.Read(pStrm); + m_BackColor.Read(pStrm); + pStrm->SkipExtra(); + + //Read data of LwpFontNameEntry + m_nFaceName = pStrm->QuickReaduInt16(); + m_nAltFaceName = pStrm->QuickReaduInt16(); + pStrm->SkipExtra(); +} + +void LwpFontNameEntry::Override(rtl::Reference<XFFont> const & pFont) +{ + if (IsPointSizeOverridden()) + pFont->SetFontSize(static_cast<sal_uInt8>(m_nPointSize/65536L)); + + if (IsColorOverridden() && m_Color.IsValidColor()) + { + XFColor aColor(m_Color.To24Color()); + pFont->SetColor(aColor); + } + + if (IsBackgroundColorOverridden() ) + { + if (m_BackColor.IsValidColor()) + { + XFColor aColor(m_BackColor.To24Color()); + pFont->SetBackColor( aColor ); + } + else if (m_BackColor.IsTransparent()) + { + pFont->SetBackColorTransparent(); + } + } + + // TODO: tightness + //if (IsTightnessOverridden()) + // pFont->SetTightness(cTightness); +} + +bool LwpFontNameEntry::IsFaceNameOverridden() const +{ + return (0 != (m_nOverrideBits & FACENAME)); +} + +bool LwpFontNameEntry::IsAltFaceNameOverridden() const +{ + return (0 != (m_nOverrideBits & ALTFACENAME)); +} + +bool LwpFontNameEntry::IsPointSizeOverridden() const +{ + return (0 != (m_nOverrideBits & POINTSIZE)); +} + +bool LwpFontNameEntry::IsColorOverridden() const +{ + return (0 != (m_nOverrideBits & COLOR)); +} + +bool LwpFontNameEntry::IsBackgroundColorOverridden() const +{ + return (0 != (m_nOverrideBits & BKCOLOR)); +} + +//TODO +//sal_Bool LwpFontNameEntry::IsTightnessOverridden() +//{ +// return (0 != (m_nOverrideBits & TIGHTNESS)); +//} + +//sal_Bool LwpFontNameEntry::IsAnythingOverridden() +//{ +// return (0 != (m_nOverrideBits & ALL_BITS)); +//} + +LwpFontNameManager::LwpFontNameManager() + : m_nCount(0) +{} + +LwpFontNameManager::~LwpFontNameManager() +{ +} + +void LwpFontNameManager::Read(LwpObjectStream *pStrm) +{ + m_nCount = pStrm->QuickReaduInt16(); + if(m_nCount>0) + { + m_pFontNames.reset( new LwpFontNameEntry[m_nCount] ); + for(sal_uInt16 i=0; i<m_nCount; i++) + { + m_pFontNames[i].Read(pStrm); + } + } + m_FontTbl.Read(pStrm); + pStrm->SkipExtra(); +} + +void LwpFontNameManager::Override(sal_uInt16 index, rtl::Reference<XFFont> const & pFont) + //index: start from 1 +{ + if (index > m_nCount || index < 1) + return ; + + m_pFontNames[index-1].Override(pFont); + if(m_pFontNames[index-1].IsFaceNameOverridden()) + pFont->SetFontName(m_FontTbl.GetFaceName(m_pFontNames[index-1].GetFaceID())); + if(m_pFontNames[index-1].IsAltFaceNameOverridden()) + pFont->SetFontNameAsia(m_FontTbl.GetFaceName(m_pFontNames[index-1].GetAltFaceID())); +} + +OUString LwpFontNameManager::GetNameByIndex(sal_uInt16 index) + //index: start from 1 +{ + if (index > m_nCount || index < 1) + return OUString(); + + sal_uInt16 nameindex = m_pFontNames[index-1].GetFaceID(); + return m_FontTbl.GetFaceName(nameindex); +} + +void LwpFontAttrManager::Read(LwpObjectStream *pStrm) +{ + m_nCount = pStrm->QuickReaduInt16(); + m_pFontAttrs.reset( new LwpFontAttrEntry[m_nCount] ); + + for(sal_uInt16 i=0; i<m_nCount; i++) + { + m_pFontAttrs[i].Read(pStrm); + } + pStrm->SkipExtra(); +} + +void LwpFontAttrManager::Override(sal_uInt16 index, rtl::Reference<XFFont> const & pFont) + //index: start from 1 +{ + if (index > m_nCount || index < 1) + return ; + + m_pFontAttrs[index-1].Override(pFont); +} + +LwpFontAttrManager::~LwpFontAttrManager() +{ +} + +void LwpFontManager::Read(LwpObjectStream *pStrm) +{ + m_FNMgr.Read(pStrm); + m_AttrMgr.Read(pStrm); + pStrm->SkipExtra(); + +} + +/* +VO_PARASTYLE call this method to add its style to XFStyleManager based on the fontID +1. Construct the text style based on the fontID +2. Add the style to XFStyleManager, and return the <office:styles> style name +3. Add it to LwpParaStyleMap. +Note: A temporary method for only font support phase. The next AddStyle should be used later. +// To be replaced by LwpStyleManager::AddStyle() and the following CreateFont() +*/ +/*void LwpFontManager::AddStyle(LwpObjectID styleObjID, sal_uInt32 fontID, OUString styleName) +{ + XFTextStyle* pStyle = new XFTextStyle(); //to be deleted by XFStyleManager + AddStyle(styleObjID, fontID, styleName, pStyle); +}*/ + +/* +VO_PARASTYLE/VO_CHARACTERSTYLE call this method to add its style to XFStyleManager based on the fontID +1. Construct the text style based on the fontID +2. Add the style to XFStyleManager, and return the <office:styles> style name +3. Add it to LwpParaStyleMap. +Prerequisite: pStyle has been created and the paragraph properties has been set to it. +//To be replaced by LwpStyleManager::AddStyle() and the following CreateFont() +*/ +/*void LwpFontManager::AddStyle(LwpObjectID styleObjID, sal_uInt32 fontID, OUString styleName, XFTextStyle* pStyle) +{ + assert(pStyle); + XFFont* pFont = CreateFont(fontID); + pStyle->SetFont(pFont); + pStyle->SetStyleName(styleName); + XFStyleManager::AddStyle(pStyle); + m_StyleList.emplace( styleObjID, styleName)); +}*/ + +/* +Create XFFont based on the fotID +*/ +rtl::Reference<XFFont> LwpFontManager::CreateFont(sal_uInt32 fontID) +{ + rtl::Reference<XFFont> pFont = new XFFont(); + m_FNMgr.Override(GetFontNameIndex(fontID), pFont); + m_AttrMgr.Override(GetFontAttrIndex(fontID), pFont); + return pFont; +} + +/* +Called XFFont based on the override result of two font ids. +Refer to CFontManager::OverrideID +*/ +//OUString LwpFontManager::GetOverrideStyle(sal_uInt32 fontID, sal_uInt32 overID) +rtl::Reference<XFFont> LwpFontManager::CreateOverrideFont(sal_uInt32 fontID, sal_uInt32 overID) +{ + rtl::Reference<XFFont> pFont = new XFFont(); //To be deleted by XFFontFactory + if(fontID) + { + Override(fontID, pFont); + } + if(overID) + { + Override(overID, pFont); + } + return pFont; +} + +void LwpFontManager::Override(sal_uInt32 fontID, rtl::Reference<XFFont> const & pFont) +{ + m_FNMgr.Override(GetFontNameIndex(fontID), pFont); + m_AttrMgr.Override(GetFontAttrIndex(fontID), pFont); +} + +OUString LwpFontManager::GetNameByID(sal_uInt32 fontID) +{ + return m_FNMgr.GetNameByIndex(GetFontNameIndex(fontID));//use font id for bullet? +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |