/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include #include #include #include #include #include inline void ImplScalePoint( Point& rPt, double fScaleX, double fScaleY ) { rPt.X() = FRound( fScaleX * rPt.X() ); rPt.Y() = FRound( fScaleY * rPt.Y() ); } inline void ImplScaleRect( Rectangle& rRect, double fScaleX, double fScaleY ) { Point aTL( rRect.TopLeft() ); Point aBR( rRect.BottomRight() ); ImplScalePoint( aTL, fScaleX, fScaleY ); ImplScalePoint( aBR, fScaleX, fScaleY ); rRect = Rectangle( aTL, aBR ); rRect.Justify(); } inline void ImplScalePoly( Polygon& rPoly, double fScaleX, double fScaleY ) { for( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ ) ImplScalePoint( rPoly[ i ], fScaleX, fScaleY ); } inline void ImplScaleLineInfo( LineInfo& rLineInfo, double fScaleX, double fScaleY ) { if( !rLineInfo.IsDefault() ) { const double fScale = ( fabs(fScaleX) + fabs(fScaleY) ) * 0.5; rLineInfo.SetWidth( FRound( fScale * rLineInfo.GetWidth() ) ); rLineInfo.SetDashLen( FRound( fScale * rLineInfo.GetDashLen() ) ); rLineInfo.SetDotLen( FRound( fScale * rLineInfo.GetDotLen() ) ); rLineInfo.SetDistance( FRound( fScale * rLineInfo.GetDistance() ) ); } } #define COMPAT( _def_rIStm ) VersionCompat aCompat( ( _def_rIStm ), STREAM_READ ); #define WRITE_BASE_COMPAT( _def_rOStm, _def_nVer, _pWriteData ) \ MetaAction::Write( ( _def_rOStm ), _pWriteData ); \ VersionCompat aCompat( ( _def_rOStm ), STREAM_WRITE, ( _def_nVer ) ); MetaAction::MetaAction() : mnRefCount( 1 ), mnType( META_NULL_ACTION ) { } MetaAction::MetaAction( sal_uInt16 nType ) : mnRefCount( 1 ), mnType( nType ) { } MetaAction::~MetaAction() { } void MetaAction::Execute( OutputDevice* ) { } MetaAction* MetaAction::Clone() { return new MetaAction; } void MetaAction::Move( long, long ) { } void MetaAction::Scale( double, double ) { } bool MetaAction::Compare( const MetaAction& ) const { return true; } void MetaAction::Write( SvStream& rOStm, ImplMetaWriteData* ) { rOStm.WriteUInt16( mnType ); } void MetaAction::Read( SvStream&, ImplMetaReadData* ) { // DO NOT read mnType - ReadMetaAction already did that! } MetaAction* MetaAction::ReadMetaAction( SvStream& rIStm, ImplMetaReadData* pData ) { MetaAction* pAction = NULL; sal_uInt16 nType = 0; rIStm.ReadUInt16( nType ); SAL_INFO("vcl.gdi", "ReadMetaAction " << nType); switch( nType ) { case( META_NULL_ACTION ): pAction = new MetaAction; break; case( META_PIXEL_ACTION ): pAction = new MetaPixelAction; break; case( META_POINT_ACTION ): pAction = new MetaPointAction; break; case( META_LINE_ACTION ): pAction = new MetaLineAction; break; case( META_RECT_ACTION ): pAction = new MetaRectAction; break; case( META_ROUNDRECT_ACTION ): pAction = new MetaRoundRectAction; break; case( META_ELLIPSE_ACTION ): pAction = new MetaEllipseAction; break; case( META_ARC_ACTION ): pAction = new MetaArcAction; break; case( META_PIE_ACTION ): pAction = new MetaPieAction; break; case( META_CHORD_ACTION ): pAction = new MetaChordAction; break; case( META_POLYLINE_ACTION ): pAction = new MetaPolyLineAction; break; case( META_POLYGON_ACTION ): pAction = new MetaPolygonAction; break; case( META_POLYPOLYGON_ACTION ): pAction = new MetaPolyPolygonAction; break; case( META_TEXT_ACTION ): pAction = new MetaTextAction; break; case( META_TEXTARRAY_ACTION ): pAction = new MetaTextArrayAction; break; case( META_STRETCHTEXT_ACTION ): pAction = new MetaStretchTextAction; break; case( META_TEXTRECT_ACTION ): pAction = new MetaTextRectAction; break; case( META_TEXTLINE_ACTION ): pAction = new MetaTextLineAction; break; case( META_BMP_ACTION ): pAction = new MetaBmpAction; break; case( META_BMPSCALE_ACTION ): pAction = new MetaBmpScaleAction; break; case( META_BMPSCALEPART_ACTION ): pAction = new MetaBmpScalePartAction; break; case( META_BMPEX_ACTION ): pAction = new MetaBmpExAction; break; case( META_BMPEXSCALE_ACTION ): pAction = new MetaBmpExScaleAction; break; case( META_BMPEXSCALEPART_ACTION ): pAction = new MetaBmpExScalePartAction; break; case( META_MASK_ACTION ): pAction = new MetaMaskAction; break; case( META_MASKSCALE_ACTION ): pAction = new MetaMaskScaleAction; break; case( META_MASKSCALEPART_ACTION ): pAction = new MetaMaskScalePartAction; break; case( META_GRADIENT_ACTION ): pAction = new MetaGradientAction; break; case( META_GRADIENTEX_ACTION ): pAction = new MetaGradientExAction; break; case( META_HATCH_ACTION ): pAction = new MetaHatchAction; break; case( META_WALLPAPER_ACTION ): pAction = new MetaWallpaperAction; break; case( META_CLIPREGION_ACTION ): pAction = new MetaClipRegionAction; break; case( META_ISECTRECTCLIPREGION_ACTION ): pAction = new MetaISectRectClipRegionAction; break; case( META_ISECTREGIONCLIPREGION_ACTION ): pAction = new MetaISectRegionClipRegionAction; break; case( META_MOVECLIPREGION_ACTION ): pAction = new MetaMoveClipRegionAction; break; case( META_LINECOLOR_ACTION ): pAction = new MetaLineColorAction; break; case( META_FILLCOLOR_ACTION ): pAction = new MetaFillColorAction; break; case( META_TEXTCOLOR_ACTION ): pAction = new MetaTextColorAction; break; case( META_TEXTFILLCOLOR_ACTION ): pAction = new MetaTextFillColorAction; break; case( META_TEXTLINECOLOR_ACTION ): pAction = new MetaTextLineColorAction; break; case( META_OVERLINECOLOR_ACTION ): pAction = new MetaOverlineColorAction; break; case( META_TEXTALIGN_ACTION ): pAction = new MetaTextAlignAction; break; case( META_MAPMODE_ACTION ): pAction = new MetaMapModeAction; break; case( META_FONT_ACTION ): pAction = new MetaFontAction; break; case( META_PUSH_ACTION ): pAction = new MetaPushAction; break; case( META_POP_ACTION ): pAction = new MetaPopAction; break; case( META_RASTEROP_ACTION ): pAction = new MetaRasterOpAction; break; case( META_TRANSPARENT_ACTION ): pAction = new MetaTransparentAction; break; case( META_FLOATTRANSPARENT_ACTION ): pAction = new MetaFloatTransparentAction; break; case( META_EPS_ACTION ): pAction = new MetaEPSAction; break; case( META_REFPOINT_ACTION ): pAction = new MetaRefPointAction; break; case( META_COMMENT_ACTION ): pAction = new MetaCommentAction; break; case( META_LAYOUTMODE_ACTION ): pAction = new MetaLayoutModeAction; break; case( META_TEXTLANGUAGE_ACTION ): pAction = new MetaTextLanguageAction; break; default: { // Action ueberlesen durch Kombination Ctor/Dtor, // new/delete, weil Compiler sonst vielleicht wegoptimieren delete ( new VersionCompat( rIStm, STREAM_READ ) ); } break; } if( pAction ) pAction->Read( rIStm, pData ); return pAction; } IMPL_META_ACTION( Pixel, META_PIXEL_ACTION ) MetaPixelAction::MetaPixelAction( const Point& rPt, const Color& rColor ) : MetaAction ( META_PIXEL_ACTION ), maPt ( rPt ), maColor ( rColor ) { } void MetaPixelAction::Execute( OutputDevice* pOut ) { pOut->DrawPixel( maPt, maColor ); } MetaAction* MetaPixelAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPixelAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPixelAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaPixelAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaPixelAction::Compare( const MetaAction& rMetaAction ) const { return ( maPt == ((MetaPixelAction&)rMetaAction).maPt ) && ( maColor == ((MetaPixelAction&)rMetaAction).maColor ); } void MetaPixelAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WritePair( rOStm, maPt ); maColor.Write( rOStm, true ); } void MetaPixelAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPair( rIStm, maPt ); maColor.Read( rIStm, true ); } IMPL_META_ACTION( Point, META_POINT_ACTION ) MetaPointAction::MetaPointAction( const Point& rPt ) : MetaAction ( META_POINT_ACTION ), maPt ( rPt ) { } void MetaPointAction::Execute( OutputDevice* pOut ) { pOut->DrawPixel( maPt ); } MetaAction* MetaPointAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPointAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPointAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaPointAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaPointAction::Compare( const MetaAction& rMetaAction ) const { return maPt == ((MetaPointAction&)rMetaAction).maPt; } void MetaPointAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WritePair( rOStm, maPt ); } void MetaPointAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPair( rIStm, maPt ); } IMPL_META_ACTION( Line, META_LINE_ACTION ) MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd ) : MetaAction ( META_LINE_ACTION ), maStartPt ( rStart ), maEndPt ( rEnd ) { } MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd, const LineInfo& rLineInfo ) : MetaAction ( META_LINE_ACTION ), maLineInfo ( rLineInfo ), maStartPt ( rStart ), maEndPt ( rEnd ) { } void MetaLineAction::Execute( OutputDevice* pOut ) { if( maLineInfo.IsDefault() ) pOut->DrawLine( maStartPt, maEndPt ); else pOut->DrawLine( maStartPt, maEndPt, maLineInfo ); } MetaAction* MetaLineAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaLineAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaLineAction::Move( long nHorzMove, long nVertMove ) { maStartPt.Move( nHorzMove, nVertMove ); maEndPt.Move( nHorzMove, nVertMove ); } void MetaLineAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maStartPt, fScaleX, fScaleY ); ImplScalePoint( maEndPt, fScaleX, fScaleY ); ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY ); } bool MetaLineAction::Compare( const MetaAction& rMetaAction ) const { return ( maLineInfo == ((MetaLineAction&)rMetaAction).maLineInfo ) && ( maStartPt == ((MetaLineAction&)rMetaAction).maStartPt ) && ( maEndPt == ((MetaLineAction&)rMetaAction).maEndPt ); } void MetaLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); WritePair( rOStm, maStartPt ); WritePair( rOStm, maEndPt ); // Version 1 WriteLineInfo( rOStm, maLineInfo ); // Version 2 } void MetaLineAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); // Version 1 ReadPair( rIStm, maStartPt ); ReadPair( rIStm, maEndPt ); // Version 2 if( aCompat.GetVersion() >= 2 ) { ReadLineInfo( rIStm, maLineInfo ); } } IMPL_META_ACTION( Rect, META_RECT_ACTION ) MetaRectAction::MetaRectAction( const Rectangle& rRect ) : MetaAction ( META_RECT_ACTION ), maRect ( rRect ) { } void MetaRectAction::Execute( OutputDevice* pOut ) { pOut->DrawRect( maRect ); } MetaAction* MetaRectAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaRectAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaRectAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaRectAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaRectAction::Compare( const MetaAction& rMetaAction ) const { return maRect == ((MetaRectAction&)rMetaAction).maRect; } void MetaRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); } void MetaRectAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); } IMPL_META_ACTION( RoundRect, META_ROUNDRECT_ACTION ) MetaRoundRectAction::MetaRoundRectAction( const Rectangle& rRect, sal_uInt32 nHorzRound, sal_uInt32 nVertRound ) : MetaAction ( META_ROUNDRECT_ACTION ), maRect ( rRect ), mnHorzRound ( nHorzRound ), mnVertRound ( nVertRound ) { } void MetaRoundRectAction::Execute( OutputDevice* pOut ) { pOut->DrawRect( maRect, mnHorzRound, mnVertRound ); } MetaAction* MetaRoundRectAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaRoundRectAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaRoundRectAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaRoundRectAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); mnHorzRound = FRound( mnHorzRound * fabs(fScaleX) ); mnVertRound = FRound( mnVertRound * fabs(fScaleY) ); } bool MetaRoundRectAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaRoundRectAction&)rMetaAction).maRect ) && ( mnHorzRound == ((MetaRoundRectAction&)rMetaAction).mnHorzRound ) && ( mnVertRound == ((MetaRoundRectAction&)rMetaAction).mnVertRound ); } void MetaRoundRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); rOStm.WriteUInt32( mnHorzRound ).WriteUInt32( mnVertRound ); } void MetaRoundRectAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ).ReadUInt32( mnHorzRound ).ReadUInt32( mnVertRound ); } IMPL_META_ACTION( Ellipse, META_ELLIPSE_ACTION ) MetaEllipseAction::MetaEllipseAction( const Rectangle& rRect ) : MetaAction ( META_ELLIPSE_ACTION ), maRect ( rRect ) { } void MetaEllipseAction::Execute( OutputDevice* pOut ) { pOut->DrawEllipse( maRect ); } MetaAction* MetaEllipseAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaEllipseAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaEllipseAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaEllipseAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaEllipseAction::Compare( const MetaAction& rMetaAction ) const { return maRect == ((MetaEllipseAction&)rMetaAction).maRect; } void MetaEllipseAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); } void MetaEllipseAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); } IMPL_META_ACTION( Arc, META_ARC_ACTION ) MetaArcAction::MetaArcAction( const Rectangle& rRect, const Point& rStart, const Point& rEnd ) : MetaAction ( META_ARC_ACTION ), maRect ( rRect ), maStartPt ( rStart ), maEndPt ( rEnd ) { } void MetaArcAction::Execute( OutputDevice* pOut ) { pOut->DrawArc( maRect, maStartPt, maEndPt ); } MetaAction* MetaArcAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaArcAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaArcAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); maStartPt.Move( nHorzMove, nVertMove ); maEndPt.Move( nHorzMove, nVertMove ); } void MetaArcAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); ImplScalePoint( maStartPt, fScaleX, fScaleY ); ImplScalePoint( maEndPt, fScaleX, fScaleY ); } bool MetaArcAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaArcAction&)rMetaAction).maRect ) && ( maStartPt == ((MetaArcAction&)rMetaAction).maStartPt ) && ( maEndPt == ((MetaArcAction&)rMetaAction).maEndPt ); } void MetaArcAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); WritePair( rOStm, maStartPt ); WritePair( rOStm, maEndPt ); } void MetaArcAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); ReadPair( rIStm, maStartPt ); ReadPair( rIStm, maEndPt ); } IMPL_META_ACTION( Pie, META_PIE_ACTION ) MetaPieAction::MetaPieAction( const Rectangle& rRect, const Point& rStart, const Point& rEnd ) : MetaAction ( META_PIE_ACTION ), maRect ( rRect ), maStartPt ( rStart ), maEndPt ( rEnd ) { } void MetaPieAction::Execute( OutputDevice* pOut ) { pOut->DrawPie( maRect, maStartPt, maEndPt ); } MetaAction* MetaPieAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPieAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPieAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); maStartPt.Move( nHorzMove, nVertMove ); maEndPt.Move( nHorzMove, nVertMove ); } void MetaPieAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); ImplScalePoint( maStartPt, fScaleX, fScaleY ); ImplScalePoint( maEndPt, fScaleX, fScaleY ); } bool MetaPieAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaPieAction&)rMetaAction).maRect ) && ( maStartPt == ((MetaPieAction&)rMetaAction).maStartPt ) && ( maEndPt == ((MetaPieAction&)rMetaAction).maEndPt ); } void MetaPieAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); WritePair( rOStm, maStartPt ); WritePair( rOStm, maEndPt ); } void MetaPieAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); ReadPair( rIStm, maStartPt ); ReadPair( rIStm, maEndPt ); } IMPL_META_ACTION( Chord, META_CHORD_ACTION ) MetaChordAction::MetaChordAction( const Rectangle& rRect, const Point& rStart, const Point& rEnd ) : MetaAction ( META_CHORD_ACTION ), maRect ( rRect ), maStartPt ( rStart ), maEndPt ( rEnd ) { } void MetaChordAction::Execute( OutputDevice* pOut ) { pOut->DrawChord( maRect, maStartPt, maEndPt ); } MetaAction* MetaChordAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaChordAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaChordAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); maStartPt.Move( nHorzMove, nVertMove ); maEndPt.Move( nHorzMove, nVertMove ); } void MetaChordAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); ImplScalePoint( maStartPt, fScaleX, fScaleY ); ImplScalePoint( maEndPt, fScaleX, fScaleY ); } bool MetaChordAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaChordAction&)rMetaAction).maRect ) && ( maStartPt == ((MetaChordAction&)rMetaAction).maStartPt ) && ( maEndPt == ((MetaChordAction&)rMetaAction).maEndPt ); } void MetaChordAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); WritePair( rOStm, maStartPt ); WritePair( rOStm, maEndPt ); } void MetaChordAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); ReadPair( rIStm, maStartPt ); ReadPair( rIStm, maEndPt ); } IMPL_META_ACTION( PolyLine, META_POLYLINE_ACTION ) MetaPolyLineAction::MetaPolyLineAction( const Polygon& rPoly ) : MetaAction ( META_POLYLINE_ACTION ), maPoly ( rPoly ) { } MetaPolyLineAction::MetaPolyLineAction( const Polygon& rPoly, const LineInfo& rLineInfo ) : MetaAction ( META_POLYLINE_ACTION ), maLineInfo ( rLineInfo ), maPoly ( rPoly ) { } void MetaPolyLineAction::Execute( OutputDevice* pOut ) { if( maLineInfo.IsDefault() ) pOut->DrawPolyLine( maPoly ); else pOut->DrawPolyLine( maPoly, maLineInfo ); } MetaAction* MetaPolyLineAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPolyLineAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPolyLineAction::Move( long nHorzMove, long nVertMove ) { maPoly.Move( nHorzMove, nVertMove ); } void MetaPolyLineAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoly( maPoly, fScaleX, fScaleY ); ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY ); } bool MetaPolyLineAction::Compare( const MetaAction& rMetaAction ) const { bool bIsEqual = true; if ( maLineInfo != ((MetaPolyLineAction&)rMetaAction).maLineInfo ) bIsEqual = false; else bIsEqual = maPoly.IsEqual(((MetaPolyLineAction&)rMetaAction).maPoly ); return bIsEqual; } void MetaPolyLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 3, pData ); Polygon aSimplePoly; maPoly.AdaptiveSubdivide( aSimplePoly ); WritePolygon( rOStm, aSimplePoly ); // Version 1 WriteLineInfo( rOStm, maLineInfo ); // Version 2 sal_uInt8 bHasPolyFlags = maPoly.HasFlags(); // Version 3 rOStm.WriteUChar( bHasPolyFlags ); if ( bHasPolyFlags ) maPoly.Write( rOStm ); } void MetaPolyLineAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); // Version 1 ReadPolygon( rIStm, maPoly ); // Version 2 if( aCompat.GetVersion() >= 2 ) ReadLineInfo( rIStm, maLineInfo ); if ( aCompat.GetVersion() >= 3 ) { sal_uInt8 bHasPolyFlags; rIStm.ReadUChar( bHasPolyFlags ); if ( bHasPolyFlags ) maPoly.Read( rIStm ); } } IMPL_META_ACTION( Polygon, META_POLYGON_ACTION ) MetaPolygonAction::MetaPolygonAction( const Polygon& rPoly ) : MetaAction ( META_POLYGON_ACTION ), maPoly ( rPoly ) { } void MetaPolygonAction::Execute( OutputDevice* pOut ) { pOut->DrawPolygon( maPoly ); } MetaAction* MetaPolygonAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPolygonAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPolygonAction::Move( long nHorzMove, long nVertMove ) { maPoly.Move( nHorzMove, nVertMove ); } void MetaPolygonAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoly( maPoly, fScaleX, fScaleY ); } bool MetaPolygonAction::Compare( const MetaAction& rMetaAction ) const { return maPoly.IsEqual(((MetaPolygonAction&)rMetaAction).maPoly ); } void MetaPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); Polygon aSimplePoly; // Version 1 maPoly.AdaptiveSubdivide( aSimplePoly ); WritePolygon( rOStm, aSimplePoly ); sal_uInt8 bHasPolyFlags = maPoly.HasFlags(); // Version 2 rOStm.WriteUChar( bHasPolyFlags ); if ( bHasPolyFlags ) maPoly.Write( rOStm ); } void MetaPolygonAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPolygon( rIStm, maPoly ); // Version 1 if( aCompat.GetVersion() >= 2 ) // Version 2 { sal_uInt8 bHasPolyFlags(0); rIStm.ReadUChar( bHasPolyFlags ); if ( bHasPolyFlags ) maPoly.Read( rIStm ); } } IMPL_META_ACTION( PolyPolygon, META_POLYPOLYGON_ACTION ) MetaPolyPolygonAction::MetaPolyPolygonAction( const PolyPolygon& rPolyPoly ) : MetaAction ( META_POLYPOLYGON_ACTION ), maPolyPoly ( rPolyPoly ) { } void MetaPolyPolygonAction::Execute( OutputDevice* pOut ) { pOut->DrawPolyPolygon( maPolyPoly ); } MetaAction* MetaPolyPolygonAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPolyPolygonAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPolyPolygonAction::Move( long nHorzMove, long nVertMove ) { maPolyPoly.Move( nHorzMove, nVertMove ); } void MetaPolyPolygonAction::Scale( double fScaleX, double fScaleY ) { for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ ) ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY ); } bool MetaPolyPolygonAction::Compare( const MetaAction& rMetaAction ) const { return maPolyPoly.IsEqual(((MetaPolyPolygonAction&)rMetaAction).maPolyPoly ); } void MetaPolyPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); sal_uInt16 nNumberOfComplexPolygons = 0; sal_uInt16 i, nPolyCount = maPolyPoly.Count(); Polygon aSimplePoly; // Version 1 rOStm.WriteUInt16( nPolyCount ); for ( i = 0; i < nPolyCount; i++ ) { const Polygon& rPoly = maPolyPoly.GetObject( i ); if ( rPoly.HasFlags() ) nNumberOfComplexPolygons++; rPoly.AdaptiveSubdivide( aSimplePoly ); WritePolygon( rOStm, aSimplePoly ); } rOStm.WriteUInt16( nNumberOfComplexPolygons ); // Version 2 for ( i = 0; nNumberOfComplexPolygons && ( i < nPolyCount ); i++ ) { const Polygon& rPoly = maPolyPoly.GetObject( i ); if ( rPoly.HasFlags() ) { rOStm.WriteUInt16( i ); rPoly.Write( rOStm ); nNumberOfComplexPolygons--; } } } void MetaPolyPolygonAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPolyPolygon( rIStm, maPolyPoly ); // Version 1 if ( aCompat.GetVersion() >= 2 ) // Version 2 { sal_uInt16 i, nIndex, nNumberOfComplexPolygons; rIStm.ReadUInt16( nNumberOfComplexPolygons ); for ( i = 0; i < nNumberOfComplexPolygons; i++ ) { rIStm.ReadUInt16( nIndex ); Polygon aPoly; aPoly.Read( rIStm ); maPolyPoly.Replace( aPoly, nIndex ); } } } IMPL_META_ACTION( Text, META_TEXT_ACTION ) MetaTextAction::MetaTextAction( const Point& rPt, const OUString& rStr, sal_Int32 nIndex, sal_Int32 nLen ) : MetaAction ( META_TEXT_ACTION ), maPt ( rPt ), maStr ( rStr ), mnIndex ( nIndex ), mnLen ( nLen ) { } void MetaTextAction::Execute( OutputDevice* pOut ) { pOut->DrawText( maPt, maStr, mnIndex, mnLen ); } MetaAction* MetaTextAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaTextAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaTextAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaTextAction::Compare( const MetaAction& rMetaAction ) const { return ( maPt == ((MetaTextAction&)rMetaAction).maPt ) && ( maStr == ((MetaTextAction&)rMetaAction).maStr ) && ( mnIndex == ((MetaTextAction&)rMetaAction).mnIndex ) && ( mnLen == ((MetaTextAction&)rMetaAction).mnLen ); } void MetaTextAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); WritePair( rOStm, maPt ); rOStm.WriteUniOrByteString( maStr, pData->meActualCharSet ); rOStm.WriteUInt16(mnIndex); rOStm.WriteUInt16(mnLen); write_uInt16_lenPrefixed_uInt16s_FromOUString(rOStm, maStr); // version 2 } void MetaTextAction::Read( SvStream& rIStm, ImplMetaReadData* pData ) { COMPAT( rIStm ); ReadPair( rIStm, maPt ); maStr = rIStm.ReadUniOrByteString(pData->meActualCharSet); sal_uInt16 nTmp(0); rIStm.ReadUInt16(nTmp); mnIndex = nTmp; rIStm.ReadUInt16(nTmp); mnLen = nTmp; if ( aCompat.GetVersion() >= 2 ) // Version 2 maStr = read_uInt16_lenPrefixed_uInt16s_ToOUString(rIStm); } MetaTextArrayAction::MetaTextArrayAction() : MetaAction ( META_TEXTARRAY_ACTION ), mpDXAry ( NULL ), mnIndex ( 0 ), mnLen ( 0 ) { } MetaTextArrayAction::MetaTextArrayAction( const MetaTextArrayAction& rAction ) : MetaAction ( META_TEXTARRAY_ACTION ), maStartPt ( rAction.maStartPt ), maStr ( rAction.maStr ), mnIndex ( rAction.mnIndex ), mnLen ( rAction.mnLen ) { if( rAction.mpDXAry ) { const sal_uLong nAryLen = mnLen; mpDXAry = new sal_Int32[ nAryLen ]; memcpy( mpDXAry, rAction.mpDXAry, nAryLen * sizeof( sal_Int32 ) ); } else mpDXAry = NULL; } MetaTextArrayAction::MetaTextArrayAction( const Point& rStartPt, const OUString& rStr, const sal_Int32* pDXAry, sal_Int32 nIndex, sal_Int32 nLen ) : MetaAction ( META_TEXTARRAY_ACTION ), maStartPt ( rStartPt ), maStr ( rStr ), mnIndex ( nIndex ), mnLen ( nLen ) { const sal_uLong nAryLen = pDXAry ? mnLen : 0; if( nAryLen ) { mpDXAry = new sal_Int32[ nAryLen ]; memcpy( mpDXAry, pDXAry, nAryLen * sizeof( sal_Int32 ) ); } else mpDXAry = NULL; } MetaTextArrayAction::~MetaTextArrayAction() { delete[] mpDXAry; } void MetaTextArrayAction::Execute( OutputDevice* pOut ) { pOut->DrawTextArray( maStartPt, maStr, mpDXAry, mnIndex, mnLen ); } MetaAction* MetaTextArrayAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextArrayAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaTextArrayAction::Move( long nHorzMove, long nVertMove ) { maStartPt.Move( nHorzMove, nVertMove ); } void MetaTextArrayAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maStartPt, fScaleX, fScaleY ); if ( mpDXAry && mnLen ) { for ( sal_uInt16 i = 0, nCount = mnLen; i < nCount; i++ ) mpDXAry[ i ] = FRound( mpDXAry[ i ] * fabs(fScaleX) ); } } bool MetaTextArrayAction::Compare( const MetaAction& rMetaAction ) const { return ( maStartPt == ((MetaTextArrayAction&)rMetaAction).maStartPt ) && ( maStr == ((MetaTextArrayAction&)rMetaAction).maStr ) && ( mnIndex == ((MetaTextArrayAction&)rMetaAction).mnIndex ) && ( mnLen == ((MetaTextArrayAction&)rMetaAction).mnLen ) && ( memcmp( mpDXAry, ((MetaTextArrayAction&)rMetaAction).mpDXAry, mnLen ) == 0 ); } void MetaTextArrayAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { const sal_Int32 nAryLen = mpDXAry ? mnLen : 0; WRITE_BASE_COMPAT( rOStm, 2, pData ); WritePair( rOStm, maStartPt ); rOStm.WriteUniOrByteString( maStr, pData->meActualCharSet ); rOStm.WriteUInt16(mnIndex); rOStm.WriteUInt16(mnLen); rOStm.WriteUInt16(nAryLen); for (sal_Int32 i = 0; i < nAryLen; ++i) rOStm.WriteInt32( mpDXAry[ i ] ); write_uInt16_lenPrefixed_uInt16s_FromOUString(rOStm, maStr); // version 2 } void MetaTextArrayAction::Read( SvStream& rIStm, ImplMetaReadData* pData ) { sal_Int32 nAryLen; delete[] mpDXAry; COMPAT( rIStm ); ReadPair( rIStm, maStartPt ); maStr = rIStm.ReadUniOrByteString(pData->meActualCharSet); sal_uInt16 nTmp(0); rIStm.ReadUInt16(nTmp); mnIndex = nTmp; rIStm.ReadUInt16(nTmp); mnLen = nTmp; rIStm.ReadUInt16(nTmp); nAryLen = nTmp; if ( mnIndex + mnLen > maStr.getLength() ) { mnIndex = 0; mpDXAry = 0; return; } if( nAryLen ) { // #i9762#, #106172# Ensure that DX array is at least mnLen entries long if ( mnLen >= nAryLen ) { mpDXAry = new (std::nothrow)sal_Int32[ mnLen ]; if ( mpDXAry ) { sal_Int32 i; for( i = 0; i < nAryLen; i++ ) rIStm.ReadInt32( mpDXAry[ i ] ); // #106172# setup remainder for( ; i < mnLen; i++ ) mpDXAry[ i ] = 0; } } else { mpDXAry = NULL; return; } } else mpDXAry = NULL; if ( aCompat.GetVersion() >= 2 ) // Version 2 { maStr = read_uInt16_lenPrefixed_uInt16s_ToOUString(rIStm); if ( mnIndex + mnLen > maStr.getLength() ) { mnIndex = 0; delete[] mpDXAry, mpDXAry = NULL; } } } IMPL_META_ACTION( StretchText, META_STRETCHTEXT_ACTION ) MetaStretchTextAction::MetaStretchTextAction( const Point& rPt, sal_uInt32 nWidth, const OUString& rStr, sal_Int32 nIndex, sal_Int32 nLen ) : MetaAction ( META_STRETCHTEXT_ACTION ), maPt ( rPt ), maStr ( rStr ), mnWidth ( nWidth ), mnIndex ( nIndex ), mnLen ( nLen ) { } void MetaStretchTextAction::Execute( OutputDevice* pOut ) { pOut->DrawStretchText( maPt, mnWidth, maStr, mnIndex, mnLen ); } MetaAction* MetaStretchTextAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaStretchTextAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaStretchTextAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaStretchTextAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); mnWidth = (sal_uLong)FRound( mnWidth * fabs(fScaleX) ); } bool MetaStretchTextAction::Compare( const MetaAction& rMetaAction ) const { return ( maPt == ((MetaStretchTextAction&)rMetaAction).maPt ) && ( maStr == ((MetaStretchTextAction&)rMetaAction).maStr ) && ( mnWidth == ((MetaStretchTextAction&)rMetaAction).mnWidth ) && ( mnIndex == ((MetaStretchTextAction&)rMetaAction).mnIndex ) && ( mnLen == ((MetaStretchTextAction&)rMetaAction).mnLen ); } void MetaStretchTextAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); WritePair( rOStm, maPt ); rOStm.WriteUniOrByteString( maStr, pData->meActualCharSet ); rOStm.WriteUInt32( mnWidth ); rOStm.WriteUInt16( mnIndex ); rOStm.WriteUInt16( mnLen ); write_uInt16_lenPrefixed_uInt16s_FromOUString(rOStm, maStr); // version 2 } void MetaStretchTextAction::Read( SvStream& rIStm, ImplMetaReadData* pData ) { COMPAT( rIStm ); ReadPair( rIStm, maPt ); maStr = rIStm.ReadUniOrByteString(pData->meActualCharSet); rIStm.ReadUInt32( mnWidth ); sal_uInt16 nTmp(0); rIStm.ReadUInt16(nTmp); mnIndex = nTmp; rIStm.ReadUInt16(nTmp); mnLen = nTmp; if ( aCompat.GetVersion() >= 2 ) // Version 2 maStr = read_uInt16_lenPrefixed_uInt16s_ToOUString(rIStm); } IMPL_META_ACTION( TextRect, META_TEXTRECT_ACTION ) MetaTextRectAction::MetaTextRectAction( const Rectangle& rRect, const OUString& rStr, sal_uInt16 nStyle ) : MetaAction ( META_TEXTRECT_ACTION ), maRect ( rRect ), maStr ( rStr ), mnStyle ( nStyle ) { } void MetaTextRectAction::Execute( OutputDevice* pOut ) { pOut->DrawText( maRect, maStr, mnStyle ); } MetaAction* MetaTextRectAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextRectAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaTextRectAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaTextRectAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaTextRectAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaTextRectAction&)rMetaAction).maRect ) && ( maStr == ((MetaTextRectAction&)rMetaAction).maStr ) && ( mnStyle == ((MetaTextRectAction&)rMetaAction).mnStyle ); } void MetaTextRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); WriteRectangle( rOStm, maRect ); rOStm.WriteUniOrByteString( maStr, pData->meActualCharSet ); rOStm.WriteUInt16( mnStyle ); write_uInt16_lenPrefixed_uInt16s_FromOUString(rOStm, maStr); // version 2 } void MetaTextRectAction::Read( SvStream& rIStm, ImplMetaReadData* pData ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); maStr = rIStm.ReadUniOrByteString(pData->meActualCharSet); rIStm .ReadUInt16( mnStyle ); if ( aCompat.GetVersion() >= 2 ) // Version 2 maStr = read_uInt16_lenPrefixed_uInt16s_ToOUString(rIStm); } IMPL_META_ACTION( TextLine, META_TEXTLINE_ACTION ) MetaTextLineAction::MetaTextLineAction( const Point& rPos, long nWidth, FontStrikeout eStrikeout, FontUnderline eUnderline, FontUnderline eOverline ) : MetaAction ( META_TEXTLINE_ACTION ), maPos ( rPos ), mnWidth ( nWidth ), meStrikeout ( eStrikeout ), meUnderline ( eUnderline ), meOverline ( eOverline ) { } void MetaTextLineAction::Execute( OutputDevice* pOut ) { pOut->DrawTextLine( maPos, mnWidth, meStrikeout, meUnderline, meOverline ); } MetaAction* MetaTextLineAction::Clone() { MetaAction* pClone = (MetaAction*)new MetaTextLineAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaTextLineAction::Move( long nHorzMove, long nVertMove ) { maPos.Move( nHorzMove, nVertMove ); } void MetaTextLineAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPos, fScaleX, fScaleY ); mnWidth = FRound( mnWidth * fabs(fScaleX) ); } bool MetaTextLineAction::Compare( const MetaAction& rMetaAction ) const { return ( maPos == ((MetaTextLineAction&)rMetaAction).maPos ) && ( mnWidth == ((MetaTextLineAction&)rMetaAction).mnWidth ) && ( meStrikeout == ((MetaTextLineAction&)rMetaAction).meStrikeout ) && ( meUnderline == ((MetaTextLineAction&)rMetaAction).meUnderline ) && ( meOverline == ((MetaTextLineAction&)rMetaAction).meOverline ); } void MetaTextLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 2, pData ); //#fdo39428 SvStream no longer supports operator<<(long) WritePair( rOStm, maPos ); rOStm.WriteInt32( sal::static_int_cast(mnWidth) ); rOStm.WriteUInt32( static_cast(meStrikeout) ); rOStm.WriteUInt32( static_cast(meUnderline) ); // new in version 2 rOStm.WriteUInt32( static_cast(meOverline) ); } void MetaTextLineAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); //#fdo39428 SvStream no longer supports operator>>(long&) sal_uInt32 nTemp; sal_Int32 nTemp2; ReadPair( rIStm, maPos ); rIStm.ReadInt32( nTemp2 ); mnWidth = nTemp2; rIStm.ReadUInt32( nTemp ); meStrikeout = (FontStrikeout)nTemp; rIStm.ReadUInt32( nTemp ); meUnderline = (FontUnderline)nTemp; if ( aCompat.GetVersion() >= 2 ) { rIStm.ReadUInt32( nTemp ); meUnderline = (FontUnderline)nTemp; } } IMPL_META_ACTION( Bmp, META_BMP_ACTION ) MetaBmpAction::MetaBmpAction( const Point& rPt, const Bitmap& rBmp ) : MetaAction ( META_BMP_ACTION ), maBmp ( rBmp ), maPt ( rPt ) { } void MetaBmpAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmap( maPt, maBmp ); } MetaAction* MetaBmpAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaBmpAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaBmpAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaBmpAction::Compare( const MetaAction& rMetaAction ) const { return maBmp.IsEqual(((MetaBmpAction&)rMetaAction).maBmp ) && ( maPt == ((MetaBmpAction&)rMetaAction).maPt ); } void MetaBmpAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); WritePair( rOStm, maPt ); } } void MetaBmpAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); ReadPair( rIStm, maPt ); } IMPL_META_ACTION( BmpScale, META_BMPSCALE_ACTION ) MetaBmpScaleAction::MetaBmpScaleAction( const Point& rPt, const Size& rSz, const Bitmap& rBmp ) : MetaAction ( META_BMPSCALE_ACTION ), maBmp ( rBmp ), maPt ( rPt ), maSz ( rSz ) { } void MetaBmpScaleAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmap( maPt, maSz, maBmp ); } MetaAction* MetaBmpScaleAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaBmpScaleAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpScaleAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaBmpScaleAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maPt, maSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maPt = aRectangle.TopLeft(); maSz = aRectangle.GetSize(); } bool MetaBmpScaleAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmp.IsEqual(((MetaBmpScaleAction&)rMetaAction).maBmp )) && ( maPt == ((MetaBmpScaleAction&)rMetaAction).maPt ) && ( maSz == ((MetaBmpScaleAction&)rMetaAction).maSz ); } void MetaBmpScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); WritePair( rOStm, maPt ); WritePair( rOStm, maSz ); } } void MetaBmpScaleAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); ReadPair( rIStm, maPt ); ReadPair( rIStm, maSz ); } IMPL_META_ACTION( BmpScalePart, META_BMPSCALEPART_ACTION ) MetaBmpScalePartAction::MetaBmpScalePartAction( const Point& rDstPt, const Size& rDstSz, const Point& rSrcPt, const Size& rSrcSz, const Bitmap& rBmp ) : MetaAction ( META_BMPSCALEPART_ACTION ), maBmp ( rBmp ), maDstPt ( rDstPt ), maDstSz ( rDstSz ), maSrcPt ( rSrcPt ), maSrcSz ( rSrcSz ) { } void MetaBmpScalePartAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmap( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp ); } MetaAction* MetaBmpScalePartAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaBmpScalePartAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpScalePartAction::Move( long nHorzMove, long nVertMove ) { maDstPt.Move( nHorzMove, nVertMove ); } void MetaBmpScalePartAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maDstPt, maDstSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maDstPt = aRectangle.TopLeft(); maDstSz = aRectangle.GetSize(); } bool MetaBmpScalePartAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmp.IsEqual(((MetaBmpScalePartAction&)rMetaAction).maBmp )) && ( maDstPt == ((MetaBmpScalePartAction&)rMetaAction).maDstPt ) && ( maDstSz == ((MetaBmpScalePartAction&)rMetaAction).maDstSz ) && ( maSrcPt == ((MetaBmpScalePartAction&)rMetaAction).maSrcPt ) && ( maSrcSz == ((MetaBmpScalePartAction&)rMetaAction).maSrcSz ); } void MetaBmpScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); WritePair( rOStm, maDstPt ); WritePair( rOStm, maDstSz ); WritePair( rOStm, maSrcPt ); WritePair( rOStm, maSrcSz ); } } void MetaBmpScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); ReadPair( rIStm, maDstPt ); ReadPair( rIStm, maDstSz ); ReadPair( rIStm, maSrcPt ); ReadPair( rIStm, maSrcSz ); } IMPL_META_ACTION( BmpEx, META_BMPEX_ACTION ) MetaBmpExAction::MetaBmpExAction( const Point& rPt, const BitmapEx& rBmpEx ) : MetaAction ( META_BMPEX_ACTION ), maBmpEx ( rBmpEx ), maPt ( rPt ) { } void MetaBmpExAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmapEx( maPt, maBmpEx ); } MetaAction* MetaBmpExAction::Clone() { MetaBmpExAction* pClone = new MetaBmpExAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpExAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaBmpExAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaBmpExAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmpEx.IsEqual(((MetaBmpExAction&)rMetaAction).maBmpEx )) && ( maPt == ((MetaBmpExAction&)rMetaAction).maPt ); } void MetaBmpExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmpEx.GetBitmap() ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIBBitmapEx(maBmpEx, rOStm); WritePair( rOStm, maPt ); } } void MetaBmpExAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIBBitmapEx(maBmpEx, rIStm); ReadPair( rIStm, maPt ); } IMPL_META_ACTION( BmpExScale, META_BMPEXSCALE_ACTION ) MetaBmpExScaleAction::MetaBmpExScaleAction( const Point& rPt, const Size& rSz, const BitmapEx& rBmpEx ) : MetaAction ( META_BMPEXSCALE_ACTION ), maBmpEx ( rBmpEx ), maPt ( rPt ), maSz ( rSz ) { } void MetaBmpExScaleAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmapEx( maPt, maSz, maBmpEx ); } MetaAction* MetaBmpExScaleAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaBmpExScaleAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpExScaleAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaBmpExScaleAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maPt, maSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maPt = aRectangle.TopLeft(); maSz = aRectangle.GetSize(); } bool MetaBmpExScaleAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmpEx.IsEqual(((MetaBmpExScaleAction&)rMetaAction).maBmpEx )) && ( maPt == ((MetaBmpExScaleAction&)rMetaAction).maPt ) && ( maSz == ((MetaBmpExScaleAction&)rMetaAction).maSz ); } void MetaBmpExScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmpEx.GetBitmap() ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIBBitmapEx(maBmpEx, rOStm); WritePair( rOStm, maPt ); WritePair( rOStm, maSz ); } } void MetaBmpExScaleAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIBBitmapEx(maBmpEx, rIStm); ReadPair( rIStm, maPt ); ReadPair( rIStm, maSz ); } IMPL_META_ACTION( BmpExScalePart, META_BMPEXSCALEPART_ACTION ) MetaBmpExScalePartAction::MetaBmpExScalePartAction( const Point& rDstPt, const Size& rDstSz, const Point& rSrcPt, const Size& rSrcSz, const BitmapEx& rBmpEx ) : MetaAction ( META_BMPEXSCALEPART_ACTION ), maBmpEx ( rBmpEx ), maDstPt ( rDstPt ), maDstSz ( rDstSz ), maSrcPt ( rSrcPt ), maSrcSz ( rSrcSz ) { } void MetaBmpExScalePartAction::Execute( OutputDevice* pOut ) { pOut->DrawBitmapEx( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmpEx ); } MetaAction* MetaBmpExScalePartAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaBmpExScalePartAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaBmpExScalePartAction::Move( long nHorzMove, long nVertMove ) { maDstPt.Move( nHorzMove, nVertMove ); } void MetaBmpExScalePartAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maDstPt, maDstSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maDstPt = aRectangle.TopLeft(); maDstSz = aRectangle.GetSize(); } bool MetaBmpExScalePartAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmpEx.IsEqual(((MetaBmpExScalePartAction&)rMetaAction).maBmpEx )) && ( maDstPt == ((MetaBmpExScalePartAction&)rMetaAction).maDstPt ) && ( maDstSz == ((MetaBmpExScalePartAction&)rMetaAction).maDstSz ) && ( maSrcPt == ((MetaBmpExScalePartAction&)rMetaAction).maSrcPt ) && ( maSrcSz == ((MetaBmpExScalePartAction&)rMetaAction).maSrcSz ); } void MetaBmpExScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmpEx.GetBitmap() ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIBBitmapEx(maBmpEx, rOStm); WritePair( rOStm, maDstPt ); WritePair( rOStm, maDstSz ); WritePair( rOStm, maSrcPt ); WritePair( rOStm, maSrcSz ); } } void MetaBmpExScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIBBitmapEx(maBmpEx, rIStm); ReadPair( rIStm, maDstPt ); ReadPair( rIStm, maDstSz ); ReadPair( rIStm, maSrcPt ); ReadPair( rIStm, maSrcSz ); } IMPL_META_ACTION( Mask, META_MASK_ACTION ) MetaMaskAction::MetaMaskAction( const Point& rPt, const Bitmap& rBmp, const Color& rColor ) : MetaAction ( META_MASK_ACTION ), maBmp ( rBmp ), maColor ( rColor ), maPt ( rPt ) { } void MetaMaskAction::Execute( OutputDevice* pOut ) { pOut->DrawMask( maPt, maBmp, maColor ); } MetaAction* MetaMaskAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaMaskAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaMaskAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaMaskAction::Scale( double fScaleX, double fScaleY ) { ImplScalePoint( maPt, fScaleX, fScaleY ); } bool MetaMaskAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmp.IsEqual(((MetaMaskAction&)rMetaAction).maBmp )) && ( maColor == ((MetaMaskAction&)rMetaAction).maColor ) && ( maPt == ((MetaMaskAction&)rMetaAction).maPt ); } void MetaMaskAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); WritePair( rOStm, maPt ); } } void MetaMaskAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); ReadPair( rIStm, maPt ); } IMPL_META_ACTION( MaskScale, META_MASKSCALE_ACTION ) MetaMaskScaleAction::MetaMaskScaleAction( const Point& rPt, const Size& rSz, const Bitmap& rBmp, const Color& rColor ) : MetaAction ( META_MASKSCALE_ACTION ), maBmp ( rBmp ), maColor ( rColor ), maPt ( rPt ), maSz ( rSz ) { } void MetaMaskScaleAction::Execute( OutputDevice* pOut ) { pOut->DrawMask( maPt, maSz, maBmp, maColor ); } MetaAction* MetaMaskScaleAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaMaskScaleAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaMaskScaleAction::Move( long nHorzMove, long nVertMove ) { maPt.Move( nHorzMove, nVertMove ); } void MetaMaskScaleAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maPt, maSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maPt = aRectangle.TopLeft(); maSz = aRectangle.GetSize(); } bool MetaMaskScaleAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmp.IsEqual(((MetaMaskScaleAction&)rMetaAction).maBmp )) && ( maColor == ((MetaMaskScaleAction&)rMetaAction).maColor ) && ( maPt == ((MetaMaskScaleAction&)rMetaAction).maPt ) && ( maSz == ((MetaMaskScaleAction&)rMetaAction).maSz ); } void MetaMaskScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); WritePair( rOStm, maPt ); WritePair( rOStm, maSz ); } } void MetaMaskScaleAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); ReadPair( rIStm, maPt ); ReadPair( rIStm, maSz ); } IMPL_META_ACTION( MaskScalePart, META_MASKSCALEPART_ACTION ) MetaMaskScalePartAction::MetaMaskScalePartAction( const Point& rDstPt, const Size& rDstSz, const Point& rSrcPt, const Size& rSrcSz, const Bitmap& rBmp, const Color& rColor ) : MetaAction ( META_MASKSCALEPART_ACTION ), maBmp ( rBmp ), maColor ( rColor ), maDstPt ( rDstPt ), maDstSz ( rDstSz ), maSrcPt ( rSrcPt ), maSrcSz ( rSrcSz ) { } void MetaMaskScalePartAction::Execute( OutputDevice* pOut ) { pOut->DrawMask( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp, maColor ); } MetaAction* MetaMaskScalePartAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaMaskScalePartAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaMaskScalePartAction::Move( long nHorzMove, long nVertMove ) { maDstPt.Move( nHorzMove, nVertMove ); } void MetaMaskScalePartAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maDstPt, maDstSz); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maDstPt = aRectangle.TopLeft(); maDstSz = aRectangle.GetSize(); } bool MetaMaskScalePartAction::Compare( const MetaAction& rMetaAction ) const { return ( maBmp.IsEqual(((MetaMaskScalePartAction&)rMetaAction).maBmp )) && ( maColor == ((MetaMaskScalePartAction&)rMetaAction).maColor ) && ( maDstPt == ((MetaMaskScalePartAction&)rMetaAction).maDstPt ) && ( maDstSz == ((MetaMaskScalePartAction&)rMetaAction).maDstSz ) && ( maSrcPt == ((MetaMaskScalePartAction&)rMetaAction).maSrcPt ) && ( maSrcSz == ((MetaMaskScalePartAction&)rMetaAction).maSrcSz ); } void MetaMaskScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { if( !!maBmp ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteDIB(maBmp, rOStm, false, true); maColor.Write( rOStm, true ); WritePair( rOStm, maDstPt ); WritePair( rOStm, maDstSz ); WritePair( rOStm, maSrcPt ); WritePair( rOStm, maSrcSz ); } } void MetaMaskScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadDIB(maBmp, rIStm, true); maColor.Read( rIStm, true ); ReadPair( rIStm, maDstPt ); ReadPair( rIStm, maDstSz ); ReadPair( rIStm, maSrcPt ); ReadPair( rIStm, maSrcSz ); } IMPL_META_ACTION( Gradient, META_GRADIENT_ACTION ) MetaGradientAction::MetaGradientAction( const Rectangle& rRect, const Gradient& rGradient ) : MetaAction ( META_GRADIENT_ACTION ), maRect ( rRect ), maGradient ( rGradient ) { } void MetaGradientAction::Execute( OutputDevice* pOut ) { pOut->DrawGradient( maRect, maGradient ); } MetaAction* MetaGradientAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaGradientAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaGradientAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaGradientAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaGradientAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaGradientAction&)rMetaAction).maRect ) && ( maGradient == ((MetaGradientAction&)rMetaAction).maGradient ); } void MetaGradientAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); WriteGradient( rOStm, maGradient ); } void MetaGradientAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); ReadGradient( rIStm, maGradient ); } MetaGradientExAction::MetaGradientExAction() : MetaAction ( META_GRADIENTEX_ACTION ) { } MetaGradientExAction::MetaGradientExAction( const PolyPolygon& rPolyPoly, const Gradient& rGradient ) : MetaAction ( META_GRADIENTEX_ACTION ), maPolyPoly ( rPolyPoly ), maGradient ( rGradient ) { } MetaGradientExAction::~MetaGradientExAction() { } void MetaGradientExAction::Execute( OutputDevice* pOut ) { if( pOut->GetConnectMetaFile() ) { Duplicate(); pOut->GetConnectMetaFile()->AddAction( this ); } } MetaAction* MetaGradientExAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaGradientExAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaGradientExAction::Move( long nHorzMove, long nVertMove ) { maPolyPoly.Move( nHorzMove, nVertMove ); } void MetaGradientExAction::Scale( double fScaleX, double fScaleY ) { for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ ) ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY ); } bool MetaGradientExAction::Compare( const MetaAction& rMetaAction ) const { return ( maPolyPoly == ((MetaGradientExAction&)rMetaAction).maPolyPoly ) && ( maGradient == ((MetaGradientExAction&)rMetaAction).maGradient ); } void MetaGradientExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); // #i105373# see comment at MetaTransparentAction::Write PolyPolygon aNoCurvePolyPolygon; maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); WritePolyPolygon( rOStm, aNoCurvePolyPolygon ); WriteGradient( rOStm, maGradient ); } void MetaGradientExAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPolyPolygon( rIStm, maPolyPoly ); ReadGradient( rIStm, maGradient ); } IMPL_META_ACTION( Hatch, META_HATCH_ACTION ) MetaHatchAction::MetaHatchAction( const PolyPolygon& rPolyPoly, const Hatch& rHatch ) : MetaAction ( META_HATCH_ACTION ), maPolyPoly ( rPolyPoly ), maHatch ( rHatch ) { } void MetaHatchAction::Execute( OutputDevice* pOut ) { pOut->DrawHatch( maPolyPoly, maHatch ); } MetaAction* MetaHatchAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaHatchAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaHatchAction::Move( long nHorzMove, long nVertMove ) { maPolyPoly.Move( nHorzMove, nVertMove ); } void MetaHatchAction::Scale( double fScaleX, double fScaleY ) { for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ ) ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY ); } bool MetaHatchAction::Compare( const MetaAction& rMetaAction ) const { return ( maPolyPoly == ((MetaHatchAction&)rMetaAction).maPolyPoly ) && ( maHatch == ((MetaHatchAction&)rMetaAction).maHatch ); } void MetaHatchAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); // #i105373# see comment at MetaTransparentAction::Write PolyPolygon aNoCurvePolyPolygon; maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); WritePolyPolygon( rOStm, aNoCurvePolyPolygon ); WriteHatch( rOStm, maHatch ); } void MetaHatchAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPolyPolygon( rIStm, maPolyPoly ); ReadHatch( rIStm, maHatch ); } IMPL_META_ACTION( Wallpaper, META_WALLPAPER_ACTION ) MetaWallpaperAction::MetaWallpaperAction( const Rectangle& rRect, const Wallpaper& rPaper ) : MetaAction ( META_WALLPAPER_ACTION ), maRect ( rRect ), maWallpaper ( rPaper ) { } void MetaWallpaperAction::Execute( OutputDevice* pOut ) { pOut->DrawWallpaper( maRect, maWallpaper ); } MetaAction* MetaWallpaperAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaWallpaperAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaWallpaperAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaWallpaperAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaWallpaperAction::Compare( const MetaAction& rMetaAction ) const { return ( maRect == ((MetaWallpaperAction&)rMetaAction).maRect ) && ( maWallpaper == ((MetaWallpaperAction&)rMetaAction).maWallpaper ); } void MetaWallpaperAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteWallpaper( rOStm, maWallpaper ); } void MetaWallpaperAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadWallpaper( rIStm, maWallpaper ); } IMPL_META_ACTION( ClipRegion, META_CLIPREGION_ACTION ) MetaClipRegionAction::MetaClipRegionAction( const Region& rRegion, bool bClip ) : MetaAction ( META_CLIPREGION_ACTION ), maRegion ( rRegion ), mbClip ( bClip ) { } void MetaClipRegionAction::Execute( OutputDevice* pOut ) { if( mbClip ) pOut->SetClipRegion( maRegion ); else pOut->SetClipRegion(); } MetaAction* MetaClipRegionAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaClipRegionAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaClipRegionAction::Move( long nHorzMove, long nVertMove ) { maRegion.Move( nHorzMove, nVertMove ); } void MetaClipRegionAction::Scale( double fScaleX, double fScaleY ) { maRegion.Scale( fScaleX, fScaleY ); } bool MetaClipRegionAction::Compare( const MetaAction& rMetaAction ) const { return ( maRegion == ((MetaClipRegionAction&)rMetaAction).maRegion ) && ( mbClip == ((MetaClipRegionAction&)rMetaAction).mbClip ); } void MetaClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRegion( rOStm, maRegion ); rOStm.WriteUChar( mbClip ); } void MetaClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRegion( rIStm, maRegion ); rIStm.ReadCharAsBool( mbClip ); } IMPL_META_ACTION( ISectRectClipRegion, META_ISECTRECTCLIPREGION_ACTION ) MetaISectRectClipRegionAction::MetaISectRectClipRegionAction( const Rectangle& rRect ) : MetaAction ( META_ISECTRECTCLIPREGION_ACTION ), maRect ( rRect ) { } void MetaISectRectClipRegionAction::Execute( OutputDevice* pOut ) { pOut->IntersectClipRegion( maRect ); } MetaAction* MetaISectRectClipRegionAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaISectRectClipRegionAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaISectRectClipRegionAction::Move( long nHorzMove, long nVertMove ) { maRect.Move( nHorzMove, nVertMove ); } void MetaISectRectClipRegionAction::Scale( double fScaleX, double fScaleY ) { ImplScaleRect( maRect, fScaleX, fScaleY ); } bool MetaISectRectClipRegionAction::Compare( const MetaAction& rMetaAction ) const { return maRect == ((MetaISectRectClipRegionAction&)rMetaAction).maRect; } void MetaISectRectClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRectangle( rOStm, maRect ); } void MetaISectRectClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRectangle( rIStm, maRect ); } IMPL_META_ACTION( ISectRegionClipRegion, META_ISECTREGIONCLIPREGION_ACTION ) MetaISectRegionClipRegionAction::MetaISectRegionClipRegionAction( const Region& rRegion ) : MetaAction ( META_ISECTREGIONCLIPREGION_ACTION ), maRegion ( rRegion ) { } void MetaISectRegionClipRegionAction::Execute( OutputDevice* pOut ) { pOut->IntersectClipRegion( maRegion ); } MetaAction* MetaISectRegionClipRegionAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaISectRegionClipRegionAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaISectRegionClipRegionAction::Move( long nHorzMove, long nVertMove ) { maRegion.Move( nHorzMove, nVertMove ); } void MetaISectRegionClipRegionAction::Scale( double fScaleX, double fScaleY ) { maRegion.Scale( fScaleX, fScaleY ); } bool MetaISectRegionClipRegionAction::Compare( const MetaAction& rMetaAction ) const { return maRegion == ((MetaISectRegionClipRegionAction&)rMetaAction).maRegion; } void MetaISectRegionClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteRegion( rOStm, maRegion ); } void MetaISectRegionClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadRegion( rIStm, maRegion ); } IMPL_META_ACTION( MoveClipRegion, META_MOVECLIPREGION_ACTION ) MetaMoveClipRegionAction::MetaMoveClipRegionAction( long nHorzMove, long nVertMove ) : MetaAction ( META_MOVECLIPREGION_ACTION ), mnHorzMove ( nHorzMove ), mnVertMove ( nVertMove ) { } void MetaMoveClipRegionAction::Execute( OutputDevice* pOut ) { pOut->MoveClipRegion( mnHorzMove, mnVertMove ); } MetaAction* MetaMoveClipRegionAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaMoveClipRegionAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaMoveClipRegionAction::Scale( double fScaleX, double fScaleY ) { mnHorzMove = FRound( mnHorzMove * fScaleX ); mnVertMove = FRound( mnVertMove * fScaleY ); } bool MetaMoveClipRegionAction::Compare( const MetaAction& rMetaAction ) const { return ( mnHorzMove == ((MetaMoveClipRegionAction&)rMetaAction).mnHorzMove ) && ( mnVertMove == ((MetaMoveClipRegionAction&)rMetaAction).mnVertMove ); } void MetaMoveClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); //#fdo39428 SvStream no longer supports operator<<(long) rOStm.WriteInt32( sal::static_int_cast(mnHorzMove) ).WriteInt32( sal::static_int_cast(mnVertMove) ); } void MetaMoveClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); //#fdo39428 SvStream no longer supports operator>>(long&) sal_Int32 nTmpHM(0), nTmpVM(0); rIStm.ReadInt32( nTmpHM ).ReadInt32( nTmpVM ); mnHorzMove = nTmpHM; mnVertMove = nTmpVM; } IMPL_META_ACTION( LineColor, META_LINECOLOR_ACTION ) MetaLineColorAction::MetaLineColorAction( const Color& rColor, bool bSet ) : MetaAction ( META_LINECOLOR_ACTION ), maColor ( rColor ), mbSet ( bSet ) { } void MetaLineColorAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetLineColor( maColor ); else pOut->SetLineColor(); } MetaAction* MetaLineColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaLineColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaLineColorAction::Compare( const MetaAction& rMetaAction ) const { return ( maColor == ((MetaLineColorAction&)rMetaAction).maColor ) && ( mbSet == ((MetaLineColorAction&)rMetaAction).mbSet ); } void MetaLineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); rOStm.WriteUChar( mbSet ); } void MetaLineColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); rIStm.ReadCharAsBool( mbSet ); } IMPL_META_ACTION( FillColor, META_FILLCOLOR_ACTION ) MetaFillColorAction::MetaFillColorAction( const Color& rColor, bool bSet ) : MetaAction ( META_FILLCOLOR_ACTION ), maColor ( rColor ), mbSet ( bSet ) { } void MetaFillColorAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetFillColor( maColor ); else pOut->SetFillColor(); } MetaAction* MetaFillColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaFillColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaFillColorAction::Compare( const MetaAction& rMetaAction ) const { return ( maColor == ((MetaFillColorAction&)rMetaAction).maColor ) && ( mbSet == ((MetaFillColorAction&)rMetaAction).mbSet ); } void MetaFillColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); rOStm.WriteUChar( mbSet ); } void MetaFillColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); rIStm.ReadCharAsBool( mbSet ); } IMPL_META_ACTION( TextColor, META_TEXTCOLOR_ACTION ) MetaTextColorAction::MetaTextColorAction( const Color& rColor ) : MetaAction ( META_TEXTCOLOR_ACTION ), maColor ( rColor ) { } void MetaTextColorAction::Execute( OutputDevice* pOut ) { pOut->SetTextColor( maColor ); } MetaAction* MetaTextColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaTextColorAction::Compare( const MetaAction& rMetaAction ) const { return maColor == ((MetaTextColorAction&)rMetaAction).maColor; } void MetaTextColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); } void MetaTextColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); } IMPL_META_ACTION( TextFillColor, META_TEXTFILLCOLOR_ACTION ) MetaTextFillColorAction::MetaTextFillColorAction( const Color& rColor, bool bSet ) : MetaAction ( META_TEXTFILLCOLOR_ACTION ), maColor ( rColor ), mbSet ( bSet ) { } void MetaTextFillColorAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetTextFillColor( maColor ); else pOut->SetTextFillColor(); } MetaAction* MetaTextFillColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextFillColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaTextFillColorAction::Compare( const MetaAction& rMetaAction ) const { return ( maColor == ((MetaTextFillColorAction&)rMetaAction).maColor ) && ( mbSet == ((MetaTextFillColorAction&)rMetaAction).mbSet ); } void MetaTextFillColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); rOStm.WriteUChar( mbSet ); } void MetaTextFillColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); rIStm.ReadCharAsBool( mbSet ); } IMPL_META_ACTION( TextLineColor, META_TEXTLINECOLOR_ACTION ) MetaTextLineColorAction::MetaTextLineColorAction( const Color& rColor, bool bSet ) : MetaAction ( META_TEXTLINECOLOR_ACTION ), maColor ( rColor ), mbSet ( bSet ) { } void MetaTextLineColorAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetTextLineColor( maColor ); else pOut->SetTextLineColor(); } MetaAction* MetaTextLineColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextLineColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaTextLineColorAction::Compare( const MetaAction& rMetaAction ) const { return ( maColor == ((MetaTextLineColorAction&)rMetaAction).maColor ) && ( mbSet == ((MetaTextLineColorAction&)rMetaAction).mbSet ); } void MetaTextLineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); rOStm.WriteUChar( mbSet ); } void MetaTextLineColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); rIStm.ReadCharAsBool( mbSet ); } IMPL_META_ACTION( OverlineColor, META_OVERLINECOLOR_ACTION ) MetaOverlineColorAction::MetaOverlineColorAction( const Color& rColor, bool bSet ) : MetaAction ( META_OVERLINECOLOR_ACTION ), maColor ( rColor ), mbSet ( bSet ) { } void MetaOverlineColorAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetOverlineColor( maColor ); else pOut->SetOverlineColor(); } MetaAction* MetaOverlineColorAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaOverlineColorAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaOverlineColorAction::Compare( const MetaAction& rMetaAction ) const { return ( maColor == ((MetaOverlineColorAction&)rMetaAction).maColor ) && ( mbSet == ((MetaOverlineColorAction&)rMetaAction).mbSet ); } void MetaOverlineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maColor.Write( rOStm, true ); rOStm.WriteUChar( mbSet ); } void MetaOverlineColorAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maColor.Read( rIStm, true ); rIStm.ReadCharAsBool( mbSet ); } IMPL_META_ACTION( TextAlign, META_TEXTALIGN_ACTION ) MetaTextAlignAction::MetaTextAlignAction( TextAlign aAlign ) : MetaAction ( META_TEXTALIGN_ACTION ), maAlign ( aAlign ) { } void MetaTextAlignAction::Execute( OutputDevice* pOut ) { pOut->SetTextAlign( maAlign ); } MetaAction* MetaTextAlignAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextAlignAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaTextAlignAction::Compare( const MetaAction& rMetaAction ) const { return maAlign == ((MetaTextAlignAction&)rMetaAction).maAlign; } void MetaTextAlignAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); rOStm.WriteUInt16( (sal_uInt16) maAlign ); } void MetaTextAlignAction::Read( SvStream& rIStm, ImplMetaReadData* ) { sal_uInt16 nTmp16; COMPAT( rIStm ); rIStm.ReadUInt16( nTmp16 ); maAlign = (TextAlign) nTmp16; } IMPL_META_ACTION( MapMode, META_MAPMODE_ACTION ) MetaMapModeAction::MetaMapModeAction( const MapMode& rMapMode ) : MetaAction ( META_MAPMODE_ACTION ), maMapMode ( rMapMode ) { } void MetaMapModeAction::Execute( OutputDevice* pOut ) { pOut->SetMapMode( maMapMode ); } MetaAction* MetaMapModeAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaMapModeAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaMapModeAction::Scale( double fScaleX, double fScaleY ) { Point aPoint( maMapMode.GetOrigin() ); ImplScalePoint( aPoint, fScaleX, fScaleY ); maMapMode.SetOrigin( aPoint ); } bool MetaMapModeAction::Compare( const MetaAction& rMetaAction ) const { return maMapMode == ((MetaMapModeAction&)rMetaAction).maMapMode; } void MetaMapModeAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteMapMode( rOStm, maMapMode ); } void MetaMapModeAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadMapMode( rIStm, maMapMode ); } IMPL_META_ACTION( Font, META_FONT_ACTION ) MetaFontAction::MetaFontAction( const Font& rFont ) : MetaAction ( META_FONT_ACTION ), maFont ( rFont ) { // #96876: because RTL_TEXTENCODING_SYMBOL is often set at the StarSymbol font, // we change the textencoding to RTL_TEXTENCODING_UNICODE here, which seems // to be the right way; changing the textencoding at other sources // is too dangerous at the moment if ( IsStarSymbol( maFont.GetName() ) && ( maFont.GetCharSet() != RTL_TEXTENCODING_UNICODE ) ) { maFont.SetCharSet( RTL_TEXTENCODING_UNICODE ); } } void MetaFontAction::Execute( OutputDevice* pOut ) { pOut->SetFont( maFont ); } MetaAction* MetaFontAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaFontAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaFontAction::Scale( double fScaleX, double fScaleY ) { const Size aSize( FRound(maFont.GetSize().Width() * fabs(fScaleX)), FRound(maFont.GetSize().Height() * fabs(fScaleY))); maFont.SetSize( aSize ); } bool MetaFontAction::Compare( const MetaAction& rMetaAction ) const { return maFont == ((MetaFontAction&)rMetaAction).maFont; } void MetaFontAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteFont( rOStm, maFont ); pData->meActualCharSet = maFont.GetCharSet(); if ( pData->meActualCharSet == RTL_TEXTENCODING_DONTKNOW ) pData->meActualCharSet = osl_getThreadTextEncoding(); } void MetaFontAction::Read( SvStream& rIStm, ImplMetaReadData* pData ) { COMPAT( rIStm ); ReadFont( rIStm, maFont ); pData->meActualCharSet = maFont.GetCharSet(); if ( pData->meActualCharSet == RTL_TEXTENCODING_DONTKNOW ) pData->meActualCharSet = osl_getThreadTextEncoding(); } IMPL_META_ACTION( Push, META_PUSH_ACTION ) MetaPushAction::MetaPushAction( sal_uInt16 nFlags ) : MetaAction ( META_PUSH_ACTION ), mnFlags ( nFlags ) { } void MetaPushAction::Execute( OutputDevice* pOut ) { pOut->Push( mnFlags ); } MetaAction* MetaPushAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPushAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaPushAction::Compare( const MetaAction& rMetaAction ) const { return mnFlags == ((MetaPushAction&)rMetaAction).mnFlags; } void MetaPushAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); rOStm.WriteUInt16( mnFlags ); } void MetaPushAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); rIStm.ReadUInt16( mnFlags ); } IMPL_META_ACTION( Pop, META_POP_ACTION ) void MetaPopAction::Execute( OutputDevice* pOut ) { pOut->Pop(); } MetaAction* MetaPopAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaPopAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaPopAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); } void MetaPopAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); } IMPL_META_ACTION( RasterOp, META_RASTEROP_ACTION ) MetaRasterOpAction::MetaRasterOpAction( RasterOp eRasterOp ) : MetaAction ( META_RASTEROP_ACTION ), meRasterOp ( eRasterOp ) { } void MetaRasterOpAction::Execute( OutputDevice* pOut ) { pOut->SetRasterOp( meRasterOp ); } MetaAction* MetaRasterOpAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaRasterOpAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaRasterOpAction::Compare( const MetaAction& rMetaAction ) const { return meRasterOp == ((MetaRasterOpAction&)rMetaAction).meRasterOp; } void MetaRasterOpAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); rOStm.WriteUInt16( (sal_uInt16) meRasterOp ); } void MetaRasterOpAction::Read( SvStream& rIStm, ImplMetaReadData* ) { sal_uInt16 nTmp16; COMPAT( rIStm ); rIStm.ReadUInt16( nTmp16 ); meRasterOp = (RasterOp) nTmp16; } IMPL_META_ACTION( Transparent, META_TRANSPARENT_ACTION ) MetaTransparentAction::MetaTransparentAction( const PolyPolygon& rPolyPoly, sal_uInt16 nTransPercent ) : MetaAction ( META_TRANSPARENT_ACTION ), maPolyPoly ( rPolyPoly ), mnTransPercent ( nTransPercent ) { } void MetaTransparentAction::Execute( OutputDevice* pOut ) { pOut->DrawTransparent( maPolyPoly, mnTransPercent ); } MetaAction* MetaTransparentAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTransparentAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaTransparentAction::Move( long nHorzMove, long nVertMove ) { maPolyPoly.Move( nHorzMove, nVertMove ); } void MetaTransparentAction::Scale( double fScaleX, double fScaleY ) { for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ ) ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY ); } bool MetaTransparentAction::Compare( const MetaAction& rMetaAction ) const { return ( maPolyPoly == ((MetaTransparentAction&)rMetaAction).maPolyPoly ) && ( mnTransPercent == ((MetaTransparentAction&)rMetaAction).mnTransPercent ); } void MetaTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); // #i105373# The PolyPolygon in this action may be a curve; this // was ignored until now what is an error. To make older office // versions work with MetaFiles, i opt for applying AdaptiveSubdivide // to the PolyPoylgon. // The alternative would be to really write the curve information // like in MetaPolyPolygonAction::Write (where someone extended it // correctly, but not here :-( ). // The golden solution would be to combine both, but i think it's // not necessary; a good subdivision will be sufficient. PolyPolygon aNoCurvePolyPolygon; maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); WritePolyPolygon( rOStm, aNoCurvePolyPolygon ); rOStm.WriteUInt16( mnTransPercent ); } void MetaTransparentAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPolyPolygon( rIStm, maPolyPoly ); rIStm.ReadUInt16( mnTransPercent ); } IMPL_META_ACTION( FloatTransparent, META_FLOATTRANSPARENT_ACTION ) MetaFloatTransparentAction::MetaFloatTransparentAction( const GDIMetaFile& rMtf, const Point& rPos, const Size& rSize, const Gradient& rGradient ) : MetaAction ( META_FLOATTRANSPARENT_ACTION ), maMtf ( rMtf ), maPoint ( rPos ), maSize ( rSize ), maGradient ( rGradient ) { } void MetaFloatTransparentAction::Execute( OutputDevice* pOut ) { pOut->DrawTransparent( maMtf, maPoint, maSize, maGradient ); } MetaAction* MetaFloatTransparentAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaFloatTransparentAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaFloatTransparentAction::Move( long nHorzMove, long nVertMove ) { maPoint.Move( nHorzMove, nVertMove ); } void MetaFloatTransparentAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maPoint, maSize); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maPoint = aRectangle.TopLeft(); maSize = aRectangle.GetSize(); } bool MetaFloatTransparentAction::Compare( const MetaAction& rMetaAction ) const { return ( maMtf == ((MetaFloatTransparentAction&)rMetaAction).maMtf ) && ( maPoint == ((MetaFloatTransparentAction&)rMetaAction).maPoint ) && ( maSize == ((MetaFloatTransparentAction&)rMetaAction).maSize ) && ( maGradient == ((MetaFloatTransparentAction&)rMetaAction).maGradient ); } void MetaFloatTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); maMtf.Write( rOStm ); WritePair( rOStm, maPoint ); WritePair( rOStm, maSize ); WriteGradient( rOStm, maGradient ); } void MetaFloatTransparentAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadGDIMetaFile( rIStm, maMtf ); ReadPair( rIStm, maPoint ); ReadPair( rIStm, maSize ); ReadGradient( rIStm, maGradient ); } IMPL_META_ACTION( EPS, META_EPS_ACTION ) MetaEPSAction::MetaEPSAction( const Point& rPoint, const Size& rSize, const GfxLink& rGfxLink, const GDIMetaFile& rSubst ) : MetaAction ( META_EPS_ACTION ), maGfxLink ( rGfxLink ), maSubst ( rSubst ), maPoint ( rPoint ), maSize ( rSize ) { } void MetaEPSAction::Execute( OutputDevice* pOut ) { pOut->DrawEPS( maPoint, maSize, maGfxLink, &maSubst ); } MetaAction* MetaEPSAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaEPSAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaEPSAction::Move( long nHorzMove, long nVertMove ) { maPoint.Move( nHorzMove, nVertMove ); } void MetaEPSAction::Scale( double fScaleX, double fScaleY ) { Rectangle aRectangle(maPoint, maSize); ImplScaleRect( aRectangle, fScaleX, fScaleY ); maPoint = aRectangle.TopLeft(); maSize = aRectangle.GetSize(); } bool MetaEPSAction::Compare( const MetaAction& rMetaAction ) const { return ( maGfxLink.IsEqual(((MetaEPSAction&)rMetaAction).maGfxLink )) && ( maSubst == ((MetaEPSAction&)rMetaAction).maSubst ) && ( maPoint == ((MetaEPSAction&)rMetaAction).maPoint ) && ( maSize == ((MetaEPSAction&)rMetaAction).maSize ); } void MetaEPSAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WriteGfxLink( rOStm, maGfxLink ); WritePair( rOStm, maPoint ); WritePair( rOStm, maSize ); maSubst.Write( rOStm ); } void MetaEPSAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadGfxLink( rIStm, maGfxLink ); ReadPair( rIStm, maPoint ); ReadPair( rIStm, maSize ); ReadGDIMetaFile( rIStm, maSubst ); } IMPL_META_ACTION( RefPoint, META_REFPOINT_ACTION ) MetaRefPointAction::MetaRefPointAction( const Point& rRefPoint, bool bSet ) : MetaAction ( META_REFPOINT_ACTION ), maRefPoint ( rRefPoint ), mbSet ( bSet ) { } void MetaRefPointAction::Execute( OutputDevice* pOut ) { if( mbSet ) pOut->SetRefPoint( maRefPoint ); else pOut->SetRefPoint(); } MetaAction* MetaRefPointAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaRefPointAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaRefPointAction::Compare( const MetaAction& rMetaAction ) const { return ( maRefPoint == ((MetaRefPointAction&)rMetaAction).maRefPoint ) && ( mbSet == ((MetaRefPointAction&)rMetaAction).mbSet ); } void MetaRefPointAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); WritePair( rOStm, maRefPoint ); rOStm.WriteUChar( mbSet ); } void MetaRefPointAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); ReadPair( rIStm, maRefPoint ).ReadCharAsBool( mbSet ); } MetaCommentAction::MetaCommentAction( sal_Int32 nValue ) : MetaAction ( META_COMMENT_ACTION ), mnValue ( nValue ) { ImplInitDynamicData( NULL, 0UL ); } MetaCommentAction::MetaCommentAction( const MetaCommentAction& rAct ) : MetaAction ( META_COMMENT_ACTION ), maComment ( rAct.maComment ), mnValue ( rAct.mnValue ) { ImplInitDynamicData( rAct.mpData, rAct.mnDataSize ); } MetaCommentAction::MetaCommentAction( const OString& rComment, sal_Int32 nValue, const sal_uInt8* pData, sal_uInt32 nDataSize ) : MetaAction ( META_COMMENT_ACTION ), maComment ( rComment ), mnValue ( nValue ) { ImplInitDynamicData( pData, nDataSize ); } MetaCommentAction::~MetaCommentAction() { if ( mpData ) delete[] mpData; } void MetaCommentAction::ImplInitDynamicData( const sal_uInt8* pData, sal_uInt32 nDataSize ) { if ( nDataSize && pData ) { mnDataSize = nDataSize, mpData = new sal_uInt8[ mnDataSize ]; memcpy( mpData, pData, mnDataSize ); } else { mnDataSize = 0; mpData = NULL; } } void MetaCommentAction::Execute( OutputDevice* pOut ) { if ( pOut->GetConnectMetaFile() ) { Duplicate(); pOut->GetConnectMetaFile()->AddAction( this ); } } MetaAction* MetaCommentAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaCommentAction( *this ); pClone->ResetRefCount(); return pClone; } void MetaCommentAction::Move( long nXMove, long nYMove ) { if ( nXMove || nYMove ) { if ( mnDataSize && mpData ) { bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN"); if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" ) { SvMemoryStream aMemStm( (void*)mpData, mnDataSize, STREAM_READ ); SvMemoryStream aDest; if ( bPathStroke ) { SvtGraphicStroke aStroke; ReadSvtGraphicStroke( aMemStm, aStroke ); Polygon aPath; aStroke.getPath( aPath ); aPath.Move( nXMove, nYMove ); aStroke.setPath( aPath ); PolyPolygon aStartArrow; aStroke.getStartArrow(aStartArrow); aStartArrow.Move(nXMove, nYMove); aStroke.setStartArrow(aStartArrow); PolyPolygon aEndArrow; aStroke.getEndArrow(aEndArrow); aEndArrow.Move(nXMove, nYMove); aStroke.setEndArrow(aEndArrow); WriteSvtGraphicStroke( aDest, aStroke ); } else { SvtGraphicFill aFill; ReadSvtGraphicFill( aMemStm, aFill ); PolyPolygon aPath; aFill.getPath( aPath ); aPath.Move( nXMove, nYMove ); aFill.setPath( aPath ); WriteSvtGraphicFill( aDest, aFill ); } delete[] mpData; ImplInitDynamicData( static_cast( aDest.GetData() ), aDest.Tell() ); } } } } // SJ: 25.07.06 #i56656# we are not able to mirrorcertain kind of // comments properly, especially the XPATHSTROKE and XPATHFILL lead to // problems, so it is better to remove these comments when mirroring // FIXME: fake comment to apply the next hunk in the right location void MetaCommentAction::Scale( double fXScale, double fYScale ) { if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) ) { if ( mnDataSize && mpData ) { bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN"); if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" ) { SvMemoryStream aMemStm( (void*)mpData, mnDataSize, STREAM_READ ); SvMemoryStream aDest; if ( bPathStroke ) { SvtGraphicStroke aStroke; ReadSvtGraphicStroke( aMemStm, aStroke ); aStroke.scale( fXScale, fYScale ); WriteSvtGraphicStroke( aDest, aStroke ); } else { SvtGraphicFill aFill; ReadSvtGraphicFill( aMemStm, aFill ); PolyPolygon aPath; aFill.getPath( aPath ); aPath.Scale( fXScale, fYScale ); aFill.setPath( aPath ); WriteSvtGraphicFill( aDest, aFill ); } delete[] mpData; ImplInitDynamicData( static_cast( aDest.GetData() ), aDest.Tell() ); } else if( maComment == "EMF_PLUS_HEADER_INFO" ){ SvMemoryStream aMemStm( (void*)mpData, mnDataSize, STREAM_READ ); SvMemoryStream aDest; sal_Int32 nLeft, nRight, nTop, nBottom; sal_Int32 nPixX, nPixY, nMillX, nMillY; float m11, m12, m21, m22, mdx, mdy; // read data aMemStm.ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom ); aMemStm.ReadInt32( nPixX ).ReadInt32( nPixY ).ReadInt32( nMillX ).ReadInt32( nMillY ); aMemStm.ReadFloat( m11 ).ReadFloat( m12 ).ReadFloat( m21 ).ReadFloat( m22 ).ReadFloat( mdx ).ReadFloat( mdy ); // add scale to the transformation m11 *= fXScale; m12 *= fXScale; m22 *= fYScale; m21 *= fYScale; // prepare new data aDest.WriteInt32( nLeft ).WriteInt32( nTop ).WriteInt32( nRight ).WriteInt32( nBottom ); aDest.WriteInt32( nPixX ).WriteInt32( nPixY ).WriteInt32( nMillX ).WriteInt32( nMillY ); aDest.WriteFloat( m11 ).WriteFloat( m12 ).WriteFloat( m21 ).WriteFloat( m22 ).WriteFloat( mdx ).WriteFloat( mdy ); // save them ImplInitDynamicData( static_cast( aDest.GetData() ), aDest.Tell() ); } } } } bool MetaCommentAction::Compare( const MetaAction& rMetaAction ) const { return ( maComment == ((MetaCommentAction&)rMetaAction).maComment ) && ( mnValue == ((MetaCommentAction&)rMetaAction).mnValue ) && ( mnDataSize == ((MetaCommentAction&)rMetaAction).mnDataSize ) && ( memcmp( mpData, ((MetaCommentAction&)rMetaAction).mpData, mnDataSize ) == 0 ); } void MetaCommentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); write_uInt16_lenPrefixed_uInt8s_FromOString(rOStm, maComment); rOStm.WriteInt32( mnValue ).WriteUInt32( mnDataSize ); if ( mnDataSize ) rOStm.Write( mpData, mnDataSize ); } void MetaCommentAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); maComment = read_uInt16_lenPrefixed_uInt8s_ToOString(rIStm); rIStm.ReadInt32( mnValue ).ReadUInt32( mnDataSize ); SAL_INFO("vcl.gdi", "MetaCommentAction::Read " << maComment); delete[] mpData; if( mnDataSize ) { mpData = new sal_uInt8[ mnDataSize ]; rIStm.Read( mpData, mnDataSize ); } else mpData = NULL; } IMPL_META_ACTION( LayoutMode, META_LAYOUTMODE_ACTION ) MetaLayoutModeAction::MetaLayoutModeAction( sal_uInt32 nLayoutMode ) : MetaAction ( META_LAYOUTMODE_ACTION ), mnLayoutMode( nLayoutMode ) { } void MetaLayoutModeAction::Execute( OutputDevice* pOut ) { pOut->SetLayoutMode( mnLayoutMode ); } MetaAction* MetaLayoutModeAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaLayoutModeAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaLayoutModeAction::Compare( const MetaAction& rMetaAction ) const { return mnLayoutMode == ((MetaLayoutModeAction&)rMetaAction).mnLayoutMode; } void MetaLayoutModeAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); rOStm.WriteUInt32( mnLayoutMode ); } void MetaLayoutModeAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); rIStm.ReadUInt32( mnLayoutMode ); } IMPL_META_ACTION( TextLanguage, META_TEXTLANGUAGE_ACTION ) MetaTextLanguageAction::MetaTextLanguageAction( LanguageType eTextLanguage ) : MetaAction ( META_TEXTLANGUAGE_ACTION ), meTextLanguage( eTextLanguage ) { } void MetaTextLanguageAction::Execute( OutputDevice* pOut ) { pOut->SetDigitLanguage( meTextLanguage ); } MetaAction* MetaTextLanguageAction::Clone() { MetaAction* pClone = (MetaAction*) new MetaTextLanguageAction( *this ); pClone->ResetRefCount(); return pClone; } bool MetaTextLanguageAction::Compare( const MetaAction& rMetaAction ) const { return meTextLanguage == ((MetaTextLanguageAction&)rMetaAction).meTextLanguage; } void MetaTextLanguageAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); rOStm.WriteUInt16( meTextLanguage ); } void MetaTextLanguageAction::Read( SvStream& rIStm, ImplMetaReadData* ) { COMPAT( rIStm ); rIStm.ReadUInt16( meTextLanguage ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */