LCOV - code coverage report
Current view: top level - sd/source/filter/eppt - epptso.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 853 2346 36.4 %
Date: 2015-06-13 12:38:46 Functions: 29 43 67.4 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/config.h>
      21             : 
      22             : #include <cstdlib>
      23             : 
      24             : #include <osl/endian.h>
      25             : #include <eppt.hxx>
      26             : #include "text.hxx"
      27             : #include "epptdef.hxx"
      28             : #include "escherex.hxx"
      29             : #include <tools/poly.hxx>
      30             : #include <vcl/bmpacc.hxx>
      31             : #include <vcl/gradient.hxx>
      32             : #include <vcl/gfxlink.hxx>
      33             : #include <tools/stream.hxx>
      34             : #include <sot/storage.hxx>
      35             : #include <vcl/outdev.hxx>
      36             : #include <vcl/virdev.hxx>
      37             : #include <sfx2/app.hxx>
      38             : #include <svl/languageoptions.hxx>
      39             : #include <editeng/svxenum.hxx>
      40             : #include <svx/unoapi.hxx>
      41             : #include <svx/svdoashp.hxx>
      42             : #include <com/sun/star/style/VerticalAlignment.hpp>
      43             : #include <com/sun/star/container/XIndexReplace.hpp>
      44             : #include <com/sun/star/presentation/XPresentationPage.hpp>
      45             : #include <com/sun/star/awt/XFont.hpp>
      46             : #include <com/sun/star/awt/FontWeight.hpp>
      47             : #include <com/sun/star/awt/FontUnderline.hpp>
      48             : #include <com/sun/star/style/ParagraphAdjust.hpp>
      49             : #include <com/sun/star/style/LineSpacing.hpp>
      50             : #include <com/sun/star/style/LineSpacingMode.hpp>
      51             : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
      52             : #include <com/sun/star/style/XStyle.hpp>
      53             : #include <com/sun/star/drawing/PointSequence.hpp>
      54             : #include <com/sun/star/drawing/FlagSequence.hpp>
      55             : #include <com/sun/star/drawing/PolygonFlags.hpp>
      56             : #include <com/sun/star/beans/PropertyValue.hpp>
      57             : #include <com/sun/star/drawing/XControlShape.hpp>
      58             : #include <comphelper/processfactory.hxx>
      59             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      60             : #include <com/sun/star/i18n/XBreakIterator.hpp>
      61             : #include <com/sun/star/i18n/XScriptTypeDetector.hpp>
      62             : #include <com/sun/star/i18n/ScriptType.hpp>
      63             : #include <com/sun/star/i18n/ScriptDirection.hpp>
      64             : #include <com/sun/star/embed/Aspects.hpp>
      65             : #include <vcl/cvtgrf.hxx>
      66             : #include <tools/urlobj.hxx>
      67             : #include <comphelper/extract.hxx>
      68             : #include <cppuhelper/proptypehlp.hxx>
      69             : #include <toolkit/helper/vclunohelper.hxx>
      70             : #include <rtl/crc.h>
      71             : #include <comphelper/classids.hxx>
      72             : #include <unotools/ucbstreamhelper.hxx>
      73             : #include <com/sun/star/text/FontRelief.hpp>
      74             : #include <editeng/frmdiritem.hxx>
      75             : #include <vcl/fltcall.hxx>
      76             : #include <com/sun/star/table/XTable.hpp>
      77             : #include <com/sun/star/table/XMergeableCell.hpp>
      78             : #include <com/sun/star/table/BorderLine.hpp>
      79             : #include <set>
      80             : #include <oox/ole/olehelper.hxx>
      81             : #include "i18nlangtag/languagetag.hxx"
      82             : 
      83             : using namespace ::com::sun::star;
      84             : 
      85             : #define ANSI_CHARSET            0
      86             : #define SYMBOL_CHARSET          2
      87             : 
      88             : /* Font Families */
      89             : #define FF_ROMAN                0x10
      90             : #define FF_SWISS                0x20
      91             : #define FF_MODERN               0x30
      92             : #define FF_SCRIPT               0x40
      93             : #define FF_DECORATIVE           0x50
      94             : 
      95             : #define DEFAULT_PITCH           0x00
      96             : #define FIXED_PITCH             0x01
      97             : 
      98           3 : PPTExBulletProvider::PPTExBulletProvider()
      99             : {
     100           3 :     pGraphicProv = new EscherGraphicProvider( _E_GRAPH_PROV_USE_INSTANCES  | _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES );
     101           3 : }
     102             : 
     103           6 : PPTExBulletProvider::~PPTExBulletProvider()
     104             : {
     105           3 :     delete pGraphicProv;
     106           3 : }
     107             : 
     108           0 : sal_uInt16 PPTExBulletProvider::GetId( const OString& rUniqueId, Size& rGraphicSize )
     109             : {
     110           0 :     sal_uInt16 nRetValue = 0xffff;
     111             : 
     112           0 :     if ( !rUniqueId.isEmpty() )
     113             :     {
     114           0 :         Rectangle       aRect;
     115           0 :         GraphicObject   aGraphicObject( rUniqueId );
     116           0 :         Graphic         aMappedGraphic, aGraphic( aGraphicObject.GetGraphic() );
     117           0 :         Size            aPrefSize( aGraphic.GetPrefSize() );
     118           0 :         BitmapEx        aBmpEx( aGraphic.GetBitmapEx() );
     119             : 
     120           0 :         if ( rGraphicSize.Width() && rGraphicSize.Height() )
     121             :         {
     122           0 :             double          fQ1 = ( (double)aPrefSize.Width() / (double)aPrefSize.Height() );
     123           0 :             double          fQ2 = ( (double)rGraphicSize.Width() / (double)rGraphicSize.Height() );
     124           0 :             double          fXScale = 1;
     125           0 :             double          fYScale = 1;
     126             : 
     127           0 :             if ( fQ1 > fQ2 )
     128           0 :                 fYScale = fQ1 / fQ2;
     129           0 :             else if ( fQ1 < fQ2 )
     130           0 :                 fXScale = fQ2 / fQ1;
     131             : 
     132           0 :             if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
     133             :             {
     134           0 :                 aBmpEx.Scale( fXScale, fYScale );
     135           0 :                 Size aNewSize( (sal_Int32)((double)rGraphicSize.Width() / fXScale + 0.5 ),
     136           0 :                                 (sal_Int32)((double)rGraphicSize.Height() / fYScale + 0.5 ) );
     137             : 
     138           0 :                 rGraphicSize = aNewSize;
     139             : 
     140           0 :                 aMappedGraphic = Graphic( aBmpEx );
     141           0 :                 aGraphicObject = GraphicObject( aMappedGraphic );
     142             :             }
     143             :         }
     144           0 :         sal_uInt32 nId = pGraphicProv->GetBlibID( aBuExPictureStream, aGraphicObject.GetUniqueID(), aRect, NULL, NULL );
     145             : 
     146           0 :         if ( nId && ( nId < 0x10000 ) )
     147           0 :             nRetValue = (sal_uInt16)nId - 1;
     148             :     }
     149           0 :     return nRetValue;
     150             : }
     151             : 
     152           6 : sal_uInt32 PPTWriter::ImplVBAInfoContainer( SvStream* pStrm )
     153             : {
     154           6 :     sal_uInt32 nSize = 28;
     155           6 :     if ( pStrm )
     156             :     {
     157           3 :         pStrm->WriteUInt32( 0x1f | ( EPP_VBAInfo << 16 ) )
     158           6 :               .WriteUInt32( nSize - 8 )
     159           3 :               .WriteUInt32( 2 | ( EPP_VBAInfoAtom << 16 ) )
     160           3 :               .WriteUInt32( 12 );
     161           3 :         mpPptEscherEx->InsertPersistOffset( EPP_Persist_VBAInfoAtom, pStrm->Tell() );
     162           3 :         pStrm->WriteUInt32( 0 )
     163           3 :               .WriteUInt32( 0 )
     164           3 :               .WriteUInt32( 1 );
     165             :     }
     166           6 :     return nSize;
     167             : }
     168             : 
     169          12 : sal_uInt32 PPTWriter::ImplSlideViewInfoContainer( sal_uInt32 nInstance, SvStream* pStrm )
     170             : {
     171          12 :     sal_uInt32 nSize = 111;
     172          12 :     if ( pStrm )
     173             :     {
     174           6 :         sal_uInt8 bShowGuides = 0;
     175           6 :         sal_uInt8 bSnapToGrid = 1;
     176           6 :         sal_uInt8 bSnapToShape = 0;
     177             : 
     178           6 :         sal_Int32 nScaling = 85;
     179           6 :         sal_Int32 nMasterCoordinate = 0xdda;
     180           6 :         sal_Int32 nXOrigin = -780;
     181           6 :         sal_Int32 nYOrigin = -84;
     182             : 
     183           6 :         sal_Int32 nPosition1 = 0x870;
     184           6 :         sal_Int32 nPosition2 = 0xb40;
     185             : 
     186           6 :         if ( nInstance )
     187             :         {
     188           3 :             bShowGuides = 1;
     189           3 :             nScaling = 0x3b;
     190           3 :             nMasterCoordinate = 0xf0c;
     191           3 :             nXOrigin = -1752;
     192           3 :             nYOrigin = -72;
     193           3 :             nPosition1 = 0xb40;
     194           3 :             nPosition2 = 0x870;
     195             :         }
     196           6 :         pStrm->WriteUInt32( 0xf | ( EPP_SlideViewInfo << 16 ) | ( nInstance << 4 ) )
     197          12 :               .WriteUInt32( nSize - 8 )
     198           6 :               .WriteUInt32( EPP_SlideViewInfoAtom << 16 ).WriteUInt32( 3 )
     199          12 :               .WriteUChar( bShowGuides ).WriteUChar( bSnapToGrid ).WriteUChar( bSnapToShape )
     200           6 :               .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
     201           6 :               .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 )  // scaling atom - Keeps the current scale
     202           6 :               .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 )  // scaling atom - Keeps the previous scale
     203           6 :               .WriteInt32( 0x17ac ).WriteInt32( nMasterCoordinate )// Origin - Keeps the origin in master coordinates
     204           6 :               .WriteInt32( nXOrigin ).WriteInt32( nYOrigin )              // Origin
     205           6 :               .WriteUChar( 1 )                          // Bool1 varScale - Set if zoom to fit is set
     206           6 :               .WriteUChar( 0 )                          // bool1 draftMode - Not used
     207           6 :               .WriteUInt16( 0 )                         // padword
     208           6 :               .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
     209           6 :               .WriteUInt32( 0 )     // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
     210           6 :               .WriteInt32( nPosition1 )    // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
     211           6 :               .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
     212           6 :               .WriteInt32( 1 )      // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
     213           6 :               .WriteInt32( nPosition2 );   // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
     214             :     }
     215          12 :     return nSize;
     216             : }
     217             : 
     218           6 : sal_uInt32 PPTWriter::ImplOutlineViewInfoContainer( SvStream* pStrm )
     219             : {
     220           6 :     sal_uInt32 nSize = 68;
     221           6 :     if ( pStrm )
     222             :     {
     223           3 :         pStrm->WriteUInt32( 0xf | ( EPP_OutlineViewInfo << 16 ) ).WriteUInt32( nSize - 8 )
     224           3 :               .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
     225           3 :               .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 )  // scaling atom - Keeps the current scale
     226           3 :               .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 )  // scaling atom - Keeps the previous scale
     227           3 :               .WriteInt32( 0x17ac ).WriteInt32( 0xdda )    // Origin - Keeps the origin in master coordinates
     228           3 :               .WriteInt32( -780 ).WriteInt32( -84 ) // Origin
     229           3 :               .WriteUChar( 1 )                  // bool1 varScale - Set if zoom to fit is set
     230           3 :               .WriteUChar( 0 )                  // bool1 draftMode - Not used
     231           3 :               .WriteUInt16( 0 );                // padword
     232             :     }
     233           6 :     return nSize;
     234             : }
     235             : 
     236           0 : sal_uInt32 PPTWriter::ImplProgBinaryTag( SvStream* pStrm )
     237             : {
     238           0 :     sal_uInt32 nPictureStreamSize, nOutlineStreamSize, nSize = 8;
     239             : 
     240           0 :     nPictureStreamSize = aBuExPictureStream.Tell();
     241           0 :     if ( nPictureStreamSize )
     242           0 :         nSize += nPictureStreamSize + 8;
     243             : 
     244           0 :     nOutlineStreamSize = aBuExOutlineStream.Tell();
     245           0 :     if ( nOutlineStreamSize )
     246           0 :         nSize += nOutlineStreamSize + 8;
     247             : 
     248           0 :     if ( pStrm )
     249             :     {
     250           0 :         pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nSize - 8 );
     251           0 :         if ( nPictureStreamSize )
     252             :         {
     253           0 :             pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedBuGraContainer << 16 ) ).WriteUInt32( nPictureStreamSize );
     254           0 :             pStrm->Write( aBuExPictureStream.GetData(), nPictureStreamSize );
     255             :         }
     256           0 :         if ( nOutlineStreamSize )
     257             :         {
     258           0 :             pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedPresRuleContainer << 16 ) ).WriteUInt32( nOutlineStreamSize );
     259           0 :             pStrm->Write( aBuExOutlineStream.GetData(), nOutlineStreamSize );
     260             :         }
     261             :     }
     262           0 :     return nSize;
     263             : }
     264             : 
     265           0 : sal_uInt32 PPTWriter::ImplProgBinaryTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
     266             : {
     267           0 :     sal_uInt32 nSize = 8 + 8 + 14;
     268           0 :     if ( pStrm )
     269             :     {
     270           0 :         pStrm->WriteUInt32( 0xf | ( EPP_ProgBinaryTag << 16 ) ).WriteUInt32( 0 )
     271           0 :               .WriteUInt32( EPP_CString << 16 ).WriteUInt32( 14 )
     272           0 :               .WriteUInt32( 0x5f005f ).WriteUInt32( 0x50005f )
     273           0 :               .WriteUInt32( 0x540050 ).WriteUInt16( 0x39 );
     274             :     }
     275           0 :     if ( pStrm && pBinTagStrm )
     276             :     {
     277           0 :         sal_uInt32 nLen = pBinTagStrm->Tell();
     278           0 :         nSize += nLen + 8;
     279           0 :         pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nLen );
     280           0 :         pStrm->Write( pBinTagStrm->GetData(), nLen );
     281             :     }
     282             :     else
     283           0 :         nSize += ImplProgBinaryTag( pStrm );
     284             : 
     285           0 :     if ( pStrm )
     286             :     {
     287           0 :         pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
     288           0 :         pStrm->WriteUInt32( nSize - 8 );
     289           0 :         pStrm->SeekRel( nSize - 8 );
     290             :     }
     291           0 :     return nSize;
     292             : }
     293             : 
     294           6 : sal_uInt32 PPTWriter::ImplProgTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
     295             : {
     296           6 :     sal_uInt32 nSize = 0;
     297           6 :     if ( aBuExPictureStream.Tell() || aBuExOutlineStream.Tell() || pBinTagStrm )
     298             :     {
     299           0 :         nSize = 8;
     300           0 :         if ( pStrm )
     301             :         {
     302           0 :             pStrm->WriteUInt32( 0xf | ( EPP_ProgTags << 16 ) ).WriteUInt32( 0 );
     303             :         }
     304           0 :         nSize += ImplProgBinaryTagContainer( pStrm, pBinTagStrm );
     305           0 :         if ( pStrm )
     306             :         {
     307           0 :             pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
     308           0 :             pStrm->WriteUInt32( nSize - 8 );
     309           0 :             pStrm->SeekRel( nSize - 8 );
     310             :         }
     311             :     }
     312           6 :     return nSize;
     313             : }
     314             : 
     315           6 : sal_uInt32 PPTWriter::ImplDocumentListContainer( SvStream* pStrm )
     316             : {
     317           6 :     sal_uInt32 nSize = 8;
     318           6 :     if ( pStrm )
     319             :     {
     320           3 :         pStrm->WriteUInt32( ( EPP_List << 16 ) | 0xf ).WriteUInt32( 0 );
     321             :     }
     322             : 
     323           6 :     nSize += ImplVBAInfoContainer( pStrm );
     324           6 :     nSize += ImplSlideViewInfoContainer( 0, pStrm );
     325           6 :     nSize += ImplOutlineViewInfoContainer( pStrm );
     326           6 :     nSize += ImplSlideViewInfoContainer( 1, pStrm );
     327           6 :     nSize += ImplProgTagContainer( pStrm );
     328             : 
     329           6 :     if ( pStrm )
     330             :     {
     331           3 :         pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
     332           3 :         pStrm->WriteUInt32( nSize - 8 );
     333           3 :         pStrm->SeekRel( nSize - 8 );
     334             :     }
     335           6 :     return nSize;
     336             : }
     337             : 
     338           6 : sal_uInt32 PPTWriter::ImplMasterSlideListContainer( SvStream* pStrm )
     339             : {
     340           6 :     sal_uInt32 i, nSize = 28 * mnMasterPages + 8;
     341           6 :     if ( pStrm )
     342             :     {
     343           3 :         pStrm->WriteUInt32( 0x1f | ( EPP_SlideListWithText << 16 ) ).WriteUInt32( nSize - 8 );
     344             : 
     345           6 :         for ( i = 0; i < mnMasterPages; i++ )
     346             :         {
     347           3 :             pStrm->WriteUInt32( EPP_SlidePersistAtom << 16 ).WriteUInt32( 20 );
     348           3 :             mpPptEscherEx->InsertPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, pStrm->Tell() );
     349           3 :             pStrm->WriteUInt32( 0 )                 // psrReference - logical reference to the slide persist object ( EPP_MAINMASTER_PERSIST_KEY )
     350           3 :                   .WriteUInt32( 0 )                 // flags - only bit 3 used, if set then slide contains shapes other than placeholders
     351           3 :                   .WriteInt32( 0 )                  // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects
     352           6 :                   .WriteInt32( 0x80000000 | i )     // slideId - Unique slide identifier, used for OLE link monikers for example
     353           3 :                   .WriteUInt32( 0 );                // reserved, usually 0
     354             :         }
     355             :     }
     356           6 :     return nSize;
     357             : }
     358             : 
     359           0 : sal_uInt32 PPTWriter::ImplInsertBookmarkURL( const OUString& rBookmarkURL, const sal_uInt32 nType,
     360             :     const OUString& rStringVer0, const OUString& rStringVer1, const OUString& rStringVer2, const OUString& rStringVer3 )
     361             : {
     362           0 :     sal_uInt32 nHyperId = ++mnExEmbed;
     363             : 
     364           0 :     OUString sBookmarkURL( rBookmarkURL );
     365           0 :     INetURLObject aBaseURI( maBaseURI );
     366           0 :     INetURLObject aBookmarkURI( rBookmarkURL );
     367           0 :     if( aBaseURI.GetProtocol() == aBookmarkURI.GetProtocol() )
     368             :     {
     369             :         OUString aRelUrl( INetURLObject::GetRelURL( maBaseURI, rBookmarkURL,
     370           0 :            INetURLObject::WAS_ENCODED, INetURLObject::DECODE_TO_IURI, RTL_TEXTENCODING_UTF8, INetURLObject::FSYS_DETECT ) );
     371           0 :         if ( !aRelUrl.isEmpty() )
     372           0 :             sBookmarkURL = aRelUrl;
     373             :     }
     374           0 :     maHyperlink.push_back( EPPTHyperlink( sBookmarkURL, nType ) );
     375             : 
     376           0 :     mpExEmbed->WriteUInt16( 0xf )
     377           0 :                .WriteUInt16( EPP_ExHyperlink )
     378           0 :                .WriteUInt32( 0 );
     379           0 :     sal_uInt32 nHyperSize, nHyperStart = mpExEmbed->Tell();
     380           0 :     mpExEmbed->WriteUInt16( 0 )
     381           0 :                .WriteUInt16( EPP_ExHyperlinkAtom )
     382           0 :                .WriteUInt32( 4 )
     383           0 :                .WriteUInt32( nHyperId );
     384             : 
     385           0 :     PPTWriter::WriteCString( *mpExEmbed, rStringVer0, 0 );
     386           0 :     PPTWriter::WriteCString( *mpExEmbed, rStringVer1, 1 );
     387           0 :     PPTWriter::WriteCString( *mpExEmbed, rStringVer2, 2 );
     388           0 :     PPTWriter::WriteCString( *mpExEmbed, rStringVer3, 3 );
     389             : 
     390           0 :     nHyperSize = mpExEmbed->Tell() - nHyperStart;
     391           0 :     mpExEmbed->SeekRel( - ( (sal_Int32)nHyperSize + 4 ) );
     392           0 :     mpExEmbed->WriteUInt32( nHyperSize );
     393           0 :     mpExEmbed->SeekRel( nHyperSize );
     394           0 :     return nHyperId;
     395             : }
     396             : 
     397           3 : bool PPTWriter::ImplCloseDocument()
     398             : {
     399           3 :     sal_uInt32 nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Document );
     400           3 :     if ( nOfs )
     401             :     {
     402           3 :         mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_CurrentPos, mpStrm->Tell() );
     403           3 :         mpStrm->Seek( nOfs );
     404             : 
     405             :         // creating the TxMasterStyleAtom
     406           3 :         SvMemoryStream aTxMasterStyleAtomStrm( 0x200, 0x200 );
     407             :         {
     408           3 :             EscherExAtom aTxMasterStyleAtom( aTxMasterStyleAtomStrm, EPP_TxMasterStyleAtom, EPP_TEXTTYPE_Other );
     409           3 :             aTxMasterStyleAtomStrm.WriteUInt16( 5 );        // paragraph count
     410             :             sal_uInt16 nLev;
     411           3 :             bool bFirst = true;
     412          18 :             for ( nLev = 0; nLev < 5; nLev++ )
     413             :             {
     414          15 :                 mpStyleSheet->mpParaSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, false, mXPagePropSet );
     415          15 :                 mpStyleSheet->mpCharSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, false, mXPagePropSet );
     416          15 :                 bFirst = false;
     417           3 :             }
     418             :         }
     419             : 
     420           3 :         mpExEmbed->Seek( STREAM_SEEK_TO_END );
     421           3 :         sal_uInt32 nExEmbedSize = mpExEmbed->Tell();
     422             : 
     423             :         // nEnvironment : whole size of the environment container
     424           3 :         sal_uInt32 nEnvironment = maFontCollection.GetCount() * 76      // 68 bytes per Fontenityatom and 8 Bytes per header
     425             :                                 + 8                                     // 1 FontCollection container
     426             :                                 + 20                                    // SrKinsoku container
     427             :                                 + 18                                    // 1 TxSiStyleAtom
     428           3 :                                 + aTxMasterStyleAtomStrm.Tell()         // 1 TxMasterStyleAtom;
     429           3 :                                 + PPTExStyleSheet::SizeOfTxCFStyleAtom();
     430             : 
     431           3 :         sal_uInt32 nBytesToInsert = nEnvironment + 8;
     432             : 
     433           3 :         if ( nExEmbedSize )
     434           0 :             nBytesToInsert += nExEmbedSize + 8 + 12;
     435             : 
     436           3 :         nBytesToInsert += maSoundCollection.GetSize();
     437           3 :         nBytesToInsert += mpPptEscherEx->DrawingGroupContainerSize();
     438           3 :         nBytesToInsert += ImplMasterSlideListContainer( NULL );
     439           3 :         nBytesToInsert += ImplDocumentListContainer( NULL );
     440             : 
     441             :         // insert nBytes into stream and adjust depending container
     442           3 :         mpPptEscherEx->InsertAtCurrentPos( nBytesToInsert, false );
     443             : 
     444             :         // CREATE HYPERLINK CONTAINER
     445           3 :         if ( nExEmbedSize )
     446             :         {
     447           0 :             mpStrm->WriteUInt16( 0xf )
     448           0 :                    .WriteUInt16( EPP_ExObjList )
     449           0 :                    .WriteUInt32( nExEmbedSize + 12 )
     450           0 :                    .WriteUInt16( 0 )
     451           0 :                    .WriteUInt16( EPP_ExObjListAtom )
     452           0 :                    .WriteUInt32( 4 )
     453           0 :                    .WriteUInt32( mnExEmbed );
     454           0 :             mpPptEscherEx->InsertPersistOffset( EPP_Persist_ExObj, mpStrm->Tell() );
     455           0 :             mpStrm->Write( mpExEmbed->GetData(), nExEmbedSize );
     456             :         }
     457             : 
     458             :         // CREATE ENVIRONMENT
     459           3 :         mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_Environment ).WriteUInt32( nEnvironment );
     460             : 
     461             :         // Open Container ( EPP_SrKinsoku )
     462           3 :         mpStrm->WriteUInt16( 0x2f ).WriteUInt16( EPP_SrKinsoku ).WriteUInt32( 12 );
     463           3 :         mpPptEscherEx->AddAtom( 4, EPP_SrKinsokuAtom, 0, 3 );
     464           3 :         mpStrm->WriteInt32( 0 );                        // SrKinsoku Level 0
     465             : 
     466             :         // Open Container ( EPP_FontCollection )
     467           3 :         mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_FontCollection ).WriteUInt32( maFontCollection.GetCount() * 76 );
     468             : 
     469          14 :         for ( sal_uInt32 i = 0; i < maFontCollection.GetCount(); i++ )
     470             :         {
     471          11 :             mpPptEscherEx->AddAtom( 68, EPP_FontEnityAtom, 0, i );
     472          11 :             const FontCollectionEntry* pDesc = maFontCollection.GetById( i );
     473          11 :             sal_Int32 nFontLen = pDesc->Name.getLength();
     474          11 :             if ( nFontLen > 31 )
     475           0 :                 nFontLen = 31;
     476         363 :             for ( sal_Int32 n = 0; n < 32; n++ )
     477             :             {
     478         352 :                 sal_Unicode nUniCode = 0;
     479         352 :                 if ( n < nFontLen )
     480         131 :                     nUniCode = pDesc->Name[n];
     481         352 :                 mpStrm->WriteUInt16( nUniCode );
     482             :             }
     483          11 :             sal_uInt8   lfCharSet = ANSI_CHARSET;
     484          11 :             sal_uInt8   lfClipPrecision = 0;
     485          11 :             sal_uInt8   lfQuality = 6;
     486          11 :             sal_uInt8   lfPitchAndFamily = 0;
     487             : 
     488          11 :             if ( pDesc->CharSet == RTL_TEXTENCODING_SYMBOL )
     489           0 :                 lfCharSet = SYMBOL_CHARSET;
     490             : 
     491          11 :             switch( pDesc->Family )
     492             :             {
     493             :                 case ::com::sun::star::awt::FontFamily::ROMAN :
     494           6 :                     lfPitchAndFamily |= FF_ROMAN;
     495           6 :                 break;
     496             : 
     497             :                 case ::com::sun::star::awt::FontFamily::SWISS :
     498           0 :                     lfPitchAndFamily |= FF_SWISS;
     499           0 :                 break;
     500             : 
     501             :                 case ::com::sun::star::awt::FontFamily::MODERN :
     502           0 :                     lfPitchAndFamily |= FF_MODERN;
     503           0 :                 break;
     504             : 
     505             :                 case ::com::sun::star::awt::FontFamily::SCRIPT:
     506           0 :                     lfPitchAndFamily |= FF_SCRIPT;
     507           0 :                 break;
     508             : 
     509             :                 case ::com::sun::star::awt::FontFamily::DECORATIVE:
     510           0 :                      lfPitchAndFamily |= FF_DECORATIVE;
     511           0 :                 break;
     512             : 
     513             :                 default:
     514           5 :                     lfPitchAndFamily |= FAMILY_DONTKNOW;
     515           5 :                 break;
     516             :             }
     517          11 :             switch( pDesc->Pitch )
     518             :             {
     519             :                 case ::com::sun::star::awt::FontPitch::FIXED:
     520           0 :                     lfPitchAndFamily |= FIXED_PITCH;
     521           0 :                 break;
     522             : 
     523             :                 default:
     524          11 :                     lfPitchAndFamily |= DEFAULT_PITCH;
     525          11 :                 break;
     526             :             }
     527          11 :             mpStrm->WriteUChar( lfCharSet )
     528          22 :                    .WriteUChar( lfClipPrecision )
     529          22 :                    .WriteUChar( lfQuality )
     530          22 :                    .WriteUChar( lfPitchAndFamily );
     531             :         }
     532           3 :         mpStyleSheet->WriteTxCFStyleAtom( *mpStrm );        // create style that is used for new standard objects
     533           3 :         mpPptEscherEx->AddAtom( 10, EPP_TxSIStyleAtom );
     534           3 :         mpStrm->WriteUInt32( 7 )                        // ?
     535           3 :                .WriteInt16( 2 )                         // ?
     536           3 :                .WriteUChar( 9 )                         // ?
     537           3 :                .WriteUChar( 8 )                         // ?
     538           3 :                .WriteInt16( 0 );                        // ?
     539             : 
     540           3 :         mpStrm->Write( aTxMasterStyleAtomStrm.GetData(), aTxMasterStyleAtomStrm.Tell() );
     541           3 :         maSoundCollection.Write( *mpStrm );
     542           3 :         mpPptEscherEx->WriteDrawingGroupContainer( *mpStrm );
     543           3 :         ImplMasterSlideListContainer( mpStrm );
     544           3 :         ImplDocumentListContainer( mpStrm );
     545             : 
     546           3 :         sal_uInt32 nOldPos = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_CurrentPos );
     547           3 :         if ( nOldPos )
     548             :         {
     549           3 :             mpStrm->Seek( nOldPos );
     550           3 :             return true;
     551           0 :         }
     552             :     }
     553           0 :     return false;
     554             : }
     555             : 
     556       12452 : bool PropValue::GetPropertyValue(
     557             :     ::com::sun::star::uno::Any& rAny,
     558             :     const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
     559             :     const OUString& rString,
     560             :     bool bTestPropertyAvailability )
     561             : {
     562       12452 :     bool bRetValue = true;
     563       12452 :     if ( bTestPropertyAvailability )
     564             :     {
     565        2882 :         bRetValue = false;
     566             :         try
     567             :         {
     568             :             ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
     569        2882 :                 aXPropSetInfo( rXPropSet->getPropertySetInfo() );
     570        2882 :             if ( aXPropSetInfo.is() )
     571        2882 :                 bRetValue = aXPropSetInfo->hasPropertyByName( rString );
     572             :         }
     573           0 :         catch( ::com::sun::star::uno::Exception& )
     574             :         {
     575           0 :             bRetValue = false;
     576             :         }
     577             :     }
     578       12452 :     if ( bRetValue )
     579             :     {
     580             :         try
     581             :         {
     582       11532 :             rAny = rXPropSet->getPropertyValue( rString );
     583       11530 :             if ( !rAny.hasValue() )
     584         164 :                 bRetValue = false;
     585             :         }
     586           4 :         catch( ::com::sun::star::uno::Exception& )
     587             :         {
     588           2 :             bRetValue = false;
     589             :         }
     590             :     }
     591       12452 :     return bRetValue;
     592             : }
     593             : 
     594        2355 : ::com::sun::star::beans::PropertyState PropValue::GetPropertyState(
     595             :     const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
     596             :     const OUString& rPropertyName )
     597             : {
     598        2355 :     ::com::sun::star::beans::PropertyState eRetValue = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
     599             :     try
     600             :     {
     601             :         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > aXPropState
     602        2355 :                 ( rXPropSet, ::com::sun::star::uno::UNO_QUERY );
     603        2355 :         if ( aXPropState.is() )
     604        2355 :             eRetValue = aXPropState->getPropertyState( rPropertyName );
     605             :     }
     606           0 :     catch( ::com::sun::star::uno::Exception& )
     607             :     {
     608             : 
     609             :     }
     610        2355 :     return eRetValue;
     611             : }
     612             : 
     613        2449 : bool PropValue::ImplGetPropertyValue( const OUString& rString )
     614             : {
     615        2449 :     return GetPropertyValue( mAny, mXPropSet, rString );
     616             : }
     617             : 
     618         446 : bool PropValue::ImplGetPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & aXPropSet, const OUString& rString )
     619             : {
     620         446 :     return GetPropertyValue( mAny, aXPropSet, rString );
     621             : }
     622             : 
     623       11191 : bool PropStateValue::ImplGetPropertyValue( const OUString& rString, bool bGetPropertyState )
     624             : {
     625       11191 :     ePropState = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
     626       11191 :     bool bRetValue = true;
     627             : #ifdef UNX
     628             :         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
     629       11191 :             aXPropSetInfo( mXPropSet->getPropertySetInfo() );
     630       11191 :         if ( !aXPropSetInfo.is() )
     631           0 :             return false;
     632             : #endif
     633             :     try
     634             :     {
     635       11191 :         mAny = mXPropSet->getPropertyValue( rString );
     636       11191 :         if ( !mAny.hasValue() )
     637           0 :             bRetValue = false;
     638       11191 :         else if ( bGetPropertyState )
     639         763 :             ePropState = mXPropState->getPropertyState( rString );
     640             :         else
     641       10428 :             ePropState = ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
     642             :     }
     643           0 :     catch( ::com::sun::star::uno::Exception& )
     644             :     {
     645           0 :         bRetValue = false;
     646             :     }
     647       11191 :     return bRetValue;
     648             : }
     649             : 
     650          21 : void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
     651             : {
     652          21 :     bool                bFirstParagraph = true;
     653             :     sal_uInt32          nCharCount;
     654          21 :     sal_uInt32          nPropertyFlags = 0;
     655          21 :     sal_uInt16          nDepth = 0;
     656             :     sal_Int16           nLineSpacing;
     657          21 :     int                 nInstance = rTextObj.GetInstance();
     658             : 
     659          42 :     for ( sal_uInt32 i = 0;  i < rTextObj.ParagraphCount(); ++i, bFirstParagraph = false )
     660             :     {
     661          21 :         ParagraphObj* pPara = rTextObj.GetParagraph(i);
     662          21 :         const PortionObj& rPortion = pPara->front();
     663          21 :         nCharCount = pPara->CharacterCount();
     664             : 
     665          21 :         nDepth = pPara->nDepth;
     666          21 :         if ( nDepth > 4)
     667           0 :             nDepth = 4;
     668             : 
     669          42 :         if ( ( pPara->meTextAdjust == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     670          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_Adjust, pPara->mnTextAdjust ) ) )
     671          12 :             nPropertyFlags |= 0x00000800;
     672          21 :         nLineSpacing = pPara->mnLineSpacing;
     673             : 
     674          21 :         const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
     675          21 :         sal_Int16 nNormalSpacing = 100;
     676          21 :         if ( !mbFontIndependentLineSpacing && pDesc )
     677             :         {
     678          21 :             double fN = 100.0;
     679          21 :             fN *= pDesc->Scaling;
     680          21 :             nNormalSpacing = (sal_Int16)( fN + 0.5 );
     681             :         }
     682          21 :         if ( !mbFontIndependentLineSpacing && bFirstParagraph && ( nLineSpacing > nNormalSpacing ) )    // sj: i28747, no replacement for fixed linespacing
     683             :         {
     684          21 :             nLineSpacing = nNormalSpacing;
     685          21 :             nPropertyFlags |= 0x00001000;
     686             :         }
     687             :         else
     688             :         {
     689           0 :             if ( nLineSpacing > 0 )
     690             :             {
     691           0 :                 if ( !mbFontIndependentLineSpacing && pDesc )
     692           0 :                      nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
     693             :             }
     694             :             else
     695             :             {
     696           0 :                 if ( !pPara->mbFixedLineSpacing && rPortion.mnCharHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
     697           0 :                     nLineSpacing = nNormalSpacing;
     698             :                 else
     699           0 :                     nLineSpacing = (sal_Int16)( (double)nLineSpacing / 4.40972 );
     700             :             }
     701           0 :             if ( ( pPara->meLineSpacing == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     702           0 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LineFeed, nLineSpacing ) ) )
     703           0 :                 nPropertyFlags |= 0x00001000;
     704             :         }
     705          42 :         if ( ( pPara->meLineSpacingTop == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     706          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mnLineSpacingTop ) ) )
     707           0 :             nPropertyFlags |= 0x00002000;
     708          42 :         if ( ( pPara->meLineSpacingBottom == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     709          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LowerDist, pPara->mnLineSpacingBottom ) ) )
     710           0 :             nPropertyFlags |= 0x00004000;
     711          42 :         if ( ( pPara->meForbiddenRules == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     712          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbForbiddenRules ? 1 : 0 ) ) )
     713          21 :             nPropertyFlags |= 0x00020000;
     714          42 :         if ( ( pPara->meParagraphPunctation == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     715          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbParagraphPunctation ? 1 : 0 ) ) )
     716           0 :             nPropertyFlags |= 0x00080000;
     717          42 :         if ( ( pPara->meBiDi == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     718          21 :             ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BiDi, pPara->mnBiDi ) ) )
     719           0 :             nPropertyFlags |= 0x00200000;
     720             : 
     721          21 :         sal_Int32 nBuRealSize = pPara->nBulletRealSize;
     722          21 :         sal_Int16 nBulletFlags = pPara->nBulletFlags;
     723             : 
     724          21 :         if ( pPara->bExtendedParameters )
     725           0 :             nPropertyFlags |= pPara->nParaFlags;
     726             :         else
     727             :         {
     728          21 :             nPropertyFlags |= 1;            // turn off bullet explicit
     729          21 :             nBulletFlags = 0;
     730             :         }
     731             : 
     732             :         // Write nTextOfs and nBullets
     733          21 :         if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_TextOfs, pPara->nTextOfs ) )
     734           0 :             nPropertyFlags |= 0x100;
     735          21 :         if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BulletOfs, pPara->nBulletOfs ))
     736           0 :             nPropertyFlags |= 0x400;
     737             : 
     738          21 :         FontCollectionEntry aFontDescEntry( pPara->aFontDesc.Name, pPara->aFontDesc.Family, pPara->aFontDesc.Pitch, pPara->aFontDesc.CharSet );
     739          21 :         sal_uInt16  nFontId = (sal_uInt16)maFontCollection.GetId( aFontDescEntry );
     740             : 
     741          21 :         rOut.WriteUInt32( nCharCount )
     742          42 :             .WriteUInt16( nDepth )                          // Level
     743          21 :             .WriteUInt32( nPropertyFlags );     // Paragraph Attribut Set
     744             : 
     745          21 :         if ( nPropertyFlags & 0xf )
     746          21 :             rOut.WriteInt16( nBulletFlags );
     747          21 :         if ( nPropertyFlags & 0x80 )
     748           0 :             rOut.WriteUInt16( ( pPara->cBulletId ) );
     749          21 :         if ( nPropertyFlags & 0x10 )
     750           0 :             rOut.WriteUInt16( nFontId );
     751          21 :         if ( nPropertyFlags & 0x40 )
     752           0 :             rOut.WriteInt16( nBuRealSize );
     753          21 :         if ( nPropertyFlags & 0x20 )
     754             :         {
     755           0 :             sal_uInt32 nBulletColor = pPara->nBulletColor;
     756           0 :             if ( nBulletColor == COL_AUTO )
     757             :             {
     758           0 :                 bool bIsDark = false;
     759           0 :                 ::com::sun::star::uno::Any aAny;
     760           0 :                 if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, OUString( "IsBackgroundDark" ), true ) )
     761           0 :                     aAny >>= bIsDark;
     762           0 :                 nBulletColor = bIsDark ? 0xffffff : 0x000000;
     763             :             }
     764           0 :             nBulletColor &= 0xffffff;
     765           0 :             nBulletColor |= 0xfe000000;
     766           0 :             rOut.WriteUInt32( nBulletColor );
     767             :         }
     768          21 :         if ( nPropertyFlags & 0x00000800 )
     769          12 :             rOut.WriteUInt16( ( pPara->mnTextAdjust ) );
     770          21 :         if ( nPropertyFlags & 0x00001000 )
     771          21 :             rOut.WriteUInt16( ( nLineSpacing ) );
     772          21 :         if ( nPropertyFlags & 0x00002000 )
     773           0 :             rOut.WriteUInt16( ( pPara->mnLineSpacingTop ) );
     774          21 :         if ( nPropertyFlags & 0x00004000 )
     775           0 :             rOut.WriteUInt16( ( pPara->mnLineSpacingBottom ) );
     776          21 :         if ( nPropertyFlags & 0x100 )
     777           0 :             rOut.WriteUInt16( (pPara->nTextOfs) );
     778          21 :         if (  nPropertyFlags & 0x400 )
     779           0 :             rOut.WriteUInt16( (pPara->nBulletOfs) );
     780          21 :         if ( nPropertyFlags & 0x000e0000 )
     781             :         {
     782          21 :             sal_uInt16 nAsianSettings = 0;
     783          21 :             if ( pPara->mbForbiddenRules )
     784          21 :                 nAsianSettings |= 1;
     785          21 :             if ( pPara->mbParagraphPunctation )
     786           0 :                 nAsianSettings |= 4;
     787          21 :             rOut.WriteUInt16( nAsianSettings );
     788             :         }
     789          21 :         if ( nPropertyFlags & 0x200000 )
     790           0 :             rOut.WriteUInt16( pPara->mnBiDi );
     791          21 :     }
     792          21 : }
     793             : 
     794          21 : void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
     795             : {
     796             :     sal_uInt32  nPropertyFlags;
     797          21 :     int nInstance = rTextObj.GetInstance();
     798             : 
     799          42 :     for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i )
     800             :     {
     801          21 :         ParagraphObj* pPara = rTextObj.GetParagraph(i);
     802          42 :         for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
     803             :         {
     804          21 :             const PortionObj& rPortion = *it;
     805          21 :             nPropertyFlags = 0;
     806          21 :             sal_uInt32 nCharAttr = rPortion.mnCharAttr;
     807          21 :             sal_uInt32 nCharColor = rPortion.mnCharColor;
     808             : 
     809          21 :             if ( nCharColor == COL_AUTO )   // nCharColor depends to the background color
     810             :             {
     811          21 :                 bool bIsDark = false;
     812          21 :                 ::com::sun::star::uno::Any aAny;
     813          21 :                 if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, OUString( "IsBackgroundDark" ), true ) )
     814          21 :                     aAny >>= bIsDark;
     815          21 :                 nCharColor = bIsDark ? 0xffffff : 0x000000;
     816             :             }
     817             : 
     818          21 :             nCharColor &= 0xffffff;
     819             : 
     820             :             /* the portion is using the embossed or engraved attribute, which we want to map to the relief feature of PPT.
     821             :             Because the relief feature of PPT is dependent to the background color, such a mapping can not always be used. */
     822          21 :             if ( nCharAttr & 0x200 )
     823             :             {
     824           0 :                 sal_uInt32 nBackgroundColor = 0xffffff;
     825             : 
     826           0 :                 if ( !nCharColor )          // special threatment for
     827           0 :                     nCharColor = 0xffffff;  // black fontcolor
     828             : 
     829           0 :                 ::com::sun::star::uno::Any aAny;
     830           0 :                 ::com::sun::star::drawing::FillStyle aFS( ::com::sun::star::drawing::FillStyle_NONE );
     831           0 :                 if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "FillStyle" ) ) )
     832           0 :                     aAny >>= aFS;
     833           0 :                 switch( aFS )
     834             :                 {
     835             :                     case ::com::sun::star::drawing::FillStyle_GRADIENT :
     836             :                     {
     837           0 :                         Point aEmptyPoint = Point();
     838           0 :                         Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
     839           0 :                         EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
     840           0 :                         aPropOpt.CreateGradientProperties( mXPropSet );
     841           0 :                         aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
     842             :                     }
     843           0 :                     break;
     844             :                     case ::com::sun::star::drawing::FillStyle_SOLID :
     845             :                     {
     846           0 :                         if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "FillColor" ) ) )
     847           0 :                             nBackgroundColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) );
     848             :                     }
     849           0 :                     break;
     850             :                     case ::com::sun::star::drawing::FillStyle_NONE :
     851             :                     {
     852           0 :                         ::com::sun::star::uno::Any aBackAny;
     853           0 :                         ::com::sun::star::drawing::FillStyle aBackFS( ::com::sun::star::drawing::FillStyle_NONE );
     854           0 :                         if ( PropValue::GetPropertyValue( aBackAny, mXBackgroundPropSet, OUString( "FillStyle" ) ) )
     855           0 :                             aBackAny >>= aBackFS;
     856           0 :                         switch( aBackFS )
     857             :                         {
     858             :                             case ::com::sun::star::drawing::FillStyle_GRADIENT :
     859             :                             {
     860           0 :                                 Point aEmptyPoint = Point();
     861           0 :                                 Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
     862           0 :                                 EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
     863           0 :                                 aPropOpt.CreateGradientProperties( mXBackgroundPropSet );
     864           0 :                                 aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
     865             :                             }
     866           0 :                             break;
     867             :                             case ::com::sun::star::drawing::FillStyle_SOLID :
     868             :                             {
     869           0 :                                 if ( PropValue::GetPropertyValue( aAny, mXBackgroundPropSet, OUString( "FillColor" ) ) )
     870           0 :                                     nBackgroundColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) );
     871             :                             }
     872           0 :                             break;
     873             :                             default:
     874           0 :                                 break;
     875           0 :                         }
     876             :                     }
     877           0 :                     break;
     878             :                     default:
     879           0 :                         break;
     880             :                 }
     881             : 
     882           0 :                 sal_Int32 nB = nBackgroundColor & 0xff;
     883           0 :                 nB += (sal_uInt8)( nBackgroundColor >> 8  );
     884           0 :                 nB += (sal_uInt8)( nBackgroundColor >> 16 );
     885             :                 // if the background color is nearly black, relief can't been used, because the text would not be visible
     886           0 :                 if ( nB < 0x60 || ( nBackgroundColor != nCharColor ) )
     887             :                 {
     888           0 :                     nCharAttr &=~ 0x200;
     889             : 
     890             :                     // now check if the text is part of a group, and if the previous object has the same color than the fontcolor
     891             :                     // ( and if fillcolor is not available the background color ), it is sometimes
     892             :                     // not possible to export the 'embossed' flag
     893           0 :                     if ( ( GetCurrentGroupLevel() > 0 ) && ( GetCurrentGroupIndex() >= 1 ) )
     894             :                     {
     895           0 :                         ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > aGroupedShape( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() - 1 ), uno::UNO_QUERY );
     896           0 :                         if( aGroupedShape.is() )
     897             :                         {
     898             :                             ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aPropSetOfNextShape
     899           0 :                                 ( aGroupedShape, ::com::sun::star::uno::UNO_QUERY );
     900           0 :                             if ( aPropSetOfNextShape.is() )
     901             :                             {
     902           0 :                                 if ( PropValue::GetPropertyValue( aAny, aPropSetOfNextShape,
     903           0 :                                                     OUString( "FillColor" ), true ) )
     904             :                                 {
     905           0 :                                     if ( nCharColor == EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) ) )
     906             :                                     {
     907           0 :                                         nCharAttr |= 0x200;
     908             :                                     }
     909             :                                 }
     910           0 :                             }
     911           0 :                         }
     912             :                     }
     913           0 :                 }
     914             :             }
     915          21 :             nCharColor |= 0xfe000000;
     916          21 :             if ( nInstance == 4 )                       // special handling for normal textobjects:
     917          21 :                 nPropertyFlags |= nCharAttr & 0x217;    // not all attributes ar inherited
     918             :             else
     919             :             {
     920           0 :                 if ( /* ( rPortion.mnCharAttrHard & 1 ) || */
     921           0 :                     ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Bold, nCharAttr ) ) )
     922           0 :                     nPropertyFlags |= 1;
     923           0 :                 if ( /* ( rPortion.mnCharAttrHard & 2 ) || */
     924           0 :                     ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Italic, nCharAttr ) ) )
     925           0 :                     nPropertyFlags |= 2;
     926           0 :                 if ( /* ( rPortion.mnCharAttrHard & 4 ) || */
     927           0 :                     ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Underline, nCharAttr ) ) )
     928           0 :                     nPropertyFlags |= 4;
     929           0 :                 if ( /* ( rPortion.mnCharAttrHard & 0x10 ) || */
     930           0 :                     ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Shadow, nCharAttr ) ) )
     931           0 :                     nPropertyFlags |= 0x10;
     932           0 :                 if ( /* ( rPortion.mnCharAttrHard & 0x200 ) || */
     933           0 :                     ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Embossed, nCharAttr ) ) )
     934           0 :                     nPropertyFlags |= 512;
     935             :             }
     936          21 :             if ( rTextObj.HasExtendedBullets() )
     937             :             {
     938           0 :                 nPropertyFlags |= ( i & 0x3f ) << 10 ;
     939           0 :                 nCharAttr  |= ( i & 0x3f ) << 10;
     940             :             }
     941          42 :             if ( ( rPortion.meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     942          21 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, rPortion.mnFont ) ) )
     943          21 :                 nPropertyFlags |= 0x00010000;
     944          42 :             if ( ( rPortion.meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     945          21 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, rPortion.mnAsianOrComplexFont ) ) )
     946          21 :                 nPropertyFlags |= 0x00200000;
     947          21 :             if ( ( rPortion.meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     948           0 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, rPortion.mnCharHeight ) ) )
     949          21 :                 nPropertyFlags |= 0x00020000;
     950          42 :             if ( ( rPortion.meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     951          21 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontColor, nCharColor & 0xffffff ) ) )
     952          21 :                 nPropertyFlags |= 0x00040000;
     953          42 :             if ( ( rPortion.meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
     954          21 :                 ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, rPortion.mnCharEscapement ) ) )
     955           0 :                 nPropertyFlags |= 0x00080000;
     956             : 
     957          21 :             sal_uInt32 nCharCount = rPortion.Count();
     958             : 
     959          21 :             rOut.WriteUInt32( nCharCount )
     960          21 :                 .WriteUInt32( nPropertyFlags );          //PropertyFlags
     961             : 
     962          21 :             if ( nPropertyFlags & 0xffff )
     963           0 :                 rOut.WriteUInt16( ( nCharAttr ) );
     964          21 :             if ( nPropertyFlags & 0x00010000 )
     965          21 :                 rOut.WriteUInt16( rPortion.mnFont );
     966          21 :             if ( nPropertyFlags & 0x00200000 )
     967          21 :                 rOut.WriteUInt16( rPortion.mnAsianOrComplexFont );
     968          21 :             if ( nPropertyFlags & 0x00020000 )
     969          21 :                 rOut.WriteUInt16( ( rPortion.mnCharHeight ) );
     970          21 :             if ( nPropertyFlags & 0x00040000 )
     971          21 :                 rOut.WriteUInt32( nCharColor );
     972          21 :             if ( nPropertyFlags & 0x00080000 )
     973           0 :                 rOut.WriteInt16( rPortion.mnCharEscapement );
     974             :         }
     975             :     }
     976          21 : }
     977             : 
     978             : /**
     979             :  * Loads and converts text from shape, value is stored in mnTextSize.
     980             :  */
     981          61 : bool PPTWriter::ImplGetText()
     982             : {
     983          61 :     mnTextSize = 0;
     984          61 :     mbFontIndependentLineSpacing = false;
     985         122 :     mXText = ::com::sun::star::uno::Reference<
     986             :         ::com::sun::star::text::XSimpleText >
     987          61 :             ( mXShape, ::com::sun::star::uno::UNO_QUERY );
     988             : 
     989          61 :     if ( mXText.is() )
     990             :     {
     991          51 :         mnTextSize = mXText->getString().getLength();
     992          51 :         ::com::sun::star::uno::Any aAny;
     993          51 :         if ( GetPropertyValue( aAny, mXPropSet, OUString( "FontIndependentLineSpacing" ), true ) )
     994          51 :             aAny >>= mbFontIndependentLineSpacing;
     995             :     }
     996          61 :     return ( mnTextSize != 0 );
     997             : }
     998             : 
     999           0 : void PPTWriter::ImplFlipBoundingBox( EscherPropertyContainer& rPropOpt )
    1000             : {
    1001           0 :     if ( mnAngle < 0 )
    1002           0 :         mnAngle = ( 36000 + mnAngle ) % 36000;
    1003             :     else
    1004           0 :         mnAngle = ( 36000 - ( mnAngle % 36000 ) );
    1005             : 
    1006           0 :     double  fCos = cos( (double)mnAngle * F_PI18000 );
    1007           0 :     double  fSin = sin( (double)mnAngle * F_PI18000 );
    1008             : 
    1009           0 :     double  fWidthHalf = maRect.GetWidth() / 2.0;
    1010           0 :     double  fHeightHalf = maRect.GetHeight() / 2.0;
    1011             : 
    1012           0 :     double  fXDiff = fCos * fWidthHalf + fSin * (-fHeightHalf);
    1013           0 :     double  fYDiff = - ( fSin * fWidthHalf - fCos * ( -fHeightHalf ) );
    1014             : 
    1015           0 :     maRect.Move( (sal_Int32)( -( fWidthHalf - fXDiff ) ), (sal_Int32)(  - ( fHeightHalf + fYDiff ) ) );
    1016           0 :     mnAngle *= 655;
    1017           0 :     mnAngle += 0x8000;
    1018           0 :     mnAngle &=~0xffff;                                  // round nAngle to full grads
    1019           0 :     rPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
    1020             : 
    1021           0 :     if ( ( mnAngle >= ( 45 << 16 ) && mnAngle < ( 135 << 16 ) ) ||
    1022           0 :             ( mnAngle >= ( 225 << 16 ) && mnAngle < ( 315 << 16 ) ) )
    1023             :     {
    1024             :         // Maddeningly, in those two areas of PPT is the BoundingBox already
    1025             :         // vertical. Therefore, we need to put down it BEFORE THE ROTATION.
    1026             :         ::com::sun::star::awt::Point
    1027           0 :             aTopLeft( (sal_Int32)( maRect.Left() + fWidthHalf - fHeightHalf ), (sal_Int32)( maRect.Top() + fHeightHalf - fWidthHalf ) );
    1028           0 :         const long nRotatedWidth(maRect.GetHeight());
    1029           0 :         const long nRotatedHeight(maRect.GetWidth());
    1030           0 :         const Size aNewSize(nRotatedWidth, nRotatedHeight);
    1031           0 :         maRect = Rectangle( Point( aTopLeft.X, aTopLeft.Y ), aNewSize );
    1032             :     }
    1033           0 : }
    1034             : 
    1035          35 : void PPTWriter::ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropertyContainer& rPropOpt )
    1036             : {
    1037          35 :     if ( !mbFontIndependentLineSpacing )
    1038             :     {
    1039          35 :         if ( rTextObj.ParagraphCount() )
    1040             :         {
    1041          35 :             ParagraphObj* pPara = rTextObj.GetParagraph(0);
    1042          35 :             if ( !pPara->empty() )
    1043             :             {
    1044          35 :                 const PortionObj& rPortion = pPara->front();
    1045          35 :                 sal_Int16 nLineSpacing = pPara->mnLineSpacing;
    1046          35 :                 const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
    1047          35 :                 if ( pDesc )
    1048          35 :                      nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
    1049             : 
    1050          35 :                 if ( ( nLineSpacing > 0 ) && ( nLineSpacing < 100 ) )
    1051             :                 {
    1052          35 :                     double fCharHeight = rPortion.mnCharHeight;
    1053          35 :                     fCharHeight *= 2540 / 72.0;
    1054          35 :                     fCharHeight *= 100 - nLineSpacing;
    1055          35 :                     fCharHeight /= 100;
    1056             : 
    1057          35 :                     sal_uInt32 nUpperDistance = 0;
    1058          35 :                     rPropOpt.GetOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
    1059          35 :                     nUpperDistance += static_cast< sal_uInt32 >( fCharHeight * 360.0 );
    1060          35 :                     rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
    1061             :                 }
    1062             :             }
    1063             :         }
    1064             :     }
    1065          35 : }
    1066             : 
    1067          32 : void PPTWriter::ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_uInt32 nAtomInstance,
    1068             :     TextRuleEntry* pTextRule, SvStream& rExtBuStr, EscherPropertyContainer* pPropOpt )
    1069             : {
    1070          32 :     PPTExParaSheet& rParaSheet = mpStyleSheet->GetParaSheet( nTextInstance );
    1071             : 
    1072          32 :     rOut.WriteUInt32( ( EPP_TextHeaderAtom << 16 ) | ( nAtomInstance << 4 ) ).WriteUInt32( 4 )
    1073          32 :         .WriteInt32( nTextInstance );
    1074             : 
    1075          32 :     if ( mbEmptyPresObj )
    1076          11 :         mnTextSize = 0;
    1077          32 :     if ( !mbEmptyPresObj )
    1078             :     {
    1079             :         ParagraphObj* pPara;
    1080          21 :         TextObjBinary aTextObj( mXText, nTextInstance, maFontCollection, (PPTExBulletProvider&)*this );
    1081             : 
    1082             :         // leaving out EPP_TextCharsAtom w/o text - still write out
    1083             :         // attribute info though
    1084          21 :         if ( mnTextSize )
    1085          21 :             aTextObj.Write( &rOut );
    1086             : 
    1087          21 :         if ( pPropOpt )
    1088          21 :             ImplAdjustFirstLineLineSpacing( aTextObj, *pPropOpt );
    1089             : 
    1090          21 :         sal_uInt32 nSize, nPos = rOut.Tell();
    1091             : 
    1092          21 :         rOut.WriteUInt32( EPP_StyleTextPropAtom << 16 ).WriteUInt32( 0 );
    1093          21 :         ImplWriteParagraphs( rOut, aTextObj );
    1094          21 :         ImplWritePortions( rOut, aTextObj );
    1095          21 :         nSize = rOut.Tell() - nPos;
    1096          21 :         rOut.SeekRel( - ( (sal_Int32)nSize - 4 ) );
    1097          21 :         rOut.WriteUInt32( nSize - 8 );
    1098          21 :         rOut.SeekRel( nSize - 8 );
    1099             : 
    1100          42 :         for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
    1101             :         {
    1102          21 :             pPara = aTextObj.GetParagraph(i);
    1103          42 :             for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
    1104             :             {
    1105          21 :                 const PortionObj& rPortion = *it;
    1106          21 :                 if ( rPortion.mpFieldEntry )
    1107             :                 {
    1108          21 :                     const FieldEntry* pFieldEntry = rPortion.mpFieldEntry;
    1109             : 
    1110          21 :                     switch ( pFieldEntry->nFieldType >> 28 )
    1111             :                     {
    1112             :                         case 1 :
    1113             :                         case 2 :
    1114             :                         {
    1115           0 :                             rOut.WriteUInt32( EPP_DateTimeMCAtom << 16 ).WriteUInt32( 8 )
    1116           0 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos )             // TxtOffset to TxtField;
    1117           0 :                                 .WriteUChar( ( pFieldEntry->nFieldType & 0xff ) )       // Type
    1118           0 :                                 .WriteUChar( 0 ).WriteUInt16( 0 );                      // PadBytes
    1119             :                         }
    1120           0 :                         break;
    1121             :                         case 3 :
    1122             :                         {
    1123           6 :                             rOut.WriteUInt32( EPP_SlideNumberMCAtom << 16 ).WriteUInt32( 4 )
    1124          12 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos );
    1125             :                         }
    1126           6 :                         break;
    1127             :                         case 4 :
    1128             :                         {
    1129           0 :                             sal_uInt32 nPageIndex = 0;
    1130           0 :                             OUString aPageUrl;
    1131           0 :                             OUString aFile( pFieldEntry->aFieldUrl );
    1132           0 :                             OUString aTarget( pFieldEntry->aFieldUrl );
    1133           0 :                             INetURLObject aUrl( pFieldEntry->aFieldUrl );
    1134           0 :                             if ( INetProtocol::File == aUrl.GetProtocol() )
    1135           0 :                                 aFile = aUrl.PathToFileName();
    1136           0 :                             else if ( INetProtocol::Smb == aUrl.GetProtocol() )
    1137             :                             {
    1138             :                                 // Convert smb notation to '\\' and skip the 'smb:' part
    1139           0 :                                 aFile = aUrl.GetMainURL(INetURLObject::NO_DECODE).copy(4);
    1140           0 :                                 aFile = aFile.replaceAll( "/", "\\" );
    1141           0 :                                 aTarget = aFile;
    1142             :                             }
    1143           0 :                             else if ( pFieldEntry->aFieldUrl.startsWith("#") )
    1144             :                             {
    1145           0 :                                 OUString aPage( INetURLObject::decode( pFieldEntry->aFieldUrl, INetURLObject::DECODE_WITH_CHARSET ) );
    1146           0 :                                 aPage = aPage.copy( 1 );
    1147             : 
    1148             :                                 std::vector<OUString>::const_iterator pIter = std::find(
    1149           0 :                                             maSlideNameList.begin(),maSlideNameList.end(),aPage);
    1150             : 
    1151           0 :                                 if ( pIter != maSlideNameList.end() )
    1152             :                                 {
    1153           0 :                                     nPageIndex = pIter - maSlideNameList.begin();
    1154           0 :                                     aPageUrl = OUString::number(256 + nPageIndex);
    1155           0 :                                     aPageUrl += ",";
    1156           0 :                                     aPageUrl += OUString::number(nPageIndex + 1);
    1157           0 :                                     aPageUrl += ",Slide ";
    1158           0 :                                     aPageUrl += OUString::number(nPageIndex + 1);
    1159           0 :                                 }
    1160             :                             }
    1161           0 :                             sal_uInt32 nHyperId(0);
    1162           0 :                             if ( !aPageUrl.isEmpty() )
    1163           0 :                                 nHyperId = ImplInsertBookmarkURL( aPageUrl, 1 | ( nPageIndex << 8 ) | ( 1U << 31 ), pFieldEntry->aRepresentation, "", "", aPageUrl );
    1164             :                             else
    1165           0 :                                 nHyperId = ImplInsertBookmarkURL( pFieldEntry->aFieldUrl, 2 | ( nHyperId << 8 ), aFile, aTarget, "", "" );
    1166             : 
    1167           0 :                             rOut.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 )
    1168           0 :                                 .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
    1169           0 :                                 .WriteUInt32( 0 )                                   // soundref
    1170           0 :                                 .WriteUInt32( nHyperId )                                        // hyperlink id
    1171           0 :                                 .WriteUChar( 4 )                                    // hyperlink action
    1172           0 :                                 .WriteUChar( 0 )                                    // ole verb
    1173           0 :                                 .WriteUChar( 0 )                                    // jump
    1174           0 :                                 .WriteUChar( 0 )                                    // flags
    1175           0 :                                 .WriteUChar( 8 )                                    // hyperlink type ?
    1176           0 :                                 .WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 )
    1177           0 :                                 .WriteUInt32( EPP_TxInteractiveInfoAtom << 16 ).WriteUInt32( 8 )
    1178           0 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos )
    1179           0 :                                 .WriteUInt32( pFieldEntry->nFieldEndPos );
    1180             :                         }
    1181           0 :                         break;
    1182             :                         case 5 :
    1183             :                         {
    1184           6 :                             rOut.WriteUInt32( EPP_GenericDateMCAtom << 16 ).WriteUInt32( 4 )
    1185          12 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos );
    1186             :                         }
    1187           6 :                         break;
    1188             :                         case 6 :
    1189             :                         {
    1190           3 :                             rOut.WriteUInt32( EPP_HeaderMCAtom << 16 ).WriteUInt32( 4 )
    1191           6 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos );
    1192             :                         }
    1193           3 :                         break;
    1194             :                         case 7 :
    1195             :                         {
    1196           6 :                             rOut.WriteUInt32( EPP_FooterMCAtom << 16 ).WriteUInt32( 4 )
    1197          12 :                                 .WriteUInt32( pFieldEntry->nFieldStartPos );
    1198             :                         }
    1199           6 :                         break;
    1200             :                         default:
    1201           0 :                         break;
    1202             :                     }
    1203             :                 }
    1204             :             }
    1205             :         }
    1206             : 
    1207          21 :         aTextObj.WriteTextSpecInfo( &rOut );
    1208             : 
    1209             :         // write Star Office Default TabSizes (if necessary)
    1210          21 :         if ( aTextObj.ParagraphCount() )
    1211             :         {
    1212          21 :             pPara = aTextObj.GetParagraph(0);
    1213          21 :             sal_uInt32  nParaFlags = 0x1f;
    1214             :             sal_Int16   nDepth, nMask, nNumberingRule[ 10 ];
    1215          21 :             sal_uInt32  nTextOfs = pPara->nTextOfs;
    1216          21 :             sal_uInt32  nTabs = pPara->maTabStop.getLength();
    1217          21 :             const ::com::sun::star::style::TabStop* pTabStop = pPara->maTabStop.getConstArray();
    1218             : 
    1219          42 :             for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
    1220             :             {
    1221          21 :                 pPara = aTextObj.GetParagraph(i);
    1222          21 :                 if ( pPara->bExtendedParameters )
    1223             :                 {
    1224           0 :                     nDepth = pPara->nDepth;
    1225           0 :                     if ( nDepth < 5 )
    1226             :                     {
    1227           0 :                         nMask = 1 << nDepth;
    1228           0 :                         if ( nParaFlags & nMask )
    1229             :                         {
    1230           0 :                             nParaFlags &=~ nMask;
    1231           0 :                             if ( ( rParaSheet.maParaLevel[ nDepth ].mnTextOfs != pPara->nTextOfs ) ||
    1232           0 :                                 ( rParaSheet.maParaLevel[ nDepth ].mnBulletOfs != pPara->nBulletOfs ) )
    1233             :                             {
    1234           0 :                                 nParaFlags |= nMask << 16;
    1235           0 :                                 nNumberingRule[ nDepth << 1 ] = pPara->nTextOfs;
    1236           0 :                                 nNumberingRule[ ( nDepth << 1 ) + 1 ] = (sal_Int16)pPara->nBulletOfs;
    1237             :                             }
    1238             :                         }
    1239             :                     }
    1240             :                 }
    1241             :             }
    1242          21 :             nParaFlags >>= 16;
    1243             : 
    1244          21 :             sal_Int32 nDefaultTabSizeSrc = 2011; // I've no idea where this number came from, honestly
    1245          21 :             const uno::Reference< beans::XPropertySet > xPropSet( mXModel, uno::UNO_QUERY );
    1246          21 :             if ( xPropSet.is() )
    1247             :             {
    1248          21 :                 if(ImplGetPropertyValue( xPropSet, OUString( "TabStop" ) ))
    1249             :                 {
    1250          21 :                     sal_Int32 nTabStop( 0 );
    1251          21 :                     if ( mAny >>= nTabStop )
    1252          21 :                         nDefaultTabSizeSrc = nTabStop;
    1253             :                 }
    1254             :             }
    1255          21 :             const sal_uInt32 nDefaultTabSize = MapSize( awt::Size( nDefaultTabSizeSrc, 1 ) ).Width;
    1256          21 :             sal_uInt32  nDefaultTabs = std::abs( maRect.GetWidth() ) / nDefaultTabSize;
    1257          21 :             if ( nTabs )
    1258           0 :                 nDefaultTabs -= (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 ) + nTextOfs ) / nDefaultTabSize );
    1259          21 :             if ( (sal_Int32)nDefaultTabs < 0 )
    1260           0 :                 nDefaultTabs = 0;
    1261             : 
    1262          21 :             sal_uInt32 nTabCount = nTabs + nDefaultTabs;
    1263          21 :             sal_uInt32 i, nTextRulerAtomFlags = 0;
    1264             : 
    1265          21 :             if ( nTabCount )
    1266          21 :                 nTextRulerAtomFlags |= 4;
    1267          21 :             if ( nParaFlags )
    1268           0 :                 nTextRulerAtomFlags |= ( ( nParaFlags << 3 ) | ( nParaFlags << 8 ) );
    1269             : 
    1270          21 :             if ( nTextRulerAtomFlags )
    1271             :             {
    1272          21 :                 SvStream* pRuleOut = &rOut;
    1273          21 :                 if ( pTextRule )
    1274           0 :                     pRuleOut = pTextRule->pOut = new SvMemoryStream( 0x100, 0x100 );
    1275             : 
    1276          21 :                 sal_uInt32 nRulePos = pRuleOut->Tell();
    1277          21 :                 pRuleOut->WriteUInt32( EPP_TextRulerAtom << 16 ).WriteUInt32( 0 );
    1278          21 :                 pRuleOut->WriteUInt32( nTextRulerAtomFlags );
    1279          21 :                 if ( nTextRulerAtomFlags & 4 )
    1280             :                 {
    1281          21 :                     pRuleOut->WriteUInt16( nTabCount );
    1282          21 :                     for ( i = 0; i < nTabs; i++ )
    1283             :                     {
    1284           0 :                         sal_uInt16 nPosition = (sal_uInt16)( ( pTabStop[ i ].Position / 4.40972 ) + nTextOfs );
    1285             :                         sal_uInt16 nType;
    1286           0 :                         switch ( pTabStop[ i ].Alignment )
    1287             :                         {
    1288           0 :                             case ::com::sun::star::style::TabAlign_DECIMAL :    nType = 3; break;
    1289           0 :                             case ::com::sun::star::style::TabAlign_RIGHT :      nType = 2; break;
    1290           0 :                             case ::com::sun::star::style::TabAlign_CENTER :     nType = 1; break;
    1291             : 
    1292             :                             case ::com::sun::star::style::TabAlign_LEFT :
    1293           0 :                             default:                                            nType = 0;
    1294             :                         };
    1295           0 :                         pRuleOut->WriteUInt16( nPosition )
    1296           0 :                                  .WriteUInt16( nType );
    1297             :                     }
    1298             : 
    1299          21 :                     sal_uInt32 nWidth = 1;
    1300          21 :                     if ( nTabs )
    1301           0 :                         nWidth += (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 + nTextOfs ) / nDefaultTabSize ) );
    1302          21 :                     nWidth *= nDefaultTabSize;
    1303         153 :                     for ( i = 0; i < nDefaultTabs; i++, nWidth += nDefaultTabSize )
    1304         132 :                         pRuleOut->WriteUInt32( nWidth );
    1305             :                 }
    1306         126 :                 for ( i = 0; i < 5; i++ )
    1307             :                 {
    1308         105 :                     if ( nTextRulerAtomFlags & ( 8 << i ) )
    1309           0 :                         pRuleOut->WriteInt16( nNumberingRule[ i << 1 ] );
    1310         105 :                     if ( nTextRulerAtomFlags & ( 256 << i ) )
    1311           0 :                         pRuleOut->WriteInt16( nNumberingRule[ ( i << 1 ) + 1 ] );
    1312             :                 }
    1313          21 :                 sal_uInt32 nBufSize = pRuleOut->Tell() - nRulePos;
    1314          21 :                 pRuleOut->SeekRel( - ( (sal_Int32)nBufSize - 4 ) );
    1315          21 :                 pRuleOut->WriteUInt32( nBufSize - 8 );
    1316          21 :                 pRuleOut->SeekRel( nBufSize - 8 );
    1317          21 :             }
    1318             :         }
    1319          21 :         if ( aTextObj.HasExtendedBullets() )
    1320             :         {
    1321           0 :             if ( aTextObj.ParagraphCount() )
    1322             :             {
    1323           0 :                 sal_uInt32  nNumberingType = 0, nPos2 = rExtBuStr.Tell();
    1324             : 
    1325           0 :                 rExtBuStr.WriteUInt32( EPP_PST_ExtendedParagraphAtom << 16 ).WriteUInt32( 0 );
    1326             : 
    1327           0 :                 for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
    1328             :                 {
    1329           0 :                     ParagraphObj* pBulletPara = aTextObj.GetParagraph(i);
    1330           0 :                     sal_uInt32  nBulletFlags = 0;
    1331           0 :                     sal_uInt16 nBulletId = pBulletPara->nBulletId;
    1332             : 
    1333           0 :                     if ( pBulletPara->bExtendedBulletsUsed )
    1334             :                     {
    1335           0 :                         nBulletFlags = 0x800000;
    1336           0 :                         if ( pBulletPara->nNumberingType != SVX_NUM_BITMAP )
    1337           0 :                             nBulletFlags = 0x3000000;
    1338             :                     }
    1339           0 :                     rExtBuStr.WriteUInt32( nBulletFlags );
    1340             : 
    1341           0 :                     if ( nBulletFlags & 0x800000 )
    1342           0 :                         rExtBuStr.WriteUInt16( nBulletId );
    1343           0 :                     if ( nBulletFlags & 0x1000000 )
    1344             :                     {
    1345           0 :                         switch( pBulletPara->nNumberingType )
    1346             :                         {
    1347             :                             case SVX_NUM_NUMBER_NONE :
    1348             :                             case SVX_NUM_CHAR_SPECIAL :
    1349           0 :                                 nNumberingType = 0;
    1350           0 :                             break;
    1351             :                             case SVX_NUM_CHARS_UPPER_LETTER :
    1352             :                             case SVX_NUM_CHARS_UPPER_LETTER_N :
    1353             :                             case SVX_NUM_CHARS_LOWER_LETTER :
    1354             :                             case SVX_NUM_CHARS_LOWER_LETTER_N :
    1355             :                             case SVX_NUM_ROMAN_UPPER :
    1356             :                             case SVX_NUM_ROMAN_LOWER :
    1357             :                             case SVX_NUM_ARABIC :
    1358             :                             case SVX_NUM_NUMBER_UPPER_ZH:
    1359             :                             case SVX_NUM_CIRCLE_NUMBER:
    1360             :                             case SVX_NUM_NUMBER_UPPER_ZH_TW:
    1361             :                             case SVX_NUM_NUMBER_LOWER_ZH:
    1362             :                             case SVX_NUM_FULL_WIDTH_ARABIC:
    1363           0 :                                 nNumberingType = pBulletPara->nMappedNumType;
    1364           0 :                             break;
    1365             : 
    1366             :                             case SVX_NUM_BITMAP :
    1367           0 :                                 nNumberingType = 0;
    1368           0 :                             break;
    1369             : 
    1370             :                         }
    1371           0 :                         rExtBuStr.WriteUInt32( nNumberingType );
    1372             :                     }
    1373           0 :                     if ( nBulletFlags & 0x2000000 )
    1374           0 :                         rExtBuStr.WriteUInt16( pBulletPara->nStartWith );
    1375           0 :                     rExtBuStr.WriteUInt32( 0 ).WriteUInt32( 0 );
    1376             :                 }
    1377           0 :                 sal_uInt32 nBulletSize = ( rExtBuStr.Tell() - nPos2 ) - 8;
    1378           0 :                 rExtBuStr.SeekRel( - ( (sal_Int32)nBulletSize + 4 ) );
    1379           0 :                 rExtBuStr.WriteUInt32( nBulletSize );
    1380           0 :                 rExtBuStr.SeekRel( nBulletSize );
    1381             :             }
    1382          21 :         }
    1383             :     }
    1384          32 : }
    1385             : 
    1386           0 : void PPTWriter::ImplWriteObjectEffect( SvStream& rSt,
    1387             :     ::com::sun::star::presentation::AnimationEffect eAe,
    1388             :     ::com::sun::star::presentation::AnimationEffect eTe,
    1389             :     sal_uInt16 nOrder )
    1390             : {
    1391           0 :     EscherExContainer aAnimationInfo( rSt, EPP_AnimationInfo );
    1392           0 :     EscherExAtom aAnimationInfoAtom( rSt, EPP_AnimationInfoAtom, 0, 1 );
    1393           0 :     sal_uInt32  nDimColor = 0x7000000;  // color to use for dimming
    1394           0 :     sal_uInt32  nFlags = 0x4400;        // set of flags that determine type of build
    1395           0 :     sal_uInt32  nSoundRef = 0;          // 0 if storage is from clipboard. Otherwise index(ID) in SoundCollection list.
    1396           0 :     sal_uInt32  nDelayTime = 0;         // delay before playing object
    1397           0 :     sal_uInt16  nSlideCount = 1;        // number of slides to play object
    1398           0 :     sal_uInt8   nBuildType = 1;         // type of build
    1399           0 :     sal_uInt8   nFlyMethod = 0;         // animation effect( fly, zoom, appear, etc )
    1400           0 :     sal_uInt8   nFlyDirection = 0;      // Animation direction( left, right, up, down, etc )
    1401           0 :     sal_uInt8   nAfterEffect = 0;       // what to do after build
    1402           0 :     sal_uInt8   nSubEffect = 0;         // build by word or letter
    1403           0 :     sal_uInt8   nOleVerb = 0;           // Determines object's class (sound, video, other)
    1404             : 
    1405           0 :     if ( eAe == ::com::sun::star::presentation::AnimationEffect_NONE )
    1406             :     {
    1407           0 :         nBuildType = 0;
    1408           0 :         eAe = eTe;
    1409             :     }
    1410           0 :     switch ( eAe )
    1411             :     {
    1412             :         case ::com::sun::star::presentation::AnimationEffect_NONE :
    1413           0 :         break;
    1414             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LEFT :
    1415             :         {
    1416           0 :             nFlyDirection = 2;
    1417           0 :             nFlyMethod = 10;
    1418             :         }
    1419           0 :         break;
    1420             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_TOP :
    1421             :         {
    1422           0 :             nFlyDirection = 3;
    1423           0 :             nFlyMethod = 10;
    1424             :         }
    1425           0 :         break;
    1426             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_RIGHT :
    1427             :         {
    1428           0 :             nFlyDirection = 0;
    1429           0 :             nFlyMethod = 10;
    1430             :         }
    1431           0 :         break;
    1432             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_BOTTOM :
    1433             :         {
    1434           0 :             nFlyDirection = 1;
    1435           0 :             nFlyMethod = 10;
    1436             :         }
    1437           0 :         break;
    1438             :         case ::com::sun::star::presentation::AnimationEffect_FADE_TO_CENTER :
    1439             :         {
    1440           0 :             nFlyDirection = 1;
    1441           0 :             nFlyMethod = 11;
    1442             :         }
    1443           0 :         break;
    1444             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_CENTER :
    1445             :         {
    1446           0 :             nFlyDirection = 0;
    1447           0 :             nFlyMethod = 11;
    1448             :         }
    1449           0 :         break;
    1450             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LEFT :
    1451             :         {
    1452           0 :             nFlyDirection = 0;
    1453           0 :             nFlyMethod = 12;
    1454             :         }
    1455           0 :         break;
    1456             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_TOP :
    1457             :         {
    1458           0 :             nFlyDirection = 1;
    1459           0 :             nFlyMethod = 12;
    1460             :         }
    1461           0 :         break;
    1462             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_RIGHT :
    1463             :         {
    1464           0 :             nFlyDirection = 2;
    1465           0 :             nFlyMethod = 12;
    1466             :         }
    1467           0 :         break;
    1468             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_BOTTOM :
    1469             :         {
    1470           0 :             nFlyDirection = 3;
    1471           0 :             nFlyMethod = 12;
    1472             :         }
    1473           0 :         break;
    1474             :         case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRIPES :
    1475             :         {
    1476           0 :             nFlyDirection = 0;
    1477           0 :             nFlyMethod = 2;
    1478             :         }
    1479           0 :         break;
    1480             :         case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRIPES :
    1481             :         {
    1482           0 :             nFlyDirection = 1;
    1483           0 :             nFlyMethod = 2;
    1484             :         }
    1485           0 :         break;
    1486             :         case ::com::sun::star::presentation::AnimationEffect_CLOCKWISE :
    1487             :         {
    1488           0 :             nFlyDirection = 1;
    1489           0 :             nFlyMethod = 3;
    1490             :         }
    1491           0 :         break;
    1492             :         case ::com::sun::star::presentation::AnimationEffect_COUNTERCLOCKWISE :
    1493             :         {
    1494           0 :             nFlyDirection = 0;
    1495           0 :             nFlyMethod = 3;
    1496             :         }
    1497           0 :         break;
    1498             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERLEFT :
    1499             :         {
    1500           0 :             nFlyDirection = 7;
    1501           0 :             nFlyMethod = 9;
    1502             :         }
    1503           0 :         break;
    1504             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERRIGHT :
    1505             :         {
    1506           0 :             nFlyDirection = 6;
    1507           0 :             nFlyMethod = 9;
    1508             :         }
    1509           0 :         break;
    1510             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERLEFT :
    1511             :         {
    1512           0 :             nFlyDirection = 5;
    1513           0 :             nFlyMethod = 9;
    1514             :         }
    1515           0 :         break;
    1516             :         case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERRIGHT :
    1517             :         {
    1518           0 :             nFlyDirection = 4;
    1519           0 :             nFlyMethod = 9;
    1520             :         }
    1521           0 :         break;
    1522             :         case ::com::sun::star::presentation::AnimationEffect_CLOSE_VERTICAL :
    1523             :         {
    1524           0 :             nFlyDirection = 1;
    1525           0 :             nFlyMethod = 13;
    1526             :         }
    1527           0 :         break;
    1528             :         case ::com::sun::star::presentation::AnimationEffect_CLOSE_HORIZONTAL :
    1529             :         {
    1530           0 :             nFlyDirection = 3;
    1531           0 :             nFlyMethod = 13;
    1532             :         }
    1533           0 :         break;
    1534             :         case ::com::sun::star::presentation::AnimationEffect_OPEN_VERTICAL :
    1535             :         {
    1536           0 :             nFlyDirection = 0;
    1537           0 :             nFlyMethod = 13;
    1538             :         }
    1539           0 :         break;
    1540             :         case ::com::sun::star::presentation::AnimationEffect_OPEN_HORIZONTAL :
    1541             :         {
    1542           0 :             nFlyDirection = 2;
    1543           0 :             nFlyMethod = 13;
    1544             :         }
    1545           0 :         break;
    1546             :         case ::com::sun::star::presentation::AnimationEffect_PATH :
    1547             :         {
    1548           0 :             nFlyDirection = 28;
    1549           0 :             nFlyMethod = 12;
    1550             :         }
    1551           0 :         break;
    1552             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LEFT :
    1553             :         {
    1554           0 :             nFlyDirection = 0;
    1555           0 :             nFlyMethod = 1;
    1556             :         }
    1557           0 :         break;
    1558             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_TOP :
    1559             :         {
    1560           0 :             nFlyDirection = 0;
    1561           0 :             nFlyMethod = 1;
    1562             :         }
    1563           0 :         break;
    1564             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_RIGHT :
    1565             :         {
    1566           0 :             nFlyDirection = 0;
    1567           0 :             nFlyMethod = 1;
    1568             :         }
    1569           0 :         break;
    1570             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_BOTTOM :
    1571             :         {
    1572           0 :             nFlyDirection = 0;
    1573           0 :             nFlyMethod = 1;
    1574             :         }
    1575           0 :         break;
    1576             :         case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_LEFT :
    1577             :         case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_RIGHT :
    1578             :         case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_LEFT :
    1579             :         case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_RIGHT :
    1580             :         {
    1581           0 :             nFlyDirection = 0x1c;
    1582           0 :             nFlyMethod = 0xc;
    1583             :         }
    1584           0 :         break;
    1585             :         case ::com::sun::star::presentation::AnimationEffect_DISSOLVE :
    1586             :         {
    1587           0 :             nFlyDirection = 0;
    1588           0 :             nFlyMethod = 5;
    1589             :         }
    1590           0 :         break;
    1591             :         case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_LEFT :
    1592             :         {
    1593           0 :             nFlyDirection = 2;
    1594           0 :             nFlyMethod = 10;
    1595             :         }
    1596           0 :         break;
    1597             :         case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_TOP :
    1598             :         {
    1599           0 :             nFlyDirection = 3;
    1600           0 :             nFlyMethod = 10;
    1601             :         }
    1602           0 :         break;
    1603             :         case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_RIGHT :
    1604             :         {
    1605           0 :             nFlyDirection = 0;
    1606           0 :             nFlyMethod = 10;
    1607             :         }
    1608           0 :         break;
    1609             :         case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_BOTTOM :
    1610             :         {
    1611           0 :             nFlyDirection = 1;
    1612           0 :             nFlyMethod = 10;
    1613             :         }
    1614           0 :         break;
    1615             :         case ::com::sun::star::presentation::AnimationEffect_RANDOM :
    1616             :         {
    1617           0 :             nFlyDirection = 0;
    1618           0 :             nFlyMethod = 1;
    1619             :         }
    1620           0 :         break;
    1621             :         case ::com::sun::star::presentation::AnimationEffect_VERTICAL_LINES :
    1622             :         {
    1623           0 :             nFlyDirection = 1;
    1624           0 :             nFlyMethod = 8;
    1625             :         }
    1626           0 :         break;
    1627             :         case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_LINES :
    1628             :         {
    1629           0 :             nFlyDirection = 0;
    1630           0 :             nFlyMethod = 8;
    1631             :         }
    1632           0 :         break;
    1633             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LEFT :
    1634             :         {
    1635           0 :             nFlyDirection = 2;
    1636           0 :             nFlyMethod = 10;
    1637             :         }
    1638           0 :         break;
    1639             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_TOP :
    1640             :         {
    1641           0 :             nFlyDirection = 3;
    1642           0 :             nFlyMethod = 10;
    1643             :         }
    1644           0 :         break;
    1645             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_RIGHT :
    1646             :         {
    1647           0 :             nFlyDirection = 0;
    1648           0 :             nFlyMethod = 10;
    1649             :         }
    1650           0 :         break;
    1651             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_BOTTOM :
    1652             :         {
    1653           0 :             nFlyDirection = 1;
    1654           0 :             nFlyMethod = 10;
    1655             :         }
    1656           0 :         break;
    1657             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERLEFT :
    1658             :         {
    1659           0 :             nFlyDirection = 7;
    1660           0 :             nFlyMethod = 9;
    1661             :         }
    1662           0 :         break;
    1663             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERRIGHT :
    1664             :         {
    1665           0 :             nFlyDirection = 6;
    1666           0 :             nFlyMethod = 9;
    1667             :         }
    1668           0 :         break;
    1669             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERLEFT :
    1670             :         {
    1671           0 :             nFlyDirection = 5;
    1672           0 :             nFlyMethod = 9;
    1673             :         }
    1674           0 :         break;
    1675             :         case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERRIGHT :
    1676             :         {
    1677           0 :             nFlyDirection = 4;
    1678           0 :             nFlyMethod = 9;
    1679             :         }
    1680           0 :         break;
    1681             :         case ::com::sun::star::presentation::AnimationEffect_APPEAR :
    1682           0 :         break;
    1683             :         case ::com::sun::star::presentation::AnimationEffect_HIDE :
    1684             :         {
    1685           0 :             nFlyDirection = 0;
    1686           0 :             nFlyMethod = 1;
    1687             :         }
    1688           0 :         break;
    1689             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERLEFT :
    1690             :         {
    1691           0 :             nFlyDirection = 4;
    1692           0 :             nFlyMethod = 12;
    1693             :         }
    1694           0 :         break;
    1695             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERRIGHT :
    1696             :         {
    1697           0 :             nFlyDirection = 5;
    1698           0 :             nFlyMethod = 12;
    1699             :         }
    1700           0 :         break;
    1701             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERRIGHT :
    1702             :         {
    1703           0 :             nFlyDirection = 7;
    1704           0 :             nFlyMethod = 12;
    1705             :         }
    1706           0 :         break;
    1707             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERLEFT :
    1708             :         {
    1709           0 :             nFlyDirection = 6;
    1710           0 :             nFlyMethod = 12;
    1711             :         }
    1712           0 :         break;
    1713             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERLEFT :
    1714             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERRIGHT :
    1715             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERRIGHT :
    1716             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERLEFT :
    1717           0 :             nAfterEffect |= 2;
    1718           0 :         break;
    1719             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LEFT :
    1720             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT :
    1721             :         {
    1722           0 :             nFlyDirection = 8;
    1723           0 :             nFlyMethod = 12;
    1724             :         }
    1725           0 :         break;
    1726             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_TOP :
    1727             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT :
    1728             :         {
    1729           0 :             nFlyDirection = 11;
    1730           0 :             nFlyMethod = 12;
    1731             :         }
    1732           0 :         break;
    1733             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_RIGHT :
    1734             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT :
    1735             :         {
    1736           0 :             nFlyDirection = 10;
    1737           0 :             nFlyMethod = 12;
    1738             :         }
    1739           0 :         break;
    1740             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_BOTTOM :
    1741             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT :
    1742             :         {
    1743           0 :             nFlyDirection = 9;
    1744           0 :             nFlyMethod = 12;
    1745             :         }
    1746           0 :         break;
    1747             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LEFT :
    1748             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERLEFT :
    1749             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_TOP :
    1750             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT :
    1751             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_RIGHT :
    1752             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT :
    1753             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_BOTTOM :
    1754             :         case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERLEFT :
    1755           0 :             nAfterEffect |= 2;
    1756           0 :         break;
    1757             :         case ::com::sun::star::presentation::AnimationEffect_VERTICAL_CHECKERBOARD :
    1758             :         {
    1759           0 :             nFlyDirection = 1;
    1760           0 :             nFlyMethod = 3;
    1761             :         }
    1762           0 :         break;
    1763             :         case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_CHECKERBOARD :
    1764             :         {
    1765           0 :             nFlyDirection = 0;
    1766           0 :             nFlyMethod = 3;
    1767             :         }
    1768           0 :         break;
    1769             :         case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_ROTATE :
    1770             :         case ::com::sun::star::presentation::AnimationEffect_VERTICAL_ROTATE :
    1771             :         {
    1772           0 :             nFlyDirection = 27;
    1773           0 :             nFlyMethod = 12;
    1774             :         }
    1775           0 :         break;
    1776             :         case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRETCH :
    1777             :         case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRETCH :
    1778             :         {
    1779           0 :             nFlyDirection = 22;
    1780           0 :             nFlyMethod = 12;
    1781             :         }
    1782           0 :         break;
    1783             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LEFT :
    1784             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERLEFT :
    1785             :         {
    1786           0 :             nFlyDirection = 23;
    1787           0 :             nFlyMethod = 12;
    1788             :         }
    1789           0 :         break;
    1790             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_TOP :
    1791             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERRIGHT :
    1792             :         {
    1793           0 :             nFlyDirection = 24;
    1794           0 :             nFlyMethod = 12;
    1795             :         }
    1796           0 :         break;
    1797             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_RIGHT :
    1798             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERRIGHT :
    1799             :         {
    1800           0 :             nFlyDirection = 25;
    1801           0 :             nFlyMethod = 12;
    1802             :         }
    1803           0 :         break;
    1804             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_BOTTOM :
    1805             :         case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERLEFT :
    1806             :         {
    1807           0 :             nFlyDirection = 26;
    1808           0 :             nFlyMethod = 12;
    1809             :         }
    1810           0 :         break;
    1811             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN :
    1812             :         {
    1813           0 :             nFlyDirection = 16;
    1814           0 :             nFlyMethod = 12;
    1815             :         }
    1816           0 :         break;
    1817             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SMALL :
    1818             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SPIRAL :
    1819             :         {
    1820           0 :             nFlyDirection = 17;
    1821           0 :             nFlyMethod = 12;
    1822             :         }
    1823           0 :         break;
    1824             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT :
    1825             :         {
    1826           0 :             nFlyDirection = 18;
    1827           0 :             nFlyMethod = 12;
    1828             :         }
    1829           0 :         break;
    1830             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SMALL :
    1831             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SPIRAL :
    1832             :         {
    1833           0 :             nFlyDirection = 19;
    1834           0 :             nFlyMethod = 12;
    1835             :         }
    1836           0 :         break;
    1837             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LEFT :
    1838             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERLEFT :
    1839             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_TOP :
    1840             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERRIGHT :
    1841             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_RIGHT :
    1842             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERRIGHT :
    1843             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_BOTTOM :
    1844             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERLEFT :
    1845             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_CENTER :
    1846             :         {
    1847           0 :             nFlyDirection = 16;
    1848           0 :             nFlyMethod = 12;
    1849             :         }
    1850           0 :         break;
    1851             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LEFT :
    1852             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERLEFT :
    1853             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_TOP :
    1854             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERRIGHT :
    1855             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_RIGHT :
    1856             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERRIGHT :
    1857             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_BOTTOM :
    1858             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERLEFT :
    1859             :         case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_CENTER :
    1860           0 :             nAfterEffect |= 2;
    1861           0 :             break;
    1862             :         default:
    1863           0 :             break;
    1864             :     }
    1865           0 :     if ( mnDiaMode >= 1 )
    1866           0 :         nFlags |= 4;
    1867           0 :     if ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
    1868           0 :         nBuildType = 2;
    1869           0 :     if ( ImplGetPropertyValue( OUString( "SoundOn" ) ) )
    1870             :     {
    1871           0 :         bool bBool(false);
    1872           0 :         mAny >>= bBool;
    1873           0 :         if ( bBool )
    1874             :         {
    1875           0 :             if ( ImplGetPropertyValue( OUString( "Sound" ) ) )
    1876             :             {
    1877           0 :                 nSoundRef = maSoundCollection.GetId( *static_cast<OUString const *>(mAny.getValue()) );
    1878           0 :                 if ( nSoundRef )
    1879           0 :                     nFlags |= 0x10;
    1880             :             }
    1881             :         }
    1882             :     }
    1883           0 :     bool bDimHide = false;
    1884           0 :     bool bDimPrevious = false;
    1885           0 :     if ( ImplGetPropertyValue( OUString( "DimHide" ) ) )
    1886           0 :         mAny >>= bDimHide;
    1887           0 :     if ( ImplGetPropertyValue( OUString( "DimPrevious" ) ) )
    1888           0 :         mAny >>= bDimPrevious;
    1889           0 :     if ( bDimPrevious )
    1890           0 :         nAfterEffect |= 1;
    1891           0 :     if ( bDimHide )
    1892           0 :         nAfterEffect |= 2;
    1893           0 :     if ( ImplGetPropertyValue( OUString( "DimColor" ) ) )
    1894           0 :         nDimColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(mAny.getValue()) ) | 0xfe000000;
    1895             : 
    1896           0 :     rSt.WriteUInt32( nDimColor ).WriteUInt32( nFlags ).WriteUInt32( nSoundRef ).WriteUInt32( nDelayTime )
    1897           0 :        .WriteUInt16( nOrder )                                   // order of build ( 1.. )
    1898           0 :        .WriteUInt16( nSlideCount ).WriteUChar( nBuildType ).WriteUChar( nFlyMethod ).WriteUChar( nFlyDirection )
    1899           0 :        .WriteUChar( nAfterEffect ).WriteUChar( nSubEffect ).WriteUChar( nOleVerb )
    1900           0 :        .WriteUInt16( 0 );                               // PadWord
    1901           0 : }
    1902             : 
    1903           0 : void PPTWriter::ImplWriteClickAction( SvStream& rSt, ::com::sun::star::presentation::ClickAction eCa, bool bMediaClickAction )
    1904             : {
    1905           0 :     sal_uInt32 nSoundRef = 0;   // a reference to a sound in the sound collection, or NULL.
    1906           0 :     sal_uInt32 nHyperLinkID = 0;// a persistent unique identifier to an external hyperlink object (only valid when action == HyperlinkAction).
    1907           0 :     sal_uInt8   nAction = 0;     // Action See Action Table
    1908           0 :     sal_uInt8   nOleVerb = 0;    // OleVerb Only valid when action == OLEAction. OLE verb to use, 0 = first verb, 1 = second verb, etc.
    1909           0 :     sal_uInt8   nJump = 0;       // Jump See Jump Table
    1910           0 :     sal_uInt8   nFlags = 0;      // Bit 1: Animated. If 1, then button is animated
    1911             :                             // Bit 2: Stop sound. If 1, then stop current sound when button is pressed.
    1912             :                             // Bit 3: CustomShowReturn. If 1, and this is a jump to custom show, then return to this slide after custom show.
    1913           0 :     sal_uInt8   nHyperLinkType = 0;// HyperlinkType a value from the LinkTo enum, such as LT_URL (only valid when action == HyperlinkAction).
    1914             : 
    1915           0 :     OUString aFile;
    1916             : 
    1917             :     /*
    1918             :         Action Table:       Action Value
    1919             :         NoAction            0
    1920             :         MacroAction         1
    1921             :         RunProgramAction    2
    1922             :         JumpAction          3
    1923             :         HyperlinkAction     4
    1924             :         OLEAction           5
    1925             :         MediaAction         6
    1926             :         CustomShowAction    7
    1927             : 
    1928             :         Jump Table:     Jump Value
    1929             :         NoJump          0
    1930             :         NextSlide,      1
    1931             :         PreviousSlide,  2
    1932             :         FirstSlide,     3
    1933             :         LastSlide,      4
    1934             :         LastSlideViewed 5
    1935             :         EndShow         6
    1936             :     */
    1937             : 
    1938           0 :     if ( bMediaClickAction )
    1939           0 :         nAction = 6;
    1940           0 :     else switch( eCa )
    1941             :     {
    1942             :         case ::com::sun::star::presentation::ClickAction_STOPPRESENTATION :
    1943           0 :             nJump += 2;
    1944             :             //fall-through
    1945             :         case ::com::sun::star::presentation::ClickAction_LASTPAGE :
    1946           0 :             nJump++;
    1947             :             //fall-through
    1948             :         case ::com::sun::star::presentation::ClickAction_FIRSTPAGE :
    1949           0 :             nJump++;
    1950             :             //fall-through
    1951             :         case ::com::sun::star::presentation::ClickAction_PREVPAGE :
    1952           0 :             nJump++;
    1953             :             //fall-through
    1954             :         case ::com::sun::star::presentation::ClickAction_NEXTPAGE :
    1955             :         {
    1956           0 :             nJump++;
    1957           0 :             nAction = 3;
    1958             :         }
    1959           0 :         break;
    1960             :         case ::com::sun::star::presentation::ClickAction_SOUND :
    1961             :         {
    1962           0 :             if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
    1963           0 :                 nSoundRef = maSoundCollection.GetId( *static_cast<OUString const *>(mAny.getValue()) );
    1964             :         }
    1965           0 :         break;
    1966             :         case ::com::sun::star::presentation::ClickAction_PROGRAM :
    1967             :         {
    1968           0 :             if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
    1969             :             {
    1970           0 :                 INetURLObject aUrl( *static_cast<OUString const *>(mAny.getValue()) );
    1971           0 :                 if ( INetProtocol::File == aUrl.GetProtocol() )
    1972             :                 {
    1973           0 :                     aFile = aUrl.PathToFileName();
    1974           0 :                     nAction = 2;
    1975           0 :                 }
    1976             :             }
    1977             :         }
    1978           0 :         break;
    1979             : 
    1980             :         case ::com::sun::star::presentation::ClickAction_BOOKMARK :
    1981             :         {
    1982           0 :             if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
    1983             :             {
    1984           0 :                 OUString  aBookmark( *static_cast<OUString const *>(mAny.getValue()) );
    1985           0 :                 sal_uInt32 nIndex = 0;
    1986           0 :                 std::vector<OUString>::const_iterator pIter;
    1987           0 :                 for ( pIter = maSlideNameList.begin(); pIter != maSlideNameList.end(); ++pIter, nIndex++ )
    1988             :                 {
    1989           0 :                     if ( *pIter == aBookmark )
    1990             :                     {
    1991             :                         // Bookmark is a link to a document page
    1992           0 :                         nAction = 4;
    1993           0 :                         nHyperLinkType = 7;
    1994             : 
    1995           0 :                         OUString aHyperString = OUString::number(256 + nIndex);
    1996           0 :                         aHyperString += ",";
    1997           0 :                         aHyperString += OUString::number(nIndex + 1);
    1998           0 :                         aHyperString += ",Slide ";
    1999           0 :                         aHyperString += OUString::number(nIndex + 1);
    2000           0 :                         nHyperLinkID = ImplInsertBookmarkURL( aHyperString, 1 | ( nIndex << 8 ) | ( 1U << 31 ), aBookmark, "", "", aHyperString );
    2001             :                     }
    2002           0 :                 }
    2003             :             }
    2004             :         }
    2005           0 :         break;
    2006             : 
    2007             :         case ::com::sun::star::presentation::ClickAction_DOCUMENT :
    2008             :         {
    2009           0 :             if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
    2010             :             {
    2011           0 :                 OUString aBookmark( *static_cast<OUString const *>(mAny.getValue()) );
    2012           0 :                 if ( !aBookmark.isEmpty() )
    2013             :                 {
    2014           0 :                     nAction = 4;
    2015           0 :                     nHyperLinkType = 8;
    2016             : 
    2017           0 :                     OUString aBookmarkFile( aBookmark );
    2018           0 :                     INetURLObject aUrl( aBookmark );
    2019           0 :                     if ( INetProtocol::File == aUrl.GetProtocol() )
    2020           0 :                         aBookmarkFile = aUrl.PathToFileName();
    2021           0 :                     nHyperLinkID = ImplInsertBookmarkURL( aBookmark, (sal_uInt32)(2 | ( 1U << 31 )), aBookmarkFile, aBookmark, "", "" );
    2022           0 :                 }
    2023             :             }
    2024             :         }
    2025           0 :         break;
    2026             : 
    2027             :         case ::com::sun::star::presentation::ClickAction_INVISIBLE :
    2028             :         case ::com::sun::star::presentation::ClickAction_VERB :
    2029             :         case ::com::sun::star::presentation::ClickAction_VANISH :
    2030             :         case ::com::sun::star::presentation::ClickAction_MACRO :
    2031             :         default :
    2032           0 :         break;
    2033             :     }
    2034             : 
    2035           0 :     sal_uInt32 nContainerSize = 24;
    2036           0 :     if ( nAction == 2 )
    2037           0 :         nContainerSize += ( aFile.getLength() * 2 ) + 8;
    2038           0 :     rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( nContainerSize )
    2039           0 :        .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
    2040           0 :        .WriteUInt32( nSoundRef )
    2041           0 :        .WriteUInt32( nHyperLinkID )
    2042           0 :        .WriteUChar( nAction )
    2043           0 :        .WriteUChar( nOleVerb )
    2044           0 :        .WriteUChar( nJump )
    2045           0 :        .WriteUChar( nFlags )
    2046           0 :        .WriteUInt32( nHyperLinkType );
    2047             : 
    2048           0 :     if ( nAction == 2 )     // run program Action
    2049             :     {
    2050           0 :         sal_Int32 nLen = aFile.getLength();
    2051           0 :         rSt.WriteUInt32( ( EPP_CString << 16 ) | 0x20 ).WriteUInt32( nLen * 2 );
    2052           0 :         for ( sal_Int32 i = 0; i < nLen; i++ )
    2053           0 :             rSt.WriteUInt16( aFile[i] );
    2054             :     }
    2055             : 
    2056           0 :     rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0x1f ).WriteUInt32( 24 )   // Mouse Over Action
    2057           0 :        .WriteUInt32( EPP_InteractiveInfo << 16 ).WriteUInt32( 16 );
    2058           0 :     for ( int i = 0; i < 4; i++, rSt.WriteUInt32( 0 ) ) ;
    2059           0 : }
    2060             : 
    2061          56 : bool PPTWriter::ImplGetEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPropSet,
    2062             :                                 ::com::sun::star::presentation::AnimationEffect& eEffect,
    2063             :                                 ::com::sun::star::presentation::AnimationEffect& eTextEffect,
    2064             :                                 bool& bIsSound )
    2065             : {
    2066          56 :     ::com::sun::star::uno::Any aAny;
    2067          56 :     if ( GetPropertyValue( aAny, rPropSet, OUString( "Effect" ) ) )
    2068          56 :         aAny >>= eEffect;
    2069             :     else
    2070           0 :         eEffect = ::com::sun::star::presentation::AnimationEffect_NONE;
    2071             : 
    2072          56 :     if ( GetPropertyValue( aAny, rPropSet, OUString( "TextEffect" ) ) )
    2073          56 :         aAny >>= eTextEffect;
    2074             :     else
    2075           0 :         eTextEffect = ::com::sun::star::presentation::AnimationEffect_NONE;
    2076          56 :     if ( GetPropertyValue( aAny, rPropSet, OUString( "SoundOn" ) ) )
    2077          56 :         aAny >>= bIsSound;
    2078             :     else
    2079           0 :         bIsSound = false;
    2080             : 
    2081          56 :     bool bHasEffect = ( ( eEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
    2082          56 :                         || ( eTextEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
    2083         112 :                         || bIsSound );
    2084          56 :     return bHasEffect;
    2085             : };
    2086             : 
    2087          37 : bool PPTWriter::ImplCreatePresentationPlaceholder( const bool bMasterPage, const PageType /* ePageType */,
    2088             :                                                    const sal_uInt32 nStyleInstance, const sal_uInt8 nPlaceHolderId )
    2089             : {
    2090          37 :     bool bRet = ImplGetText();
    2091          37 :     if ( bRet && bMasterPage )
    2092             :     {
    2093          27 :         mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2094          27 :         sal_uInt32 nPresShapeID = mpPptEscherEx->GenerateShapeId();
    2095          27 :         mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, nPresShapeID );// Flags: HaveAnchor | HasSpt
    2096          27 :         EscherPropertyContainer aPropOpt;
    2097          27 :         aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
    2098          27 :         aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
    2099          27 :         aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
    2100          27 :         aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
    2101          27 :         aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
    2102          27 :         aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
    2103          27 :         aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2104          27 :         sal_uInt32 nLineFlags = 0x90001;
    2105          27 :         if ( aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
    2106          27 :             nLineFlags |= 0x10001;  // draw dashed line if no line
    2107          27 :         aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
    2108             : 
    2109          54 :         SvMemoryStream  aExtBu( 0x200, 0x200 );
    2110          54 :         SvMemoryStream  aClientTextBox( 0x200, 0x200 );
    2111          27 :         ImplWriteTextStyleAtom( aClientTextBox, nStyleInstance, 0, NULL, aExtBu, &aPropOpt );
    2112             : 
    2113          27 :         aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2114          27 :         aPropOpt.CreateShapeProperties( mXShape );
    2115          27 :         aPropOpt.Commit( *mpStrm );
    2116          27 :         mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
    2117          27 :         mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() );      // oben, links, rechts, unten ????
    2118          27 :         mpPptEscherEx->OpenContainer( ESCHER_ClientData );
    2119          27 :         mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
    2120          27 :         mpStrm->WriteUInt32( 0 )                // PlacementID
    2121          54 :                .WriteUChar( nPlaceHolderId )    // PlaceHolderID
    2122          27 :                .WriteUChar( 0 )                 // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
    2123          27 :                .WriteUInt16( 0 );               // padword
    2124          27 :         mpPptEscherEx->CloseContainer();        // ESCHER_ClientData
    2125             : 
    2126          27 :         if ( aClientTextBox.Tell() )
    2127             :         {
    2128          27 :             mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
    2129          54 :                    .WriteUInt32( aClientTextBox.Tell() );
    2130             : 
    2131          27 :             mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
    2132             :         }
    2133          54 :         mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
    2134             :     }
    2135             :     else
    2136          10 :         bRet = false;
    2137          37 :     return bRet;
    2138             : }
    2139             : 
    2140          23 : void PPTWriter::ImplCreateShape( sal_uInt32 nType, sal_uInt32 nFlags, EscherSolverContainer& rSolver )
    2141             : {
    2142          23 :     sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
    2143          23 :     mpPptEscherEx->AddShape( nType, nFlags, nId );
    2144          23 :     rSolver.AddShape( mXShape, nId );
    2145          23 : }
    2146             : 
    2147          10 : void PPTWriter::ImplCreateTextShape( EscherPropertyContainer& rPropOpt, EscherSolverContainer& rSolver, bool bFill )
    2148             : {
    2149          10 :     mnTextStyle = EPP_TEXTSTYLE_TEXT;
    2150          10 :     mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2151          10 :     ImplCreateShape( ESCHER_ShpInst_TextBox, 0xa00, rSolver );
    2152          10 :     if ( bFill )
    2153          10 :         rPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2154          10 :     if ( ImplGetText() )
    2155           0 :         rPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2156          10 : }
    2157             : 
    2158          16 : void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& aSolverContainer, PageType ePageType, bool bMasterPage, int nPageNumber )
    2159             : {
    2160             :     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2161             :     // sal_uInt32  nGroupLevel = 0;
    2162             : 
    2163             :     sal_uInt32  nInstance, nGroups, nShapes, nShapeCount, nPer, nLastPer, nIndices, nOlePictureId;
    2164             :     sal_uInt16  nEffectCount;
    2165          16 :     ::com::sun::star::awt::Point   aTextRefPoint;
    2166             : 
    2167          16 :     ResetGroupTable( nShapes = mXShapes->getCount() );
    2168             : 
    2169          16 :     nIndices = nInstance = nLastPer = nShapeCount = nEffectCount = 0;
    2170             : 
    2171          16 :     bool bIsTitlePossible = true;           // powerpoint is not able to handle more than one title
    2172             : 
    2173          16 :     sal_uInt32  nOutlinerCount = 0;                 // the outline objects have to conform to the layout,
    2174          16 :     sal_uInt32  nPrevTextStyle = 0;                 // there are no more than two allowed
    2175             : 
    2176          16 :     nOlePictureId = 0;
    2177             : 
    2178          16 :     bool bAdditionalText = false;
    2179             : 
    2180          16 :     bool bSecOutl = false;
    2181          16 :     sal_uInt32 nPObjects = 0;
    2182             : 
    2183          16 :     SvMemoryStream* pClientTextBox = NULL;
    2184          16 :     SvMemoryStream* pClientData = NULL;
    2185             : 
    2186          88 :     while( GetNextGroupEntry() )
    2187             :     {
    2188          56 :         nShapeCount++;
    2189             : 
    2190          56 :         nPer = ( 5 * nShapeCount ) / nShapes;
    2191          56 :         if ( nPer != nLastPer )
    2192             :         {
    2193          53 :             nLastPer = nPer;
    2194          53 :             sal_uInt32 nValue = mnPagesWritten * 5 + nPer;
    2195          53 :             if ( nValue > mnStatMaxValue )
    2196          53 :                 nValue = mnStatMaxValue;
    2197          53 :             if ( mbStatusIndicator && ( nValue > mnLatestStatValue ) )
    2198             :             {
    2199           0 :                 mXStatusIndicator->setValue( nValue );
    2200           0 :                 mnLatestStatValue = nValue;
    2201             :             }
    2202             :         }
    2203          56 :         nGroups = GetGroupsClosed();
    2204          56 :         for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
    2205             : 
    2206          56 :         if ( GetShapeByIndex( GetCurrentGroupIndex(), true ) )
    2207             :         {
    2208             :             bool bIsSound;
    2209          56 :             bool bMediaClickAction = false;
    2210             :             ::com::sun::star::presentation::AnimationEffect eAe;
    2211             :             ::com::sun::star::presentation::AnimationEffect eTe;
    2212             : 
    2213          56 :             if ( ImplGetPropertyValue( OUString( "PresentationOrder" ) ) )
    2214          56 :                 nEffectCount = *static_cast<sal_uInt16 const *>(mAny.getValue());
    2215             : 
    2216          56 :             bool bEffect = ImplGetEffect( mXPropSet, eAe, eTe, bIsSound );
    2217          56 :             ::com::sun::star::presentation::ClickAction eCa = ::com::sun::star::presentation::ClickAction_NONE;
    2218          56 :             if ( ImplGetPropertyValue( OUString( "OnClick" ) ) )
    2219          56 :                 mAny >>= eCa;
    2220             : 
    2221          56 :             bool bGroup = mType == "drawing.Group";
    2222          56 :             bool bOpenBezier   = mType == "drawing.OpenBezier";
    2223          56 :             bool bClosedBezier = mType == "drawing.ClosedBezier";
    2224          56 :             bool bPolyPolygon  = mType == "drawing.PolyPolygon";
    2225          56 :             bool bPolyLine = mType == "drawing.PolyLine";
    2226             : 
    2227          56 :             const ::com::sun::star::awt::Size   aSize100thmm( mXShape->getSize() );
    2228          56 :             const ::com::sun::star::awt::Point  aPoint100thmm( mXShape->getPosition() );
    2229          56 :             Rectangle   aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) );
    2230          56 :             EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect100thmm );
    2231             : 
    2232          56 :             if ( bGroup )
    2233             :             {
    2234             :                 ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >
    2235           0 :                     aXIndexAccess( mXShape, ::com::sun::star::uno::UNO_QUERY );
    2236           0 :                 if ( EnterGroup( aXIndexAccess ) )
    2237             :                 {
    2238           0 :                     SvMemoryStream* pTmp = NULL;
    2239             : 
    2240           0 :                     if ( bEffect && !mbUseNewAnimations )
    2241             :                     {
    2242           0 :                         pTmp = new SvMemoryStream( 0x200, 0x200 );
    2243           0 :                         ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
    2244             :                     }
    2245           0 :                     if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
    2246             :                     {
    2247           0 :                         if ( !pTmp )
    2248           0 :                             pTmp = new SvMemoryStream( 0x200, 0x200 );
    2249           0 :                         ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
    2250             :                     }
    2251           0 :                     sal_uInt32 nShapeId = mpPptEscherEx->EnterGroup( &maRect, pTmp );
    2252           0 :                     aSolverContainer.AddShape( mXShape, nShapeId );
    2253           0 :                     delete pTmp;
    2254           0 :                 }
    2255             :             }
    2256             :             else
    2257             :             {
    2258          56 :                 bool bIsFontwork = false;
    2259          56 :                 bool bIsHatching = false;
    2260          56 :                 ::com::sun::star::uno::Any aAny;
    2261             :                 ::com::sun::star::drawing::FillStyle eFS;
    2262          56 :                 if ( GetPropertyValue( aAny, mXPropSet, OUString( "IsFontwork" ), true ) )
    2263          51 :                     aAny >>= bIsFontwork;
    2264          56 :                 if ( GetPropertyValue( aAny, mXPropSet, OUString( "FillStyle" ), true ) )
    2265             :                 {
    2266          51 :                     aAny >>= eFS;
    2267          51 :                     bIsHatching = eFS == ::com::sun::star::drawing::FillStyle_HATCH;
    2268             :                 }
    2269          56 :                 if ( bIsHatching || bIsFontwork || ( mType == "drawing.Measure" ) || ( mType == "drawing.Caption" ) )
    2270             :                 {
    2271           0 :                     if ( ImplGetPropertyValue( OUString( "BoundRect" ) ) )
    2272             :                     {
    2273           0 :                         ::com::sun::star::awt::Rectangle aRect( *static_cast<css::awt::Rectangle const *>(mAny.getValue()) );
    2274           0 :                         maPosition = MapPoint( ::com::sun::star::awt::Point( aRect.X, aRect.Y ) );
    2275           0 :                         maSize = MapSize( ::com::sun::star::awt::Size( aRect.Width, aRect.Height ) );
    2276           0 :                         maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
    2277             :                     }
    2278           0 :                     mType = "drawing.dontknow";
    2279          56 :                 }
    2280             :             }
    2281          56 :             sal_uInt8 nPlaceHolderAtom = EPP_PLACEHOLDER_NONE;
    2282             : 
    2283          56 :             mnTextSize = 0;
    2284          56 :             mnTextStyle = EPP_TEXTSTYLE_NORMAL;
    2285             : 
    2286          56 :             if ( mType == "drawing.Custom" )
    2287             :             {
    2288           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2289             :                 sal_uInt32 nMirrorFlags;
    2290           0 :                 OUString sCustomShapeType;
    2291           0 :                 MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType( mXShape, nMirrorFlags, sCustomShapeType );
    2292           0 :                 if ( sCustomShapeType == "col-502ad400" || sCustomShapeType == "col-60da8460" )
    2293             :                 {   // sj: creating metafile for customshapes that can't be saved to ms format properly
    2294           0 :                     ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
    2295           0 :                     if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false ) )
    2296             :                     {
    2297           0 :                         aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    2298           0 :                         SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
    2299           0 :                         if ( pObj )
    2300             :                         {
    2301           0 :                             Rectangle aBound = pObj->GetCurrentBoundRect();
    2302           0 :                             maPosition = MapPoint( ::com::sun::star::awt::Point( aBound.Left(), aBound.Top() ) );
    2303           0 :                             maSize = MapSize( ::com::sun::star::awt::Size ( aBound.GetWidth(), aBound.GetHeight() ) );
    2304           0 :                             maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
    2305           0 :                             mnAngle = 0;
    2306             :                         }
    2307             :                     }
    2308             :                 }
    2309             :                 else
    2310             :                 {
    2311           0 :                     ImplCreateShape( eShapeType, nMirrorFlags | 0xa00, aSolverContainer );
    2312           0 :                     aPropOpt.CreateCustomShapeProperties( eShapeType, mXShape );
    2313           0 :                     aPropOpt.CreateFillProperties( mXPropSet, true, mXShape);
    2314           0 :                     if ( ImplGetText() )
    2315             :                     {
    2316           0 :                         if ( !aPropOpt.IsFontWork() )
    2317           0 :                             aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, true, true );
    2318             :                     }
    2319           0 :                 }
    2320             :             }
    2321          56 :             else if ( mType == "drawing.Rectangle" )
    2322             :             {
    2323           0 :                 sal_Int32 nRadius = 0;
    2324           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2325           0 :                 if ( ImplGetPropertyValue( OUString( "CornerRadius" ) ) )
    2326             :                 {
    2327           0 :                     mAny >>= nRadius;
    2328           0 :                     nRadius = MapSize( ::com::sun::star::awt::Size( nRadius, 0 ) ).Width;
    2329             :                 }
    2330           0 :                 if ( nRadius )
    2331             :                 {
    2332           0 :                     ImplCreateShape( ESCHER_ShpInst_RoundRectangle, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
    2333           0 :                     sal_Int32 nLength = maRect.GetWidth();
    2334           0 :                     if ( nLength > maRect.GetHeight() )
    2335           0 :                         nLength = maRect.GetHeight();
    2336           0 :                     nLength >>= 1;
    2337           0 :                     if ( nRadius >= nLength )
    2338           0 :                         nRadius = 0x2a30;                           // 0x2a30 ist PPTs maximum radius
    2339             :                     else
    2340           0 :                         nRadius = ( 0x2a30 * nRadius ) / nLength;
    2341           0 :                     aPropOpt.AddOpt( ESCHER_Prop_adjustValue, nRadius );
    2342             :                 }
    2343             :                 else
    2344             :                 {
    2345           0 :                     ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer );          // Flags: Connector | HasSpt
    2346             :                 }
    2347           0 :                 aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2348           0 :                 if ( ImplGetText() )
    2349           0 :                     aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
    2350             :             }
    2351          56 :             else if ( mType == "drawing.Ellipse" )
    2352             :             {
    2353           0 :                 ::com::sun::star::drawing::CircleKind  eCircleKind( ::com::sun::star::drawing::CircleKind_FULL );
    2354           0 :                 PolyStyle ePolyKind = POLY_CHORD;
    2355           0 :                 if ( ImplGetPropertyValue( OUString( "CircleKind" ) ) )
    2356             :                 {
    2357           0 :                     mAny >>= eCircleKind;
    2358           0 :                     switch ( eCircleKind )
    2359             :                     {
    2360             :                         case ::com::sun::star::drawing::CircleKind_SECTION :
    2361             :                         {
    2362           0 :                             ePolyKind = POLY_PIE;
    2363             :                         }
    2364           0 :                         break;
    2365             :                         case ::com::sun::star::drawing::CircleKind_ARC :
    2366             :                         {
    2367           0 :                             ePolyKind = POLY_ARC;
    2368             :                         }
    2369           0 :                         break;
    2370             : 
    2371             :                         case ::com::sun::star::drawing::CircleKind_CUT :
    2372             :                         {
    2373           0 :                             ePolyKind = POLY_CHORD;
    2374             :                         }
    2375           0 :                         break;
    2376             : 
    2377             :                         default:
    2378           0 :                             eCircleKind = ::com::sun::star::drawing::CircleKind_FULL;
    2379             :                     }
    2380             :                 }
    2381           0 :                 if ( eCircleKind == ::com::sun::star::drawing::CircleKind_FULL )
    2382             :                 {
    2383           0 :                     mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2384           0 :                     ImplCreateShape( ESCHER_ShpInst_Ellipse, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
    2385           0 :                     aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2386           0 :                     if ( ImplGetText() )
    2387           0 :                         aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
    2388             :                 }
    2389             :                 else
    2390             :                 {
    2391             :                     sal_Int32 nStartAngle, nEndAngle;
    2392           0 :                     if ( !ImplGetPropertyValue( OUString( "CircleStartAngle" ) ) )
    2393           0 :                         continue;
    2394           0 :                     nStartAngle = *static_cast<sal_Int32 const *>(mAny.getValue());
    2395           0 :                     if( !ImplGetPropertyValue( OUString( "CircleEndAngle" ) ) )
    2396           0 :                         continue;
    2397           0 :                     nEndAngle = *static_cast<sal_Int32 const *>(mAny.getValue());
    2398           0 :                     ::com::sun::star::awt::Point aPoint( mXShape->getPosition() );
    2399           0 :                     ::com::sun::star::awt::Size  aSize( mXShape->getSize() );
    2400           0 :                     ::com::sun::star::awt::Point aStart, aEnd, aCenter;
    2401           0 :                     Rectangle aRect( Point( aPoint.X, aPoint.Y ), Size( aSize.Width, aSize.Height ) );
    2402           0 :                     aStart.X = (sal_Int32)( ( cos( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
    2403           0 :                     aStart.Y = - (sal_Int32)( ( sin( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
    2404           0 :                     aEnd.X = (sal_Int32)( ( cos( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
    2405           0 :                     aEnd.Y = - (sal_Int32)( ( sin( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
    2406           0 :                     aCenter.X = aPoint.X + ( aSize.Width / 2 );
    2407           0 :                     aCenter.Y = aPoint.Y + ( aSize.Height / 2 );
    2408           0 :                     aStart.X += aCenter.X;
    2409           0 :                     aStart.Y += aCenter.Y;
    2410           0 :                     aEnd.X += aCenter.X;
    2411           0 :                     aEnd.Y += aCenter.Y;
    2412           0 :                     Polygon aPolygon( aRect, Point( aStart.X, aStart.Y ), Point( aEnd.X, aEnd.Y ), ePolyKind );
    2413           0 :                     bool bNeedText = true;
    2414           0 :                     if ( mnAngle )
    2415             :                     {
    2416           0 :                         aPolygon.Rotate( aRect.TopLeft(), (sal_uInt16)( mnAngle / 10 ) );
    2417           0 :                         if ( ImplGetText() )
    2418             :                         {
    2419             :                             // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2420             :                             // mpPptEscherEx->EnterGroup( 0,0 );
    2421             :                             // nGroupLevel = mpPptEscherEx->GetGroupLevel();
    2422           0 :                             bNeedText = false;
    2423           0 :                             bAdditionalText = true;
    2424           0 :                             mnTextSize = 0;
    2425             :                         }
    2426           0 :                         mnAngle = 0;
    2427             :                     }
    2428           0 :                     mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2429           0 :                     ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );       // Flags: Connector | HasSpt
    2430           0 :                     ::com::sun::star::awt::Rectangle aNewRect;
    2431           0 :                     switch ( ePolyKind )
    2432             :                     {
    2433             :                         case POLY_PIE :
    2434             :                         case POLY_CHORD :
    2435             :                         {
    2436           0 :                             if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect, &aPolygon ) )
    2437           0 :                                 aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2438             :                         }
    2439           0 :                         break;
    2440             : 
    2441             :                         case POLY_ARC :
    2442             :                         {
    2443           0 :                             if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect, &aPolygon ) )
    2444           0 :                                 aPropOpt.CreateLineProperties( mXPropSet, false );
    2445             :                         }
    2446           0 :                         break;
    2447             :                     }
    2448           0 :                     maRect = MapRectangle( aNewRect );
    2449           0 :                     maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2450           0 :                     maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2451           0 :                     if ( bNeedText && ImplGetText() )
    2452           0 :                         aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
    2453             :                 }
    2454             :             }
    2455          56 :             else if ( mType == "drawing.Control" )
    2456             :             {
    2457             :                 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XControlShape  >
    2458           0 :                     aXControlShape( mXShape, ::com::sun::star::uno::UNO_QUERY );
    2459           0 :                 if ( !aXControlShape.is() )
    2460           0 :                     continue;
    2461             :                 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >
    2462           0 :                     aXControlModel( aXControlShape->getControl() );
    2463           0 :                 if ( !aXControlModel.is() )
    2464           0 :                     continue;
    2465             : 
    2466           0 :                 sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
    2467             :                 try
    2468             :                 {
    2469             :                     // try to get the aspect when available
    2470             :                     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
    2471           0 :                         xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
    2472           0 :                     xShapeProps->getPropertyValue("Aspect") >>= nAspect;
    2473             :                 }
    2474           0 :                 catch( ::com::sun::star::uno::Exception& )
    2475             :                 {}
    2476             : 
    2477           0 :                 mpExEmbed->WriteUInt32( 0xf | ( EPP_ExControl << 16 ) )
    2478           0 :                            .WriteUInt32( 0 );               // Size of this container
    2479             : 
    2480           0 :                 sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
    2481             : 
    2482           0 :                 sal_uInt32 nPageId = nPageNumber;
    2483           0 :                 if ( ePageType == MASTER )
    2484           0 :                     nPageId |= 0x80000000;
    2485             :                 else
    2486           0 :                     nPageId += 0x100;
    2487           0 :                 mpExEmbed->WriteUInt32( EPP_ExControlAtom << 16 )
    2488           0 :                            .WriteUInt32( 4 )
    2489           0 :                            .WriteUInt32( nPageId );
    2490           0 :                 PPTExOleObjEntry* pEntry = new PPTExOleObjEntry( OCX_CONTROL, mpExEmbed->Tell() );
    2491           0 :                 pEntry->xControlModel = aXControlModel;
    2492           0 :                 pEntry->xShape = mXShape;
    2493           0 :                 maExOleObj.push_back( pEntry );
    2494             : 
    2495           0 :                 mnExEmbed++;
    2496             : 
    2497           0 :                 mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
    2498           0 :                            .WriteUInt32( 24 )
    2499           0 :                            .WriteUInt32( nAspect )
    2500           0 :                            .WriteUInt32( 2 )
    2501           0 :                            .WriteUInt32( mnExEmbed )
    2502           0 :                            .WriteUInt32( 0 )
    2503           0 :                            .WriteUInt32( 4 )    // index to the persist table
    2504           0 :                            .WriteUInt32( 0x0012de00 );
    2505             : 
    2506           0 :                 ::com::sun::star::awt::Size     aSize;
    2507           0 :                 OUString          aControlName;
    2508           0 :                 tools::SvRef<SotStorage>    xTemp( new SotStorage( new SvMemoryStream(), true ) );
    2509           0 :                 if ( oox::ole::MSConvertOCXControls::WriteOCXStream( mXModel, xTemp, aXControlModel, aSize, aControlName ) )
    2510             :                 {
    2511           0 :                     OUString aUserName( xTemp->GetUserName() );
    2512           0 :                     OUString aOleIdentifier;
    2513           0 :                     if ( !aUserName.isEmpty() )
    2514             :                     {
    2515             :                         tools::SvRef<SotStorageStream> xCompObj = xTemp->OpenSotStream(
    2516             :                             OUString( "\1CompObj" ),
    2517           0 :                                 StreamMode::READ | StreamMode::NOCREATE | StreamMode::SHARE_DENYALL );
    2518           0 :                         sal_uInt32 const nStreamLen = xCompObj->remainingSize();
    2519             :                         sal_Int16   nVersion, nByteOrder;
    2520             :                         sal_Int32   nWinVersion, nVal, nStringLen;
    2521           0 :                         xCompObj->ReadInt16( nVersion )
    2522           0 :                                  .ReadInt16( nByteOrder )
    2523           0 :                                  .ReadInt32( nWinVersion )
    2524           0 :                                  .ReadInt32( nVal );
    2525           0 :                         xCompObj->SeekRel( 16 );    // skipping clsid
    2526           0 :                         xCompObj->ReadInt32( nStringLen );
    2527           0 :                         if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
    2528             :                         {
    2529           0 :                             xCompObj->SeekRel( nStringLen );        // now skipping the UserName;
    2530           0 :                             xCompObj->ReadInt32( nStringLen );
    2531           0 :                             if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
    2532             :                             {
    2533           0 :                                 xCompObj->SeekRel( nStringLen );    // now skipping the clipboard formatname
    2534           0 :                                 xCompObj->ReadInt32( nStringLen );
    2535           0 :                                 if ( ( nStringLen > 1 ) && ( ( xCompObj->Tell() + nStringLen ) < nStreamLen ) )
    2536             :                                 {   // i think that the OleIdentifier will follow
    2537           0 :                                     OString aTemp = read_uInt8s_ToOString(*xCompObj, nStringLen - 1);
    2538           0 :                                     aOleIdentifier = OStringToOUString(aTemp, RTL_TEXTENCODING_MS_1252);
    2539             :                                 }
    2540             :                             }
    2541           0 :                         }
    2542             :                     }
    2543             : 
    2544           0 :                     PPTWriter::WriteCString( *mpExEmbed, aControlName, 1 );
    2545           0 :                     PPTWriter::WriteCString( *mpExEmbed, aOleIdentifier, 2 );
    2546           0 :                     PPTWriter::WriteCString( *mpExEmbed, aUserName, 3 );
    2547             :                 }
    2548           0 :                 nSize = mpExEmbed->Tell() - nOldPos;
    2549           0 :                 mpExEmbed->Seek( nOldPos - 4 );
    2550           0 :                 mpExEmbed->WriteUInt32( nSize );
    2551           0 :                 mpExEmbed->Seek( STREAM_SEEK_TO_END );
    2552           0 :                 nOlePictureId = mnExEmbed;
    2553             : 
    2554           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2555           0 :                 sal_uInt32 nSpFlags = SHAPEFLAG_HAVESPT | SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_OLESHAPE;
    2556           0 :                 ImplCreateShape( ESCHER_ShpInst_HostControl, nSpFlags, aSolverContainer );
    2557           0 :                 if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false  ) )
    2558           0 :                     aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    2559             :                 //export form control graphic
    2560           0 :                 else if ( aPropOpt.CreateBlipPropertiesforOLEControl(mXPropSet,mXShape))
    2561           0 :                     aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    2562           0 :                 aPropOpt.AddOpt( ESCHER_Prop_pictureId, mnExEmbed );
    2563           0 :                 aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );
    2564             : 
    2565           0 :                 if ( !aControlName.isEmpty() )
    2566             :                 {
    2567             :                     sal_uInt16 i, nBufSize;
    2568           0 :                     nBufSize = ( aControlName.getLength() + 1 ) << 1;
    2569           0 :                     sal_uInt8* pBuf = new sal_uInt8[ nBufSize ];
    2570           0 :                     sal_uInt8* pTmp = pBuf;
    2571           0 :                     for ( i = 0; i < aControlName.getLength(); i++ )
    2572             :                     {
    2573           0 :                         sal_Unicode nUnicode = *(aControlName.getStr() + i);
    2574           0 :                         *pTmp++ = (sal_uInt8)nUnicode;
    2575           0 :                         *pTmp++ = (sal_uInt8)( nUnicode >> 8 );
    2576             :                     }
    2577           0 :                     *pTmp++ = 0;
    2578           0 :                     *pTmp = 0;
    2579           0 :                     aPropOpt.AddOpt( ESCHER_Prop_wzName, true, nBufSize, pBuf, nBufSize );
    2580           0 :                 }
    2581             :             }
    2582          56 :             else if ( mType == "drawing.Connector" )
    2583             :             {
    2584             :                 sal_uInt16 nSpType, nSpFlags;
    2585           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2586           0 :                 if ( !aPropOpt.CreateConnectorProperties( mXShape, aSolverContainer, aNewRect, nSpType, nSpFlags ) )
    2587           0 :                     continue;
    2588             : 
    2589           0 :                 maRect = MapRectangle( aNewRect );
    2590           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2591           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2592             : 
    2593           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2594           0 :                 ImplCreateShape( nSpType, nSpFlags, aSolverContainer );
    2595             : 
    2596             :                 // #119459# for connector shape, the start point and end point is fixed, and should not be rotated.
    2597           0 :                 mnAngle = 0;
    2598             :             }
    2599          56 :             else if ( mType == "drawing.Measure" )
    2600             :             {
    2601           0 :                 continue;
    2602             :             }
    2603          56 :             else if ( mType == "drawing.Line" )
    2604             :             {
    2605           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2606           0 :                 aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_LINE, false, aNewRect, NULL );
    2607           0 :                 maRect = MapRectangle( aNewRect );
    2608           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2609           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2610           0 :                 if ( ImplGetText() )
    2611             :                 {
    2612           0 :                     aTextRefPoint = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2613           0 :                     mnTextSize = 0;
    2614           0 :                     bAdditionalText = true;
    2615             :                     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2616             :                     // mpPptEscherEx->EnterGroup( &maRect,0 );
    2617             :                 }
    2618           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2619           0 :                 sal_uInt32 nFlags = 0xa00;                                  // Flags: Connector | HasSpt
    2620           0 :                 if ( maRect.Top() > maRect.Bottom() )
    2621           0 :                     nFlags |= 0x80;                                         // Flags: VertMirror
    2622           0 :                 if ( maRect.Left() > maRect.Right() )
    2623           0 :                     nFlags |= 0x40;                                         // Flags: HorzMirror
    2624             : 
    2625           0 :                 ImplCreateShape( ESCHER_ShpInst_Line, nFlags, aSolverContainer );
    2626           0 :                 aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
    2627           0 :                 aPropOpt.CreateLineProperties( mXPropSet, false );
    2628           0 :                 mnAngle = 0;
    2629             :             }
    2630          56 :             else if ( bPolyPolygon )
    2631             :             {
    2632           0 :                 if ( ImplGetText() )
    2633             :                 {
    2634             :                     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2635             :                     // mpPptEscherEx->EnterGroup( 0,0 );
    2636             :                     // nGroupLevel = mpPptEscherEx->GetGroupLevel();
    2637           0 :                     bAdditionalText = true;
    2638           0 :                     mnTextSize = 0;
    2639             :                 }
    2640           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2641           0 :                 ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
    2642           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2643           0 :                 aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect, NULL );
    2644           0 :                 maRect = MapRectangle( aNewRect );
    2645           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2646           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2647           0 :                 aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2648           0 :                 mnAngle = 0;
    2649             :             }
    2650          56 :             else if ( bPolyLine )
    2651             :             {
    2652           0 :                 if ( ImplGetText() )
    2653             :                 {
    2654             :                     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2655             :                     // mpPptEscherEx->EnterGroup( 0,0 );
    2656             :                     // nGroupLevel = mpPptEscherEx->GetGroupLevel();
    2657           0 :                     bAdditionalText = true;
    2658           0 :                     mnTextSize = 0;
    2659             :                 }
    2660           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2661           0 :                 ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
    2662           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2663           0 :                 aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect, NULL );
    2664           0 :                 maRect = MapRectangle( aNewRect );
    2665           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2666           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2667           0 :                 aPropOpt.CreateLineProperties( mXPropSet, false );
    2668           0 :                 mnAngle = 0;
    2669             :             }
    2670          56 :             else if ( bOpenBezier )
    2671             :             {
    2672           0 :                 if ( ImplGetText() )
    2673             :                 {
    2674             :                     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2675             :                     // mpPptEscherEx->EnterGroup( 0,0 );
    2676             :                     // nGroupLevel = mpPptEscherEx->GetGroupLevel();
    2677           0 :                     bAdditionalText = true;
    2678           0 :                     mnTextSize = 0;
    2679             :                 }
    2680           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2681           0 :                 ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
    2682           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2683           0 :                 aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, true, aNewRect, NULL );
    2684           0 :                 maRect = MapRectangle( aNewRect );
    2685           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2686           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2687           0 :                 aPropOpt.CreateLineProperties( mXPropSet, false );
    2688           0 :                 mnAngle = 0;
    2689             :             }
    2690          56 :             else if ( bClosedBezier )
    2691             :             {
    2692           0 :                 if ( ImplGetText() )
    2693             :                 {
    2694             :                     // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    2695             :                     // mpPptEscherEx->EnterGroup( 0,0 );
    2696             :                     // nGroupLevel = mpPptEscherEx->GetGroupLevel();
    2697           0 :                     bAdditionalText = true;
    2698           0 :                     mnTextSize = 0;
    2699             :                 }
    2700           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2701           0 :                 ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer );            // Flags: Connector | HasSpt
    2702           0 :                 ::com::sun::star::awt::Rectangle aNewRect;
    2703           0 :                 aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, true, aNewRect, NULL );
    2704           0 :                 maRect = MapRectangle( aNewRect );
    2705           0 :                 maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
    2706           0 :                 maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
    2707           0 :                 aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2708           0 :                 mnAngle = 0;
    2709             :             }
    2710          56 :             else if ( ( mType == "drawing.GraphicObject" ) || ( mType == "presentation.GraphicObject" ) )
    2711             :             {
    2712           5 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2713             : 
    2714             :                 // a GraphicObject can also be a ClickMe element
    2715           5 :                 if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
    2716             :                 {
    2717           0 :                     nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
    2718           0 :                     ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );           // Flags: HaveAnchor | HaveMaster
    2719           0 :                     aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
    2720           0 :                     aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
    2721           0 :                     aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
    2722           0 :                     aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
    2723             :                 }
    2724             :                 else
    2725             :                 {
    2726          10 :                     mXText = ::com::sun::star::uno::Reference<
    2727             :                         ::com::sun::star::text::XSimpleText >
    2728           5 :                             ( mXShape, ::com::sun::star::uno::UNO_QUERY );
    2729             : 
    2730           5 :                     if ( mXText.is() )
    2731           5 :                         mnTextSize = mXText->getString().getLength();
    2732             : 
    2733           5 :                     if ( mnTextSize )                                       // graphic object or area fill
    2734             :                     {
    2735             :                         /* SJ #i34951#: because M. documents are not allowing GraphicObjects containing text, we
    2736             :                         have to create a simple Rectangle with fill bitmap instead (while not allowing BitmapMode_Repeat).
    2737             :                         */
    2738           0 :                         ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer );       // Flags: Connector | HasSpt
    2739           0 :                         if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "GraphicURL" ), true, true, false ) )
    2740             :                         {
    2741           0 :                             aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
    2742           0 :                             aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
    2743           0 :                             aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
    2744           0 :                             aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x8000000 );
    2745           0 :                             aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
    2746           0 :                             if ( ImplGetText() )
    2747           0 :                                 aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
    2748             :                         }
    2749             :                     }
    2750             :                     else
    2751             :                     {
    2752           5 :                         ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
    2753             : 
    2754           5 :                         if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "GraphicURL" ), false, true ) )
    2755             :                         {
    2756           4 :                             aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    2757             :                         }
    2758             :                     }
    2759             :                 }
    2760             :             }
    2761          51 :             else if ( ( mType == "drawing.Text" ) || ( mType == "presentation.Notes" ) )
    2762             :             {
    2763           8 :                 if ( ( ePageType == NOTICE ) && mbPresObj )
    2764             :                 {
    2765           8 :                     if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE ) )
    2766           3 :                         continue;
    2767             :                     else
    2768           5 :                         nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESBODY;
    2769             :                 }
    2770           5 :                 ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    2771             :             }
    2772          43 :             else if ( mType == "presentation.TitleText" )
    2773             :             {
    2774           8 :                 if ( mbPresObj )
    2775             :                 {
    2776           8 :                     if ( ( ePageType == NOTICE ) && mbEmptyPresObj )
    2777             :                     {
    2778           0 :                         mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2779           0 :                         nPlaceHolderAtom = EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE;
    2780           0 :                         ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x200, aSolverContainer );
    2781           0 :                         aPropOpt.CreateLineProperties( mXPropSet, false );
    2782           0 :                         aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
    2783             :                     }
    2784           8 :                     else if ( rLayout.bTitlePossible && bIsTitlePossible )
    2785             :                     {
    2786           8 :                         bIsTitlePossible = false;
    2787             : 
    2788           8 :                         ImplGetText();
    2789           8 :                         TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Title, maFontCollection, (PPTExBulletProvider&)*this );
    2790           8 :                         if ( ePageType == MASTER )
    2791             :                         {
    2792           3 :                             if ( mnTextSize )
    2793             :                             {
    2794           3 :                                 OUString aUString( mXText->getString() );
    2795             :                                 sal_uInt16 nChar;
    2796             : 
    2797           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2798           3 :                                 mnShapeMasterTitle = mpPptEscherEx->GenerateShapeId();
    2799           3 :                                 mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterTitle );// Flags: HaveAnchor | HasSpt
    2800           6 :                                 EscherPropertyContainer aPropertyOptions;
    2801           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
    2802           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
    2803           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
    2804           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
    2805           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
    2806           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
    2807           3 :                                 aPropertyOptions.CreateFillProperties( mXPropSet, true, mXShape );
    2808           3 :                                 sal_uInt32 nLineFlags = 0x90001;
    2809           3 :                                 if ( aPropertyOptions.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
    2810           3 :                                     nLineFlags |= 0x10001;  // draw dashed line if no line
    2811           3 :                                 aPropertyOptions.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
    2812           3 :                                 aPropertyOptions.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2813           3 :                                 ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
    2814           3 :                                 aPropertyOptions.Commit( *mpStrm );
    2815           3 :                                 mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
    2816           3 :                                 mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() );      // top, left, right, bottom ????
    2817           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_ClientData );
    2818           3 :                                 mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
    2819           3 :                                 mpStrm->WriteUInt32( 0 )                                                        // PlacementID
    2820           3 :                                        .WriteUChar( EPP_PLACEHOLDER_MASTERTITLE )                               // PlaceHolderID
    2821           3 :                                        .WriteUChar( 0 )                                                         // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
    2822           3 :                                        .WriteUInt16( 0 );                                                       // padword
    2823           3 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_ClientData
    2824           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );
    2825           3 :                                 mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
    2826           3 :                                 mpStrm->WriteUInt32( EPP_TEXTTYPE_Title );
    2827           3 :                                 mpPptEscherEx->AddAtom( mnTextSize << 1, EPP_TextCharsAtom );
    2828           3 :                                 const sal_Unicode* pString = aUString.getStr();
    2829         108 :                                 for ( sal_uInt32 i = 0; i < mnTextSize; i++ )
    2830             :                                 {
    2831         105 :                                     nChar = pString[ i ];       // 0xa -> 0xb soft newline
    2832         105 :                                     if ( nChar == 0xa )
    2833           0 :                                         nChar++;                // 0xd -> 0xd hard newline
    2834         105 :                                     mpStrm->WriteUInt16( nChar );
    2835             :                                 }
    2836           3 :                                 mpPptEscherEx->AddAtom( 6, EPP_BaseTextPropAtom );
    2837           3 :                                 mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt16( 0 );
    2838           3 :                                 mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
    2839           3 :                                 mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt32( 1 ).WriteUInt16( 0 );
    2840           3 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_ClientTextBox
    2841           6 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
    2842             :                             }
    2843           3 :                             continue;
    2844             :                         }
    2845             :                         else
    2846             :                         {
    2847           5 :                             mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2848           5 :                             mnTextStyle = EPP_TEXTSTYLE_TITLE;
    2849           5 :                             nPlaceHolderAtom = rLayout.nTypeOfTitle;
    2850           5 :                             ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );          // Flags: HaveAnchor | HaveMaster
    2851           5 :                             aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterTitle );
    2852           5 :                             aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2853           5 :                             aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2854           5 :                             ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
    2855           5 :                             if ( mbEmptyPresObj )
    2856             :                             {
    2857           5 :                                 sal_uInt32 nNoLineDrawDash = 0;
    2858           5 :                                 aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
    2859           5 :                                 nNoLineDrawDash |= 0x10001;
    2860           5 :                                 aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
    2861             :                             }
    2862           5 :                         }
    2863             :                     }
    2864             :                     else
    2865           0 :                         mbPresObj = false;
    2866             :                 }
    2867           5 :                 if ( !mbPresObj )
    2868             :                 {
    2869           0 :                     mType = "drawing.Text";
    2870           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    2871             :                 }
    2872             :             }
    2873          35 :             else if ( ( mType == "presentation.Outliner" ) || ( mType == "presentation.Subtitle" ) )
    2874             :             {
    2875           6 :                 if ( mbPresObj )
    2876             :                 {
    2877           6 :                     nOutlinerCount++;
    2878           6 :                     if ( (rLayout.bOutlinerPossible && ( nOutlinerCount == 1 )) ||
    2879           0 :                          (( rLayout.bSecOutlinerPossible && ( nOutlinerCount == 2 ) ) && ( nPrevTextStyle == EPP_TEXTSTYLE_BODY ))
    2880             :                        )
    2881             :                     {
    2882           6 :                         ImplGetText();
    2883           6 :                         TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Body, maFontCollection, (PPTExBulletProvider&)*this );
    2884           6 :                         if ( ePageType == MASTER )
    2885             :                         {
    2886           3 :                             nPrevTextStyle = EPP_TEXTSTYLE_TITLE;
    2887           3 :                             if ( mnTextSize )
    2888             :                             {
    2889           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2890           3 :                                 mnShapeMasterBody = mpPptEscherEx->GenerateShapeId();
    2891           3 :                                 mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterBody );  // Flags: HaveAnchor | HasSpt
    2892           3 :                                 EscherPropertyContainer aPropOpt2;
    2893           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
    2894           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
    2895           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
    2896           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
    2897           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90001 );
    2898           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
    2899           3 :                                 aPropOpt2.CreateFillProperties( mXPropSet, true, mXShape  );
    2900           3 :                                 sal_uInt32 nLineFlags = 0x90001;
    2901           3 :                                 if ( aPropOpt2.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
    2902           3 :                                     nLineFlags |= 0x10001;  // draw dashed line if no line
    2903           3 :                                 aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
    2904           3 :                                 aPropOpt2.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2905           3 :                                 ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt2 );
    2906           3 :                                 aPropOpt2.Commit( *mpStrm );
    2907           3 :                                 mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
    2908           3 :                                 mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() );  // top, left, right, bottom ????
    2909           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_ClientData );
    2910           3 :                                 mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
    2911           3 :                                 sal_uInt8 PlaceHolderID = ( mType == "presentation.Subtitle") ? EPP_PLACEHOLDER_MASTERSUBTITLE:EPP_PLACEHOLDER_MASTERBODY;
    2912           3 :                                 mpStrm->WriteUInt32( 1 )                                                        // PlacementID
    2913           6 :                                        .WriteUChar( PlaceHolderID )/*(sal_uInt8)EPP_PLACEHOLDER_MASTERBODY */                                   // PlaceHolderID
    2914           3 :                                        .WriteUChar( 0 )                                                         // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
    2915           3 :                                        .WriteUInt16( 0 );                                                       // padword
    2916           3 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_ClientData
    2917           3 :                                 mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );       // printf
    2918           3 :                                 mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
    2919           3 :                                 if ( mType == "presentation.Subtitle")
    2920           0 :                                     mpStrm->WriteUInt32( EPP_TEXTTYPE_CenterBody );
    2921             :                                 else
    2922           3 :                                     mpStrm->WriteUInt32( EPP_TEXTTYPE_Body );
    2923           3 :                                 mnTextSize = aTextObj.Count();
    2924           3 :                                 aTextObj.Write( mpStrm );
    2925           3 :                                 mpPptEscherEx->BeginAtom();
    2926          24 :                                 for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount() ; ++i )
    2927             :                                 {
    2928          21 :                                     ParagraphObj* pPara = aTextObj.GetParagraph(i);
    2929          21 :                                     sal_uInt32 nCharCount = pPara->CharacterCount();
    2930          21 :                                     sal_uInt16 nDepth = pPara->nDepth;
    2931          21 :                                     if ( nDepth > 4)
    2932           0 :                                         nDepth = 4;
    2933             : 
    2934          21 :                                     mpStrm->WriteUInt32( nCharCount )
    2935          42 :                                            .WriteUInt16( nDepth );
    2936             :                                 }
    2937           3 :                                 mpPptEscherEx->EndAtom( EPP_BaseTextPropAtom );
    2938           3 :                                 mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
    2939           3 :                                 mpStrm->WriteUInt32( mnTextSize ).WriteUInt32( 1 ).WriteUInt16( 0 );
    2940             : 
    2941           3 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_ClientTextBox
    2942           3 :                                 mpPptEscherEx->CloseContainer();    // ESCHER_SpContainer
    2943             :                             }
    2944           3 :                             continue;
    2945             :                         }
    2946             :                         else
    2947             :                         {
    2948           3 :                             mnTextStyle = EPP_TEXTSTYLE_BODY;
    2949           3 :                             nPlaceHolderAtom = rLayout.nTypeOfOutliner;
    2950           3 :                             mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    2951           3 :                             ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );          // Flags: HaveAnchor | HaveMaster
    2952           3 :                             aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
    2953           3 :                             aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
    2954           3 :                             aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    2955           3 :                             ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
    2956           3 :                             if ( mbEmptyPresObj )
    2957             :                             {
    2958           3 :                                 sal_uInt32 nNoLineDrawDash = 0;
    2959           3 :                                 aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
    2960           3 :                                 nNoLineDrawDash |= 0x10001;
    2961           3 :                                 aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
    2962             :                             }
    2963           3 :                         }
    2964             :                     }
    2965             :                     else
    2966           0 :                         mbPresObj = false;
    2967             :                 }
    2968           3 :                 if ( !mbPresObj )
    2969             :                 {
    2970           0 :                     if (ePageType == MASTER )
    2971             :                     {
    2972           0 :                         SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
    2973           0 :                         if (pObj && pObj->IsNotVisibleAsMaster())
    2974           0 :                             continue;
    2975             :                     }
    2976             : 
    2977           0 :                     mType = "drawing.Text";
    2978           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    2979             :                 }
    2980             :             }
    2981          29 :             else if ( ( mType == "drawing.Page" ) || ( mType == "presentation.Page" ) )
    2982             :             {
    2983           8 :                 if ( ( ePageType == NOTICE ) && mbPresObj )
    2984             :                 {
    2985           8 :                     if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) )
    2986           3 :                         continue;
    2987             :                     else
    2988           5 :                         nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESSLIDEIMAGE;
    2989             :                 }
    2990           5 :                 ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    2991             :             }
    2992          21 :             else if ( mType == "drawing.Frame" )
    2993             :             {
    2994           0 :                 continue;
    2995             :             }
    2996          63 :             else if ( ( mType == "drawing.OLE2" ) || ( mType == "presentation.OLE2" )
    2997          21 :                         || ( mType == "presentation.Chart" ) || ( mType == "presentation.Calc" )
    2998          42 :                             || ( mType == "presentation.OrgChart" ) )
    2999             :             {
    3000           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    3001           0 :                 if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
    3002             :                 {
    3003           0 :                     nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
    3004           0 :                     ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer );              // Flags: HaveAnchor | HaveMaster
    3005           0 :                     aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
    3006           0 :                     aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
    3007           0 :                     aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
    3008           0 :                     aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
    3009             :                 }
    3010             :                 else
    3011             :                 {
    3012           0 :                     mpExEmbed->WriteUInt32( 0xf | ( EPP_ExEmbed << 16 ) )
    3013           0 :                                .WriteUInt32( 0 );               // Size of this container
    3014             : 
    3015           0 :                     sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
    3016             : 
    3017           0 :                     mpExEmbed->WriteUInt32( EPP_ExEmbedAtom << 16 )
    3018           0 :                                .WriteUInt32( 8 )
    3019           0 :                                .WriteUInt32( 0 )    // follow colorscheme : 0->do not follow
    3020             :                                                     //                      1->follow collorscheme
    3021             :                                                     //                      2->follow text and background scheme
    3022           0 :                                .WriteUChar( 1 )     // (bool)set if embedded server can not be locked
    3023           0 :                                .WriteUChar( 0 )     // (bool)do not need to send dimension
    3024           0 :                                .WriteUChar( 0 )     // (bool)is object a world table
    3025           0 :                                .WriteUChar( 0 );    // pad byte
    3026             : 
    3027           0 :                     PPTExOleObjEntry* pE = new PPTExOleObjEntry( NORMAL_OLE_OBJECT, mpExEmbed->Tell() );
    3028           0 :                     pE->xShape = mXShape;
    3029           0 :                     maExOleObj.push_back( pE );
    3030             : 
    3031           0 :                     mnExEmbed++;
    3032             : 
    3033           0 :                     sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
    3034             :                     try
    3035             :                     {
    3036             :                         // try to get the aspect when available
    3037             :                         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
    3038           0 :                             xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
    3039           0 :                         xShapeProps->getPropertyValue("Aspect") >>= nAspect;
    3040             :                     }
    3041           0 :                     catch( ::com::sun::star::uno::Exception& )
    3042             :                     {}
    3043             : 
    3044           0 :                     mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
    3045           0 :                                .WriteUInt32( 24 )
    3046           0 :                                .WriteUInt32( nAspect )      // Aspect
    3047           0 :                                .WriteUInt32( 0 )
    3048           0 :                                .WriteUInt32( mnExEmbed )    // index to the persist table
    3049           0 :                                .WriteUInt32( 0 )            // subtype
    3050           0 :                                .WriteUInt32( 0 )
    3051           0 :                                .WriteUInt32( 0x0012b600 );
    3052             : 
    3053           0 :                     nSize = mpExEmbed->Tell() - nOldPos;
    3054           0 :                     mpExEmbed->Seek( nOldPos - 4 );
    3055           0 :                     mpExEmbed->WriteUInt32( nSize );
    3056           0 :                     mpExEmbed->Seek( STREAM_SEEK_TO_END );
    3057           0 :                     nOlePictureId = mnExEmbed;
    3058             : 
    3059           0 :                     sal_uInt32 nSpFlags = 0xa00;
    3060           0 :                     if ( nOlePictureId )
    3061           0 :                         nSpFlags |= 0x10;
    3062           0 :                     ImplCreateShape( ESCHER_ShpInst_PictureFrame, nSpFlags, aSolverContainer );
    3063           0 :                     if ( aPropOpt.CreateOLEGraphicProperties( mXShape ) )
    3064           0 :                         aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    3065           0 :                     if ( nOlePictureId )
    3066           0 :                         aPropOpt.AddOpt( ESCHER_Prop_pictureId, nOlePictureId );
    3067             :                 }
    3068             :             }
    3069          21 :             else if ( mType == "presentation.Header" )
    3070             :             {
    3071           3 :                 if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERHEADER ) )
    3072           3 :                     continue;
    3073             :                 else
    3074             :                 {
    3075           0 :                     mbPresObj = false;
    3076           0 :                     mType = "drawing.Text";
    3077           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    3078             :                 }
    3079             :             }
    3080          18 :             else if ( mType == "presentation.Footer" )
    3081             :             {
    3082           6 :                 if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERFOOTER ) )
    3083           6 :                     continue;
    3084             :                 else
    3085             :                 {
    3086           0 :                     mbPresObj = false;
    3087           0 :                     mType = "drawing.Text";
    3088           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    3089             :                 }
    3090             :             }
    3091          12 :             else if ( mType == "presentation.DateTime" )
    3092             :             {
    3093           6 :                 if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERDATE ) )
    3094           6 :                     continue;
    3095             :                 else
    3096             :                 {
    3097           0 :                     mbPresObj = false;
    3098           0 :                     mType = "drawing.Text";
    3099           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    3100             :                 }
    3101             :             }
    3102           6 :             else if ( mType == "presentation.SlideNumber" )
    3103             :             {
    3104           6 :                 if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERSLIDENUMBER ) )
    3105           6 :                     continue;
    3106             :                 else
    3107             :                 {
    3108           0 :                     mbPresObj = false;
    3109           0 :                     mType = "drawing.Text";
    3110           0 :                     ImplCreateTextShape( aPropOpt, aSolverContainer, true );
    3111             :                 }
    3112             :             }
    3113           0 :             else if ( (mType.getLength() > 9) && (mType[8] == '3') && (mType[9] == 'D') )  // drawing.3D
    3114             :             {
    3115             :                 // SceneObject, CubeObject, SphereObject, LatheObject, ExtrudeObject, PolygonObject
    3116           0 :                 if ( !ImplGetPropertyValue( OUString( "Bitmap" ) ) )
    3117           0 :                     continue;
    3118             : 
    3119           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    3120           0 :                 ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
    3121             : 
    3122           0 :                 if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "Bitmap" ), false ) )
    3123           0 :                     aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    3124             :             }
    3125           0 :             else if ( mType == "drawing.Media" )
    3126             :             {
    3127           0 :                 mnAngle = 0;
    3128           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    3129           0 :                 ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
    3130           0 :                 if ( aPropOpt.CreateMediaGraphicProperties( mXShape ) )
    3131           0 :                     aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    3132           0 :                 ::com::sun::star::uno::Any aAny;
    3133           0 :                 if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "MediaURL" ), true ) )
    3134             :                 {
    3135           0 :                     OUString aMediaURL;
    3136           0 :                     if ( (aAny >>= aMediaURL ) &&  !aMediaURL.isEmpty() )
    3137             :                     {
    3138             :                         // SJ: creating the Media RefObj
    3139           0 :                         sal_uInt32 nRefId = ++mnExEmbed;
    3140             : 
    3141           0 :                         mpExEmbed->WriteUInt16( 0xf )
    3142           0 :                                    .WriteUInt16( EPP_ExMCIMovie )       // PPT_PST_ExAviMovie
    3143           0 :                                    .WriteUInt32( 0 );
    3144           0 :                         sal_uInt32 nSize, nStart = mpExEmbed->Tell();
    3145           0 :                         mpExEmbed->WriteUInt16( 0 )
    3146           0 :                                    .WriteUInt16( EPP_ExObjRefAtom )
    3147           0 :                                    .WriteUInt32( 4 )
    3148           0 :                                    .WriteUInt32( nRefId );
    3149           0 :                         mpExEmbed->WriteUInt16( 0xf )
    3150           0 :                                    .WriteUInt16( EPP_ExVideo )
    3151           0 :                                    .WriteUInt32( 0 );
    3152             : 
    3153           0 :                         mpExEmbed->WriteUInt16( 0 )
    3154           0 :                                    .WriteUInt16( EPP_ExMediaAtom )
    3155           0 :                                    .WriteUInt32( 8 )
    3156           0 :                                    .WriteUInt32( nRefId )
    3157           0 :                                    .WriteUInt16( 0 )
    3158           0 :                                    .WriteUInt16( 0x435 );
    3159             : 
    3160           0 :                         sal_uInt16 i, nStringLen = (sal_uInt16)aMediaURL.getLength();
    3161           0 :                         mpExEmbed->WriteUInt32( EPP_CString << 16 ).WriteUInt32( nStringLen * 2 );
    3162           0 :                         for ( i = 0; i < nStringLen; i++ )
    3163             :                         {
    3164           0 :                             sal_Unicode nChar = aMediaURL[ i ];
    3165           0 :                             mpExEmbed->WriteUInt16( nChar );
    3166             :                         }
    3167           0 :                         nSize = mpExEmbed->Tell() - nStart;
    3168           0 :                         mpExEmbed->SeekRel( - ( (sal_Int32)nSize + 4 ) );
    3169           0 :                         mpExEmbed->WriteUInt32( nSize );    // size of PPT_PST_ExMCIMovie
    3170           0 :                         mpExEmbed->SeekRel( 0x10 );
    3171           0 :                         nSize -= 20;
    3172           0 :                         mpExEmbed->WriteUInt32( nSize );    // PPT_PST_ExMediaAtom
    3173           0 :                         mpExEmbed->SeekRel( nSize );
    3174             : 
    3175           0 :                         if ( !pClientData )
    3176           0 :                             pClientData = new SvMemoryStream( 0x200, 0x200 );
    3177           0 :                         pClientData->WriteUInt16( 0 )
    3178           0 :                                     .WriteUInt16( EPP_ExObjRefAtom )
    3179           0 :                                     .WriteUInt32( 4 )
    3180           0 :                                     .WriteUInt32( nRefId );
    3181             :                         // write EPP_InteractiveInfo container for no_action
    3182           0 :                         pClientData->WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 );
    3183           0 :                         pClientData->WriteUInt16( 0 )
    3184           0 :                                     .WriteUInt16( EPP_InteractiveInfoAtom )
    3185           0 :                                     .WriteUInt32( 16 )
    3186           0 :                                     .WriteUInt32( 0 )
    3187           0 :                                     .WriteUInt32( 0 )
    3188           0 :                                     .WriteUChar( 6 )
    3189           0 :                                     .WriteUChar( 0 )
    3190           0 :                                     .WriteUChar( 0 )
    3191           0 :                                     .WriteUChar( 0 )
    3192           0 :                                     .WriteUInt32( 0 );
    3193           0 :                     }
    3194           0 :                 }
    3195             :             }
    3196           0 :             else if ( (mType == "drawing.Table") || (mType == "presentation.Table") )
    3197             :             {
    3198           0 :                 SvMemoryStream* pTmp = NULL;
    3199           0 :                 if ( bEffect && !mbUseNewAnimations )
    3200             :                 {
    3201           0 :                     pTmp = new SvMemoryStream( 0x200, 0x200 );
    3202           0 :                     ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
    3203             :                 }
    3204           0 :                 if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
    3205             :                 {
    3206           0 :                     if ( !pTmp )
    3207           0 :                         pTmp = new SvMemoryStream( 0x200, 0x200 );
    3208           0 :                     ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
    3209             :                 }
    3210           0 :                 ImplCreateTable( mXShape, aSolverContainer, aPropOpt );
    3211           0 :                 continue;
    3212             :             }
    3213           0 :             else if ( mType == "drawing.dontknow" )
    3214             :             {
    3215           0 :                 mnAngle = 0;
    3216           0 :                 mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    3217           0 :                 ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
    3218           0 :                 if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false ) )
    3219           0 :                     aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
    3220             :             }
    3221             :             else
    3222             :             {
    3223           0 :                 continue;
    3224             :             }
    3225             : 
    3226          23 :             bool bClientData = ( bEffect || ( eCa != ::com::sun::star::presentation::ClickAction_NONE ) ||
    3227          28 :                                         nPlaceHolderAtom || nOlePictureId );
    3228          23 :             if ( bClientData )
    3229             :             {
    3230          18 :                 if ( nPlaceHolderAtom )
    3231             :                 {
    3232          18 :                     sal_Int32 nPlacementID = -1;
    3233          18 :                     if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
    3234           8 :                         nPlacementID = nIndices++;
    3235             :                     else
    3236             :                     {
    3237          10 :                         switch ( nPlaceHolderAtom )
    3238             :                         {
    3239             :                             default :
    3240             :                             {
    3241           0 :                                 if ( nPlaceHolderAtom < 19 )
    3242           0 :                                     break;
    3243             :                             }
    3244             :                             case EPP_PLACEHOLDER_NOTESBODY :
    3245             :                             case EPP_PLACEHOLDER_MASTERDATE :
    3246             :                             case EPP_PLACEHOLDER_NOTESSLIDEIMAGE :
    3247             :                             case EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE :
    3248          10 :                                 nPlacementID = nIndices++;
    3249             :                         }
    3250             :                     }
    3251          18 :                     if ( !pClientData )
    3252          18 :                         pClientData = new SvMemoryStream( 0x200, 0x200 );
    3253             : 
    3254          18 :                     pClientData->WriteUInt32( EPP_OEPlaceholderAtom << 16 ).WriteUInt32( 8 )
    3255          18 :                                 .WriteInt32( nPlacementID )                // PlacementID
    3256          36 :                                 .WriteUChar( nPlaceHolderAtom ) // PlaceHolderID
    3257          18 :                                 .WriteUChar( 0 )                // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
    3258          18 :                                 .WriteUInt16( 0 );              // padword
    3259             :                 }
    3260          18 :                 if ( nOlePictureId )
    3261             :                 {
    3262           0 :                     if ( !pClientData )
    3263           0 :                         pClientData = new SvMemoryStream( 0x200, 0x200 );
    3264             : 
    3265           0 :                     pClientData->WriteUInt32( EPP_ExObjRefAtom << 16 ).WriteUInt32( 4 )
    3266           0 :                                 .WriteUInt32( nOlePictureId );
    3267           0 :                     nOlePictureId = 0;
    3268             :                 }
    3269          18 :                 if ( bEffect )
    3270             :                 {
    3271           0 :                     if ( !pClientData )
    3272           0 :                         pClientData = new SvMemoryStream( 0x200, 0x200 );
    3273             : 
    3274             :                     // check if it is sensible to replace the object effect with text effect,
    3275             :                     // because in Impress there is the possibility to use a compound effect,
    3276             :                     // e.g. the object effect is an AnimationEffect_FADE_FROM_LEFT and the
    3277             :                     // text effect is a AnimationEffect_FADE_FROM_TOP, in PowerPoint there
    3278             :                     // can be used only one effect
    3279           0 :                     if ( mnTextSize && ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
    3280           0 :                         && ( eAe != ::com::sun::star::presentation::AnimationEffect_NONE )
    3281           0 :                             && ( eTe != eAe ) )
    3282             :                     {
    3283             :                         sal_uInt32 nFillStyleFlags, nLineStyleFlags;
    3284           0 :                         if ( aPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nFillStyleFlags )
    3285           0 :                             && aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineStyleFlags ) )
    3286             :                         {
    3287             :                             // there is no fillstyle and also no linestyle
    3288           0 :                             if ( ! ( ( nFillStyleFlags & 0x10 ) + ( nLineStyleFlags & 9 ) ) )
    3289           0 :                                 eAe = eTe;
    3290             :                         }
    3291             :                     }
    3292           0 :                     if ( !mbUseNewAnimations  )
    3293           0 :                         ImplWriteObjectEffect( *pClientData, eAe, eTe, ++nEffectCount );
    3294             :                 }
    3295             : 
    3296          18 :                 if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
    3297             :                 {
    3298           0 :                     if ( !pClientData )
    3299           0 :                         pClientData = new SvMemoryStream( 0x200, 0x200 );
    3300           0 :                     ImplWriteClickAction( *pClientData, eCa, bMediaClickAction );
    3301             :                 }
    3302             :             }
    3303          23 :             if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
    3304             :             {
    3305           8 :                 if ( !pClientTextBox )
    3306           8 :                     pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
    3307             : 
    3308           8 :                 if ( !mbEmptyPresObj )
    3309             :                 {
    3310           0 :                     if ( ( ePageType == NORMAL ) && !bMasterPage )
    3311             :                     {
    3312           0 :                         sal_uInt32 nTextType = EPP_TEXTTYPE_Body;
    3313           0 :                         if ( mnTextStyle == EPP_TEXTSTYLE_BODY )
    3314             :                         {
    3315           0 :                             if ( bSecOutl )
    3316           0 :                                 nTextType = EPP_TEXTTYPE_HalfBody;
    3317           0 :                             else if ( mType == "presentation.Subtitle" )
    3318           0 :                                 nTextType = EPP_TEXTTYPE_CenterBody;
    3319           0 :                             bSecOutl = true;
    3320             :                         }
    3321             :                         else
    3322           0 :                             nTextType = EPP_TEXTTYPE_Title;
    3323             : 
    3324           0 :                         TextRuleEntry aTextRule( nPageNumber );
    3325           0 :                         SvMemoryStream aExtBu( 0x200, 0x200 );
    3326           0 :                         ImplGetText();
    3327           0 :                         ImplWriteTextStyleAtom( *pClientTextBox, nTextType, nPObjects, &aTextRule, aExtBu, NULL );
    3328           0 :                         ImplWriteExtParaHeader( aExtBu, nPObjects++, nTextType, nPageNumber + 0x100 );
    3329           0 :                         SvMemoryStream* pOut = aTextRule.pOut;
    3330           0 :                         if ( pOut )
    3331             :                         {
    3332           0 :                             pClientTextBox->Write( pOut->GetData(), pOut->Tell() );
    3333           0 :                             delete pOut, aTextRule.pOut = NULL;
    3334             :                         }
    3335           0 :                         if ( aExtBu.Tell() )
    3336             :                         {
    3337           0 :                             if ( !pClientData )
    3338           0 :                                 pClientData = new SvMemoryStream( 0x200, 0x200 );
    3339           0 :                             ImplProgTagContainer( pClientData, &aExtBu );
    3340           0 :                         }
    3341             :                     }
    3342           8 :                 }
    3343             :             }
    3344             :             else
    3345             :             {
    3346          15 :                 if ( !aPropOpt.IsFontWork() )
    3347             :                 {
    3348          15 :                     if ( mnTextSize || ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
    3349             :                     {
    3350             :                         int nInstance2;
    3351           5 :                         if ( ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
    3352           5 :                             nInstance2 = 2;
    3353             :                         else
    3354           0 :                             nInstance2 = EPP_TEXTTYPE_Other;     // Text in a Shape
    3355             : 
    3356           5 :                         if ( !pClientTextBox )
    3357           5 :                             pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
    3358             : 
    3359           5 :                         SvMemoryStream  aExtBu( 0x200, 0x200 );
    3360           5 :                         ImplWriteTextStyleAtom( *pClientTextBox, nInstance2, 0, NULL, aExtBu, &aPropOpt );
    3361           5 :                         if ( aExtBu.Tell() )
    3362             :                         {
    3363           0 :                             if ( !pClientData )
    3364           0 :                                 pClientData = new SvMemoryStream( 0x200, 0x200 );
    3365           0 :                             ImplProgTagContainer( pClientData, &aExtBu );
    3366           5 :                         }
    3367             :                     }
    3368          10 :                     else if ( nPlaceHolderAtom >= 19 )
    3369             :                     {
    3370           0 :                         if ( !pClientTextBox )
    3371           0 :                             pClientTextBox = new SvMemoryStream( 12 );
    3372             : 
    3373           0 :                         pClientTextBox->WriteUInt32( EPP_TextHeaderAtom << 16 ).WriteUInt32( 4 )
    3374           0 :                                        .WriteUInt32( 7 );
    3375             :                     }
    3376             :                 }
    3377             :             }
    3378             : 
    3379          23 :             aPropOpt.CreateShadowProperties( mXPropSet );
    3380          23 :             maRect.Justify();
    3381          23 :             if ( mnAngle )
    3382           0 :                 ImplFlipBoundingBox( aPropOpt );
    3383          23 :             aPropOpt.CreateShapeProperties( mXShape );
    3384          23 :             aPropOpt.Commit( *mpStrm );
    3385          23 :             if ( GetCurrentGroupLevel() > 0 )
    3386           0 :                 mpPptEscherEx->AddChildAnchor( maRect );
    3387             :             else
    3388          23 :                 mpPptEscherEx->AddClientAnchor( maRect );
    3389             : 
    3390          23 :             if ( pClientData )
    3391             :             {
    3392          18 :                 mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
    3393          36 :                        .WriteUInt32( pClientData->Tell() );
    3394             : 
    3395          18 :                 mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
    3396          18 :                 delete pClientData, pClientData = NULL;
    3397             :             }
    3398          23 :             if ( pClientTextBox )
    3399             :             {
    3400          13 :                 mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
    3401          26 :                        .WriteUInt32( pClientTextBox->Tell() );
    3402             : 
    3403          13 :                 mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
    3404          13 :                 delete pClientTextBox, pClientTextBox = NULL;
    3405             :             }
    3406          23 :             mpPptEscherEx->CloseContainer();      // ESCHER_SpContainer
    3407             :         }
    3408          23 :         nPrevTextStyle = mnTextStyle;
    3409             : 
    3410          23 :         if ( bAdditionalText )
    3411             :         {
    3412           0 :             bAdditionalText = false;
    3413             : 
    3414           0 :             ::com::sun::star::uno::Any  aAny;
    3415           0 :             EscherPropertyContainer     aPropOpt;
    3416             :             mnAngle = ( PropValue::GetPropertyValue( aAny,
    3417           0 :                 mXPropSet, OUString( "RotateAngle" ), true ) )
    3418           0 :                     ? *static_cast<sal_Int32 const *>(aAny.getValue())
    3419           0 :                     : 0;
    3420             : 
    3421           0 :             aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
    3422           0 :             aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
    3423           0 :             if ( mType == "drawing.Line" )
    3424             :             {
    3425           0 :                 double fDist = hypot( maRect.GetWidth(), maRect.GetHeight() );
    3426             :                 maRect = Rectangle( Point( aTextRefPoint.X, aTextRefPoint.Y ),
    3427           0 :                                         Point( (sal_Int32)( aTextRefPoint.X + fDist ), aTextRefPoint.Y - 1 ) );
    3428           0 :                 ImplCreateTextShape( aPropOpt, aSolverContainer, false );
    3429           0 :                 aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x60006 );        // Size Shape To Fit Text
    3430           0 :                 if ( mnAngle < 0 )
    3431           0 :                     mnAngle = ( 36000 + mnAngle ) % 36000;
    3432           0 :                 if ( mnAngle )
    3433           0 :                     ImplFlipBoundingBox( aPropOpt );
    3434             :             }
    3435             :             else
    3436             :             {
    3437           0 :                 ImplCreateTextShape( aPropOpt, aSolverContainer, false );
    3438           0 :                 if ( mnAngle < 0 )
    3439           0 :                     mnAngle = ( 36000 + mnAngle ) % 36000;
    3440             :                 else
    3441           0 :                     mnAngle = ( 36000 - ( mnAngle % 36000 ) );
    3442             : 
    3443           0 :                 mnAngle *= 655;
    3444           0 :                 mnAngle += 0x8000;
    3445           0 :                 mnAngle &=~0xffff;  // round nAngle to full grad
    3446           0 :                 aPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
    3447             : 
    3448             :                 // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    3449             :                 // mpPptEscherEx->SetGroupSnapRect( nGroupLevel, maRect );
    3450             :                 // mpPptEscherEx->SetGroupLogicRect( nGroupLevel, maRect );
    3451             :             }
    3452           0 :             if ( !pClientTextBox )
    3453           0 :                 pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
    3454             : 
    3455           0 :             SvMemoryStream  aExtBu( 0x200, 0x200 );
    3456           0 :             ImplWriteTextStyleAtom( *pClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOpt );
    3457             : 
    3458           0 :             aPropOpt.CreateShapeProperties( mXShape );
    3459           0 :             aPropOpt.Commit( *mpStrm );
    3460           0 :             if ( GetCurrentGroupLevel() > 0 )
    3461           0 :                 mpPptEscherEx->AddChildAnchor( maRect );
    3462             :             else
    3463           0 :                 mpPptEscherEx->AddClientAnchor( maRect );
    3464             : 
    3465           0 :             mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
    3466           0 :                    .WriteUInt32( pClientTextBox->Tell() );
    3467             : 
    3468           0 :             mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
    3469           0 :             delete pClientTextBox, pClientTextBox = NULL;
    3470             : 
    3471           0 :             mpPptEscherEx->CloseContainer();  // ESCHER_SpContainer
    3472             : 
    3473             :             // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
    3474             :             // mpPptEscherEx->LeaveGroup();
    3475             :         }
    3476             :     }
    3477          16 :     ClearGroupTable();                              // storing groups if any are still open, which should not be the case
    3478          16 :     nGroups = GetGroupsClosed();
    3479          16 :     for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
    3480          16 :     mnPagesWritten++;
    3481          16 : }
    3482             : 
    3483             : struct CellBorder
    3484             : {
    3485             :     sal_Int32                       mnPos;      // specifies the distance to the top/left position of the table
    3486             :     sal_Int32                       mnLength;
    3487             :     table::BorderLine               maCellBorder;
    3488             : 
    3489           0 :     CellBorder() : mnPos ( 0 ), mnLength( 0 ){};
    3490             : };
    3491             : 
    3492           0 : bool PPTWriter::ImplCreateCellBorder( const CellBorder* pCellBorder, sal_Int32 nX1, sal_Int32 nY1, sal_Int32 nX2, sal_Int32 nY2)
    3493             : {
    3494           0 :     sal_Int32 nLineWidth = pCellBorder->maCellBorder.OuterLineWidth + pCellBorder->maCellBorder.InnerLineWidth;
    3495           0 :     if ( nLineWidth )
    3496             :     {
    3497           0 :         nLineWidth *= 2;
    3498           0 :         mnAngle = 0;
    3499           0 :         mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
    3500           0 :         EscherPropertyContainer aPropOptSp;
    3501             : 
    3502           0 :         sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
    3503           0 :         mpPptEscherEx->AddShape( ESCHER_ShpInst_Line, 0xa02, nId );
    3504           0 :         aPropOptSp.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
    3505           0 :         aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0xa0008 );
    3506           0 :         aPropOptSp.AddOpt( ESCHER_Prop_fshadowObscured, 0x20000 );
    3507             : 
    3508           0 :         sal_uInt32 nBorderColor = pCellBorder->maCellBorder.Color & 0xff00;                 // green
    3509           0 :         nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color ) << 16;  // red
    3510           0 :         nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color >> 16 );  // blue
    3511           0 :         aPropOptSp.AddOpt( ESCHER_Prop_lineColor, nBorderColor );
    3512             : 
    3513           0 :         aPropOptSp.AddOpt( ESCHER_Prop_lineWidth, nLineWidth * 360 );
    3514           0 :         aPropOptSp.AddOpt( ESCHER_Prop_fc3DLightFace, 0x80000 );
    3515           0 :         aPropOptSp.Commit( *mpStrm );
    3516           0 :         mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
    3517           0 :         mpStrm    ->WriteInt32( nX1 )
    3518           0 :                    .WriteInt32( nY1 )
    3519           0 :                    .WriteInt32( nX2 )
    3520           0 :                    .WriteInt32( nY2 );
    3521           0 :         mpPptEscherEx->CloseContainer();
    3522           0 :         return true;
    3523             :     }
    3524           0 :     return false;
    3525             : }
    3526             : 
    3527             : //get merged cell's width
    3528           0 : sal_Int32 GetCellRight( sal_Int32 nColumn,
    3529             :     Rectangle& rect,
    3530             :     std::vector< std::pair< sal_Int32, sal_Int32 > >& aColumns,
    3531             :     uno::Reference< table::XMergeableCell >& xCell )
    3532             : {
    3533           0 :     sal_Int32 nRight = aColumns[ nColumn ].first + aColumns[ nColumn ].second;
    3534           0 :     for ( sal_Int32 nColumnSpan = 1; nColumnSpan < xCell->getColumnSpan(); nColumnSpan++ )
    3535             :     {
    3536           0 :         sal_uInt32 nC = nColumnSpan + nColumn;
    3537           0 :         if ( nC < aColumns.size() )
    3538           0 :             nRight += aColumns[ nC ].second;
    3539             :         else
    3540           0 :             nRight = rect.Right();
    3541             :     }
    3542           0 :     return nRight;
    3543             : }
    3544             : //get merged cell's height
    3545           0 : sal_Int32 GetCellBottom( sal_Int32 nRow,
    3546             :     Rectangle& rect,
    3547             :     std::vector< std::pair< sal_Int32, sal_Int32 > >& aRows,
    3548             :     uno::Reference< table::XMergeableCell >& xCell )
    3549             : {
    3550           0 :     sal_Int32 nBottom = aRows[nRow].first + aRows[nRow].second;
    3551           0 :     for ( sal_Int32 nRowSpan = 1; nRowSpan < xCell->getRowSpan(); nRowSpan++ )
    3552             :     {
    3553           0 :         sal_uInt32 nR = nRowSpan + nRow;
    3554           0 :         if ( nR < aRows.size() )
    3555           0 :             nBottom += aRows[ nR ].second;
    3556             :         else
    3557           0 :             nBottom = rect.Bottom();
    3558             :     }
    3559           0 :     return nBottom;
    3560             : }
    3561             : 
    3562          34 : void PPTWriter::WriteCString( SvStream& rSt, const OUString& rString, sal_uInt32 nInstance )
    3563             : {
    3564          34 :     sal_Int32 nLen = rString.getLength();
    3565          34 :     if ( nLen )
    3566             :     {
    3567           0 :         rSt.WriteUInt32( ( nInstance << 4 ) | ( EPP_CString << 16 ) )
    3568           0 :            .WriteUInt32( nLen << 1 );
    3569           0 :         for ( sal_Int32 i = 0; i < nLen; i++ )
    3570           0 :             rSt.WriteUInt16( rString[i] );
    3571             :     }
    3572          34 : }
    3573             : 
    3574             : class ContainerGuard
    3575             : {
    3576             : private:
    3577             :     PptEscherEx* m_pPptEscherEx;
    3578             : public:
    3579           0 :     ContainerGuard(PptEscherEx* pPptEscherEx, sal_uInt16 nRecord)
    3580           0 :         : m_pPptEscherEx(pPptEscherEx)
    3581             :     {
    3582           0 :         m_pPptEscherEx->OpenContainer(nRecord);
    3583           0 :     }
    3584           0 :     ~ContainerGuard()
    3585             :     {
    3586           0 :         m_pPptEscherEx->CloseContainer();
    3587           0 :     }
    3588             : };
    3589             : 
    3590           0 : void PPTWriter::ImplCreateTable( uno::Reference< drawing::XShape >& rXShape, EscherSolverContainer& aSolverContainer,
    3591             :                                 EscherPropertyContainer& aPropOpt )
    3592             : {
    3593             :     try
    3594             :     {
    3595             :         static const char sModel[] = "Model";
    3596             :         static const char sWidth[] = "Width";
    3597             :         static const char sHeight[] = "Height";
    3598             : 
    3599           0 :         uno::Reference< table::XTable > xTable;
    3600           0 :         if ( mXPropSet->getPropertyValue( sModel ) >>= xTable )
    3601             :         {
    3602           0 :             uno::Reference< table::XColumnRowRange > xColumnRowRange( xTable, uno::UNO_QUERY_THROW );
    3603           0 :             uno::Reference< container::XIndexAccess > xColumns( xColumnRowRange->getColumns(), uno::UNO_QUERY_THROW );
    3604           0 :             uno::Reference< container::XIndexAccess > xRows( xColumnRowRange->getRows(), uno::UNO_QUERY_THROW );
    3605           0 :             sal_uInt16 nRowCount = static_cast< sal_uInt16 >( xRows->getCount() );
    3606           0 :             sal_uInt16 nColumnCount = static_cast< sal_uInt16 >( xColumns->getCount() );
    3607             : 
    3608           0 :             std::vector< std::pair< sal_Int32, sal_Int32 > > aColumns;
    3609           0 :             std::vector< std::pair< sal_Int32, sal_Int32 > > aRows;
    3610             : 
    3611           0 :             awt::Point aPosition( MapPoint( rXShape->getPosition() ) );
    3612           0 :             sal_Int32 nPosition = aPosition.X;
    3613           0 :             for ( sal_Int32 x = 0; x < nColumnCount; x++ )
    3614             :             {
    3615           0 :                 uno::Reference< beans::XPropertySet > xPropSet( xColumns->getByIndex( x ), uno::UNO_QUERY_THROW );
    3616           0 :                 awt::Size aS( 0, 0 );
    3617           0 :                 xPropSet->getPropertyValue( sWidth ) >>= aS.Width;
    3618           0 :                 awt::Size aM( MapSize( aS ) );
    3619           0 :                 aColumns.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Width ) );
    3620           0 :                 nPosition += aM.Width;
    3621           0 :                 if ( x == nColumnCount - 1  && nPosition != maRect.Right() )
    3622           0 :                     maRect.Right() = nPosition;
    3623           0 :             }
    3624             : 
    3625           0 :             nPosition = aPosition.Y;
    3626           0 :             for ( sal_Int32 y = 0; y < nRowCount; y++ )
    3627             :             {
    3628           0 :                 uno::Reference< beans::XPropertySet > xPropSet( xRows->getByIndex( y ), uno::UNO_QUERY_THROW );
    3629           0 :                 awt::Size aS( 0, 0 );
    3630           0 :                 xPropSet->getPropertyValue( sHeight ) >>= aS.Height;
    3631           0 :                 awt::Size aM( MapSize( aS ) );
    3632           0 :                 aRows.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Height ) );
    3633           0 :                 nPosition += aM.Height;
    3634           0 :                 if ( y == nRowCount - 1 && nPosition != maRect.Bottom())
    3635           0 :                     maRect.Bottom() = nPosition;
    3636           0 :             }
    3637           0 :             std::unique_ptr<ContainerGuard> xSpgrContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpgrContainer));
    3638           0 :             std::unique_ptr<ContainerGuard> xSpContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpContainer));
    3639           0 :             mpPptEscherEx->AddAtom( 16, ESCHER_Spgr, 1 );
    3640           0 :             mpStrm    ->WriteInt32( maRect.Left() ) // Bounding box for the grouped shapes to which they are attached
    3641           0 :                        .WriteInt32( maRect.Top() )
    3642           0 :                        .WriteInt32( maRect.Right() )
    3643           0 :                        .WriteInt32( maRect.Bottom() );
    3644             : 
    3645           0 :             sal_uInt32 nShapeId = mpPptEscherEx->GenerateShapeId();
    3646           0 :             mpPptEscherEx->AddShape( ESCHER_ShpInst_Min, 0x201, nShapeId );     // Flags: Group | Patriarch
    3647           0 :             aSolverContainer.AddShape( rXShape, nShapeId );
    3648           0 :             EscherPropertyContainer aPropOpt2;
    3649             : 
    3650           0 :             SvMemoryStream aMemStrm;
    3651           0 :             aMemStrm.ObjectOwnsMemory( false );
    3652           0 :             aMemStrm.WriteUInt16( nRowCount )
    3653           0 :                     .WriteUInt16( nRowCount )
    3654           0 :                     .WriteUInt16( 4 );
    3655             : 
    3656           0 :             std::vector< std::pair< sal_Int32, sal_Int32 > >::const_iterator aIter( aRows.begin() );
    3657           0 :             while( aIter != aRows.end() )
    3658           0 :                 aMemStrm.WriteInt32( (*aIter++).second );
    3659             : 
    3660           0 :             aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x1000100 );
    3661           0 :             aPropOpt2.AddOpt( ESCHER_Prop_tableProperties, 1 );
    3662           0 :             aPropOpt2.AddOpt( ESCHER_Prop_tableRowProperties, true, aMemStrm.Tell(), static_cast< sal_uInt8* >( const_cast< void* >( aMemStrm.GetData() ) ), aMemStrm.Tell() );
    3663           0 :             aPropOpt.CreateShapeProperties( rXShape );
    3664           0 :             aPropOpt.Commit( *mpStrm );
    3665           0 :             aPropOpt2.Commit( *mpStrm, 3, ESCHER_UDefProp );
    3666           0 :             if ( GetCurrentGroupLevel() > 0 )
    3667           0 :                 mpPptEscherEx->AddChildAnchor( maRect );
    3668             :             else
    3669           0 :                 mpPptEscherEx->AddClientAnchor( maRect );
    3670           0 :             xSpContainer.reset(); //ESCHER_SpContainer
    3671             : 
    3672           0 :             uno::Reference< table::XCellRange > xCellRange( xTable, uno::UNO_QUERY_THROW );
    3673           0 :             for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
    3674             :             {
    3675           0 :                 for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
    3676             :                 {
    3677           0 :                     uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ), uno::UNO_QUERY_THROW );
    3678           0 :                     if ( !xCell->isMerged() )
    3679             :                     {
    3680           0 :                         sal_Int32 nLeft   = aColumns[ nColumn ].first;
    3681           0 :                         sal_Int32 nTop    = aRows[ nRow ].first;
    3682           0 :                         sal_Int32 nRight  = GetCellRight( nColumn, maRect,aColumns,xCell );
    3683           0 :                         sal_Int32 nBottom = GetCellBottom( nRow,  maRect,aRows,xCell );
    3684             : 
    3685           0 :                         mbFontIndependentLineSpacing = false;
    3686           0 :                         mXPropSet = uno::Reference< beans::XPropertySet >( xCell, uno::UNO_QUERY_THROW );
    3687           0 :                         mXText = uno::Reference< text::XSimpleText >( xCell, uno::UNO_QUERY_THROW );
    3688           0 :                         mnTextSize = mXText->getString().getLength();
    3689             : 
    3690           0 :                         ::com::sun::star::uno::Any aAny;
    3691           0 :                         if ( GetPropertyValue( aAny, mXPropSet, OUString( "FontIndependentLineSpacing" ), true ) )
    3692           0 :                             aAny >>= mbFontIndependentLineSpacing;
    3693             : 
    3694           0 :                         EscherPropertyContainer aPropOptSp;
    3695           0 :                         std::unique_ptr<ContainerGuard> xCellContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpContainer));
    3696           0 :                         ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa02, aSolverContainer );          // Flags: Connector | HasSpt | Child
    3697           0 :                         aPropOptSp.CreateFillProperties( mXPropSet, true );
    3698           0 :                         aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
    3699           0 :                         aPropOptSp.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
    3700           0 :                         aPropOptSp.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapSquare );
    3701             : 
    3702           0 :                         SvMemoryStream aClientTextBox( 0x200, 0x200 );
    3703           0 :                         SvMemoryStream  aExtBu( 0x200, 0x200 );
    3704             : 
    3705           0 :                         ImplWriteTextStyleAtom( aClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOptSp );
    3706             : 
    3707             :                         // need write client data for extend bullet
    3708           0 :                         if ( aExtBu.Tell() )
    3709             :                         {
    3710           0 :                             SvMemoryStream* pClientData = new SvMemoryStream( 0x200, 0x200 );
    3711           0 :                             ImplProgTagContainer( pClientData, &aExtBu );
    3712           0 :                             mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
    3713           0 :                                .WriteUInt32( pClientData->Tell() );
    3714             : 
    3715           0 :                             mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
    3716           0 :                             delete pClientData, pClientData = NULL;
    3717             :                         }
    3718             : 
    3719           0 :                         aPropOptSp.Commit( *mpStrm );
    3720           0 :                         mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
    3721           0 :                         mpStrm    ->WriteInt32( nLeft )
    3722           0 :                            .WriteInt32( nTop )
    3723           0 :                            .WriteInt32( nRight )
    3724           0 :                            .WriteInt32( nBottom );
    3725             : 
    3726           0 :                         mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
    3727           0 :                            .WriteUInt32( aClientTextBox.Tell() );
    3728             : 
    3729           0 :                         mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
    3730           0 :                         xCellContainer.reset();
    3731             :                     }
    3732           0 :                 }
    3733             :             }
    3734             : 
    3735             :             static const char sTopBorder[] = "TopBorder";
    3736             :             static const char sBottomBorder[] = "BottomBorder";
    3737             :             static const char sLeftBorder[] = "LeftBorder";
    3738             :             static const char sRightBorder[] = "RightBorder";
    3739             : 
    3740             :             // creating horz lines
    3741           0 :             for( sal_Int32 nLine = 0; nLine < ( xRows->getCount() + 1 ); nLine++ )
    3742             :             {
    3743           0 :                 for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
    3744             :                 {
    3745           0 :                     CellBorder aCellBorder;
    3746           0 :                     aCellBorder.mnPos = aColumns[ nColumn ].first;
    3747           0 :                     aCellBorder.mnLength = aColumns[ nColumn ].second;
    3748           0 :                     bool bTop = false;
    3749             :                     //write nLine*nColumn cell's top border
    3750           0 :                     if ( nLine < xRows->getCount() )
    3751             :                     {   // top border
    3752           0 :                         uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nLine ), uno::UNO_QUERY_THROW );
    3753           0 :                         if ( !xCell->isMerged()  )
    3754             :                         {
    3755           0 :                             uno::Reference< beans::XPropertySet > xPropSet2( xCell, uno::UNO_QUERY_THROW );
    3756           0 :                             table::BorderLine aBorderLine;
    3757           0 :                             if ( xPropSet2->getPropertyValue( sTopBorder ) >>= aBorderLine )
    3758           0 :                                 aCellBorder.maCellBorder = aBorderLine;
    3759           0 :                             sal_Int32 nRight  = GetCellRight( nColumn, maRect,aColumns,xCell );
    3760             :                             bTop = ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
    3761           0 :                                 aRows[ nLine ].first, nRight,  aRows[ nLine ].first );
    3762           0 :                         }
    3763             :                     }
    3764             : 
    3765             :                     //if nLine*nColumn cell's top border is empty, check (nLine-1)*nColumn cell's bottom border
    3766             :                     //and write the last row's bottom border
    3767           0 :                     if (( nLine && !bTop ) || (nLine == xRows->getCount()))
    3768             :                     {   // bottom border
    3769           0 :                         sal_Int32 nRow =  nLine;
    3770             : 
    3771           0 :                         while( nRow )
    3772             :                         {   //find last no merged cell
    3773           0 :                             uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
    3774           0 :                             if ( !xCell->isMerged()  )
    3775             :                             {
    3776           0 :                                 sal_Int32 nRight  = GetCellRight( nColumn,  maRect,aColumns,xCell );
    3777           0 :                                 sal_Int32 nBottom = GetCellBottom( nRow - 1, maRect,aRows,xCell );
    3778           0 :                                 if ( nBottom == ( aRows[ nLine-1 ].first + aRows[ nLine-1 ].second ) )
    3779             :                                 {
    3780           0 :                                     uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
    3781           0 :                                     uno::Reference< beans::XPropertySet > xPropSet2( xCellOwn, uno::UNO_QUERY_THROW );
    3782           0 :                                     table::BorderLine aBorderLine;
    3783           0 :                                     if ( xPropSet2->getPropertyValue( sBottomBorder ) >>= aBorderLine )
    3784           0 :                                         aCellBorder.maCellBorder = aBorderLine;
    3785             :                                     ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
    3786           0 :                                         nBottom, nRight, nBottom);
    3787             :                                 }
    3788           0 :                                 nRow=0;
    3789             :                             }
    3790             :                             else
    3791           0 :                                 nRow--;
    3792           0 :                         }
    3793             :                     }
    3794             :                 }
    3795             :             }
    3796             : 
    3797             :             // creating vertical lines
    3798           0 :             for( sal_Int32 nLine = 0; nLine < ( xColumns->getCount() + 1 ); nLine++ )
    3799             :             {
    3800           0 :                 for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
    3801             :                 {
    3802             : 
    3803           0 :                     CellBorder aCellBorder;
    3804           0 :                     aCellBorder.mnPos = aRows[ nRow].first;
    3805           0 :                     aCellBorder.mnLength = aRows[ nRow].second;
    3806           0 :                     bool bLeft = false;
    3807           0 :                     if ( nLine < xColumns->getCount() )
    3808             :                     {   // left border
    3809           0 :                         uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nLine, nRow ), uno::UNO_QUERY_THROW );
    3810           0 :                         if (!xCell->isMerged() )
    3811             :                         {
    3812           0 :                             uno::Reference< beans::XPropertySet > xCellSet( xCell, uno::UNO_QUERY_THROW );
    3813           0 :                             table::BorderLine aBorderLine;
    3814           0 :                             if ( xCellSet->getPropertyValue( sLeftBorder ) >>= aBorderLine )
    3815           0 :                                 aCellBorder.maCellBorder = aBorderLine;
    3816           0 :                             sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows,xCell );
    3817           0 :                             bLeft = ImplCreateCellBorder( &aCellBorder, aColumns[nLine].first, aCellBorder.mnPos,
    3818           0 :                                 aColumns[nLine].first, nBottom );
    3819           0 :                         }
    3820             :                     }
    3821           0 :                     if ( ( nLine && !bLeft )||(nLine == xColumns->getCount()))
    3822             :                     {   // right border
    3823           0 :                         sal_Int32 nColumn = nLine;
    3824           0 :                         while ( nColumn )
    3825             :                         {
    3826           0 :                             uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
    3827           0 :                             if (!xCell->isMerged() )
    3828             :                             {
    3829           0 :                                 sal_Int32 nRight  = GetCellRight( nColumn-1, maRect, aColumns,xCell );
    3830           0 :                                 sal_Int32 nBottom = GetCellBottom( nRow,   maRect, aRows, xCell );
    3831           0 :                                 if ( nRight == (aColumns[nLine-1].first + aColumns[nLine-1].second) )
    3832             :                                 {
    3833           0 :                                     uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
    3834           0 :                                     uno::Reference< beans::XPropertySet > xCellSet( xCellOwn, uno::UNO_QUERY_THROW );
    3835           0 :                                     table::BorderLine aBorderLine;
    3836           0 :                                     if ( xCellSet->getPropertyValue( sRightBorder ) >>= aBorderLine )
    3837           0 :                                         aCellBorder.maCellBorder = aBorderLine;
    3838             :                                     ImplCreateCellBorder( &aCellBorder, nRight, aCellBorder.mnPos,
    3839           0 :                                         nRight,  nBottom );
    3840             :                                 }
    3841           0 :                                 nColumn = 0;
    3842             :                             }
    3843             :                             else
    3844           0 :                                 nColumn --;
    3845           0 :                         }
    3846             :                     }
    3847             :                 }
    3848             :             }
    3849             : 
    3850           0 :             xSpgrContainer.reset(); //ESCHER_SpgrContainer
    3851           0 :         }
    3852             :     }
    3853           0 :     catch( uno::Exception& )
    3854             :     {
    3855             :     }
    3856           0 : }
    3857             : 
    3858          24 : void TextObjBinary::Write( SvStream* pStrm )
    3859             : {
    3860          24 :     sal_uInt32 nSize, nPos = pStrm->Tell();
    3861          24 :     pStrm->WriteUInt32( EPP_TextCharsAtom << 16 ).WriteUInt32( 0 );
    3862          66 :     for ( sal_uInt32 i = 0; i < ParagraphCount(); ++i )
    3863          42 :         GetParagraph(i)->Write( pStrm );
    3864          24 :     nSize = pStrm->Tell() - nPos;
    3865          24 :     pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
    3866          24 :     pStrm->WriteUInt32( nSize - 8 );
    3867          24 :     pStrm->SeekRel( nSize - 8 );
    3868          24 : }
    3869             : 
    3870          21 : void TextObjBinary::WriteTextSpecInfo( SvStream* pStrm )
    3871             : {
    3872          21 :     sal_uInt32 nCharactersLeft( Count() );
    3873          21 :     if ( nCharactersLeft >= 1 )
    3874             :     {
    3875          21 :         EscherExAtom aAnimationInfoAtom( *pStrm, EPP_TextSpecInfoAtom, 0, 0 );
    3876          42 :         for ( sal_uInt32 i = 0; nCharactersLeft && i < ParagraphCount(); ++i )
    3877             :         {
    3878          21 :             ParagraphObj* pPtr = GetParagraph(i);
    3879          42 :             for ( boost::ptr_vector<PortionObj>::const_iterator it = pPtr->begin(); nCharactersLeft && it != pPtr->end(); ++it )
    3880             :             {
    3881          21 :                 const PortionObj& rPortion = *it;
    3882          21 :                 sal_Int32 nPortionSize = rPortion.mnTextSize >= nCharactersLeft ? nCharactersLeft : rPortion.mnTextSize;
    3883          21 :                 sal_Int32 nFlags = 7;
    3884          21 :                 nCharactersLeft -= nPortionSize;
    3885          21 :                 pStrm ->WriteUInt32( nPortionSize )
    3886          21 :                        .WriteInt32( nFlags )
    3887          21 :                        .WriteInt16( 1 )    // spellinfo -> needs rechecking
    3888          63 :                        .WriteInt16( LanguageTag( rPortion.meCharLocale ).makeFallback().getLanguageType() )
    3889          21 :                        .WriteInt16( 0 );   // alt language
    3890             :             }
    3891             :         }
    3892          21 :         if ( nCharactersLeft )
    3893           0 :             pStrm->WriteUInt32( nCharactersLeft ).WriteInt32( 1 ).WriteInt16( 1 );
    3894             : 
    3895             :     }
    3896          33 : }
    3897             : 
    3898             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11