summaryrefslogtreecommitdiff
path: root/lotuswordpro/source/filter/lwpfont.cxx
diff options
context:
space:
mode:
authorFong Lin <pflin@novell.com>2010-10-08 17:04:46 +0100
committerMichael Meeks <michael.meeks@novell.com>2010-10-08 17:04:46 +0100
commitcc316b39d9110c536e1758a4f814738ca209bb02 (patch)
tree0ff290d366ff8fea16ebc7e7781cc14b563f9b37 /lotuswordpro/source/filter/lwpfont.cxx
parent949fa63a66adc1ba54a0c353afd66bb863024d27 (diff)
Port of Lotus Word Pro filter, by Fong Lin and Noel Power
Diffstat (limited to 'lotuswordpro/source/filter/lwpfont.cxx')
-rw-r--r--lotuswordpro/source/filter/lwpfont.cxx556
1 files changed, 556 insertions, 0 deletions
diff --git a/lotuswordpro/source/filter/lwpfont.cxx b/lotuswordpro/source/filter/lwpfont.cxx
new file mode 100644
index 000000000000..86d42f18b9e1
--- /dev/null
+++ b/lotuswordpro/source/filter/lwpfont.cxx
@@ -0,0 +1,556 @@
+/*************************************************************************
+ *
+ * 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 "xfilter/xfstylemanager.hxx"
+#include "xfilter/xffontfactory.hxx"
+
+void LwpFontAttrEntry::Read(LwpObjectStream *pStrm)
+{
+ pStrm->QuickRead(&m_nAttrBits, sizeof(m_nAttrBits));
+ pStrm->QuickRead(&m_nAttrOverrideBits, sizeof(m_nAttrOverrideBits));
+ pStrm->QuickRead(&m_nAttrApplyBits, sizeof(m_nAttrApplyBits));
+ pStrm->QuickRead(&m_nAttrOverrideBits2, sizeof(m_nAttrOverrideBits2));
+ pStrm->QuickRead(&m_nAttrApplyBits2, sizeof(m_nAttrApplyBits2));
+ pStrm->QuickRead(&m_nCase, sizeof(m_nCase));
+ pStrm->QuickRead(&m_nUnder, sizeof(m_nUnder));
+ pStrm->SkipExtra();
+}
+
+#include "xfilter/xfdefs.hxx"
+void LwpFontAttrEntry::Override( XFFont*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(TRUE);
+ }
+
+ 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()
+{
+ return (0 != (m_nAttrOverrideBits & BOLD));
+}
+
+BOOL LwpFontAttrEntry::IsItalicOverridden()
+{
+ return (0 != (m_nAttrOverrideBits & ITALIC));
+}
+BOOL LwpFontAttrEntry::IsStrikeThruOverridden()
+{
+ return (0 != (m_nAttrOverrideBits & STRIKETHRU));
+}
+BOOL LwpFontAttrEntry::IsSmallCapsOverridden()
+{
+ return (0 != (m_nAttrOverrideBits & SMALLCAPS));
+}
+BOOL LwpFontAttrEntry::IsSuperOverridden()
+{
+ return (0 != (m_nAttrOverrideBits & SUPERSCRIPT));
+
+}
+BOOL LwpFontAttrEntry::IsSubOverridden()
+{
+ return (0 != (m_nAttrOverrideBits & SUBSCRIPT));
+
+}
+
+BOOL LwpFontAttrEntry::IsSuperSubOverridden()
+{
+ return (0 != (m_nAttrOverrideBits
+ & (SUPERSCRIPT | SUBSCRIPT)));
+}
+
+BOOL LwpFontAttrEntry::IsUnderlineOverridden()
+{
+ return (0 != (m_nAttrOverrideBits2 & UNDER));
+}
+BOOL LwpFontAttrEntry::IsCaseOverridden()
+{
+ 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 LwpFontTableEntry::GetFaceName()
+{
+ return (m_WindowsFaceName.str());
+}
+
+void LwpFontTableEntry::RegisterFontDecl()
+{
+ if(m_FaceName.str().getLength()==0) return;
+ XFStyleManager* pXFStyleManager = LwpGlobalMgr::GetInstance()->GetXFStyleManager();
+ XFFontDecl aFontDecl1( m_FaceName.str(), m_FaceName.str(), false );
+ pXFStyleManager->AddFontDecl(aFontDecl1);
+}
+
+LwpFontTable::LwpFontTable()
+ : m_pFontEntries(NULL)
+{}
+
+void LwpFontTable::Read(LwpObjectStream *pStrm)
+{
+ m_pFontEntries = NULL;
+ pStrm->QuickRead(&m_nCount, sizeof(m_nCount));
+ if(m_nCount>0)
+ {
+ m_pFontEntries = 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
+{
+ assert(index>0);
+ if (index < 1)//add by , for fix crash,2005/12/20
+ return OUString::createFromAscii("");//add end
+ return m_pFontEntries[index-1].GetFaceName();
+}
+
+LwpFontTable::~LwpFontTable()
+{
+ if(m_pFontEntries)
+ {
+ delete [] m_pFontEntries;
+ m_pFontEntries = NULL;
+ }
+}
+
+void LwpFontNameEntry::Read(LwpObjectStream *pStrm)
+{
+ //Read CFontDescriptionOverrideBase
+ pStrm->QuickRead(&m_nOverrideBits, sizeof(m_nOverrideBits));
+ pStrm->QuickRead(&m_nApplyBits, sizeof(m_nApplyBits));
+ pStrm->QuickRead(&m_nPointSize, sizeof(m_nPointSize));
+ pStrm->QuickRead(&m_nOverstrike, sizeof(m_nOverstrike));
+ pStrm->QuickRead(&m_nTightness, sizeof(m_nTightness));
+ m_Color.Read(pStrm);
+ m_BackColor.Read(pStrm);
+ pStrm->SkipExtra();
+
+ //Read data of LwpFontNameEntry
+ pStrm->QuickRead(&m_nFaceName, sizeof(m_nFaceName));
+ pStrm->QuickRead(&m_nAltFaceName, sizeof(m_nAltFaceName));
+ pStrm->SkipExtra();
+}
+#include "xfilter/xfcolor.hxx"
+void LwpFontNameEntry::Override(XFFont* 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()
+{
+ return (0 != (m_nOverrideBits & FACENAME));
+}
+
+BOOL LwpFontNameEntry::IsAltFaceNameOverridden()
+{
+ return (0 != (m_nOverrideBits & ALTFACENAME));
+}
+
+BOOL LwpFontNameEntry::IsPointSizeOverridden()
+{
+ return (0 != (m_nOverrideBits & POINTSIZE));
+}
+
+BOOL LwpFontNameEntry::IsColorOverridden()
+{
+ return (0 != (m_nOverrideBits & COLOR));
+}
+
+BOOL LwpFontNameEntry::IsBackgroundColorOverridden()
+{
+ return (0 != (m_nOverrideBits & BKCOLOR));
+}
+
+BOOL LwpFontNameEntry::IsTightnessOverridden()
+{
+ return (0 != (m_nOverrideBits & TIGHTNESS));
+}
+
+BOOL LwpFontNameEntry::IsAnythingOverridden()
+{
+ return (0 != (m_nOverrideBits & ALL_BITS));
+}
+
+
+LwpFontNameManager::LwpFontNameManager()
+ :m_pFontNames(NULL)
+{}
+
+LwpFontNameManager::~LwpFontNameManager()
+{
+ if(m_pFontNames)
+ {
+ delete [] m_pFontNames;
+ m_pFontNames = NULL;
+ }
+}
+
+void LwpFontNameManager::Read(LwpObjectStream *pStrm)
+{
+ pStrm->QuickRead(&m_nCount, sizeof(m_nCount));
+ if(m_nCount>0)
+ {
+ m_pFontNames = 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, XFFont* pFont)
+ //index: start from 1
+{
+ if(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)
+{
+ sal_uInt16 nameindex = m_pFontNames[index-1].GetFaceID();
+ return (m_FontTbl.GetFaceName(nameindex));
+}
+
+/*void LwpFontNameManager::Override(sal_uInt16 baseID, sal_uInt16 overID, XFFont* pFont)
+{
+ //Override
+ m_pFontNames[overID-1]. Override(&m_pFontNames[baseID-1], pFont);
+}
+
+void LwpFontAttrManager::Override(sal_uInt16 baseID, sal_uInt16 overID, XFFont*pFont)
+{
+ m_pFontAttrs[overID-1]. Override(&m_pFontAttrs[baseID-1], pFont);
+}*/
+
+void LwpFontAttrManager::Read(LwpObjectStream *pStrm) {
+ pStrm->QuickRead(&m_nCount, sizeof(m_nCount));
+ m_pFontAttrs = 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, XFFont* pFont)
+ //index: start from 1
+{
+ if(index<1) return;
+ m_pFontAttrs[index-1].Override(pFont);
+}
+
+LwpFontAttrManager::~LwpFontAttrManager()
+{
+ if(m_pFontAttrs)
+ delete []m_pFontAttrs;
+}
+
+void LwpFontManager::Read(LwpObjectStream *pStrm)
+{
+ m_FNMgr.Read(pStrm);
+ m_AttrMgr.Read(pStrm);
+ pStrm->SkipExtra();
+
+}
+
+#include "xfilter/xftextstyle.hxx"
+
+/*
+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.insert(LwpParaStyleMap::value_type(styleObjID, styleName));
+}*/
+
+/*
+Create XFFont based on the fotID
+*/
+XFFont* LwpFontManager::CreateFont(sal_uInt32 fontID)
+{
+ XFFont* pFont = new XFFont();
+ SetDfltFont(pFont);
+ 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)
+XFFont* LwpFontManager::CreateOverrideFont(sal_uInt32 fontID, sal_uInt32 overID)
+{
+ XFFont* pFont = new XFFont(); //To be deleted by XFFontFactory
+ SetDfltFont(pFont);
+ if(fontID)
+ {
+ Override(fontID, pFont);
+ }
+ if(overID)
+ {
+ Override(overID, pFont);
+ }
+ return pFont;
+}
+
+void LwpFontManager::Override(sal_uInt32 fontID, XFFont* pFont)
+{
+ m_FNMgr.Override(GetFontNameIndex(fontID), pFont);
+ m_AttrMgr.Override(GetFontAttrIndex(fontID), pFont);
+}
+
+
+/*
+Called by VO_PARA to get style name based on the Para Style ID
+1) Get style from LwpParaStyleMap based on the LwpObjectID of VO_PARASTYLE.
+2) Prerequisite: VO_PARASTYLE should call AddStyle first.
+3) Return empty string if no style found.
+//To be replaced by OUString LwpStyleManager::GetStyle(const LwpObjectID &styleID)
+*/
+/*OUString LwpFontManager::GetParaStyle(const LwpObjectID &styleID)
+{
+ LwpParaStyleMap::const_iterator it = m_StyleList.find(styleID);
+ if (it != m_StyleList.end()) {
+ return((*it).second);
+ }
+ return OUString();
+}*/
+
+void LwpFontManager::SetDfltFont(XFFont* pFont)
+{
+ // TODO: Set default XFFont values in lwp filter
+ //color:black, background color: transparent, Orientation: left to right, top to bottom, others: 0
+ //Refer to CFontDescription::CFontDescription(void)
+ //Did not find anything special
+ //pFont->SetColor(XFColor(0,0,0));
+}
+
+OUString LwpFontManager::GetNameByID(sal_uInt32 fontID)
+{
+ return ( m_FNMgr.GetNameByIndex(GetFontNameIndex(fontID)) );//use font id for bullet? note by ,2005/7/5
+}