[Libreoffice-commits] .: Branch 'libreoffice-3-3' - 14 commits - sd/prj sd/source sd/util

Tor Lillqvist tml at kemper.freedesktop.org
Sat Nov 13 02:26:04 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 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,
+                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" ) );
+    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" ) );
+    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: */
diff --git a/sd/source/filter/eppt/text.hxx b/sd/source/filter/eppt/text.hxx
new file mode 100644
index 0000000..adcf65e
--- /dev/null
+++ b/sd/source/filter/eppt/text.hxx
@@ -0,0 +1,270 @@
+/* -*- 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.
+ *
+ ************************************************************************/
+
+#ifndef EPPT_TEXT_HXX
+#define EPPT_TEXT_HXX
+
+#include "epptbase.hxx"
+#include "epptdef.hxx"
+
+#include <rtl/textenc.h>
+#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/lang/Locale.hpp>
+
+namespace com { namespace sun { namespace star {
+namespace awt { class FontDescriptor; }
+namespace beans { class XPropertyState; }
+namespace text { class XTextRange; class XTextContent; class XSimpleText; }
+namespace style { class TabStop; }
+}}}
+
+struct SOParagraph
+{
+    sal_Bool                bExtendedParameters;
+    sal_uInt32              nParaFlags;
+    sal_Int16               nBulletFlags;
+    String                  sPrefix;
+    String                  sSuffix;
+    String                  sGraphicUrl;            // String auf eine Graphic
+    Size                    aBuGraSize;
+    sal_uInt32              nNumberingType;         // in wirlichkeit ist dies ein SvxEnum
+    sal_uInt32              nHorzAdjust;
+    sal_uInt32              nBulletColor;
+    sal_Int32               nBulletOfs;
+    sal_Int16               nStartWith;             // Start der nummerierung
+    sal_Int16               nTextOfs;
+    sal_Int16               nBulletRealSize;        // GroessenVerhaeltnis in Proz
+    sal_Int16               nDepth;                 // aktuelle tiefe
+    sal_Unicode             cBulletId;              // wenn Numbering Type == CharSpecial
+    ::com::sun::star::awt::FontDescriptor       aFontDesc;
+
+    sal_Bool                bExtendedBulletsUsed;
+    sal_uInt16              nBulletId;
+    sal_uInt32              nMappedNumType;
+    sal_Bool                bNumberingIsNumber;
+
+    SOParagraph()
+    {
+        nDepth = 0;
+        bExtendedParameters = FALSE;
+        nParaFlags = 0;
+        nBulletFlags = 0;
+        nBulletOfs = 0;
+        nTextOfs = 0;
+        bExtendedBulletsUsed = FALSE;
+        nBulletId = 0xffff;
+        bNumberingIsNumber = sal_True;
+    };
+};
+
+class PropStateValue : public PropValue
+{
+    protected :
+
+        ::com::sun::star::beans::PropertyState                  ePropState;
+        ::com::sun::star::uno::Reference
+            < ::com::sun::star::beans::XPropertyState >         mXPropState;
+
+        sal_Bool    ImplGetPropertyValue( const String& rString, sal_Bool bGetPropertyState = TRUE );
+
+};
+
+struct FieldEntry
+{
+    sal_uInt32  nFieldType;
+    sal_uInt32  nFieldStartPos;
+    sal_uInt32  nFieldEndPos;
+    String      aRepresentation;
+    String      aFieldUrl;
+
+    FieldEntry( sal_uInt32 nType, sal_uInt32 nStart, sal_uInt32 nEnd )
+    {
+        nFieldType = nType;
+        nFieldStartPos = nStart;
+        nFieldEndPos = nEnd;
+    }
+};
+
+class PortionObj : public PropStateValue
+{
+
+    friend class ParagraphObj;
+
+    protected :
+
+        void            ImplClear();
+        void            ImplConstruct( PortionObj& rPortionObj );
+        sal_uInt32      ImplGetTextField( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & rXTextRangeRef,
+                            const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSetRef, String& rURL );
+        sal_uInt32      ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition );
+        void            ImplGetPortionValues( FontCollection& rFontCollection, sal_Bool bGetPropStateValue = FALSE );
+
+    public :
+
+        ::com::sun::star::beans::PropertyState  meCharColor;

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list