xref: /AOO41X/main/vcl/source/gdi/metaact.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #define ENABLE_BYTESTRING_STREAM_OPERATORS
28 
29 #include <algorithm>
30 #include <string.h>
31 #include <tools/stream.hxx>
32 #include <tools/vcompat.hxx>
33 #include <vcl/outdev.hxx>
34 #include <vcl/salbtype.hxx>
35 #include <vcl/metaact.hxx>
36 #include <vcl/graphictools.hxx>
37 //#include <svgio/svgreader/svgreader.hxx>
38 #include <basegfx/matrix/b2dhommatrixtools.hxx>
39 
40 // ========================================================================
41 
42 inline void ImplScalePoint( Point& rPt, double fScaleX, double fScaleY )
43 {
44     rPt.X() = FRound( fScaleX * rPt.X() );
45     rPt.Y() = FRound( fScaleY * rPt.Y() );
46 }
47 
48 // ------------------------------------------------------------------------
49 
50 inline void ImplScaleRect( Rectangle& rRect, double fScaleX, double fScaleY )
51 {
52     Point aTL( rRect.TopLeft() );
53     Point aBR( rRect.BottomRight() );
54 
55     ImplScalePoint( aTL, fScaleX, fScaleY );
56     ImplScalePoint( aBR, fScaleX, fScaleY );
57 
58     rRect = Rectangle( aTL, aBR );
59     rRect.Justify();
60 }
61 
62 // ------------------------------------------------------------------------
63 
64 inline void ImplScalePoly( Polygon& rPoly, double fScaleX, double fScaleY )
65 {
66     for( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
67         ImplScalePoint( rPoly[ i ], fScaleX, fScaleY );
68 }
69 
70 // ------------------------------------------------------------------------
71 
72 inline void ImplScaleLineInfo( LineInfo& rLineInfo, double fScaleX, double fScaleY )
73 {
74     if( !rLineInfo.IsDefault() )
75     {
76         const double fScale = ( fabs(fScaleX) + fabs(fScaleY) ) * 0.5;
77 
78         rLineInfo.SetWidth( FRound( fScale * rLineInfo.GetWidth() ) );
79         rLineInfo.SetDashLen( FRound( fScale * rLineInfo.GetDashLen() ) );
80         rLineInfo.SetDotLen( FRound( fScale * rLineInfo.GetDotLen() ) );
81         rLineInfo.SetDistance( FRound( fScale * rLineInfo.GetDistance() ) );
82     }
83 }
84 
85 // ========================================================================
86 
87 #define COMPAT( _def_rIStm ) VersionCompat aCompat( ( _def_rIStm ), STREAM_READ );
88 #define COMPAT_VERSION() aCompat.GetVersion()
89 #define WRITE_BASE_COMPAT( _def_rOStm, _def_nVer, _pWriteData )         \
90     MetaAction::Write( ( _def_rOStm ), _pWriteData );                   \
91     VersionCompat aCompat( ( _def_rOStm ), STREAM_WRITE, ( _def_nVer ) );
92 
93 // ========================================================================
94 
95 MetaAction::MetaAction() :
96     mnRefCount( 1 ),
97     mnType( META_NULL_ACTION )
98 {
99 }
100 
101 // ------------------------------------------------------------------------
102 
103 MetaAction::MetaAction( sal_uInt16 nType ) :
104     mnRefCount( 1 ),
105     mnType( nType )
106 {
107 }
108 
109 // ------------------------------------------------------------------------
110 
111 MetaAction::~MetaAction()
112 {
113 }
114 
115 // ------------------------------------------------------------------------
116 
117 void MetaAction::Execute( OutputDevice* )
118 {
119 }
120 
121 // ------------------------------------------------------------------------
122 
123 MetaAction* MetaAction::Clone()
124 {
125     return new MetaAction;
126 }
127 
128 // ------------------------------------------------------------------------
129 
130 void MetaAction::Move( long, long )
131 {
132 }
133 
134 // ------------------------------------------------------------------------
135 
136 void MetaAction::Scale( double, double )
137 {
138 }
139 
140 // ------------------------------------------------------------------------
141 
142 sal_Bool MetaAction::Compare( const MetaAction& ) const
143 {
144     return sal_True;
145 }
146 
147 // ------------------------------------------------------------------------
148 
149 sal_Bool MetaAction::IsEqual( const MetaAction& rMetaAction ) const
150 {
151     if ( mnType != rMetaAction.mnType )
152         return sal_False;
153     else
154         return Compare( rMetaAction );
155 }
156 
157 // ------------------------------------------------------------------------
158 
159 void MetaAction::Write( SvStream& rOStm, ImplMetaWriteData* )
160 {
161     rOStm << mnType;
162 }
163 
164 // ------------------------------------------------------------------------
165 
166 void MetaAction::Read( SvStream& rIStm, ImplMetaReadData* )
167 {
168     rIStm >> mnType;
169 }
170 
171 // ------------------------------------------------------------------------
172 
173 MetaAction* MetaAction::ReadMetaAction( SvStream& rIStm, ImplMetaReadData* pData )
174 {
175     MetaAction* pAction = NULL;
176     sal_uInt16      nType;
177 
178     rIStm >> nType;
179 
180     switch( nType )
181     {
182         case( META_NULL_ACTION ): pAction = new MetaAction; break;
183         case( META_PIXEL_ACTION ): pAction = new MetaPixelAction; break;
184         case( META_POINT_ACTION ): pAction = new MetaPointAction; break;
185         case( META_LINE_ACTION ): pAction = new MetaLineAction; break;
186         case( META_RECT_ACTION ): pAction = new MetaRectAction; break;
187         case( META_ROUNDRECT_ACTION ): pAction = new MetaRoundRectAction; break;
188         case( META_ELLIPSE_ACTION ): pAction = new MetaEllipseAction; break;
189         case( META_ARC_ACTION ): pAction = new MetaArcAction; break;
190         case( META_PIE_ACTION ): pAction = new MetaPieAction; break;
191         case( META_CHORD_ACTION ): pAction = new MetaChordAction; break;
192         case( META_POLYLINE_ACTION ): pAction = new MetaPolyLineAction; break;
193         case( META_POLYGON_ACTION ): pAction = new MetaPolygonAction; break;
194         case( META_POLYPOLYGON_ACTION ): pAction = new MetaPolyPolygonAction; break;
195         case( META_TEXT_ACTION ): pAction = new MetaTextAction; break;
196         case( META_TEXTARRAY_ACTION ): pAction = new MetaTextArrayAction; break;
197         case( META_STRETCHTEXT_ACTION ): pAction = new MetaStretchTextAction; break;
198         case( META_TEXTRECT_ACTION ): pAction = new MetaTextRectAction; break;
199         case( META_TEXTLINE_ACTION ): pAction = new MetaTextLineAction; break;
200         case( META_BMP_ACTION ): pAction = new MetaBmpAction; break;
201         case( META_BMPSCALE_ACTION ): pAction = new MetaBmpScaleAction; break;
202         case( META_BMPSCALEPART_ACTION ): pAction = new MetaBmpScalePartAction; break;
203         case( META_BMPEX_ACTION ): pAction = new MetaBmpExAction; break;
204         case( META_BMPEXSCALE_ACTION ): pAction = new MetaBmpExScaleAction; break;
205         case( META_BMPEXSCALEPART_ACTION ): pAction = new MetaBmpExScalePartAction; break;
206         case( META_MASK_ACTION ): pAction = new MetaMaskAction; break;
207         case( META_MASKSCALE_ACTION ): pAction = new MetaMaskScaleAction; break;
208         case( META_MASKSCALEPART_ACTION ): pAction = new MetaMaskScalePartAction; break;
209         case( META_GRADIENT_ACTION ): pAction = new MetaGradientAction; break;
210         case( META_GRADIENTEX_ACTION ): pAction = new MetaGradientExAction; break;
211         case( META_HATCH_ACTION ): pAction = new MetaHatchAction; break;
212         case( META_WALLPAPER_ACTION ): pAction = new MetaWallpaperAction; break;
213         case( META_CLIPREGION_ACTION ): pAction = new MetaClipRegionAction; break;
214         case( META_ISECTRECTCLIPREGION_ACTION ): pAction = new MetaISectRectClipRegionAction; break;
215         case( META_ISECTREGIONCLIPREGION_ACTION ): pAction = new MetaISectRegionClipRegionAction; break;
216         case( META_MOVECLIPREGION_ACTION ): pAction = new MetaMoveClipRegionAction; break;
217         case( META_LINECOLOR_ACTION ): pAction = new MetaLineColorAction; break;
218         case( META_FILLCOLOR_ACTION ): pAction = new MetaFillColorAction; break;
219         case( META_TEXTCOLOR_ACTION ): pAction = new MetaTextColorAction; break;
220         case( META_TEXTFILLCOLOR_ACTION ): pAction = new MetaTextFillColorAction; break;
221         case( META_TEXTLINECOLOR_ACTION ): pAction = new MetaTextLineColorAction; break;
222         case( META_OVERLINECOLOR_ACTION ): pAction = new MetaOverlineColorAction; break;
223         case( META_TEXTALIGN_ACTION ): pAction = new MetaTextAlignAction; break;
224         case( META_MAPMODE_ACTION ): pAction = new MetaMapModeAction; break;
225         case( META_FONT_ACTION ): pAction = new MetaFontAction; break;
226         case( META_PUSH_ACTION ): pAction = new MetaPushAction; break;
227         case( META_POP_ACTION ): pAction = new MetaPopAction; break;
228         case( META_RASTEROP_ACTION ): pAction = new MetaRasterOpAction; break;
229         case( META_TRANSPARENT_ACTION ): pAction = new MetaTransparentAction; break;
230         case( META_FLOATTRANSPARENT_ACTION ): pAction = new MetaFloatTransparentAction; break;
231         case( META_EPS_ACTION ): pAction = new MetaEPSAction; break;
232         case( META_REFPOINT_ACTION ): pAction = new MetaRefPointAction; break;
233         case( META_COMMENT_ACTION ): pAction = new MetaCommentAction; break;
234         case( META_LAYOUTMODE_ACTION ): pAction = new MetaLayoutModeAction; break;
235         case( META_TEXTLANGUAGE_ACTION ): pAction = new MetaTextLanguageAction; break;
236 
237         default:
238         {
239             // Action ueberlesen durch Kombination Ctor/Dtor,
240             // new/delete, weil Compiler sonst vielleicht wegoptimieren
241             delete ( new VersionCompat( rIStm, STREAM_READ ) );
242         }
243         break;
244     }
245 
246     if( pAction )
247         pAction->Read( rIStm, pData );
248 
249     return pAction;
250 }
251 
252 // ========================================================================
253 
254 IMPL_META_ACTION( Pixel, META_PIXEL_ACTION )
255 
256 // ------------------------------------------------------------------------
257 
258 MetaPixelAction::MetaPixelAction( const Point& rPt, const Color& rColor ) :
259     MetaAction  ( META_PIXEL_ACTION ),
260     maPt        ( rPt ),
261     maColor     ( rColor )
262 {
263 }
264 
265 // ------------------------------------------------------------------------
266 
267 void MetaPixelAction::Execute( OutputDevice* pOut )
268 {
269     pOut->DrawPixel( maPt, maColor );
270 }
271 
272 // ------------------------------------------------------------------------
273 
274 MetaAction* MetaPixelAction::Clone()
275 {
276     MetaAction* pClone = (MetaAction*) new MetaPixelAction( *this );
277     pClone->ResetRefCount();
278     return pClone;
279 }
280 
281 // ------------------------------------------------------------------------
282 
283 void MetaPixelAction::Move( long nHorzMove, long nVertMove )
284 {
285     maPt.Move( nHorzMove, nVertMove );
286 }
287 
288 // ------------------------------------------------------------------------
289 
290 void MetaPixelAction::Scale( double fScaleX, double fScaleY )
291 {
292     ImplScalePoint( maPt, fScaleX, fScaleY );
293 }
294 
295 // ------------------------------------------------------------------------
296 
297 sal_Bool MetaPixelAction::Compare( const MetaAction& rMetaAction ) const
298 {
299     return ( maPt == ((MetaPixelAction&)rMetaAction).maPt ) &&
300            ( maColor == ((MetaPixelAction&)rMetaAction).maColor );
301 }
302 
303 // ------------------------------------------------------------------------
304 
305 void MetaPixelAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
306 {
307     WRITE_BASE_COMPAT( rOStm, 1, pData );
308     rOStm << maPt;
309     maColor.Write( rOStm, sal_True );
310 }
311 
312 // ------------------------------------------------------------------------
313 
314 void MetaPixelAction::Read( SvStream& rIStm, ImplMetaReadData* )
315 {
316     COMPAT( rIStm );
317     rIStm >> maPt;
318     maColor.Read( rIStm, sal_True );
319 }
320 
321 // ========================================================================
322 
323 IMPL_META_ACTION( Point, META_POINT_ACTION )
324 
325 // ------------------------------------------------------------------------
326 
327 MetaPointAction::MetaPointAction( const Point& rPt ) :
328     MetaAction  ( META_POINT_ACTION ),
329     maPt        ( rPt )
330 {
331 }
332 
333 // ------------------------------------------------------------------------
334 
335 void MetaPointAction::Execute( OutputDevice* pOut )
336 {
337     pOut->DrawPixel( maPt );
338 }
339 
340 // ------------------------------------------------------------------------
341 
342 MetaAction* MetaPointAction::Clone()
343 {
344     MetaAction* pClone = (MetaAction*) new MetaPointAction( *this );
345     pClone->ResetRefCount();
346     return pClone;
347 }
348 
349 // ------------------------------------------------------------------------
350 
351 void MetaPointAction::Move( long nHorzMove, long nVertMove )
352 {
353     maPt.Move( nHorzMove, nVertMove );
354 }
355 
356 // ------------------------------------------------------------------------
357 
358 void MetaPointAction::Scale( double fScaleX, double fScaleY )
359 {
360     ImplScalePoint( maPt, fScaleX, fScaleY );
361 }
362 
363 // ------------------------------------------------------------------------
364 
365 sal_Bool MetaPointAction::Compare( const MetaAction& rMetaAction ) const
366 {
367     return maPt == ((MetaPointAction&)rMetaAction).maPt;
368 }
369 
370 // ------------------------------------------------------------------------
371 
372 void MetaPointAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
373 {
374     WRITE_BASE_COMPAT( rOStm, 1, pData );
375     rOStm << maPt;
376 }
377 
378 // ------------------------------------------------------------------------
379 
380 void MetaPointAction::Read( SvStream& rIStm, ImplMetaReadData* )
381 {
382     COMPAT( rIStm );
383     rIStm >> maPt;
384 }
385 
386 // ========================================================================
387 
388 IMPL_META_ACTION( Line, META_LINE_ACTION )
389 
390 // ------------------------------------------------------------------------
391 
392 MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd ) :
393     MetaAction  ( META_LINE_ACTION ),
394     maStartPt   ( rStart ),
395     maEndPt     ( rEnd )
396 {
397 }
398 
399 // ------------------------------------------------------------------------
400 
401 MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd,
402                                 const LineInfo& rLineInfo ) :
403     MetaAction  ( META_LINE_ACTION ),
404     maLineInfo  ( rLineInfo ),
405     maStartPt   ( rStart ),
406     maEndPt     ( rEnd )
407 {
408 }
409 
410 // ------------------------------------------------------------------------
411 
412 void MetaLineAction::Execute( OutputDevice* pOut )
413 {
414     if( maLineInfo.IsDefault() )
415         pOut->DrawLine( maStartPt, maEndPt );
416     else
417         pOut->DrawLine( maStartPt, maEndPt, maLineInfo );
418 }
419 
420 // ------------------------------------------------------------------------
421 
422 MetaAction* MetaLineAction::Clone()
423 {
424     MetaAction* pClone = (MetaAction*) new MetaLineAction( *this );
425     pClone->ResetRefCount();
426     return pClone;
427 }
428 
429 // ------------------------------------------------------------------------
430 
431 void MetaLineAction::Move( long nHorzMove, long nVertMove )
432 {
433     maStartPt.Move( nHorzMove, nVertMove );
434     maEndPt.Move( nHorzMove, nVertMove );
435 }
436 
437 // ------------------------------------------------------------------------
438 
439 void MetaLineAction::Scale( double fScaleX, double fScaleY )
440 {
441     ImplScalePoint( maStartPt, fScaleX, fScaleY );
442     ImplScalePoint( maEndPt, fScaleX, fScaleY );
443     ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY );
444 }
445 
446 // ------------------------------------------------------------------------
447 
448 sal_Bool MetaLineAction::Compare( const MetaAction& rMetaAction ) const
449 {
450     return ( maLineInfo == ((MetaLineAction&)rMetaAction).maLineInfo ) &&
451            ( maStartPt == ((MetaLineAction&)rMetaAction).maStartPt ) &&
452            ( maEndPt == ((MetaLineAction&)rMetaAction).maEndPt );
453 }
454 
455 // ------------------------------------------------------------------------
456 
457 void MetaLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
458 {
459     WRITE_BASE_COMPAT( rOStm, 2, pData );
460 
461     rOStm << maStartPt << maEndPt;  // Version 1
462     rOStm << maLineInfo;            // Version 2
463 }
464 
465 // ------------------------------------------------------------------------
466 
467 void MetaLineAction::Read( SvStream& rIStm, ImplMetaReadData* )
468 {
469     COMPAT( rIStm );
470 
471     // Version 1
472     rIStm >> maStartPt >> maEndPt;
473 
474     // Version 2
475     if( aCompat.GetVersion() >= 2 )
476     {
477         rIStm >> maLineInfo;
478     }
479 }
480 
481 // ========================================================================
482 
483 IMPL_META_ACTION( Rect, META_RECT_ACTION )
484 
485 // ------------------------------------------------------------------------
486 
487 MetaRectAction::MetaRectAction( const Rectangle& rRect ) :
488     MetaAction  ( META_RECT_ACTION ),
489     maRect      ( rRect )
490 {
491 }
492 
493 // ------------------------------------------------------------------------
494 
495 void MetaRectAction::Execute( OutputDevice* pOut )
496 {
497     pOut->DrawRect( maRect );
498 }
499 
500 // ------------------------------------------------------------------------
501 
502 MetaAction* MetaRectAction::Clone()
503 {
504     MetaAction* pClone = (MetaAction*) new MetaRectAction( *this );
505     pClone->ResetRefCount();
506     return pClone;
507 }
508 
509 // ------------------------------------------------------------------------
510 
511 void MetaRectAction::Move( long nHorzMove, long nVertMove )
512 {
513     maRect.Move( nHorzMove, nVertMove );
514 }
515 
516 // ------------------------------------------------------------------------
517 
518 void MetaRectAction::Scale( double fScaleX, double fScaleY )
519 {
520     ImplScaleRect( maRect, fScaleX, fScaleY );
521 }
522 
523 // ------------------------------------------------------------------------
524 
525 sal_Bool MetaRectAction::Compare( const MetaAction& rMetaAction ) const
526 {
527     return maRect == ((MetaRectAction&)rMetaAction).maRect;
528 }
529 
530 // ------------------------------------------------------------------------
531 
532 void MetaRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
533 {
534     WRITE_BASE_COMPAT( rOStm, 1, pData );
535     rOStm << maRect;
536 }
537 
538 // ------------------------------------------------------------------------
539 
540 void MetaRectAction::Read( SvStream& rIStm, ImplMetaReadData* )
541 {
542     COMPAT( rIStm );
543     rIStm >> maRect;
544 }
545 
546 // ========================================================================
547 
548 IMPL_META_ACTION( RoundRect, META_ROUNDRECT_ACTION )
549 
550 // ------------------------------------------------------------------------
551 
552 MetaRoundRectAction::MetaRoundRectAction( const Rectangle& rRect,
553                                           sal_uInt32 nHorzRound, sal_uInt32 nVertRound ) :
554     MetaAction  ( META_ROUNDRECT_ACTION ),
555     maRect      ( rRect ),
556     mnHorzRound ( nHorzRound ),
557     mnVertRound ( nVertRound )
558 {
559 }
560 
561 // ------------------------------------------------------------------------
562 
563 void MetaRoundRectAction::Execute( OutputDevice* pOut )
564 {
565     pOut->DrawRect( maRect, mnHorzRound, mnVertRound );
566 }
567 
568 // ------------------------------------------------------------------------
569 
570 MetaAction* MetaRoundRectAction::Clone()
571 {
572     MetaAction* pClone = (MetaAction*) new MetaRoundRectAction( *this );
573     pClone->ResetRefCount();
574     return pClone;
575 }
576 
577 // ------------------------------------------------------------------------
578 
579 void MetaRoundRectAction::Move( long nHorzMove, long nVertMove )
580 {
581     maRect.Move( nHorzMove, nVertMove );
582 }
583 
584 // ------------------------------------------------------------------------
585 
586 void MetaRoundRectAction::Scale( double fScaleX, double fScaleY )
587 {
588     ImplScaleRect( maRect, fScaleX, fScaleY );
589     mnHorzRound = FRound( mnHorzRound * fabs(fScaleX) );
590     mnVertRound = FRound( mnVertRound * fabs(fScaleY) );
591 }
592 
593 // ------------------------------------------------------------------------
594 
595 sal_Bool MetaRoundRectAction::Compare( const MetaAction& rMetaAction ) const
596 {
597     return ( maRect == ((MetaRoundRectAction&)rMetaAction).maRect ) &&
598            ( mnHorzRound == ((MetaRoundRectAction&)rMetaAction).mnHorzRound ) &&
599            ( mnVertRound == ((MetaRoundRectAction&)rMetaAction).mnVertRound );
600 }
601 
602 // ------------------------------------------------------------------------
603 
604 void MetaRoundRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
605 {
606     WRITE_BASE_COMPAT( rOStm, 1, pData );
607     rOStm << maRect << mnHorzRound << mnVertRound;
608 }
609 
610 // ------------------------------------------------------------------------
611 
612 void MetaRoundRectAction::Read( SvStream& rIStm, ImplMetaReadData* )
613 {
614     COMPAT( rIStm );
615     rIStm >> maRect >> mnHorzRound >> mnVertRound;
616 }
617 
618 // ========================================================================
619 
620 IMPL_META_ACTION( Ellipse, META_ELLIPSE_ACTION )
621 
622 // ------------------------------------------------------------------------
623 
624 MetaEllipseAction::MetaEllipseAction( const Rectangle& rRect ) :
625     MetaAction  ( META_ELLIPSE_ACTION ),
626     maRect      ( rRect )
627 {
628 }
629 
630 // ------------------------------------------------------------------------
631 
632 void MetaEllipseAction::Execute( OutputDevice* pOut )
633 {
634     pOut->DrawEllipse( maRect );
635 }
636 
637 // ------------------------------------------------------------------------
638 
639 MetaAction* MetaEllipseAction::Clone()
640 {
641     MetaAction* pClone = (MetaAction*) new MetaEllipseAction( *this );
642     pClone->ResetRefCount();
643     return pClone;
644 }
645 
646 // ------------------------------------------------------------------------
647 
648 void MetaEllipseAction::Move( long nHorzMove, long nVertMove )
649 {
650     maRect.Move( nHorzMove, nVertMove );
651 }
652 
653 // ------------------------------------------------------------------------
654 
655 void MetaEllipseAction::Scale( double fScaleX, double fScaleY )
656 {
657     ImplScaleRect( maRect, fScaleX, fScaleY );
658 }
659 
660 // ------------------------------------------------------------------------
661 
662 sal_Bool MetaEllipseAction::Compare( const MetaAction& rMetaAction ) const
663 {
664     return maRect == ((MetaEllipseAction&)rMetaAction).maRect;
665 }
666 
667 // ------------------------------------------------------------------------
668 
669 void MetaEllipseAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
670 {
671     WRITE_BASE_COMPAT( rOStm, 1, pData );
672     rOStm << maRect;
673 }
674 
675 // ------------------------------------------------------------------------
676 
677 void MetaEllipseAction::Read( SvStream& rIStm, ImplMetaReadData* )
678 {
679     COMPAT( rIStm );
680     rIStm >> maRect;
681 }
682 
683 // ========================================================================
684 
685 IMPL_META_ACTION( Arc, META_ARC_ACTION )
686 
687 // ------------------------------------------------------------------------
688 
689 MetaArcAction::MetaArcAction( const Rectangle& rRect,
690                               const Point& rStart, const Point& rEnd ) :
691     MetaAction  ( META_ARC_ACTION ),
692     maRect      ( rRect ),
693     maStartPt   ( rStart ),
694     maEndPt     ( rEnd )
695 {
696 }
697 
698 // ------------------------------------------------------------------------
699 
700 void MetaArcAction::Execute( OutputDevice* pOut )
701 {
702     pOut->DrawArc( maRect, maStartPt, maEndPt );
703 }
704 
705 // ------------------------------------------------------------------------
706 
707 MetaAction* MetaArcAction::Clone()
708 {
709     MetaAction* pClone = (MetaAction*) new MetaArcAction( *this );
710     pClone->ResetRefCount();
711     return pClone;
712 }
713 
714 // ------------------------------------------------------------------------
715 
716 void MetaArcAction::Move( long nHorzMove, long nVertMove )
717 {
718     maRect.Move(  nHorzMove, nVertMove );
719     maStartPt.Move(  nHorzMove, nVertMove );
720     maEndPt.Move(  nHorzMove, nVertMove );
721 }
722 
723 // ------------------------------------------------------------------------
724 
725 void MetaArcAction::Scale( double fScaleX, double fScaleY )
726 {
727     ImplScaleRect( maRect, fScaleX, fScaleY );
728     ImplScalePoint( maStartPt, fScaleX, fScaleY );
729     ImplScalePoint( maEndPt, fScaleX, fScaleY );
730 }
731 
732 // ------------------------------------------------------------------------
733 
734 sal_Bool MetaArcAction::Compare( const MetaAction& rMetaAction ) const
735 {
736     return ( maRect == ((MetaArcAction&)rMetaAction).maRect ) &&
737            ( maStartPt == ((MetaArcAction&)rMetaAction).maStartPt ) &&
738            ( maEndPt == ((MetaArcAction&)rMetaAction).maEndPt );
739 }
740 
741 // ------------------------------------------------------------------------
742 
743 void MetaArcAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
744 {
745     WRITE_BASE_COMPAT( rOStm, 1, pData );
746     rOStm << maRect << maStartPt << maEndPt;
747 }
748 
749 // ------------------------------------------------------------------------
750 
751 void MetaArcAction::Read( SvStream& rIStm, ImplMetaReadData* )
752 {
753     COMPAT( rIStm );
754     rIStm >> maRect >> maStartPt >> maEndPt;
755 }
756 
757 // ========================================================================
758 
759 IMPL_META_ACTION( Pie, META_PIE_ACTION )
760 
761 // ------------------------------------------------------------------------
762 
763 MetaPieAction::MetaPieAction( const Rectangle& rRect,
764                               const Point& rStart, const Point& rEnd ) :
765     MetaAction  ( META_PIE_ACTION ),
766     maRect      ( rRect ),
767     maStartPt   ( rStart ),
768     maEndPt     ( rEnd )
769 {
770 }
771 
772 // ------------------------------------------------------------------------
773 
774 void MetaPieAction::Execute( OutputDevice* pOut )
775 {
776     pOut->DrawPie( maRect, maStartPt, maEndPt );
777 }
778 
779 // ------------------------------------------------------------------------
780 
781 MetaAction* MetaPieAction::Clone()
782 {
783     MetaAction* pClone = (MetaAction*) new MetaPieAction( *this );
784     pClone->ResetRefCount();
785     return pClone;
786 }
787 
788 // ------------------------------------------------------------------------
789 
790 void MetaPieAction::Move( long nHorzMove, long nVertMove )
791 {
792     maRect.Move(  nHorzMove, nVertMove );
793     maStartPt.Move(  nHorzMove, nVertMove );
794     maEndPt.Move(  nHorzMove, nVertMove );
795 }
796 
797 // ------------------------------------------------------------------------
798 
799 void MetaPieAction::Scale( double fScaleX, double fScaleY )
800 {
801     ImplScaleRect( maRect, fScaleX, fScaleY );
802     ImplScalePoint( maStartPt, fScaleX, fScaleY );
803     ImplScalePoint( maEndPt, fScaleX, fScaleY );
804 }
805 
806 // ------------------------------------------------------------------------
807 
808 sal_Bool MetaPieAction::Compare( const MetaAction& rMetaAction ) const
809 {
810     return ( maRect == ((MetaPieAction&)rMetaAction).maRect ) &&
811            ( maStartPt == ((MetaPieAction&)rMetaAction).maStartPt ) &&
812            ( maEndPt == ((MetaPieAction&)rMetaAction).maEndPt );
813 }
814 
815 // ------------------------------------------------------------------------
816 
817 void MetaPieAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
818 {
819     WRITE_BASE_COMPAT( rOStm, 1, pData );
820     rOStm << maRect << maStartPt << maEndPt;
821 }
822 
823 // ------------------------------------------------------------------------
824 
825 void MetaPieAction::Read( SvStream& rIStm, ImplMetaReadData* )
826 {
827     COMPAT( rIStm );
828     rIStm >> maRect >> maStartPt >> maEndPt;
829 }
830 
831 // ========================================================================
832 
833 IMPL_META_ACTION( Chord, META_CHORD_ACTION )
834 
835 // ------------------------------------------------------------------------
836 
837 MetaChordAction::MetaChordAction( const Rectangle& rRect,
838                                   const Point& rStart, const Point& rEnd ) :
839     MetaAction  ( META_CHORD_ACTION ),
840     maRect      ( rRect ),
841     maStartPt   ( rStart ),
842     maEndPt     ( rEnd )
843 {
844 }
845 
846 // ------------------------------------------------------------------------
847 
848 void MetaChordAction::Execute( OutputDevice* pOut )
849 {
850     pOut->DrawChord( maRect, maStartPt, maEndPt );
851 }
852 
853 // ------------------------------------------------------------------------
854 
855 MetaAction* MetaChordAction::Clone()
856 {
857     MetaAction* pClone = (MetaAction*) new MetaChordAction( *this );
858     pClone->ResetRefCount();
859     return pClone;
860 }
861 
862 // ------------------------------------------------------------------------
863 
864 void MetaChordAction::Move( long nHorzMove, long nVertMove )
865 {
866     maRect.Move(  nHorzMove, nVertMove );
867     maStartPt.Move(  nHorzMove, nVertMove );
868     maEndPt.Move(  nHorzMove, nVertMove );
869 }
870 
871 // ------------------------------------------------------------------------
872 
873 void MetaChordAction::Scale( double fScaleX, double fScaleY )
874 {
875     ImplScaleRect( maRect, fScaleX, fScaleY );
876     ImplScalePoint( maStartPt, fScaleX, fScaleY );
877     ImplScalePoint( maEndPt, fScaleX, fScaleY );
878 }
879 
880 // ------------------------------------------------------------------------
881 
882 sal_Bool MetaChordAction::Compare( const MetaAction& rMetaAction ) const
883 {
884     return ( maRect == ((MetaChordAction&)rMetaAction).maRect ) &&
885            ( maStartPt == ((MetaChordAction&)rMetaAction).maStartPt ) &&
886            ( maEndPt == ((MetaChordAction&)rMetaAction).maEndPt );
887 }
888 
889 // ------------------------------------------------------------------------
890 
891 void MetaChordAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
892 {
893     WRITE_BASE_COMPAT( rOStm, 1, pData );
894     rOStm << maRect << maStartPt << maEndPt;
895 }
896 
897 // ------------------------------------------------------------------------
898 
899 void MetaChordAction::Read( SvStream& rIStm, ImplMetaReadData* )
900 {
901     COMPAT( rIStm );
902     rIStm >> maRect >> maStartPt >> maEndPt;
903 }
904 
905 // ========================================================================
906 
907 IMPL_META_ACTION( PolyLine, META_POLYLINE_ACTION )
908 
909 // ------------------------------------------------------------------------
910 
911 MetaPolyLineAction::MetaPolyLineAction( const Polygon& rPoly ) :
912     MetaAction  ( META_POLYLINE_ACTION ),
913     maPoly      ( rPoly )
914 {
915 }
916 
917 // ------------------------------------------------------------------------
918 
919 MetaPolyLineAction::MetaPolyLineAction( const Polygon& rPoly, const LineInfo& rLineInfo ) :
920     MetaAction  ( META_POLYLINE_ACTION ),
921     maLineInfo  ( rLineInfo ),
922     maPoly      ( rPoly )
923 {
924 }
925 
926 // ------------------------------------------------------------------------
927 
928 void MetaPolyLineAction::Execute( OutputDevice* pOut )
929 {
930     if( maLineInfo.IsDefault() )
931         pOut->DrawPolyLine( maPoly );
932     else
933         pOut->DrawPolyLine( maPoly, maLineInfo );
934 }
935 
936 // ------------------------------------------------------------------------
937 
938 MetaAction* MetaPolyLineAction::Clone()
939 {
940     MetaAction* pClone = (MetaAction*) new MetaPolyLineAction( *this );
941     pClone->ResetRefCount();
942     return pClone;
943 }
944 
945 // ------------------------------------------------------------------------
946 
947 void MetaPolyLineAction::Move( long nHorzMove, long nVertMove )
948 {
949     maPoly.Move( nHorzMove, nVertMove );
950 }
951 
952 // ------------------------------------------------------------------------
953 
954 void MetaPolyLineAction::Scale( double fScaleX, double fScaleY )
955 {
956     ImplScalePoly( maPoly, fScaleX, fScaleY );
957     ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY );
958 }
959 
960 // ------------------------------------------------------------------------
961 
962 sal_Bool MetaPolyLineAction::Compare( const MetaAction& rMetaAction ) const
963 {
964     sal_Bool bIsEqual = sal_True;;
965     if ( maLineInfo != ((MetaPolyLineAction&)rMetaAction).maLineInfo )
966         bIsEqual = sal_False;
967     else
968         bIsEqual = maPoly.IsEqual(((MetaPolyLineAction&)rMetaAction).maPoly );
969     return bIsEqual;
970 
971 }
972 
973 // ------------------------------------------------------------------------
974 
975 void MetaPolyLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
976 {
977     WRITE_BASE_COMPAT( rOStm, 3, pData );
978 
979     Polygon aSimplePoly;
980     maPoly.AdaptiveSubdivide( aSimplePoly );
981 
982     rOStm << aSimplePoly;                               // Version 1
983     rOStm << maLineInfo;                                // Version 2
984 
985     sal_uInt8 bHasPolyFlags = maPoly.HasFlags();        // Version 3
986     rOStm << bHasPolyFlags;
987     if ( bHasPolyFlags )
988         maPoly.Write( rOStm );
989 }
990 
991 // ------------------------------------------------------------------------
992 
993 void MetaPolyLineAction::Read( SvStream& rIStm, ImplMetaReadData* )
994 {
995     COMPAT( rIStm );
996 
997     // Version 1
998     rIStm >> maPoly;
999 
1000     // Version 2
1001     if( aCompat.GetVersion() >= 2 )
1002         rIStm >> maLineInfo;
1003     if ( aCompat.GetVersion() >= 3 )
1004     {
1005         sal_uInt8 bHasPolyFlags;
1006         rIStm >> bHasPolyFlags;
1007         if ( bHasPolyFlags )
1008             maPoly.Read( rIStm );
1009     }
1010 }
1011 
1012 // ========================================================================
1013 
1014 IMPL_META_ACTION( Polygon, META_POLYGON_ACTION )
1015 
1016 // ------------------------------------------------------------------------
1017 
1018 MetaPolygonAction::MetaPolygonAction( const Polygon& rPoly ) :
1019     MetaAction  ( META_POLYGON_ACTION ),
1020     maPoly      ( rPoly )
1021 {
1022 }
1023 
1024 // ------------------------------------------------------------------------
1025 
1026 void MetaPolygonAction::Execute( OutputDevice* pOut )
1027 {
1028     pOut->DrawPolygon( maPoly );
1029 }
1030 
1031 // ------------------------------------------------------------------------
1032 
1033 MetaAction* MetaPolygonAction::Clone()
1034 {
1035     MetaAction* pClone = (MetaAction*) new MetaPolygonAction( *this );
1036     pClone->ResetRefCount();
1037     return pClone;
1038 }
1039 
1040 // ------------------------------------------------------------------------
1041 
1042 void MetaPolygonAction::Move( long nHorzMove, long nVertMove )
1043 {
1044     maPoly.Move( nHorzMove, nVertMove );
1045 }
1046 
1047 // ------------------------------------------------------------------------
1048 
1049 void MetaPolygonAction::Scale( double fScaleX, double fScaleY )
1050 {
1051     ImplScalePoly( maPoly, fScaleX, fScaleY );
1052 }
1053 
1054 // ------------------------------------------------------------------------
1055 
1056 sal_Bool MetaPolygonAction::Compare( const MetaAction& rMetaAction ) const
1057 {
1058     return maPoly.IsEqual(((MetaPolygonAction&)rMetaAction).maPoly );
1059 }
1060 
1061 // ------------------------------------------------------------------------
1062 
1063 void MetaPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1064 {
1065     WRITE_BASE_COMPAT( rOStm, 2, pData );
1066 
1067     Polygon aSimplePoly;                            // Version 1
1068     maPoly.AdaptiveSubdivide( aSimplePoly );
1069     rOStm << aSimplePoly;
1070 
1071     sal_uInt8 bHasPolyFlags = maPoly.HasFlags();    // Version 2
1072     rOStm << bHasPolyFlags;
1073     if ( bHasPolyFlags )
1074         maPoly.Write( rOStm );
1075 }
1076 
1077 // ------------------------------------------------------------------------
1078 
1079 void MetaPolygonAction::Read( SvStream& rIStm, ImplMetaReadData* )
1080 {
1081     COMPAT( rIStm );
1082 
1083     rIStm >> maPoly;                    // Version 1
1084 
1085     if( aCompat.GetVersion() >= 2 )     // Version 2
1086     {
1087         sal_uInt8 bHasPolyFlags;
1088         rIStm >> bHasPolyFlags;
1089         if ( bHasPolyFlags )
1090             maPoly.Read( rIStm );
1091     }
1092 }
1093 
1094 // ========================================================================
1095 
1096 IMPL_META_ACTION( PolyPolygon, META_POLYPOLYGON_ACTION )
1097 
1098 // ------------------------------------------------------------------------
1099 
1100 MetaPolyPolygonAction::MetaPolyPolygonAction( const PolyPolygon& rPolyPoly ) :
1101     MetaAction  ( META_POLYPOLYGON_ACTION ),
1102     maPolyPoly  ( rPolyPoly )
1103 {
1104 }
1105 
1106 // ------------------------------------------------------------------------
1107 
1108 void MetaPolyPolygonAction::Execute( OutputDevice* pOut )
1109 {
1110     pOut->DrawPolyPolygon( maPolyPoly );
1111 }
1112 
1113 // ------------------------------------------------------------------------
1114 
1115 MetaAction* MetaPolyPolygonAction::Clone()
1116 {
1117     MetaAction* pClone = (MetaAction*) new MetaPolyPolygonAction( *this );
1118     pClone->ResetRefCount();
1119     return pClone;
1120 }
1121 
1122 // ------------------------------------------------------------------------
1123 
1124 void MetaPolyPolygonAction::Move( long nHorzMove, long nVertMove )
1125 {
1126     maPolyPoly.Move( nHorzMove, nVertMove );
1127 }
1128 
1129 // ------------------------------------------------------------------------
1130 
1131 void MetaPolyPolygonAction::Scale( double fScaleX, double fScaleY )
1132 {
1133     for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
1134         ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
1135 }
1136 
1137 // ------------------------------------------------------------------------
1138 
1139 sal_Bool MetaPolyPolygonAction::Compare( const MetaAction& rMetaAction ) const
1140 {
1141     return maPolyPoly.IsEqual(((MetaPolyPolygonAction&)rMetaAction).maPolyPoly );
1142 }
1143 
1144 // ------------------------------------------------------------------------
1145 
1146 void MetaPolyPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1147 {
1148     WRITE_BASE_COMPAT( rOStm, 2, pData );
1149 
1150     sal_uInt16 nNumberOfComplexPolygons = 0;
1151     sal_uInt16 i, nPolyCount = maPolyPoly.Count();
1152 
1153     Polygon aSimplePoly;                                // Version 1
1154     rOStm << nPolyCount;
1155     for ( i = 0; i < nPolyCount; i++ )
1156     {
1157         const Polygon& rPoly = maPolyPoly.GetObject( i );
1158         if ( rPoly.HasFlags() )
1159             nNumberOfComplexPolygons++;
1160         rPoly.AdaptiveSubdivide( aSimplePoly );
1161         rOStm << aSimplePoly;
1162     }
1163 
1164     rOStm << nNumberOfComplexPolygons;                  // Version 2
1165     for ( i = 0; nNumberOfComplexPolygons && ( i < nPolyCount ); i++ )
1166     {
1167         const Polygon& rPoly = maPolyPoly.GetObject( i );
1168         if ( rPoly.HasFlags() )
1169         {
1170             rOStm << i;
1171             rPoly.Write( rOStm );
1172 
1173             nNumberOfComplexPolygons--;
1174         }
1175     }
1176 }
1177 
1178 // ------------------------------------------------------------------------
1179 
1180 void MetaPolyPolygonAction::Read( SvStream& rIStm, ImplMetaReadData* )
1181 {
1182     COMPAT( rIStm );
1183     rIStm >> maPolyPoly;                // Version 1
1184 
1185     if ( aCompat.GetVersion() >= 2 )    // Version 2
1186     {
1187         sal_uInt16 i, nIndex, nNumberOfComplexPolygons;
1188         rIStm >> nNumberOfComplexPolygons;
1189         for ( i = 0; i < nNumberOfComplexPolygons; i++ )
1190         {
1191             rIStm >> nIndex;
1192             Polygon aPoly;
1193             aPoly.Read( rIStm );
1194             maPolyPoly.Replace( aPoly, nIndex );
1195         }
1196     }
1197 }
1198 
1199 // ========================================================================
1200 
1201 IMPL_META_ACTION( Text, META_TEXT_ACTION )
1202 
1203 // ------------------------------------------------------------------------
1204 
1205 MetaTextAction::MetaTextAction( const Point& rPt, const XubString& rStr,
1206                                 sal_uInt16 nIndex, sal_uInt16 nLen ) :
1207     MetaAction  ( META_TEXT_ACTION ),
1208     maPt        ( rPt ),
1209     maStr       ( rStr ),
1210     mnIndex     ( nIndex ),
1211     mnLen       ( nLen )
1212 {
1213 }
1214 
1215 // ------------------------------------------------------------------------
1216 
1217 void MetaTextAction::Execute( OutputDevice* pOut )
1218 {
1219     pOut->DrawText( maPt, maStr, mnIndex, mnLen );
1220 }
1221 
1222 // ------------------------------------------------------------------------
1223 
1224 MetaAction* MetaTextAction::Clone()
1225 {
1226     MetaAction* pClone = (MetaAction*) new MetaTextAction( *this );
1227     pClone->ResetRefCount();
1228     return pClone;
1229 }
1230 
1231 // ------------------------------------------------------------------------
1232 
1233 void MetaTextAction::Move( long nHorzMove, long nVertMove )
1234 {
1235     maPt.Move( nHorzMove, nVertMove );
1236 }
1237 
1238 // ------------------------------------------------------------------------
1239 
1240 void MetaTextAction::Scale( double fScaleX, double fScaleY )
1241 {
1242     ImplScalePoint( maPt, fScaleX, fScaleY );
1243 }
1244 
1245 // ------------------------------------------------------------------------
1246 
1247 sal_Bool MetaTextAction::Compare( const MetaAction& rMetaAction ) const
1248 {
1249     return ( maPt == ((MetaTextAction&)rMetaAction).maPt ) &&
1250            ( maStr == ((MetaTextAction&)rMetaAction).maStr ) &&
1251            ( mnIndex == ((MetaTextAction&)rMetaAction).mnIndex ) &&
1252            ( mnLen == ((MetaTextAction&)rMetaAction).mnLen );
1253 }
1254 
1255 // ------------------------------------------------------------------------
1256 
1257 void MetaTextAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1258 {
1259     WRITE_BASE_COMPAT( rOStm, 2, pData );
1260     rOStm   << maPt;
1261     rOStm.WriteByteString( maStr, pData->meActualCharSet );
1262     rOStm   << mnIndex;
1263     rOStm   << mnLen;
1264 
1265     sal_uInt16 i, nLen = maStr.Len();                           // version 2
1266     rOStm << nLen;
1267     for ( i = 0; i < nLen; i++ )
1268     {
1269         sal_Unicode nUni = maStr.GetChar( i );
1270         rOStm << nUni;
1271     }
1272 }
1273 
1274 // ------------------------------------------------------------------------
1275 
1276 void MetaTextAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
1277 {
1278     COMPAT( rIStm );
1279     rIStm   >> maPt;
1280     rIStm.ReadByteString( maStr, pData->meActualCharSet );
1281     rIStm   >> mnIndex;
1282     rIStm   >> mnLen;
1283 
1284     if ( aCompat.GetVersion() >= 2 )                            // Version 2
1285     {
1286         sal_uInt16 nLen;
1287         rIStm >> nLen;
1288         sal_Unicode* pBuffer = maStr.AllocBuffer( nLen );
1289         while ( nLen-- )
1290             rIStm >> *pBuffer++;
1291     }
1292 }
1293 
1294 // ========================================================================
1295 
1296 MetaTextArrayAction::MetaTextArrayAction() :
1297     MetaAction  ( META_TEXTARRAY_ACTION ),
1298     mpDXAry     ( NULL ),
1299     mnIndex     ( 0 ),
1300     mnLen       ( 0 )
1301 {
1302 }
1303 
1304 // ------------------------------------------------------------------------
1305 
1306 MetaTextArrayAction::MetaTextArrayAction( const MetaTextArrayAction& rAction ) :
1307     MetaAction  ( META_TEXTARRAY_ACTION ),
1308     maStartPt   ( rAction.maStartPt ),
1309     maStr       ( rAction.maStr ),
1310     mnIndex     ( rAction.mnIndex ),
1311     mnLen       ( rAction.mnLen )
1312 {
1313     if( rAction.mpDXAry )
1314     {
1315         const sal_uLong nAryLen = mnLen;
1316 
1317         mpDXAry = new sal_Int32[ nAryLen ];
1318         memcpy( mpDXAry, rAction.mpDXAry, nAryLen * sizeof( sal_Int32 ) );
1319     }
1320     else
1321         mpDXAry = NULL;
1322 }
1323 
1324 // ------------------------------------------------------------------------
1325 
1326 MetaTextArrayAction::MetaTextArrayAction( const Point& rStartPt,
1327                                           const XubString& rStr,
1328                                           const sal_Int32* pDXAry,
1329                                           sal_uInt16 nIndex,
1330                                           sal_uInt16 nLen ) :
1331     MetaAction  ( META_TEXTARRAY_ACTION ),
1332     maStartPt   ( rStartPt ),
1333     maStr       ( rStr ),
1334     mnIndex     ( nIndex ),
1335     mnLen       ( ( nLen == STRING_LEN ) ? rStr.Len() : nLen )
1336 {
1337     const sal_uLong nAryLen = pDXAry ? mnLen : 0;
1338 
1339     if( nAryLen )
1340     {
1341         mpDXAry = new sal_Int32[ nAryLen ];
1342         memcpy( mpDXAry, pDXAry, nAryLen * sizeof( sal_Int32 ) );
1343     }
1344     else
1345         mpDXAry = NULL;
1346 }
1347 
1348 // ------------------------------------------------------------------------
1349 
1350 MetaTextArrayAction::~MetaTextArrayAction()
1351 {
1352     delete[] mpDXAry;
1353 }
1354 
1355 // ------------------------------------------------------------------------
1356 
1357 void MetaTextArrayAction::Execute( OutputDevice* pOut )
1358 {
1359     pOut->DrawTextArray( maStartPt, maStr, mpDXAry, mnIndex, mnLen );
1360 }
1361 
1362 // ------------------------------------------------------------------------
1363 
1364 MetaAction* MetaTextArrayAction::Clone()
1365 {
1366     MetaAction* pClone = (MetaAction*) new MetaTextArrayAction( *this );
1367     pClone->ResetRefCount();
1368     return pClone;
1369 }
1370 
1371 // ------------------------------------------------------------------------
1372 
1373 void MetaTextArrayAction::Move( long nHorzMove, long nVertMove )
1374 {
1375     maStartPt.Move( nHorzMove, nVertMove );
1376 }
1377 
1378 // ------------------------------------------------------------------------
1379 
1380 void MetaTextArrayAction::Scale( double fScaleX, double fScaleY )
1381 {
1382     ImplScalePoint( maStartPt, fScaleX, fScaleY );
1383 
1384     if ( mpDXAry && mnLen )
1385     {
1386         for ( sal_uInt16 i = 0, nCount = mnLen; i < nCount; i++ )
1387             mpDXAry[ i ] = FRound( mpDXAry[ i ] * fabs(fScaleX) );
1388     }
1389 }
1390 
1391 // ------------------------------------------------------------------------
1392 
1393 sal_Bool MetaTextArrayAction::Compare( const MetaAction& rMetaAction ) const
1394 {
1395     return ( maStartPt == ((MetaTextArrayAction&)rMetaAction).maStartPt ) &&
1396            ( maStr == ((MetaTextArrayAction&)rMetaAction).maStr ) &&
1397            ( mnIndex == ((MetaTextArrayAction&)rMetaAction).mnIndex ) &&
1398            ( mnLen == ((MetaTextArrayAction&)rMetaAction).mnLen ) &&
1399            ( memcmp( mpDXAry, ((MetaTextArrayAction&)rMetaAction).mpDXAry, mnLen ) == 0 );
1400 }
1401 
1402 // ------------------------------------------------------------------------
1403 
1404 void MetaTextArrayAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1405 {
1406     const sal_uInt32 nAryLen = mpDXAry ? mnLen : 0;
1407 
1408     WRITE_BASE_COMPAT( rOStm, 2, pData );
1409     rOStm   << maStartPt;
1410     rOStm.WriteByteString( maStr, pData->meActualCharSet );
1411     rOStm   << mnIndex;
1412     rOStm   << mnLen;
1413     rOStm   << nAryLen;
1414 
1415     for( sal_uLong i = 0UL; i < nAryLen; i++ )
1416         rOStm << mpDXAry[ i ];
1417 
1418     sal_uInt16 j, nLen = maStr.Len();                           // version 2
1419     rOStm << nLen;
1420     for ( j = 0; j < nLen; j++ )
1421     {
1422         sal_Unicode nUni = maStr.GetChar( j );
1423         rOStm << nUni;
1424     }
1425 }
1426 
1427 // ------------------------------------------------------------------------
1428 
1429 void MetaTextArrayAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
1430 {
1431     sal_uInt32 nAryLen;
1432 
1433     delete[] mpDXAry;
1434 
1435     COMPAT( rIStm );
1436     rIStm   >> maStartPt;
1437     rIStm.ReadByteString( maStr, pData->meActualCharSet );
1438     rIStm   >> mnIndex;
1439     rIStm   >> mnLen;
1440     rIStm   >> nAryLen;
1441 
1442     if ( mnIndex + mnLen > maStr.Len() )
1443     {
1444         mnIndex = 0;
1445         mpDXAry = 0;
1446         return;
1447     }
1448 
1449     if( nAryLen )
1450     {
1451         // #i9762#, #106172# Ensure that DX array is at least mnLen entries long
1452         if ( mnLen >= nAryLen )
1453         {
1454             mpDXAry = new (std::nothrow)sal_Int32[ mnLen ];
1455             if ( mpDXAry )
1456             {
1457                 sal_uLong i;
1458                 for( i = 0UL; i < nAryLen; i++ )
1459                     rIStm >> mpDXAry[ i ];
1460 
1461                 // #106172# setup remainder
1462                 for( ; i < mnLen; i++ )
1463                     mpDXAry[ i ] = 0;
1464             }
1465         }
1466         else
1467         {
1468             mpDXAry = NULL;
1469             return;
1470         }
1471     }
1472     else
1473         mpDXAry = NULL;
1474 
1475     if ( aCompat.GetVersion() >= 2 )                            // Version 2
1476     {
1477         sal_uInt16 nLen;
1478         rIStm >> nLen;
1479         sal_Unicode* pBuffer = maStr.AllocBuffer( nLen );
1480         while ( nLen-- )
1481             rIStm >> *pBuffer++;
1482 
1483         if ( mnIndex + mnLen > maStr.Len() )
1484         {
1485             mnIndex = 0;
1486             delete[] mpDXAry, mpDXAry = NULL;
1487         }
1488     }
1489 }
1490 
1491 // ========================================================================
1492 
1493 IMPL_META_ACTION( StretchText, META_STRETCHTEXT_ACTION )
1494 
1495 // ------------------------------------------------------------------------
1496 
1497 MetaStretchTextAction::MetaStretchTextAction( const Point& rPt, sal_uInt32 nWidth,
1498                                               const XubString& rStr,
1499                                               sal_uInt16 nIndex, sal_uInt16 nLen ) :
1500     MetaAction  ( META_STRETCHTEXT_ACTION ),
1501     maPt        ( rPt ),
1502     maStr       ( rStr ),
1503     mnWidth     ( nWidth ),
1504     mnIndex     ( nIndex ),
1505     mnLen       ( nLen )
1506 {
1507 }
1508 
1509 // ------------------------------------------------------------------------
1510 
1511 void MetaStretchTextAction::Execute( OutputDevice* pOut )
1512 {
1513     pOut->DrawStretchText( maPt, mnWidth, maStr, mnIndex, mnLen );
1514 }
1515 
1516 // ------------------------------------------------------------------------
1517 
1518 MetaAction* MetaStretchTextAction::Clone()
1519 {
1520     MetaAction* pClone = (MetaAction*) new MetaStretchTextAction( *this );
1521     pClone->ResetRefCount();
1522     return pClone;
1523 }
1524 
1525 // ------------------------------------------------------------------------
1526 
1527 void MetaStretchTextAction::Move( long nHorzMove, long nVertMove )
1528 {
1529     maPt.Move( nHorzMove, nVertMove );
1530 }
1531 
1532 // ------------------------------------------------------------------------
1533 
1534 void MetaStretchTextAction::Scale( double fScaleX, double fScaleY )
1535 {
1536     ImplScalePoint( maPt, fScaleX, fScaleY );
1537     mnWidth = (sal_uLong)FRound( mnWidth * fabs(fScaleX) );
1538 }
1539 
1540 // ------------------------------------------------------------------------
1541 
1542 sal_Bool MetaStretchTextAction::Compare( const MetaAction& rMetaAction ) const
1543 {
1544     return ( maPt == ((MetaStretchTextAction&)rMetaAction).maPt ) &&
1545            ( maStr == ((MetaStretchTextAction&)rMetaAction).maStr ) &&
1546            ( mnWidth == ((MetaStretchTextAction&)rMetaAction).mnWidth ) &&
1547            ( mnIndex == ((MetaStretchTextAction&)rMetaAction).mnIndex ) &&
1548            ( mnLen == ((MetaStretchTextAction&)rMetaAction).mnLen );
1549 }
1550 
1551 // ------------------------------------------------------------------------
1552 
1553 void MetaStretchTextAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1554 {
1555     WRITE_BASE_COMPAT( rOStm, 2, pData );
1556     rOStm   << maPt;
1557     rOStm.WriteByteString( maStr, pData->meActualCharSet );
1558     rOStm   << mnWidth;
1559     rOStm   << mnIndex;
1560     rOStm   << mnLen;
1561 
1562     sal_uInt16 i, nLen = maStr.Len();                           // version 2
1563     rOStm << nLen;
1564     for ( i = 0; i < nLen; i++ )
1565     {
1566         sal_Unicode nUni = maStr.GetChar( i );
1567         rOStm << nUni;
1568     }
1569 }
1570 
1571 // ------------------------------------------------------------------------
1572 
1573 void MetaStretchTextAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
1574 {
1575     COMPAT( rIStm );
1576     rIStm   >> maPt;
1577     rIStm.ReadByteString( maStr, pData->meActualCharSet );
1578     rIStm   >> mnWidth;
1579     rIStm   >> mnIndex;
1580     rIStm   >> mnLen;
1581 
1582     if ( aCompat.GetVersion() >= 2 )                            // Version 2
1583     {
1584         sal_uInt16 nLen;
1585         rIStm >> nLen;
1586         sal_Unicode* pBuffer = maStr.AllocBuffer( nLen );
1587         while ( nLen-- )
1588             rIStm >> *pBuffer++;
1589     }
1590 }
1591 
1592 // ========================================================================
1593 
1594 IMPL_META_ACTION( TextRect, META_TEXTRECT_ACTION )
1595 
1596 // ------------------------------------------------------------------------
1597 
1598 MetaTextRectAction::MetaTextRectAction( const Rectangle& rRect,
1599                                         const XubString& rStr, sal_uInt16 nStyle ) :
1600     MetaAction  ( META_TEXTRECT_ACTION ),
1601     maRect      ( rRect ),
1602     maStr       ( rStr ),
1603     mnStyle     ( nStyle )
1604 {
1605 }
1606 
1607 // ------------------------------------------------------------------------
1608 
1609 void MetaTextRectAction::Execute( OutputDevice* pOut )
1610 {
1611     pOut->DrawText( maRect, maStr, mnStyle );
1612 }
1613 
1614 // ------------------------------------------------------------------------
1615 
1616 MetaAction* MetaTextRectAction::Clone()
1617 {
1618     MetaAction* pClone = (MetaAction*) new MetaTextRectAction( *this );
1619     pClone->ResetRefCount();
1620     return pClone;
1621 }
1622 
1623 // ------------------------------------------------------------------------
1624 
1625 void MetaTextRectAction::Move( long nHorzMove, long nVertMove )
1626 {
1627     maRect.Move( nHorzMove, nVertMove );
1628 }
1629 
1630 // ------------------------------------------------------------------------
1631 
1632 void MetaTextRectAction::Scale( double fScaleX, double fScaleY )
1633 {
1634     ImplScaleRect( maRect, fScaleX, fScaleY );
1635 }
1636 
1637 // ------------------------------------------------------------------------
1638 
1639 sal_Bool MetaTextRectAction::Compare( const MetaAction& rMetaAction ) const
1640 {
1641     return ( maRect == ((MetaTextRectAction&)rMetaAction).maRect ) &&
1642            ( maStr == ((MetaTextRectAction&)rMetaAction).maStr ) &&
1643            ( mnStyle == ((MetaTextRectAction&)rMetaAction).mnStyle );
1644 }
1645 
1646 // ------------------------------------------------------------------------
1647 
1648 void MetaTextRectAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1649 {
1650     WRITE_BASE_COMPAT( rOStm, 2, pData );
1651     rOStm   << maRect;
1652     rOStm.WriteByteString( maStr, pData->meActualCharSet );
1653     rOStm   << mnStyle;
1654 
1655     sal_uInt16 i, nLen = maStr.Len();                           // version 2
1656     rOStm << nLen;
1657     for ( i = 0; i < nLen; i++ )
1658     {
1659         sal_Unicode nUni = maStr.GetChar( i );
1660         rOStm << nUni;
1661     }
1662 }
1663 
1664 // ------------------------------------------------------------------------
1665 
1666 void MetaTextRectAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
1667 {
1668     COMPAT( rIStm );
1669     rIStm   >> maRect;
1670     rIStm.ReadByteString( maStr, pData->meActualCharSet );
1671     rIStm   >> mnStyle;
1672 
1673     if ( aCompat.GetVersion() >= 2 )                            // Version 2
1674     {
1675         sal_uInt16 nLen;
1676         rIStm >> nLen;
1677         sal_Unicode* pBuffer = maStr.AllocBuffer( nLen );
1678         while ( nLen-- )
1679             rIStm >> *pBuffer++;
1680     }
1681 }
1682 
1683 // ========================================================================
1684 
1685 IMPL_META_ACTION( TextLine, META_TEXTLINE_ACTION )
1686 
1687 // ------------------------------------------------------------------------
1688 
1689 MetaTextLineAction::MetaTextLineAction( const Point& rPos, long nWidth,
1690                                         FontStrikeout eStrikeout,
1691                                         FontUnderline eUnderline,
1692                                         FontUnderline eOverline ) :
1693     MetaAction  ( META_TEXTLINE_ACTION ),
1694     maPos       ( rPos ),
1695     mnWidth     ( nWidth ),
1696     meStrikeout ( eStrikeout ),
1697     meUnderline ( eUnderline ),
1698     meOverline  ( eOverline )
1699 {
1700 }
1701 
1702 // ------------------------------------------------------------------------
1703 
1704 void MetaTextLineAction::Execute( OutputDevice* pOut )
1705 {
1706     pOut->DrawTextLine( maPos, mnWidth, meStrikeout, meUnderline, meOverline );
1707 }
1708 
1709 // ------------------------------------------------------------------------
1710 
1711 MetaAction* MetaTextLineAction::Clone()
1712 {
1713     MetaAction* pClone = (MetaAction*)new MetaTextLineAction( *this );
1714     pClone->ResetRefCount();
1715     return pClone;
1716 }
1717 
1718 // ------------------------------------------------------------------------
1719 
1720 void MetaTextLineAction::Move( long nHorzMove, long nVertMove )
1721 {
1722     maPos.Move( nHorzMove, nVertMove );
1723 }
1724 
1725 // ------------------------------------------------------------------------
1726 
1727 void MetaTextLineAction::Scale( double fScaleX, double fScaleY )
1728 {
1729     ImplScalePoint( maPos, fScaleX, fScaleY );
1730     mnWidth = FRound( mnWidth * fabs(fScaleX) );
1731 }
1732 
1733 // ------------------------------------------------------------------------
1734 
1735 sal_Bool MetaTextLineAction::Compare( const MetaAction& rMetaAction ) const
1736 {
1737     return ( maPos == ((MetaTextLineAction&)rMetaAction).maPos ) &&
1738            ( mnWidth == ((MetaTextLineAction&)rMetaAction).mnWidth ) &&
1739            ( meStrikeout == ((MetaTextLineAction&)rMetaAction).meStrikeout ) &&
1740            ( meUnderline == ((MetaTextLineAction&)rMetaAction).meUnderline ) &&
1741            ( meOverline  == ((MetaTextLineAction&)rMetaAction).meOverline );
1742 }
1743 
1744 // ------------------------------------------------------------------------
1745 
1746 void MetaTextLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1747 {
1748     WRITE_BASE_COMPAT( rOStm, 2, pData );
1749 
1750     rOStm << maPos;
1751     rOStm << mnWidth;
1752     rOStm << static_cast<sal_uInt32>(meStrikeout);
1753     rOStm << static_cast<sal_uInt32>(meUnderline);
1754     // new in version 2
1755     rOStm << static_cast<sal_uInt32>(meOverline);
1756 }
1757 
1758 // ------------------------------------------------------------------------
1759 
1760 void MetaTextLineAction::Read( SvStream& rIStm, ImplMetaReadData* )
1761 {
1762     COMPAT( rIStm );
1763 
1764     sal_uInt32 nTemp;
1765     rIStm >> maPos;
1766     rIStm >> mnWidth;
1767     rIStm >> nTemp;
1768     meStrikeout = (FontStrikeout)nTemp;
1769     rIStm >> nTemp;
1770     meUnderline = (FontUnderline)nTemp;
1771     if ( aCompat.GetVersion() >= 2 ) {
1772         rIStm >> nTemp;
1773         meUnderline = (FontUnderline)nTemp;
1774     }
1775 }
1776 
1777 // ========================================================================
1778 
1779 IMPL_META_ACTION( Bmp, META_BMP_ACTION )
1780 
1781 // ------------------------------------------------------------------------
1782 
1783 MetaBmpAction::MetaBmpAction( const Point& rPt, const Bitmap& rBmp ) :
1784     MetaAction  ( META_BMP_ACTION ),
1785     maBmp       ( rBmp ),
1786     maPt        ( rPt )
1787 {
1788 }
1789 
1790 // ------------------------------------------------------------------------
1791 
1792 void MetaBmpAction::Execute( OutputDevice* pOut )
1793 {
1794     pOut->DrawBitmap( maPt, maBmp );
1795 }
1796 
1797 // ------------------------------------------------------------------------
1798 
1799 MetaAction* MetaBmpAction::Clone()
1800 {
1801     MetaAction* pClone = (MetaAction*) new MetaBmpAction( *this );
1802     pClone->ResetRefCount();
1803     return pClone;
1804 }
1805 
1806 // ------------------------------------------------------------------------
1807 
1808 void MetaBmpAction::Move( long nHorzMove, long nVertMove )
1809 {
1810     maPt.Move( nHorzMove, nVertMove );
1811 }
1812 
1813 // ------------------------------------------------------------------------
1814 
1815 void MetaBmpAction::Scale( double fScaleX, double fScaleY )
1816 {
1817     ImplScalePoint( maPt, fScaleX, fScaleY );
1818 }
1819 
1820 // ------------------------------------------------------------------------
1821 
1822 sal_Bool MetaBmpAction::Compare( const MetaAction& rMetaAction ) const
1823 {
1824     return maBmp.IsEqual(((MetaBmpAction&)rMetaAction).maBmp ) &&
1825            ( maPt == ((MetaBmpAction&)rMetaAction).maPt );
1826 }
1827 
1828 // ------------------------------------------------------------------------
1829 
1830 void MetaBmpAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1831 {
1832     if( !!maBmp )
1833     {
1834         WRITE_BASE_COMPAT( rOStm, 1, pData );
1835         rOStm << maBmp << maPt;
1836     }
1837 }
1838 
1839 // ------------------------------------------------------------------------
1840 
1841 void MetaBmpAction::Read( SvStream& rIStm, ImplMetaReadData* )
1842 {
1843     COMPAT( rIStm );
1844     rIStm >> maBmp >> maPt;
1845 }
1846 
1847 // ========================================================================
1848 
1849 IMPL_META_ACTION( BmpScale, META_BMPSCALE_ACTION )
1850 
1851 // ------------------------------------------------------------------------
1852 
1853 MetaBmpScaleAction::MetaBmpScaleAction( const Point& rPt, const Size& rSz,
1854                                         const Bitmap& rBmp ) :
1855     MetaAction  ( META_BMPSCALE_ACTION ),
1856     maBmp       ( rBmp ),
1857     maPt        ( rPt ),
1858     maSz        ( rSz )
1859 {
1860 }
1861 
1862 // ------------------------------------------------------------------------
1863 
1864 void MetaBmpScaleAction::Execute( OutputDevice* pOut )
1865 {
1866     pOut->DrawBitmap( maPt, maSz, maBmp );
1867 }
1868 
1869 // ------------------------------------------------------------------------
1870 
1871 MetaAction* MetaBmpScaleAction::Clone()
1872 {
1873     MetaAction* pClone = (MetaAction*) new MetaBmpScaleAction( *this );
1874     pClone->ResetRefCount();
1875     return pClone;
1876 }
1877 
1878 // ------------------------------------------------------------------------
1879 
1880 void MetaBmpScaleAction::Move( long nHorzMove, long nVertMove )
1881 {
1882     maPt.Move( nHorzMove, nVertMove );
1883 }
1884 
1885 // ------------------------------------------------------------------------
1886 
1887 void MetaBmpScaleAction::Scale( double fScaleX, double fScaleY )
1888 {
1889     Rectangle aRectangle(maPt, maSz);
1890     ImplScaleRect( aRectangle, fScaleX, fScaleY );
1891     maPt = aRectangle.TopLeft();
1892     maSz = aRectangle.GetSize();
1893 }
1894 
1895 // ------------------------------------------------------------------------
1896 
1897 sal_Bool MetaBmpScaleAction::Compare( const MetaAction& rMetaAction ) const
1898 {
1899     return ( maBmp.IsEqual(((MetaBmpScaleAction&)rMetaAction).maBmp )) &&
1900            ( maPt == ((MetaBmpScaleAction&)rMetaAction).maPt ) &&
1901            ( maSz == ((MetaBmpScaleAction&)rMetaAction).maSz );
1902 }
1903 
1904 // ------------------------------------------------------------------------
1905 
1906 void MetaBmpScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1907 {
1908     if( !!maBmp )
1909     {
1910         WRITE_BASE_COMPAT( rOStm, 1, pData );
1911         rOStm << maBmp << maPt << maSz;
1912     }
1913 }
1914 
1915 // ------------------------------------------------------------------------
1916 
1917 void MetaBmpScaleAction::Read( SvStream& rIStm, ImplMetaReadData* )
1918 {
1919     COMPAT( rIStm );
1920     rIStm >> maBmp >> maPt >> maSz;
1921 }
1922 
1923 // ========================================================================
1924 
1925 IMPL_META_ACTION( BmpScalePart, META_BMPSCALEPART_ACTION )
1926 
1927 // ------------------------------------------------------------------------
1928 
1929 MetaBmpScalePartAction::MetaBmpScalePartAction( const Point& rDstPt, const Size& rDstSz,
1930                                                 const Point& rSrcPt, const Size& rSrcSz,
1931                                                 const Bitmap& rBmp ) :
1932     MetaAction  ( META_BMPSCALEPART_ACTION ),
1933     maBmp       ( rBmp ),
1934     maDstPt     ( rDstPt ),
1935     maDstSz     ( rDstSz ),
1936     maSrcPt     ( rSrcPt ),
1937     maSrcSz     ( rSrcSz )
1938 {
1939 }
1940 
1941 // ------------------------------------------------------------------------
1942 
1943 void MetaBmpScalePartAction::Execute( OutputDevice* pOut )
1944 {
1945     pOut->DrawBitmap( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp );
1946 }
1947 
1948 // ------------------------------------------------------------------------
1949 
1950 MetaAction* MetaBmpScalePartAction::Clone()
1951 {
1952     MetaAction* pClone = (MetaAction*) new MetaBmpScalePartAction( *this );
1953     pClone->ResetRefCount();
1954     return pClone;
1955 }
1956 
1957 // ------------------------------------------------------------------------
1958 
1959 void MetaBmpScalePartAction::Move( long nHorzMove, long nVertMove )
1960 {
1961     maDstPt.Move( nHorzMove, nVertMove );
1962 }
1963 
1964 // ------------------------------------------------------------------------
1965 
1966 void MetaBmpScalePartAction::Scale( double fScaleX, double fScaleY )
1967 {
1968     Rectangle aRectangle(maDstPt, maDstSz);
1969     ImplScaleRect( aRectangle, fScaleX, fScaleY );
1970     maDstPt = aRectangle.TopLeft();
1971     maDstSz = aRectangle.GetSize();
1972 }
1973 
1974 // ------------------------------------------------------------------------
1975 
1976 sal_Bool MetaBmpScalePartAction::Compare( const MetaAction& rMetaAction ) const
1977 {
1978     return ( maBmp.IsEqual(((MetaBmpScalePartAction&)rMetaAction).maBmp )) &&
1979            ( maDstPt == ((MetaBmpScalePartAction&)rMetaAction).maDstPt ) &&
1980            ( maDstSz == ((MetaBmpScalePartAction&)rMetaAction).maDstSz ) &&
1981            ( maSrcPt == ((MetaBmpScalePartAction&)rMetaAction).maSrcPt ) &&
1982            ( maSrcSz == ((MetaBmpScalePartAction&)rMetaAction).maSrcSz );
1983 }
1984 
1985 // ------------------------------------------------------------------------
1986 
1987 void MetaBmpScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
1988 {
1989     if( !!maBmp )
1990     {
1991         WRITE_BASE_COMPAT( rOStm, 1, pData );
1992         rOStm << maBmp << maDstPt << maDstSz << maSrcPt << maSrcSz;
1993     }
1994 }
1995 
1996 // ------------------------------------------------------------------------
1997 
1998 void MetaBmpScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* )
1999 {
2000     COMPAT( rIStm );
2001     rIStm >> maBmp >> maDstPt >> maDstSz >> maSrcPt >> maSrcSz;
2002 }
2003 
2004 // ========================================================================
2005 
2006 IMPL_META_ACTION( BmpEx, META_BMPEX_ACTION )
2007 
2008 // ------------------------------------------------------------------------
2009 
2010 MetaBmpExAction::MetaBmpExAction( const Point& rPt, const BitmapEx& rBmpEx ) :
2011     MetaAction  ( META_BMPEX_ACTION ),
2012     maBmpEx     ( rBmpEx ),
2013     maPt        ( rPt )
2014 {
2015 }
2016 
2017 // ------------------------------------------------------------------------
2018 
2019 void MetaBmpExAction::Execute( OutputDevice* pOut )
2020 {
2021     pOut->DrawBitmapEx( maPt, maBmpEx );
2022 }
2023 
2024 // ------------------------------------------------------------------------
2025 
2026 MetaAction* MetaBmpExAction::Clone()
2027 {
2028     MetaBmpExAction* pClone = new MetaBmpExAction( *this );
2029     pClone->ResetRefCount();
2030     return pClone;
2031 }
2032 
2033 // ------------------------------------------------------------------------
2034 
2035 void MetaBmpExAction::Move( long nHorzMove, long nVertMove )
2036 {
2037     maPt.Move( nHorzMove, nVertMove );
2038 }
2039 
2040 // ------------------------------------------------------------------------
2041 
2042 void MetaBmpExAction::Scale( double fScaleX, double fScaleY )
2043 {
2044     ImplScalePoint( maPt, fScaleX, fScaleY );
2045 }
2046 
2047 // ------------------------------------------------------------------------
2048 
2049 sal_Bool MetaBmpExAction::Compare( const MetaAction& rMetaAction ) const
2050 {
2051     return ( maBmpEx.IsEqual(((MetaBmpExAction&)rMetaAction).maBmpEx )) &&
2052            ( maPt == ((MetaBmpExAction&)rMetaAction).maPt );
2053 }
2054 
2055 // ------------------------------------------------------------------------
2056 
2057 void MetaBmpExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2058 {
2059     if( !!maBmpEx.GetBitmap() )
2060     {
2061         WRITE_BASE_COMPAT( rOStm, 1, pData );
2062         rOStm << maBmpEx << maPt;
2063     }
2064 }
2065 
2066 // ------------------------------------------------------------------------
2067 
2068 void MetaBmpExAction::Read( SvStream& rIStm, ImplMetaReadData* )
2069 {
2070     COMPAT( rIStm );
2071     rIStm >> maBmpEx >> maPt;
2072 }
2073 
2074 // ========================================================================
2075 
2076 IMPL_META_ACTION( BmpExScale, META_BMPEXSCALE_ACTION )
2077 
2078 // ------------------------------------------------------------------------
2079 
2080 MetaBmpExScaleAction::MetaBmpExScaleAction( const Point& rPt, const Size& rSz,
2081                                             const BitmapEx& rBmpEx ) :
2082     MetaAction  ( META_BMPEXSCALE_ACTION ),
2083     maBmpEx     ( rBmpEx ),
2084     maPt        ( rPt ),
2085     maSz        ( rSz )
2086 {
2087 }
2088 
2089 // ------------------------------------------------------------------------
2090 
2091 void MetaBmpExScaleAction::Execute( OutputDevice* pOut )
2092 {
2093     pOut->DrawBitmapEx( maPt, maSz, maBmpEx );
2094 }
2095 
2096 // ------------------------------------------------------------------------
2097 
2098 MetaAction* MetaBmpExScaleAction::Clone()
2099 {
2100     MetaAction* pClone = (MetaAction*) new MetaBmpExScaleAction( *this );
2101     pClone->ResetRefCount();
2102     return pClone;
2103 }
2104 
2105 // ------------------------------------------------------------------------
2106 
2107 void MetaBmpExScaleAction::Move( long nHorzMove, long nVertMove )
2108 {
2109     maPt.Move( nHorzMove, nVertMove );
2110 }
2111 
2112 // ------------------------------------------------------------------------
2113 
2114 void MetaBmpExScaleAction::Scale( double fScaleX, double fScaleY )
2115 {
2116     Rectangle aRectangle(maPt, maSz);
2117     ImplScaleRect( aRectangle, fScaleX, fScaleY );
2118     maPt = aRectangle.TopLeft();
2119     maSz = aRectangle.GetSize();
2120 }
2121 
2122 // ------------------------------------------------------------------------
2123 
2124 sal_Bool MetaBmpExScaleAction::Compare( const MetaAction& rMetaAction ) const
2125 {
2126     return ( maBmpEx.IsEqual(((MetaBmpExScaleAction&)rMetaAction).maBmpEx )) &&
2127            ( maPt == ((MetaBmpExScaleAction&)rMetaAction).maPt ) &&
2128            ( maSz == ((MetaBmpExScaleAction&)rMetaAction).maSz );
2129 }
2130 
2131 // ------------------------------------------------------------------------
2132 
2133 void MetaBmpExScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2134 {
2135     if( !!maBmpEx.GetBitmap() )
2136     {
2137         WRITE_BASE_COMPAT( rOStm, 1, pData );
2138         rOStm << maBmpEx << maPt << maSz;
2139     }
2140 }
2141 
2142 // ------------------------------------------------------------------------
2143 
2144 void MetaBmpExScaleAction::Read( SvStream& rIStm, ImplMetaReadData* )
2145 {
2146     COMPAT( rIStm );
2147     rIStm >> maBmpEx >> maPt >> maSz;
2148 }
2149 
2150 // ========================================================================
2151 
2152 IMPL_META_ACTION( BmpExScalePart, META_BMPEXSCALEPART_ACTION )
2153 
2154 // ------------------------------------------------------------------------
2155 
2156 MetaBmpExScalePartAction::MetaBmpExScalePartAction( const Point& rDstPt, const Size& rDstSz,
2157                                                     const Point& rSrcPt, const Size& rSrcSz,
2158                                                     const BitmapEx& rBmpEx ) :
2159     MetaAction  ( META_BMPEXSCALEPART_ACTION ),
2160     maBmpEx     ( rBmpEx ),
2161     maDstPt     ( rDstPt ),
2162     maDstSz     ( rDstSz ),
2163     maSrcPt     ( rSrcPt ),
2164     maSrcSz     ( rSrcSz )
2165 {
2166 }
2167 
2168 // ------------------------------------------------------------------------
2169 
2170 void MetaBmpExScalePartAction::Execute( OutputDevice* pOut )
2171 {
2172     pOut->DrawBitmapEx( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmpEx );
2173 }
2174 
2175 // ------------------------------------------------------------------------
2176 
2177 MetaAction* MetaBmpExScalePartAction::Clone()
2178 {
2179     MetaAction* pClone = (MetaAction*) new MetaBmpExScalePartAction( *this );
2180     pClone->ResetRefCount();
2181     return pClone;
2182 }
2183 
2184 // ------------------------------------------------------------------------
2185 
2186 void MetaBmpExScalePartAction::Move( long nHorzMove, long nVertMove )
2187 {
2188     maDstPt.Move( nHorzMove, nVertMove );
2189 }
2190 
2191 // ------------------------------------------------------------------------
2192 
2193 void MetaBmpExScalePartAction::Scale( double fScaleX, double fScaleY )
2194 {
2195     Rectangle aRectangle(maDstPt, maDstSz);
2196     ImplScaleRect( aRectangle, fScaleX, fScaleY );
2197     maDstPt = aRectangle.TopLeft();
2198     maDstSz = aRectangle.GetSize();
2199 }
2200 
2201 // ------------------------------------------------------------------------
2202 
2203 sal_Bool MetaBmpExScalePartAction::Compare( const MetaAction& rMetaAction ) const
2204 {
2205     return ( maBmpEx.IsEqual(((MetaBmpExScalePartAction&)rMetaAction).maBmpEx )) &&
2206            ( maDstPt == ((MetaBmpExScalePartAction&)rMetaAction).maDstPt ) &&
2207            ( maDstSz == ((MetaBmpExScalePartAction&)rMetaAction).maDstSz ) &&
2208            ( maSrcPt == ((MetaBmpExScalePartAction&)rMetaAction).maSrcPt ) &&
2209            ( maSrcSz == ((MetaBmpExScalePartAction&)rMetaAction).maSrcSz );
2210 }
2211 
2212 // ------------------------------------------------------------------------
2213 
2214 void MetaBmpExScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2215 {
2216     if( !!maBmpEx.GetBitmap() )
2217     {
2218         WRITE_BASE_COMPAT( rOStm, 1, pData );
2219         rOStm << maBmpEx << maDstPt << maDstSz << maSrcPt << maSrcSz;
2220     }
2221 }
2222 
2223 // ------------------------------------------------------------------------
2224 
2225 void MetaBmpExScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* )
2226 {
2227     COMPAT( rIStm );
2228     rIStm >> maBmpEx >> maDstPt >> maDstSz >> maSrcPt >> maSrcSz;
2229 }
2230 
2231 // ========================================================================
2232 
2233 IMPL_META_ACTION( Mask, META_MASK_ACTION )
2234 
2235 // ------------------------------------------------------------------------
2236 
2237 MetaMaskAction::MetaMaskAction( const Point& rPt,
2238                                 const Bitmap& rBmp,
2239                                 const Color& rColor ) :
2240     MetaAction  ( META_MASK_ACTION ),
2241     maBmp       ( rBmp ),
2242     maColor     ( rColor ),
2243     maPt        ( rPt )
2244 {
2245 }
2246 
2247 // ------------------------------------------------------------------------
2248 
2249 void MetaMaskAction::Execute( OutputDevice* pOut )
2250 {
2251     pOut->DrawMask( maPt, maBmp, maColor );
2252 }
2253 
2254 // ------------------------------------------------------------------------
2255 
2256 MetaAction* MetaMaskAction::Clone()
2257 {
2258     MetaAction* pClone = (MetaAction*) new MetaMaskAction( *this );
2259     pClone->ResetRefCount();
2260     return pClone;
2261 }
2262 
2263 // ------------------------------------------------------------------------
2264 
2265 void MetaMaskAction::Move( long nHorzMove, long nVertMove )
2266 {
2267     maPt.Move( nHorzMove, nVertMove );
2268 }
2269 
2270 // ------------------------------------------------------------------------
2271 
2272 void MetaMaskAction::Scale( double fScaleX, double fScaleY )
2273 {
2274     ImplScalePoint( maPt, fScaleX, fScaleY );
2275 }
2276 
2277 // ------------------------------------------------------------------------
2278 
2279 sal_Bool MetaMaskAction::Compare( const MetaAction& rMetaAction ) const
2280 {
2281     return ( maBmp.IsEqual(((MetaMaskAction&)rMetaAction).maBmp )) &&
2282            ( maColor == ((MetaMaskAction&)rMetaAction).maColor ) &&
2283            ( maPt == ((MetaMaskAction&)rMetaAction).maPt );
2284 }
2285 
2286 // ------------------------------------------------------------------------
2287 
2288 void MetaMaskAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2289 {
2290     if( !!maBmp )
2291     {
2292         WRITE_BASE_COMPAT( rOStm, 1, pData );
2293         rOStm << maBmp << maPt;
2294     }
2295 }
2296 
2297 // ------------------------------------------------------------------------
2298 
2299 void MetaMaskAction::Read( SvStream& rIStm, ImplMetaReadData* )
2300 {
2301     COMPAT( rIStm );
2302     rIStm >> maBmp >> maPt;
2303 }
2304 
2305 // ========================================================================
2306 
2307 IMPL_META_ACTION( MaskScale, META_MASKSCALE_ACTION )
2308 
2309 // ------------------------------------------------------------------------
2310 
2311 MetaMaskScaleAction::MetaMaskScaleAction( const Point& rPt, const Size& rSz,
2312                                           const Bitmap& rBmp,
2313                                           const Color& rColor ) :
2314     MetaAction  ( META_MASKSCALE_ACTION ),
2315     maBmp       ( rBmp ),
2316     maColor     ( rColor ),
2317     maPt        ( rPt ),
2318     maSz        ( rSz )
2319 {
2320 }
2321 
2322 // ------------------------------------------------------------------------
2323 
2324 void MetaMaskScaleAction::Execute( OutputDevice* pOut )
2325 {
2326     pOut->DrawMask( maPt, maSz, maBmp, maColor );
2327 }
2328 
2329 // ------------------------------------------------------------------------
2330 
2331 MetaAction* MetaMaskScaleAction::Clone()
2332 {
2333     MetaAction* pClone = (MetaAction*) new MetaMaskScaleAction( *this );
2334     pClone->ResetRefCount();
2335     return pClone;
2336 }
2337 
2338 // ------------------------------------------------------------------------
2339 
2340 void MetaMaskScaleAction::Move( long nHorzMove, long nVertMove )
2341 {
2342     maPt.Move( nHorzMove, nVertMove );
2343 }
2344 
2345 // ------------------------------------------------------------------------
2346 
2347 void MetaMaskScaleAction::Scale( double fScaleX, double fScaleY )
2348 {
2349     Rectangle aRectangle(maPt, maSz);
2350     ImplScaleRect( aRectangle, fScaleX, fScaleY );
2351     maPt = aRectangle.TopLeft();
2352     maSz = aRectangle.GetSize();
2353 }
2354 
2355 // ------------------------------------------------------------------------
2356 
2357 sal_Bool MetaMaskScaleAction::Compare( const MetaAction& rMetaAction ) const
2358 {
2359     return ( maBmp.IsEqual(((MetaMaskScaleAction&)rMetaAction).maBmp )) &&
2360            ( maColor == ((MetaMaskScaleAction&)rMetaAction).maColor ) &&
2361            ( maPt == ((MetaMaskScaleAction&)rMetaAction).maPt ) &&
2362            ( maSz == ((MetaMaskScaleAction&)rMetaAction).maSz );
2363 }
2364 
2365 // ------------------------------------------------------------------------
2366 
2367 void MetaMaskScaleAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2368 {
2369     if( !!maBmp )
2370     {
2371         WRITE_BASE_COMPAT( rOStm, 1, pData );
2372         rOStm << maBmp << maPt << maSz;
2373     }
2374 }
2375 
2376 // ------------------------------------------------------------------------
2377 
2378 void MetaMaskScaleAction::Read( SvStream& rIStm, ImplMetaReadData* )
2379 {
2380     COMPAT( rIStm );
2381     rIStm >> maBmp >> maPt >> maSz;
2382 }
2383 
2384 // ========================================================================
2385 
2386 IMPL_META_ACTION( MaskScalePart, META_MASKSCALEPART_ACTION )
2387 
2388 // ------------------------------------------------------------------------
2389 
2390 MetaMaskScalePartAction::MetaMaskScalePartAction( const Point& rDstPt, const Size& rDstSz,
2391                                                   const Point& rSrcPt, const Size& rSrcSz,
2392                                                   const Bitmap& rBmp,
2393                                                   const Color& rColor ) :
2394     MetaAction  ( META_MASKSCALEPART_ACTION ),
2395     maBmp       ( rBmp ),
2396     maColor     ( rColor ),
2397     maDstPt     ( rDstPt ),
2398     maDstSz     ( rDstSz ),
2399     maSrcPt     ( rSrcPt ),
2400     maSrcSz     ( rSrcSz )
2401 {
2402 }
2403 
2404 // ------------------------------------------------------------------------
2405 
2406 void MetaMaskScalePartAction::Execute( OutputDevice* pOut )
2407 {
2408     pOut->DrawMask( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp, maColor );
2409 }
2410 
2411 // ------------------------------------------------------------------------
2412 
2413 MetaAction* MetaMaskScalePartAction::Clone()
2414 {
2415     MetaAction* pClone = (MetaAction*) new MetaMaskScalePartAction( *this );
2416     pClone->ResetRefCount();
2417     return pClone;
2418 }
2419 
2420 // ------------------------------------------------------------------------
2421 
2422 void MetaMaskScalePartAction::Move( long nHorzMove, long nVertMove )
2423 {
2424     maDstPt.Move( nHorzMove, nVertMove );
2425 }
2426 
2427 // ------------------------------------------------------------------------
2428 
2429 void MetaMaskScalePartAction::Scale( double fScaleX, double fScaleY )
2430 {
2431     Rectangle aRectangle(maDstPt, maDstSz);
2432     ImplScaleRect( aRectangle, fScaleX, fScaleY );
2433     maDstPt = aRectangle.TopLeft();
2434     maDstSz = aRectangle.GetSize();
2435 }
2436 
2437 // ------------------------------------------------------------------------
2438 
2439 sal_Bool MetaMaskScalePartAction::Compare( const MetaAction& rMetaAction ) const
2440 {
2441     return ( maBmp.IsEqual(((MetaMaskScalePartAction&)rMetaAction).maBmp )) &&
2442            ( maColor == ((MetaMaskScalePartAction&)rMetaAction).maColor ) &&
2443            ( maDstPt == ((MetaMaskScalePartAction&)rMetaAction).maDstPt ) &&
2444            ( maDstSz == ((MetaMaskScalePartAction&)rMetaAction).maDstSz ) &&
2445            ( maSrcPt == ((MetaMaskScalePartAction&)rMetaAction).maSrcPt ) &&
2446            ( maSrcSz == ((MetaMaskScalePartAction&)rMetaAction).maSrcSz );
2447 }
2448 
2449 // ------------------------------------------------------------------------
2450 
2451 void MetaMaskScalePartAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2452 {
2453     if( !!maBmp )
2454     {
2455         WRITE_BASE_COMPAT( rOStm, 1, pData );
2456         rOStm << maBmp;
2457         maColor.Write( rOStm, sal_True );
2458         rOStm << maDstPt << maDstSz << maSrcPt << maSrcSz;
2459     }
2460 }
2461 
2462 // ------------------------------------------------------------------------
2463 
2464 void MetaMaskScalePartAction::Read( SvStream& rIStm, ImplMetaReadData* )
2465 {
2466     COMPAT( rIStm );
2467     rIStm >> maBmp;
2468     maColor.Read( rIStm, sal_True );
2469     rIStm >> maDstPt >> maDstSz >> maSrcPt >> maSrcSz;
2470 }
2471 
2472 // ========================================================================
2473 
2474 IMPL_META_ACTION( Gradient, META_GRADIENT_ACTION )
2475 
2476 // ------------------------------------------------------------------------
2477 
2478 MetaGradientAction::MetaGradientAction( const Rectangle& rRect, const Gradient& rGradient ) :
2479     MetaAction  ( META_GRADIENT_ACTION ),
2480     maRect      ( rRect ),
2481     maGradient  ( rGradient )
2482 {
2483 }
2484 
2485 // ------------------------------------------------------------------------
2486 
2487 void MetaGradientAction::Execute( OutputDevice* pOut )
2488 {
2489     pOut->DrawGradient( maRect, maGradient );
2490 }
2491 
2492 // ------------------------------------------------------------------------
2493 
2494 MetaAction* MetaGradientAction::Clone()
2495 {
2496     MetaAction* pClone = (MetaAction*) new MetaGradientAction( *this );
2497     pClone->ResetRefCount();
2498     return pClone;
2499 }
2500 
2501 // ------------------------------------------------------------------------
2502 
2503 void MetaGradientAction::Move( long nHorzMove, long nVertMove )
2504 {
2505     maRect.Move( nHorzMove, nVertMove );
2506 }
2507 
2508 // ------------------------------------------------------------------------
2509 
2510 void MetaGradientAction::Scale( double fScaleX, double fScaleY )
2511 {
2512     ImplScaleRect( maRect, fScaleX, fScaleY );
2513 }
2514 
2515 // ------------------------------------------------------------------------
2516 
2517 sal_Bool MetaGradientAction::Compare( const MetaAction& rMetaAction ) const
2518 {
2519     return ( maRect == ((MetaGradientAction&)rMetaAction).maRect ) &&
2520            ( maGradient == ((MetaGradientAction&)rMetaAction).maGradient );
2521 }
2522 
2523 // ------------------------------------------------------------------------
2524 
2525 void MetaGradientAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2526 {
2527     WRITE_BASE_COMPAT( rOStm, 1, pData );
2528     rOStm << maRect << maGradient;
2529 }
2530 
2531 // ------------------------------------------------------------------------
2532 
2533 void MetaGradientAction::Read( SvStream& rIStm, ImplMetaReadData* )
2534 {
2535     COMPAT( rIStm );
2536     rIStm >> maRect >> maGradient;
2537 }
2538 
2539 // ========================================================================
2540 
2541 MetaGradientExAction::MetaGradientExAction() :
2542     MetaAction  ( META_GRADIENTEX_ACTION )
2543 {
2544 }
2545 
2546 // ------------------------------------------------------------------------
2547 
2548 MetaGradientExAction::MetaGradientExAction( const PolyPolygon& rPolyPoly, const Gradient& rGradient ) :
2549     MetaAction  ( META_GRADIENTEX_ACTION ),
2550     maPolyPoly  ( rPolyPoly ),
2551     maGradient  ( rGradient )
2552 {
2553 }
2554 
2555 // ------------------------------------------------------------------------
2556 
2557 MetaGradientExAction::~MetaGradientExAction()
2558 {
2559 }
2560 
2561 // ------------------------------------------------------------------------
2562 
2563 void MetaGradientExAction::Execute( OutputDevice* pOut )
2564 {
2565     if( pOut->GetConnectMetaFile() )
2566     {
2567         Duplicate();
2568         pOut->GetConnectMetaFile()->AddAction( this );
2569     }
2570 }
2571 
2572 // ------------------------------------------------------------------------
2573 
2574 MetaAction* MetaGradientExAction::Clone()
2575 {
2576     MetaAction* pClone = (MetaAction*) new MetaGradientExAction( *this );
2577     pClone->ResetRefCount();
2578     return pClone;
2579 }
2580 
2581 // ------------------------------------------------------------------------
2582 
2583 void MetaGradientExAction::Move( long nHorzMove, long nVertMove )
2584 {
2585     maPolyPoly.Move( nHorzMove, nVertMove );
2586 }
2587 
2588 // ------------------------------------------------------------------------
2589 
2590 void MetaGradientExAction::Scale( double fScaleX, double fScaleY )
2591 {
2592     for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
2593         ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
2594 }
2595 
2596 // ------------------------------------------------------------------------
2597 
2598 sal_Bool MetaGradientExAction::Compare( const MetaAction& rMetaAction ) const
2599 {
2600     return ( maPolyPoly == ((MetaGradientExAction&)rMetaAction).maPolyPoly ) &&
2601            ( maGradient == ((MetaGradientExAction&)rMetaAction).maGradient );
2602 }
2603 
2604 // ------------------------------------------------------------------------
2605 
2606 void MetaGradientExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2607 {
2608     WRITE_BASE_COMPAT( rOStm, 1, pData );
2609 
2610     // #i105373# see comment at MetaTransparentAction::Write
2611     PolyPolygon aNoCurvePolyPolygon;
2612     maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
2613 
2614     rOStm << aNoCurvePolyPolygon;
2615     rOStm << maGradient;
2616 }
2617 
2618 // ------------------------------------------------------------------------
2619 
2620 void MetaGradientExAction::Read( SvStream& rIStm, ImplMetaReadData* )
2621 {
2622     COMPAT( rIStm );
2623     rIStm >> maPolyPoly >> maGradient;
2624 }
2625 
2626 // ========================================================================
2627 
2628 IMPL_META_ACTION( Hatch, META_HATCH_ACTION )
2629 
2630 // ------------------------------------------------------------------------
2631 
2632 MetaHatchAction::MetaHatchAction( const PolyPolygon& rPolyPoly, const Hatch& rHatch ) :
2633     MetaAction  ( META_HATCH_ACTION ),
2634     maPolyPoly  ( rPolyPoly ),
2635     maHatch     ( rHatch )
2636 {
2637 }
2638 
2639 // ------------------------------------------------------------------------
2640 
2641 void MetaHatchAction::Execute( OutputDevice* pOut )
2642 {
2643     pOut->DrawHatch( maPolyPoly, maHatch );
2644 }
2645 
2646 // ------------------------------------------------------------------------
2647 
2648 MetaAction* MetaHatchAction::Clone()
2649 {
2650     MetaAction* pClone = (MetaAction*) new MetaHatchAction( *this );
2651     pClone->ResetRefCount();
2652     return pClone;
2653 }
2654 
2655 // ------------------------------------------------------------------------
2656 
2657 void MetaHatchAction::Move( long nHorzMove, long nVertMove )
2658 {
2659     maPolyPoly.Move( nHorzMove, nVertMove );
2660 }
2661 
2662 // ------------------------------------------------------------------------
2663 
2664 void MetaHatchAction::Scale( double fScaleX, double fScaleY )
2665 {
2666     for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
2667         ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
2668 }
2669 
2670 // ------------------------------------------------------------------------
2671 
2672 sal_Bool MetaHatchAction::Compare( const MetaAction& rMetaAction ) const
2673 {
2674     return ( maPolyPoly == ((MetaHatchAction&)rMetaAction).maPolyPoly ) &&
2675            ( maHatch == ((MetaHatchAction&)rMetaAction).maHatch );
2676 }
2677 
2678 // ------------------------------------------------------------------------
2679 
2680 void MetaHatchAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2681 {
2682     WRITE_BASE_COMPAT( rOStm, 1, pData );
2683 
2684     // #i105373# see comment at MetaTransparentAction::Write
2685     PolyPolygon aNoCurvePolyPolygon;
2686     maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
2687 
2688     rOStm << aNoCurvePolyPolygon;
2689     rOStm << maHatch;
2690 }
2691 
2692 // ------------------------------------------------------------------------
2693 
2694 void MetaHatchAction::Read( SvStream& rIStm, ImplMetaReadData* )
2695 {
2696     COMPAT( rIStm );
2697     rIStm >> maPolyPoly >> maHatch;
2698 }
2699 
2700 // ========================================================================
2701 
2702 IMPL_META_ACTION( Wallpaper, META_WALLPAPER_ACTION )
2703 
2704 // ------------------------------------------------------------------------
2705 
2706 MetaWallpaperAction::MetaWallpaperAction( const Rectangle& rRect,
2707                                           const Wallpaper& rPaper ) :
2708     MetaAction  ( META_WALLPAPER_ACTION ),
2709     maRect      ( rRect ),
2710     maWallpaper ( rPaper )
2711 {
2712 }
2713 
2714 // ------------------------------------------------------------------------
2715 
2716 void MetaWallpaperAction::Execute( OutputDevice* pOut )
2717 {
2718     pOut->DrawWallpaper( maRect, maWallpaper );
2719 }
2720 
2721 // ------------------------------------------------------------------------
2722 
2723 MetaAction* MetaWallpaperAction::Clone()
2724 {
2725     MetaAction* pClone = (MetaAction*) new MetaWallpaperAction( *this );
2726     pClone->ResetRefCount();
2727     return pClone;
2728 }
2729 
2730 // ------------------------------------------------------------------------
2731 
2732 void MetaWallpaperAction::Move( long nHorzMove, long nVertMove )
2733 {
2734     maRect.Move( nHorzMove, nVertMove );
2735 }
2736 
2737 // ------------------------------------------------------------------------
2738 
2739 void MetaWallpaperAction::Scale( double fScaleX, double fScaleY )
2740 {
2741     ImplScaleRect( maRect, fScaleX, fScaleY );
2742 }
2743 
2744 // ------------------------------------------------------------------------
2745 
2746 sal_Bool MetaWallpaperAction::Compare( const MetaAction& rMetaAction ) const
2747 {
2748     return ( maRect == ((MetaWallpaperAction&)rMetaAction).maRect ) &&
2749            ( maWallpaper == ((MetaWallpaperAction&)rMetaAction).maWallpaper );
2750 }
2751 
2752 // ------------------------------------------------------------------------
2753 
2754 void MetaWallpaperAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2755 {
2756     WRITE_BASE_COMPAT( rOStm, 1, pData );
2757     rOStm << maWallpaper;
2758 }
2759 
2760 // ------------------------------------------------------------------------
2761 
2762 void MetaWallpaperAction::Read( SvStream& rIStm, ImplMetaReadData* )
2763 {
2764     COMPAT( rIStm );
2765     rIStm >> maWallpaper;
2766 }
2767 
2768 // ========================================================================
2769 
2770 IMPL_META_ACTION( ClipRegion, META_CLIPREGION_ACTION )
2771 
2772 // ------------------------------------------------------------------------
2773 
2774 MetaClipRegionAction::MetaClipRegionAction( const Region& rRegion, sal_Bool bClip ) :
2775     MetaAction  ( META_CLIPREGION_ACTION ),
2776     maRegion    ( rRegion ),
2777     mbClip      ( bClip )
2778 {
2779 }
2780 
2781 // ------------------------------------------------------------------------
2782 
2783 void MetaClipRegionAction::Execute( OutputDevice* pOut )
2784 {
2785     if( mbClip )
2786         pOut->SetClipRegion( maRegion );
2787     else
2788         pOut->SetClipRegion();
2789 }
2790 
2791 // ------------------------------------------------------------------------
2792 
2793 MetaAction* MetaClipRegionAction::Clone()
2794 {
2795     MetaAction* pClone = (MetaAction*) new MetaClipRegionAction( *this );
2796     pClone->ResetRefCount();
2797     return pClone;
2798 }
2799 
2800 // ------------------------------------------------------------------------
2801 
2802 void MetaClipRegionAction::Move( long nHorzMove, long nVertMove )
2803 {
2804     maRegion.Move( nHorzMove, nVertMove );
2805 }
2806 
2807 // ------------------------------------------------------------------------
2808 
2809 void MetaClipRegionAction::Scale( double fScaleX, double fScaleY )
2810 {
2811     maRegion.Scale( fScaleX, fScaleY );
2812 }
2813 
2814 // ------------------------------------------------------------------------
2815 
2816 sal_Bool MetaClipRegionAction::Compare( const MetaAction& rMetaAction ) const
2817 {
2818     return ( maRegion == ((MetaClipRegionAction&)rMetaAction).maRegion ) &&
2819            ( mbClip == ((MetaClipRegionAction&)rMetaAction).mbClip );
2820 }
2821 
2822 // ------------------------------------------------------------------------
2823 
2824 void MetaClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2825 {
2826     WRITE_BASE_COMPAT( rOStm, 1, pData );
2827     rOStm << maRegion << mbClip;
2828 }
2829 
2830 // ------------------------------------------------------------------------
2831 
2832 void MetaClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* )
2833 {
2834     COMPAT( rIStm );
2835     rIStm >> maRegion >> mbClip;
2836 }
2837 
2838 // ========================================================================
2839 
2840 IMPL_META_ACTION( ISectRectClipRegion, META_ISECTRECTCLIPREGION_ACTION )
2841 
2842 // ------------------------------------------------------------------------
2843 
2844 MetaISectRectClipRegionAction::MetaISectRectClipRegionAction( const Rectangle& rRect ) :
2845     MetaAction  ( META_ISECTRECTCLIPREGION_ACTION ),
2846     maRect      ( rRect )
2847 {
2848 }
2849 
2850 // ------------------------------------------------------------------------
2851 
2852 void MetaISectRectClipRegionAction::Execute( OutputDevice* pOut )
2853 {
2854     pOut->IntersectClipRegion( maRect );
2855 }
2856 
2857 // ------------------------------------------------------------------------
2858 
2859 MetaAction* MetaISectRectClipRegionAction::Clone()
2860 {
2861     MetaAction* pClone = (MetaAction*) new MetaISectRectClipRegionAction( *this );
2862     pClone->ResetRefCount();
2863     return pClone;
2864 }
2865 
2866 // ------------------------------------------------------------------------
2867 
2868 void MetaISectRectClipRegionAction::Move( long nHorzMove, long nVertMove )
2869 {
2870     maRect.Move( nHorzMove, nVertMove );
2871 }
2872 
2873 // ------------------------------------------------------------------------
2874 
2875 void MetaISectRectClipRegionAction::Scale( double fScaleX, double fScaleY )
2876 {
2877     ImplScaleRect( maRect, fScaleX, fScaleY );
2878 }
2879 
2880 // ------------------------------------------------------------------------
2881 
2882 sal_Bool MetaISectRectClipRegionAction::Compare( const MetaAction& rMetaAction ) const
2883 {
2884     return maRect == ((MetaISectRectClipRegionAction&)rMetaAction).maRect;
2885 }
2886 
2887 // ------------------------------------------------------------------------
2888 
2889 void MetaISectRectClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2890 {
2891     WRITE_BASE_COMPAT( rOStm, 1, pData );
2892     rOStm << maRect;
2893 }
2894 
2895 // ------------------------------------------------------------------------
2896 
2897 void MetaISectRectClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* )
2898 {
2899     COMPAT( rIStm );
2900     rIStm >> maRect;
2901 }
2902 
2903 // ========================================================================
2904 
2905 IMPL_META_ACTION( ISectRegionClipRegion, META_ISECTREGIONCLIPREGION_ACTION )
2906 
2907 // ------------------------------------------------------------------------
2908 
2909 MetaISectRegionClipRegionAction::MetaISectRegionClipRegionAction( const Region& rRegion ) :
2910     MetaAction  ( META_ISECTREGIONCLIPREGION_ACTION ),
2911     maRegion    ( rRegion )
2912 {
2913 }
2914 
2915 // ------------------------------------------------------------------------
2916 
2917 void MetaISectRegionClipRegionAction::Execute( OutputDevice* pOut )
2918 {
2919     pOut->IntersectClipRegion( maRegion );
2920 }
2921 
2922 // ------------------------------------------------------------------------
2923 
2924 MetaAction* MetaISectRegionClipRegionAction::Clone()
2925 {
2926     MetaAction* pClone = (MetaAction*) new MetaISectRegionClipRegionAction( *this );
2927     pClone->ResetRefCount();
2928     return pClone;
2929 }
2930 
2931 // ------------------------------------------------------------------------
2932 
2933 void MetaISectRegionClipRegionAction::Move( long nHorzMove, long nVertMove )
2934 {
2935     maRegion.Move( nHorzMove, nVertMove );
2936 }
2937 
2938 // ------------------------------------------------------------------------
2939 
2940 void MetaISectRegionClipRegionAction::Scale( double fScaleX, double fScaleY )
2941 {
2942     maRegion.Scale( fScaleX, fScaleY );
2943 }
2944 
2945 // ------------------------------------------------------------------------
2946 
2947 sal_Bool MetaISectRegionClipRegionAction::Compare( const MetaAction& rMetaAction ) const
2948 {
2949     return maRegion == ((MetaISectRegionClipRegionAction&)rMetaAction).maRegion;
2950 }
2951 
2952 // ------------------------------------------------------------------------
2953 
2954 void MetaISectRegionClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
2955 {
2956     WRITE_BASE_COMPAT( rOStm, 1, pData );
2957     rOStm << maRegion;
2958 }
2959 
2960 // ------------------------------------------------------------------------
2961 
2962 void MetaISectRegionClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* )
2963 {
2964     COMPAT( rIStm );
2965     rIStm >> maRegion;
2966 }
2967 
2968 // ========================================================================
2969 
2970 IMPL_META_ACTION( MoveClipRegion, META_MOVECLIPREGION_ACTION )
2971 
2972 // ------------------------------------------------------------------------
2973 
2974 MetaMoveClipRegionAction::MetaMoveClipRegionAction( long nHorzMove, long nVertMove ) :
2975     MetaAction  ( META_MOVECLIPREGION_ACTION ),
2976     mnHorzMove  ( nHorzMove ),
2977     mnVertMove  ( nVertMove )
2978 {
2979 }
2980 
2981 // ------------------------------------------------------------------------
2982 
2983 void MetaMoveClipRegionAction::Execute( OutputDevice* pOut )
2984 {
2985     pOut->MoveClipRegion( mnHorzMove, mnVertMove );
2986 }
2987 
2988 // ------------------------------------------------------------------------
2989 
2990 MetaAction* MetaMoveClipRegionAction::Clone()
2991 {
2992     MetaAction* pClone = (MetaAction*) new MetaMoveClipRegionAction( *this );
2993     pClone->ResetRefCount();
2994     return pClone;
2995 }
2996 
2997 // ------------------------------------------------------------------------
2998 
2999 void MetaMoveClipRegionAction::Scale( double fScaleX, double fScaleY )
3000 {
3001     mnHorzMove = FRound( mnHorzMove * fScaleX );
3002     mnVertMove = FRound( mnVertMove * fScaleY );
3003 }
3004 
3005 // ------------------------------------------------------------------------
3006 
3007 sal_Bool MetaMoveClipRegionAction::Compare( const MetaAction& rMetaAction ) const
3008 {
3009     return ( mnHorzMove == ((MetaMoveClipRegionAction&)rMetaAction).mnHorzMove ) &&
3010            ( mnVertMove == ((MetaMoveClipRegionAction&)rMetaAction).mnVertMove );
3011 }
3012 
3013 // ------------------------------------------------------------------------
3014 
3015 void MetaMoveClipRegionAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3016 {
3017     WRITE_BASE_COMPAT( rOStm, 1, pData );
3018     rOStm << mnHorzMove << mnVertMove;
3019 }
3020 
3021 // ------------------------------------------------------------------------
3022 
3023 void MetaMoveClipRegionAction::Read( SvStream& rIStm, ImplMetaReadData* )
3024 {
3025     COMPAT( rIStm );
3026     rIStm >> mnHorzMove >> mnVertMove;
3027 }
3028 
3029 // ========================================================================
3030 
3031 IMPL_META_ACTION( LineColor, META_LINECOLOR_ACTION )
3032 
3033 // ------------------------------------------------------------------------
3034 
3035 MetaLineColorAction::MetaLineColorAction( const Color& rColor, sal_Bool bSet ) :
3036     MetaAction  ( META_LINECOLOR_ACTION ),
3037     maColor     ( rColor ),
3038     mbSet       ( bSet )
3039 {
3040 }
3041 
3042 // ------------------------------------------------------------------------
3043 
3044 void MetaLineColorAction::Execute( OutputDevice* pOut )
3045 {
3046     if( mbSet )
3047         pOut->SetLineColor( maColor );
3048     else
3049         pOut->SetLineColor();
3050 }
3051 
3052 // ------------------------------------------------------------------------
3053 
3054 MetaAction* MetaLineColorAction::Clone()
3055 {
3056     MetaAction* pClone = (MetaAction*) new MetaLineColorAction( *this );
3057     pClone->ResetRefCount();
3058     return pClone;
3059 }
3060 
3061 // ------------------------------------------------------------------------
3062 
3063 sal_Bool MetaLineColorAction::Compare( const MetaAction& rMetaAction ) const
3064 {
3065     return ( maColor == ((MetaLineColorAction&)rMetaAction).maColor ) &&
3066            ( mbSet == ((MetaLineColorAction&)rMetaAction).mbSet );
3067 }
3068 
3069 // ------------------------------------------------------------------------
3070 
3071 void MetaLineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3072 {
3073     WRITE_BASE_COMPAT( rOStm, 1, pData );
3074     maColor.Write( rOStm, sal_True );
3075     rOStm << mbSet;
3076 }
3077 
3078 // ------------------------------------------------------------------------
3079 
3080 void MetaLineColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3081 {
3082     COMPAT( rIStm );
3083     maColor.Read( rIStm, sal_True );
3084     rIStm >> mbSet;
3085 }
3086 
3087 // ========================================================================
3088 
3089 IMPL_META_ACTION( FillColor, META_FILLCOLOR_ACTION )
3090 
3091 // ------------------------------------------------------------------------
3092 
3093 MetaFillColorAction::MetaFillColorAction( const Color& rColor, sal_Bool bSet ) :
3094     MetaAction  ( META_FILLCOLOR_ACTION ),
3095     maColor     ( rColor ),
3096     mbSet       ( bSet )
3097 {
3098 }
3099 
3100 // ------------------------------------------------------------------------
3101 
3102 void MetaFillColorAction::Execute( OutputDevice* pOut )
3103 {
3104     if( mbSet )
3105         pOut->SetFillColor( maColor );
3106     else
3107         pOut->SetFillColor();
3108 }
3109 
3110 // ------------------------------------------------------------------------
3111 
3112 MetaAction* MetaFillColorAction::Clone()
3113 {
3114     MetaAction* pClone = (MetaAction*) new MetaFillColorAction( *this );
3115     pClone->ResetRefCount();
3116     return pClone;
3117 }
3118 
3119 // ------------------------------------------------------------------------
3120 
3121 sal_Bool MetaFillColorAction::Compare( const MetaAction& rMetaAction ) const
3122 {
3123     return ( maColor == ((MetaFillColorAction&)rMetaAction).maColor ) &&
3124            ( mbSet == ((MetaFillColorAction&)rMetaAction).mbSet );
3125 }
3126 
3127 // ------------------------------------------------------------------------
3128 
3129 void MetaFillColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3130 {
3131     WRITE_BASE_COMPAT( rOStm, 1, pData );
3132     maColor.Write( rOStm, sal_True );
3133     rOStm << mbSet;
3134 }
3135 
3136 // ------------------------------------------------------------------------
3137 
3138 void MetaFillColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3139 {
3140     COMPAT( rIStm );
3141     maColor.Read( rIStm, sal_True );
3142     rIStm >> mbSet;
3143 }
3144 
3145 // ========================================================================
3146 
3147 IMPL_META_ACTION( TextColor, META_TEXTCOLOR_ACTION )
3148 
3149 // ------------------------------------------------------------------------
3150 
3151 MetaTextColorAction::MetaTextColorAction( const Color& rColor ) :
3152     MetaAction  ( META_TEXTCOLOR_ACTION ),
3153     maColor     ( rColor )
3154 {
3155 }
3156 
3157 // ------------------------------------------------------------------------
3158 
3159 void MetaTextColorAction::Execute( OutputDevice* pOut )
3160 {
3161     pOut->SetTextColor( maColor );
3162 }
3163 
3164 // ------------------------------------------------------------------------
3165 
3166 MetaAction* MetaTextColorAction::Clone()
3167 {
3168     MetaAction* pClone = (MetaAction*) new MetaTextColorAction( *this );
3169     pClone->ResetRefCount();
3170     return pClone;
3171 }
3172 
3173 // ------------------------------------------------------------------------
3174 
3175 sal_Bool MetaTextColorAction::Compare( const MetaAction& rMetaAction ) const
3176 {
3177     return maColor == ((MetaTextColorAction&)rMetaAction).maColor;
3178 }
3179 
3180 // ------------------------------------------------------------------------
3181 
3182 void MetaTextColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3183 {
3184     WRITE_BASE_COMPAT( rOStm, 1, pData );
3185     maColor.Write( rOStm, sal_True );
3186 }
3187 
3188 // ------------------------------------------------------------------------
3189 
3190 void MetaTextColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3191 {
3192     COMPAT( rIStm );
3193     maColor.Read( rIStm, sal_True );
3194 }
3195 
3196 // ========================================================================
3197 
3198 IMPL_META_ACTION( TextFillColor, META_TEXTFILLCOLOR_ACTION )
3199 
3200 // ------------------------------------------------------------------------
3201 
3202 MetaTextFillColorAction::MetaTextFillColorAction( const Color& rColor, sal_Bool bSet ) :
3203     MetaAction  ( META_TEXTFILLCOLOR_ACTION ),
3204     maColor     ( rColor ),
3205     mbSet       ( bSet )
3206 {
3207 }
3208 
3209 // ------------------------------------------------------------------------
3210 
3211 void MetaTextFillColorAction::Execute( OutputDevice* pOut )
3212 {
3213     if( mbSet )
3214         pOut->SetTextFillColor( maColor );
3215     else
3216         pOut->SetTextFillColor();
3217 }
3218 
3219 // ------------------------------------------------------------------------
3220 
3221 MetaAction* MetaTextFillColorAction::Clone()
3222 {
3223     MetaAction* pClone = (MetaAction*) new MetaTextFillColorAction( *this );
3224     pClone->ResetRefCount();
3225     return pClone;
3226 }
3227 
3228 // ------------------------------------------------------------------------
3229 
3230 sal_Bool MetaTextFillColorAction::Compare( const MetaAction& rMetaAction ) const
3231 {
3232     return ( maColor == ((MetaTextFillColorAction&)rMetaAction).maColor ) &&
3233            ( mbSet == ((MetaTextFillColorAction&)rMetaAction).mbSet );
3234 }
3235 
3236 // ------------------------------------------------------------------------
3237 
3238 void MetaTextFillColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3239 {
3240     WRITE_BASE_COMPAT( rOStm, 1, pData );
3241     maColor.Write( rOStm, sal_True );
3242     rOStm << mbSet;
3243 }
3244 
3245 // ------------------------------------------------------------------------
3246 
3247 void MetaTextFillColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3248 {
3249     COMPAT( rIStm );
3250     maColor.Read( rIStm, sal_True );
3251     rIStm >> mbSet;
3252 }
3253 
3254 // ========================================================================
3255 
3256 IMPL_META_ACTION( TextLineColor, META_TEXTLINECOLOR_ACTION )
3257 
3258 // ------------------------------------------------------------------------
3259 
3260 MetaTextLineColorAction::MetaTextLineColorAction( const Color& rColor, sal_Bool bSet ) :
3261     MetaAction  ( META_TEXTLINECOLOR_ACTION ),
3262     maColor     ( rColor ),
3263     mbSet       ( bSet )
3264 {
3265 }
3266 
3267 // ------------------------------------------------------------------------
3268 
3269 void MetaTextLineColorAction::Execute( OutputDevice* pOut )
3270 {
3271     if( mbSet )
3272         pOut->SetTextLineColor( maColor );
3273     else
3274         pOut->SetTextLineColor();
3275 }
3276 
3277 // ------------------------------------------------------------------------
3278 
3279 MetaAction* MetaTextLineColorAction::Clone()
3280 {
3281     MetaAction* pClone = (MetaAction*) new MetaTextLineColorAction( *this );
3282     pClone->ResetRefCount();
3283     return pClone;
3284 }
3285 
3286 // ------------------------------------------------------------------------
3287 
3288 sal_Bool MetaTextLineColorAction::Compare( const MetaAction& rMetaAction ) const
3289 {
3290     return ( maColor == ((MetaTextLineColorAction&)rMetaAction).maColor ) &&
3291            ( mbSet == ((MetaTextLineColorAction&)rMetaAction).mbSet );
3292 }
3293 
3294 // ------------------------------------------------------------------------
3295 
3296 void MetaTextLineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3297 {
3298     WRITE_BASE_COMPAT( rOStm, 1, pData );
3299     maColor.Write( rOStm, sal_True );
3300     rOStm << mbSet;
3301 }
3302 
3303 // ------------------------------------------------------------------------
3304 
3305 void MetaTextLineColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3306 {
3307     COMPAT( rIStm );
3308     maColor.Read( rIStm, sal_True );
3309     rIStm >> mbSet;
3310 }
3311 
3312 // ========================================================================
3313 
3314 IMPL_META_ACTION( OverlineColor, META_OVERLINECOLOR_ACTION )
3315 
3316 // ------------------------------------------------------------------------
3317 
3318 MetaOverlineColorAction::MetaOverlineColorAction( const Color& rColor, sal_Bool bSet ) :
3319     MetaAction  ( META_OVERLINECOLOR_ACTION ),
3320     maColor     ( rColor ),
3321     mbSet       ( bSet )
3322 {
3323 }
3324 
3325 // ------------------------------------------------------------------------
3326 
3327 void MetaOverlineColorAction::Execute( OutputDevice* pOut )
3328 {
3329     if( mbSet )
3330         pOut->SetOverlineColor( maColor );
3331     else
3332         pOut->SetOverlineColor();
3333 }
3334 
3335 // ------------------------------------------------------------------------
3336 
3337 MetaAction* MetaOverlineColorAction::Clone()
3338 {
3339     MetaAction* pClone = (MetaAction*) new MetaOverlineColorAction( *this );
3340     pClone->ResetRefCount();
3341     return pClone;
3342 }
3343 
3344 // ------------------------------------------------------------------------
3345 
3346 sal_Bool MetaOverlineColorAction::Compare( const MetaAction& rMetaAction ) const
3347 {
3348     return ( maColor == ((MetaOverlineColorAction&)rMetaAction).maColor ) &&
3349            ( mbSet == ((MetaOverlineColorAction&)rMetaAction).mbSet );
3350 }
3351 
3352 // ------------------------------------------------------------------------
3353 
3354 void MetaOverlineColorAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3355 {
3356     WRITE_BASE_COMPAT( rOStm, 1, pData );
3357     maColor.Write( rOStm, sal_True );
3358     rOStm << mbSet;
3359 }
3360 
3361 // ------------------------------------------------------------------------
3362 
3363 void MetaOverlineColorAction::Read( SvStream& rIStm, ImplMetaReadData* )
3364 {
3365     COMPAT( rIStm );
3366     maColor.Read( rIStm, sal_True );
3367     rIStm >> mbSet;
3368 }
3369 
3370 // ========================================================================
3371 
3372 IMPL_META_ACTION( TextAlign, META_TEXTALIGN_ACTION )
3373 
3374 // ------------------------------------------------------------------------
3375 
3376 MetaTextAlignAction::MetaTextAlignAction( TextAlign aAlign ) :
3377     MetaAction  ( META_TEXTALIGN_ACTION ),
3378     maAlign     ( aAlign )
3379 {
3380 }
3381 
3382 // ------------------------------------------------------------------------
3383 
3384 void MetaTextAlignAction::Execute( OutputDevice* pOut )
3385 {
3386     pOut->SetTextAlign( maAlign );
3387 }
3388 
3389 // ------------------------------------------------------------------------
3390 
3391 MetaAction* MetaTextAlignAction::Clone()
3392 {
3393     MetaAction* pClone = (MetaAction*) new MetaTextAlignAction( *this );
3394     pClone->ResetRefCount();
3395     return pClone;
3396 }
3397 
3398 // ------------------------------------------------------------------------
3399 
3400 sal_Bool MetaTextAlignAction::Compare( const MetaAction& rMetaAction ) const
3401 {
3402     return maAlign == ((MetaTextAlignAction&)rMetaAction).maAlign;
3403 }
3404 
3405 // ------------------------------------------------------------------------
3406 
3407 void MetaTextAlignAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3408 {
3409     WRITE_BASE_COMPAT( rOStm, 1, pData );
3410     rOStm << (sal_uInt16) maAlign;
3411 }
3412 
3413 // ------------------------------------------------------------------------
3414 
3415 void MetaTextAlignAction::Read( SvStream& rIStm, ImplMetaReadData* )
3416 {
3417     sal_uInt16 nTmp16;
3418 
3419     COMPAT( rIStm );
3420     rIStm >> nTmp16; maAlign = (TextAlign) nTmp16;
3421 }
3422 
3423 // ========================================================================
3424 
3425 IMPL_META_ACTION( MapMode, META_MAPMODE_ACTION )
3426 
3427 // ------------------------------------------------------------------------
3428 
3429 MetaMapModeAction::MetaMapModeAction( const MapMode& rMapMode ) :
3430     MetaAction  ( META_MAPMODE_ACTION ),
3431     maMapMode   ( rMapMode )
3432 {
3433 }
3434 
3435 // ------------------------------------------------------------------------
3436 
3437 void MetaMapModeAction::Execute( OutputDevice* pOut )
3438 {
3439     pOut->SetMapMode( maMapMode );
3440 }
3441 
3442 // ------------------------------------------------------------------------
3443 
3444 MetaAction* MetaMapModeAction::Clone()
3445 {
3446     MetaAction* pClone = (MetaAction*) new MetaMapModeAction( *this );
3447     pClone->ResetRefCount();
3448     return pClone;
3449 }
3450 
3451 // ------------------------------------------------------------------------
3452 
3453 void MetaMapModeAction::Scale( double fScaleX, double fScaleY )
3454 {
3455     Point aPoint( maMapMode.GetOrigin() );
3456 
3457     ImplScalePoint( aPoint, fScaleX, fScaleY );
3458     maMapMode.SetOrigin( aPoint );
3459 }
3460 
3461 // ------------------------------------------------------------------------
3462 
3463 sal_Bool MetaMapModeAction::Compare( const MetaAction& rMetaAction ) const
3464 {
3465     return maMapMode == ((MetaMapModeAction&)rMetaAction).maMapMode;
3466 }
3467 
3468 // ------------------------------------------------------------------------
3469 
3470 void MetaMapModeAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3471 {
3472     WRITE_BASE_COMPAT( rOStm, 1, pData );
3473     rOStm << maMapMode;
3474 }
3475 
3476 // ------------------------------------------------------------------------
3477 
3478 void MetaMapModeAction::Read( SvStream& rIStm, ImplMetaReadData* )
3479 {
3480     COMPAT( rIStm );
3481     rIStm >> maMapMode;
3482 }
3483 
3484 // ========================================================================
3485 
3486 IMPL_META_ACTION( Font, META_FONT_ACTION )
3487 
3488 // ------------------------------------------------------------------------
3489 
3490 MetaFontAction::MetaFontAction( const Font& rFont ) :
3491     MetaAction  ( META_FONT_ACTION ),
3492     maFont      ( rFont )
3493 {
3494     // #96876: because RTL_TEXTENCODING_SYMBOL is often set at the StarSymbol font,
3495     // we change the textencoding to RTL_TEXTENCODING_UNICODE here, which seems
3496     // to be the right way; changing the textencoding at other sources
3497     // is too dangerous at the moment
3498     if( ( ( maFont.GetName().SearchAscii( "StarSymbol" ) != STRING_NOTFOUND )
3499        || ( maFont.GetName().SearchAscii( "OpenSymbol" ) != STRING_NOTFOUND ) )
3500      && ( maFont.GetCharSet() != RTL_TEXTENCODING_UNICODE ) )
3501     {
3502         maFont.SetCharSet( RTL_TEXTENCODING_UNICODE );
3503     }
3504 }
3505 
3506 // ------------------------------------------------------------------------
3507 
3508 void MetaFontAction::Execute( OutputDevice* pOut )
3509 {
3510     pOut->SetFont( maFont );
3511 }
3512 
3513 // ------------------------------------------------------------------------
3514 
3515 MetaAction* MetaFontAction::Clone()
3516 {
3517     MetaAction* pClone = (MetaAction*) new MetaFontAction( *this );
3518     pClone->ResetRefCount();
3519     return pClone;
3520 }
3521 
3522 // ------------------------------------------------------------------------
3523 
3524 void MetaFontAction::Scale( double fScaleX, double fScaleY )
3525 {
3526     const Size aSize(
3527         FRound(maFont.GetSize().Width() * fabs(fScaleX)),
3528         FRound(maFont.GetSize().Height() * fabs(fScaleY)));
3529     maFont.SetSize( aSize );
3530 }
3531 
3532 // ------------------------------------------------------------------------
3533 
3534 sal_Bool MetaFontAction::Compare( const MetaAction& rMetaAction ) const
3535 {
3536     return maFont == ((MetaFontAction&)rMetaAction).maFont;
3537 }
3538 
3539 // ------------------------------------------------------------------------
3540 
3541 void MetaFontAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3542 {
3543     WRITE_BASE_COMPAT( rOStm, 1, pData );
3544     rOStm << maFont;
3545     pData->meActualCharSet = maFont.GetCharSet();
3546     if ( pData->meActualCharSet == RTL_TEXTENCODING_DONTKNOW )
3547         pData->meActualCharSet = gsl_getSystemTextEncoding();
3548 }
3549 
3550 // ------------------------------------------------------------------------
3551 
3552 void MetaFontAction::Read( SvStream& rIStm, ImplMetaReadData* pData )
3553 {
3554     COMPAT( rIStm );
3555     rIStm >> maFont;
3556     pData->meActualCharSet = maFont.GetCharSet();
3557     if ( pData->meActualCharSet == RTL_TEXTENCODING_DONTKNOW )
3558         pData->meActualCharSet = gsl_getSystemTextEncoding();
3559 }
3560 
3561 // ========================================================================
3562 
3563 IMPL_META_ACTION( Push, META_PUSH_ACTION )
3564 
3565 // ------------------------------------------------------------------------
3566 
3567 MetaPushAction::MetaPushAction( sal_uInt16 nFlags ) :
3568     MetaAction  ( META_PUSH_ACTION ),
3569     mnFlags     ( nFlags )
3570 {
3571 }
3572 
3573 // ------------------------------------------------------------------------
3574 
3575 void MetaPushAction::Execute( OutputDevice* pOut )
3576 {
3577     pOut->Push( mnFlags );
3578 }
3579 
3580 // ------------------------------------------------------------------------
3581 
3582 MetaAction* MetaPushAction::Clone()
3583 {
3584     MetaAction* pClone = (MetaAction*) new MetaPushAction( *this );
3585     pClone->ResetRefCount();
3586     return pClone;
3587 }
3588 
3589 // ------------------------------------------------------------------------
3590 
3591 sal_Bool MetaPushAction::Compare( const MetaAction& rMetaAction ) const
3592 {
3593     return mnFlags == ((MetaPushAction&)rMetaAction).mnFlags;
3594 }
3595 
3596 // ------------------------------------------------------------------------
3597 
3598 void MetaPushAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3599 {
3600     WRITE_BASE_COMPAT( rOStm, 1, pData );
3601     rOStm << mnFlags;
3602 }
3603 
3604 // ------------------------------------------------------------------------
3605 
3606 void MetaPushAction::Read( SvStream& rIStm, ImplMetaReadData* )
3607 {
3608     COMPAT( rIStm );
3609     rIStm >> mnFlags;
3610 }
3611 
3612 // ========================================================================
3613 
3614 IMPL_META_ACTION( Pop, META_POP_ACTION )
3615 
3616 // ------------------------------------------------------------------------
3617 
3618 void MetaPopAction::Execute( OutputDevice* pOut )
3619 {
3620     pOut->Pop();
3621 }
3622 
3623 // ------------------------------------------------------------------------
3624 
3625 MetaAction* MetaPopAction::Clone()
3626 {
3627     MetaAction* pClone = (MetaAction*) new MetaPopAction( *this );
3628     pClone->ResetRefCount();
3629     return pClone;
3630 }
3631 
3632 // ------------------------------------------------------------------------
3633 
3634 void MetaPopAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3635 {
3636     WRITE_BASE_COMPAT( rOStm, 1, pData );
3637 }
3638 
3639 // ------------------------------------------------------------------------
3640 
3641 void MetaPopAction::Read( SvStream& rIStm, ImplMetaReadData* )
3642 {
3643     COMPAT( rIStm );
3644 }
3645 
3646 // ========================================================================
3647 
3648 IMPL_META_ACTION( RasterOp, META_RASTEROP_ACTION )
3649 
3650 // ------------------------------------------------------------------------
3651 
3652 MetaRasterOpAction::MetaRasterOpAction( RasterOp eRasterOp ) :
3653     MetaAction  ( META_RASTEROP_ACTION ),
3654     meRasterOp  ( eRasterOp )
3655 {
3656 }
3657 
3658 // ------------------------------------------------------------------------
3659 
3660 void MetaRasterOpAction::Execute( OutputDevice* pOut )
3661 {
3662     pOut->SetRasterOp( meRasterOp );
3663 }
3664 
3665 // ------------------------------------------------------------------------
3666 
3667 MetaAction* MetaRasterOpAction::Clone()
3668 {
3669     MetaAction* pClone = (MetaAction*) new MetaRasterOpAction( *this );
3670     pClone->ResetRefCount();
3671     return pClone;
3672 }
3673 
3674 // ------------------------------------------------------------------------
3675 
3676 sal_Bool MetaRasterOpAction::Compare( const MetaAction& rMetaAction ) const
3677 {
3678     return meRasterOp == ((MetaRasterOpAction&)rMetaAction).meRasterOp;
3679 }
3680 
3681 // ------------------------------------------------------------------------
3682 
3683 void MetaRasterOpAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3684 {
3685     WRITE_BASE_COMPAT( rOStm, 1, pData );
3686     rOStm << (sal_uInt16) meRasterOp;
3687 }
3688 
3689 // ------------------------------------------------------------------------
3690 
3691 void MetaRasterOpAction::Read( SvStream& rIStm, ImplMetaReadData* )
3692 {
3693     sal_uInt16 nTmp16;
3694 
3695     COMPAT( rIStm );
3696     rIStm >> nTmp16; meRasterOp = (RasterOp) nTmp16;
3697 }
3698 
3699 // ========================================================================
3700 
3701 IMPL_META_ACTION( Transparent, META_TRANSPARENT_ACTION )
3702 
3703 // ------------------------------------------------------------------------
3704 
3705 MetaTransparentAction::MetaTransparentAction( const PolyPolygon& rPolyPoly, sal_uInt16 nTransPercent ) :
3706     MetaAction      ( META_TRANSPARENT_ACTION ),
3707     maPolyPoly      ( rPolyPoly ),
3708     mnTransPercent  ( nTransPercent )
3709 {
3710 }
3711 
3712 // ------------------------------------------------------------------------
3713 
3714 void MetaTransparentAction::Execute( OutputDevice* pOut )
3715 {
3716     pOut->DrawTransparent( maPolyPoly, mnTransPercent );
3717 }
3718 
3719 // ------------------------------------------------------------------------
3720 
3721 MetaAction* MetaTransparentAction::Clone()
3722 {
3723     MetaAction* pClone = (MetaAction*) new MetaTransparentAction( *this );
3724     pClone->ResetRefCount();
3725     return pClone;
3726 }
3727 
3728 // ------------------------------------------------------------------------
3729 
3730 void MetaTransparentAction::Move( long nHorzMove, long nVertMove )
3731 {
3732     maPolyPoly.Move( nHorzMove, nVertMove );
3733 }
3734 
3735 // ------------------------------------------------------------------------
3736 
3737 void MetaTransparentAction::Scale( double fScaleX, double fScaleY )
3738 {
3739     for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
3740         ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
3741 }
3742 
3743 // ------------------------------------------------------------------------
3744 
3745 sal_Bool MetaTransparentAction::Compare( const MetaAction& rMetaAction ) const
3746 {
3747     return ( maPolyPoly == ((MetaTransparentAction&)rMetaAction).maPolyPoly ) &&
3748            ( mnTransPercent == ((MetaTransparentAction&)rMetaAction).mnTransPercent );
3749 }
3750 
3751 // ------------------------------------------------------------------------
3752 
3753 void MetaTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3754 {
3755     WRITE_BASE_COMPAT( rOStm, 1, pData );
3756 
3757     // #i105373# The PolyPolygon in this action may be a curve; this
3758     // was ignored until now what is an error. To make older office
3759     // versions work with MetaFiles, i opt for applying AdaptiveSubdivide
3760     // to the PolyPoylgon.
3761     // The alternative would be to really write the curve information
3762     // like in MetaPolyPolygonAction::Write (where someone extended it
3763     // correctly, but not here :-( ).
3764     // The golden solution would be to combine both, but i think it's
3765     // not necessary; a good subdivision will be sufficient.
3766     PolyPolygon aNoCurvePolyPolygon;
3767     maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon);
3768 
3769     rOStm << aNoCurvePolyPolygon;
3770     rOStm << mnTransPercent;
3771 }
3772 
3773 // ------------------------------------------------------------------------
3774 
3775 void MetaTransparentAction::Read( SvStream& rIStm, ImplMetaReadData* )
3776 {
3777     COMPAT( rIStm );
3778     rIStm >> maPolyPoly;
3779     rIStm >> mnTransPercent;
3780 }
3781 
3782 // ========================================================================
3783 
3784 IMPL_META_ACTION( FloatTransparent, META_FLOATTRANSPARENT_ACTION )
3785 
3786 // ------------------------------------------------------------------------
3787 
3788 MetaFloatTransparentAction::MetaFloatTransparentAction( const GDIMetaFile& rMtf, const Point& rPos,
3789                                                         const Size& rSize, const Gradient& rGradient ) :
3790     MetaAction      ( META_FLOATTRANSPARENT_ACTION ),
3791     maMtf           ( rMtf ),
3792     maPoint         ( rPos ),
3793     maSize          ( rSize ),
3794     maGradient      ( rGradient )
3795 {
3796 }
3797 
3798 // ------------------------------------------------------------------------
3799 
3800 void MetaFloatTransparentAction::Execute( OutputDevice* pOut )
3801 {
3802     pOut->DrawTransparent( maMtf, maPoint, maSize, maGradient );
3803 }
3804 
3805 // ------------------------------------------------------------------------
3806 
3807 MetaAction* MetaFloatTransparentAction::Clone()
3808 {
3809     MetaAction* pClone = (MetaAction*) new MetaFloatTransparentAction( *this );
3810     pClone->ResetRefCount();
3811     return pClone;
3812 }
3813 
3814 // ------------------------------------------------------------------------
3815 
3816 void MetaFloatTransparentAction::Move( long nHorzMove, long nVertMove )
3817 {
3818     maPoint.Move( nHorzMove, nVertMove );
3819 }
3820 
3821 // ------------------------------------------------------------------------
3822 
3823 void MetaFloatTransparentAction::Scale( double fScaleX, double fScaleY )
3824 {
3825     Rectangle aRectangle(maPoint, maSize);
3826     ImplScaleRect( aRectangle, fScaleX, fScaleY );
3827     maPoint = aRectangle.TopLeft();
3828     maSize = aRectangle.GetSize();
3829 }
3830 
3831 // ------------------------------------------------------------------------
3832 
3833 sal_Bool MetaFloatTransparentAction::Compare( const MetaAction& rMetaAction ) const
3834 {
3835     return ( maMtf == ((MetaFloatTransparentAction&)rMetaAction).maMtf ) &&
3836            ( maPoint == ((MetaFloatTransparentAction&)rMetaAction).maPoint ) &&
3837            ( maSize == ((MetaFloatTransparentAction&)rMetaAction).maSize ) &&
3838            ( maGradient == ((MetaFloatTransparentAction&)rMetaAction).maGradient );
3839 }
3840 
3841 // ------------------------------------------------------------------------
3842 
3843 void MetaFloatTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3844 {
3845     WRITE_BASE_COMPAT( rOStm, 1, pData );
3846 
3847     maMtf.Write( rOStm );
3848     rOStm << maPoint << maSize << maGradient;
3849 }
3850 
3851 // ------------------------------------------------------------------------
3852 
3853 void MetaFloatTransparentAction::Read( SvStream& rIStm, ImplMetaReadData* )
3854 {
3855     COMPAT( rIStm );
3856     rIStm >> maMtf >> maPoint >> maSize >> maGradient;
3857 }
3858 
3859 // ========================================================================
3860 
3861 IMPL_META_ACTION( EPS, META_EPS_ACTION )
3862 
3863 // ------------------------------------------------------------------------
3864 
3865 MetaEPSAction::MetaEPSAction( const Point& rPoint, const Size& rSize,
3866                               const GfxLink& rGfxLink, const GDIMetaFile& rSubst ) :
3867     MetaAction  ( META_EPS_ACTION ),
3868     maGfxLink   ( rGfxLink ),
3869     maSubst     ( rSubst ),
3870     maPoint     ( rPoint ),
3871     maSize      ( rSize )
3872 {
3873 }
3874 
3875 // ------------------------------------------------------------------------
3876 
3877 void MetaEPSAction::Execute( OutputDevice* pOut )
3878 {
3879     pOut->DrawEPS( maPoint, maSize, maGfxLink, &maSubst );
3880 }
3881 
3882 // ------------------------------------------------------------------------
3883 
3884 MetaAction* MetaEPSAction::Clone()
3885 {
3886     MetaAction* pClone = (MetaAction*) new MetaEPSAction( *this );
3887     pClone->ResetRefCount();
3888     return pClone;
3889 }
3890 
3891 // ------------------------------------------------------------------------
3892 
3893 void MetaEPSAction::Move( long nHorzMove, long nVertMove )
3894 {
3895     maPoint.Move( nHorzMove, nVertMove );
3896 }
3897 
3898 // ------------------------------------------------------------------------
3899 
3900 void MetaEPSAction::Scale( double fScaleX, double fScaleY )
3901 {
3902     Rectangle aRectangle(maPoint, maSize);
3903     ImplScaleRect( aRectangle, fScaleX, fScaleY );
3904     maPoint = aRectangle.TopLeft();
3905     maSize = aRectangle.GetSize();
3906 }
3907 
3908 // ------------------------------------------------------------------------
3909 
3910 sal_Bool MetaEPSAction::Compare( const MetaAction& rMetaAction ) const
3911 {
3912     return ( maGfxLink.IsEqual(((MetaEPSAction&)rMetaAction).maGfxLink )) &&
3913            ( maSubst == ((MetaEPSAction&)rMetaAction).maSubst ) &&
3914            ( maPoint == ((MetaEPSAction&)rMetaAction).maPoint ) &&
3915            ( maSize == ((MetaEPSAction&)rMetaAction).maSize );
3916 }
3917 
3918 // ------------------------------------------------------------------------
3919 
3920 void MetaEPSAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3921 {
3922     WRITE_BASE_COMPAT( rOStm, 1, pData );
3923     rOStm << maGfxLink;
3924     rOStm << maPoint;
3925     rOStm << maSize;
3926     maSubst.Write( rOStm );
3927 }
3928 
3929 // ------------------------------------------------------------------------
3930 
3931 void MetaEPSAction::Read( SvStream& rIStm, ImplMetaReadData* )
3932 {
3933     COMPAT( rIStm );
3934     rIStm >> maGfxLink;
3935     rIStm >> maPoint;
3936     rIStm >> maSize;
3937     rIStm >> maSubst;
3938 }
3939 
3940 // ========================================================================
3941 
3942 IMPL_META_ACTION( RefPoint, META_REFPOINT_ACTION )
3943 
3944 // ------------------------------------------------------------------------
3945 
3946 MetaRefPointAction::MetaRefPointAction( const Point& rRefPoint, sal_Bool bSet ) :
3947     MetaAction  ( META_REFPOINT_ACTION ),
3948     maRefPoint  ( rRefPoint ),
3949     mbSet       ( bSet )
3950 {
3951 }
3952 
3953 // ------------------------------------------------------------------------
3954 
3955 void MetaRefPointAction::Execute( OutputDevice* pOut )
3956 {
3957     if( mbSet )
3958         pOut->SetRefPoint( maRefPoint );
3959     else
3960         pOut->SetRefPoint();
3961 }
3962 
3963 // ------------------------------------------------------------------------
3964 
3965 MetaAction* MetaRefPointAction::Clone()
3966 {
3967     MetaAction* pClone = (MetaAction*) new MetaRefPointAction( *this );
3968     pClone->ResetRefCount();
3969     return pClone;
3970 }
3971 
3972 // ------------------------------------------------------------------------
3973 
3974 sal_Bool MetaRefPointAction::Compare( const MetaAction& rMetaAction ) const
3975 {
3976     return ( maRefPoint == ((MetaRefPointAction&)rMetaAction).maRefPoint ) &&
3977            ( mbSet == ((MetaRefPointAction&)rMetaAction).mbSet );
3978 }
3979 
3980 // ------------------------------------------------------------------------
3981 
3982 void MetaRefPointAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
3983 {
3984     WRITE_BASE_COMPAT( rOStm, 1, pData );
3985     rOStm << maRefPoint << mbSet;
3986 }
3987 
3988 // ------------------------------------------------------------------------
3989 
3990 void MetaRefPointAction::Read( SvStream& rIStm, ImplMetaReadData* )
3991 {
3992     COMPAT( rIStm );
3993     rIStm >> maRefPoint >> mbSet;
3994 }
3995 
3996 // ========================================================================
3997 
3998 MetaCommentAction::MetaCommentAction( sal_Int32 nValue ) :
3999     MetaAction  ( META_COMMENT_ACTION ),
4000     mnValue     ( nValue )
4001 {
4002     ImplInitDynamicData( NULL, 0UL );
4003 }
4004 
4005 // ------------------------------------------------------------------------
4006 
4007 MetaCommentAction::MetaCommentAction( const MetaCommentAction& rAct ) :
4008     MetaAction  ( META_COMMENT_ACTION ),
4009     maComment   ( rAct.maComment ),
4010     mnValue     ( rAct.mnValue )
4011 {
4012     ImplInitDynamicData( rAct.mpData, rAct.mnDataSize );
4013 }
4014 
4015 // ------------------------------------------------------------------------
4016 
4017 MetaCommentAction::MetaCommentAction( const ByteString& rComment, sal_Int32 nValue, const sal_uInt8* pData, sal_uInt32 nDataSize ) :
4018     MetaAction  ( META_COMMENT_ACTION ),
4019     maComment   ( rComment ),
4020     mnValue     ( nValue )
4021 {
4022     ImplInitDynamicData( pData, nDataSize );
4023 }
4024 
4025 // ------------------------------------------------------------------------
4026 
4027 MetaCommentAction::MetaCommentAction( const sal_uInt8* pData, sal_uInt32 nDataSize ) :
4028     MetaAction  ( META_COMMENT_ACTION ),
4029     mnValue     ( 0L )
4030 {
4031     ImplInitDynamicData( pData, nDataSize );
4032 }
4033 
4034 // ------------------------------------------------------------------------
4035 
4036 MetaCommentAction::~MetaCommentAction()
4037 {
4038     if ( mpData )
4039         delete[] mpData;
4040 }
4041 
4042 // ------------------------------------------------------------------------
4043 
4044 void MetaCommentAction::ImplInitDynamicData( const sal_uInt8* pData, sal_uInt32 nDataSize )
4045 {
4046     if ( nDataSize && pData )
4047     {
4048         mnDataSize = nDataSize, mpData = new sal_uInt8[ mnDataSize ];
4049         memcpy( mpData, pData, mnDataSize );
4050     }
4051     else
4052     {
4053         mnDataSize = 0;
4054         mpData = NULL;
4055     }
4056 }
4057 
4058 // ------------------------------------------------------------------------
4059 
4060 void MetaCommentAction::Execute( OutputDevice* pOut )
4061 {
4062     if ( pOut->GetConnectMetaFile() )
4063     {
4064         Duplicate();
4065         pOut->GetConnectMetaFile()->AddAction( this );
4066     }
4067 }
4068 
4069 // ------------------------------------------------------------------------
4070 
4071 MetaAction* MetaCommentAction::Clone()
4072 {
4073     MetaAction* pClone = (MetaAction*) new MetaCommentAction( *this );
4074     pClone->ResetRefCount();
4075     return pClone;
4076 }
4077 
4078 void MetaCommentAction::Move( long nXMove, long nYMove )
4079 {
4080     if ( nXMove || nYMove )
4081     {
4082         if ( mnDataSize && mpData )
4083         {
4084             sal_Bool bPathStroke = maComment.Equals( "XPATHSTROKE_SEQ_BEGIN" );
4085             if ( bPathStroke || maComment.Equals( "XPATHFILL_SEQ_BEGIN" ) )
4086             {
4087                 SvMemoryStream  aMemStm( (void*)mpData, mnDataSize, STREAM_READ );
4088                 SvMemoryStream  aDest;
4089                 if ( bPathStroke )
4090                 {
4091                     SvtGraphicStroke aStroke;
4092                     aMemStm >> aStroke;
4093                     Polygon aPath;
4094                     aStroke.getPath( aPath );
4095                     aPath.Move( nXMove, nYMove );
4096                     aStroke.setPath( aPath );
4097                     aDest << aStroke;
4098                 }
4099                 else
4100                 {
4101                     SvtGraphicFill aFill;
4102                     aMemStm >> aFill;
4103                     PolyPolygon aPath;
4104                     aFill.getPath( aPath );
4105                     aPath.Move( nXMove, nYMove );
4106                     aFill.setPath( aPath );
4107                     aDest << aFill;
4108                 }
4109                 delete[] mpData;
4110                 ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
4111             }
4112         }
4113     }
4114 }
4115 
4116 // ------------------------------------------------------------------------
4117 // SJ: 25.07.06 #i56656# we are not able to mirrorcertain kind of
4118 // comments properly, especially the XPATHSTROKE and XPATHFILL lead to
4119 // problems, so it is better to remove these comments when mirroring
4120 void MetaCommentAction::Scale( double fXScale, double fYScale )
4121 {
4122     if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
4123     {
4124         if ( mnDataSize && mpData )
4125         {
4126             sal_Bool bPathStroke = maComment.Equals( "XPATHSTROKE_SEQ_BEGIN" );
4127             if ( bPathStroke || maComment.Equals( "XPATHFILL_SEQ_BEGIN" ) )
4128             {
4129                 SvMemoryStream  aMemStm( (void*)mpData, mnDataSize, STREAM_READ );
4130                 SvMemoryStream  aDest;
4131                 if ( bPathStroke )
4132                 {
4133                     SvtGraphicStroke aStroke;
4134                     aMemStm >> aStroke;
4135                     Polygon aPath;
4136                     aStroke.getPath( aPath );
4137                     aPath.Scale( fXScale, fYScale );
4138                     aStroke.setPath( aPath );
4139                     aDest << aStroke;
4140                 }
4141                 else
4142                 {
4143                     SvtGraphicFill aFill;
4144                     aMemStm >> aFill;
4145                     PolyPolygon aPath;
4146                     aFill.getPath( aPath );
4147                     aPath.Scale( fXScale, fYScale );
4148                     aFill.setPath( aPath );
4149                     aDest << aFill;
4150                 }
4151                 delete[] mpData;
4152                 ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
4153             }
4154         }
4155     }
4156 }
4157 
4158 // ------------------------------------------------------------------------
4159 
4160 sal_Bool MetaCommentAction::Compare( const MetaAction& rMetaAction ) const
4161 {
4162     return ( maComment == ((MetaCommentAction&)rMetaAction).maComment ) &&
4163            ( mnValue == ((MetaCommentAction&)rMetaAction).mnValue ) &&
4164            ( mnDataSize == ((MetaCommentAction&)rMetaAction).mnDataSize ) &&
4165            ( memcmp( mpData, ((MetaCommentAction&)rMetaAction).mpData, mnDataSize ) == 0 );
4166 }
4167 
4168 // ------------------------------------------------------------------------
4169 
4170 void MetaCommentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
4171 {
4172     WRITE_BASE_COMPAT( rOStm, 1, pData );
4173     rOStm << maComment << mnValue << mnDataSize;
4174 
4175     if ( mnDataSize )
4176         rOStm.Write( mpData, mnDataSize );
4177 }
4178 
4179 // ------------------------------------------------------------------------
4180 
4181 void MetaCommentAction::Read( SvStream& rIStm, ImplMetaReadData* )
4182 {
4183     COMPAT( rIStm );
4184     rIStm >> maComment >> mnValue >> mnDataSize;
4185 
4186     if( mpData )
4187         delete[] mpData;
4188 
4189     if( mnDataSize )
4190     {
4191         mpData = new sal_uInt8[ mnDataSize ];
4192         rIStm.Read( mpData, mnDataSize );
4193     }
4194     else
4195         mpData = NULL;
4196 }
4197 
4198 // ========================================================================
4199 
4200 IMPL_META_ACTION( LayoutMode, META_LAYOUTMODE_ACTION )
4201 
4202 // ------------------------------------------------------------------------
4203 
4204 MetaLayoutModeAction::MetaLayoutModeAction( sal_uInt32 nLayoutMode ) :
4205     MetaAction  ( META_LAYOUTMODE_ACTION ),
4206     mnLayoutMode( nLayoutMode )
4207 {
4208 }
4209 
4210 // ------------------------------------------------------------------------
4211 
4212 void MetaLayoutModeAction::Execute( OutputDevice* pOut )
4213 {
4214     pOut->SetLayoutMode( mnLayoutMode );
4215 }
4216 
4217 // ------------------------------------------------------------------------
4218 
4219 MetaAction* MetaLayoutModeAction::Clone()
4220 {
4221     MetaAction* pClone = (MetaAction*) new MetaLayoutModeAction( *this );
4222     pClone->ResetRefCount();
4223     return pClone;
4224 }
4225 
4226 // ------------------------------------------------------------------------
4227 
4228 sal_Bool MetaLayoutModeAction::Compare( const MetaAction& rMetaAction ) const
4229 {
4230     return mnLayoutMode == ((MetaLayoutModeAction&)rMetaAction).mnLayoutMode;
4231 }
4232 
4233 // ------------------------------------------------------------------------
4234 
4235 void MetaLayoutModeAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
4236 {
4237     WRITE_BASE_COMPAT( rOStm, 1, pData );
4238     rOStm << mnLayoutMode;
4239 }
4240 
4241 // ------------------------------------------------------------------------
4242 
4243 void MetaLayoutModeAction::Read( SvStream& rIStm, ImplMetaReadData* )
4244 {
4245     COMPAT( rIStm );
4246     rIStm >> mnLayoutMode;
4247 }
4248 
4249 // ========================================================================
4250 
4251 IMPL_META_ACTION( TextLanguage, META_TEXTLANGUAGE_ACTION )
4252 
4253 // ------------------------------------------------------------------------
4254 
4255 MetaTextLanguageAction::MetaTextLanguageAction( LanguageType eTextLanguage ) :
4256     MetaAction  ( META_TEXTLANGUAGE_ACTION ),
4257     meTextLanguage( eTextLanguage )
4258 {
4259 }
4260 
4261 // ------------------------------------------------------------------------
4262 
4263 void MetaTextLanguageAction::Execute( OutputDevice* pOut )
4264 {
4265     pOut->SetDigitLanguage( meTextLanguage );
4266 }
4267 
4268 // ------------------------------------------------------------------------
4269 
4270 MetaAction* MetaTextLanguageAction::Clone()
4271 {
4272     MetaAction* pClone = (MetaAction*) new MetaTextLanguageAction( *this );
4273     pClone->ResetRefCount();
4274     return pClone;
4275 }
4276 
4277 // ------------------------------------------------------------------------
4278 
4279 sal_Bool MetaTextLanguageAction::Compare( const MetaAction& rMetaAction ) const
4280 {
4281     return meTextLanguage == ((MetaTextLanguageAction&)rMetaAction).meTextLanguage;
4282 }
4283 
4284 // ------------------------------------------------------------------------
4285 
4286 void MetaTextLanguageAction::Write( SvStream& rOStm, ImplMetaWriteData* pData )
4287 {
4288     WRITE_BASE_COMPAT( rOStm, 1, pData );
4289     rOStm << meTextLanguage;
4290 }
4291 
4292 // ------------------------------------------------------------------------
4293 
4294 void MetaTextLanguageAction::Read( SvStream& rIStm, ImplMetaReadData* )
4295 {
4296     COMPAT( rIStm );
4297     rIStm >> meTextLanguage;
4298 }
4299 
4300 // eof
4301