diff options
Diffstat (limited to 'svx/source/msfilter/escherex.cxx')
-rw-r--r-- | svx/source/msfilter/escherex.cxx | 4848 |
1 files changed, 0 insertions, 4848 deletions
diff --git a/svx/source/msfilter/escherex.cxx b/svx/source/msfilter/escherex.cxx deleted file mode 100644 index 5bb1b77efc35..000000000000 --- a/svx/source/msfilter/escherex.cxx +++ /dev/null @@ -1,4848 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: escherex.cxx,v $ - * $Revision: 1.77.64.1 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svx.hxx" -#include "impgrf.hxx" -#include "eschesdo.hxx" -#include <svx/escherex.hxx> -#include <unoapi.hxx> -#include <svx/svdobj.hxx> -#include <svx/svdoashp.hxx> -#include <svx/svdoole2.hxx> -#include <svx/svdmodel.hxx> -#include <vcl/gradient.hxx> -#include <vcl/graph.hxx> -#include <vcl/cvtgrf.hxx> -#include <vcl/svapp.hxx> -#include <vcl/wrkwin.hxx> -#include <tools/stream.hxx> -#include <tools/zcodec.hxx> -#include <svx/svdopath.hxx> -#include <stdlib.h> -#include <svtools/filter.hxx> -#include "../customshapes/EnhancedCustomShapeTypeNames.hxx" -#include "../customshapes/EnhancedCustomShapeGeometry.hxx" -#include <EnhancedCustomShapeFunctionParser.hxx> -#include "../customshapes/EnhancedCustomShape2d.hxx" -#include <com/sun/star/beans/PropertyValues.hpp> -#include <com/sun/star/beans/XPropertyState.hpp> -#include <com/sun/star/awt/GradientStyle.hpp> -#include <com/sun/star/awt/RasterOperation.hpp> -#include <com/sun/star/awt/Gradient.hpp> -#include <com/sun/star/drawing/LineStyle.hpp> -#include <com/sun/star/drawing/LineJoint.hpp> -#include <com/sun/star/drawing/FillStyle.hpp> -#include <com/sun/star/drawing/LineDash.hpp> -#include <com/sun/star/drawing/BezierPoint.hpp> -#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> -#include <com/sun/star/drawing/ConnectorType.hpp> -#include <com/sun/star/drawing/ConnectionType.hpp> -#include <com/sun/star/drawing/CircleKind.hpp> -#include <com/sun/star/drawing/PointSequence.hpp> -#include <com/sun/star/drawing/FlagSequence.hpp> -#include <com/sun/star/drawing/PolygonFlags.hpp> -#include <com/sun/star/text/WritingMode.hpp> -#include <com/sun/star/drawing/TextVerticalAdjust.hpp> -#include <com/sun/star/drawing/TextHorizontalAdjust.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeParameterType.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeGluePointType.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeTextFrame.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp> -#include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp> -#include <com/sun/star/drawing/ProjectionMode.hpp> -#include <com/sun/star/text/XSimpleText.hpp> -#include <com/sun/star/drawing/ShadeMode.hpp> -#include <vcl/hatch.hxx> -#include <com/sun/star/awt/XGraphics.hpp> -#include <com/sun/star/awt/FontSlant.hpp> -#include <com/sun/star/awt/FontWeight.hpp> -#include <com/sun/star/drawing/ColorMode.hpp> -#include <com/sun/star/drawing/Position3D.hpp> -#include <com/sun/star/drawing/Direction3D.hpp> -#include <com/sun/star/text/GraphicCrop.hpp> -#include <unotools/ucbstreamhelper.hxx> -#include <unotools/localfilehelper.hxx> -#include <comphelper/extract.hxx> -#include <toolkit/unohlp.hxx> -#include <vcl/virdev.hxx> -#include <rtl/crc.h> -#include <vos/xception.hxx> -#ifndef _VOS_NO_NAMESPACE -using namespace vos; -#endif - -using namespace ::rtl; -using namespace ::com::sun::star; - - -// --------------------------------------------------------------------------------------------- - -EscherExContainer::EscherExContainer( SvStream& rSt, const sal_uInt16 nRecType, const sal_uInt16 nInstance ) : - rStrm ( rSt ) -{ - rStrm << (sal_uInt32)( ( 0xf | ( nInstance << 4 ) ) | ( nRecType << 16 ) ) << (sal_uInt32)0; - nContPos = rStrm.Tell(); -} -EscherExContainer::~EscherExContainer() -{ - sal_uInt32 nPos = rStrm.Tell(); - sal_uInt32 nSize= nPos - nContPos; - if ( nSize ) - { - rStrm.Seek( nContPos - 4 ); - rStrm << nSize; - rStrm.Seek( nPos ); - } -} - -EscherExAtom::EscherExAtom( SvStream& rSt, const sal_uInt16 nRecType, const sal_uInt16 nInstance, const sal_uInt8 nVersion ) : - rStrm ( rSt ) -{ - rStrm << (sal_uInt32)( ( nVersion | ( nInstance << 4 ) ) | ( nRecType << 16 ) ) << (sal_uInt32)0; - nContPos = rStrm.Tell(); -} -EscherExAtom::~EscherExAtom() -{ - sal_uInt32 nPos = rStrm.Tell(); - sal_uInt32 nSize= nPos - nContPos; - if ( nSize ) - { - rStrm.Seek( nContPos - 4 ); - rStrm << nSize; - rStrm.Seek( nPos ); - } -} - -// --------------------------------------------------------------------------------------------- - -EscherExClientRecord_Base::~EscherExClientRecord_Base() -{ -} - -EscherExClientAnchor_Base::~EscherExClientAnchor_Base() -{ -} - -// --------------------------------------------------------------------------------------------- - -void EscherPropertyContainer::ImplInit() -{ - nSortCount = 0; - nCountCount = 0; - nCountSize = 0; - nSortBufSize = 64; - bHasComplexData = sal_False; - bSuppressRotation = sal_False; - pSortStruct = new EscherPropSortStruct[ nSortBufSize ]; -} - -EscherPropertyContainer::EscherPropertyContainer() : - pGraphicProvider ( NULL ), - pPicOutStrm ( NULL ) -{ - ImplInit(); -}; - -EscherPropertyContainer::EscherPropertyContainer( - EscherGraphicProvider& rGraphProv, - SvStream* pPiOutStrm, - Rectangle& rBoundRect ) : - - pGraphicProvider ( &rGraphProv ), - pPicOutStrm ( pPiOutStrm ), - pShapeBoundRect ( &rBoundRect ) -{ - ImplInit(); -} - -EscherPropertyContainer::~EscherPropertyContainer() -{ - if ( bHasComplexData ) - { - while ( nSortCount-- ) - delete[] pSortStruct[ nSortCount ].pBuf; - } - delete[] pSortStruct; -}; - -void EscherPropertyContainer::AddOpt( sal_uInt16 nPropID, sal_uInt32 nPropValue, sal_Bool bBlib ) -{ - AddOpt( nPropID, bBlib, nPropValue, NULL, 0 ); -} - -void EscherPropertyContainer::AddOpt( sal_uInt16 nPropID, const rtl::OUString& rString ) -{ - sal_Int32 j, i, nLen = rString.getLength() * 2 + 2; - sal_uInt8* pBuf = new sal_uInt8[ nLen ]; - for ( j = i = 0; i < rString.getLength(); i++ ) - { - sal_uInt16 nChar = (sal_uInt16)rString[ i ]; - pBuf[ j++ ] = (sal_uInt8)nChar; - pBuf[ j++ ] = (sal_uInt8)( nChar >> 8 ); - } - pBuf[ j++ ] = 0; - pBuf[ j++ ] = 0; - AddOpt( nPropID, sal_True, nLen, pBuf, nLen ); -} - -void EscherPropertyContainer::AddOpt( sal_uInt16 nPropID, sal_Bool bBlib, sal_uInt32 nPropValue, sal_uInt8* pProp, sal_uInt32 nPropSize ) -{ - if ( bBlib ) // bBlib is only valid when fComplex = 0 - nPropID |= 0x4000; - if ( pProp ) - nPropID |= 0x8000; // fComplex = TRUE; - - sal_uInt32 i; - for( i = 0; i < nSortCount; i++ ) - { - if ( ( pSortStruct[ i ].nPropId &~0xc000 ) == ( nPropID &~0xc000 ) ) // pruefen, ob Property nur ersetzt wird - { - pSortStruct[ i ].nPropId = nPropID; - if ( pSortStruct[ i ].pBuf ) - { - nCountSize -= pSortStruct[ i ].nPropSize; - delete[] pSortStruct[ i ].pBuf; - } - pSortStruct[ i ].pBuf = pProp; - pSortStruct[ i ].nPropSize = nPropSize; - pSortStruct[ i ].nPropValue = nPropValue; - if ( pProp ) - nCountSize += nPropSize; - return; - } - } - nCountCount++; - nCountSize += 6; - if ( nSortCount == nSortBufSize ) // buffer vergroessern - { - nSortBufSize <<= 1; - EscherPropSortStruct* pTemp = new EscherPropSortStruct[ nSortBufSize ]; - for( i = 0; i < nSortCount; i++ ) - { - pTemp[ i ] = pSortStruct[ i ]; - } - delete pSortStruct; - pSortStruct = pTemp; - } - pSortStruct[ nSortCount ].nPropId = nPropID; // property einfuegen - pSortStruct[ nSortCount ].pBuf = pProp; - pSortStruct[ nSortCount ].nPropSize = nPropSize; - pSortStruct[ nSortCount++ ].nPropValue = nPropValue; - - if ( pProp ) - { - nCountSize += nPropSize; - bHasComplexData = sal_True; - } -} - -sal_Bool EscherPropertyContainer::GetOpt( sal_uInt16 nPropId, sal_uInt32& rPropValue ) const -{ - EscherPropSortStruct aPropStruct; - - if ( GetOpt( nPropId, aPropStruct ) ) - { - rPropValue = aPropStruct.nPropValue; - return sal_True; - } - return sal_False; -} - -sal_Bool EscherPropertyContainer::GetOpt( sal_uInt16 nPropId, EscherPropSortStruct& rPropValue ) const -{ - for( sal_uInt32 i = 0; i < nSortCount; i++ ) - { - if ( ( pSortStruct[ i ].nPropId &~0xc000 ) == ( nPropId &~0xc000 ) ) - { - rPropValue = pSortStruct[ i ]; - return sal_True; - } - } - return sal_False; -} - -EscherProperties EscherPropertyContainer::GetOpts() const -{ - EscherProperties aVector; - - for ( sal_uInt32 i = 0; i < nSortCount; ++i ) - aVector.push_back( pSortStruct[ i ] ); - - return aVector; -} - -extern "C" int __LOADONCALLAPI EscherPropSortFunc( const void* p1, const void* p2 ) -{ - INT16 nID1 = ((EscherPropSortStruct*)p1)->nPropId &~0xc000; - INT16 nID2 = ((EscherPropSortStruct*)p2)->nPropId &~0xc000; - - if( nID1 < nID2 ) - return -1; - else if( nID1 > nID2 ) - return 1; - else - return 0; -} - -void EscherPropertyContainer::Commit( SvStream& rSt, sal_uInt16 nVersion, sal_uInt16 nRecType ) -{ - rSt << (sal_uInt16)( ( nCountCount << 4 ) | ( nVersion & 0xf ) ) << nRecType << nCountSize; - if ( nSortCount ) - { - qsort( pSortStruct, nSortCount, sizeof( EscherPropSortStruct ), EscherPropSortFunc ); - sal_uInt32 i; - - for ( i = 0; i < nSortCount; i++ ) - { - sal_uInt32 nPropValue = pSortStruct[ i ].nPropValue; - sal_uInt16 nPropId = pSortStruct[ i ].nPropId; - - if ( bSuppressRotation && ( nPropId == ESCHER_Prop_Rotation ) ) - nPropValue = 0; - - rSt << nPropId - << nPropValue; - } - if ( bHasComplexData ) - { - for ( i = 0; i < nSortCount; i++ ) - { - if ( pSortStruct[ i ].pBuf ) - rSt.Write( pSortStruct[ i ].pBuf, pSortStruct[ i ].nPropSize ); - } - } - } -} - -sal_Bool EscherPropertyContainer::IsFontWork() const -{ - sal_uInt32 nTextPathFlags = 0; - GetOpt( DFF_Prop_gtextFStrikethrough, nTextPathFlags ); - return ( nTextPathFlags & 0x4000 ) != 0; -} - -sal_uInt32 EscherPropertyContainer::ImplGetColor( const sal_uInt32 nSOColor, sal_Bool bSwap ) -{ - if ( bSwap ) - { - sal_uInt32 nColor = nSOColor & 0xff00; // GRUEN - nColor |= (sal_uInt8)( nSOColor ) << 16; // ROT - nColor |= (sal_uInt8)( nSOColor >> 16 ); // BLAU - return nColor; - } - else - return nSOColor & 0xffffff; -} - -sal_uInt32 EscherPropertyContainer::GetGradientColor( - const ::com::sun::star::awt::Gradient* pGradient, - sal_uInt32 nStartColor ) -{ - sal_uInt32 nIntensity = 100; - Color aColor; - - if ( pGradient ) - { - if ( nStartColor & 1 ) - { - nIntensity = pGradient->StartIntensity; - aColor = pGradient->StartColor; - } - else - { - nIntensity = pGradient->EndIntensity; - aColor = pGradient->EndColor; - } - } - sal_uInt32 nRed = ( ( aColor.GetRed() * nIntensity ) / 100 ); - sal_uInt32 nGreen = ( ( aColor.GetGreen() * nIntensity ) / 100 ) << 8; - sal_uInt32 nBlue = ( ( aColor.GetBlue() * nIntensity ) / 100 ) << 16; - return nRed | nGreen | nBlue; -} - -void EscherPropertyContainer::CreateGradientProperties( - const ::com::sun::star::awt::Gradient & rGradient ) -{ - sal_uInt32 nFillType = ESCHER_FillShadeScale; - sal_uInt32 nAngle = 0; - sal_uInt32 nFillFocus = 0; - sal_uInt32 nFillLR = 0; - sal_uInt32 nFillTB = 0; - sal_uInt32 nFirstColor = 0; - bool bWriteFillTo = false; - - switch ( rGradient.Style ) - { - case ::com::sun::star::awt::GradientStyle_LINEAR : - case ::com::sun::star::awt::GradientStyle_AXIAL : - { - nFillType = ESCHER_FillShadeScale; - nAngle = (rGradient.Angle * 0x10000) / 10; - nFillFocus = (sal::static_int_cast<int>(rGradient.Style) == - sal::static_int_cast<int>(GradientStyle_LINEAR)) ? 0 : 50; - } - break; - case ::com::sun::star::awt::GradientStyle_RADIAL : - case ::com::sun::star::awt::GradientStyle_ELLIPTICAL : - case ::com::sun::star::awt::GradientStyle_SQUARE : - case ::com::sun::star::awt::GradientStyle_RECT : - { - nFillLR = (rGradient.XOffset * 0x10000) / 100; - nFillTB = (rGradient.YOffset * 0x10000) / 100; - if ( ((nFillLR > 0) && (nFillLR < 0x10000)) || ((nFillTB > 0) && (nFillTB < 0x10000)) ) - nFillType = ESCHER_FillShadeShape; - else - nFillType = ESCHER_FillShadeCenter; - nFirstColor = 1; - bWriteFillTo = true; - } - break; - case ::com::sun::star::awt::GradientStyle_MAKE_FIXED_SIZE : break; - } - AddOpt( ESCHER_Prop_fillType, nFillType ); - AddOpt( ESCHER_Prop_fillAngle, nAngle ); - AddOpt( ESCHER_Prop_fillColor, GetGradientColor( &rGradient, nFirstColor ) ); - AddOpt( ESCHER_Prop_fillBackColor, GetGradientColor( &rGradient, nFirstColor ^ 1 ) ); - AddOpt( ESCHER_Prop_fillFocus, nFillFocus ); - if ( bWriteFillTo ) - { - AddOpt( ESCHER_Prop_fillToLeft, nFillLR ); - AddOpt( ESCHER_Prop_fillToTop, nFillTB ); - AddOpt( ESCHER_Prop_fillToRight, nFillLR ); - AddOpt( ESCHER_Prop_fillToBottom, nFillTB ); - } -} - -void EscherPropertyContainer::CreateGradientProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet ) -{ - ::com::sun::star::uno::Any aAny; - ::com::sun::star::awt::Gradient aGradient; - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ) ), sal_False ) ) - { - aGradient = *static_cast< const ::com::sun::star::awt::Gradient* >( aAny.getValue() ); - } - CreateGradientProperties( aGradient ); -}; - -void EscherPropertyContainer::CreateFillProperties( - const uno::Reference< beans::XPropertySet > & rXPropSet, - sal_Bool bEdge ) -{ - ::com::sun::star::uno::Any aAny; - AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone ); - AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle ); - - sal_uInt32 nFillBackColor = 0; - - const rtl::OUString aPropName( String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) ); - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, aPropName, sal_False ) ) - { - ::com::sun::star::drawing::FillStyle eFS; - if ( ! ( aAny >>= eFS ) ) - eFS = ::com::sun::star::drawing::FillStyle_SOLID; - switch( eFS ) - { - case ::com::sun::star::drawing::FillStyle_GRADIENT : - { - CreateGradientProperties( rXPropSet ); - AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 ); - } - break; - - case ::com::sun::star::drawing::FillStyle_BITMAP : - { - CreateGraphicProperties( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ) ), sal_True ); - AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 ); - AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor ); - } - break; - case ::com::sun::star::drawing::FillStyle_HATCH : - { - CreateGraphicProperties( rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ) ), sal_True ); - } - break; - case ::com::sun::star::drawing::FillStyle_SOLID : - default: - { - ::com::sun::star::beans::PropertyState ePropState = EscherPropertyValueHelper::GetPropertyState( - rXPropSet, aPropName ); - if ( ePropState == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) - AddOpt( ESCHER_Prop_fillType, ESCHER_FillSolid ); - - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ), sal_False ) ) - { - sal_uInt32 nFillColor = ImplGetColor( *((sal_uInt32*)aAny.getValue()) ); - nFillBackColor = nFillColor ^ 0xffffff; - AddOpt( ESCHER_Prop_fillColor, nFillColor ); - } - AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100010 ); - AddOpt( ESCHER_Prop_fillBackColor, nFillBackColor ); - break; - } - case ::com::sun::star::drawing::FillStyle_NONE : - AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 ); - break; - } - if ( eFS != ::com::sun::star::drawing::FillStyle_NONE ) - { - sal_uInt16 nTransparency = ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillTransparence" ) ), sal_True ) ) - ? *((sal_Int16*)aAny.getValue() ) - : 0; - if ( nTransparency ) - AddOpt( ESCHER_Prop_fillOpacity, ( ( 100 - nTransparency ) << 16 ) / 100 ); - } - } - CreateLineProperties( rXPropSet, bEdge ); -} - -void EscherPropertyContainer::CreateTextProperties( - const uno::Reference< beans::XPropertySet > & rXPropSet, sal_uInt32 nTextId, - const sal_Bool bIsCustomShape, const sal_Bool bIsTextFrame ) -{ - uno::Any aAny; - text::WritingMode eWM( text::WritingMode_LR_TB ); - drawing::TextVerticalAdjust eVA( drawing::TextVerticalAdjust_TOP ); - drawing::TextHorizontalAdjust eHA( drawing::TextHorizontalAdjust_LEFT ); - - sal_Int32 nLeft ( 0 ); - sal_Int32 nTop ( 0 ); - sal_Int32 nRight ( 0 ); - sal_Int32 nBottom ( 0 ); - - // used with normal shapes: - sal_Bool bAutoGrowWidth ( sal_False ); - sal_Bool bAutoGrowHeight ( sal_False ); - // used with ashapes: - sal_Bool bWordWrap ( sal_False ); - sal_Bool bAutoGrowSize ( sal_False ); - - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextWritingMode" ) ), sal_True ) ) - aAny >>= eWM; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextVerticalAdjust" ) ), sal_True ) ) - aAny >>= eVA; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextHorizontalAdjust" ) ), sal_True ) ) - aAny >>= eHA; - if ( bIsCustomShape ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextWordWrap" ) ), sal_False ) ) - aAny >>= bWordWrap; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextAutoGrowHeight" ) ), sal_True ) ) - aAny >>= bAutoGrowSize; - } - else if ( bIsTextFrame ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextAutoGrowWidth" ) ), sal_True ) ) - aAny >>= bAutoGrowWidth; - -// i63936 not setting autogrowheight, because otherwise -// the minframeheight of the text will be ignored -// -// if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextAutoGrowHeight" ) ), sal_True ) ) -// aAny >>= bAutoGrowHeight; - } - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextLeftDistance" ) ) ) ) - aAny >>= nLeft; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextUpperDistance" ) ) ) ) - aAny >>= nTop; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextRightDistance" ) ) ) ) - aAny >>= nRight; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "TextLowerDistance" ) ) ) ) - aAny >>= nBottom; - -/* - if ( rObj.ImplGetPropertyValue( - ::rtl::OUString::createFromAscii("TextWritingMode") ) ) - { - ::com::sun::star::text::WritingMode eMode; - rObj.GetUsrAny() >>= eMode; - switch (eMode) - { - case ::com::sun::star::text::WritingMode_TB_RL: - //Well if it so happens that we are fliped 180 we can use - //this instead. - if (rObj.GetAngle() == 18000) - eFlow = ESCHER_txflBtoT; - else - eFlow = ESCHER_txflTtoBA; - break; - case ::com::sun::star::text::WritingMode_RL_TB: - eDir = ESCHER_txdirRTL; - break; - } - } -*/ - - ESCHER_AnchorText eAnchor = ESCHER_AnchorTop; - ESCHER_WrapMode eWrapMode = ESCHER_WrapSquare; - sal_uInt32 nTextAttr = 0x40004; // rotate text with shape - - if ( eWM == text::WritingMode_TB_RL ) - { // verical writing - switch ( eHA ) - { - case drawing::TextHorizontalAdjust_LEFT : - eAnchor = ESCHER_AnchorBottom; - break; - case drawing::TextHorizontalAdjust_CENTER : - eAnchor = ESCHER_AnchorMiddle; - break; - default : - case drawing::TextHorizontalAdjust_BLOCK : - case drawing::TextHorizontalAdjust_RIGHT : - eAnchor = ESCHER_AnchorTop; - break; - } - if ( eVA == drawing::TextVerticalAdjust_CENTER ) - { - switch ( eAnchor ) - { - case ESCHER_AnchorMiddle : - eAnchor = ESCHER_AnchorMiddleCentered; - break; - case ESCHER_AnchorBottom : - eAnchor = ESCHER_AnchorBottomCentered; - break; - default : - case ESCHER_AnchorTop : - eAnchor = ESCHER_AnchorTopCentered; - break; - } - } - if ( bIsCustomShape ) - { - if ( bWordWrap ) - eWrapMode = ESCHER_WrapSquare; - else - eWrapMode = ESCHER_WrapNone; - if ( bAutoGrowSize ) - nTextAttr |= 0x20002; - } - else - { - if ( bAutoGrowHeight ) - eWrapMode = ESCHER_WrapNone; - if ( bAutoGrowWidth ) - nTextAttr |= 0x20002; - } - - AddOpt( ESCHER_Prop_txflTextFlow, ESCHER_txflTtoBA ); // rotate text within shape by 90 - } - else - { // normal from left to right - switch ( eVA ) - { - case drawing::TextVerticalAdjust_CENTER : - eAnchor = ESCHER_AnchorMiddle; - break; - - case drawing::TextVerticalAdjust_BOTTOM : - eAnchor = ESCHER_AnchorBottom; - break; - - default : - case drawing::TextVerticalAdjust_TOP : - eAnchor = ESCHER_AnchorTop; - break; - } - if ( eHA == drawing::TextHorizontalAdjust_CENTER ) - { - switch( eAnchor ) - { - case ESCHER_AnchorMiddle : - eAnchor = ESCHER_AnchorMiddleCentered; - break; - case ESCHER_AnchorBottom : - eAnchor = ESCHER_AnchorBottomCentered; - break; - case ESCHER_AnchorTop : - eAnchor = ESCHER_AnchorTopCentered; - break; - default: break; - } - } - if ( bIsCustomShape ) - { - if ( bWordWrap ) - eWrapMode = ESCHER_WrapSquare; - else - eWrapMode = ESCHER_WrapNone; - if ( bAutoGrowSize ) - nTextAttr |= 0x20002; - } - else - { - if ( bAutoGrowWidth ) - eWrapMode = ESCHER_WrapNone; - if ( bAutoGrowHeight ) - nTextAttr |= 0x20002; - } - } - AddOpt( ESCHER_Prop_dxTextLeft, nLeft * 360 ); - AddOpt( ESCHER_Prop_dxTextRight, nRight * 360 ); - AddOpt( ESCHER_Prop_dyTextTop, nTop * 360 ); - AddOpt( ESCHER_Prop_dyTextBottom, nBottom * 360 ); - - AddOpt( ESCHER_Prop_WrapText, eWrapMode ); - AddOpt( ESCHER_Prop_AnchorText, eAnchor ); - AddOpt( ESCHER_Prop_FitTextToShape, nTextAttr ); - - if ( nTextId ) - AddOpt( ESCHER_Prop_lTxid, nTextId ); -} - -sal_Bool EscherPropertyContainer::GetLineArrow( const sal_Bool bLineStart, - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - ESCHER_LineEnd& reLineEnd, sal_Int32& rnArrowLength, sal_Int32& rnArrowWidth ) -{ - static String sLineStart ( RTL_CONSTASCII_USTRINGPARAM( "LineStart" ) ); - static String sLineStartName( RTL_CONSTASCII_USTRINGPARAM( "LineStartName" ) ); - static String sLineEnd ( RTL_CONSTASCII_USTRINGPARAM( "LineEnd" ) ); - static String sLineEndName ( RTL_CONSTASCII_USTRINGPARAM( "LineEndName" ) ); - - const String sLine ( bLineStart ? sLineStart : sLineEnd ); - const String sLineName ( bLineStart ? sLineStartName : sLineEndName ); - - sal_Bool bIsArrow = sal_False; - - ::com::sun::star::uno::Any aAny; - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, sLine, sal_False ) ) - { - PolyPolygon aPolyPoly( EscherPropertyContainer::GetPolyPolygon( aAny ) ); - if ( aPolyPoly.Count() && aPolyPoly[ 0 ].GetSize() ) - { - bIsArrow = sal_True; - - reLineEnd = ESCHER_LineArrowEnd; - rnArrowLength = 1; - rnArrowWidth = 1; - - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, sLineName, sal_False ) ) - { - String aArrowStartName = *(::rtl::OUString*)aAny.getValue(); - rtl::OUString aApiName; - sal_Int16 nWhich = bLineStart ? XATTR_LINESTART : XATTR_LINEEND; - - SvxUnogetApiNameForItem( nWhich, aArrowStartName, aApiName ); - if ( aApiName.getLength() ) - { - - /* todo: - calculate the best option for ArrowLenght and ArrowWidth - */ - if ( aApiName.equalsAscii( "Arrow concave" ) ) - reLineEnd = ESCHER_LineArrowStealthEnd; - else if ( aApiName.equalsAscii( "Square 45" ) ) - reLineEnd = ESCHER_LineArrowDiamondEnd; - else if ( aApiName.equalsAscii( "Small Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aApiName.equalsAscii( "Dimension Lines" ) ) - { - rnArrowLength = 0; - rnArrowWidth = 2; - reLineEnd = ESCHER_LineArrowOvalEnd; - } - else if ( aApiName.equalsAscii( "Double Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aApiName.equalsAscii( "Rounded short Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aApiName.equalsAscii( "Symmetric Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aApiName.equalsAscii( "Line Arrow" ) ) - reLineEnd = ESCHER_LineArrowOpenEnd; - else if ( aApiName.equalsAscii( "Rounded large Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aApiName.equalsAscii( "Circle" ) ) - reLineEnd = ESCHER_LineArrowOvalEnd; - else if ( aApiName.equalsAscii( "Square" ) ) - reLineEnd = ESCHER_LineArrowDiamondEnd; - else if ( aApiName.equalsAscii( "Arrow" ) ) - reLineEnd = ESCHER_LineArrowEnd; - } - else if ( aArrowStartName.GetTokenCount( ' ' ) == 2 ) - { - sal_Bool b = sal_True; - String aArrowName( aArrowStartName.GetToken( 0, ' ' ) ); - if ( aArrowName.EqualsAscii( "msArrowEnd" ) ) - reLineEnd = ESCHER_LineArrowEnd; - else if ( aArrowName.EqualsAscii( "msArrowOpenEnd" ) ) - reLineEnd = ESCHER_LineArrowOpenEnd; - else if ( aArrowName.EqualsAscii( "msArrowStealthEnd" ) ) - reLineEnd = ESCHER_LineArrowStealthEnd; - else if ( aArrowName.EqualsAscii( "msArrowDiamondEnd" ) ) - reLineEnd = ESCHER_LineArrowDiamondEnd; - else if ( aArrowName.EqualsAscii( "msArrowOvalEnd" ) ) - reLineEnd = ESCHER_LineArrowOvalEnd; - else - b = sal_False; - - // now we have the arrow, and try to determine the arrow size; - if ( b ) - { - String aArrowSize( aArrowStartName.GetToken( 1, ' ' ) ); - sal_Int32 nArrowSize = aArrowSize.ToInt32(); - rnArrowWidth = ( nArrowSize - 1 ) / 3; - rnArrowLength = nArrowSize - ( rnArrowWidth * 3 ) - 1; - } - } - } - } - } - return bIsArrow; -} - -void EscherPropertyContainer::CreateLineProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - sal_Bool bEdge ) -{ - ::com::sun::star::uno::Any aAny; - sal_uInt32 nLineFlags = 0x80008; - - ESCHER_LineEnd eLineEnd; - sal_Int32 nArrowLength; - sal_Int32 nArrowWidth; - - sal_Bool bSwapLineEnds = sal_False; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "CircleKind" ) ), sal_True ) ) - { - ::com::sun::star::drawing::CircleKind eCircleKind; - if ( aAny >>= eCircleKind ) - { - if ( eCircleKind == ::com::sun::star::drawing::CircleKind_ARC ) - bSwapLineEnds = sal_True; - } - } - if ( GetLineArrow( bSwapLineEnds ? sal_False : sal_True, rXPropSet, eLineEnd, nArrowLength, nArrowWidth ) ) - { - AddOpt( ESCHER_Prop_lineStartArrowLength, nArrowLength ); - AddOpt( ESCHER_Prop_lineStartArrowWidth, nArrowWidth ); - AddOpt( ESCHER_Prop_lineStartArrowhead, eLineEnd ); - nLineFlags |= 0x100010; - } - if ( GetLineArrow( bSwapLineEnds ? sal_True : sal_False, rXPropSet, eLineEnd, nArrowLength, nArrowWidth ) ) - { - AddOpt( ESCHER_Prop_lineEndArrowLength, nArrowLength ); - AddOpt( ESCHER_Prop_lineEndArrowWidth, nArrowWidth ); - AddOpt( ESCHER_Prop_lineEndArrowhead, eLineEnd ); - nLineFlags |= 0x100010; - } - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LineStyle" ) ), sal_False ) ) - { - ::com::sun::star::drawing::LineStyle eLS; - if ( aAny >>= eLS ) - { - switch ( eLS ) - { - case ::com::sun::star::drawing::LineStyle_NONE : - AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 ); // 80000 - break; - - case ::com::sun::star::drawing::LineStyle_DASH : - { - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LineDash" ) ), sal_False ) ) - { - ESCHER_LineDashing eDash = ESCHER_LineSolid; - ::com::sun::star::drawing::LineDash* pLineDash = (::com::sun::star::drawing::LineDash*)aAny.getValue(); - sal_Int32 nDistance = pLineDash->Distance << 1; - switch ( pLineDash->Style ) - { - case ::com::sun::star::drawing::DashStyle_ROUND : - case ::com::sun::star::drawing::DashStyle_ROUNDRELATIVE : - AddOpt( ESCHER_Prop_lineEndCapStyle, 0 ); // Style Round setzen - break; - default : break; - } - if ( ((!(pLineDash->Dots )) || (!(pLineDash->Dashes )) ) || ( pLineDash->DotLen == pLineDash->DashLen ) ) - { - sal_Int32 nLen = pLineDash->DotLen; - if ( pLineDash->Dashes ) - nLen = pLineDash->DashLen; - - if ( nLen >= nDistance ) - eDash = ESCHER_LineLongDashGEL; - else if ( pLineDash->Dots ) - eDash = ESCHER_LineDotSys; - else - eDash = ESCHER_LineDashGEL; - } - else // X Y - { - if ( pLineDash->Dots != pLineDash->Dashes ) - { - if ( ( pLineDash->DashLen > nDistance ) || ( pLineDash->DotLen > nDistance ) ) - eDash = ESCHER_LineLongDashDotDotGEL; - else - eDash = ESCHER_LineDashDotDotSys; - } - else // X Y Y - { - if ( ( pLineDash->DashLen > nDistance ) || ( pLineDash->DotLen > nDistance ) ) - eDash = ESCHER_LineLongDashDotGEL; - else - eDash = ESCHER_LineDashDotGEL; - - } - } - AddOpt( ESCHER_Prop_lineDashing, eDash ); - } - } - case ::com::sun::star::drawing::LineStyle_SOLID : - default: - { - AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ); - } - break; - } - } - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LineColor" ) ), sal_False ) ) - { - sal_uInt32 nLineColor = ImplGetColor( *((sal_uInt32*)aAny.getValue()) ); - AddOpt( ESCHER_Prop_lineColor, nLineColor ); - AddOpt( ESCHER_Prop_lineBackColor, nLineColor ^ 0xffffff ); - } - } - - sal_uInt32 nLineSize = ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LineWidth" ) ), sal_False ) ) - ? *((sal_uInt32*)aAny.getValue()) - : 0; - if ( nLineSize > 1 ) - AddOpt( ESCHER_Prop_lineWidth, nLineSize * 360 ); // 100TH MM -> PT , 1PT = 12700 EMU - - ESCHER_LineJoin eLineJoin = ESCHER_LineJoinMiter; - if ( EscherPropertyValueHelper::GetPropertyValue( - aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "LineJoint" ) ), sal_True ) ) - { - ::com::sun::star::drawing::LineJoint eLJ; - if ( aAny >>= eLJ ) - { - switch ( eLJ ) - { - case com::sun::star::drawing::LineJoint_NONE : - case com::sun::star::drawing::LineJoint_MIDDLE : - case com::sun::star::drawing::LineJoint_BEVEL : - eLineJoin = ESCHER_LineJoinBevel; - break; - default: - case com::sun::star::drawing::LineJoint_MITER : - eLineJoin = ESCHER_LineJoinMiter; - break; - case com::sun::star::drawing::LineJoint_ROUND : - eLineJoin = ESCHER_LineJoinRound; - break; - } - } - } - AddOpt( ESCHER_Prop_lineJoinStyle, eLineJoin ); - - if ( bEdge == sal_False ) - { - AddOpt( ESCHER_Prop_fFillOK, 0x1001 ); - AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 ); - } -} - -static Size lcl_SizeToEmu(Size aPrefSize, MapMode aPrefMapMode) -{ - Size aRetSize; - if (aPrefMapMode == MAP_PIXEL) - aRetSize = Application::GetDefaultDevice()->PixelToLogic( aPrefSize, MAP_100TH_MM ); - else - aRetSize = Application::GetDefaultDevice()->LogicToLogic( aPrefSize, aPrefMapMode, MAP_100TH_MM ); - return aRetSize; -} - -void EscherPropertyContainer::ImplCreateGraphicAttributes( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - sal_uInt32 nBlibId, sal_Bool bCreateCroppingAttributes ) -{ - ::com::sun::star::uno::Any aAny; - - sal_uInt32 nPicFlags = 0; - ::com::sun::star::drawing::ColorMode eColorMode( ::com::sun::star::drawing::ColorMode_STANDARD ); - sal_Int16 nLuminance = 0; - sal_Int32 nContrast = 0; - sal_Int16 nRed = 0; - sal_Int16 nGreen = 0; - sal_Int16 nBlue = 0; - double fGamma = 1.0; - sal_Int16 nTransparency = 0; - - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "GraphicColorMode" ) ) ) ) - aAny >>= eColorMode; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "AdjustLuminance" ) ) ) ) - aAny >>= nLuminance; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "AdjustContrast" ) ) ) ) - { - sal_Int16 nC = sal_Int16(); - aAny >>= nC; - nContrast = nC; - } - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "AdjustRed" ) ) ) ) - aAny >>= nRed; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "AdjustGreen" ) ) ) ) - aAny >>= nGreen; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "AdjustBlue" ) ) ) ) - aAny >>= nBlue; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Gamma" ) ) ) ) - aAny >>= fGamma; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "Transparency" ) ) ) ) - aAny >>= nTransparency; - - if ( eColorMode == ::com::sun::star::drawing::ColorMode_WATERMARK ) - { - eColorMode = ::com::sun::star::drawing::ColorMode_STANDARD; - nLuminance += 70; - if ( nLuminance > 100 ) - nLuminance = 100; - nContrast -= 70; - if ( nContrast < -100 ) - nContrast = -100; - } - if ( eColorMode == ::com::sun::star::drawing::ColorMode_GREYS ) - nPicFlags |= 0x40004; - else if ( eColorMode == ::com::sun::star::drawing::ColorMode_MONO ) - nPicFlags |= 0x60006; - - if ( nContrast ) - { - nContrast += 100; - if ( nContrast == 100) - nContrast = 0x10000; - else if ( nContrast < 100 ) - { - nContrast *= 0x10000; - nContrast /= 100; - } - else if ( nContrast < 200 ) - nContrast = ( 100 * 0x10000 ) / ( 200 - nContrast ); - else - nContrast = 0x7fffffff; - AddOpt( ESCHER_Prop_pictureContrast, nContrast ); - } - if ( nLuminance ) - AddOpt( ESCHER_Prop_pictureBrightness, nLuminance * 327 ); - if ( nPicFlags ) - AddOpt( ESCHER_Prop_pictureActive, nPicFlags ); - - if ( bCreateCroppingAttributes && pGraphicProvider ) - { - Size aPrefSize; - MapMode aPrefMapMode; - if ( pGraphicProvider->GetPrefSize( nBlibId, aPrefSize, aPrefMapMode ) ) - { - Size aCropSize(lcl_SizeToEmu(aPrefSize, aPrefMapMode)); - if ( aCropSize.Width() && aCropSize.Height() ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "GraphicCrop" ) ) ) ) - { - ::com::sun::star::text::GraphicCrop aGraphCrop; - if ( aAny >>= aGraphCrop ) - { - if ( aGraphCrop.Left ) - { - sal_uInt32 nLeft = ( aGraphCrop.Left * 65536 ) / aCropSize.Width(); - AddOpt( ESCHER_Prop_cropFromLeft, nLeft ); - } - if ( aGraphCrop.Top ) - { - sal_uInt32 nTop = ( aGraphCrop.Top * 65536 ) / aCropSize.Height(); - AddOpt( ESCHER_Prop_cropFromTop, nTop ); - } - if ( aGraphCrop.Right ) - { - sal_uInt32 nRight = ( aGraphCrop.Right * 65536 ) / aCropSize.Width(); - AddOpt( ESCHER_Prop_cropFromRight, nRight ); - } - if ( aGraphCrop.Bottom ) - { - sal_uInt32 nBottom = ( aGraphCrop.Bottom * 65536 ) / aCropSize.Height(); - AddOpt( ESCHER_Prop_cropFromBottom, nBottom ); - } - } - } - } - } - } -} - -sal_Bool EscherPropertyContainer::CreateOLEGraphicProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape ) -{ - sal_Bool bRetValue = sal_False; - - if ( rXShape.is() ) - { - SdrObject* pSdrOLE2( GetSdrObjectFromXShape( rXShape ) ); // SJ: leaving unoapi, because currently there is - if ( pSdrOLE2 && pSdrOLE2->ISA( SdrOle2Obj ) ) // no access to the native graphic object - { - Graphic* pGraphic = ((SdrOle2Obj*)pSdrOLE2)->GetGraphic(); - if ( pGraphic ) - { - GraphicObject aGraphicObject( *pGraphic ); - ByteString aUniqueId( aGraphicObject.GetUniqueID() ); - if ( aUniqueId.Len() ) - { - AddOpt( ESCHER_Prop_fillType, ESCHER_FillPicture ); - uno::Reference< beans::XPropertySet > aXPropSet( rXShape, uno::UNO_QUERY ); - - if ( pGraphicProvider && pPicOutStrm && pShapeBoundRect && aXPropSet.is() ) - { - ::com::sun::star::uno::Any aAny; - ::com::sun::star::awt::Rectangle* pVisArea = NULL; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "VisibleArea" ) ) ) ) - { - pVisArea = new ::com::sun::star::awt::Rectangle; - aAny >>= (*pVisArea); - } - Rectangle aRect( Point( 0, 0 ), pShapeBoundRect->GetSize() ); - sal_uInt32 nBlibId = pGraphicProvider->GetBlibID( *pPicOutStrm, aUniqueId, aRect, pVisArea, NULL ); - if ( nBlibId ) - { - AddOpt( ESCHER_Prop_pib, nBlibId, sal_True ); - ImplCreateGraphicAttributes( aXPropSet, nBlibId, sal_False ); - bRetValue = sal_True; - } - delete pVisArea; - } - } - } - } - } - return bRetValue; -} - - -sal_Bool EscherPropertyContainer::ImplCreateEmbeddedBmp( const ByteString& rUniqueId ) -{ - if( rUniqueId.Len() > 0 ) - { - EscherGraphicProvider aProvider; - SvMemoryStream aMemStrm; - Rectangle aRect; - if ( aProvider.GetBlibID( aMemStrm, rUniqueId, aRect ) ) - { - // grab BLIP from stream and insert directly as complex property - // ownership of stream memory goes to complex property - aMemStrm.ObjectOwnsMemory( FALSE ); - sal_uInt8* pBuf = (sal_uInt8*) aMemStrm.GetData(); - sal_uInt32 nSize = aMemStrm.Seek( STREAM_SEEK_TO_END ); - AddOpt( ESCHER_Prop_fillBlip, sal_True, nSize, pBuf, nSize ); - return sal_True; - } - } - return sal_False; -} - -sal_Bool EscherPropertyContainer::CreateEmbeddedBitmapProperties( - const ::rtl::OUString& rBitmapUrl, ::com::sun::star::drawing::BitmapMode eBitmapMode ) -{ - sal_Bool bRetValue = sal_False; - String aVndUrl( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) ); - String aBmpUrl( rBitmapUrl ); - xub_StrLen nIndex = aBmpUrl.Search( aVndUrl, 0 ); - if( nIndex != STRING_NOTFOUND ) - { - // note: += ist not defined for xub_StrLen -> conversion to int and back to xub_StrLen - nIndex = nIndex + aVndUrl.Len(); - if( aBmpUrl.Len() > nIndex ) - { - ByteString aUniqueId( aBmpUrl, nIndex, aBmpUrl.Len() - nIndex, RTL_TEXTENCODING_UTF8 ); - bRetValue = ImplCreateEmbeddedBmp( aUniqueId ); - if( bRetValue ) - { - // bitmap mode property - bool bRepeat = eBitmapMode == ::com::sun::star::drawing::BitmapMode_REPEAT; - AddOpt( ESCHER_Prop_fillType, bRepeat ? ESCHER_FillTexture : ESCHER_FillPicture ); - } - } - } - return bRetValue; -} - - -namespace { - -GraphicObject lclDrawHatch( const ::com::sun::star::drawing::Hatch& rHatch, const Color& rBackColor, bool bFillBackground ) -{ - const MapMode aMap100( MAP_100TH_MM ); - VirtualDevice aVDev( *Application::GetDefaultDevice(), 0, 1 ); - aVDev.SetMapMode( aMap100 ); - - const Size aOutSize = aVDev.PixelToLogic( Size( 28, 28 ) ); - aVDev.SetOutputSize( aOutSize ); - - Rectangle aRectangle( Point( 0, 0 ), aOutSize ); - const PolyPolygon aPolyPoly( aRectangle ); - - aVDev.SetLineColor(); - aVDev.SetFillColor( bFillBackground ? rBackColor : Color( COL_TRANSPARENT ) ); - aVDev.DrawRect( Rectangle( Point(), aOutSize ) ); - - Hatch aVclHatch( (HatchStyle) rHatch.Style, Color( rHatch.Color ), rHatch.Distance, (sal_uInt16)rHatch.Angle ); - aVDev.DrawHatch( aPolyPoly, aVclHatch ); - - return GraphicObject( Graphic( aVDev.GetBitmapEx( Point(), aOutSize ) ) ); -} - -} // namespace - - -sal_Bool EscherPropertyContainer::CreateEmbeddedHatchProperties( const ::com::sun::star::drawing::Hatch& rHatch, const Color& rBackColor, bool bFillBackground ) -{ - GraphicObject aGraphicObject = lclDrawHatch( rHatch, rBackColor, bFillBackground ); - ByteString aUniqueId = aGraphicObject.GetUniqueID(); - sal_Bool bRetValue = ImplCreateEmbeddedBmp( aUniqueId ); - if ( bRetValue ) - AddOpt( ESCHER_Prop_fillType, ESCHER_FillTexture ); - return bRetValue; -} - - -sal_Bool EscherPropertyContainer::CreateGraphicProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - const String& rSource, const sal_Bool bCreateFillBitmap, const sal_Bool bCreateCroppingAttributes, - const sal_Bool bFillBitmapModeAllowed ) -{ - sal_Bool bRetValue = sal_False; - sal_Bool bCreateFillStyles = sal_False; - - sal_Bool bMirrored = sal_False; - sal_Bool bRotate = sal_True; - sal_uInt16 nAngle = 0; - GraphicAttr* pGraphicAttr = NULL; - GraphicObject aGraphicObject; - String aGraphicUrl; - ByteString aUniqueId; - bool bIsGraphicMtf(false); - - ::com::sun::star::drawing::BitmapMode eBitmapMode( ::com::sun::star::drawing::BitmapMode_NO_REPEAT ); - ::com::sun::star::uno::Any aAny; - - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, rSource ) ) - { - if ( rSource == String( RTL_CONSTASCII_USTRINGPARAM( "MetaFile" ) ) ) - { - ::com::sun::star::uno::Sequence<sal_uInt8> aSeq = *(::com::sun::star::uno::Sequence<sal_uInt8>*)aAny.getValue(); - const sal_uInt8* pAry = aSeq.getArray(); - sal_uInt32 nAryLen = aSeq.getLength(); - - // the metafile is already rotated - bRotate = sal_False; - - if ( pAry && nAryLen ) - { - Graphic aGraphic; - SvMemoryStream aTemp( (void*)pAry, nAryLen, STREAM_READ ); - sal_uInt32 nErrCode = GraphicConverter::Import( aTemp, aGraphic, CVT_WMF ); - if ( nErrCode == ERRCODE_NONE ) - { - aGraphicObject = aGraphic; - aUniqueId = aGraphicObject.GetUniqueID(); - bIsGraphicMtf = aGraphicObject.GetType() == GRAPHIC_GDIMETAFILE; - } - } - } - else if ( rSource == String( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ) ) ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap >xBitmap; - if ( ::cppu::extractInterface( xBitmap, aAny ) ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp; - if ( aAny >>= xBmp ) - { - BitmapEx aBitmapEx( VCLUnoHelper::GetBitmap( xBmp ) ); - Graphic aGraphic( aBitmapEx ); - aGraphicObject = aGraphic; - aUniqueId = aGraphicObject.GetUniqueID(); - bIsGraphicMtf = aGraphicObject.GetType() == GRAPHIC_GDIMETAFILE; - } - } - } - else if ( rSource == String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ) ) ) - { - aGraphicUrl = *(::rtl::OUString*)aAny.getValue(); - } - else if ( rSource == String( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ) ) - { - aGraphicUrl = *(::rtl::OUString*)aAny.getValue(); - bCreateFillStyles = sal_True; - } - else if ( rSource == String( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ) ) ) - { - ::com::sun::star::drawing::Hatch aHatch; - if ( aAny >>= aHatch ) - { - Color aBackColor; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ), sal_False ) ) - { - aBackColor = ImplGetColor( *((sal_uInt32*)aAny.getValue()), sal_False ); - } - bool bFillBackground = false; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "FillBackground" ) ), sal_True ) ) - { - aAny >>= bFillBackground; - } - aGraphicObject = lclDrawHatch( aHatch, aBackColor, bFillBackground ); - aUniqueId = aGraphicObject.GetUniqueID(); - eBitmapMode = ::com::sun::star::drawing::BitmapMode_REPEAT; - bIsGraphicMtf = aGraphicObject.GetType() == GRAPHIC_GDIMETAFILE; - } - } - - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "IsMirrored" ) ), sal_True ) ) - aAny >>= bMirrored; - - if ( bCreateFillBitmap && bFillBitmapModeAllowed ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapMode" ) ), sal_True ) ) - aAny >>= eBitmapMode; - } - else - { - nAngle = bRotate && EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "RotateAngle" ) ), sal_True ) - ? (sal_uInt16)( ( *((sal_Int32*)aAny.getValue() ) ) + 5 ) / 10 - : 0; - } - - if ( aGraphicUrl.Len() ) - { - String aVndUrl( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) ); - xub_StrLen nIndex = aGraphicUrl.Search( aVndUrl, 0 ); - if ( nIndex != STRING_NOTFOUND ) - { - nIndex = nIndex + aVndUrl.Len(); - if ( aGraphicUrl.Len() > nIndex ) - aUniqueId = ByteString( aGraphicUrl, nIndex, aGraphicUrl.Len() - nIndex, RTL_TEXTENCODING_UTF8 ); - } - else - { - // externally, linked graphic? convert to embedded - // one, if transformations are needed. this is because - // everything < msoxp cannot even handle rotated - // bitmaps. - // And check whether the graphic link target is - // actually supported by mso. - INetURLObject aTmp( aGraphicUrl ); - GraphicDescriptor aDescriptor(aTmp); - aDescriptor.Detect(); - const USHORT nFormat = aDescriptor.GetFileFormat(); - - // can MSO handle it? - if ( bMirrored || nAngle || - (nFormat != GFF_BMP && - nFormat != GFF_GIF && - nFormat != GFF_JPG && - nFormat != GFF_PNG && - nFormat != GFF_TIF && - nFormat != GFF_PCT && - nFormat != GFF_WMF && - nFormat != GFF_EMF) ) - { - SvStream* pIn = ::utl::UcbStreamHelper::CreateStream( - aTmp.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ ); - if ( pIn ) - { - Graphic aGraphic; - sal_uInt32 nErrCode = GraphicConverter::Import( *pIn, aGraphic ); - - if ( nErrCode == ERRCODE_NONE ) - { - // no. - aGraphicObject = aGraphic; - aUniqueId = aGraphicObject.GetUniqueID(); - } - // else: simply keep the graphic link - delete pIn; - } - } - } - } - - if ( aGraphicUrl.Len() || aUniqueId.Len() ) - { - if ( bMirrored || nAngle ) - { - pGraphicAttr = new GraphicAttr; - if ( bMirrored ) - pGraphicAttr->SetMirrorFlags( BMP_MIRROR_HORZ ); - if ( bIsGraphicMtf ) - AddOpt( ESCHER_Prop_Rotation, ( ( ((sal_Int32)nAngle << 16 ) / 10 ) + 0x8000 ) &~ 0xffff ); - else - { - pGraphicAttr->SetRotation( nAngle ); - if ( nAngle && pShapeBoundRect ) // up to xp ppoint does not rotate bitmaps ! - { - Polygon aPoly( *pShapeBoundRect ); - aPoly.Rotate( pShapeBoundRect->TopLeft(), nAngle ); - *pShapeBoundRect = aPoly.GetBoundRect(); - bSuppressRotation = sal_True; - } - } - } - - if ( eBitmapMode == ::com::sun::star::drawing::BitmapMode_REPEAT ) - AddOpt( ESCHER_Prop_fillType, ESCHER_FillTexture ); - else - AddOpt( ESCHER_Prop_fillType, ESCHER_FillPicture ); - - if ( aUniqueId.Len() ) - { - // write out embedded graphic - if ( pGraphicProvider && pPicOutStrm && pShapeBoundRect ) - { - Rectangle aRect( Point( 0, 0 ), pShapeBoundRect->GetSize() ); - - sal_uInt32 nBlibId = 0; - nBlibId = pGraphicProvider->GetBlibID( *pPicOutStrm, aUniqueId, aRect, NULL, pGraphicAttr ); - if ( nBlibId ) - { - if ( bCreateFillBitmap ) - AddOpt( ESCHER_Prop_fillBlip, nBlibId, sal_True ); - else - { - AddOpt( ESCHER_Prop_pib, nBlibId, sal_True ); - ImplCreateGraphicAttributes( rXPropSet, nBlibId, bCreateCroppingAttributes ); - } - bRetValue = sal_True; - } - } - else - { - EscherGraphicProvider aProvider; - SvMemoryStream aMemStrm; - Rectangle aRect; - - if ( aProvider.GetBlibID( aMemStrm, aUniqueId, aRect, NULL, pGraphicAttr ) ) - { - // grab BLIP from stream and insert directly as complex property - // ownership of stream memory goes to complex property - aMemStrm.ObjectOwnsMemory( FALSE ); - sal_uInt8* pBuf = (sal_uInt8*) aMemStrm.GetData(); - sal_uInt32 nSize = aMemStrm.Seek( STREAM_SEEK_TO_END ); - AddOpt( ESCHER_Prop_fillBlip, sal_True, nSize, pBuf, nSize ); - bRetValue = sal_True; - } - } - } - // write out link to graphic - else - { - OSL_ASSERT(aGraphicUrl.Len()); - - AddOpt( ESCHER_Prop_pibName, aGraphicUrl ); - sal_uInt32 nPibFlags=0; - GetOpt( ESCHER_Prop_pibFlags, nPibFlags ); - AddOpt( ESCHER_Prop_pibFlags, - ESCHER_BlipFlagLinkToFile|ESCHER_BlipFlagFile|ESCHER_BlipFlagDoNotSave | nPibFlags ); - } - } - } - delete pGraphicAttr; - if ( bCreateFillStyles ) - CreateFillProperties( rXPropSet, sal_True ); - - return bRetValue; -} - -PolyPolygon EscherPropertyContainer::GetPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape ) -{ - PolyPolygon aRetPolyPoly; - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aXPropSet; - ::com::sun::star::uno::Any aAny( rXShape->queryInterface( - ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >*) 0 ) )); - - String sPolyPolygonBezier( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygonBezier" ) ); - String sPolyPolygon ( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygon" ) ); - String sPolygon ( RTL_CONSTASCII_USTRINGPARAM( "Polygon" ) ); - - if ( aAny >>= aXPropSet ) - { - sal_Bool bHasProperty = EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sPolyPolygonBezier, sal_True ); - if ( !bHasProperty ) - bHasProperty = EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sPolyPolygon, sal_True ); - if ( !bHasProperty ) - bHasProperty = EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sPolygon, sal_True ); - if ( bHasProperty ) - aRetPolyPoly = GetPolyPolygon( aAny ); - } - return aRetPolyPoly; -} - -PolyPolygon EscherPropertyContainer::GetPolyPolygon( const ::com::sun::star::uno::Any& rAny ) -{ - sal_Bool bNoError = sal_True; - - Polygon aPolygon; - PolyPolygon aPolyPolygon; - - if ( rAny.getValueType() == ::getCppuType( ( const ::com::sun::star::drawing::PolyPolygonBezierCoords* ) 0 ) ) - { - ::com::sun::star::drawing::PolyPolygonBezierCoords* pSourcePolyPolygon - = (::com::sun::star::drawing::PolyPolygonBezierCoords*)rAny.getValue(); - sal_uInt16 nOuterSequenceCount = (sal_uInt16)pSourcePolyPolygon->Coordinates.getLength(); - - // Zeiger auf innere sequences holen - ::com::sun::star::drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->Coordinates.getArray(); - ::com::sun::star::drawing::FlagSequence* pOuterFlags = pSourcePolyPolygon->Flags.getArray(); - - bNoError = pOuterSequence && pOuterFlags; - if ( bNoError ) - { - sal_uInt16 a, b, nInnerSequenceCount; - ::com::sun::star::awt::Point* pArray; - - // dies wird ein Polygon set - for ( a = 0; a < nOuterSequenceCount; a++ ) - { - ::com::sun::star::drawing::PointSequence* pInnerSequence = pOuterSequence++; - ::com::sun::star::drawing::FlagSequence* pInnerFlags = pOuterFlags++; - - bNoError = pInnerSequence && pInnerFlags; - if ( bNoError ) - { - // Zeiger auf Arrays holen - pArray = pInnerSequence->getArray(); - ::com::sun::star::drawing::PolygonFlags* pFlags = pInnerFlags->getArray(); - - if ( pArray && pFlags ) - { - nInnerSequenceCount = (sal_uInt16)pInnerSequence->getLength(); - aPolygon = Polygon( nInnerSequenceCount ); - for( b = 0; b < nInnerSequenceCount; b++) - { - PolyFlags ePolyFlags( *( (PolyFlags*)pFlags++ ) ); - ::com::sun::star::awt::Point aPoint( (::com::sun::star::awt::Point)*(pArray++) ); - aPolygon[ b ] = Point( aPoint.X, aPoint.Y ); - aPolygon.SetFlags( b, ePolyFlags ); - - if ( ePolyFlags == POLY_CONTROL ) - continue; - } - aPolyPolygon.Insert( aPolygon, POLYPOLY_APPEND ); - } - } - } - } - } - else if ( rAny.getValueType() == ::getCppuType( ( const ::com::sun::star::drawing::PointSequenceSequence* ) 0 ) ) - { - ::com::sun::star::drawing::PointSequenceSequence* pSourcePolyPolygon - = (::com::sun::star::drawing::PointSequenceSequence*)rAny.getValue(); - sal_uInt16 nOuterSequenceCount = (sal_uInt16)pSourcePolyPolygon->getLength(); - - // Zeiger auf innere sequences holen - ::com::sun::star::drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->getArray(); - bNoError = pOuterSequence != NULL; - if ( bNoError ) - { - sal_uInt16 a, b, nInnerSequenceCount; - - // dies wird ein Polygon set - for( a = 0; a < nOuterSequenceCount; a++ ) - { - ::com::sun::star::drawing::PointSequence* pInnerSequence = pOuterSequence++; - bNoError = pInnerSequence != NULL; - if ( bNoError ) - { - // Zeiger auf Arrays holen - ::com::sun::star::awt::Point* pArray = - pInnerSequence->getArray(); - if ( pArray != NULL ) - { - nInnerSequenceCount = (sal_uInt16)pInnerSequence->getLength(); - aPolygon = Polygon( nInnerSequenceCount ); - for( b = 0; b < nInnerSequenceCount; b++) - { - aPolygon[ b ] = Point( pArray->X, pArray->Y ); - pArray++; - } - aPolyPolygon.Insert( aPolygon, POLYPOLY_APPEND ); - } - } - } - } - } - else if ( rAny.getValueType() == ::getCppuType( ( const ::com::sun::star::drawing::PointSequence* ) 0 ) ) - { - ::com::sun::star::drawing::PointSequence* pInnerSequence = - (::com::sun::star::drawing::PointSequence*)rAny.getValue(); - - bNoError = pInnerSequence != NULL; - if ( bNoError ) - { - sal_uInt16 a, nInnerSequenceCount; - - // Zeiger auf Arrays holen - ::com::sun::star::awt::Point* pArray = pInnerSequence->getArray(); - if ( pArray != NULL ) - { - nInnerSequenceCount = (sal_uInt16)pInnerSequence->getLength(); - aPolygon = Polygon( nInnerSequenceCount ); - for( a = 0; a < nInnerSequenceCount; a++) - { - aPolygon[ a ] = Point( pArray->X, pArray->Y ); - pArray++; - } - aPolyPolygon.Insert( aPolygon, POLYPOLY_APPEND ); - } - } - } - return aPolyPolygon; -} - -sal_Bool EscherPropertyContainer::CreatePolygonProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - sal_uInt32 nFlags, - sal_Bool bBezier, - ::com::sun::star::awt::Rectangle& rGeoRect, - Polygon* pPolygon ) -{ - static String sPolyPolygonBezier( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygonBezier" ) ); - static String sPolyPolygon ( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygon" ) ); - - sal_Bool bRetValue = sal_True; - sal_Bool bLine = ( nFlags & ESCHER_CREATEPOLYGON_LINE ) != 0; - - PolyPolygon aPolyPolygon; - - if ( pPolygon ) - aPolyPolygon.Insert( *pPolygon, POLYPOLY_APPEND ); - else - { - ::com::sun::star::uno::Any aAny; - bRetValue = EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - ( bBezier ) ? sPolyPolygonBezier : sPolyPolygon, sal_True ); - if ( bRetValue ) - { - aPolyPolygon = GetPolyPolygon( aAny ); - bRetValue = aPolyPolygon.Count() != 0; - } - } - if ( bRetValue ) - { - if ( bLine ) - { - if ( ( aPolyPolygon.Count() == 1 ) && ( aPolyPolygon[ 0 ].GetSize() == 2 ) ) - { - const Polygon& rPoly = aPolyPolygon[ 0 ]; - rGeoRect = ::com::sun::star::awt::Rectangle( - rPoly[ 0 ].X(), - rPoly[ 0 ].Y(), - rPoly[ 1 ].X() - rPoly[ 0 ].X(), - rPoly[ 1 ].Y() - rPoly[ 0 ].Y() ); - } - else - bRetValue = sal_False; - } - else - { - Polygon aPolygon; - - sal_uInt16 i, j, k, nPoints, nBezPoints, nPolyCount = aPolyPolygon.Count(); - Rectangle aRect( aPolyPolygon.GetBoundRect() ); - rGeoRect = ::com::sun::star::awt::Rectangle( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight() ); - - for ( nBezPoints = nPoints = i = 0; i < nPolyCount; i++ ) - { - k = aPolyPolygon[ i ].GetSize(); - nPoints = nPoints + k; - for ( j = 0; j < k; j++ ) - { - if ( aPolyPolygon[ i ].GetFlags( j ) != POLY_CONTROL ) - nBezPoints++; - } - } - sal_uInt32 nVerticesBufSize = ( nPoints << 2 ) + 6; - sal_uInt8* pVerticesBuf = new sal_uInt8[ nVerticesBufSize ]; - - - sal_uInt32 nSegmentBufSize = ( ( nBezPoints << 2 ) + 8 ); - if ( nPolyCount > 1 ) - nSegmentBufSize += ( nPolyCount << 1 ); - sal_uInt8* pSegmentBuf = new sal_uInt8[ nSegmentBufSize ]; - - sal_uInt8* pPtr = pVerticesBuf; - *pPtr++ = (sal_uInt8)( nPoints ); // Little endian - *pPtr++ = (sal_uInt8)( nPoints >> 8 ); - *pPtr++ = (sal_uInt8)( nPoints ); - *pPtr++ = (sal_uInt8)( nPoints >> 8 ); - *pPtr++ = (sal_uInt8)0xf0; - *pPtr++ = (sal_uInt8)0xff; - - for ( j = 0; j < nPolyCount; j++ ) - { - aPolygon = aPolyPolygon[ j ]; - nPoints = aPolygon.GetSize(); - for ( i = 0; i < nPoints; i++ ) // Punkte aus Polygon in Buffer schreiben - { - Point aPoint = aPolygon[ i ]; - aPoint.X() -= rGeoRect.X; - aPoint.Y() -= rGeoRect.Y; - - *pPtr++ = (sal_uInt8)( aPoint.X() ); - *pPtr++ = (sal_uInt8)( aPoint.X() >> 8 ); - *pPtr++ = (sal_uInt8)( aPoint.Y() ); - *pPtr++ = (sal_uInt8)( aPoint.Y() >> 8 ); - } - } - - pPtr = pSegmentBuf; - *pPtr++ = (sal_uInt8)( ( nSegmentBufSize - 6 ) >> 1 ); - *pPtr++ = (sal_uInt8)( ( nSegmentBufSize - 6 ) >> 9 ); - *pPtr++ = (sal_uInt8)( ( nSegmentBufSize - 6 ) >> 1 ); - *pPtr++ = (sal_uInt8)( ( nSegmentBufSize - 6 ) >> 9 ); - *pPtr++ = (sal_uInt8)2; - *pPtr++ = (sal_uInt8)0; - - for ( j = 0; j < nPolyCount; j++ ) - { - *pPtr++ = 0x0; // Polygon start - *pPtr++ = 0x40; - aPolygon = aPolyPolygon[ j ]; - nPoints = aPolygon.GetSize(); - for ( i = 0; i < nPoints; i++ ) // Polyflags in Buffer schreiben - { - *pPtr++ = 0; - if ( bBezier ) - *pPtr++ = 0xb3; - else - *pPtr++ = 0xac; - if ( ( i + 1 ) != nPoints ) - { - *pPtr++ = 1; - if ( aPolygon.GetFlags( i + 1 ) == POLY_CONTROL ) - { - *pPtr++ = 0x20; - i += 2; - } - else - *pPtr++ = 0; - } - } - if ( nPolyCount > 1 ) - { - *pPtr++ = 1; // end of polygon - *pPtr++ = 0x60; - } - } - *pPtr++ = 0; - *pPtr++ = 0x80; - - AddOpt( ESCHER_Prop_geoRight, rGeoRect.Width ); - AddOpt( ESCHER_Prop_geoBottom, rGeoRect.Height ); - - AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex ); - AddOpt( ESCHER_Prop_pVertices, TRUE, nVerticesBufSize - 6, (sal_uInt8*)pVerticesBuf, nVerticesBufSize ); - AddOpt( ESCHER_Prop_pSegmentInfo, TRUE, nSegmentBufSize, (sal_uInt8*)pSegmentBuf, nSegmentBufSize ); - } - } - return bRetValue; -} - -sal_Bool EscherPropertyContainer::CreateConnectorProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape, - EscherSolverContainer& rSolverContainer, ::com::sun::star::awt::Rectangle& rGeoRect, - sal_uInt16& rShapeType, sal_uInt16& rShapeFlags ) -{ - static String sEdgeKind ( RTL_CONSTASCII_USTRINGPARAM( "EdgeKind" ) ); - static String sEdgeStartPoint ( RTL_CONSTASCII_USTRINGPARAM( "EdgeStartPoint" ) ); - static String sEdgeEndPoint ( RTL_CONSTASCII_USTRINGPARAM( "EdgeEndPoint" ) ); - static String sEdgeStartConnection ( RTL_CONSTASCII_USTRINGPARAM( "EdgeStartConnection" ) ); - static String sEdgeEndConnection ( RTL_CONSTASCII_USTRINGPARAM( "EdgeEndConnection" ) ); - - sal_Bool bRetValue = sal_False; - rShapeType = rShapeFlags = 0; - - if ( rXShape.is() ) - { - ::com::sun::star::awt::Point aStartPoint, aEndPoint; - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aXPropSet; - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > aShapeA, aShapeB; - ::com::sun::star::uno::Any aAny( rXShape->queryInterface( ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >*) 0 ) )); - if ( aAny >>= aXPropSet ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sEdgeKind, sal_True ) ) - { - ::com::sun::star::drawing::ConnectorType eCt; - aAny >>= eCt; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sEdgeStartPoint ) ) - { - aStartPoint = *(::com::sun::star::awt::Point*)aAny.getValue(); - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sEdgeEndPoint ) ) - { - aEndPoint = *(::com::sun::star::awt::Point*)aAny.getValue(); - - rShapeFlags = SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_HAVESPT | SHAPEFLAG_CONNECTOR; - rGeoRect = ::com::sun::star::awt::Rectangle( aStartPoint.X, aStartPoint.Y, - ( aEndPoint.X - aStartPoint.X ) + 1, ( aEndPoint.Y - aStartPoint.Y ) + 1 ); - if ( rGeoRect.Height < 0 ) // justify - { - rShapeFlags |= SHAPEFLAG_FLIPV; - rGeoRect.Y = aEndPoint.Y; - rGeoRect.Height = -rGeoRect.Height; - } - if ( rGeoRect.Width < 0 ) - { - rShapeFlags |= SHAPEFLAG_FLIPH; - rGeoRect.X = aEndPoint.X; - rGeoRect.Width = -rGeoRect.Width; - } - sal_uInt32 nAdjustValue1, nAdjustValue2, nAdjustValue3; - nAdjustValue1 = nAdjustValue2 = nAdjustValue3 = 0x2a30; - - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sEdgeStartConnection ) ) - aAny >>= aShapeA; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, sEdgeEndConnection ) ) - aAny >>= aShapeB; -/* - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeLine1Delta" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeLine2Delta" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeLine3Delta" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeNode1HorzDist" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeNode1VertDist" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeNode2HorzDist" ) ) ) ) - { - } - if ( ImplGetPropertyValue( String( RTL_CONSTASCII_USTRINGPARAM( "EdgeNode2VertDist" ) ) ) ) - { - } -*/ - rSolverContainer.AddConnector( rXShape, aStartPoint, aShapeA, aEndPoint, aShapeB ); - switch ( eCt ) - { - case ::com::sun::star::drawing::ConnectorType_CURVE : - { - rShapeType = ESCHER_ShpInst_CurvedConnector3; - AddOpt( ESCHER_Prop_cxstyle, ESCHER_cxstyleCurved ); - AddOpt( ESCHER_Prop_adjustValue, nAdjustValue1 ); - AddOpt( ESCHER_Prop_adjust2Value, -(sal_Int32)nAdjustValue2 ); - } - break; - - case ::com::sun::star::drawing::ConnectorType_STANDARD :// Connector 2->5 - { - rShapeType = ESCHER_ShpInst_BentConnector3; - AddOpt( ESCHER_Prop_cxstyle, ESCHER_cxstyleBent ); - } - break; - - default: - case ::com::sun::star::drawing::ConnectorType_LINE : - case ::com::sun::star::drawing::ConnectorType_LINES : // Connector 2->5 - { - rShapeType = ESCHER_ShpInst_StraightConnector1; - AddOpt( ESCHER_Prop_cxstyle, ESCHER_cxstyleStraight ); - } - break; - } - CreateLineProperties( aXPropSet, sal_False ); - bRetValue = bSuppressRotation = sal_True; - } - } - } - } - } - return bRetValue; -} - -sal_Bool EscherPropertyContainer::CreateShadowProperties( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet ) -{ - ::com::sun::star::uno::Any aAny; - - sal_Bool bHasShadow = sal_False; // shadow is possible only if at least a fillcolor, linecolor or graphic is set - sal_uInt32 nLineFlags = 0; // default : shape has no line - sal_uInt32 nFillFlags = 0x10; // shape is filled - - GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ); - GetOpt( ESCHER_Prop_fNoFillHitTest, nFillFlags ); - - sal_uInt32 nDummy; - sal_Bool bGraphic = GetOpt( DFF_Prop_pib, nDummy ) || GetOpt( DFF_Prop_pibName, nDummy ) || GetOpt( DFF_Prop_pibFlags, nDummy ); - - sal_uInt32 nShadowFlags = 0x20000; - if ( ( nLineFlags & 8 ) || ( nFillFlags & 0x10 ) || bGraphic ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "Shadow" ) ), sal_True ) ) - { - if ( aAny >>= bHasShadow ) - { - if ( bHasShadow ) - { - nShadowFlags |= 2; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "ShadowColor" ) ), sal_False ) ) - AddOpt( ESCHER_Prop_shadowColor, ImplGetColor( *((sal_uInt32*)aAny.getValue()) ) ); - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "ShadowXDistance" ) ), sal_False ) ) - AddOpt( ESCHER_Prop_shadowOffsetX, *((sal_Int32*)aAny.getValue()) * 360 ); - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "ShadowYDistance" ) ), sal_False ) ) - AddOpt( ESCHER_Prop_shadowOffsetY, *((sal_Int32*)aAny.getValue()) * 360 ); - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, rXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "ShadowTransparence" ) ), sal_False ) ) - AddOpt( ESCHER_Prop_shadowOpacity, 0x10000 - (((sal_uInt32)*((sal_uInt16*)aAny.getValue())) * 655 ) ); - } - } - } - } - AddOpt( ESCHER_Prop_fshadowObscured, nShadowFlags ); - return bHasShadow; -} - -// --------------------------------------------------------------------------------------------- - -sal_Int32 GetValueForEnhancedCustomShapeParameter( const com::sun::star::drawing::EnhancedCustomShapeParameter& rParameter, const std::vector< sal_Int32 >& rEquationOrder ) -{ - sal_Int32 nValue = 0; - if ( rParameter.Value.getValueTypeClass() == uno::TypeClass_DOUBLE ) - { - double fValue; - if ( rParameter.Value >>= fValue ) - nValue = (sal_Int32)fValue; - } - else - rParameter.Value >>= nValue; - - switch( rParameter.Type ) - { - case com::sun::star::drawing::EnhancedCustomShapeParameterType::EQUATION : - { - nValue = (sal_uInt16)rEquationOrder[ nValue ]; - nValue |= (sal_uInt32)0x80000000; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeParameterType::NORMAL : - { - - } - break; -/* not sure if it is allowed to set following values -(but they are not yet used) - case com::sun::star::drawing::EnhancedCustomShapeParameterType::ADJUSTMENT : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::BOTTOM : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::RIGHT : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::TOP : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::LEFT : -*/ - } - return nValue; -} - -sal_Bool GetValueForEnhancedCustomShapeHandleParameter( sal_Int32& nRetValue, const com::sun::star::drawing::EnhancedCustomShapeParameter& rParameter ) -{ - sal_Bool bSpecial = sal_False; - nRetValue = 0; - if ( rParameter.Value.getValueTypeClass() == uno::TypeClass_DOUBLE ) - { - double fValue; - if ( rParameter.Value >>= fValue ) - nRetValue = (sal_Int32)fValue; - } - else - rParameter.Value >>= nRetValue; - - switch( rParameter.Type ) - { - case com::sun::star::drawing::EnhancedCustomShapeParameterType::EQUATION : - { - nRetValue += 3; - bSpecial = sal_True; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeParameterType::ADJUSTMENT : - { - nRetValue += 0x100; - bSpecial = sal_True; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeParameterType::TOP : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::LEFT : - { - nRetValue = 0; - bSpecial = sal_True; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeParameterType::RIGHT : - case com::sun::star::drawing::EnhancedCustomShapeParameterType::BOTTOM : - { - nRetValue = 1; - bSpecial = sal_True; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeParameterType::NORMAL : - { - - } - break; - } - return bSpecial; -} - -void ConvertEnhancedCustomShapeEquation( SdrObjCustomShape* pCustoShape, - std::vector< EnhancedCustomShapeEquation >& rEquations, std::vector< sal_Int32 >& rEquationOrder ) -{ - if ( pCustoShape ) - { - uno::Sequence< rtl::OUString > sEquationSource; - const rtl::OUString sEquations( RTL_CONSTASCII_USTRINGPARAM( "Equations" ) ); - SdrCustomShapeGeometryItem& rGeometryItem = (SdrCustomShapeGeometryItem&)(const SdrCustomShapeGeometryItem&) - pCustoShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); - const uno::Any* pAny = ((SdrCustomShapeGeometryItem&)rGeometryItem).GetPropertyValueByName( sEquations ); - if ( pAny ) - *pAny >>= sEquationSource; - sal_Int32 nEquationSourceCount = sEquationSource.getLength(); - if ( nEquationSourceCount ) - { - sal_Int32 i; - for ( i = 0; i < nEquationSourceCount; i++ ) - { - EnhancedCustomShape2d aCustoShape2d( pCustoShape ); - try - { - ::boost::shared_ptr< EnhancedCustomShape::ExpressionNode > aExpressNode( - EnhancedCustomShape::FunctionParser::parseFunction( sEquationSource[ i ], aCustoShape2d ) ); - com::sun::star::drawing::EnhancedCustomShapeParameter aPara( aExpressNode->fillNode( rEquations, NULL, 0 ) ); - if ( aPara.Type != com::sun::star::drawing::EnhancedCustomShapeParameterType::EQUATION ) - { - EnhancedCustomShapeEquation aEquation; - aEquation.nOperation = 0; - EnhancedCustomShape::FillEquationParameter( aPara, 0, aEquation ); - rEquations.push_back( aEquation ); - } - } - catch ( EnhancedCustomShape::ParseError& ) - { - EnhancedCustomShapeEquation aEquation; // ups, we should not be here, - aEquation.nOperation = 0; // creating a default equation with value 1 - aEquation.nPara[ 0 ] = 1; // hoping that this will not break anything - rEquations.push_back( aEquation ); - } - rEquationOrder.push_back( rEquations.size() - 1 ); - } - // now updating our old equation indices, they are marked with a bit in the hiword of nOperation - std::vector< EnhancedCustomShapeEquation >::iterator aIter( rEquations.begin() ); - std::vector< EnhancedCustomShapeEquation >::iterator aEnd ( rEquations.end() ); - while( aIter != aEnd ) - { - sal_Int32 nMask = 0x20000000; - for( i = 0; i < 3; i++ ) - { - if ( aIter->nOperation & nMask ) - { - aIter->nOperation ^= nMask; - aIter->nPara[ i ] = rEquationOrder[ aIter->nPara[ i ] & 0x3ff ] | 0x400; - } - nMask <<= 1; - } - aIter++; - } - } - } -} - -sal_Bool EscherPropertyContainer::IsDefaultObject( SdrObjCustomShape* pCustoShape ) -{ - sal_Bool bIsDefaultObject = sal_False; - if ( pCustoShape ) - { - if ( pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_EQUATIONS ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_VIEWBOX ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_PATH ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_GLUEPOINTS ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_SEGMENTS ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_STRETCHX ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_STRETCHY ) -// && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_HANDLES ) - && pCustoShape->IsDefaultGeometry( SdrObjCustomShape::DEFAULT_TEXTFRAMES ) ) - bIsDefaultObject = sal_True; - } - - return bIsDefaultObject; -} - -void EscherPropertyContainer::LookForPolarHandles( const MSO_SPT eShapeType, sal_Int32& nAdjustmentsWhichNeedsToBeConverted ) -{ - const mso_CustomShape* pDefCustomShape = GetCustomShapeContent( eShapeType ); - if ( pDefCustomShape && pDefCustomShape->nHandles && pDefCustomShape->pHandles ) - { - sal_Int32 k, nkCount = pDefCustomShape->nHandles; - const SvxMSDffHandle* pData = pDefCustomShape->pHandles; - for ( k = 0; k < nkCount; k++, pData++ ) - { - if ( pData->nFlags & MSDFF_HANDLE_FLAGS_POLAR ) - { - if ( ( pData->nPositionY >= 0x256 ) || ( pData->nPositionY <= 0x107 ) ) - nAdjustmentsWhichNeedsToBeConverted |= ( 1 << k ); - } - } - } -} - -sal_Bool EscherPropertyContainer::GetAdjustmentValue( const com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue & rkProp, sal_Int32 nIndex, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, sal_Int32& nValue ) -{ - if ( rkProp.State != beans::PropertyState_DIRECT_VALUE ) - return FALSE; - - sal_Bool bUseFixedFloat = ( nAdjustmentsWhichNeedsToBeConverted & ( 1 << nIndex ) ) != 0; - if ( rkProp.Value.getValueTypeClass() == uno::TypeClass_DOUBLE ) - { - double fValue; - rkProp.Value >>= fValue; - if ( bUseFixedFloat ) - fValue *= 65536.0; - nValue = (sal_Int32)fValue; - } - else - { - rkProp.Value >>= nValue; - if ( bUseFixedFloat ) - nValue <<= 16; - } - - return TRUE; -} - -void EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeType, const uno::Reference< drawing::XShape > & rXShape ) -{ - uno::Reference< beans::XPropertySet > aXPropSet( rXShape, uno::UNO_QUERY ); - if ( aXPropSet.is() ) - { - SdrObjCustomShape* pCustoShape = (SdrObjCustomShape*)GetSdrObjectFromXShape( rXShape ); - const rtl::OUString sCustomShapeGeometry( RTL_CONSTASCII_USTRINGPARAM( "CustomShapeGeometry" ) ); - uno::Any aGeoPropSet = aXPropSet->getPropertyValue( sCustomShapeGeometry ); - uno::Sequence< beans::PropertyValue > aGeoPropSeq; - if ( aGeoPropSet >>= aGeoPropSeq ) - { - const rtl::OUString sViewBox ( RTL_CONSTASCII_USTRINGPARAM( "ViewBox" ) ); - const rtl::OUString sTextRotateAngle ( RTL_CONSTASCII_USTRINGPARAM( "TextRotateAngle" ) ); - const rtl::OUString sExtrusion ( RTL_CONSTASCII_USTRINGPARAM( "Extrusion" ) ); - const rtl::OUString sEquations ( RTL_CONSTASCII_USTRINGPARAM( "Equations" ) ); - const rtl::OUString sPath ( RTL_CONSTASCII_USTRINGPARAM( "Path" ) ); - const rtl::OUString sTextPath ( RTL_CONSTASCII_USTRINGPARAM( "TextPath" ) ); - const rtl::OUString sHandles ( RTL_CONSTASCII_USTRINGPARAM( "Handles" ) ); - const rtl::OUString sAdjustmentValues ( RTL_CONSTASCII_USTRINGPARAM( "AdjustmentValues" ) ); - - const beans::PropertyValue* pAdjustmentValuesProp = NULL; - sal_Int32 nAdjustmentsWhichNeedsToBeConverted = 0; - uno::Sequence< beans::PropertyValues > aHandlesPropSeq; - sal_Bool bPredefinedHandlesUsed = sal_True; - sal_Bool bIsDefaultObject = IsDefaultObject( pCustoShape ); - - // convert property "Equations" into std::vector< EnhancedCustomShapeEquationEquation > - std::vector< EnhancedCustomShapeEquation > aEquations; - std::vector< sal_Int32 > aEquationOrder; - ConvertEnhancedCustomShapeEquation( pCustoShape, aEquations, aEquationOrder ); - - sal_Int32 i, nCount = aGeoPropSeq.getLength(); - for ( i = 0; i < nCount; i++ ) - { - const beans::PropertyValue& rProp = aGeoPropSeq[ i ]; - if ( rProp.Name.equals( sViewBox ) ) - { - if ( !bIsDefaultObject ) - { - awt::Rectangle aViewBox; - if ( rProp.Value >>= aViewBox ) - { - AddOpt( DFF_Prop_geoLeft, aViewBox.X ); - AddOpt( DFF_Prop_geoTop, aViewBox.Y ); - AddOpt( DFF_Prop_geoRight, aViewBox.X + aViewBox.Width ); - AddOpt( DFF_Prop_geoBottom,aViewBox.Y + aViewBox.Height ); - } - } - } - else if ( rProp.Name.equals( sTextRotateAngle ) ) - { - double f = 0, fTextRotateAngle; - if ( rProp.Value >>= f ) - { - fTextRotateAngle = fmod( f, 360.0 ); - if ( fTextRotateAngle < 0 ) - fTextRotateAngle = 360 + fTextRotateAngle; - if ( ( fTextRotateAngle < 271.0 ) && ( fTextRotateAngle > 269.0 ) ) - AddOpt( DFF_Prop_cdirFont, mso_cdir90 ); - else if ( ( fTextRotateAngle < 181.0 ) && ( fTextRotateAngle > 179.0 ) ) - AddOpt( DFF_Prop_cdirFont, mso_cdir180 ); - else if ( ( fTextRotateAngle < 91.0 ) && ( fTextRotateAngle > 79.0 ) ) - AddOpt( DFF_Prop_cdirFont, mso_cdir270 ); - } - } - else if ( rProp.Name.equals( sExtrusion ) ) - { - uno::Sequence< beans::PropertyValue > aExtrusionPropSeq; - if ( rProp.Value >>= aExtrusionPropSeq ) - { - sal_uInt32 nLightFaceFlagsOrg, nLightFaceFlags; - sal_uInt32 nFillHarshFlagsOrg, nFillHarshFlags; - nLightFaceFlagsOrg = nLightFaceFlags = 0x000001; - nFillHarshFlagsOrg = nFillHarshFlags = 0x00001e; - if ( GetOpt( DFF_Prop_fc3DLightFace, nLightFaceFlags ) ) - nLightFaceFlagsOrg = nLightFaceFlags; - if ( GetOpt( DFF_Prop_fc3DFillHarsh, nFillHarshFlags ) ) - nFillHarshFlagsOrg = nFillHarshFlags; - - sal_Int32 r, nrCount = aExtrusionPropSeq.getLength(); - for ( r = 0; r < nrCount; r++ ) - { - const beans::PropertyValue& rrProp = aExtrusionPropSeq[ r ]; - const rtl::OUString sExtrusionBrightness ( RTL_CONSTASCII_USTRINGPARAM( "Brightness" ) ); - const rtl::OUString sExtrusionDepth ( RTL_CONSTASCII_USTRINGPARAM( "Depth" ) ); - const rtl::OUString sExtrusionDiffusion ( RTL_CONSTASCII_USTRINGPARAM( "Diffusion" ) ); - const rtl::OUString sExtrusionNumberOfLineSegments ( RTL_CONSTASCII_USTRINGPARAM( "NumberOfLineSegments" ) ); - const rtl::OUString sExtrusionLightFace ( RTL_CONSTASCII_USTRINGPARAM( "LightFace" ) ); - const rtl::OUString sExtrusionFirstLightHarsh ( RTL_CONSTASCII_USTRINGPARAM( "FirstLightHarsh" ) ); - const rtl::OUString sExtrusionSecondLightHarsh ( RTL_CONSTASCII_USTRINGPARAM( "SecondLightHarsh" ) ); - const rtl::OUString sExtrusionFirstLightLevel ( RTL_CONSTASCII_USTRINGPARAM( "FirstLightLevel" ) ); - const rtl::OUString sExtrusionSecondLightLevel ( RTL_CONSTASCII_USTRINGPARAM( "SecondLightLevel" ) ); - const rtl::OUString sExtrusionFirstLightDirection ( RTL_CONSTASCII_USTRINGPARAM( "FirstLightDirection" ) ); - const rtl::OUString sExtrusionSecondLightDirection ( RTL_CONSTASCII_USTRINGPARAM( "SecondLightDirection" ) ); - const rtl::OUString sExtrusionMetal ( RTL_CONSTASCII_USTRINGPARAM( "Metal" ) ); - const rtl::OUString sExtrusionShadeMode ( RTL_CONSTASCII_USTRINGPARAM( "ShadeMode" ) ); - const rtl::OUString sExtrusionRotateAngle ( RTL_CONSTASCII_USTRINGPARAM( "RotateAngle" ) ); - const rtl::OUString sExtrusionRotationCenter ( RTL_CONSTASCII_USTRINGPARAM( "RotationCenter" ) ); - const rtl::OUString sExtrusionShininess ( RTL_CONSTASCII_USTRINGPARAM( "Shininess" ) ); - const rtl::OUString sExtrusionSkew ( RTL_CONSTASCII_USTRINGPARAM( "Skew" ) ); - const rtl::OUString sExtrusionSpecularity ( RTL_CONSTASCII_USTRINGPARAM( "Specularity" ) ); - const rtl::OUString sExtrusionProjectionMode ( RTL_CONSTASCII_USTRINGPARAM( "ProjectionMode" ) ); - const rtl::OUString sExtrusionViewPoint ( RTL_CONSTASCII_USTRINGPARAM( "ViewPoint" ) ); - const rtl::OUString sExtrusionOrigin ( RTL_CONSTASCII_USTRINGPARAM( "Origin" ) ); - const rtl::OUString sExtrusionColor ( RTL_CONSTASCII_USTRINGPARAM( "Color" ) ); - - if ( rrProp.Name.equals( sExtrusion ) ) - { - sal_Bool bExtrusionOn = sal_Bool(); - if ( rrProp.Value >>= bExtrusionOn ) - { - nLightFaceFlags |= 0x80000; - if ( bExtrusionOn ) - nLightFaceFlags |= 8; - else - nLightFaceFlags &=~8; - } - } - else if ( rrProp.Name.equals( sExtrusionBrightness ) ) - { - double fExtrusionBrightness = 0; - if ( rrProp.Value >>= fExtrusionBrightness ) - AddOpt( DFF_Prop_c3DAmbientIntensity, (sal_Int32)( fExtrusionBrightness * 655.36 ) ); - } - else if ( rrProp.Name.equals( sExtrusionDepth ) ) - { - double fDepth = 0; - double fFraction = 0; - com::sun::star::drawing::EnhancedCustomShapeParameterPair aDepthParaPair; - if ( ( rrProp.Value >>= aDepthParaPair ) && ( aDepthParaPair.First.Value >>= fDepth ) && ( aDepthParaPair.Second.Value >>= fFraction ) ) - { - double fForeDepth = fDepth * fFraction; - double fBackDepth = fDepth - fForeDepth; - - fBackDepth *= 360.0; - AddOpt( DFF_Prop_c3DExtrudeBackward, (sal_Int32)fBackDepth ); - - if ( fForeDepth != 0.0 ) - { - fForeDepth *= 360.0; - AddOpt( DFF_Prop_c3DExtrudeForward, (sal_Int32)fForeDepth ); - } - } - } - else if ( rrProp.Name.equals( sExtrusionDiffusion ) ) - { - double fExtrusionDiffusion = 0; - if ( rrProp.Value >>= fExtrusionDiffusion ) - AddOpt( DFF_Prop_c3DDiffuseAmt, (sal_Int32)( fExtrusionDiffusion * 655.36 ) ); - } - else if ( rrProp.Name.equals( sExtrusionNumberOfLineSegments ) ) - { - sal_Int32 nExtrusionNumberOfLineSegments = 0; - if ( rrProp.Value >>= nExtrusionNumberOfLineSegments ) - AddOpt( DFF_Prop_c3DTolerance, nExtrusionNumberOfLineSegments ); - } - else if ( rrProp.Name.equals( sExtrusionLightFace ) ) - { - sal_Bool bExtrusionLightFace = sal_Bool(); - if ( rrProp.Value >>= bExtrusionLightFace ) - { - nLightFaceFlags |= 0x10000; - if ( bExtrusionLightFace ) - nLightFaceFlags |= 1; - else - nLightFaceFlags &=~1; - } - } - else if ( rrProp.Name.equals( sExtrusionFirstLightHarsh ) ) - { - sal_Bool bExtrusionFirstLightHarsh = sal_Bool(); - if ( rrProp.Value >>= bExtrusionFirstLightHarsh ) - { - nFillHarshFlags |= 0x20000; - if ( bExtrusionFirstLightHarsh ) - nFillHarshFlags |= 2; - else - nFillHarshFlags &=~2; - } - } - else if ( rrProp.Name.equals( sExtrusionSecondLightHarsh ) ) - { - sal_Bool bExtrusionSecondLightHarsh = sal_Bool(); - if ( rrProp.Value >>= bExtrusionSecondLightHarsh ) - { - nFillHarshFlags |= 0x10000; - if ( bExtrusionSecondLightHarsh ) - nFillHarshFlags |= 1; - else - nFillHarshFlags &=~1; - } - } - else if ( rrProp.Name.equals( sExtrusionFirstLightLevel ) ) - { - double fExtrusionFirstLightLevel = 0; - if ( rrProp.Value >>= fExtrusionFirstLightLevel ) - AddOpt( DFF_Prop_c3DKeyIntensity, (sal_Int32)( fExtrusionFirstLightLevel * 655.36 ) ); - } - else if ( rrProp.Name.equals( sExtrusionSecondLightLevel ) ) - { - double fExtrusionSecondLightLevel = 0; - if ( rrProp.Value >>= fExtrusionSecondLightLevel ) - AddOpt( DFF_Prop_c3DFillIntensity, (sal_Int32)( fExtrusionSecondLightLevel * 655.36 ) ); - } - else if ( rrProp.Name.equals( sExtrusionFirstLightDirection ) ) - { - drawing::Direction3D aExtrusionFirstLightDirection; - if ( rrProp.Value >>= aExtrusionFirstLightDirection ) - { - AddOpt( DFF_Prop_c3DKeyX, (sal_Int32)aExtrusionFirstLightDirection.DirectionX ); - AddOpt( DFF_Prop_c3DKeyY, (sal_Int32)aExtrusionFirstLightDirection.DirectionY ); - AddOpt( DFF_Prop_c3DKeyZ, (sal_Int32)aExtrusionFirstLightDirection.DirectionZ ); - } - } - else if ( rrProp.Name.equals( sExtrusionSecondLightDirection ) ) - { - drawing::Direction3D aExtrusionSecondLightPosition; - if ( rrProp.Value >>= aExtrusionSecondLightPosition ) - { - AddOpt( DFF_Prop_c3DFillX, (sal_Int32)aExtrusionSecondLightPosition.DirectionX ); - AddOpt( DFF_Prop_c3DFillY, (sal_Int32)aExtrusionSecondLightPosition.DirectionY ); - AddOpt( DFF_Prop_c3DFillZ, (sal_Int32)aExtrusionSecondLightPosition.DirectionZ ); - } - } - else if ( rrProp.Name.equals( sExtrusionMetal ) ) - { - sal_Bool bExtrusionMetal = sal_Bool(); - if ( rrProp.Value >>= bExtrusionMetal ) - { - nLightFaceFlags |= 0x40000; - if ( bExtrusionMetal ) - nLightFaceFlags |= 4; - else - nLightFaceFlags &=~4; - } - } - else if ( rrProp.Name.equals( sExtrusionShadeMode ) ) - { - drawing::ShadeMode eExtrusionShadeMode; - if ( rrProp.Value >>= eExtrusionShadeMode ) - { - sal_uInt32 nRenderMode; - switch( eExtrusionShadeMode ) - { - default: - case drawing::ShadeMode_FLAT : - case drawing::ShadeMode_PHONG : - case drawing::ShadeMode_SMOOTH : - nRenderMode = mso_FullRender; - break; - case drawing::ShadeMode_DRAFT : - { - nRenderMode = mso_Wireframe; - } - break; - } - AddOpt( DFF_Prop_c3DRenderMode, nRenderMode ); - } - } - else if ( rrProp.Name.equals( sExtrusionRotateAngle ) ) - { - double fExtrusionAngleX = 0; - double fExtrusionAngleY = 0; - com::sun::star::drawing::EnhancedCustomShapeParameterPair aRotateAnglePair; - if ( ( rrProp.Value >>= aRotateAnglePair ) && ( aRotateAnglePair.First.Value >>= fExtrusionAngleX ) && ( aRotateAnglePair.Second.Value >>= fExtrusionAngleY ) ) - { - fExtrusionAngleX *= 65536; - fExtrusionAngleY *= 65536; - AddOpt( DFF_Prop_c3DXRotationAngle, (sal_Int32)fExtrusionAngleX ); - AddOpt( DFF_Prop_c3DYRotationAngle, (sal_Int32)fExtrusionAngleY ); - } - } - else if ( rrProp.Name.equals( sExtrusionRotationCenter ) ) - { - drawing::Direction3D aExtrusionRotationCenter; - if ( rrProp.Value >>= aExtrusionRotationCenter ) - { - AddOpt( DFF_Prop_c3DRotationCenterX, (sal_Int32)( aExtrusionRotationCenter.DirectionX * 360.0 ) ); - AddOpt( DFF_Prop_c3DRotationCenterY, (sal_Int32)( aExtrusionRotationCenter.DirectionY * 360.0 ) ); - AddOpt( DFF_Prop_c3DRotationCenterZ, (sal_Int32)( aExtrusionRotationCenter.DirectionZ * 360.0 ) ); - nFillHarshFlags &=~8; // don't use AutoRotationCenter; - } - } - else if ( rrProp.Name.equals( sExtrusionShininess ) ) - { - double fExtrusionShininess = 0; - if ( rrProp.Value >>= fExtrusionShininess ) - AddOpt( DFF_Prop_c3DShininess, (sal_Int32)( fExtrusionShininess * 655.36 ) ); - } - else if ( rrProp.Name.equals( sExtrusionSkew ) ) - { - double fSkewAmount = 0; - double fSkewAngle = 0; - com::sun::star::drawing::EnhancedCustomShapeParameterPair aSkewParaPair; - if ( ( rrProp.Value >>= aSkewParaPair ) && ( aSkewParaPair.First.Value >>= fSkewAmount ) && ( aSkewParaPair.Second.Value >>= fSkewAngle ) ) - { - AddOpt( DFF_Prop_c3DSkewAmount, (sal_Int32)fSkewAmount ); - AddOpt( DFF_Prop_c3DSkewAngle, (sal_Int32)( fSkewAngle * 65536 ) ); - } - } - else if ( rrProp.Name.equals( sExtrusionSpecularity ) ) - { - double fExtrusionSpecularity = 0; - if ( rrProp.Value >>= fExtrusionSpecularity ) - AddOpt( DFF_Prop_c3DSpecularAmt, (sal_Int32)( fExtrusionSpecularity * 1333 ) ); - } - else if ( rrProp.Name.equals( sExtrusionProjectionMode ) ) - { - drawing::ProjectionMode eExtrusionProjectionMode; - if ( rrProp.Value >>= eExtrusionProjectionMode ) - { - nFillHarshFlags |= 0x40000; - if ( eExtrusionProjectionMode == drawing::ProjectionMode_PARALLEL ) - nFillHarshFlags |= 4; - else - nFillHarshFlags &=~4; - } - } - else if ( rrProp.Name.equals( sExtrusionViewPoint ) ) - { - drawing::Position3D aExtrusionViewPoint; - if ( rrProp.Value >>= aExtrusionViewPoint ) - { - aExtrusionViewPoint.PositionX *= 360.0; - aExtrusionViewPoint.PositionY *= 360.0; - aExtrusionViewPoint.PositionZ *= 360.0; - AddOpt( DFF_Prop_c3DXViewpoint, (sal_Int32)aExtrusionViewPoint.PositionX ); - AddOpt( DFF_Prop_c3DYViewpoint, (sal_Int32)aExtrusionViewPoint.PositionY ); - AddOpt( DFF_Prop_c3DZViewpoint, (sal_Int32)aExtrusionViewPoint.PositionZ ); - } - } - else if ( rrProp.Name.equals( sExtrusionOrigin ) ) - { - double fExtrusionOriginX = 0; - double fExtrusionOriginY = 0; - com::sun::star::drawing::EnhancedCustomShapeParameterPair aOriginPair; - if ( ( rrProp.Value >>= aOriginPair ) && ( aOriginPair.First.Value >>= fExtrusionOriginX ) && ( aOriginPair.Second.Value >>= fExtrusionOriginY ) ) - { - AddOpt( DFF_Prop_c3DOriginX, (sal_Int32)( fExtrusionOriginX * 65536 ) ); - AddOpt( DFF_Prop_c3DOriginY, (sal_Int32)( fExtrusionOriginY * 65536 ) ); - } - } - else if ( rrProp.Name.equals( sExtrusionColor ) ) - { - sal_Bool bExtrusionColor = sal_Bool(); - if ( rrProp.Value >>= bExtrusionColor ) - { - nLightFaceFlags |= 0x20000; - if ( bExtrusionColor ) - { - nLightFaceFlags |= 2; - uno::Any aFillColor2; - if ( EscherPropertyValueHelper::GetPropertyValue( aFillColor2, aXPropSet, - String( RTL_CONSTASCII_USTRINGPARAM( "FillColor2" ) ), sal_True ) ) - { - sal_uInt32 nFillColor = ImplGetColor( *((sal_uInt32*)aFillColor2.getValue()) ); - AddOpt( DFF_Prop_c3DExtrusionColor, nFillColor ); - } - } - else - nLightFaceFlags &=~2; - } - } - } - if ( nLightFaceFlags != nLightFaceFlagsOrg ) - AddOpt( DFF_Prop_fc3DLightFace, nLightFaceFlags ); - if ( nFillHarshFlags != nFillHarshFlagsOrg ) - AddOpt( DFF_Prop_fc3DFillHarsh, nFillHarshFlags ); - } - } - else if ( rProp.Name.equals( sEquations ) ) - { - if ( !bIsDefaultObject ) - { - sal_uInt16 nElements = (sal_uInt16)aEquations.size(); - if ( nElements ) - { - sal_uInt16 nElementSize = 8; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - - std::vector< EnhancedCustomShapeEquation >::const_iterator aIter( aEquations.begin() ); - std::vector< EnhancedCustomShapeEquation >::const_iterator aEnd ( aEquations.end() ); - while( aIter != aEnd ) - { - aOut << (sal_uInt16)aIter->nOperation - << (sal_Int16)aIter->nPara[ 0 ] - << (sal_Int16)aIter->nPara[ 1 ] - << (sal_Int16)aIter->nPara[ 2 ]; - aIter++; - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_pFormulas, sal_True, nStreamSize - 6, pBuf, nStreamSize ); - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_pFormulas, sal_True, 0, pBuf, 0 ); - } - } - } - else if ( rProp.Name.equals( sPath ) ) - { - uno::Sequence< beans::PropertyValue > aPathPropSeq; - if ( rProp.Value >>= aPathPropSeq ) - { - sal_uInt32 nPathFlags, nPathFlagsOrg; - nPathFlagsOrg = nPathFlags = 0x39; - if ( GetOpt( DFF_Prop_fFillOK, nPathFlags ) ) - nPathFlagsOrg = nPathFlags; - - sal_Int32 r, nrCount = aPathPropSeq.getLength(); - for ( r = 0; r < nrCount; r++ ) - { - const beans::PropertyValue& rrProp = aPathPropSeq[ r ]; - const rtl::OUString sPathExtrusionAllowed ( RTL_CONSTASCII_USTRINGPARAM( "ExtrusionAllowed" ) ); - const rtl::OUString sPathConcentricGradientFillAllowed ( RTL_CONSTASCII_USTRINGPARAM( "ConcentricGradientFillAllowed" ) ); - const rtl::OUString sPathTextPathAllowed ( RTL_CONSTASCII_USTRINGPARAM( "TextPathAllowed" ) ); - const rtl::OUString sPathCoordinates ( RTL_CONSTASCII_USTRINGPARAM( "Coordinates" ) ); - const rtl::OUString sPathGluePoints ( RTL_CONSTASCII_USTRINGPARAM( "GluePoints" ) ); - const rtl::OUString sPathGluePointType ( RTL_CONSTASCII_USTRINGPARAM( "GluePointType" ) ); - const rtl::OUString sPathSegments ( RTL_CONSTASCII_USTRINGPARAM( "Segments" ) ); - const rtl::OUString sPathStretchX ( RTL_CONSTASCII_USTRINGPARAM( "StretchX" ) ); - const rtl::OUString sPathStretchY ( RTL_CONSTASCII_USTRINGPARAM( "StretchY" ) ); - const rtl::OUString sPathTextFrames ( RTL_CONSTASCII_USTRINGPARAM( "TextFrames" ) ); - - if ( rrProp.Name.equals( sPathExtrusionAllowed ) ) - { - sal_Bool bExtrusionAllowed = sal_Bool(); - if ( rrProp.Value >>= bExtrusionAllowed ) - { - nPathFlags |= 0x100000; - if ( bExtrusionAllowed ) - nPathFlags |= 16; - else - nPathFlags &=~16; - } - } - else if ( rrProp.Name.equals( sPathConcentricGradientFillAllowed ) ) - { - sal_Bool bConcentricGradientFillAllowed = sal_Bool(); - if ( rrProp.Value >>= bConcentricGradientFillAllowed ) - { - nPathFlags |= 0x20000; - if ( bConcentricGradientFillAllowed ) - nPathFlags |= 2; - else - nPathFlags &=~2; - } - } - else if ( rrProp.Name.equals( sPathTextPathAllowed ) ) - { - sal_Bool bTextPathAllowed = sal_Bool(); - if ( rrProp.Value >>= bTextPathAllowed ) - { - nPathFlags |= 0x40000; - if ( bTextPathAllowed ) - nPathFlags |= 4; - else - nPathFlags &=~4; - } - } - else if ( rrProp.Name.equals( sPathCoordinates ) ) - { - if ( !bIsDefaultObject ) - { - com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair > aCoordinates; - if ( rrProp.Value >>= aCoordinates ) - { - // creating the vertices - if ( (sal_uInt16)aCoordinates.getLength() ) - { - sal_uInt16 j, nElements = (sal_uInt16)aCoordinates.getLength(); - sal_uInt16 nElementSize = 8; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - for( j = 0; j < nElements; j++ ) - { - sal_Int32 X = GetValueForEnhancedCustomShapeParameter( aCoordinates[ j ].First, aEquationOrder ); - sal_Int32 Y = GetValueForEnhancedCustomShapeParameter( aCoordinates[ j ].Second, aEquationOrder ); - aOut << X - << Y; - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_pVertices, sal_True, nStreamSize - 6, pBuf, nStreamSize ); // -6 - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_pVertices, sal_True, 0, pBuf, 0 ); - } - } - } - } - else if ( rrProp.Name.equals( sPathGluePoints ) ) - { - if ( !bIsDefaultObject ) - { - com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeParameterPair> aGluePoints; - if ( rrProp.Value >>= aGluePoints ) - { - // creating the vertices - sal_uInt16 nElements = (sal_uInt16)aGluePoints.getLength(); - if ( nElements ) - { - sal_uInt16 j, nElementSize = 8; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - for( j = 0; j < nElements; j++ ) - { - sal_Int32 X = GetValueForEnhancedCustomShapeParameter( aGluePoints[ j ].First, aEquationOrder ); - sal_Int32 Y = GetValueForEnhancedCustomShapeParameter( aGluePoints[ j ].Second, aEquationOrder ); - aOut << X - << Y; - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_connectorPoints, sal_True, nStreamSize - 6, pBuf, nStreamSize ); // -6 - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_connectorPoints, sal_True, 0, pBuf, 0 ); - } - } - } - } - else if ( rrProp.Name.equals( sPathGluePointType ) ) - { - sal_Int16 nGluePointType = sal_Int16(); - if ( rrProp.Value >>= nGluePointType ) - AddOpt( DFF_Prop_connectorType, (sal_uInt16)nGluePointType ); - } - else if ( rrProp.Name.equals( sPathSegments ) ) - { - if ( !bIsDefaultObject ) - { - com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeSegment > aSegments; - if ( rrProp.Value >>= aSegments ) - { - // creating seginfo - if ( (sal_uInt16)aSegments.getLength() ) - { - sal_uInt16 j, nElements = (sal_uInt16)aSegments.getLength(); - sal_uInt16 nElementSize = 2; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - for ( j = 0; j < nElements; j++ ) - { - sal_uInt16 nVal = (sal_uInt16)aSegments[ j ].Count; - switch( aSegments[ j ].Command ) - { - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::UNKNOWN : - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::LINETO : break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::MOVETO : - { - nVal = 0x4000; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CURVETO : - { - nVal |= 0x2000; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOSESUBPATH : - { - nVal = 0x6001; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ENDSUBPATH : - { - nVal = 0x8000; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOFILL : - { - nVal = 0xaa00; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::NOSTROKE : - { - nVal = 0xab00; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSETO : - { - nVal *= 3; - nVal |= 0xa100; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ANGLEELLIPSE : - { - nVal *= 3; - nVal |= 0xa200; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARCTO : - { - nVal <<= 2; - nVal |= 0xa300; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ARC : - { - nVal <<= 2; - nVal |= 0xa400; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARCTO : - { - nVal <<= 2; - nVal |= 0xa500; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::CLOCKWISEARC : - { - nVal <<= 2; - nVal |= 0xa600; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTX : - { - nVal |= 0xa700; - } - break; - case com::sun::star::drawing::EnhancedCustomShapeSegmentCommand::ELLIPTICALQUADRANTY : - { - nVal |= 0xa800; - } - break; - } - aOut << nVal; - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_pSegmentInfo, sal_False, nStreamSize - 6, pBuf, nStreamSize ); - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_pSegmentInfo, sal_True, 0, pBuf, 0 ); - } - } - } - } - else if ( rrProp.Name.equals( sPathStretchX ) ) - { - if ( !bIsDefaultObject ) - { - sal_Int32 nStretchX = 0; - if ( rrProp.Value >>= nStretchX ) - AddOpt( DFF_Prop_stretchPointX, nStretchX ); - } - } - else if ( rrProp.Name.equals( sPathStretchY ) ) - { - if ( !bIsDefaultObject ) - { - sal_Int32 nStretchY = 0; - if ( rrProp.Value >>= nStretchY ) - AddOpt( DFF_Prop_stretchPointY, nStretchY ); - } - } - else if ( rrProp.Name.equals( sPathTextFrames ) ) - { - if ( !bIsDefaultObject ) - { - com::sun::star::uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeTextFrame > aPathTextFrames; - if ( rrProp.Value >>= aPathTextFrames ) - { - if ( (sal_uInt16)aPathTextFrames.getLength() ) - { - sal_uInt16 j, nElements = (sal_uInt16)aPathTextFrames.getLength(); - sal_uInt16 nElementSize = 16; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - for ( j = 0; j < nElements; j++ ) - { - sal_Int32 nLeft = GetValueForEnhancedCustomShapeParameter( aPathTextFrames[ j ].TopLeft.First, aEquationOrder ); - sal_Int32 nTop = GetValueForEnhancedCustomShapeParameter( aPathTextFrames[ j ].TopLeft.Second, aEquationOrder ); - sal_Int32 nRight = GetValueForEnhancedCustomShapeParameter( aPathTextFrames[ j ].BottomRight.First, aEquationOrder ); - sal_Int32 nBottom = GetValueForEnhancedCustomShapeParameter( aPathTextFrames[ j ].BottomRight.Second, aEquationOrder ); - - aOut << nLeft - << nTop - << nRight - << nBottom; - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_textRectangles, sal_True, nStreamSize - 6, pBuf, nStreamSize ); - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_textRectangles, sal_True, 0, pBuf, 0 ); - } - } - } - } - } - if ( nPathFlags != nPathFlagsOrg ) - AddOpt( DFF_Prop_fFillOK, nPathFlags ); - } - } - else if ( rProp.Name.equals( sTextPath ) ) - { - uno::Sequence< beans::PropertyValue > aTextPathPropSeq; - if ( rProp.Value >>= aTextPathPropSeq ) - { - sal_uInt32 nTextPathFlagsOrg, nTextPathFlags; - nTextPathFlagsOrg = nTextPathFlags = 0xffff1000; // default - if ( GetOpt( DFF_Prop_gtextFStrikethrough, nTextPathFlags ) ) - nTextPathFlagsOrg = nTextPathFlags; - - sal_Int32 r, nrCount = aTextPathPropSeq.getLength(); - for ( r = 0; r < nrCount; r++ ) - { - const beans::PropertyValue& rrProp = aTextPathPropSeq[ r ]; - const rtl::OUString sTextPathMode ( RTL_CONSTASCII_USTRINGPARAM( "TextPathMode" ) ); - const rtl::OUString sTextPathScaleX ( RTL_CONSTASCII_USTRINGPARAM( "ScaleX" ) ); - const rtl::OUString sSameLetterHeights ( RTL_CONSTASCII_USTRINGPARAM( "SameLetterHeights" ) ); - - if ( rrProp.Name.equals( sTextPath ) ) - { - sal_Bool bTextPathOn = sal_Bool(); - if ( rrProp.Value >>= bTextPathOn ) - { - nTextPathFlags |= 0x40000000; - if ( bTextPathOn ) - { - nTextPathFlags |= 0x4000; - - sal_uInt32 nPathFlags = 0x39; - GetOpt( DFF_Prop_fFillOK, nPathFlags ); // SJ: can be removed if we are supporting the TextPathAllowed property in XML - nPathFlags |= 0x40004; - AddOpt( DFF_Prop_fFillOK, nPathFlags ); - } - else - nTextPathFlags &=~0x4000; - } - } - else if ( rrProp.Name.equals( sTextPathMode ) ) - { - com::sun::star::drawing::EnhancedCustomShapeTextPathMode eTextPathMode; - if ( rrProp.Value >>= eTextPathMode ) - { - nTextPathFlags |= 0x05000000; - nTextPathFlags &=~0x500; // TextPathMode_NORMAL - if ( eTextPathMode == com::sun::star::drawing::EnhancedCustomShapeTextPathMode_PATH ) - nTextPathFlags |= 0x100; - else if ( eTextPathMode == com::sun::star::drawing::EnhancedCustomShapeTextPathMode_SHAPE ) - nTextPathFlags |= 0x500; - } - } - else if ( rrProp.Name.equals( sTextPathScaleX ) ) - { - sal_Bool bTextPathScaleX = sal_Bool(); - if ( rrProp.Value >>= bTextPathScaleX ) - { - nTextPathFlags |= 0x00400000; - if ( bTextPathScaleX ) - nTextPathFlags |= 0x40; - else - nTextPathFlags &=~0x40; - } - } - else if ( rrProp.Name.equals( sSameLetterHeights ) ) - { - sal_Bool bSameLetterHeights = sal_Bool(); - if ( rrProp.Value >>= bSameLetterHeights ) - { - nTextPathFlags |= 0x00800000; - if ( bSameLetterHeights ) - nTextPathFlags |= 0x80; - else - nTextPathFlags &=~0x80; - } - } - } - if ( nTextPathFlags & 0x4000 ) // Is FontWork ? - { - // FontWork Text - rtl::OUString aText; - uno::Reference< text::XSimpleText > xText( rXShape, uno::UNO_QUERY ); - if ( xText.is() ) - aText = xText->getString(); - if ( !aText.getLength() ) - aText = ::rtl::OUString::createFromAscii( "your text" ); // todo: moving into a resource - AddOpt( DFF_Prop_gtextUNICODE, aText ); - - // FontWork Font - rtl::OUString aFontName; - const rtl::OUString sCharFontName ( RTL_CONSTASCII_USTRINGPARAM( "CharFontName" ) ); - uno::Any aAny = aXPropSet->getPropertyValue( sCharFontName ); - aAny >>= aFontName; - if ( !aFontName.getLength() ) - aFontName = ::rtl::OUString::createFromAscii( "Arial Black" ); - AddOpt( DFF_Prop_gtextFont, aFontName ); - - sal_Int16 nCharScaleWidth = 100; - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "CharScaleWidth" ) ), sal_True ) ) - { - if ( aAny >>= nCharScaleWidth ) - { - if ( nCharScaleWidth != 100 ) - { - sal_Int32 nVal = nCharScaleWidth * 655; - AddOpt( DFF_Prop_gtextSpacing, nVal ); - } - } - } - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "CharKerning" ) ), sal_True ) ) - { - sal_Int16 nCharKerning = sal_Int16(); - if ( aAny >>= nCharKerning ) - { - nTextPathFlags |= 0x10000000; - if ( nCharKerning ) - nTextPathFlags |= 0x1000; - else - nTextPathFlags &=~0x1000; - } - } - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "CharPosture" ) ), sal_True ) ) - { - awt::FontSlant eFontSlant; - if ( aAny >>= eFontSlant ) - { - nTextPathFlags |= 0x100010; - if ( eFontSlant != awt::FontSlant_NONE ) - nTextPathFlags |= 0x10; - else - nTextPathFlags &=~0x10; - } - } - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, aXPropSet, String( RTL_CONSTASCII_USTRINGPARAM( "CharWeight" ) ), sal_True ) ) - { - float fFontWidth = 0; - if ( aAny >>= fFontWidth ) - { - nTextPathFlags |= 0x200020; - if ( fFontWidth > awt::FontWeight::NORMAL ) - nTextPathFlags |= 0x20; - else - nTextPathFlags &=~0x20; - } - } - } - if ( nTextPathFlags != nTextPathFlagsOrg ) - AddOpt( DFF_Prop_gtextFStrikethrough, nTextPathFlags ); - } - } - else if ( rProp.Name.equals( sHandles ) ) - { - if ( !bIsDefaultObject ) - { - bPredefinedHandlesUsed = sal_False; - if ( rProp.Value >>= aHandlesPropSeq ) - { - sal_uInt16 nElements = (sal_uInt16)aHandlesPropSeq.getLength(); - if ( nElements ) - { - const rtl::OUString sHandle ( RTL_CONSTASCII_USTRINGPARAM( "Handle" ) ); - - sal_uInt16 k, j, nElementSize = 36; - sal_uInt32 nStreamSize = nElementSize * nElements + 6; - SvMemoryStream aOut( nStreamSize ); - aOut << nElements - << nElements - << nElementSize; - - for ( k = 0; k < nElements; k++ ) - { - sal_uInt32 nFlags = 0; - sal_Int32 nXPosition = 0; - sal_Int32 nYPosition = 0; - sal_Int32 nXMap = 0; - sal_Int32 nYMap = 0; - sal_Int32 nXRangeMin = 0x80000000; - sal_Int32 nXRangeMax = 0x7fffffff; - sal_Int32 nYRangeMin = 0x80000000; - sal_Int32 nYRangeMax = 0x7fffffff; - - const uno::Sequence< beans::PropertyValue >& rPropSeq = aHandlesPropSeq[ k ]; - for ( j = 0; j < rPropSeq.getLength(); j++ ) - { - const beans::PropertyValue& rPropVal = rPropSeq[ j ]; - - const rtl::OUString sPosition ( RTL_CONSTASCII_USTRINGPARAM( "Position" ) ); - const rtl::OUString sMirroredX ( RTL_CONSTASCII_USTRINGPARAM( "MirroredX" ) ); - const rtl::OUString sMirroredY ( RTL_CONSTASCII_USTRINGPARAM( "MirroredY" ) ); - const rtl::OUString sSwitched ( RTL_CONSTASCII_USTRINGPARAM( "Switched" ) ); - const rtl::OUString sPolar ( RTL_CONSTASCII_USTRINGPARAM( "Polar" ) ); - // const rtl::OUString sMap ( RTL_CONSTASCII_USTRINGPARAM( "Map" ) ); - const rtl::OUString sRadiusRangeMinimum ( RTL_CONSTASCII_USTRINGPARAM( "RadiusRangeMinimum" ) ); - const rtl::OUString sRadiusRangeMaximum ( RTL_CONSTASCII_USTRINGPARAM( "RadiusRangeMaximum" ) ); - const rtl::OUString sRangeXMinimum ( RTL_CONSTASCII_USTRINGPARAM( "RangeXMinimum" ) ); - const rtl::OUString sRangeXMaximum ( RTL_CONSTASCII_USTRINGPARAM( "RangeXMaximum" ) ); - const rtl::OUString sRangeYMinimum ( RTL_CONSTASCII_USTRINGPARAM( "RangeYMinimum" ) ); - const rtl::OUString sRangeYMaximum ( RTL_CONSTASCII_USTRINGPARAM( "RangeYMaximum" ) ); - - if ( rPropVal.Name.equals( sPosition ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameterPair aPosition; - if ( rPropVal.Value >>= aPosition ) - { - GetValueForEnhancedCustomShapeHandleParameter( nXPosition, aPosition.First ); - GetValueForEnhancedCustomShapeHandleParameter( nYPosition, aPosition.Second ); - } - } - else if ( rPropVal.Name.equals( sMirroredX ) ) - { - sal_Bool bMirroredX = sal_Bool(); - if ( rPropVal.Value >>= bMirroredX ) - { - if ( bMirroredX ) - nFlags |= 1; - } - } - else if ( rPropVal.Name.equals( sMirroredY ) ) - { - sal_Bool bMirroredY = sal_Bool(); - if ( rPropVal.Value >>= bMirroredY ) - { - if ( bMirroredY ) - nFlags |= 2; - } - } - else if ( rPropVal.Name.equals( sSwitched ) ) - { - sal_Bool bSwitched = sal_Bool(); - if ( rPropVal.Value >>= bSwitched ) - { - if ( bSwitched ) - nFlags |= 4; - } - } - else if ( rPropVal.Name.equals( sPolar ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameterPair aPolar; - if ( rPropVal.Value >>= aPolar ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXMap, aPolar.First ) ) - nFlags |= 0x800; - if ( GetValueForEnhancedCustomShapeHandleParameter( nYMap, aPolar.Second ) ) - nFlags |= 0x1000; - nFlags |= 8; - } - } - /* seems not to be used. - else if ( rPropVal.Name.equals( sMap ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameterPair aMap; - if ( rPropVal.Value >>= aMap ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXMap, aMap.First ) ) - nFlags |= 0x800; - if ( GetValueForEnhancedCustomShapeHandleParameter( nYMap, aMap.Second ) ) - nFlags |= 0x1000; - nFlags |= 0x10; - } - } - */ - else if ( rPropVal.Name.equals( sRadiusRangeMinimum ) ) - { - nYRangeMin = (sal_Int32)0xff4c0000; // the range of angles seems to be a not - nYRangeMax = (sal_Int32)0x00b40000; // used feature, so we are defaulting this - - com::sun::star::drawing::EnhancedCustomShapeParameter aRadiusRangeMinimum; - if ( rPropVal.Value >>= aRadiusRangeMinimum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXRangeMin, aRadiusRangeMinimum ) ) - nFlags |= 0x80; - nFlags |= 0x2000; - } - } - else if ( rPropVal.Name.equals( sRadiusRangeMaximum ) ) - { - nYRangeMin = (sal_Int32)0xff4c0000; // the range of angles seems to be a not - nYRangeMax = (sal_Int32)0x00b40000; // used feature, so we are defaulting this - - com::sun::star::drawing::EnhancedCustomShapeParameter aRadiusRangeMaximum; - if ( rPropVal.Value >>= aRadiusRangeMaximum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXRangeMax, aRadiusRangeMaximum ) ) - nFlags |= 0x100; - nFlags |= 0x2000; - } - } - else if ( rPropVal.Name.equals( sRangeXMinimum ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameter aXRangeMinimum; - if ( rPropVal.Value >>= aXRangeMinimum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXRangeMin, aXRangeMinimum ) ) - nFlags |= 0x80; - nFlags |= 0x20; - } - } - else if ( rPropVal.Name.equals( sRangeXMaximum ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameter aXRangeMaximum; - if ( rPropVal.Value >>= aXRangeMaximum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nXRangeMax, aXRangeMaximum ) ) - nFlags |= 0x100; - nFlags |= 0x20; - } - } - else if ( rPropVal.Name.equals( sRangeYMinimum ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameter aYRangeMinimum; - if ( rPropVal.Value >>= aYRangeMinimum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nYRangeMin, aYRangeMinimum ) ) - nFlags |= 0x200; - nFlags |= 0x20; - } - } - else if ( rPropVal.Name.equals( sRangeYMaximum ) ) - { - com::sun::star::drawing::EnhancedCustomShapeParameter aYRangeMaximum; - if ( rPropVal.Value >>= aYRangeMaximum ) - { - if ( GetValueForEnhancedCustomShapeHandleParameter( nYRangeMax, aYRangeMaximum ) ) - nFlags |= 0x400; - nFlags |= 0x20; - } - } - } - aOut << nFlags - << nXPosition - << nYPosition - << nXMap - << nYMap - << nXRangeMin - << nXRangeMax - << nYRangeMin - << nYRangeMax; - - if ( nFlags & 8 ) - nAdjustmentsWhichNeedsToBeConverted |= ( 1 << ( nYPosition - 0x100 ) ); - } - sal_uInt8* pBuf = new sal_uInt8[ nStreamSize ]; - memcpy( pBuf, aOut.GetData(), nStreamSize ); - AddOpt( DFF_Prop_Handles, sal_True, nStreamSize - 6, pBuf, nStreamSize ); - } - else - { - sal_uInt8* pBuf = new sal_uInt8[ 1 ]; - AddOpt( DFF_Prop_Handles, sal_True, 0, pBuf, 0 ); - } - } - } - } - else if ( rProp.Name.equals( sAdjustmentValues ) ) - { - // it is required, that the information which handle is polar has already be read, - // so we are able to change the polar value to a fixed float - pAdjustmentValuesProp = &rProp; - } - } - if ( pAdjustmentValuesProp ) - { - uno::Sequence< com::sun::star::drawing::EnhancedCustomShapeAdjustmentValue > aAdjustmentSeq; - if ( pAdjustmentValuesProp->Value >>= aAdjustmentSeq ) - { - if ( bPredefinedHandlesUsed ) - LookForPolarHandles( eShapeType, nAdjustmentsWhichNeedsToBeConverted ); - - sal_Int32 k, nValue = 0, nAdjustmentValues = aAdjustmentSeq.getLength(); - for ( k = 0; k < nAdjustmentValues; k++ ) - if( GetAdjustmentValue( aAdjustmentSeq[ k ], k, nAdjustmentsWhichNeedsToBeConverted, nValue ) ) - AddOpt( (sal_uInt16)( DFF_Prop_adjustValue + k ), (sal_uInt32)nValue ); - } - } - } - } -} - -// --------------------------------------------------------------------------------------------- - -MSO_SPT EscherPropertyContainer::GetCustomShapeType( const uno::Reference< drawing::XShape > & rXShape, sal_uInt32& nMirrorFlags, rtl::OUString& rShapeType ) -{ - MSO_SPT eShapeType = mso_sptNil; - nMirrorFlags = 0; - uno::Reference< beans::XPropertySet > aXPropSet( rXShape, uno::UNO_QUERY ); - if ( aXPropSet.is() ) - { - try - { - const OUString sCustomShapeGeometry( RTL_CONSTASCII_USTRINGPARAM ( "CustomShapeGeometry" ) ); - uno::Any aGeoPropSet = aXPropSet->getPropertyValue( sCustomShapeGeometry ); - uno::Sequence< beans::PropertyValue > aGeoPropSeq; - if ( aGeoPropSet >>= aGeoPropSeq ) - { - sal_Int32 i, nCount = aGeoPropSeq.getLength(); - for ( i = 0; i < nCount; i++ ) - { - const beans::PropertyValue& rProp = aGeoPropSeq[ i ]; - if ( rProp.Name.equalsAscii( "Type" ) ) - { - if ( rProp.Value >>= rShapeType ) - eShapeType = EnhancedCustomShapeTypeNames::Get( rShapeType ); - } - else if ( rProp.Name.equalsAscii( "MirroredX" ) ) - { - sal_Bool bMirroredX = sal_Bool(); - if ( ( rProp.Value >>= bMirroredX ) && bMirroredX ) - nMirrorFlags |= SHAPEFLAG_FLIPH; - } - else if ( rProp.Name.equalsAscii( "MirroredY" ) ) - { - sal_Bool bMirroredY = sal_Bool(); - if ( ( rProp.Value >>= bMirroredY ) && bMirroredY ) - nMirrorFlags |= SHAPEFLAG_FLIPV; - } - } - } - } - catch( ::com::sun::star::uno::Exception& ) - { - } - } - return eShapeType; -} - -MSO_SPT EscherPropertyContainer::GetCustomShapeType( const uno::Reference< drawing::XShape > & rXShape, sal_uInt32& nMirrorFlags ) -{ - rtl::OUString aShapeType; - return GetCustomShapeType( rXShape, nMirrorFlags, aShapeType ); -} - -// --------------------------------------------------------------------------------------------- - -EscherPersistTable::EscherPersistTable() -{ -} - -// --------------------------------------------------------------------------------------------- - -EscherPersistTable::~EscherPersistTable() -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - delete (EscherPersistEntry*)pPtr; -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherPersistTable::PtIsID( UINT32 nID ) -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - if ( ((EscherPersistEntry*)pPtr)->mnID == nID ) - return TRUE; - } - return FALSE; -} - -// --------------------------------------------------------------------------------------------- - -void EscherPersistTable::PtInsert( UINT32 nID, UINT32 nOfs ) -{ - maPersistTable.Insert( new EscherPersistEntry( nID, nOfs ) ); -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherPersistTable::PtDelete( UINT32 nID ) -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - if ( ((EscherPersistEntry*)pPtr)->mnID == nID ) - { -// UINT32 nRetValue = ((EscherPersistEntry*)pPtr)->mnOffset; - delete (EscherPersistEntry*) maPersistTable.Remove(); - } - } - return 0; -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherPersistTable::PtGetOffsetByID( UINT32 nID ) -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - if ( ((EscherPersistEntry*)pPtr)->mnID == nID ) - return ((EscherPersistEntry*)pPtr)->mnOffset; - } - return 0; -}; - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherPersistTable::PtReplace( UINT32 nID, UINT32 nOfs ) -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - if ( ((EscherPersistEntry*)pPtr)->mnID == nID ) - { - UINT32 nRetValue = ((EscherPersistEntry*)pPtr)->mnOffset; - ((EscherPersistEntry*)pPtr)->mnOffset = nOfs; - return nRetValue; - } - } - return 0; -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherPersistTable::PtReplaceOrInsert( UINT32 nID, UINT32 nOfs ) -{ - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - if ( ((EscherPersistEntry*)pPtr)->mnID == nID ) - { - UINT32 nRetValue = ((EscherPersistEntry*)pPtr)->mnOffset; - ((EscherPersistEntry*)pPtr)->mnOffset = nOfs; - return nRetValue; - } - } - PtInsert( nID, nOfs ); - return 0; -} - -sal_Bool EscherPropertyValueHelper::GetPropertyValue( - ::com::sun::star::uno::Any& rAny, - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - const String& rString, - sal_Bool bTestPropertyAvailability ) -{ - sal_Bool bRetValue = sal_True; - if ( bTestPropertyAvailability ) - { - bRetValue = sal_False; - try - { - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > - aXPropSetInfo( rXPropSet->getPropertySetInfo() ); - if ( aXPropSetInfo.is() ) - bRetValue = aXPropSetInfo->hasPropertyByName( rString ); - } - catch( ::com::sun::star::uno::Exception& ) - { - bRetValue = sal_False; - } - } - if ( bRetValue ) - { - try - { - rAny = rXPropSet->getPropertyValue( rString ); - if ( !rAny.hasValue() ) - bRetValue = sal_False; - } - catch( ::com::sun::star::uno::Exception& ) - { - bRetValue = sal_False; - } - } - return bRetValue; -} - -// --------------------------------------------------------------------------------------------- - -::com::sun::star::beans::PropertyState EscherPropertyValueHelper::GetPropertyState( - const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet, - const String& rPropertyName ) -{ - ::com::sun::star::beans::PropertyState eRetValue = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE; - try - { - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > aXPropState - ( rXPropSet, ::com::sun::star::uno::UNO_QUERY ); - if ( aXPropState.is() ) - eRetValue = aXPropState->getPropertyState( rPropertyName ); - } - catch( ::com::sun::star::uno::Exception& ) - { - //... - } - return eRetValue; -} - -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- - -EscherBlibEntry::EscherBlibEntry( sal_uInt32 nPictureOffset, const GraphicObject& rObject, const ByteString& rId, - const GraphicAttr* pGraphicAttr ) : - mnPictureOffset ( nPictureOffset ), - mnRefCount ( 1 ), - mnSizeExtra ( 0 ), - maPrefSize ( rObject.GetPrefSize() ), - maPrefMapMode ( rObject.GetPrefMapMode() ), - mbIsEmpty ( TRUE ) -{ - mbIsNativeGraphicPossible = ( pGraphicAttr == NULL ); - meBlibType = UNKNOWN; - mnSize = 0; - - sal_uInt32 nLen = rId.Len(); - const sal_Char* pData = rId.GetBuffer(); - GraphicType eType( rObject.GetType() ); - if ( nLen && pData && ( eType != GRAPHIC_NONE ) ) - { - mnIdentifier[ 0 ] = rtl_crc32( 0,pData, nLen ); - mnIdentifier[ 1 ] = 0; - - if ( pGraphicAttr ) - { - if ( pGraphicAttr->IsSpecialDrawMode() - || pGraphicAttr->IsMirrored() - || pGraphicAttr->IsCropped() - || pGraphicAttr->IsRotated() - || pGraphicAttr->IsTransparent() - || pGraphicAttr->IsAdjusted() ) - { - SvMemoryStream aSt( sizeof( GraphicAttr ) ); - aSt << static_cast<sal_uInt16>(pGraphicAttr->GetDrawMode()) - << static_cast<sal_uInt32>(pGraphicAttr->GetMirrorFlags()) - << pGraphicAttr->GetLeftCrop() - << pGraphicAttr->GetTopCrop() - << pGraphicAttr->GetRightCrop() - << pGraphicAttr->GetBottomCrop() - << pGraphicAttr->GetRotation() - << pGraphicAttr->GetLuminance() - << pGraphicAttr->GetContrast() - << pGraphicAttr->GetChannelR() - << pGraphicAttr->GetChannelG() - << pGraphicAttr->GetChannelB() - << pGraphicAttr->GetGamma() - << (BOOL)( pGraphicAttr->IsInvert() == TRUE ) - << pGraphicAttr->GetTransparency(); - mnIdentifier[ 1 ] = rtl_crc32( 0, aSt.GetData(), aSt.Tell() ); - } - else - mbIsNativeGraphicPossible = TRUE; - } - sal_uInt32 i, nTmp, n1, n2; - n1 = n2 = 0; - for ( i = 0; i < nLen; i++ ) - { - nTmp = n2 >> 28; // rotating 4 bit - n2 <<= 4; - n2 |= n1 >> 28; - n1 <<= 4; - n1 |= nTmp; - n1 ^= *pData++ - '0'; - } - mnIdentifier[ 2 ] = n1; - mnIdentifier[ 3 ] = n2; - mbIsEmpty = FALSE; - } -}; - -// --------------------------------------------------------------------------------------------- - -void EscherBlibEntry::WriteBlibEntry( SvStream& rSt, sal_Bool bWritePictureOffset, sal_uInt32 nResize ) -{ - sal_uInt32 nPictureOffset = ( bWritePictureOffset ) ? mnPictureOffset : 0; - - rSt << (sal_uInt32)( ( ESCHER_BSE << 16 ) | ( ( (sal_uInt16)meBlibType << 4 ) | 2 ) ) - << (sal_uInt32)( 36 + nResize ) - << (sal_uInt8)meBlibType; - - switch ( meBlibType ) - { - case EMF : - case WMF : // EMF/WMF auf OS2 zu Pict Konvertieren - rSt << (sal_uInt8)PICT; - break; - default: - rSt << (sal_uInt8)meBlibType; - }; - - rSt.Write( &mnIdentifier[ 0 ], 16 ); - rSt << (sal_uInt16)0 - << (sal_uInt32)( mnSize + mnSizeExtra ) - << mnRefCount - << nPictureOffset - << (sal_uInt32)0; -} - -// --------------------------------------------------------------------------------------------- - -EscherBlibEntry::~EscherBlibEntry() -{ -}; - -// --------------------------------------------------------------------------------------------- - -BOOL EscherBlibEntry::operator==( const EscherBlibEntry& rEscherBlibEntry ) const -{ - for ( int i = 0; i < 3; i++ ) - { - if ( mnIdentifier[ i ] != rEscherBlibEntry.mnIdentifier[ i ] ) - return FALSE; - } - return TRUE; -} - -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- - -EscherGraphicProvider::EscherGraphicProvider( sal_uInt32 nFlags ) : - mnFlags ( nFlags ), - mpBlibEntrys ( NULL ), - mnBlibBufSize ( 0 ), - mnBlibEntrys ( 0 ) -{ -} - -EscherGraphicProvider::~EscherGraphicProvider() -{ - for ( UINT32 i = 0; i < mnBlibEntrys; delete mpBlibEntrys[ i++ ] ) ; - delete[] mpBlibEntrys; -} - -void EscherGraphicProvider::SetNewBlipStreamOffset( sal_Int32 nOffset ) -{ - for( sal_uInt32 i = 0; i < mnBlibEntrys; i++ ) - { - EscherBlibEntry* pBlibEntry = mpBlibEntrys[ i ]; - pBlibEntry->mnPictureOffset += nOffset; - } -} - -UINT32 EscherGraphicProvider::ImplInsertBlib( EscherBlibEntry* p_EscherBlibEntry ) -{ - if ( mnBlibBufSize == mnBlibEntrys ) - { - mnBlibBufSize += 64; - EscherBlibEntry** pTemp = new EscherBlibEntry*[ mnBlibBufSize ]; - for ( UINT32 i = 0; i < mnBlibEntrys; i++ ) - { - pTemp[ i ] = mpBlibEntrys[ i ]; - } - delete[] mpBlibEntrys; - mpBlibEntrys = pTemp; - } - mpBlibEntrys[ mnBlibEntrys++ ] = p_EscherBlibEntry; - return mnBlibEntrys; -} - -sal_uInt32 EscherGraphicProvider::GetBlibStoreContainerSize( SvStream* pMergePicStreamBSE ) const -{ - sal_uInt32 nSize = 44 * mnBlibEntrys + 8; - if ( pMergePicStreamBSE ) - { - for ( sal_uInt32 i = 0; i < mnBlibEntrys; i++ ) - nSize += mpBlibEntrys[ i ]->mnSize + mpBlibEntrys[ i ]->mnSizeExtra; - } - return nSize; -} - -sal_Bool EscherGraphicProvider::WriteBlibStoreEntry(SvStream& rSt, - sal_uInt32 nBlipId, sal_Bool bWritePictureOffSet, sal_uInt32 nResize) -{ - if (nBlipId > mnBlibEntrys || nBlipId == 0) - return sal_False; - mpBlibEntrys[nBlipId-1]->WriteBlibEntry(rSt, bWritePictureOffSet, nResize); - return sal_True; -} - -void EscherGraphicProvider::WriteBlibStoreContainer( SvStream& rSt, SvStream* pMergePicStreamBSE ) -{ - sal_uInt32 nSize = GetBlibStoreContainerSize( pMergePicStreamBSE ); - if ( nSize ) - { - rSt << (sal_uInt32)( ( ESCHER_BstoreContainer << 16 ) | 0x1f ) - << (sal_uInt32)( nSize - 8 ); - - if ( pMergePicStreamBSE ) - { - sal_uInt32 i, nBlipSize, nOldPos = pMergePicStreamBSE->Tell(); - const sal_uInt32 nBuf = 0x40000; // 256KB buffer - sal_uInt8* pBuf = new sal_uInt8[ nBuf ]; - - for ( i = 0; i < mnBlibEntrys; i++ ) - { - EscherBlibEntry* pBlibEntry = mpBlibEntrys[ i ]; - - ESCHER_BlibType nBlibType = pBlibEntry->meBlibType; - nBlipSize = pBlibEntry->mnSize + pBlibEntry->mnSizeExtra; - pBlibEntry->WriteBlibEntry( rSt, sal_False, nBlipSize ); - - // BLIP - pMergePicStreamBSE->Seek( pBlibEntry->mnPictureOffset ); - UINT16 n16; - // record version and instance - *pMergePicStreamBSE >> n16; - rSt << n16; - // record type - *pMergePicStreamBSE >> n16; - rSt << UINT16( ESCHER_BlipFirst + nBlibType ); - DBG_ASSERT( n16 == ESCHER_BlipFirst + nBlibType , "EscherEx::Flush: BLIP record types differ" ); - UINT32 n32; - // record size - *pMergePicStreamBSE >> n32; - nBlipSize -= 8; - rSt << nBlipSize; - DBG_ASSERT( nBlipSize == n32, "EscherEx::Flush: BLIP sizes differ" ); - // record - while ( nBlipSize ) - { - UINT32 nBytes = ( nBlipSize > nBuf ? nBuf : nBlipSize ); - pMergePicStreamBSE->Read( pBuf, nBytes ); - rSt.Write( pBuf, nBytes ); - nBlipSize -= nBytes; - } - } - delete[] pBuf; - pMergePicStreamBSE->Seek( nOldPos ); - } - else - { - for ( sal_uInt32 i = 0; i < mnBlibEntrys; i++ ) - mpBlibEntrys[ i ]->WriteBlibEntry( rSt, sal_True ); - } - } -} - -sal_Bool EscherGraphicProvider::GetPrefSize( const sal_uInt32 nBlibId, Size& rPrefSize, MapMode& rPrefMapMode ) -{ - sal_Bool bInRange = nBlibId && ( ( nBlibId - 1 ) < mnBlibEntrys ); - if ( bInRange ) - { - EscherBlibEntry* pEntry = mpBlibEntrys[ nBlibId - 1 ]; - rPrefSize = pEntry->maPrefSize; - rPrefMapMode = pEntry->maPrefMapMode; - } - return bInRange; -} - -sal_uInt32 EscherGraphicProvider::GetBlibID( SvStream& rPicOutStrm, const ByteString& rId, - const Rectangle& /* rBoundRect */, const com::sun::star::awt::Rectangle* pVisArea, const GraphicAttr* pGraphicAttr ) -{ - sal_uInt32 nBlibId = 0; - GraphicObject aGraphicObject( rId ); - - EscherBlibEntry* p_EscherBlibEntry = new EscherBlibEntry( rPicOutStrm.Tell(), aGraphicObject, rId, pGraphicAttr ); - if ( !p_EscherBlibEntry->IsEmpty() ) - { - for ( UINT32 i = 0; i < mnBlibEntrys; i++ ) - { - if ( *( mpBlibEntrys[ i ] ) == *p_EscherBlibEntry ) - { - mpBlibEntrys[ i ]->mnRefCount++; - delete p_EscherBlibEntry; - return i + 1; - } - } - - sal_Bool bUseNativeGraphic( FALSE ); - - Graphic aGraphic( aGraphicObject.GetTransformedGraphic( pGraphicAttr ) ); - GfxLink aGraphicLink; - SvMemoryStream aStream; - - const sal_uInt8* pGraphicAry = NULL; - - if ( p_EscherBlibEntry->mbIsNativeGraphicPossible && aGraphic.IsLink() ) - { - aGraphicLink = aGraphic.GetLink(); - - p_EscherBlibEntry->mnSize = aGraphicLink.GetDataSize(); - pGraphicAry = aGraphicLink.GetData(); - - if ( p_EscherBlibEntry->mnSize && pGraphicAry ) - { - switch ( aGraphicLink.GetType() ) - { - case GFX_LINK_TYPE_NATIVE_JPG : p_EscherBlibEntry->meBlibType = PEG; break; - case GFX_LINK_TYPE_NATIVE_PNG : p_EscherBlibEntry->meBlibType = PNG; break; - case GFX_LINK_TYPE_NATIVE_WMF : - { - if ( pGraphicAry && ( p_EscherBlibEntry->mnSize > 0x2c ) ) - { - if ( ( pGraphicAry[ 0x28 ] == 0x20 ) && ( pGraphicAry[ 0x29 ] == 0x45 ) // check the magic - && ( pGraphicAry[ 0x2a ] == 0x4d ) && ( pGraphicAry[ 0x2b ] == 0x46 ) ) // number ( emf detection ) - { - p_EscherBlibEntry->meBlibType = EMF; - } - else - { - p_EscherBlibEntry->meBlibType = WMF; - if ( ( pGraphicAry[ 0 ] == 0xd7 ) && ( pGraphicAry[ 1 ] == 0xcd ) - && ( pGraphicAry[ 2 ] == 0xc6 ) && ( pGraphicAry[ 3 ] == 0x9a ) ) - { // we have to get rid of the metafileheader - pGraphicAry += 22; - p_EscherBlibEntry->mnSize -= 22; - } - } - } - } - break; - default: break; - } - if ( p_EscherBlibEntry->meBlibType != UNKNOWN ) - bUseNativeGraphic = TRUE; - } - } - if ( !bUseNativeGraphic ) - { - GraphicType eGraphicType = aGraphic.GetType(); - if ( ( eGraphicType == GRAPHIC_BITMAP ) || ( eGraphicType == GRAPHIC_GDIMETAFILE ) ) - { - sal_uInt32 nErrCode; - if ( !aGraphic.IsAnimated() ) -// !EMF nErrCode = GraphicConverter::Export( aStream, aGraphic, ( eGraphicType == GRAPHIC_BITMAP ) ? CVT_PNG : CVT_WMF ); - nErrCode = GraphicConverter::Export( aStream, aGraphic, ( eGraphicType == GRAPHIC_BITMAP ) ? CVT_PNG : CVT_EMF ); - else - { // to store a animation, a gif has to be included into the msOG chunk of a png #I5583# - GraphicFilter* pFilter = GetGrfFilter(); - SvMemoryStream aGIFStream; - ByteString aVersion( "MSOFFICE9.0" ); - aGIFStream.Write( aVersion.GetBuffer(), aVersion.Len() ); - nErrCode = pFilter->ExportGraphic( aGraphic, String(), aGIFStream, - pFilter->GetExportFormatNumberForShortName( String( RTL_CONSTASCII_USTRINGPARAM( "GIF" ) ) ), NULL ); - com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 ); - com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aAdditionalChunkSequence( 1 ); - sal_uInt32 nGIFSreamLen = aGIFStream.Tell(); - com::sun::star::uno::Sequence< sal_Int8 > aGIFSeq( nGIFSreamLen ); - sal_Int8* pSeq = aGIFSeq.getArray(); - aGIFStream.Seek( STREAM_SEEK_TO_BEGIN ); - aGIFStream.Read( pSeq, nGIFSreamLen ); - com::sun::star::beans::PropertyValue aChunkProp, aFilterProp; - aChunkProp.Name = String( RTL_CONSTASCII_USTRINGPARAM( "msOG" ) ); - aChunkProp.Value <<= aGIFSeq; - aAdditionalChunkSequence[ 0 ] = aChunkProp; - aFilterProp.Name = String( RTL_CONSTASCII_USTRINGPARAM( "AdditionalChunks" ) ); - aFilterProp.Value <<= aAdditionalChunkSequence; - aFilterData[ 0 ] = aFilterProp; - nErrCode = pFilter->ExportGraphic( aGraphic, String(), aStream, - pFilter->GetExportFormatNumberForShortName( String( RTL_CONSTASCII_USTRINGPARAM( "PNG" ) ) ), &aFilterData ); - } - if ( nErrCode == ERRCODE_NONE ) - { -// !EMF p_EscherBlibEntry->meBlibType = ( eGraphicType == GRAPHIC_BITMAP ) ? PNG : WMF; - p_EscherBlibEntry->meBlibType = ( eGraphicType == GRAPHIC_BITMAP ) ? PNG : EMF; - aStream.Seek( STREAM_SEEK_TO_END ); - p_EscherBlibEntry->mnSize = aStream.Tell(); - pGraphicAry = (sal_uInt8*)aStream.GetData(); - - if ( p_EscherBlibEntry->meBlibType == WMF ) // the fileheader is not used - { - p_EscherBlibEntry->mnSize -= 22; - pGraphicAry += 22; - } - } - } - } - - ESCHER_BlibType eBlibType = p_EscherBlibEntry->meBlibType; - if ( p_EscherBlibEntry->mnSize && pGraphicAry && ( eBlibType != UNKNOWN ) ) - { - sal_uInt32 nExtra, nAtomSize = 0; - sal_uInt32 nInstance, nUncompressedSize = p_EscherBlibEntry->mnSize; - - if ( mnFlags & _E_GRAPH_PROV_USE_INSTANCES ) - { - rPicOutStrm << (UINT32)( 0x7f90000 | (UINT16)( mnBlibEntrys << 4 ) ) - << (UINT32)0; - nAtomSize = rPicOutStrm.Tell(); - if ( eBlibType == PNG ) - rPicOutStrm << (sal_uInt16)0x0606; - else if ( eBlibType == WMF ) - rPicOutStrm << (sal_uInt16)0x0403; - else if ( eBlibType == EMF ) - rPicOutStrm << (sal_uInt16)0x0402; - else if ( eBlibType == PEG ) - rPicOutStrm << (sal_uInt16)0x0505; - } - if ( ( eBlibType == PEG ) || ( eBlibType == PNG ) ) - { - nExtra = 17; - p_EscherBlibEntry->mnSizeExtra = nExtra + 8; - nInstance = ( eBlibType == PNG ) ? 0xf01e6e00 : 0xf01d46a0; - rPicOutStrm << nInstance << (sal_uInt32)( p_EscherBlibEntry->mnSize + nExtra ); - rPicOutStrm.Write( p_EscherBlibEntry->mnIdentifier, 16 ); - rPicOutStrm << (sal_uInt8)0xff; - rPicOutStrm.Write( pGraphicAry, p_EscherBlibEntry->mnSize ); - } - else - { - ZCodec aZCodec( 0x8000, 0x8000 ); - aZCodec.BeginCompression(); - SvMemoryStream aDestStrm; - aZCodec.Write( aDestStrm, pGraphicAry, p_EscherBlibEntry->mnSize ); - aZCodec.EndCompression(); - aDestStrm.Seek( STREAM_SEEK_TO_END ); - p_EscherBlibEntry->mnSize = aDestStrm.Tell(); - pGraphicAry = (sal_uInt8*)aDestStrm.GetData(); - if ( p_EscherBlibEntry->mnSize && pGraphicAry ) - { - nExtra = eBlibType == WMF ? 0x42 : 0x32; // !EMF -> no change - p_EscherBlibEntry->mnSizeExtra = nExtra + 8; - nInstance = ( eBlibType == WMF ) ? 0xf01b2170 : 0xf01a3d40; // !EMF -> no change - rPicOutStrm << nInstance << (sal_uInt32)( p_EscherBlibEntry->mnSize + nExtra ); - if ( eBlibType == WMF ) // !EMF -> no change - rPicOutStrm.Write( p_EscherBlibEntry->mnIdentifier, 16 ); - rPicOutStrm.Write( p_EscherBlibEntry->mnIdentifier, 16 ); - - /* - ##913## - For Word the stored size of the graphic is critical the - metafile boundaries must match the actual graphics - boundaries, and the width and height must be in EMU's - - If you don't do it this way then objects edited in the - msoffice app may show strange behaviour as the size jumps - around, and the original size and scaling factor in word - will be a very strange figure - */ - UINT32 nPrefWidth = p_EscherBlibEntry->maPrefSize.Width(); - UINT32 nPrefHeight = p_EscherBlibEntry->maPrefSize.Height(); - UINT32 nWidth, nHeight; - if ( pVisArea ) - { - nWidth = pVisArea->Width * 360; - nHeight = pVisArea->Height * 360; - } - else - { - Size aPrefSize(lcl_SizeToEmu(p_EscherBlibEntry->maPrefSize, p_EscherBlibEntry->maPrefMapMode)); - nWidth = aPrefSize.Width() * 360; - nHeight = aPrefSize.Height() * 360; - } - rPicOutStrm << nUncompressedSize // WMFSize without FileHeader - << (sal_Int32)0 // da die Originalgroesse des WMF's (ohne FileHeader) - << (sal_Int32)0 // nicht mehr feststellbar ist, schreiben wir 10cm / x - << nPrefWidth - << nPrefHeight - << nWidth - << nHeight - << p_EscherBlibEntry->mnSize - << (sal_uInt16)0xfe00; // compression Flags - rPicOutStrm.Write( pGraphicAry, p_EscherBlibEntry->mnSize ); - } - } - if ( nAtomSize ) - { - sal_uInt32 nPos = rPicOutStrm.Tell(); - rPicOutStrm.Seek( nAtomSize - 4 ); - rPicOutStrm << (sal_uInt32)( nPos - nAtomSize ); - rPicOutStrm.Seek( nPos ); - } - nBlibId = ImplInsertBlib( p_EscherBlibEntry ), p_EscherBlibEntry = NULL; - } - } - if ( p_EscherBlibEntry ) - delete p_EscherBlibEntry; - return nBlibId; -} - -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- - -struct EscherConnectorRule -{ - sal_uInt32 nRuleId; - sal_uInt32 nShapeA; // SPID of shape A - sal_uInt32 nShapeB; // SPID of shape B - sal_uInt32 nShapeC; // SPID of connector shape - sal_uInt32 ncptiA; // Connection site Index of shape A - sal_uInt32 ncptiB; // Connection site Index of shape B -}; - -struct EscherShapeListEntry -{ - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > aXShape; - sal_uInt32 n_EscherId; - - EscherShapeListEntry( const ::com::sun::star::uno::Reference - < ::com::sun::star::drawing::XShape > & rShape, sal_uInt32 nId ) : - aXShape ( rShape ), - n_EscherId ( nId ) {} -}; - -sal_uInt32 EscherConnectorListEntry::GetClosestPoint( const Polygon& rPoly, const ::com::sun::star::awt::Point& rPoint ) -{ - sal_uInt16 nCount = rPoly.GetSize(); - sal_uInt16 nClosest = nCount; - double fDist = (sal_uInt32)0xffffffff; - while( nCount-- ) - { - double fDistance = hypot( rPoint.X - rPoly[ nCount ].X(), rPoint.Y - rPoly[ nCount ].Y() ); - if ( fDistance < fDist ) - { - nClosest = nCount; - fDist = fDistance; - } - } - return nClosest; -}; - -// --------------------------------------------------------------------------------------------- -// bei Rechtecken bei Ellipsen bei Polygonen -// -// nRule = 0 ->Top 0 ->Top nRule = Index auf ein (Poly)Polygon Punkt -// 1 ->Left 2 ->Left -// 2 ->Bottom 4 ->Bottom -// 3 ->Right 6 ->Right - -sal_uInt32 EscherConnectorListEntry::GetConnectorRule( sal_Bool bFirst ) -{ - sal_uInt32 nRule = 0; - - ::com::sun::star::uno::Any aAny; - ::com::sun::star::awt::Point aRefPoint( ( bFirst ) ? maPointA : maPointB ); - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > - aXShape( ( bFirst ) ? mXConnectToA : mXConnectToB ); - - String aString( (::rtl::OUString)aXShape->getShapeType() ); - ByteString aType( aString, RTL_TEXTENCODING_UTF8 ); - aType.Erase( 0, 13 ); // removing "com.sun.star." - sal_uInt16 nPos = aType.Search( "Shape" ); - aType.Erase( nPos, 5 ); - - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > - aPropertySet( aXShape, ::com::sun::star::uno::UNO_QUERY ); - - if ( aType == "drawing.PolyPolygon" || aType == "drawing.PolyLine" ) - { - if ( aPropertySet.is() ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, - aPropertySet, String( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygon" ) ) ) ) - { - ::com::sun::star::drawing::PointSequenceSequence* pSourcePolyPolygon = - (::com::sun::star::drawing::PointSequenceSequence*)aAny.getValue(); - sal_Int32 nOuterSequenceCount = pSourcePolyPolygon->getLength(); - ::com::sun::star::drawing::PointSequence* pOuterSequence = pSourcePolyPolygon->getArray(); - - if ( pOuterSequence ) - { - sal_Int32 a, b, nIndex = 0; - sal_uInt32 nDistance = 0xffffffff; - for( a = 0; a < nOuterSequenceCount; a++ ) - { - ::com::sun::star::drawing::PointSequence* pInnerSequence = pOuterSequence++; - if ( pInnerSequence ) - { - ::com::sun::star::awt::Point* pArray = pInnerSequence->getArray(); - if ( pArray ) - { - for ( b = 0; b < pInnerSequence->getLength(); b++, nIndex++, pArray++ ) - { - sal_uInt32 nDist = (sal_uInt32)hypot( aRefPoint.X - pArray->X, aRefPoint.Y - pArray->Y ); - if ( nDist < nDistance ) - { - nRule = nIndex; - nDistance = nDist; - } - } - } - } - } - } - } - } - } - else if ( ( aType == "drawing.OpenBezier" ) || ( aType == "drawing.OpenFreeHand" ) || ( aType == "drawing.PolyLinePath" ) - || ( aType == "drawing.ClosedBezier" ) || ( aType == "drawing.ClosedFreeHand" ) || ( aType == "drawing.PolyPolygonPath" ) ) - { - ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > - aPropertySet2( aXShape, ::com::sun::star::uno::UNO_QUERY ); - if ( aPropertySet2.is() ) - { - if ( EscherPropertyValueHelper::GetPropertyValue( aAny, - aPropertySet2, String( RTL_CONSTASCII_USTRINGPARAM( "PolyPolygonBezier" ) ) ) ) - { - ::com::sun::star::drawing::PolyPolygonBezierCoords* pSourcePolyPolygon = - (::com::sun::star::drawing::PolyPolygonBezierCoords*)aAny.getValue(); - sal_Int32 nOuterSequenceCount = pSourcePolyPolygon->Coordinates.getLength(); - - // Zeiger auf innere sequences holen - ::com::sun::star::drawing::PointSequence* pOuterSequence = - pSourcePolyPolygon->Coordinates.getArray(); - ::com::sun::star::drawing::FlagSequence* pOuterFlags = - pSourcePolyPolygon->Flags.getArray(); - - if ( pOuterSequence && pOuterFlags ) - { - sal_Int32 a, b, nIndex = 0; - sal_uInt32 nDistance = 0xffffffff; - - for ( a = 0; a < nOuterSequenceCount; a++ ) - { - ::com::sun::star::drawing::PointSequence* pInnerSequence = pOuterSequence++; - ::com::sun::star::drawing::FlagSequence* pInnerFlags = pOuterFlags++; - if ( pInnerSequence && pInnerFlags ) - { - ::com::sun::star::awt::Point* pArray = pInnerSequence->getArray(); - ::com::sun::star::drawing::PolygonFlags* pFlags = pInnerFlags->getArray(); - if ( pArray && pFlags ) - { - for ( b = 0; b < pInnerSequence->getLength(); b++, pArray++ ) - { - PolyFlags ePolyFlags = *( (PolyFlags*)pFlags++ ); - if ( ePolyFlags == POLY_CONTROL ) - continue; - sal_uInt32 nDist = (sal_uInt32)hypot( aRefPoint.X - pArray->X, aRefPoint.Y - pArray->Y ); - if ( nDist < nDistance ) - { - nRule = nIndex; - nDistance = nDist; - } - nIndex++; - } - } - } - } - } - } - } - } - else - { - bool bRectangularConnection = true; - - if ( aType == "drawing.Custom" ) - { - SdrObject* pCustoShape( GetSdrObjectFromXShape( aXShape ) ); - if ( pCustoShape && pCustoShape->ISA( SdrObjCustomShape ) ) - { - SdrCustomShapeGeometryItem& rGeometryItem = (SdrCustomShapeGeometryItem&)(const SdrCustomShapeGeometryItem&) - pCustoShape->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ); - - const rtl::OUString sPath( RTL_CONSTASCII_USTRINGPARAM( "Path" ) ); - const rtl::OUString sType( RTL_CONSTASCII_USTRINGPARAM ( "Type" ) ); - const rtl::OUString sGluePointType( RTL_CONSTASCII_USTRINGPARAM( "GluePointType" ) ); - - rtl::OUString sShapeType; - uno::Any* pType = rGeometryItem.GetPropertyValueByName( sType ); - if ( pType ) - *pType >>= sShapeType; - MSO_SPT eSpType = EnhancedCustomShapeTypeNames::Get( sShapeType ); - - uno::Any* pGluePointType = ((SdrCustomShapeGeometryItem&)rGeometryItem).GetPropertyValueByName( sPath, sGluePointType ); - - sal_Int16 nGluePointType = sal_Int16(); - if ( !( pGluePointType && - ( *pGluePointType >>= nGluePointType ) ) ) - nGluePointType = GetCustomShapeConnectionTypeDefault( eSpType ); - - if ( nGluePointType == com::sun::star::drawing::EnhancedCustomShapeGluePointType::CUSTOM ) - { - const SdrGluePointList* pList = pCustoShape->GetGluePointList(); - if ( pList ) - { - Polygon aPoly; - USHORT nNum, nAnz = pList->GetCount(); - if ( nAnz ) - { - for ( nNum = 0; nNum < nAnz; nNum++ ) - { - const SdrGluePoint& rGP = (*pList)[ nNum ]; - Point aPt( rGP.GetAbsolutePos( *pCustoShape ) ); - aPoly.Insert( POLY_APPEND, aPt ); - } - nRule = GetClosestPoint( aPoly, aRefPoint ); - bRectangularConnection = false; - } - } - } - else if ( nGluePointType == com::sun::star::drawing::EnhancedCustomShapeGluePointType::SEGMENTS ) - { - SdrObject* pPoly = pCustoShape->DoConvertToPolyObj( TRUE ); - if ( pPoly && pPoly->ISA( SdrPathObj ) ) - { - sal_Int16 a, b, nIndex = 0; - sal_uInt32 nDistance = 0xffffffff; - - // #i74631# use explicit constructor here. Also XPolyPolygon is not necessary, - // reducing to PolyPolygon - const PolyPolygon aPolyPoly(((SdrPathObj*)pPoly)->GetPathPoly()); - - for ( a = 0; a < aPolyPoly.Count(); a++ ) - { - const Polygon& rPoly = aPolyPoly.GetObject( a ); - for ( b = 0; b < rPoly.GetSize(); b++ ) - { - if ( rPoly.GetFlags( b ) != POLY_NORMAL ) - continue; - const Point& rPt = rPoly[ b ]; - sal_uInt32 nDist = (sal_uInt32)hypot( aRefPoint.X - rPt.X(), aRefPoint.Y - rPt.Y() ); - if ( nDist < nDistance ) - { - nRule = nIndex; - nDistance = nDist; - } - nIndex++; - } - } - if ( nDistance != 0xffffffff ) - bRectangularConnection = false; - } - } - } - } - if ( bRectangularConnection ) - { - ::com::sun::star::awt::Point aPoint( aXShape->getPosition() ); - ::com::sun::star::awt::Size aSize( aXShape->getSize() ); - - Rectangle aRect( Point( aPoint.X, aPoint.Y ), Size( aSize.Width, aSize.Height ) ); - Point aCenter( aRect.Center() ); - Polygon aPoly( 4 ); - - aPoly[ 0 ] = Point( aCenter.X(), aRect.Top() ); - aPoly[ 1 ] = Point( aRect.Left(), aCenter.Y() ); - aPoly[ 2 ] = Point( aCenter.X(), aRect.Bottom() ); - aPoly[ 3 ] = Point( aRect.Right(), aCenter.Y() ); - - sal_Int32 nAngle = ( EscherPropertyValueHelper::GetPropertyValue( aAny, - aPropertySet, String( RTL_CONSTASCII_USTRINGPARAM( "RotateAngle" ) ), sal_True ) ) - ? *((sal_Int32*)aAny.getValue() ) - : 0; - if ( nAngle ) - aPoly.Rotate( aRect.TopLeft(), (sal_uInt16)( ( nAngle + 5 ) / 10 ) ); - nRule = GetClosestPoint( aPoly, aRefPoint ); - - if ( aType == "drawing.Ellipse" ) - nRule <<= 1; // In PPT hat eine Ellipse 8 Mglichkeiten sich zu connecten - } - } - return nRule; -} - -EscherSolverContainer::~EscherSolverContainer() -{ - void* pP; - - for( pP = maShapeList.First(); pP; pP = maShapeList.Next() ) - delete (EscherShapeListEntry*)pP; - for( pP = maConnectorList.First(); pP; pP = maConnectorList.Next() ) - delete (EscherConnectorListEntry*)pP; -} - -void EscherSolverContainer::AddShape( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape, sal_uInt32 nId ) -{ - maShapeList.Insert( new EscherShapeListEntry( rXShape, nId ), LIST_APPEND ); -} - -void EscherSolverContainer::AddConnector( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rConnector, - const ::com::sun::star::awt::Point& rPA, - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rConA, - const ::com::sun::star::awt::Point& rPB, - ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rConB ) -{ - maConnectorList.Insert( new EscherConnectorListEntry( rConnector, rPA, rConA, rPB, rConB ), LIST_APPEND ); -} - -sal_uInt32 EscherSolverContainer::GetShapeId( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > & rXShape ) const -{ - for ( EscherShapeListEntry* pPtr = (EscherShapeListEntry*)((List&)maShapeList).First(); - pPtr; pPtr = (EscherShapeListEntry*)((List&)maShapeList).Next() ) - { - if ( rXShape == pPtr->aXShape ) - return ( pPtr->n_EscherId ); - } - return 0; -} - -void EscherSolverContainer::WriteSolver( SvStream& rStrm ) -{ - sal_uInt32 nCount = maConnectorList.Count(); - if ( nCount ) - { - sal_uInt32 nRecHdPos, nCurrentPos, nSize; - rStrm << (sal_uInt16)( ( nCount << 4 ) | 0xf ) // open an ESCHER_SolverContainer - << (sal_uInt16)ESCHER_SolverContainer // - << (sal_uInt32)0; // - - nRecHdPos = rStrm.Tell() - 4; - - EscherConnectorRule aConnectorRule; - aConnectorRule.nRuleId = 2; - for ( EscherConnectorListEntry* pPtr = (EscherConnectorListEntry*)maConnectorList.First(); - pPtr; pPtr = (EscherConnectorListEntry*)maConnectorList.Next() ) - { - aConnectorRule.ncptiA = aConnectorRule.ncptiB = 0xffffffff; - aConnectorRule.nShapeC = GetShapeId( pPtr->mXConnector ); - aConnectorRule.nShapeA = GetShapeId( pPtr->mXConnectToA ); - aConnectorRule.nShapeB = GetShapeId( pPtr->mXConnectToB ); - - if ( aConnectorRule.nShapeC ) - { - if ( aConnectorRule.nShapeA ) - aConnectorRule.ncptiA = pPtr->GetConnectorRule( sal_True ); - if ( aConnectorRule.nShapeB ) - aConnectorRule.ncptiB = pPtr->GetConnectorRule( sal_False ); - } - rStrm << (sal_uInt32)( ( ESCHER_ConnectorRule << 16 ) | 1 ) // atom hd - << (sal_uInt32)24 // - << aConnectorRule.nRuleId - << aConnectorRule.nShapeA - << aConnectorRule.nShapeB - << aConnectorRule.nShapeC - << aConnectorRule.ncptiA - << aConnectorRule.ncptiB; - - aConnectorRule.nRuleId += 2; - } - - nCurrentPos = rStrm.Tell(); // close the ESCHER_SolverContainer - nSize = ( nCurrentPos - nRecHdPos ) - 4;// - rStrm.Seek( nRecHdPos ); // - rStrm << nSize; // - rStrm.Seek( nCurrentPos ); // - } -} - -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- -// --------------------------------------------------------------------------------------------- - -EscherEx::EscherEx( SvStream& rOutStrm, UINT32 nDrawings ) : - EscherGraphicProvider ( 0 ), - mpOutStrm ( &rOutStrm ), - mnDrawings ( nDrawings ), - - mnGroupLevel ( 0 ), - mnHellLayerId ( USHRT_MAX ), - - mbEscherSpgr ( FALSE ), - mbEscherDgg ( FALSE ), // TRUE, wenn jemals ein ESCHER_Dgg angelegt wurde, dieser wird dann im Dest. aktualisiert - mbEscherDg ( FALSE ), - mbOleEmf ( FALSE ) -{ - mnStrmStartOfs = mpOutStrm->Tell(); - mpImplEscherExSdr = new ImplEscherExSdr( *this ); -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::Flush( SvStream* pPicStreamMergeBSE /* = NULL */ ) -{ - if ( mbEscherDgg ) // ESCHER_Dgg anpassen - { - PtReplaceOrInsert( ESCHER_Persist_CurrentPosition, mpOutStrm->Tell() ); - if ( DoSeek( ESCHER_Persist_Dgg ) ) - { - *mpOutStrm << mnCurrentShapeID << (UINT32)( mnFIDCLs + 1 ) << mnTotalShapesDgg << mnDrawings; - } - if ( HasGraphics() ) - { - if ( DoSeek( ESCHER_Persist_BlibStoreContainer ) ) // ESCHER_BlibStoreContainer schreiben - { - sal_uInt32 nAddBytes = GetBlibStoreContainerSize( pPicStreamMergeBSE ); - if ( nAddBytes ) - { - InsertAtCurrentPos( nAddBytes, TRUE ); // platz schaffen fuer Blib Container samt seinen Blib Atomen - WriteBlibStoreContainer( *mpOutStrm, pPicStreamMergeBSE ); - } - } - } - mpOutStrm->Seek( PtGetOffsetByID( ESCHER_Persist_CurrentPosition ) ); - } -} - -// --------------------------------------------------------------------------------------------- - -EscherEx::~EscherEx() -{ - delete mpImplEscherExSdr; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::InsertAtCurrentPos( UINT32 nBytes, BOOL bContainer ) -{ - UINT32 nSize, nType, nSource, nBufSize, nToCopy, nCurPos = mpOutStrm->Tell(); - BYTE* pBuf; - - // Persist table anpassen - for ( void* pPtr = maPersistTable.First(); pPtr; pPtr = maPersistTable.Next() ) - { - UINT32 nOfs = ((EscherPersistEntry*)pPtr)->mnOffset; - if ( nOfs >= nCurPos ) - ((EscherPersistEntry*)pPtr)->mnOffset += nBytes; - } - - // container und atom sizes anpassen - mpOutStrm->Seek( mnStrmStartOfs ); - while ( mpOutStrm->Tell() < nCurPos ) - { - *mpOutStrm >> nType >> nSize; - if ( ( mpOutStrm->Tell() + nSize ) >= ( ( bContainer ) ? nCurPos + 1 : nCurPos ) ) - { - mpOutStrm->SeekRel( -4 ); - *mpOutStrm << (UINT32)( nSize + nBytes ); - if ( ( nType & 0xf ) != 0xf ) - mpOutStrm->SeekRel( nSize ); - } - else - mpOutStrm->SeekRel( nSize ); - } - std::vector< sal_uInt32 >::iterator aIter( mOffsets.begin() ); - std::vector< sal_uInt32 >::iterator aEnd( mOffsets.end() ); - while( aIter != aEnd ) - { - if ( *aIter > nCurPos ) - *aIter += nBytes; - aIter++; - } - mpOutStrm->Seek( STREAM_SEEK_TO_END ); - nSource = mpOutStrm->Tell(); - nToCopy = nSource - nCurPos; // Stream um nBytes vergroessern - pBuf = new BYTE[ 0x40000 ]; // 256KB Buffer - while ( nToCopy ) - { - nBufSize = ( nToCopy >= 0x40000 ) ? 0x40000 : nToCopy; - nToCopy -= nBufSize; - nSource -= nBufSize; - mpOutStrm->Seek( nSource ); - mpOutStrm->Read( pBuf, nBufSize ); - mpOutStrm->Seek( nSource + nBytes ); - mpOutStrm->Write( pBuf, nBufSize ); - } - delete[] pBuf; - mpOutStrm->Seek( nCurPos ); -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::SeekBehindRecHeader( UINT16 nRecType ) -{ - UINT32 nOldPos, nStreamEnd, nType, nSize; - - nOldPos = mpOutStrm->Tell(); - nStreamEnd = mpOutStrm->Seek( STREAM_SEEK_TO_END ); - mpOutStrm->Seek( nOldPos ); - while ( mpOutStrm->Tell() < nStreamEnd ) - { - *mpOutStrm >> nType >> nSize; - if ( ( nType >> 16 ) == nRecType ) - return TRUE; - if ( ( nType & 0xf ) != 0xf ) - mpOutStrm->SeekRel( nSize ); - } - mpOutStrm->Seek( nOldPos ); - return FALSE; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::InsertPersistOffset( UINT32 nKey, UINT32 nOffset ) -{ - PtInsert( ESCHER_Persist_PrivateEntry | nKey, nOffset ); -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::DoSeek( UINT32 nKey ) -{ - UINT32 nPos = PtGetOffsetByID( nKey ); - if ( nPos ) - mpOutStrm->Seek( nPos ); - else - { - if (! PtIsID( nKey ) ) - return FALSE; - mpOutStrm->Seek( 0 ); - } - return TRUE; -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::SeekToPersistOffset( UINT32 nKey ) -{ - return DoSeek( ESCHER_Persist_PrivateEntry | nKey ); -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::InsertAtPersistOffset( UINT32 nKey, UINT32 nValue ) -{ - UINT32 nOldPos = mpOutStrm->Tell(); - BOOL bRetValue = SeekToPersistOffset( nKey ); - if ( bRetValue ) - { - *mpOutStrm << nValue; - mpOutStrm->Seek( nOldPos ); - } - return bRetValue; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::OpenContainer( UINT16 nEscherContainer, int nRecInstance ) -{ - *mpOutStrm << (UINT16)( ( nRecInstance << 4 ) | 0xf ) << nEscherContainer << (UINT32)0; - mOffsets.push_back( mpOutStrm->Tell() - 4 ); - mRecTypes.push_back( nEscherContainer ); - switch( nEscherContainer ) - { - case ESCHER_DggContainer : - { - mbEscherDgg = TRUE; - mnFIDCLs = mnDrawings; - mnCurrentDg = 0; - mnCurrentShapeID = 0; - mnTotalShapesDgg = 0; - mnCurrentShapeMaximumID = 0; - AddAtom( 16 + ( mnDrawings << 3 ), ESCHER_Dgg ); // an FDGG and several FIDCLs - PtReplaceOrInsert( ESCHER_Persist_Dgg, mpOutStrm->Tell() ); - *mpOutStrm << (UINT32)0 // the current maximum shape ID - << (UINT32)0 // the number of ID clusters + 1 - << (UINT32)0 // the number of total shapes saved - << (UINT32)0; // the total number of drawings saved - PtReplaceOrInsert( ESCHER_Persist_Dgg_FIDCL, mpOutStrm->Tell() ); - for ( UINT32 i = 0; i < mnFIDCLs; i++ ) // Dummy FIDCLs einfuegen - { - *mpOutStrm << (UINT32)0 << (UINT32)0; // Drawing Nummer, Anzahl der Shapes in diesem IDCL - } - PtReplaceOrInsert( ESCHER_Persist_BlibStoreContainer, mpOutStrm->Tell() ); - } - break; - - case ESCHER_DgContainer : - { - if ( mbEscherDgg ) - { - if ( !mbEscherDg ) - { - mbEscherDg = TRUE; - mnCurrentDg++; - mnTotalShapesDg = 0; - mnTotalShapeIdUsedDg = 0; - mnCurrentShapeID = ( mnCurrentShapeMaximumID &~0x3ff ) + 0x400; // eine neue Seite bekommt immer eine neue ShapeId die ein vielfaches von 1024 ist, - // damit ist erste aktuelle Shape ID 0x400 - AddAtom( 8, ESCHER_Dg, 0, mnCurrentDg ); - PtReplaceOrInsert( ESCHER_Persist_Dg | mnCurrentDg, mpOutStrm->Tell() ); - *mpOutStrm << (UINT32)0 // The number of shapes in this drawing - << (UINT32)0; // The last MSOSPID given to an SP in this DG - } - } - } - break; - - case ESCHER_SpgrContainer : - { - if ( mbEscherDg ) - { - mbEscherSpgr = TRUE; - } - } - break; - - case ESCHER_SpContainer : - { - } - break; - - default: - break; - } -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::CloseContainer() -{ - sal_uInt32 nSize, nPos = mpOutStrm->Tell(); - nSize = ( nPos - mOffsets.back() ) - 4; - mpOutStrm->Seek( mOffsets.back() ); - *mpOutStrm << nSize; - - switch( mRecTypes.back() ) - { - case ESCHER_DgContainer : - { - if ( mbEscherDg ) - { - mbEscherDg = FALSE; - if ( DoSeek( ESCHER_Persist_Dg | mnCurrentDg ) ) - { - // shapeanzahl des drawings setzen - mnTotalShapesDgg += mnTotalShapesDg; - *mpOutStrm << mnTotalShapesDg << mnCurrentShapeMaximumID; - if ( DoSeek( ESCHER_Persist_Dgg_FIDCL ) ) - { - if ( mnTotalShapesDg == 0 ) - { - mpOutStrm->SeekRel( 8 ); - } - else - { - if ( mnTotalShapeIdUsedDg ) - { - // die benutzten Shape Ids des drawings in die fidcls setzen - UINT32 i, nFIDCL = ( ( mnTotalShapeIdUsedDg - 1 ) / 0x400 ); - if ( nFIDCL ) - { - if ( nPos > mpOutStrm->Tell() ) - nPos += ( nFIDCL << 3 ); - - mnFIDCLs += nFIDCL; - InsertAtCurrentPos( nFIDCL << 3 ); // platz schaffen fuer weitere FIDCL's - } - for ( i = 0; i <= nFIDCL; i++ ) - { - *mpOutStrm << mnCurrentDg; - if ( i < nFIDCL ) - *mpOutStrm << (UINT32)0x400; - else - { - UINT32 nShapesLeft = mnTotalShapeIdUsedDg % 0x400; - if ( !nShapesLeft ) - nShapesLeft = 0x400; - *mpOutStrm << (UINT32)nShapesLeft; - } - } - } - } - PtReplaceOrInsert( ESCHER_Persist_Dgg_FIDCL, mpOutStrm->Tell() ); // neuen FIDCL Offset fuer naechste Seite - } - } - } - } - break; - - case ESCHER_SpgrContainer : - { - if ( mbEscherSpgr ) - { - mbEscherSpgr = FALSE; - - } - } - break; - - default: - break; - } - mOffsets.pop_back(); - mRecTypes.pop_back(); - mpOutStrm->Seek( nPos ); -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::BeginAtom() -{ - mnCountOfs = mpOutStrm->Tell(); - *mpOutStrm << (UINT32)0 << (UINT32)0; // record header wird spaeter geschrieben -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::EndAtom( UINT16 nRecType, int nRecVersion, int nRecInstance ) -{ - UINT32 nOldPos = mpOutStrm->Tell(); - mpOutStrm->Seek( mnCountOfs ); - sal_uInt32 nSize = nOldPos - mnCountOfs; - *mpOutStrm << (UINT16)( ( nRecInstance << 4 ) | ( nRecVersion & 0xf ) ) << nRecType << (UINT32)( nSize - 8 ); - mpOutStrm->Seek( nOldPos ); -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::AddAtom( UINT32 nAtomSize, UINT16 nRecType, int nRecVersion, int nRecInstance ) -{ - *mpOutStrm << (UINT16)( ( nRecInstance << 4 ) | ( nRecVersion & 0xf ) ) << nRecType << nAtomSize; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::AddChildAnchor( const Rectangle& rRect ) -{ - AddAtom( 16, ESCHER_ChildAnchor ); - GetStream() << (INT32)rRect.Left() - << (INT32)rRect.Top() - << (INT32)rRect.Right() - << (INT32)rRect.Bottom(); -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::AddClientAnchor( const Rectangle& rRect ) -{ - AddAtom( 8, ESCHER_ClientAnchor ); - *mpOutStrm << (sal_Int16)rRect.Top() - << (sal_Int16)rRect.Left() - << (sal_Int16)( rRect.GetWidth() + rRect.Left() ) - << (sal_Int16)( rRect.GetHeight() + rRect.Top() ); -} - -// --------------------------------------------------------------------------------------------- - -EscherExHostAppData* EscherEx::EnterAdditionalTextGroup() -{ - return NULL; -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherEx::EnterGroup( const String& rShapeName, const Rectangle* pBoundRect ) -{ - Rectangle aRect; - if( pBoundRect ) - aRect = *pBoundRect; - - OpenContainer( ESCHER_SpgrContainer ); - OpenContainer( ESCHER_SpContainer ); - AddAtom( 16, ESCHER_Spgr, 1 ); - PtReplaceOrInsert( ESCHER_Persist_Grouping_Snap | mnGroupLevel, - mpOutStrm->Tell() ); - *mpOutStrm << (INT32)aRect.Left() // Bounding box fuer die Gruppierten shapes an die sie attached werden - << (INT32)aRect.Top() - << (INT32)aRect.Right() - << (INT32)aRect.Bottom(); - - UINT32 nShapeId = GetShapeID(); - if ( !mnGroupLevel ) - AddShape( ESCHER_ShpInst_Min, 5, nShapeId ); // Flags: Group | Patriarch - else - { - AddShape( ESCHER_ShpInst_Min, 0x201, nShapeId ); // Flags: Group | HaveAnchor - EscherPropertyContainer aPropOpt; - aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x00040004 ); - aPropOpt.AddOpt( ESCHER_Prop_dxWrapDistLeft, 0 ); - aPropOpt.AddOpt( ESCHER_Prop_dxWrapDistRight, 0 ); - - // #i51348# shape name - if( rShapeName.Len() > 0 ) - aPropOpt.AddOpt( ESCHER_Prop_wzName, rShapeName ); - - Commit( aPropOpt, aRect ); - if ( mnGroupLevel > 1 ) - AddChildAnchor( aRect ); - - EscherExHostAppData* pAppData = mpImplEscherExSdr->ImplGetHostData(); - if( pAppData ) - { - if ( mnGroupLevel <= 1 ) - pAppData->WriteClientAnchor( *this, aRect ); - pAppData->WriteClientData( *this ); - } - } - CloseContainer(); // ESCHER_SpContainer - mnGroupLevel++; - return nShapeId; -} - -UINT32 EscherEx::EnterGroup( const Rectangle* pBoundRect ) -{ - return EnterGroup( String::EmptyString(), pBoundRect ); -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::SetGroupSnapRect( UINT32 nGroupLevel, const Rectangle& rRect ) -{ - BOOL bRetValue = FALSE; - if ( nGroupLevel ) - { - UINT32 nCurrentPos = mpOutStrm->Tell(); - if ( DoSeek( ESCHER_Persist_Grouping_Snap | ( nGroupLevel - 1 ) ) ) - { - *mpOutStrm << (INT32)rRect.Left() // Bounding box fuer die Gruppierten shapes an die sie attached werden - << (INT32)rRect.Top() - << (INT32)rRect.Right() - << (INT32)rRect.Bottom(); - mpOutStrm->Seek( nCurrentPos ); - } - } - return bRetValue; -} - -// --------------------------------------------------------------------------------------------- - -BOOL EscherEx::SetGroupLogicRect( UINT32 nGroupLevel, const Rectangle& rRect ) -{ - BOOL bRetValue = FALSE; - if ( nGroupLevel ) - { - UINT32 nCurrentPos = mpOutStrm->Tell(); - if ( DoSeek( ESCHER_Persist_Grouping_Logic | ( nGroupLevel - 1 ) ) ) - { - *mpOutStrm << (INT16)rRect.Top() << (INT16)rRect.Left() << (INT16)rRect.Right() << (INT16)rRect.Bottom(); - mpOutStrm->Seek( nCurrentPos ); - } - } - return bRetValue; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::LeaveGroup() -{ - --mnGroupLevel; - PtDelete( ESCHER_Persist_Grouping_Snap | mnGroupLevel ); - PtDelete( ESCHER_Persist_Grouping_Logic | mnGroupLevel ); - CloseContainer(); -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::AddShape( UINT32 nShpInstance, UINT32 nFlags, UINT32 nShapeID ) -{ - AddAtom( 8, ESCHER_Sp, 2, nShpInstance ); - - if ( !nShapeID ) - nShapeID = GetShapeID(); - - if ( nFlags ^ 1 ) // is this a group shape ? - { // if not - if ( mnGroupLevel > 1 ) - nFlags |= 2; // this not a topmost shape - } - *mpOutStrm << nShapeID << nFlags; - - if ( mbEscherSpgr ) - mnTotalShapesDg++; -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherEx::GetShapeID() -{ - mnCurrentShapeMaximumID = mnCurrentShapeID; // maximum setzen - mnCurrentShapeID++; // mnCurrentShape ID auf nachste freie ID - mnTotalShapeIdUsedDg++; - return mnCurrentShapeMaximumID; -} - -// --------------------------------------------------------------------------------------------- - -void EscherEx::Commit( EscherPropertyContainer& rProps, const Rectangle& ) -{ - rProps.Commit( GetStream() ); -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherEx::GetColor( const UINT32 nSOColor, BOOL bSwap ) -{ - if ( bSwap ) - { - UINT32 nColor = nSOColor & 0xff00; // GRUEN - nColor |= (BYTE)( nSOColor ) << 16; // ROT - nColor |= (BYTE)( nSOColor >> 16 ); // BLAU - return nColor; - } - else - return nSOColor & 0xffffff; -} - -// --------------------------------------------------------------------------------------------- - -UINT32 EscherEx::GetColor( const Color& rSOColor, BOOL bSwap ) -{ - UINT32 nColor = ( rSOColor.GetRed() << 16 ); - nColor |= ( rSOColor.GetGreen() << 8 ); - nColor |= rSOColor.GetBlue(); - - if ( !bSwap ) - nColor = GetColor( nColor, TRUE ); - - return nColor; -} - -// --------------------------------------------------------------------------------------------- |