[Libreoffice-commits] .: 15 commits - sd/prj sd/source sd/util

Jan Holesovsky kendy at kemper.freedesktop.org
Tue Nov 16 00:41:58 PST 2010


 sd/prj/build.lst                          |    2 
 sd/source/filter/eppt/eppt.cxx            | 1677 +++++------------------
 sd/source/filter/eppt/eppt.hxx            |  809 +----------
 sd/source/filter/eppt/epptbase.hxx        |  443 ++++++
 sd/source/filter/eppt/epptooxml.hxx       |  165 ++
 sd/source/filter/eppt/epptso.cxx          | 2145 +-----------------------------
 sd/source/filter/eppt/grouptable.hxx      |   86 +
 sd/source/filter/eppt/makefile.mk         |   13 
 sd/source/filter/eppt/pptexanimations.cxx |  375 ++---
 sd/source/filter/eppt/pptexanimations.hxx |   25 
 sd/source/filter/eppt/pptx-epptbase.cxx   | 1010 ++++++++++++++
 sd/source/filter/eppt/pptx-epptooxml.cxx  | 2079 +++++++++++++++++++++++++++++
 sd/source/filter/eppt/pptx-grouptable.cxx |  142 +
 sd/source/filter/eppt/pptx-stylesheet.cxx |  514 +++++++
 sd/source/filter/eppt/pptx-text.cxx       | 1479 ++++++++++++++++++++
 sd/source/filter/eppt/text.hxx            |  270 +++
 sd/util/makefile.mk                       |    6 
 sd/util/sdfilt.map                        |    3 
 18 files changed, 7083 insertions(+), 4160 deletions(-)

New commits:
commit 15d6b693a6b2c9357cc46f88f96b504e1c2aa3f2
Merge: 2374519... 861472a...
Author: Jan Holesovsky <kendy at suse.cz>
Date:   Tue Nov 16 09:34:20 2010 +0100

    Merge remote branch 'origin/libreoffice-3-3'
    
    Conflicts:
    	sd/source/filter/eppt/epptso.cxx

diff --cc sd/source/filter/eppt/pptx-text.cxx
index 0000000,4c6bedb..4825536
mode 000000,100644..100644
--- a/sd/source/filter/eppt/pptx-text.cxx
+++ b/sd/source/filter/eppt/pptx-text.cxx
@@@ -1,0 -1,1479 +1,1479 @@@
+ /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+ /*************************************************************************
+  *
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+  *
+  * Copyright 2000, 2010 Oracle and/or its affiliates.
+  *
+  * OpenOffice.org - a multi-platform office productivity suite
+  *
+  * This file is part of OpenOffice.org.
+  *
+  * OpenOffice.org is free software: you can redistribute it and/or modify
+  * it under the terms of the GNU Lesser General Public License version 3
+  * only, as published by the Free Software Foundation.
+  *
+  * OpenOffice.org 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 version 3 for more details
+  * (a copy is included in the LICENSE file that accompanied this code).
+  *
+  * You should have received a copy of the GNU Lesser General Public License
+  * version 3 along with OpenOffice.org.  If not, see
+  * <http://www.openoffice.org/license.html>
+  * for a copy of the LGPLv3 License.
+  *
+  ************************************************************************/
+ 
+ #include "text.hxx"
+ 
+ #include <com/sun/star/awt/CharSet.hpp>
+ #include <com/sun/star/awt/FontWeight.hpp>
+ #include <com/sun/star/awt/FontUnderline.hpp>
+ #include <com/sun/star/beans/XPropertyState.hpp>
+ #include <com/sun/star/container/XEnumerationAccess.hpp>
+ #include <com/sun/star/container/XIndexReplace.hpp>
+ #include <com/sun/star/i18n/XBreakIterator.hpp>
+ #include <com/sun/star/i18n/ScriptDirection.hpp>
+ #include <com/sun/star/i18n/ScriptType.hpp>
+ #include <com/sun/star/i18n/XScriptTypeDetector.hpp>
+ #include <com/sun/star/text/FontRelief.hpp>
+ #include <com/sun/star/text/XTextField.hpp>
+ #include <com/sun/star/text/XTextRange.hpp>
+ #include <com/sun/star/style/LineSpacing.hpp>
+ #include <com/sun/star/style/LineSpacingMode.hpp>
+ #include <com/sun/star/style/ParagraphAdjust.hpp>
+ #include <com/sun/star/style/TabStop.hpp>
+ 
+ #include <svl/languageoptions.hxx>
+ #include <sfx2/app.hxx>
+ #include <editeng/svxenum.hxx>
+ #include <editeng/frmdir.hxx>
+ #include <unotools/fontcvt.hxx>
+ #include <vcl/metric.hxx>
+ #include <vcl/outdev.hxx>
+ #include <vcl/virdev.hxx>
+ #include <comphelper/processfactory.hxx>
+ #include <oox/export/drawingml.hxx> // for SubstituteBullet
+ 
+ com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator > xPPTBreakIter;
+ com::sun::star::uno::Reference< com::sun::star::i18n::XScriptTypeDetector > xScriptTypeDetector;
+ 
+ PortionObj::PortionObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
+                 FontCollection& rFontCollection ) :
+     mnCharAttrHard      ( 0 ),
+     mnCharAttr          ( 0 ),
+     mnFont              ( 0 ),
+     mnAsianOrComplexFont( 0xffff ),
+     mnTextSize          ( 0 ),
+     mbLastPortion       ( TRUE ),
+     mpText              ( NULL ),
+     mpFieldEntry        ( NULL )
+ {
+     mXPropSet = rXPropSet;
+ 
+     ImplGetPortionValues( rFontCollection, FALSE );
+ }
+ 
+ PortionObj::PortionObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & rXTextRange,
+                             sal_Bool bLast, FontCollection& rFontCollection ) :
+     mnCharAttrHard          ( 0 ),
+     mnCharAttr              ( 0 ),
+     mnFont                  ( 0 ),
+     mnAsianOrComplexFont    ( 0xffff ),
+     mbLastPortion           ( bLast ),
+     mpText                  ( NULL ),
+     mpFieldEntry            ( NULL )
+ {
+     String aString( rXTextRange->getString() );
+     String aURL;
+     BOOL bRTL_endingParen = FALSE;
+ 
+     mnTextSize = aString.Len();
+     if ( bLast )
+         mnTextSize++;
+ 
+     if ( mnTextSize )
+     {
+         mpFieldEntry = NULL;
+         sal_uInt32 nFieldType = 0;
+ 
+         mXPropSet = ::com::sun::star::uno::Reference<
+             ::com::sun::star::beans::XPropertySet >
+                 ( rXTextRange, ::com::sun::star::uno::UNO_QUERY );
+         mXPropState = ::com::sun::star::uno::Reference<
+             ::com::sun::star::beans::XPropertyState >
+                 ( rXTextRange, ::com::sun::star::uno::UNO_QUERY );
+ 
+         sal_Bool bPropSetsValid = ( mXPropSet.is() && mXPropState.is() );
+         if ( bPropSetsValid )
+             nFieldType = ImplGetTextField( rXTextRange, mXPropSet, aURL );
+         if ( nFieldType )
+         {
+             mpFieldEntry = new FieldEntry( nFieldType, 0, mnTextSize );
+             if ( ( nFieldType >> 28 == 4 ) )
+             {
+                 mpFieldEntry->aRepresentation = aString;
+                 mpFieldEntry->aFieldUrl = aURL;
+             }
+         }
+         sal_Bool bSymbol = FALSE;
+ 
+         if ( bPropSetsValid && ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSet" ) ), FALSE ) )
+         {
+             sal_Int16 nCharset = 0;
+             mAny >>= nCharset;
+             if ( nCharset == ::com::sun::star::awt::CharSet::SYMBOL )
+                 bSymbol = TRUE;
+         }
+         if ( mpFieldEntry && ( nFieldType & 0x800000 ) )    // placeholder ?
+         {
+             mnTextSize = 1;
+             if ( bLast )
+                 mnTextSize++;
+             mpText = new sal_uInt16[ mnTextSize ];
+             mpText[ 0 ] = 0x2a;
+         }
+         else
+         {
+             const sal_Unicode* pText = aString.GetBuffer();
+             // For i39516 - a closing parenthesis that ends an RTL string is displayed backwards by PPT
+             // Solution: add a Unicode Right-to-Left Mark, following the method described in i18024
+             if ( bLast && pText[ aString.Len() - 1 ] == sal_Unicode(')') && rFontCollection.GetScriptDirection( aString ) == com::sun::star::i18n::ScriptDirection::RIGHT_TO_LEFT )
+             {
+                 mnTextSize++;
+                 bRTL_endingParen = TRUE;
+             }
+             mpText = new sal_uInt16[ mnTextSize ];
+             sal_uInt16 nChar;
+             for ( int i = 0; i < aString.Len(); i++ )
+             {
+                 nChar = (sal_uInt16)pText[ i ];
+                 if ( nChar == 0xa )
+                     nChar++;
+                 else if ( !bSymbol )
+                 {
+                     switch ( nChar )
+                     {
+                         // Currency
+                         case 128:   nChar = 0x20AC; break;
+                         // Punctuation and other
+                         case 130:   nChar = 0x201A; break;// SINGLE LOW-9 QUOTATION MARK
+                         case 131:   nChar = 0x0192; break;// LATIN SMALL LETTER F WITH HOOK
+                         case 132:   nChar = 0x201E; break;// DOUBLE LOW-9 QUOTATION MARK
+                                                               // LOW DOUBLE PRIME QUOTATION MARK
+                         case 133:   nChar = 0x2026; break;// HORIZONTAL ELLIPSES
+                         case 134:   nChar = 0x2020; break;// DAGGER
+                         case 135:   nChar = 0x2021; break;// DOUBLE DAGGER
+                         case 136:   nChar = 0x02C6; break;// MODIFIER LETTER CIRCUMFLEX ACCENT
+                         case 137:   nChar = 0x2030; break;// PER MILLE SIGN
+                         case 138:   nChar = 0x0160; break;// LATIN CAPITAL LETTER S WITH CARON
+                         case 139:   nChar = 0x2039; break;// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+                         case 140:   nChar = 0x0152; break;// LATIN CAPITAL LIGATURE OE
+                         case 142:   nChar = 0x017D; break;// LATIN CAPITAL LETTER Z WITH CARON
+                         case 145:   nChar = 0x2018; break;// LEFT SINGLE QUOTATION MARK
+                                                               // MODIFIER LETTER TURNED COMMA
+                         case 146:   nChar = 0x2019; break;// RIGHT SINGLE QUOTATION MARK
+                                                               // MODIFIER LETTER APOSTROPHE
+                         case 147:   nChar = 0x201C; break;// LEFT DOUBLE QUOTATION MARK
+                                                               // REVERSED DOUBLE PRIME QUOTATION MARK
+                         case 148:   nChar = 0x201D; break;// RIGHT DOUBLE QUOTATION MARK
+                                                               // REVERSED DOUBLE PRIME QUOTATION MARK
+                         case 149:   nChar = 0x2022; break;// BULLET
+                         case 150:   nChar = 0x2013; break;// EN DASH
+                         case 151:   nChar = 0x2014; break;// EM DASH
+                         case 152:   nChar = 0x02DC; break;// SMALL TILDE
+                         case 153:   nChar = 0x2122; break;// TRADE MARK SIGN
+                         case 154:   nChar = 0x0161; break;// LATIN SMALL LETTER S WITH CARON
+                         case 155:   nChar = 0x203A; break;// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+                         case 156:   nChar = 0x0153; break;// LATIN SMALL LIGATURE OE
+                         case 158:   nChar = 0x017E; break;// LATIN SMALL LETTER Z WITH CARON
+                         case 159:   nChar = 0x0178; break;// LATIN CAPITAL LETTER Y WITH DIAERESIS
+ //                      case 222:   nChar = 0x00B6; break;// PILCROW SIGN / PARAGRAPH SIGN
+                     }
+                 }
+                 mpText[ i ] = nChar;
+             }
+         }
+         if ( bRTL_endingParen )
+             mpText[ mnTextSize - 2 ] = 0x200F; // Unicode Right-to-Left mark
+ 
+         if ( bLast )
+             mpText[ mnTextSize - 1 ] = 0xd;
+ 
+         if ( bPropSetsValid )
+             ImplGetPortionValues( rFontCollection, TRUE );
+     }
+ }
+ 
+ PortionObj::PortionObj( PortionObj& rPortionObj )
+ : PropStateValue( rPortionObj )
+ {
+     ImplConstruct( rPortionObj );
+ }
+ 
+ PortionObj::~PortionObj()
+ {
+     ImplClear();
+ }
+ 
+ void PortionObj::Write( SvStream* pStrm, sal_Bool bLast )
+ {
+     sal_uInt32 nCount = mnTextSize;
+     if ( bLast && mbLastPortion )
+         nCount--;
+     for ( sal_uInt32 i = 0; i < nCount; i++ )
+         *pStrm << (sal_uInt16)mpText[ i ];
+ }
+ 
+ void PortionObj::ImplGetPortionValues( FontCollection& rFontCollection, sal_Bool bGetPropStateValue )
+ {
+ 
+     sal_Bool bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontName" ) ), bGetPropStateValue );
+     meFontName = ePropState;
+     if ( bOk )
+     {
+         FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
+         sal_uInt32  nCount = rFontCollection.GetCount();
+         mnFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
+         if ( mnFont == nCount )
+         {
+             FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+             if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSet" ) ), sal_False ) )
+                 mAny >>= rFontDesc.CharSet;
+             if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamily" ) ), sal_False ) )
+                 mAny >>= rFontDesc.Family;
+             if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitch" ) ), sal_False ) )
+                 mAny >>= rFontDesc.Pitch;
+         }
+     }
+ 
+     sal_Int16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( Application::GetSettings().GetLanguage() );
+     if ( mpText && mnTextSize && xPPTBreakIter.is() )
+     {
+         rtl::OUString sT( mpText, mnTextSize );
+         nScriptType = xPPTBreakIter->getScriptType( sT, 0 );
+     }
+     if ( nScriptType != com::sun::star::i18n::ScriptType::COMPLEX )
+     {
+         bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontNameAsian" ) ), bGetPropStateValue );
+         meAsianOrComplexFont = ePropState;
+         if ( bOk )
+         {
+             FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
+             sal_uInt32  nCount = rFontCollection.GetCount();
+             mnAsianOrComplexFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
+             if ( mnAsianOrComplexFont == nCount )
+             {
+                 FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSetAsian" ) ), sal_False ) )
+                     mAny >>= rFontDesc.CharSet;
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamilyAsian" ) ), sal_False ) )
+                     mAny >>= rFontDesc.Family;
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitchAsian" ) ), sal_False ) )
+                     mAny >>= rFontDesc.Pitch;
+             }
+         }
+     }
+     else
+     {
+         bOk = ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontNameComplex" ) ), bGetPropStateValue );
+         meAsianOrComplexFont = ePropState;
+         if ( bOk )
+         {
+             FontCollectionEntry aFontDesc( *(::rtl::OUString*)mAny.getValue() );
+             sal_uInt32  nCount = rFontCollection.GetCount();
+             mnAsianOrComplexFont = (sal_uInt16)rFontCollection.GetId( aFontDesc );
+             if ( mnAsianOrComplexFont == nCount )
+             {
+                 FontCollectionEntry& rFontDesc = rFontCollection.GetLast();
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontCharSetComplex" ) ), sal_False ) )
+                     mAny >>= rFontDesc.CharSet;
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontFamilyComplex" ) ), sal_False ) )
+                     mAny >>= rFontDesc.Family;
+                 if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharFontPitchComplex" ) ), sal_False ) )
+                     mAny >>= rFontDesc.Pitch;
+             }
+         }
+     }
+ 
+     rtl::OUString aCharHeightName, aCharWeightName, aCharLocaleName, aCharPostureName;
+     switch( nScriptType )
+     {
+         case com::sun::star::i18n::ScriptType::ASIAN :
+         {
+             aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeightAsian" ) );
+             aCharWeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeightAsian" ) );
+             aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocaleAsian" ) );
+             aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPostureAsian" ) );
+             break;
+         }
+         case com::sun::star::i18n::ScriptType::COMPLEX :
+         {
+             aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeightComplex" ) );
+             aCharWeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeightComplex" ) );
+             aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocaleComplex" ) );
+             aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPostureComplex" ) );
+             break;
+         }
+         default:
+         {
+             aCharHeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharHeight" ) );
+             aCharWeightName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharWeight" ) );
+             aCharLocaleName  = String( RTL_CONSTASCII_USTRINGPARAM( "CharLocale" ) );
+             aCharPostureName = String( RTL_CONSTASCII_USTRINGPARAM( "CharPosture" ) );
+             break;
+         }
+     }
+ 
+     mnCharHeight = 24;
+     if ( GetPropertyValue( mAny, mXPropSet, aCharHeightName, sal_False ) )
+     {
+         float fVal(0.0);
+         if ( mAny >>= fVal )
+         {
+             mnCharHeight = (sal_uInt16)( fVal + 0.5 );
+             meCharHeight = GetPropertyState( mXPropSet, aCharHeightName );
+         }
+     }
+     if ( GetPropertyValue( mAny, mXPropSet, aCharWeightName, sal_False ) )
+     {
+         float fFloat(0.0);
+         if ( mAny >>= fFloat )
+         {
+             if ( fFloat >= ::com::sun::star::awt::FontWeight::SEMIBOLD )
+                 mnCharAttr |= 1;
+             if ( GetPropertyState( mXPropSet, aCharWeightName ) == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+                 mnCharAttrHard |= 1;
+         }
+     }
+     if ( GetPropertyValue( mAny, mXPropSet, aCharLocaleName, sal_False ) )
+     {
+         com::sun::star::lang::Locale eLocale;
+         if ( mAny >>= eLocale )
+             meCharLocale = eLocale;
+     }
+     if ( GetPropertyValue( mAny, mXPropSet, aCharPostureName, sal_False ) )
+     {
+         ::com::sun::star::awt::FontSlant aFS;
+         if ( mAny >>= aFS )
+         {
+             switch( aFS )
+             {
+                 case ::com::sun::star::awt::FontSlant_OBLIQUE :
+                 case ::com::sun::star::awt::FontSlant_ITALIC :
+                     mnCharAttr |= 2;
+                     break;
+                 default:
+                     break;
+             }
+             if ( GetPropertyState( mXPropSet, aCharPostureName ) == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+                 mnCharAttrHard |= 2;
+         }
+     }
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharUnderline" ) ), bGetPropStateValue ) )
+     {
+         sal_Int16 nVal(0);
+         mAny >>= nVal;
+         switch ( nVal )
+         {
+             case ::com::sun::star::awt::FontUnderline::SINGLE :
+             case ::com::sun::star::awt::FontUnderline::DOUBLE :
+             case ::com::sun::star::awt::FontUnderline::DOTTED :
+                 mnCharAttr |= 4;
+         }
+     }
+     if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+         mnCharAttrHard |= 4;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharShadowed" ) ), bGetPropStateValue ) )
+     {
+         sal_Bool bBool(sal_False);
+         mAny >>= bBool;
+         if ( bBool )
+             mnCharAttr |= 0x10;
+     }
+     if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+         mnCharAttrHard |= 16;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharRelief" ) ), bGetPropStateValue ) )
+     {
+         sal_Int16 nVal(0);
+         mAny >>= nVal;
+         if ( nVal != ::com::sun::star::text::FontRelief::NONE )
+             mnCharAttr |= 512;
+     }
+     if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+         mnCharAttrHard |= 512;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharColor" ) ), bGetPropStateValue ) )
+     {
+         sal_uInt32 nSOColor = *( (sal_uInt32*)mAny.getValue() );
+         mnCharColor = nSOColor & 0xff00ff00;                            // green and hibyte
+         mnCharColor |= (sal_uInt8)( nSOColor ) << 16;                   // red and blue is switched
+         mnCharColor |= (sal_uInt8)( nSOColor >> 16 );
+     }
+     meCharColor = ePropState;
+ 
+     mnCharEscapement = 0;
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "CharEscapement" ) ), bGetPropStateValue ) )
+     {
+         mAny >>= mnCharEscapement;
+         if ( mnCharEscapement > 100 )
+             mnCharEscapement = 33;
+         else if ( mnCharEscapement < -100 )
+             mnCharEscapement = -33;
+     }
+     meCharEscapement = ePropState;
+ }
+ 
+ void PortionObj::ImplClear()
+ {
+     delete (FieldEntry*)mpFieldEntry;
+     delete[] mpText;
+ }
+ 
+ void PortionObj::ImplConstruct( PortionObj& rPortionObj )
+ {
+     mbLastPortion = rPortionObj.mbLastPortion;
+     mnTextSize = rPortionObj.mnTextSize;
+     mnCharColor = rPortionObj.mnCharColor;
+     mnCharEscapement = rPortionObj.mnCharEscapement;
+     mnCharAttr = rPortionObj.mnCharAttr;
+     mnCharHeight = rPortionObj.mnCharHeight;
+     mnFont = rPortionObj.mnFont;
+     mnAsianOrComplexFont = rPortionObj.mnAsianOrComplexFont;
+ 
+     if ( rPortionObj.mpText )
+     {
+         mpText = new sal_uInt16[ mnTextSize ];
+         memcpy( mpText, rPortionObj.mpText, mnTextSize << 1 );
+     }
+     else
+         mpText = NULL;
+ 
+     if ( rPortionObj.mpFieldEntry )
+         mpFieldEntry = new FieldEntry( *( rPortionObj.mpFieldEntry ) );
+     else
+         mpFieldEntry = NULL;
+ }
+ 
+ sal_uInt32 PortionObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
+ {
+     if ( mpFieldEntry && ( !mpFieldEntry->nFieldStartPos ) )
+     {
+         mpFieldEntry->nFieldStartPos += nCurrentTextPosition;
+         mpFieldEntry->nFieldEndPos += nCurrentTextPosition;
+     }
+     return mnTextSize;
+ }
+ 
+ //  -----------------------------------------------------------------------
+ // Rueckgabe:                           0 = kein TextField
+ //  bit28->31   text field type :
+ //                                      1 = Date
+ //                                      2 = Time
+ //                                      3 = SlideNumber
+ //                                      4 = Url
+ //                                      5 = DateTime
+ //                                      6 = header
+ //                                      7 = footer
+ //  bit24->27   text field sub type (optional)
+ //     23->     PPT Textfield needs a placeholder
+ 
+ sal_uInt32 PortionObj::ImplGetTextField( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & ,
+     const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, String& rURL )
+ {
+     sal_uInt32 nRetValue = 0;
+     sal_Int32 nFormat;
+     ::com::sun::star::uno::Any aAny;
+     if ( GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextPortionType" ) ), sal_True ) )
+     {
+         String  aTextFieldType( *(::rtl::OUString*)aAny.getValue() );
+         if ( aTextFieldType == String( RTL_CONSTASCII_USTRINGPARAM( "TextField" ) ) )
+         {
+             if ( GetPropertyValue( aAny, rXPropSet, aTextFieldType, sal_True ) )
+             {
+                 ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextField > aXTextField;
+                 if ( aAny >>= aXTextField )
+                 {
+                     if ( aXTextField.is() )
+                     {
+                         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
+                             xFieldPropSet( aXTextField, ::com::sun::star::uno::UNO_QUERY );
+                         if ( xFieldPropSet.is() )
+                         {
+                             String aFieldKind( aXTextField->getPresentation( TRUE ) );
+                             if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Date" ) ) )
+                             {
+                                 if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
+                                 {
+                                     sal_Bool bBool = sal_False;
+                                     aAny >>= bBool;
+                                     if ( !bBool )  // Fixed DateFields gibt es in PPT nicht
+                                     {
+                                         if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Format" ) ) ), sal_True )
+                                         {
+                                             nFormat = *(sal_Int32*)aAny.getValue();
+                                             switch ( nFormat )
+                                             {
+                                                 default:
+                                                 case 5 :
+                                                 case 4 :
+                                                 case 2 : nFormat = 0; break;
+                                                 case 8 :
+                                                 case 9 :
+                                                 case 3 : nFormat = 1; break;
+                                                 case 7 :
+                                                 case 6 : nFormat = 2; break;
+                                             }
+                                             nRetValue |= ( ( ( 1 << 4 ) | nFormat ) << 24 ) | 0x800000;
+                                         }
+                                     }
+                                 }
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ) )
+                             {
+                                 if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ) ), sal_True )
+                                     rURL = String( *(::rtl::OUString*)aAny.getValue() );
+                                 nRetValue = 4 << 28;
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Page" ) ) )
+                             {
+                                 nRetValue = 3 << 28 | 0x800000;
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Pages" ) ) )
+                             {
+ 
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Time" ) ) )
+                             {
+                                 if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
+                                 {
+                                     sal_Bool bBool = sal_False;
+                                     aAny >>= bBool;
+                                     if ( !bBool )
+                                     {
+                                         if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
+                                         {
+                                             nFormat = *(sal_Int32*)aAny.getValue();
+                                             nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
+                                         }
+                                     }
+                                 }
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "File" ) ) )
+                             {
+ 
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Table" ) ) )
+                             {
+ 
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "ExtTime" ) ) )
+                             {
+                                 if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsFix" ) ) ), sal_True )
+                                 {
+                                     sal_Bool bBool = sal_False;
+                                     aAny >>= bBool;
+                                     if ( !bBool )
+                                     {
+                                         if ( GetPropertyValue( aAny, xFieldPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Format" ) ) ), sal_True )
+                                         {
+                                             nFormat = *(sal_Int32*)aAny.getValue();
+                                             switch ( nFormat )
+                                             {
+                                                 default:
+                                                 case 6 :
+                                                 case 7 :
+                                                 case 8 :
+                                                 case 2 : nFormat = 12; break;
+                                                 case 3 : nFormat = 9; break;
+                                                 case 5 :
+                                                 case 4 : nFormat = 10; break;
+ 
+                                             }
+                                             nRetValue |= ( ( ( 2 << 4 ) | nFormat ) << 24 ) | 0x800000;
+                                         }
+                                     }
+                                 }
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "ExtFile" ) ) )
+                             {
+ 
+                             }
+                             else if ( aFieldKind ==  String( RTL_CONSTASCII_USTRINGPARAM( "Author" ) ) )
+                             {
+ 
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "DateTime" ) ) )
+                             {
+                                 nRetValue = 5 << 28 | 0x800000;
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Header" ) ) )
+                             {
+                                 nRetValue = 6 << 28 | 0x800000;
+                             }
+                             else if ( aFieldKind == String( RTL_CONSTASCII_USTRINGPARAM( "Footer" ) ) )
+                             {
+                                 nRetValue = 7 << 28 | 0x800000;
+                             }
+                         }
+                     }
+                 }
+             }
+         }
+     }
+     return nRetValue;
+ }
+ 
+ PortionObj& PortionObj::operator=( PortionObj& rPortionObj )
+ {
+     if ( this != &rPortionObj )
+     {
+         ImplClear();
+         ImplConstruct( rPortionObj );
+     }
+     return *this;
+ }
+ 
+ ParagraphObj::ParagraphObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
+                 PPTExBulletProvider& rProv ) :
+     maMapModeSrc        ( MAP_100TH_MM ),
+     maMapModeDest       ( MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ) )
+ {
+     mXPropSet = rXPropSet;
+ 
+     bExtendedParameters = FALSE;
+ 
+     nDepth = 0;
+     nBulletFlags = 0;
+     nParaFlags = 0;
+ 
+     ImplGetParagraphValues( rProv, FALSE );
+ }
+ 
+     ParagraphObj::ParagraphObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & rXTextContent,
+                     ParaFlags aParaFlags, FontCollection& rFontCollection, PPTExBulletProvider& rProv ) :
+     maMapModeSrc        ( MAP_100TH_MM ),
+     maMapModeDest       ( MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ) ),
+     mbFirstParagraph    ( aParaFlags.bFirstParagraph ),
+     mbLastParagraph     ( aParaFlags.bLastParagraph )
+ {
+     bExtendedParameters = FALSE;
+ 
+     nDepth = 0;
+     nBulletFlags = 0;
+     nParaFlags = 0;
+ 
+     mXPropSet = ::com::sun::star::uno::Reference<
+         ::com::sun::star::beans::XPropertySet >
+             ( rXTextContent, ::com::sun::star::uno::UNO_QUERY );
+ 
+     mXPropState = ::com::sun::star::uno::Reference<
+         ::com::sun::star::beans::XPropertyState >
+             ( rXTextContent, ::com::sun::star::uno::UNO_QUERY );
+ 
+     if ( mXPropSet.is() && mXPropState.is() )
+     {
+         ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess >
+             aXTextPortionEA( rXTextContent, ::com::sun::star::uno::UNO_QUERY );
+         if ( aXTextPortionEA.is() )
+         {
+             ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >
+                 aXTextPortionE( aXTextPortionEA->createEnumeration() );
+             if ( aXTextPortionE.is() )
+             {
+                 while ( aXTextPortionE->hasMoreElements() )
+                 {
+                     ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > aXCursorText;
+                     ::com::sun::star::uno::Any aAny( aXTextPortionE->nextElement() );
+                     if ( aAny >>= aXCursorText )
+                     {
+                         PortionObj* pPortionObj = new PortionObj( aXCursorText, !aXTextPortionE->hasMoreElements(), rFontCollection );
+                         if ( pPortionObj->Count() )
+                             Insert( pPortionObj, LIST_APPEND );
+                         else
+                             delete pPortionObj;
+                     }
+                 }
+             }
+         }
+         ImplGetParagraphValues( rProv, TRUE );//
+     }
+ }
+ 
+ ParagraphObj::ParagraphObj( ParagraphObj& rObj )
+ : List()
+ , PropStateValue()
+ , SOParagraph()
+ {
+     ImplConstruct( rObj );
+ }
+ 
+ ParagraphObj::~ParagraphObj()
+ {
+     ImplClear();
+ }
+ 
+ void ParagraphObj::Write( SvStream* pStrm )
+ {
+     for ( void* pPtr = First(); pPtr; pPtr = Next() )
+         ((PortionObj*)pPtr)->Write( pStrm, mbLastParagraph );
+ }
+ 
+ void ParagraphObj::ImplClear()
+ {
+     for ( void* pPtr = First(); pPtr; pPtr = Next() )
+         delete (PortionObj*)pPtr;
+ }
+ 
+ void ParagraphObj::CalculateGraphicBulletSize( sal_uInt16 nFontHeight )
+ {
+     if ( ( (SvxExtNumType)nNumberingType == SVX_NUM_BITMAP ) && ( nBulletId != 0xffff ) )
+     {
+         // calculate the bulletrealsize for this grafik
+         if ( aBuGraSize.Width() && aBuGraSize.Height() )
+         {
+             double fCharHeight = nFontHeight;
+             double fLen = aBuGraSize.Height();
+             fCharHeight = fCharHeight * 0.2540;
+             double fQuo = fLen / fCharHeight;
+             nBulletRealSize = (sal_Int16)( fQuo + 0.5 );
+             if ( (sal_uInt16)nBulletRealSize > 400 )
+                 nBulletRealSize = 400;
+         }
+     }
+ }
+ 
+ // from sw/source/filter/ww8/wrtw8num.cxx for default bullets to export to MS intact
+ static void lcl_SubstituteBullet(String& rNumStr, rtl_TextEncoding& rChrSet, String& rFontName)
+ {
+     sal_Unicode cChar = rNumStr.GetChar(0);
+     StarSymbolToMSMultiFont *pConvert = CreateStarSymbolToMSMultiFont();
+     String sFont = pConvert->ConvertChar(cChar);
+     delete pConvert;
+     if (sFont.Len())
+     {
+         rNumStr = static_cast< sal_Unicode >(cChar | 0xF000);
+         rFontName = sFont;
+         rChrSet = RTL_TEXTENCODING_SYMBOL;
+     }
+     else if ( (rNumStr.GetChar(0) < 0xE000 || rNumStr.GetChar(0) > 0xF8FF) )
+     {
+         /*
+         Ok we can't fit into a known windows unicode font, but
+         we are not in the private area, so we are a
+         standardized symbol, so turn off the symbol bit and
+         let words own font substitution kick in
+         */
+         rChrSet = RTL_TEXTENCODING_UNICODE;
+         rFontName = ::GetFontToken(rFontName, 0);
+     }
+     else
+     {
+         /*
+         Well we don't have an available substition, and we're
+         in our private area, so give up and show a standard
+         bullet symbol
+         */
+         rFontName.AssignAscii(RTL_CONSTASCII_STRINGPARAM("Wingdings"));
+         rNumStr = static_cast< sal_Unicode >(0x6C);
+      }
+ }
+ 
+ void ParagraphObj::ImplGetNumberingLevel( PPTExBulletProvider& rBuProv, sal_Int16 nNumberingDepth, sal_Bool bIsBullet, sal_Bool bGetPropStateValue )
+ {
+     ::com::sun::star::uno::Any aAny;
+     if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaLeftMargin" ) ) ) )
+     {
+         sal_Int32 nVal;
+         if ( aAny >>= nVal )
+             nTextOfs = static_cast< sal_Int16 >( nVal / ( 2540.0 / 576 ) + 0.5 ) ;
+     }
+     if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaFirstLineIndent" ) ) ) )
+     {
+         if ( aAny >>= nBulletOfs )
+             nBulletOfs = static_cast< sal_Int32 >( nBulletOfs / ( 2540.0 / 576 ) + 0.5 );
+     }
+     if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "NumberingIsNumber" ) ) ) )
+         aAny >>= bNumberingIsNumber;
+ 
+     ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexReplace > aXIndexReplace;
+ 
+     if ( bIsBullet && ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "NumberingRules" ) ), bGetPropStateValue ) )
+     {
+         if ( ( mAny >>= aXIndexReplace ) && nNumberingDepth < aXIndexReplace->getCount() )
+         {
+             mAny <<= aXIndexReplace->getByIndex( nNumberingDepth );
+             ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>
+                 aPropertySequence( *( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>*)mAny.getValue() );
+ 
+             const ::com::sun::star::beans::PropertyValue* pPropValue = aPropertySequence.getArray();
+ 
+             sal_Int32 nPropertyCount = aPropertySequence.getLength();
+             if ( nPropertyCount )
+             {
+                 bExtendedParameters = TRUE;
+                 nBulletRealSize = 100;
+                 nMappedNumType = 0;
+ 
+                 String aGraphicURL;
+                 for ( sal_Int32 i = 0; i < nPropertyCount; i++ )
+                 {
+                     const void* pValue = pPropValue[ i ].Value.getValue();
+                     if ( pValue )
+                     {
+                         ::rtl::OUString aPropName( pPropValue[ i ].Name );
+                         if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "NumberingType" ) ) )
+                             nNumberingType = *( (sal_Int16*)pValue );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Adjust" ) ) )
+                             nHorzAdjust = *( (sal_Int16*)pValue );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletChar" ) ) )
+                         {
+                             String aString( *( (String*)pValue ) );
+                             if ( aString.Len() )
+                                 cBulletId = aString.GetChar( 0 );
+                         }
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletFont" ) ) )
+                         {
+                             aFontDesc = *( (::com::sun::star::awt::FontDescriptor*)pValue );
+ 
+                             // Our numbullet dialog has set the wrong textencoding for our "StarSymbol" font,
+                             // instead of a Unicode encoding the encoding RTL_TEXTENCODING_SYMBOL was used.
+                             // Because there might exist a lot of damaged documemts I added this two lines
+                             // which fixes the bullet problem for the export.
+                             if ( aFontDesc.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ) )
+                                 aFontDesc.CharSet = RTL_TEXTENCODING_MS_1252;
+ 
+                         }
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicURL" ) ) )
+                             aGraphicURL = ( *(::rtl::OUString*)pValue );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicSize" ) ) )
+                         {
+                             if ( pPropValue[ i ].Value.getValueType() == ::getCppuType( (::com::sun::star::awt::Size*)0) )
+                             {
+                                 // don't cast awt::Size to Size as on 64-bits they are not the same.
+                                 ::com::sun::star::awt::Size aSize;
+                                 pPropValue[ i ].Value >>= aSize;
+                                 aBuGraSize.nA = aSize.Width;
+                                 aBuGraSize.nB = aSize.Height;
+                             }
+                         }
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StartWith" ) ) )
+                             nStartWith = *( (sal_Int16*)pValue );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LeftMargin" ) ) )
+                             nTextOfs = nTextOfs + static_cast< sal_Int16 >( *( (sal_Int32*)pValue ) / ( 2540.0 / 576 ) );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FirstLineOffset" ) ) )
+                             nBulletOfs += (sal_Int16)( *( (sal_Int32*)pValue ) / ( 2540.0 / 576 ) );
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletColor" ) ) )
+                         {
+                             sal_uInt32 nSOColor = *( (sal_uInt32*)pValue );
+                             nBulletColor = nSOColor & 0xff00ff00;                       // green and hibyte
+                             nBulletColor |= (sal_uInt8)( nSOColor ) << 16;              // red
+                             nBulletColor |= (sal_uInt8)( nSOColor >> 16 ) | 0xfe000000; // blue
+                         }
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BulletRelSize" ) ) )
+                         {
+                             nBulletRealSize = *( (sal_Int16*)pValue );
+                             nParaFlags |= 0x40;
+                             nBulletFlags |= 8;
+                         }
+                         else if ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Prefix" ) ) )
+                             sPrefix = ( *(::rtl::OUString*)pValue );
+                         else if  ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Suffix" ) ) )
+                             sSuffix = ( *(::rtl::OUString*)pValue );
+ #ifdef DBG_UTIL
+                         else if ( ! (
+                                 ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SymbolTextDistance" ) ) )
+                             ||  ( aPropName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Graphic" ) ) ) ) )
+                         {
+                             DBG_ERROR( "Unbekanntes Property" );
+                         }
+ #endif
+                     }
+                 }
+ 
+                 if ( aGraphicURL.Len() )
+                 {
+                     if ( aBuGraSize.Width() && aBuGraSize.Height() )
+                     {
+                         xub_StrLen nIndex = aGraphicURL.Search( (sal_Unicode)':', 0 );
+                         if ( nIndex != STRING_NOTFOUND )
+                         {
+                             nIndex++;
+                             if ( aGraphicURL.Len() > nIndex  )
+                             {
+                                 ByteString aUniqueId( aGraphicURL, nIndex, aGraphicURL.Len() - nIndex, RTL_TEXTENCODING_UTF8 );
+                                 if ( aUniqueId.Len() )
+                                 {
+                                     nBulletId = rBuProv.GetId( aUniqueId, aBuGraSize );
+                                     if ( nBulletId != 0xffff )
+                                         bExtendedBulletsUsed = TRUE;
+                                 }
+                             }
+                         }
+                     }
+                     else
+                     {
+                         nNumberingType = SVX_NUM_NUMBER_NONE;
+                     }
+                 }
+ 
+                 PortionObj* pPortion = (PortionObj*)First();
+                 CalculateGraphicBulletSize( ( pPortion ) ? pPortion->mnCharHeight : 24 );
+ 
+                 switch( (SvxExtNumType)nNumberingType )
+                 {
+                     case SVX_NUM_NUMBER_NONE : nParaFlags |= 0xf; break;
+ 
+                     case SVX_NUM_CHAR_SPECIAL :                           // Bullet
+                     {
+                         if ( aFontDesc.Name.equalsIgnoreAsciiCaseAscii("starsymbol") ||
+                             aFontDesc.Name.equalsIgnoreAsciiCaseAscii("opensymbol") )
+                         {
+                             String sFontName = aFontDesc.Name;
+                             String sNumStr = cBulletId;
+                             rtl_TextEncoding eChrSet = aFontDesc.CharSet;
+                             lcl_SubstituteBullet(sNumStr,eChrSet,sFontName);
+                             aFontDesc.Name = sFontName;
+                             cBulletId = sNumStr.GetChar( 0 );
+                             aFontDesc.CharSet = eChrSet;
+                          }
+ 
+                         if ( aFontDesc.Name.getLength() )
+                         {
+ /*
+                             if ( aFontDesc.CharSet != ::com::sun::star::awt::CharSet::SYMBOL )
+                             {
+                                 switch ( cBulletId )
+                                 {
+                                     // Currency
+                                     case 128:   cBulletId = 0x20AC; break;
+                                     // Punctuation and other
+                                     case 130:   cBulletId = 0x201A; break;// SINGLE LOW-9 QUOTATION MARK
+                                     case 131:   cBulletId = 0x0192; break;// LATIN SMALL LETTER F WITH HOOK
+                                     case 132:   cBulletId = 0x201E; break;// DOUBLE LOW-9 QUOTATION MARK
+                                                                           // LOW DOUBLE PRIME QUOTATION MARK
+                                     case 133:   cBulletId = 0x2026; break;// HORIZONTAL ELLIPSES
+                                     case 134:   cBulletId = 0x2020; break;// DAGGER
+                                     case 135:   cBulletId = 0x2021; break;// DOUBLE DAGGER
+                                     case 136:   cBulletId = 0x02C6; break;// MODIFIER LETTER CIRCUMFLEX ACCENT
+                                     case 137:   cBulletId = 0x2030; break;// PER MILLE SIGN
+                                     case 138:   cBulletId = 0x0160; break;// LATIN CAPITAL LETTER S WITH CARON
+                                     case 139:   cBulletId = 0x2039; break;// SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+                                     case 140:   cBulletId = 0x0152; break;// LATIN CAPITAL LIGATURE OE
+                                     case 142:   cBulletId = 0x017D; break;// LATIN CAPITAL LETTER Z WITH CARON
+                                     case 145:   cBulletId = 0x2018; break;// LEFT SINGLE QUOTATION MARK
+                                                                           // MODIFIER LETTER TURNED COMMA
+                                     case 146:   cBulletId = 0x2019; break;// RIGHT SINGLE QUOTATION MARK
+                                                                           // MODIFIER LETTER APOSTROPHE
+                                     case 147:   cBulletId = 0x201C; break;// LEFT DOUBLE QUOTATION MARK
+                                                                           // REVERSED DOUBLE PRIME QUOTATION MARK
+                                     case 148:   cBulletId = 0x201D; break;// RIGHT DOUBLE QUOTATION MARK
+                                                                           // REVERSED DOUBLE PRIME QUOTATION MARK
+                                     case 149:   cBulletId = 0x2022; break;// BULLET
+                                     case 150:   cBulletId = 0x2013; break;// EN DASH
+                                     case 151:   cBulletId = 0x2014; break;// EM DASH
+                                     case 152:   cBulletId = 0x02DC; break;// SMALL TILDE
+                                     case 153:   cBulletId = 0x2122; break;// TRADE MARK SIGN
+                                     case 154:   cBulletId = 0x0161; break;// LATIN SMALL LETTER S WITH CARON
+                                     case 155:   cBulletId = 0x203A; break;// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+                                     case 156:   cBulletId = 0x0153; break;// LATIN SMALL LIGATURE OE
+                                     case 158:   cBulletId = 0x017E; break;// LATIN SMALL LETTER Z WITH CARON
+                                     case 159:   cBulletId = 0x0178; break;// LATIN CAPITAL LETTER Y WITH DIAERESIS
+ //                                  case 222:   cBulletId = 0x00B6; break;// PILCROW SIGN / PARAGRAPH SIGN
+                                 }
+                             }
+ */
+                             nParaFlags |= 0x90; // wir geben den Font und den Charset vor
+                         }
+                     }
+                     case SVX_NUM_CHARS_UPPER_LETTER :       // zaehlt von a-z, aa - az, ba - bz, ...
+                     case SVX_NUM_CHARS_LOWER_LETTER :
+                     case SVX_NUM_ROMAN_UPPER :
+                     case SVX_NUM_ROMAN_LOWER :
+                     case SVX_NUM_ARABIC :
+                     case SVX_NUM_PAGEDESC :                 // Numerierung aus der Seitenvorlage
+                     case SVX_NUM_BITMAP :
+                     case SVX_NUM_CHARS_UPPER_LETTER_N :     // zaehlt von  a-z, aa-zz, aaa-zzz
+                     case SVX_NUM_CHARS_LOWER_LETTER_N :
+                     {
+                         if ( nNumberingType != SVX_NUM_CHAR_SPECIAL )
+                         {
+                             bExtendedBulletsUsed = TRUE;
+                             if ( nNumberingDepth & 1 )
+                                 cBulletId = 0x2013;         // defaulting bullet characters for ppt97
+                             else if ( nNumberingDepth == 4 )
+                                 cBulletId = 0xbb;
+                             else
+                                 cBulletId = 0x2022;
+ 
+                             switch( (SvxExtNumType)nNumberingType )
+                             {
+                                 case SVX_NUM_CHARS_UPPER_LETTER :
+                                 case SVX_NUM_CHARS_UPPER_LETTER_N :
+                                 {
+                                     if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
+                                     {
+                                         if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
+                                             nMappedNumType = 0xa0001;   // (A)
+                                         else
+                                             nMappedNumType = 0xb0001;   // A)
+                                     }
+                                     else
+                                         nMappedNumType = 0x10001;       // A.
+                                 }
+                                 break;
+                                 case SVX_NUM_CHARS_LOWER_LETTER :
+                                 case SVX_NUM_CHARS_LOWER_LETTER_N :
+                                 {
+                                     if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
+                                     {
+                                         if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
+                                             nMappedNumType = 0x80001;   // (a)
+                                         else
+                                             nMappedNumType = 0x90001;   // a)
+                                     }
+                                     else
+                                         nMappedNumType = 0x00001;       // a.
+                                 }
+                                 break;
+                                 case SVX_NUM_ROMAN_UPPER :
+                                 {
+                                     if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
+                                     {
+                                         if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
+                                             nMappedNumType = 0xe0001;   // (I)
+                                         else
+                                             nMappedNumType = 0xf0001;   // I)
+                                     }
+                                     else
+                                         nMappedNumType = 0x70001;       // I.
+                                 }
+                                 break;
+                                 case SVX_NUM_ROMAN_LOWER :
+                                 {
+                                     if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
+                                     {
+                                         if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
+                                             nMappedNumType = 0x40001;   // (i)
+                                         else
+                                             nMappedNumType = 0x50001;   // i)
+                                     }
+                                     else
+                                         nMappedNumType = 0x60001;       // i.
+                                 }
+                                 break;
+                                 case SVX_NUM_ARABIC :
+                                 {
+                                     if ( sSuffix == String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) )
+                                     {
+                                         if ( sPrefix == String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) )
+                                             nMappedNumType = 0xc0001;   // (1)
+                                         else
+                                             nMappedNumType = 0x20001;   // 1)
+                                     }
+                                     else
+                                     {
+                                         if ( ! ( sSuffix.Len() + sPrefix.Len() ) )
+                                             nMappedNumType = 0xd0001;   // 1
+                                         else
+                                             nMappedNumType = 0x30001;   // 1.
+                                     }
+                                 }
+                                 break;
+                                 default:
+                                     break;
+                             }
+                         }
+                         nParaFlags |= 0x2f;
+                         nBulletFlags |= 6;
+                         if ( mbIsBullet && bNumberingIsNumber )
+                             nBulletFlags |= 1;
+                     }
+                 }
+             }
+         }
+     }
+     nBulletOfs = nTextOfs + nBulletOfs;
+     if ( nBulletOfs < 0 )
+         nBulletOfs = 0;
+ }
+ 
+ void ParagraphObj::ImplGetParagraphValues( PPTExBulletProvider& rBuProv, sal_Bool bGetPropStateValue )
+ {
+     static String sNumberingLevel   ( RTL_CONSTASCII_USTRINGPARAM( "NumberingLevel" ) );
+ 
+     ::com::sun::star::uno::Any aAny;
+     if ( GetPropertyValue( aAny, mXPropSet, sNumberingLevel, sal_True ) )
+     {
+         if ( bGetPropStateValue )
+             meBullet = GetPropertyState( mXPropSet, sNumberingLevel );
+         nDepth = *( (sal_Int16*)aAny.getValue() );
+ 
+         if ( nDepth < 0 )
+         {
+             mbIsBullet = sal_False;
+             nDepth = 0;
+         }
+         else
+         {
+             if ( nDepth > 4 )
+                 nDepth = 4;
+             mbIsBullet = sal_True;
+         }
+     }
+     else
+     {
+         nDepth = 0;
+         mbIsBullet = sal_False;
+     }
+     ImplGetNumberingLevel( rBuProv, nDepth, mbIsBullet, bGetPropStateValue );
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaTabStops" ) ), bGetPropStateValue ) )
+         maTabStop = *( ::com::sun::star::uno::Sequence< ::com::sun::star::style::TabStop>*)mAny.getValue();
+     sal_Int16 eTextAdjust( ::com::sun::star::style::ParagraphAdjust_LEFT );
+     if ( GetPropertyValue( aAny, mXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "ParaAdjust" ) ), bGetPropStateValue ) )
+         aAny >>= eTextAdjust;
+     switch ( (::com::sun::star::style::ParagraphAdjust)eTextAdjust )
+     {
+         case ::com::sun::star::style::ParagraphAdjust_CENTER :
+             mnTextAdjust = 1;
+         break;
+         case ::com::sun::star::style::ParagraphAdjust_RIGHT :
+             mnTextAdjust = 2;
+         break;
+         case ::com::sun::star::style::ParagraphAdjust_BLOCK :
+             mnTextAdjust = 3;
+         break;
+         default :
+         case ::com::sun::star::style::ParagraphAdjust_LEFT :
+             mnTextAdjust = 0;
+         break;
+     }
+     meTextAdjust = ePropState;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaLineSpacing" ) ), bGetPropStateValue ) )
+     {
+         ::com::sun::star::style::LineSpacing aLineSpacing
+             = *( (::com::sun::star::style::LineSpacing*)mAny.getValue() );
+         switch ( aLineSpacing.Mode )
+         {
+             case ::com::sun::star::style::LineSpacingMode::MINIMUM :
+             case ::com::sun::star::style::LineSpacingMode::LEADING :
+             case ::com::sun::star::style::LineSpacingMode::FIX :
+                 mnLineSpacing = (sal_Int16)(-( aLineSpacing.Height ) );
+             break;
+ 
+             case ::com::sun::star::style::LineSpacingMode::PROP :
+             default:
+                 mnLineSpacing = (sal_Int16)( aLineSpacing.Height );
+             break;
+         }
+     }
+     meLineSpacing = ePropState;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaBottomMargin" ) ), bGetPropStateValue ) )
+     {
+         double fSpacing = *( (sal_uInt32*)mAny.getValue() ) + ( 2540.0 / 576.0 ) - 1;
+         mnLineSpacingBottom = (sal_Int16)(-( fSpacing * 576.0 / 2540.0 ) );
+     }
+     meLineSpacingBottom = ePropState;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaTopMargin" ) ), bGetPropStateValue ) )
+     {
+         double fSpacing = *( (sal_uInt32*)mAny.getValue() ) + ( 2540.0 / 576.0 ) - 1;
+         mnLineSpacingTop = (sal_Int16)(-( fSpacing * 576.0 / 2540.0 ) );
+     }
+     meLineSpacingTop = ePropState;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaIsForbiddenRules" ) ), bGetPropStateValue ) )
+         mAny >>= mbForbiddenRules;
+     meForbiddenRules = ePropState;
+ 
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "ParaIsHangingPunctuation" ) ), bGetPropStateValue ) )
+         mAny >>= mbParagraphPunctation;
+     meParagraphPunctation = ePropState;
+ 
+     mnBiDi = 0;
+     if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "WritingMode" ) ), bGetPropStateValue ) )
+     {
+         sal_Int16 nWritingMode = 0;
+         mAny >>= nWritingMode;
+ 
+         SvxFrameDirection eWritingMode( (SvxFrameDirection)nWritingMode );
+         if ( ( eWritingMode == FRMDIR_HORI_RIGHT_TOP )
+             || ( eWritingMode == FRMDIR_VERT_TOP_RIGHT ) )
+         {
+             mnBiDi = 1;
+         }
+     }
+     meBiDi = ePropState;
+ }
+ 
+ void ParagraphObj::ImplConstruct( ParagraphObj& rParagraphObj )
+ {
+     mnTextSize = rParagraphObj.mnTextSize;
+     mnTextAdjust = rParagraphObj.mnTextAdjust;
+     mnLineSpacing = rParagraphObj.mnLineSpacing;
+     mnLineSpacingTop = rParagraphObj.mnLineSpacingTop;
+     mnLineSpacingBottom = rParagraphObj.mnLineSpacingBottom;
+     mbFirstParagraph = rParagraphObj.mbFirstParagraph;
+     mbLastParagraph = rParagraphObj.mbLastParagraph;
+     mbParagraphPunctation = rParagraphObj.mbParagraphPunctation;
+     mbForbiddenRules = rParagraphObj.mbForbiddenRules;
+     mnBiDi = rParagraphObj.mnBiDi;
+ 
+     for ( void* pPtr = rParagraphObj.First(); pPtr; pPtr = rParagraphObj.Next() )
+         Insert( new PortionObj( *(PortionObj*)pPtr ), LIST_APPEND );
+ 
+     maTabStop = rParagraphObj.maTabStop;
+     bExtendedParameters = rParagraphObj.bExtendedParameters;
+     nParaFlags = rParagraphObj.nParaFlags;
+     nBulletFlags = rParagraphObj.nBulletFlags;
+     sPrefix = rParagraphObj.sPrefix;
+     sSuffix = rParagraphObj.sSuffix;
+     sGraphicUrl = rParagraphObj.sGraphicUrl;            // String auf eine Graphic
+     aBuGraSize = rParagraphObj.aBuGraSize;
+     nNumberingType = rParagraphObj.nNumberingType;      // in wirlichkeit ist dies ein SvxEnum
+     nHorzAdjust = rParagraphObj.nHorzAdjust;
+     nBulletColor = rParagraphObj.nBulletColor;
+     nBulletOfs = rParagraphObj.nBulletOfs;
+     nStartWith = rParagraphObj.nStartWith;              // Start der nummerierung
+     nTextOfs = rParagraphObj.nTextOfs;
+     nBulletRealSize = rParagraphObj.nBulletRealSize;    // GroessenVerhaeltnis in Proz
+     nDepth = rParagraphObj.nDepth;                      // aktuelle tiefe
+     cBulletId = rParagraphObj.cBulletId;                // wenn Numbering Type == CharSpecial
+     aFontDesc = rParagraphObj.aFontDesc;
+ 
+     bExtendedBulletsUsed = rParagraphObj.bExtendedBulletsUsed;
+     nBulletId = rParagraphObj.nBulletId;
+ }
+ 
+ ::com::sun::star::awt::Size ParagraphObj::ImplMapSize( const ::com::sun::star::awt::Size& rSize )
+ {
+     Size aSize( OutputDevice::LogicToLogic( Size( rSize.Width, rSize.Height ), maMapModeSrc, maMapModeDest ) );
+     if ( !aSize.Width() )
+         aSize.Width()++;
+     if ( !aSize.Height() )
+         aSize.Height()++;
+     return ::com::sun::star::awt::Size( aSize.Width(), aSize.Height() );
+ }
+ 
+ sal_uInt32 ParagraphObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
+ {
+     mnTextSize = 0;
+     for ( void* pPtr = First(); pPtr; pPtr = Next() )
+         mnTextSize += ((PortionObj*)pPtr)->ImplCalculateTextPositions( nCurrentTextPosition + mnTextSize );
+     return mnTextSize;
+ }
+ 
+ ParagraphObj& ParagraphObj::operator=( ParagraphObj& rParagraphObj )
+ {
+     if ( this != &rParagraphObj )
+     {
+         ImplClear();
+         ImplConstruct( rParagraphObj );
+     }
+     return *this;
+ }
+ 
+ ImplTextObj::ImplTextObj( int nInstance )
+ {
+     mnRefCount = 1;
+     mnTextSize = 0;
+     mnInstance = nInstance;
+     mpList = new List;
+     mbHasExtendedBullets = FALSE;
+     mbFixedCellHeightUsed = FALSE;
+ }
+ 
+ ImplTextObj::~ImplTextObj()
+ {
+     for ( ParagraphObj* pPtr = (ParagraphObj*)mpList->First(); pPtr; pPtr = (ParagraphObj*)mpList->Next() )
+         delete pPtr;
+     delete mpList;
+ }
+ 
+ TextObj::TextObj( ::com::sun::star::uno::Reference< ::com::sun::star::text::XSimpleText > & rXTextRef,
+             int nInstance, FontCollection& rFontCollection, PPTExBulletProvider& rProv )
+ {
+     mpImplTextObj = new ImplTextObj( nInstance );
+ 
+     ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumerationAccess >
+         aXTextParagraphEA( rXTextRef, ::com::sun::star::uno::UNO_QUERY );
+ 
+     if ( aXTextParagraphEA.is()  )
+     {
+         ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration >
+             aXTextParagraphE( aXTextParagraphEA->createEnumeration() );
+         if ( aXTextParagraphE.is() )
+         {
+             ParaFlags aParaFlags;
+             while ( aXTextParagraphE->hasMoreElements() )
+             {
+                 ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > aXParagraph;
+                 ::com::sun::star::uno::Any aAny( aXTextParagraphE->nextElement() );
+                 if ( aAny >>= aXParagraph )
+                 {
+                     if ( !aXTextParagraphE->hasMoreElements() )
+                         aParaFlags.bLastParagraph = TRUE;
+                     ParagraphObj* pPara = new ParagraphObj( aXParagraph, aParaFlags, rFontCollection, rProv );
+                     mpImplTextObj->mbHasExtendedBullets |= pPara->bExtendedBulletsUsed;
+                     mpImplTextObj->mpList->Insert( pPara, LIST_APPEND );
+                     aParaFlags.bFirstParagraph = FALSE;
+                 }
+             }
+         }
+     }
+     ImplCalculateTextPositions();
+ }
+ 
+ TextObj::TextObj( TextObj& rTextObj )
+ {
+     mpImplTextObj = rTextObj.mpImplTextObj;
+     mpImplTextObj->mnRefCount++;
+ }
+ 
+ TextObj::~TextObj()
+ {
+     if ( ! ( --mpImplTextObj->mnRefCount ) )
+         delete mpImplTextObj;
+ }
+ 
+ void TextObj::Write( SvStream* pStrm )
+ {
+     sal_uInt32 nSize, nPos = pStrm->Tell();
+     *pStrm << (sal_uInt32)( EPP_TextCharsAtom << 16 ) << (sal_uInt32)0;
+     for ( void* pPtr = First(); pPtr; pPtr = Next() )
+         ((ParagraphObj*)pPtr)->Write( pStrm );
+     nSize = pStrm->Tell() - nPos;
+     pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
+     *pStrm << (sal_uInt32)( nSize - 8 );
+     pStrm->SeekRel( nSize - 8 );
+ }
+ 
+ void TextObj::ImplCalculateTextPositions()
+ {
+     mpImplTextObj->mnTextSize = 0;
+     for ( void* pPtr = First(); pPtr; pPtr = Next() )
+         mpImplTextObj->mnTextSize += ((ParagraphObj*)pPtr)->ImplCalculateTextPositions( mpImplTextObj->mnTextSize );
+ }
+ 
+ TextObj& TextObj::operator=( TextObj& rTextObj )
+ {
+     if ( this != &rTextObj )
+     {
+         if ( ! ( --mpImplTextObj->mnRefCount ) )
+             delete mpImplTextObj;
+         mpImplTextObj = rTextObj.mpImplTextObj;
+         mpImplTextObj->mnRefCount++;
+     }
+     return *this;
+ }
+ 
+ FontCollectionEntry::~FontCollectionEntry()
+ {
+ }
+ 
+ void FontCollectionEntry::ImplInit( const String& rName )
+ {
+     String aSubstName( GetSubsFontName( rName, SUBSFONT_ONLYONE | SUBSFONT_MS ) );
+     if ( aSubstName.Len() )
+     {
+         Name = aSubstName;
+         bIsConverted = sal_True;
+     }
+     else
+     {
+         Name = rName;
+         bIsConverted = sal_False;
+     }
+ }
+ 
+ FontCollection::~FontCollection()
+ {
+     for( void* pStr = List::First(); pStr; pStr = List::Next() )
+         delete (FontCollectionEntry*)pStr;
+     delete pVDev;
+     xPPTBreakIter = NULL;
+     xScriptTypeDetector = NULL;
+ }
+ 
+ FontCollection::FontCollection() :
+     pVDev ( NULL )
+ {
+     com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >
+         xMSF = ::comphelper::getProcessServiceFactory();
+     com::sun::star::uno::Reference< com::sun::star::uno::XInterface >
 -        xInterface = xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) );
++        xInterface = xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.i18n.BreakIterator" ) ) );
+     if ( xInterface.is() )
+         xPPTBreakIter = com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator >
+             ( xInterface, com::sun::star::uno::UNO_QUERY );
+ 
 -    xInterface = xMSF->createInstance( rtl::OUString::createFromAscii( "com.sun.star.i18n.ScriptTypeDetector" ) );
++    xInterface = xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.i18n.ScriptTypeDetector" ) ) );
+     if ( xInterface.is() )
+         xScriptTypeDetector = com::sun::star::uno::Reference< com::sun::star::i18n::XScriptTypeDetector >
+             ( xInterface, com::sun::star::uno::UNO_QUERY );
+ }
+ 
+ short FontCollection::GetScriptDirection( const String& rString ) const
+ {
+     short nRet = com::sun::star::i18n::ScriptDirection::NEUTRAL;
+     if ( xScriptTypeDetector.is() )
+     {
+         const rtl::OUString sT( rString );
+         nRet = xScriptTypeDetector->getScriptDirection( sT, 0, com::sun::star::i18n::ScriptDirection::NEUTRAL );
+     }
+     return nRet;
+ }
+ 
+ sal_uInt32 FontCollection::GetId( FontCollectionEntry& rEntry )
+ {
+     if( rEntry.Name.Len() )
+     {
+         const sal_uInt32 nFonts = GetCount();
+ 
+         for( sal_uInt32 i = 0; i < nFonts; i++ )
+         {
+             const FontCollectionEntry* pEntry = GetById( i );
+             if( pEntry->Name == rEntry.Name )
+                 return i;
+         }
+         Font aFont;
+         aFont.SetCharSet( rEntry.CharSet );
+         aFont.SetName( rEntry.Original );
+ //      aFont.SetFamily( rEntry.Family );
+ //      aFont.SetPitch( rEntry.Pitch );
+         aFont.SetHeight( 100 );
+ 
+         if ( !pVDev )
+             pVDev = new VirtualDevice;
+ 
+         pVDev->SetFont( aFont );
+         FontMetric aMetric( pVDev->GetFontMetric() );
+ 
+         sal_uInt16 nTxtHeight = (sal_uInt16)aMetric.GetAscent() + (sal_uInt16)aMetric.GetDescent();
+ 
+         if ( nTxtHeight )
+         {
+             double fScaling = (double)nTxtHeight / 120.0;
+             if ( ( fScaling > 0.50 ) && ( fScaling < 1.5 ) )
+                 rEntry.Scaling = fScaling;
+         }
+ 
+         List::Insert( new FontCollectionEntry( rEntry ), LIST_APPEND );
+         return nFonts;
+     }
+     return 0;
+ }
+ 
+ const FontCollectionEntry* FontCollection::GetById( sal_uInt32 nId )
+ {
+     return (FontCollectionEntry*)List::GetObject( nId );
+ }
+ 
+ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 861472af9fc2d845e41a27596599d2652576bb8e
Merge: de66f91... 88950a5...
Author: Tor Lillqvist <tml at hemulen.(none)>
Date:   Fri Nov 12 15:07:29 2010 +0200

    Merge branch 'feature/pptx-export-ooxml11' into libreoffice-3-3

commit 88950a576e2fc11bf5245f0c8fd1c2d41dd8fcf8
Author: Tor Lillqvist <tlillqvist at novell.com>
Date:   Mon Nov 8 00:33:34 2010 +0200

    Dubious fix for compilation error

diff --git a/sd/source/filter/eppt/epptooxml.hxx b/sd/source/filter/eppt/epptooxml.hxx
index a582bc6..75f9f1c 100644
--- a/sd/source/filter/eppt/epptooxml.hxx
+++ b/sd/source/filter/eppt/epptooxml.hxx
@@ -85,7 +85,7 @@ public:
     virtual oox::vml::Drawing* getVmlDrawing() { return NULL; }
     virtual const oox::drawingml::Theme* getCurrentTheme() const { return NULL; }
     virtual const oox::drawingml::table::TableStyleListPtr getTableStyles() { return oox::drawingml::table::TableStyleListPtr(); }
-    virtual oox::drawingml::chart::ChartConverter* getChartConverter() { return NULL; }
+    virtual oox::drawingml::chart::ChartConverter& getChartConverter() { static oox::drawingml::chart::ChartConverter aConverter; return aConverter; }
 
     static const char* GetSideDirection( sal_uInt8 nDirection );
     static const char* GetCornerDirection( sal_uInt8 nDirection );
commit 3f27992732f0c4e02813a140b486835c3c2c5357
Author: Tor Lillqvist <tlillqvist at novell.com>
Date:   Mon Nov 8 00:21:21 2010 +0200

    Link with OOXLIB and SAXLIB

diff --git a/sd/util/makefile.mk b/sd/util/makefile.mk
index 2e5ba39..b0140f4 100755
--- a/sd/util/makefile.mk
+++ b/sd/util/makefile.mk
@@ -252,7 +252,9 @@ DEF5NAME=$(SHL5TARGET)
 SHL5STDLIBS = $(ISDLIB) \
               $(EDITENGLIB)       \
               $(SVXCORELIB)       \
-              $(MSFILTERLIB)   \
+              $(MSFILTERLIB)      \
+              $(OOXLIB)           \
+              $(SAXLIB)           \
               $(SFX2LIB)          \
               $(SVTOOLLIB)        \
               $(SOTLIB)           \
commit 903d899c6e66bc04601223de3b007061f9acc406
Author: Tor Lillqvist <tlillqvist at novell.com>
Date:   Fri Nov 5 23:49:45 2010 +0200

    Add new files

diff --git a/sd/source/filter/eppt/pptx-grouptable.cxx b/sd/source/filter/eppt/pptx-grouptable.cxx
new file mode 100644
index 0000000..fed63ac
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-grouptable.cxx
@@ -0,0 +1,142 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "grouptable.hxx"
+
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::container::XIndexAccess;
+
+GroupTable::GroupTable() :
+    mnCurrentGroupEntry ( 0 ),
+    mnMaxGroupEntry     ( 0 ),
+    mnGroupsClosed      ( 0 ),
+    mpGroupEntry        ( NULL )
+{
+    ImplResizeGroupTable( 32 );
+}
+
+// ---------------------------------------------------------------------------------------------
+
+GroupTable::~GroupTable()
+{
+    for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; delete mpGroupEntry[ i++ ] ) ;
+    delete[] mpGroupEntry;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+void GroupTable::ImplResizeGroupTable( sal_uInt32 nEntrys )
+{
+    if ( nEntrys > mnMaxGroupEntry )
+    {
+        mnMaxGroupEntry         = nEntrys;
+        GroupEntry** pTemp = new GroupEntry*[ nEntrys ];
+        for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; i++ )
+            pTemp[ i ] = mpGroupEntry[ i ];
+        if ( mpGroupEntry )
+            delete[] mpGroupEntry;
+        mpGroupEntry = pTemp;
+    }
+}
+
+// ---------------------------------------------------------------------------------------------
+
+sal_Bool GroupTable::EnterGroup( ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >& rXIndexAccessRef )
+{
+    sal_Bool bRet = sal_False;
+    if ( rXIndexAccessRef.is() )
+    {
+        GroupEntry* pNewGroup = new GroupEntry( rXIndexAccessRef );
+        if ( pNewGroup->mnCount )
+        {
+            if ( mnMaxGroupEntry == mnCurrentGroupEntry )
+                ImplResizeGroupTable( mnMaxGroupEntry + 8 );
+            mpGroupEntry[ mnCurrentGroupEntry++ ] = pNewGroup;
+            bRet = sal_True;
+        }
+        else
+            delete pNewGroup;
+    }
+    return bRet;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+sal_uInt32 GroupTable::GetGroupsClosed()
+{
+    sal_uInt32 nRet = mnGroupsClosed;
+    mnGroupsClosed = 0;
+    return nRet;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+void GroupTable::ClearGroupTable()
+{
+    for ( sal_uInt32 i = 0; i < mnCurrentGroupEntry; i++, delete mpGroupEntry[ i ] ) ;
+    mnCurrentGroupEntry = 0;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+void GroupTable::ResetGroupTable( sal_uInt32 nCount )
+{
+    ClearGroupTable();
+    mpGroupEntry[ mnCurrentGroupEntry++ ] = new GroupEntry( nCount );
+}
+
+// ---------------------------------------------------------------------------------------------
+
+sal_Bool GroupTable::GetNextGroupEntry()
+{
+    while ( mnCurrentGroupEntry )
+    {
+        mnIndex = mpGroupEntry[ mnCurrentGroupEntry - 1 ]->mnCurrentPos++;
+
+        if ( mpGroupEntry[ mnCurrentGroupEntry - 1 ]->mnCount > mnIndex )
+            return sal_True;
+
+        delete ( mpGroupEntry[ --mnCurrentGroupEntry ] );
+
+        if ( mnCurrentGroupEntry )
+            mnGroupsClosed++;
+    }
+    return sal_False;
+}
+
+// ---------------------------------------------------------------------------------------------
+
+void GroupTable::SkipCurrentGroup()
+{
+    if ( mnCurrentGroupEntry )
+        delete ( mpGroupEntry[ --mnCurrentGroupEntry ] );
+}
+
+// ---------------------------------------------------------------------------------------------
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-stylesheet.cxx b/sd/source/filter/eppt/pptx-stylesheet.cxx
new file mode 100644
index 0000000..76ac156
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-stylesheet.cxx
@@ -0,0 +1,514 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <epptbase.hxx>
+#include <epptdef.hxx>
+#include <text.hxx>
+#include <tools/color.hxx>
+#include <editeng/svxenum.hxx>
+
+using namespace ::com::sun::star;
+
+PPTExCharSheet::PPTExCharSheet( int nInstance )
+{
+    sal_uInt16 nFontHeight = 24;
+
+    for ( int nDepth = 0; nDepth < 5; nDepth++ )
+    {
+        PPTExCharLevel& rLev = maCharLevel[ nDepth ];
+        switch ( nInstance )
+        {
+            case EPP_TEXTTYPE_Title :
+            case EPP_TEXTTYPE_CenterTitle :
+                nFontHeight = 44;
+            break;
+            case EPP_TEXTTYPE_Body :
+            case EPP_TEXTTYPE_CenterBody :
+            case EPP_TEXTTYPE_HalfBody :
+            case EPP_TEXTTYPE_QuarterBody :
+            {
+                switch ( nDepth )
+                {
+                    case 0 : nFontHeight = 32; break;
+                    case 1 : nFontHeight = 28; break;
+                    case 2 : nFontHeight = 24; break;
+                    default :nFontHeight = 20; break;
+                }
+            }
+            break;
+            case EPP_TEXTTYPE_Notes :
+                nFontHeight = 12;
+            break;
+            case EPP_TEXTTYPE_notUsed :
+            case EPP_TEXTTYPE_Other :
+                nFontHeight = 24;
+            break;
+        }
+        rLev.mnFlags = 0;
+        rLev.mnFont = 0;
+        rLev.mnAsianOrComplexFont = 0xffff;
+        rLev.mnFontHeight = nFontHeight;
+        rLev.mnFontColor = 0;
+        rLev.mnEscapement = 0;
+    }
+}
+
+
+void PPTExCharSheet::SetStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
+                                    FontCollection& rFontCollection, int nLevel )
+{
+    PortionObj  aPortionObj( rXPropSet, rFontCollection );
+
+    PPTExCharLevel& rLev = maCharLevel[ nLevel ];
+
+    if ( aPortionObj.meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnFontColor = aPortionObj.mnCharColor;
+    if ( aPortionObj.meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnEscapement = aPortionObj.mnCharEscapement;
+    if ( aPortionObj.meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnFontHeight = aPortionObj.mnCharHeight;
+    if ( aPortionObj.meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnFont = aPortionObj.mnFont;
+    if ( aPortionObj.meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnAsianOrComplexFont = aPortionObj.mnAsianOrComplexFont;
+    rLev.mnFlags = aPortionObj.mnCharAttr;
+}
+
+void PPTExCharSheet::Write( SvStream& rSt, PptEscherEx*, sal_uInt16 nLev, sal_Bool, sal_Bool bSimpleText,
+    const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPagePropSet )
+{
+    const PPTExCharLevel& rLev = maCharLevel[ nLev ];
+
+    sal_uInt32 nCharFlags = 0xefffff;
+    if ( bSimpleText )
+        nCharFlags = 0x7ffff;
+
+    rSt << nCharFlags
+        << rLev.mnFlags
+        << rLev.mnFont;
+
+    sal_uInt32 nFontColor = rLev.mnFontColor;
+    if ( nFontColor == COL_AUTO )
+    {
+        sal_Bool bIsDark = sal_False;
+        ::com::sun::star::uno::Any aAny;
+        if ( PropValue::GetPropertyValue( aAny, rPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsBackgroundDark" ) ), sal_True ) )
+            aAny >>= bIsDark;
+        nFontColor = bIsDark ? 0xffffff : 0x000000;
+    }
+    nFontColor &= 0xffffff;
+    nFontColor |= 0xfe000000;
+    if ( bSimpleText )
+    {
+        rSt << rLev.mnFontHeight
+            << nFontColor;
+    }
+    else
+    {
+        rSt << rLev.mnAsianOrComplexFont
+            << (sal_uInt16)0xffff       // unbekannt
+            << (sal_uInt16)0xffff       // unbekannt
+            << rLev.mnFontHeight
+            << nFontColor
+            << rLev.mnEscapement;
+    }
+}
+
+PPTExParaSheet::PPTExParaSheet( int nInstance, sal_uInt16 nDefaultTab, PPTExBulletProvider& rProv ) :
+    rBuProv     ( rProv ),
+    mnInstance  ( nInstance )
+{
+    sal_Bool bHasBullet = FALSE;
+
+    sal_uInt16 nUpperDist = 0;
+    sal_uInt16 nBulletChar = 0x2022;
+    sal_uInt16 nBulletOfs = 0;
+    sal_uInt16 nTextOfs = 0;
+
+    for ( int nDepth = 0; nDepth < 5; nDepth++ )
+    {
+        PPTExParaLevel& rLev = maParaLevel[ nDepth ];
+        switch ( nInstance )
+        {
+            case EPP_TEXTTYPE_Title :
+            case EPP_TEXTTYPE_CenterTitle :
+            break;
+            case EPP_TEXTTYPE_Body :
+            case EPP_TEXTTYPE_CenterBody :
+            case EPP_TEXTTYPE_HalfBody :
+            case EPP_TEXTTYPE_QuarterBody :
+            {
+                bHasBullet = TRUE;
+                nUpperDist = 0x14;
+            }
+            break;
+            case EPP_TEXTTYPE_Notes :
+                nUpperDist = 0x1e;
+            break;
+
+//          default :
+//          case EPP_TEXTTYPE_notUsed :
+//          case EPP_TEXTTYPE_Other :
+//          break;
+        }
+        switch ( nDepth )
+        {
+            case 0 :
+            {
+                nBulletChar = 0x2022;
+                nBulletOfs = 0;
+                nTextOfs = ( bHasBullet ) ? 0xd8 : 0;
+            }
+            break;
+            case 1 :
+            {
+                nBulletChar = 0x2013;
+                nBulletOfs = 0x120;
+                nTextOfs = 0x1d4;
+            }
+            break;
+            case 2 :
+            {
+                nBulletChar = 0x2022;
+                nBulletOfs = 0x240;
+                nTextOfs = 0x2d0;
+            }
+            break;
+            case 3 :
+            {
+                nBulletChar = 0x2013;
+                nBulletOfs = 0x360;
+                nTextOfs = 0x3f0;
+            }
+            break;
+            case 4 :
+            {
+                nBulletChar = 0xbb;
+                nBulletOfs = 0x480;
+                nTextOfs = 0x510;
+            }
+            break;
+        }
+        rLev.mbIsBullet = bHasBullet;
+        rLev.mnBulletChar = nBulletChar;
+        rLev.mnBulletFont = 0;
+        rLev.mnBulletHeight = 100;
+        rLev.mnBulletColor = 0;
+        rLev.mnAdjust = 0;
+        rLev.mnLineFeed = 100;
+        rLev.mnLowerDist = 0;
+        rLev.mnUpperDist = nUpperDist;
+        rLev.mnTextOfs = nTextOfs;
+        rLev.mnBulletOfs = nBulletOfs;
+        rLev.mnDefaultTab = nDefaultTab;
+        rLev.mnAsianSettings = 2;
+        rLev.mnBiDi = 0;
+
+        rLev.mbExtendedBulletsUsed = FALSE;
+        rLev.mnBulletId = 0xffff;
+        rLev.mnBulletStart = 0;
+        rLev.mnMappedNumType = 0;
+        rLev.mnNumberingType = 0;
+    }
+}
+
+void PPTExParaSheet::SetStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
+                                        FontCollection& rFontCollection, int nLevel, const PPTExCharLevel& rCharLevel )
+{
+    ParagraphObj aParagraphObj( rXPropSet, rBuProv );
+    aParagraphObj.CalculateGraphicBulletSize( rCharLevel.mnFontHeight );
+    PPTExParaLevel& rLev = maParaLevel[ nLevel ];
+
+    if ( aParagraphObj.meTextAdjust == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnAdjust = aParagraphObj.mnTextAdjust;
+    if ( aParagraphObj.meLineSpacing == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+    {
+        sal_Int16 nLineSpacing = aParagraphObj.mnLineSpacing;
+        if ( nLineSpacing > 0 ) // if nLinespacing is < 0 the linespacing is an absolute spacing
+        {
+            sal_Bool bFixedLineSpacing = sal_False;
+            uno::Any aAny = rXPropSet->getPropertyValue( ::rtl::OUString(
+                                                             RTL_CONSTASCII_USTRINGPARAM(
+                                                                 "FontIndependentLineSpacing" ) ) );
+            if( !(aAny >>= bFixedLineSpacing) || !bFixedLineSpacing )
+            {
+                const FontCollectionEntry* pDesc = rFontCollection.GetById( rCharLevel.mnFont );
+                if ( pDesc )
+                    nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
+            }
+        }
+        else
+        {
+            if ( rCharLevel.mnFontHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
+            {
+                const FontCollectionEntry* pDesc = rFontCollection.GetById( rCharLevel.mnFont );
+                if ( pDesc )
+                     nLineSpacing = (sal_Int16)( (double)100.0 * pDesc->Scaling + 0.5 );
+                else
+                    nLineSpacing = 100;
+            }
+            else
+                nLineSpacing = (sal_Int16)( (double)nLineSpacing / 4.40972 );
+        }
+        rLev.mnLineFeed = nLineSpacing;
+    }
+    if ( aParagraphObj.meLineSpacingBottom == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnLowerDist = aParagraphObj.mnLineSpacingBottom;
+    if ( aParagraphObj.meLineSpacingTop == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnUpperDist = aParagraphObj.mnLineSpacingTop;
+    if ( aParagraphObj.meForbiddenRules == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+    {
+        rLev.mnAsianSettings &=~1;
+        if ( aParagraphObj.mbForbiddenRules )
+            rLev.mnAsianSettings |= 1;
+    }
+    if ( aParagraphObj.meParagraphPunctation == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+    {
+        rLev.mnAsianSettings &=~4;
+        if ( aParagraphObj.mbParagraphPunctation )
+            rLev.mnAsianSettings |= 4;
+    }
+
+    if ( aParagraphObj.meBiDi == ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+        rLev.mnBiDi = aParagraphObj.mnBiDi;
+
+    rLev.mbIsBullet = aParagraphObj.mbIsBullet; //( ( aParagraphObj.nBulletFlags & 1 ) != 0 );
+
+    if ( !nLevel )
+    {
+        if ( ( aParagraphObj.meBullet ==  ::com::sun::star::beans::PropertyState_DIRECT_VALUE )
+                    && aParagraphObj.bExtendedParameters )
+        {
+            for ( sal_Int16 i = 0; i < 5; i++ )
+            {
+                PPTExParaLevel& rLevel = maParaLevel[ i ];
+                if ( i )
+                    aParagraphObj.ImplGetNumberingLevel( rBuProv, i, FALSE );
+//              rLevel.mbIsBullet = ( ( aParagraphObj.nBulletFlags & 1 ) != 0 );
+                rLevel.mnTextOfs = aParagraphObj.nTextOfs;
+                rLevel.mnBulletOfs = (sal_uInt16)aParagraphObj.nBulletOfs;
+                rLevel.mnBulletChar = aParagraphObj.cBulletId;
+                FontCollectionEntry aFontDescEntry( aParagraphObj.aFontDesc.Name, aParagraphObj.aFontDesc.Family,
+                                                        aParagraphObj.aFontDesc.Pitch, aParagraphObj.aFontDesc.CharSet );
+                rLevel.mnBulletFont = (sal_uInt16)rFontCollection.GetId( aFontDescEntry );
+                rLevel.mnBulletHeight = aParagraphObj.nBulletRealSize;
+                rLevel.mnBulletColor = aParagraphObj.nBulletColor;
+
+                rLevel.mbExtendedBulletsUsed = aParagraphObj.bExtendedBulletsUsed;
+                rLevel.mnBulletId = aParagraphObj.nBulletId;
+                rLevel.mnNumberingType = aParagraphObj.nNumberingType;
+                rLevel.mnBulletStart = aParagraphObj.nStartWith;
+                rLevel.mnMappedNumType = aParagraphObj.nMappedNumType;
+            }
+        }
+    }
+}
+
+void PPTExParaSheet::Write( SvStream& rSt, PptEscherEx*, sal_uInt16 nLev, sal_Bool, sal_Bool bSimpleText,
+    const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPagePropSet )
+{
+    const PPTExParaLevel& rLev = maParaLevel[ nLev ];
+
+    if ( maParaLevel[ 0 ].mbExtendedBulletsUsed || maParaLevel[ 1 ].mbExtendedBulletsUsed ||
+            maParaLevel[ 2 ].mbExtendedBulletsUsed || maParaLevel[ 3 ].mbExtendedBulletsUsed ||
+                maParaLevel[ 4 ].mbExtendedBulletsUsed )
+    {
+        SvStream& rOut = rBuProv.aBuExMasterStream;
+        if ( !nLev )
+        {
+            rOut << (sal_uInt32)( ( EPP_PST_ExtendedParagraphMasterAtom << 16 ) | ( mnInstance << 4 ) )
+                 << (sal_uInt32)( 5 * 16 + 2 )
+                 << (sal_uInt16)5;              // depth
+        }
+        sal_uInt16 nBulletId = rLev.mnBulletId;
+        if ( rLev.mnNumberingType != SVX_NUM_BITMAP )
+            nBulletId = 0xffff;
+        rOut << (sal_uInt32)0x03800000
+             << (sal_uInt16)nBulletId
+             << (sal_uInt32)rLev.mnMappedNumType
+             << (sal_uInt16)rLev.mnBulletStart
+             << (sal_uInt32)0;
+    }
+
+    sal_uInt32 nParaFlags = 0x3ffdff;
+    sal_uInt16 nBulletFlags = ( rLev.mbIsBullet ) ? 0xf : 0xe;
+
+    if ( nLev )
+        nParaFlags &= 0x207fff;
+    if ( bSimpleText )
+        nParaFlags &= 0x7fff;
+    sal_uInt32 nBulletColor = rLev.mnBulletColor;
+    if ( nBulletColor == COL_AUTO )
+    {
+        sal_Bool bIsDark = sal_False;
+        ::com::sun::star::uno::Any aAny;
+        if ( PropValue::GetPropertyValue( aAny, rPagePropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsBackgroundDark" ) ), sal_True ) )
+            aAny >>= bIsDark;
+        nBulletColor = bIsDark ? 0xffffff : 0x000000;
+    }
+    nBulletColor &= 0xffffff;
+    nBulletColor |= 0xfe000000;
+    rSt << nParaFlags
+        << nBulletFlags
+        << rLev.mnBulletChar
+        << rLev.mnBulletFont
+        << rLev.mnBulletHeight
+        << nBulletColor
+        << rLev.mnAdjust
+        << rLev.mnLineFeed
+        << rLev.mnUpperDist
+        << rLev.mnLowerDist
+        << rLev.mnTextOfs
+        << rLev.mnBulletOfs;
+
+    if ( bSimpleText || nLev )
+    {
+        if ( nParaFlags & 0x200000 )
+            rSt << rLev.mnBiDi;
+    }
+    else
+    {
+        rSt << rLev.mnDefaultTab
+            << (sal_uInt16)0
+            << (sal_uInt16)0
+            << rLev.mnAsianSettings
+            << rLev.mnBiDi;
+    }
+}
+
+
+PPTExStyleSheet::PPTExStyleSheet( sal_uInt16 nDefaultTab, PPTExBulletProvider& rBuProv )
+{
+    for ( int nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
+    {
+        mpParaSheet[ nInstance ] = ( nInstance == EPP_TEXTTYPE_notUsed ) ? NULL : new PPTExParaSheet( nInstance, nDefaultTab, rBuProv );
+        mpCharSheet[ nInstance ] = ( nInstance == EPP_TEXTTYPE_notUsed ) ? NULL : new PPTExCharSheet( nInstance );
+    }
+}
+
+PPTExStyleSheet::~PPTExStyleSheet()
+{
+    for ( int nInstance = EPP_TEXTTYPE_Title; nInstance <= EPP_TEXTTYPE_QuarterBody; nInstance++ )
+    {
+        if ( nInstance == EPP_TEXTTYPE_notUsed )
+            continue;
+
+        delete mpParaSheet[ nInstance ];
+        delete mpCharSheet[ nInstance ];
+    }
+}
+
+void PPTExStyleSheet::SetStyleSheet( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
+                                        FontCollection& rFontCollection, int nInstance, int nLevel )
+{
+    if ( nInstance == EPP_TEXTTYPE_notUsed )
+        return;
+    mpCharSheet[ nInstance ]->SetStyleSheet( rXPropSet, rFontCollection, nLevel );
+    mpParaSheet[ nInstance ]->SetStyleSheet( rXPropSet, rFontCollection, nLevel, mpCharSheet[ nInstance ]->maCharLevel[ nLevel ] );
+}
+
+sal_Bool PPTExStyleSheet::IsHardAttribute( sal_uInt32 nInstance, sal_uInt32 nLevel, PPTExTextAttr eAttr, sal_uInt32 nValue )
+{
+    const PPTExParaLevel& rPara = mpParaSheet[ nInstance ]->maParaLevel[ nLevel ];
+    const PPTExCharLevel& rChar = mpCharSheet[ nInstance ]->maCharLevel[ nLevel ];
+
+    sal_uInt32 nFlag = 0;
+
+    switch ( eAttr )
+    {
+        case ParaAttr_BulletOn : return ( rPara.mbIsBullet ) ? ( nValue ) ? FALSE : TRUE : ( nValue ) ? TRUE : FALSE;
+        case ParaAttr_BuHardFont :
+        case ParaAttr_BulletFont : return ( rPara.mnBulletFont != nValue );
+        case ParaAttr_BuHardColor :
+        case ParaAttr_BulletColor : return ( rPara.mnBulletColor != nValue );
+        case ParaAttr_BuHardHeight :
+        case ParaAttr_BulletHeight : return ( rPara.mnBulletHeight != nValue );
+        case ParaAttr_BulletChar : return ( rPara.mnBulletChar != nValue );
+        case ParaAttr_Adjust : return ( rPara.mnAdjust != nValue );
+        case ParaAttr_LineFeed : return ( rPara.mnLineFeed != nValue );
+        case ParaAttr_UpperDist : return ( rPara.mnUpperDist != nValue );
+        case ParaAttr_LowerDist : return ( rPara.mnLowerDist != nValue );
+        case ParaAttr_TextOfs : return ( rPara.mnTextOfs != nValue );
+        case ParaAttr_BulletOfs : return ( rPara.mnBulletOfs != nValue );
+        case ParaAttr_DefaultTab : return ( rPara.mnDefaultTab != nValue );
+        case ParaAttr_BiDi : return ( rPara.mnBiDi != nValue );
+        case CharAttr_Bold : nFlag = 1; break;
+        case CharAttr_Italic : nFlag = 2; break;
+        case CharAttr_Underline : nFlag = 4; break;
+        case CharAttr_Shadow : nFlag = 16; break;
+        case CharAttr_Strikeout : nFlag = 256; break;
+        case CharAttr_Embossed : nFlag = 512; break;
+        case CharAttr_Font : return ( rChar.mnFont != nValue );
+        case CharAttr_AsianOrComplexFont : return ( rChar.mnAsianOrComplexFont != nValue );
+        case CharAttr_Symbol : return TRUE;
+        case CharAttr_FontHeight : return ( rChar.mnFontHeight != nValue );
+        case CharAttr_FontColor : return ( rChar.mnFontColor != nValue );
+        case CharAttr_Escapement : return ( rChar.mnEscapement != nValue );
+        default:
+            break;
+    };
+    if ( nFlag )
+    {
+        if ( rChar.mnFlags & nFlag )
+            return ( ( nValue & nFlag ) == 0 );
+        else
+            return ( ( nValue & nFlag ) != 0 );
+    }
+    return TRUE;
+}
+
+sal_uInt32 PPTExStyleSheet::SizeOfTxCFStyleAtom() const
+{
+    return 24;
+}
+
+// the TxCFStyleAtom stores the text properties that are used
+// when creating new objects in PowerPoint.
+
+void PPTExStyleSheet::WriteTxCFStyleAtom( SvStream& rSt )
+{
+    const PPTExCharLevel& rCharStyle = mpCharSheet[ EPP_TEXTTYPE_Other ]->maCharLevel[ 0 ];
+
+    sal_uInt16 nFlags = 0x60        // ??
+                      | 0x02        // fontsize;
+                      | 0x04;       // fontcolor
+
+    sal_uInt32 nCharFlags = rCharStyle.mnFlags;
+    nCharFlags &= CharAttr_Italic | CharAttr_Bold | CharAttr_Underline | CharAttr_Shadow;
+
+    rSt << (sal_uInt32)( EPP_TxCFStyleAtom << 16 )  // recordheader
+        << SizeOfTxCFStyleAtom() - 8
+        << (sal_uInt16)( 0x80 | nCharFlags )
+        << (sal_uInt16)nFlags
+        << (sal_uInt16)nCharFlags
+        << (sal_Int32)-1                            // ?
+        << rCharStyle.mnFontHeight
+        << rCharStyle.mnFontColor;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/filter/eppt/pptx-text.cxx b/sd/source/filter/eppt/pptx-text.cxx
new file mode 100644
index 0000000..4c6bedb
--- /dev/null
+++ b/sd/source/filter/eppt/pptx-text.cxx
@@ -0,0 +1,1479 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "text.hxx"
+
+#include <com/sun/star/awt/CharSet.hpp>
+#include <com/sun/star/awt/FontWeight.hpp>
+#include <com/sun/star/awt/FontUnderline.hpp>
+#include <com/sun/star/beans/XPropertyState.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XIndexReplace.hpp>
+#include <com/sun/star/i18n/XBreakIterator.hpp>
+#include <com/sun/star/i18n/ScriptDirection.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/i18n/XScriptTypeDetector.hpp>
+#include <com/sun/star/text/FontRelief.hpp>
+#include <com/sun/star/text/XTextField.hpp>
+#include <com/sun/star/text/XTextRange.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/style/TabStop.hpp>
+
+#include <svl/languageoptions.hxx>
+#include <sfx2/app.hxx>
+#include <editeng/svxenum.hxx>
+#include <editeng/frmdir.hxx>
+#include <unotools/fontcvt.hxx>
+#include <vcl/metric.hxx>
+#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
+#include <comphelper/processfactory.hxx>
+#include <oox/export/drawingml.hxx> // for SubstituteBullet
+
+com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator > xPPTBreakIter;
+com::sun::star::uno::Reference< com::sun::star::i18n::XScriptTypeDetector > xScriptTypeDetector;
+
+PortionObj::PortionObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list