Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <algorithm>
21 : #include <string.h>
22 : #include <tools/debug.hxx>
23 : #include <tools/stream.hxx>
24 : #include <tools/helpers.hxx>
25 : #include <vcl/virdev.hxx>
26 : #include <vcl/graph.hxx>
27 : #include <vcl/lineinfo.hxx>
28 : #include <vcl/cvtsvm.hxx>
29 : #include <rtl/strbuf.hxx>
30 :
31 : // -----------
32 : // - Inlines -
33 : // -----------
34 :
35 0 : void ImplReadRect( SvStream& rIStm, Rectangle& rRect )
36 : {
37 0 : Point aTL;
38 0 : Point aBR;
39 :
40 0 : rIStm >> aTL;
41 0 : rIStm >> aBR;
42 :
43 0 : rRect = Rectangle( aTL, aBR );
44 0 : }
45 :
46 : // ------------------------------------------------------------------------
47 :
48 0 : void ImplWriteRect( SvStream& rOStm, const Rectangle& rRect )
49 : {
50 0 : rOStm << rRect.TopLeft();
51 0 : rOStm << rRect.BottomRight();
52 0 : }
53 :
54 : // ------------------------------------------------------------------------
55 :
56 0 : void ImplReadPoly( SvStream& rIStm, Polygon& rPoly )
57 : {
58 : sal_Int32 nSize;
59 :
60 0 : rIStm >> nSize;
61 0 : rPoly = Polygon( (sal_uInt16) nSize );
62 :
63 0 : for( sal_uInt16 i = 0; i < (sal_uInt16) nSize; i++ )
64 0 : rIStm >> rPoly[ i ];
65 0 : }
66 :
67 : // ------------------------------------------------------------------------
68 :
69 0 : void ImplReadPolyPoly( SvStream& rIStm, PolyPolygon& rPolyPoly )
70 : {
71 0 : Polygon aPoly;
72 : sal_Int32 nPolyCount;
73 :
74 0 : rIStm >> nPolyCount;
75 :
76 0 : for( sal_uInt16 i = 0; i < (sal_uInt16) nPolyCount; i++ )
77 : {
78 0 : ImplReadPoly( rIStm, aPoly );
79 0 : rPolyPoly.Insert( aPoly );
80 0 : }
81 0 : }
82 :
83 : // ------------------------------------------------------------------------
84 :
85 0 : void ImplWritePolyPolyAction( SvStream& rOStm, const PolyPolygon& rPolyPoly )
86 : {
87 0 : const sal_uInt16 nPoly = rPolyPoly.Count();
88 0 : sal_uInt16 nPoints = 0;
89 : sal_uInt16 n;
90 :
91 0 : for( n = 0; n < nPoly; n++ )
92 0 : nPoints = sal::static_int_cast<sal_uInt16>(nPoints + rPolyPoly[ n ].GetSize());
93 :
94 0 : rOStm << (sal_Int16) GDI_POLYPOLYGON_ACTION;
95 0 : rOStm << (sal_Int32) ( 8 + ( nPoly << 2 ) + ( nPoints << 3 ) );
96 0 : rOStm << (sal_Int32) nPoly;
97 :
98 0 : for( n = 0; n < nPoly; n++ )
99 : {
100 : // #i102224# Here the evtl. curved nature of Polygon was
101 : // ignored (for all those Years). Adapted to at least write
102 : // a polygon representing the curve as good as possible
103 0 : Polygon aSimplePoly;
104 0 : rPolyPoly[n].AdaptiveSubdivide(aSimplePoly);
105 0 : const sal_uInt16 nSize(aSimplePoly.GetSize());
106 :
107 0 : rOStm << (sal_Int32) nSize;
108 :
109 0 : for( sal_uInt16 j = 0; j < nSize; j++ )
110 0 : rOStm << aSimplePoly[ j ];
111 0 : }
112 0 : }
113 :
114 : // ------------------------------------------------------------------------
115 :
116 0 : void ImplReadColor( SvStream& rIStm, Color& rColor )
117 : {
118 : sal_Int16 nVal;
119 :
120 0 : rIStm >> nVal; rColor.SetRed( sal::static_int_cast<sal_uInt8>((sal_uInt16)nVal >> 8) );
121 0 : rIStm >> nVal; rColor.SetGreen( sal::static_int_cast<sal_uInt8>((sal_uInt16)nVal >> 8) );
122 0 : rIStm >> nVal; rColor.SetBlue( sal::static_int_cast<sal_uInt8>((sal_uInt16)nVal >> 8) );
123 0 : }
124 :
125 : // ------------------------------------------------------------------------
126 :
127 0 : void ImplWriteColor( SvStream& rOStm, const Color& rColor )
128 : {
129 : sal_Int16 nVal;
130 :
131 0 : nVal = ( (sal_Int16) rColor.GetRed() << 8 ) | rColor.GetRed();
132 0 : rOStm << nVal;
133 :
134 0 : nVal = ( (sal_Int16) rColor.GetGreen() << 8 ) | rColor.GetGreen();
135 0 : rOStm << nVal;
136 :
137 0 : nVal = ( (sal_Int16) rColor.GetBlue() << 8 ) | rColor.GetBlue();
138 0 : rOStm << nVal;
139 0 : }
140 :
141 : // ------------------------------------------------------------------------
142 :
143 0 : void ImplReadMapMode( SvStream& rIStm, MapMode& rMapMode )
144 : {
145 0 : Point aOrg;
146 : sal_Int32 nXNum;
147 : sal_Int32 nXDenom;
148 : sal_Int32 nYNum;
149 : sal_Int32 nYDenom;
150 : sal_Int16 nUnit;
151 :
152 0 : rIStm >> nUnit >> aOrg >> nXNum >> nXDenom >> nYNum >> nYDenom;
153 0 : rMapMode = MapMode( (MapUnit) nUnit, aOrg, Fraction( nXNum, nXDenom ), Fraction( nYNum, nYDenom ) );
154 0 : }
155 :
156 : // ------------------------------------------------------------------------
157 :
158 0 : void ImplWriteMapMode( SvStream& rOStm, const MapMode& rMapMode )
159 : {
160 0 : rOStm << (sal_Int16) rMapMode.GetMapUnit();
161 0 : rOStm << rMapMode.GetOrigin();
162 0 : rOStm << (sal_Int32) rMapMode.GetScaleX().GetNumerator();
163 0 : rOStm << (sal_Int32) rMapMode.GetScaleX().GetDenominator();
164 0 : rOStm << (sal_Int32) rMapMode.GetScaleY().GetNumerator();
165 0 : rOStm << (sal_Int32) rMapMode.GetScaleY().GetDenominator();
166 0 : }
167 :
168 : // ------------------------------------------------------------------------
169 :
170 0 : void ImplWritePushAction( SvStream& rOStm )
171 : {
172 0 : rOStm << (sal_Int16) GDI_PUSH_ACTION;
173 0 : rOStm << (sal_Int32) 4;
174 0 : }
175 :
176 : // ------------------------------------------------------------------------
177 :
178 0 : void ImplWritePopAction( SvStream& rOStm )
179 : {
180 0 : rOStm << (sal_Int16) GDI_POP_ACTION;
181 0 : rOStm << (sal_Int32) 4;
182 0 : }
183 :
184 : // ------------------------------------------------------------------------
185 :
186 0 : void ImplWriteLineColor( SvStream& rOStm, const Color& rColor, sal_Int16 nStyle, sal_Int32 nWidth = 0L )
187 : {
188 0 : if( rColor.GetTransparency() > 127 )
189 0 : nStyle = 0;
190 :
191 0 : rOStm << (sal_Int16) GDI_PEN_ACTION;
192 0 : rOStm << (sal_Int32) 16;
193 0 : ImplWriteColor( rOStm, rColor );
194 0 : rOStm << nWidth;
195 0 : rOStm << nStyle;
196 0 : }
197 :
198 : // ------------------------------------------------------------------------
199 :
200 0 : void ImplWriteFillColor( SvStream& rOStm, const Color& rColor, sal_Int16 nStyle )
201 : {
202 0 : rOStm << (sal_Int16) GDI_FILLBRUSH_ACTION;
203 0 : rOStm << (sal_Int32) 20;
204 0 : ImplWriteColor( rOStm, rColor );
205 :
206 0 : if( rColor.GetTransparency() > 127 )
207 0 : nStyle = 0;
208 :
209 0 : if( nStyle > 1 )
210 : {
211 0 : ImplWriteColor( rOStm, COL_WHITE );
212 0 : rOStm << nStyle;
213 0 : rOStm << (sal_Int16) 1;
214 : }
215 : else
216 : {
217 0 : ImplWriteColor( rOStm, COL_BLACK );
218 0 : rOStm << nStyle;
219 0 : rOStm << (sal_Int16) 0;
220 : }
221 0 : }
222 :
223 : // ------------------------------------------------------------------------
224 :
225 0 : void ImplWriteFont( SvStream& rOStm, const Font& rFont,
226 : rtl_TextEncoding& rActualCharSet )
227 : {
228 : char aName[32];
229 : short nWeight;
230 :
231 0 : rtl::OString aByteName(rtl::OUStringToOString(rFont.GetName(),
232 0 : rOStm.GetStreamCharSet()));
233 0 : strncpy( aName, aByteName.getStr(), 32 );
234 :
235 0 : switch ( rFont.GetWeight() )
236 : {
237 : case WEIGHT_THIN:
238 : case WEIGHT_ULTRALIGHT:
239 : case WEIGHT_LIGHT:
240 0 : nWeight = 1;
241 0 : break;
242 :
243 : case WEIGHT_NORMAL:
244 : case WEIGHT_MEDIUM:
245 0 : nWeight = 2;
246 0 : break;
247 :
248 : case WEIGHT_BOLD:
249 : case WEIGHT_ULTRABOLD:
250 : case WEIGHT_BLACK:
251 0 : nWeight = 3;
252 0 : break;
253 :
254 : default:
255 0 : nWeight = 0;
256 0 : break;
257 : }
258 :
259 0 : rOStm << (sal_Int16) GDI_FONT_ACTION;
260 0 : rOStm << (sal_Int32) 78;
261 :
262 0 : rActualCharSet = GetStoreCharSet( rFont.GetCharSet() );
263 0 : ImplWriteColor( rOStm, rFont.GetColor() );
264 0 : ImplWriteColor( rOStm, rFont.GetFillColor() );
265 0 : rOStm.Write( aName, 32 );
266 0 : rOStm << rFont.GetSize();
267 0 : rOStm << (sal_Int16) 0; // no character orientation anymore
268 0 : rOStm << (sal_Int16) rFont.GetOrientation();
269 0 : rOStm << (sal_Int16) rActualCharSet;
270 0 : rOStm << (sal_Int16) rFont.GetFamily();
271 0 : rOStm << (sal_Int16) rFont.GetPitch();
272 0 : rOStm << (sal_Int16) rFont.GetAlign();
273 0 : rOStm << (sal_Int16) nWeight;
274 0 : rOStm << (sal_Int16) rFont.GetUnderline();
275 0 : rOStm << (sal_Int16) rFont.GetStrikeout();
276 0 : rOStm << (sal_Bool) ( rFont.GetItalic() != ITALIC_NONE );
277 0 : rOStm << rFont.IsOutline();
278 0 : rOStm << rFont.IsShadow();
279 0 : rOStm << rFont.IsTransparent();
280 0 : if ( rActualCharSet == RTL_TEXTENCODING_DONTKNOW )
281 0 : rActualCharSet = osl_getThreadTextEncoding();
282 0 : }
283 :
284 : // ------------------------------------------------------------------------
285 :
286 0 : void ImplWriteRasterOpAction( SvStream& rOStm, sal_Int16 nRasterOp )
287 : {
288 0 : rOStm << (sal_Int16) GDI_RASTEROP_ACTION << (sal_Int32) 6 << nRasterOp;
289 0 : }
290 :
291 : // ------------------------------------------------------------------------
292 :
293 0 : sal_Bool ImplWriteUnicodeComment( SvStream& rOStm, const String& rString )
294 : {
295 0 : xub_StrLen nStringLen = rString.Len();
296 0 : if ( nStringLen )
297 : {
298 0 : sal_uInt32 nSize = ( nStringLen << 1 ) + 4;
299 0 : sal_uInt16 nType = GDI_UNICODE_COMMENT;
300 :
301 0 : rOStm << nType << nSize;
302 0 : write_uInt16s_FromOUString(rOStm, rString);
303 : }
304 0 : return nStringLen != 0;
305 : }
306 :
307 : // ------------------------------------------------------------------------
308 :
309 0 : void ImplReadUnicodeComment( sal_uInt32 nStrmPos, SvStream& rIStm, String& rString )
310 : {
311 0 : sal_uInt32 nOld = rIStm.Tell();
312 0 : if ( nStrmPos )
313 : {
314 : sal_uInt16 nType;
315 : sal_uInt32 nActionSize;
316 : xub_StrLen nStringLen;
317 :
318 0 : rIStm.Seek( nStrmPos );
319 0 : rIStm >> nType
320 0 : >> nActionSize;
321 :
322 0 : nStringLen = sal::static_int_cast<xub_StrLen>(( nActionSize - 4 ) >> 1);
323 :
324 0 : if ( nStringLen && ( nType == GDI_UNICODE_COMMENT ) )
325 0 : rString = read_uInt16s_ToOUString(rIStm, nStringLen);
326 : }
327 0 : rIStm.Seek( nOld );
328 0 : }
329 :
330 : // ------------------------------------------------------------------------
331 :
332 0 : void ImplSkipActions( SvStream& rIStm, sal_uLong nSkipCount )
333 : {
334 : sal_Int32 nActionSize;
335 : sal_Int16 nType;
336 :
337 0 : for( sal_uLong i = 0UL; i < nSkipCount; i++ )
338 : {
339 0 : rIStm >> nType >> nActionSize;
340 0 : rIStm.SeekRel( nActionSize - 4L );
341 : }
342 0 : }
343 :
344 : // ------------------------------------------------------------------------
345 :
346 0 : bool ImplWriteExtendedPolyPolygonAction(SvStream& rOStm, const PolyPolygon& rPolyPolygon, bool bOnlyWhenCurve)
347 : {
348 0 : const sal_uInt16 nPolygonCount(rPolyPolygon.Count());
349 :
350 0 : if(nPolygonCount)
351 : {
352 0 : sal_uInt32 nAllPolygonCount(0);
353 0 : sal_uInt32 nAllPointCount(0);
354 0 : sal_uInt32 nAllFlagCount(0);
355 0 : sal_uInt16 a(0);
356 :
357 0 : for(a = 0; a < nPolygonCount; a++)
358 : {
359 0 : const Polygon& rCandidate = rPolyPolygon.GetObject(a);
360 0 : const sal_uInt16 nPointCount(rCandidate.GetSize());
361 :
362 0 : if(nPointCount)
363 : {
364 0 : nAllPolygonCount++;
365 0 : nAllPointCount += nPointCount;
366 :
367 0 : if(rCandidate.HasFlags())
368 : {
369 0 : nAllFlagCount += nPointCount;
370 : }
371 : }
372 : }
373 :
374 0 : if((bOnlyWhenCurve && nAllFlagCount) || (!bOnlyWhenCurve && nAllPointCount))
375 : {
376 0 : rOStm << (sal_Int16) GDI_EXTENDEDPOLYGON_ACTION;
377 :
378 : const sal_Int32 nActionSize(
379 : 4 + // Action size
380 : 2 + // PolygonCount
381 : (nAllPolygonCount * 2) + // Points per polygon
382 : (nAllPointCount << 3) + // Points themselves
383 : nAllPolygonCount + // Bool if (when poly has points) it has flags, too
384 0 : nAllFlagCount); // Flags themselves
385 :
386 0 : rOStm << nActionSize;
387 0 : rOStm << (sal_uInt16)nAllPolygonCount;
388 :
389 0 : for(a = 0; a < nPolygonCount; a++)
390 : {
391 0 : const Polygon& rCandidate = rPolyPolygon.GetObject(a);
392 0 : const sal_uInt16 nPointCount(rCandidate.GetSize());
393 :
394 0 : if(nPointCount)
395 : {
396 0 : rOStm << nPointCount;
397 :
398 0 : for(sal_uInt16 b(0); b < nPointCount; b++)
399 : {
400 0 : rOStm << rCandidate[b];
401 : }
402 :
403 0 : if(rCandidate.HasFlags())
404 : {
405 0 : rOStm << (sal_uInt8)true;
406 :
407 0 : for(sal_uInt16 c(0); c < nPointCount; c++)
408 : {
409 0 : rOStm << (sal_uInt8)rCandidate.GetFlags(c);
410 : }
411 : }
412 : else
413 : {
414 0 : rOStm << (sal_uInt8)false;
415 : }
416 : }
417 : }
418 :
419 0 : return true;
420 : }
421 : }
422 :
423 0 : return false;
424 : }
425 :
426 : // ------------------------------------------------------------------------
427 :
428 0 : void ImplReadExtendedPolyPolygonAction(SvStream& rIStm, PolyPolygon& rPolyPoly)
429 : {
430 0 : rPolyPoly.Clear();
431 0 : sal_uInt16 nPolygonCount(0);
432 0 : rIStm >> nPolygonCount;
433 :
434 0 : for(sal_uInt16 a(0); a < nPolygonCount; a++)
435 : {
436 0 : sal_uInt16 nPointCount(0);
437 0 : rIStm >> nPointCount;
438 0 : Polygon aCandidate(nPointCount);
439 :
440 0 : if(nPointCount)
441 : {
442 0 : for(sal_uInt16 b(0); b < nPointCount; b++)
443 : {
444 0 : rIStm >> aCandidate[b];
445 : }
446 :
447 0 : sal_uInt8 bHasFlags(false);
448 0 : rIStm >> bHasFlags;
449 :
450 0 : if(bHasFlags)
451 : {
452 0 : sal_uInt8 aPolyFlags(0);
453 :
454 0 : for(sal_uInt16 c(0); c < nPointCount; c++)
455 : {
456 0 : rIStm >> aPolyFlags;
457 0 : aCandidate.SetFlags(c, (PolyFlags)aPolyFlags);
458 : }
459 : }
460 : }
461 :
462 0 : rPolyPoly.Insert(aCandidate);
463 0 : }
464 0 : }
465 :
466 : // ----------------
467 : // - SVMConverter -
468 : // ----------------
469 :
470 1 : SVMConverter::SVMConverter( SvStream& rStm, GDIMetaFile& rMtf, sal_uLong nConvertMode )
471 : {
472 1 : if( !rStm.GetError() )
473 : {
474 1 : if( CONVERT_FROM_SVM1 == nConvertMode )
475 1 : ImplConvertFromSVM1( rStm, rMtf );
476 0 : else if( CONVERT_TO_SVM1 == nConvertMode )
477 0 : ImplConvertToSVM1( rStm, rMtf );
478 : }
479 1 : }
480 :
481 : // ------------------------------------------------------------------------
482 :
483 1 : void SVMConverter::ImplConvertFromSVM1( SvStream& rIStm, GDIMetaFile& rMtf )
484 : {
485 1 : const sal_uLong nPos = rIStm.Tell();
486 1 : const sal_uInt16 nOldFormat = rIStm.GetNumberFormatInt();
487 :
488 1 : rIStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
489 :
490 : char aCode[ 5 ];
491 1 : Size aPrefSz;
492 : sal_Int16 nSize;
493 : sal_Int16 nVersion;
494 :
495 : // read header
496 1 : rIStm.Read( (char*) &aCode, sizeof( aCode ) ); // Kennung
497 1 : rIStm >> nSize; // Size
498 1 : rIStm >> nVersion; // Version
499 : //#fdo39428 SvStream no longer supports operator>>(long&)
500 1 : sal_Int32 nTmp32(0);
501 1 : rIStm >> nTmp32;
502 1 : aPrefSz.Width() = nTmp32; // PrefSize.Width()
503 1 : rIStm >> nTmp32;
504 1 : aPrefSz.Height() = nTmp32; // PrefSize.Height()
505 :
506 : // check header-magic and version
507 2 : if( rIStm.GetError()
508 1 : || ( memcmp( aCode, "SVGDI", sizeof( aCode ) ) != 0 )
509 : || ( nVersion != 200 ) )
510 : {
511 1 : rIStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
512 1 : rIStm.SetNumberFormatInt( nOldFormat );
513 1 : rIStm.Seek( nPos );
514 1 : return;
515 : }
516 :
517 0 : LineInfo aLineInfo( LINE_NONE, 0 );
518 0 : ::std::stack< LineInfo* > aLIStack;
519 0 : VirtualDevice aFontVDev;
520 0 : rtl_TextEncoding eActualCharSet = osl_getThreadTextEncoding();
521 0 : sal_Bool bFatLine = sal_False;
522 :
523 : // TODO: fix reindentation below if you can accept being blamed by the SCM
524 0 : MapMode aMapMode;
525 0 : Polygon aActionPoly;
526 0 : Rectangle aRect;
527 0 : Point aPt, aPt1;
528 0 : Size aSz;
529 0 : Color aActionColor;
530 : sal_Int32 nTmp, nTmp1, nActionSize;
531 : sal_Int32 nActions;
532 : sal_Int16 nType;
533 :
534 0 : sal_uInt32 nUnicodeCommentStreamPos = 0;
535 0 : sal_Int32 nUnicodeCommentActionNumber = 0;
536 :
537 0 : ImplReadMapMode( rIStm, aMapMode ); // MapMode
538 0 : rIStm >> nActions; // Action count
539 :
540 0 : rMtf.SetPrefSize( aPrefSz );
541 0 : rMtf.SetPrefMapMode( aMapMode );
542 0 : size_t nLastPolygonAction(0);
543 :
544 0 : for( sal_Int32 i = 0L; i < nActions; i++ )
545 : {
546 0 : rIStm >> nType;
547 0 : sal_Int32 nActBegin = rIStm.Tell();
548 0 : rIStm >> nActionSize;
549 :
550 : DBG_ASSERT( ( nType <= 33 ) || ( nType >= 1024 ), "Unknown GDIMetaAction while converting!" );
551 :
552 0 : switch( nType )
553 : {
554 : case( GDI_PIXEL_ACTION ):
555 : {
556 0 : rIStm >> aPt;
557 0 : ImplReadColor( rIStm, aActionColor );
558 0 : rMtf.AddAction( new MetaPixelAction( aPt, aActionColor ) );
559 : }
560 0 : break;
561 :
562 : case( GDI_POINT_ACTION ):
563 : {
564 0 : rIStm >> aPt;
565 0 : rMtf.AddAction( new MetaPointAction( aPt ) );
566 : }
567 0 : break;
568 :
569 : case( GDI_LINE_ACTION ):
570 : {
571 0 : rIStm >> aPt >> aPt1;
572 0 : rMtf.AddAction( new MetaLineAction( aPt, aPt1, aLineInfo ) );
573 : }
574 0 : break;
575 :
576 : case (GDI_LINEJOIN_ACTION) :
577 : {
578 0 : sal_Int16 nLineJoin(0);
579 0 : rIStm >> nLineJoin;
580 0 : aLineInfo.SetLineJoin((basegfx::B2DLineJoin)nLineJoin);
581 : }
582 0 : break;
583 :
584 : case (GDI_LINECAP_ACTION) :
585 : {
586 0 : sal_Int16 nLineCap(0);
587 0 : rIStm >> nLineCap;
588 0 : aLineInfo.SetLineCap((com::sun::star::drawing::LineCap)nLineCap);
589 : }
590 0 : break;
591 :
592 : case (GDI_LINEDASHDOT_ACTION) :
593 : {
594 0 : sal_Int16 a(0);
595 0 : sal_Int32 b(0);
596 :
597 0 : rIStm >> a; aLineInfo.SetDashCount(a);
598 0 : rIStm >> b; aLineInfo.SetDashLen(b);
599 0 : rIStm >> a; aLineInfo.SetDotCount(a);
600 0 : rIStm >> b; aLineInfo.SetDotLen(b);
601 0 : rIStm >> b; aLineInfo.SetDistance(b);
602 :
603 0 : if(((aLineInfo.GetDashCount() && aLineInfo.GetDashLen())
604 0 : || (aLineInfo.GetDotCount() && aLineInfo.GetDotLen()))
605 0 : && aLineInfo.GetDistance())
606 : {
607 0 : aLineInfo.SetStyle(LINE_DASH);
608 : }
609 : }
610 0 : break;
611 :
612 : case (GDI_EXTENDEDPOLYGON_ACTION) :
613 : {
614 : // read the PolyPolygon in every case
615 0 : PolyPolygon aInputPolyPolygon;
616 0 : ImplReadExtendedPolyPolygonAction(rIStm, aInputPolyPolygon);
617 :
618 : // now check if it can be set somewhere
619 0 : if(nLastPolygonAction < rMtf.GetActionSize())
620 : {
621 0 : MetaPolyLineAction* pPolyLineAction = dynamic_cast< MetaPolyLineAction* >(rMtf.GetAction(nLastPolygonAction));
622 :
623 0 : if(pPolyLineAction)
624 : {
625 : // replace MetaPolyLineAction when we have a single polygon. Do not rely on the
626 : // same point count; the originally written GDI_POLYLINE_ACTION may have been
627 : // Subdivided for better quality for older usages
628 0 : if(1 == aInputPolyPolygon.Count())
629 : {
630 : rMtf.ReplaceAction(
631 : new MetaPolyLineAction(
632 : aInputPolyPolygon.GetObject(0),
633 0 : pPolyLineAction->GetLineInfo()),
634 0 : nLastPolygonAction);
635 0 : pPolyLineAction->Delete();
636 : }
637 : }
638 : else
639 : {
640 0 : MetaPolyPolygonAction* pPolyPolygonAction = dynamic_cast< MetaPolyPolygonAction* >(rMtf.GetAction(nLastPolygonAction));
641 :
642 0 : if(pPolyPolygonAction)
643 : {
644 : // replace MetaPolyPolygonAction when we have a curved polygon. Do rely on the
645 : // same sub-polygon count
646 0 : if(pPolyPolygonAction->GetPolyPolygon().Count() == aInputPolyPolygon.Count())
647 : {
648 : rMtf.ReplaceAction(
649 : new MetaPolyPolygonAction(
650 0 : aInputPolyPolygon),
651 0 : nLastPolygonAction);
652 0 : pPolyPolygonAction->Delete();
653 : }
654 : }
655 : else
656 : {
657 0 : MetaPolygonAction* pPolygonAction = dynamic_cast< MetaPolygonAction* >(rMtf.GetAction(nLastPolygonAction));
658 :
659 0 : if(pPolygonAction)
660 : {
661 : // replace MetaPolygonAction
662 0 : if(1 == aInputPolyPolygon.Count())
663 : {
664 : rMtf.ReplaceAction(
665 : new MetaPolygonAction(
666 0 : aInputPolyPolygon.GetObject(0)),
667 0 : nLastPolygonAction);
668 0 : pPolygonAction->Delete();
669 : }
670 : }
671 : }
672 : }
673 0 : }
674 : }
675 0 : break;
676 :
677 : case( GDI_RECT_ACTION ):
678 : {
679 0 : ImplReadRect( rIStm, aRect );
680 0 : rIStm >> nTmp >> nTmp1;
681 :
682 0 : if( nTmp || nTmp1 )
683 0 : rMtf.AddAction( new MetaRoundRectAction( aRect, nTmp, nTmp1 ) );
684 : else
685 : {
686 0 : rMtf.AddAction( new MetaRectAction( aRect ) );
687 :
688 0 : if( bFatLine )
689 0 : rMtf.AddAction( new MetaPolyLineAction( aRect, aLineInfo ) );
690 : }
691 : }
692 0 : break;
693 :
694 : case( GDI_ELLIPSE_ACTION ):
695 : {
696 0 : ImplReadRect( rIStm, aRect );
697 :
698 0 : if( bFatLine )
699 : {
700 0 : const Polygon aPoly( aRect.Center(), aRect.GetWidth() >> 1, aRect.GetHeight() >> 1 );
701 :
702 0 : rMtf.AddAction( new MetaPushAction( PUSH_LINECOLOR ) );
703 0 : rMtf.AddAction( new MetaLineColorAction( COL_TRANSPARENT, sal_False ) );
704 0 : rMtf.AddAction( new MetaPolygonAction( aPoly ) );
705 0 : rMtf.AddAction( new MetaPopAction() );
706 0 : rMtf.AddAction( new MetaPolyLineAction( aPoly, aLineInfo ) );
707 : }
708 : else
709 0 : rMtf.AddAction( new MetaEllipseAction( aRect ) );
710 : }
711 0 : break;
712 :
713 : case( GDI_ARC_ACTION ):
714 : {
715 0 : ImplReadRect( rIStm, aRect );
716 0 : rIStm >> aPt >> aPt1;
717 :
718 0 : if( bFatLine )
719 : {
720 0 : const Polygon aPoly( aRect, aPt, aPt1, POLY_ARC );
721 :
722 0 : rMtf.AddAction( new MetaPushAction( PUSH_LINECOLOR ) );
723 0 : rMtf.AddAction( new MetaLineColorAction( COL_TRANSPARENT, sal_False ) );
724 0 : rMtf.AddAction( new MetaPolygonAction( aPoly ) );
725 0 : rMtf.AddAction( new MetaPopAction() );
726 0 : rMtf.AddAction( new MetaPolyLineAction( aPoly, aLineInfo ) );
727 : }
728 : else
729 0 : rMtf.AddAction( new MetaArcAction( aRect, aPt, aPt1 ) );
730 : }
731 0 : break;
732 :
733 : case( GDI_PIE_ACTION ):
734 : {
735 0 : ImplReadRect( rIStm, aRect );
736 0 : rIStm >> aPt >> aPt1;
737 :
738 0 : if( bFatLine )
739 : {
740 0 : const Polygon aPoly( aRect, aPt, aPt1, POLY_PIE );
741 :
742 0 : rMtf.AddAction( new MetaPushAction( PUSH_LINECOLOR ) );
743 0 : rMtf.AddAction( new MetaLineColorAction( COL_TRANSPARENT, sal_False ) );
744 0 : rMtf.AddAction( new MetaPolygonAction( aPoly ) );
745 0 : rMtf.AddAction( new MetaPopAction() );
746 0 : rMtf.AddAction( new MetaPolyLineAction( aPoly, aLineInfo ) );
747 : }
748 : else
749 0 : rMtf.AddAction( new MetaPieAction( aRect, aPt, aPt1 ) );
750 : }
751 0 : break;
752 :
753 : case( GDI_INVERTRECT_ACTION ):
754 : case( GDI_HIGHLIGHTRECT_ACTION ):
755 : {
756 0 : ImplReadRect( rIStm, aRect );
757 0 : rMtf.AddAction( new MetaPushAction( PUSH_RASTEROP ) );
758 0 : rMtf.AddAction( new MetaRasterOpAction( ROP_INVERT ) );
759 0 : rMtf.AddAction( new MetaRectAction( aRect ) );
760 0 : rMtf.AddAction( new MetaPopAction() );
761 : }
762 0 : break;
763 :
764 : case( GDI_POLYLINE_ACTION ):
765 : {
766 0 : ImplReadPoly( rIStm, aActionPoly );
767 0 : nLastPolygonAction = rMtf.GetActionSize();
768 :
769 0 : if( bFatLine )
770 0 : rMtf.AddAction( new MetaPolyLineAction( aActionPoly, aLineInfo ) );
771 : else
772 0 : rMtf.AddAction( new MetaPolyLineAction( aActionPoly ) );
773 : }
774 0 : break;
775 :
776 : case( GDI_POLYGON_ACTION ):
777 : {
778 0 : ImplReadPoly( rIStm, aActionPoly );
779 :
780 0 : if( bFatLine )
781 : {
782 0 : rMtf.AddAction( new MetaPushAction( PUSH_LINECOLOR ) );
783 0 : rMtf.AddAction( new MetaLineColorAction( COL_TRANSPARENT, sal_False ) );
784 0 : rMtf.AddAction( new MetaPolygonAction( aActionPoly ) );
785 0 : rMtf.AddAction( new MetaPopAction() );
786 0 : rMtf.AddAction( new MetaPolyLineAction( aActionPoly, aLineInfo ) );
787 : }
788 : else
789 : {
790 0 : nLastPolygonAction = rMtf.GetActionSize();
791 0 : rMtf.AddAction( new MetaPolygonAction( aActionPoly ) );
792 : }
793 : }
794 0 : break;
795 :
796 : case( GDI_POLYPOLYGON_ACTION ):
797 : {
798 0 : PolyPolygon aPolyPoly;
799 :
800 0 : ImplReadPolyPoly( rIStm, aPolyPoly );
801 :
802 0 : if( bFatLine )
803 : {
804 0 : rMtf.AddAction( new MetaPushAction( PUSH_LINECOLOR ) );
805 0 : rMtf.AddAction( new MetaLineColorAction( COL_TRANSPARENT, sal_False ) );
806 0 : rMtf.AddAction( new MetaPolyPolygonAction( aPolyPoly ) );
807 0 : rMtf.AddAction( new MetaPopAction() );
808 :
809 0 : for( sal_uInt16 nPoly = 0, nCount = aPolyPoly.Count(); nPoly < nCount; nPoly++ )
810 0 : rMtf.AddAction( new MetaPolyLineAction( aPolyPoly[ nPoly ], aLineInfo ) );
811 : }
812 : else
813 : {
814 0 : nLastPolygonAction = rMtf.GetActionSize();
815 0 : rMtf.AddAction( new MetaPolyPolygonAction( aPolyPoly ) );
816 0 : }
817 : }
818 0 : break;
819 :
820 : case( GDI_FONT_ACTION ):
821 : {
822 0 : Font aFont;
823 : char aName[ 32 ];
824 : sal_Int32 nWidth, nHeight;
825 : sal_Int16 nCharSet, nFamily, nPitch, nAlign, nWeight, nUnderline, nStrikeout;
826 : sal_Int16 nCharOrient, nLineOrient;
827 : sal_Bool bItalic, bOutline, bShadow, bTransparent;
828 :
829 0 : ImplReadColor( rIStm, aActionColor ); aFont.SetColor( aActionColor );
830 0 : ImplReadColor( rIStm, aActionColor ); aFont.SetFillColor( aActionColor );
831 0 : rIStm.Read( aName, 32 );
832 0 : aFont.SetName( UniString( aName, rIStm.GetStreamCharSet() ) );
833 0 : rIStm >> nWidth >> nHeight;
834 0 : rIStm >> nCharOrient >> nLineOrient;
835 0 : rIStm >> nCharSet >> nFamily >> nPitch >> nAlign >> nWeight >> nUnderline >> nStrikeout;
836 0 : rIStm >> bItalic >> bOutline >> bShadow >> bTransparent;
837 :
838 0 : aFont.SetSize( Size( nWidth, nHeight ) );
839 0 : aFont.SetCharSet( (CharSet) nCharSet );
840 0 : aFont.SetFamily( (FontFamily) nFamily );
841 0 : aFont.SetPitch( (FontPitch) nPitch );
842 0 : aFont.SetAlign( (FontAlign) nAlign );
843 : aFont.SetWeight( ( nWeight == 1 ) ? WEIGHT_LIGHT : ( nWeight == 2 ) ? WEIGHT_NORMAL :
844 0 : ( nWeight == 3 ) ? WEIGHT_BOLD : WEIGHT_DONTKNOW );
845 0 : aFont.SetUnderline( (FontUnderline) nUnderline );
846 0 : aFont.SetStrikeout( (FontStrikeout) nStrikeout );
847 0 : aFont.SetItalic( bItalic ? ITALIC_NORMAL : ITALIC_NONE );
848 0 : aFont.SetOutline( bOutline );
849 0 : aFont.SetShadow( bShadow );
850 0 : aFont.SetOrientation( nLineOrient );
851 0 : aFont.SetTransparent( bTransparent );
852 :
853 0 : eActualCharSet = aFont.GetCharSet();
854 0 : if ( eActualCharSet == RTL_TEXTENCODING_DONTKNOW )
855 0 : eActualCharSet = osl_getThreadTextEncoding();
856 :
857 0 : rMtf.AddAction( new MetaFontAction( aFont ) );
858 0 : rMtf.AddAction( new MetaTextAlignAction( aFont.GetAlign() ) );
859 0 : rMtf.AddAction( new MetaTextColorAction( aFont.GetColor() ) );
860 0 : rMtf.AddAction( new MetaTextFillColorAction( aFont.GetFillColor(), !aFont.IsTransparent() ) );
861 :
862 : // #106172# Track font relevant data in shadow VDev
863 0 : aFontVDev.SetFont( aFont );
864 : }
865 0 : break;
866 :
867 : case( GDI_TEXT_ACTION ):
868 : {
869 : sal_Int32 nIndex, nLen;
870 :
871 0 : rIStm >> aPt >> nIndex >> nLen >> nTmp;
872 0 : if ( nTmp && ( static_cast< sal_uInt32 >( nTmp ) < ( SAL_MAX_UINT16 - 1 ) ) )
873 : {
874 0 : rtl::OString aByteStr = read_uInt8s_ToOString(rIStm, nTmp);
875 0 : sal_uInt8 nTerminator = 0;
876 0 : rIStm >> nTerminator;
877 : DBG_ASSERT( nTerminator == 0, "expected string to be NULL terminated" );
878 :
879 0 : UniString aStr(rtl::OStringToOUString(aByteStr, eActualCharSet));
880 0 : if ( nUnicodeCommentActionNumber == i )
881 0 : ImplReadUnicodeComment( nUnicodeCommentStreamPos, rIStm, aStr );
882 0 : rMtf.AddAction( new MetaTextAction( aPt, aStr, (sal_uInt16) nIndex, (sal_uInt16) nLen ) );
883 : }
884 0 : rIStm.Seek( nActBegin + nActionSize );
885 : }
886 0 : break;
887 :
888 : case( GDI_TEXTARRAY_ACTION ):
889 : {
890 0 : sal_Int32* pDXAry = NULL;
891 : sal_Int32 nIndex, nLen, nAryLen;
892 :
893 0 : rIStm >> aPt >> nIndex >> nLen >> nTmp >> nAryLen;
894 0 : if ( nTmp && ( static_cast< sal_uInt32 >( nTmp ) < ( SAL_MAX_UINT16 - 1 ) ) )
895 : {
896 0 : rtl::OString aByteStr = read_uInt8s_ToOString(rIStm, nTmp);
897 0 : sal_uInt8 nTerminator = 0;
898 0 : rIStm >> nTerminator;
899 : DBG_ASSERT( nTerminator == 0, "expected string to be NULL terminated" );
900 :
901 0 : UniString aStr(rtl::OStringToOUString(aByteStr, eActualCharSet));
902 :
903 0 : if( nAryLen > 0L )
904 : {
905 0 : sal_Int32 nStrLen( aStr.Len() );
906 :
907 0 : pDXAry = new sal_Int32[ Max( nAryLen, nStrLen ) ];
908 :
909 0 : for( long j = 0L; j < nAryLen; j++ )
910 0 : rIStm >> nTmp, pDXAry[ j ] = nTmp;
911 :
912 : // #106172# Add last DX array elem, if missing
913 0 : if( nAryLen != nStrLen )
914 : {
915 0 : if( nAryLen+1 == nStrLen )
916 : {
917 0 : sal_Int32* pTmpAry = new sal_Int32[nStrLen];
918 :
919 0 : aFontVDev.GetTextArray( aStr, pTmpAry, (sal_uInt16) nIndex, (sal_uInt16) nLen );
920 :
921 : // now, the difference between the
922 : // last and the second last DX array
923 : // is the advancement for the last
924 : // glyph. Thus, to complete our meta
925 : // action's DX array, just add that
926 : // difference to last elem and store
927 : // in very last.
928 0 : if( nStrLen > 1 )
929 0 : pDXAry[ nStrLen-1 ] = pDXAry[ nStrLen-2 ] + pTmpAry[ nStrLen-1 ] - pTmpAry[ nStrLen-2 ];
930 : else
931 0 : pDXAry[ nStrLen-1 ] = pTmpAry[ nStrLen-1 ]; // len=1: 0th position taken to be 0
932 :
933 0 : delete[] pTmpAry;
934 : }
935 : #ifdef DBG_UTIL
936 : else
937 : OSL_FAIL("More than one DX array element missing on SVM import");
938 : #endif
939 : }
940 : }
941 0 : if ( nUnicodeCommentActionNumber == i )
942 0 : ImplReadUnicodeComment( nUnicodeCommentStreamPos, rIStm, aStr );
943 0 : rMtf.AddAction( new MetaTextArrayAction( aPt, aStr, pDXAry, (sal_uInt16) nIndex, (sal_uInt16) nLen ) );
944 :
945 0 : if( pDXAry )
946 0 : delete[] pDXAry;
947 : }
948 0 : rIStm.Seek( nActBegin + nActionSize );
949 : }
950 0 : break;
951 :
952 : case( GDI_STRETCHTEXT_ACTION ):
953 : {
954 : sal_Int32 nIndex, nLen, nWidth;
955 :
956 0 : rIStm >> aPt >> nIndex >> nLen >> nTmp >> nWidth;
957 0 : if ( nTmp && ( static_cast< sal_uInt32 >( nTmp ) < ( SAL_MAX_INT16 - 1 ) ) )
958 : {
959 0 : rtl::OString aByteStr = read_uInt8s_ToOString(rIStm, nTmp);
960 0 : sal_uInt8 nTerminator = 0;
961 0 : rIStm >> nTerminator;
962 : DBG_ASSERT( nTerminator == 0, "expected string to be NULL terminated" );
963 :
964 0 : UniString aStr(rtl::OStringToOUString(aByteStr, eActualCharSet));
965 0 : if ( nUnicodeCommentActionNumber == i )
966 0 : ImplReadUnicodeComment( nUnicodeCommentStreamPos, rIStm, aStr );
967 0 : rMtf.AddAction( new MetaStretchTextAction( aPt, nWidth, aStr, (sal_uInt16) nIndex, (sal_uInt16) nLen ) );
968 : }
969 0 : rIStm.Seek( nActBegin + nActionSize );
970 : }
971 0 : break;
972 :
973 : case( GDI_BITMAP_ACTION ):
974 : {
975 0 : Bitmap aBmp;
976 :
977 0 : rIStm >> aPt >> aBmp;
978 0 : rMtf.AddAction( new MetaBmpAction( aPt, aBmp ) );
979 : }
980 0 : break;
981 :
982 : case( GDI_BITMAPSCALE_ACTION ):
983 : {
984 0 : Bitmap aBmp;
985 :
986 0 : rIStm >> aPt >> aSz >> aBmp;
987 0 : rMtf.AddAction( new MetaBmpScaleAction( aPt, aSz, aBmp ) );
988 : }
989 0 : break;
990 :
991 : case( GDI_BITMAPSCALEPART_ACTION ):
992 : {
993 0 : Bitmap aBmp;
994 0 : Size aSz2;
995 :
996 0 : rIStm >> aPt >> aSz >> aPt1 >> aSz2 >> aBmp;
997 0 : rMtf.AddAction( new MetaBmpScalePartAction( aPt, aSz, aPt1, aSz2, aBmp ) );
998 : }
999 0 : break;
1000 :
1001 : case( GDI_PEN_ACTION ):
1002 : {
1003 : sal_Int32 nPenWidth;
1004 : sal_Int16 nPenStyle;
1005 :
1006 0 : ImplReadColor( rIStm, aActionColor );
1007 0 : rIStm >> nPenWidth >> nPenStyle;
1008 :
1009 0 : aLineInfo.SetStyle( nPenStyle ? LINE_SOLID : LINE_NONE );
1010 0 : aLineInfo.SetWidth( nPenWidth );
1011 0 : bFatLine = nPenStyle && !aLineInfo.IsDefault();
1012 :
1013 0 : rMtf.AddAction( new MetaLineColorAction( aActionColor, nPenStyle != 0 ) );
1014 : }
1015 0 : break;
1016 :
1017 : case( GDI_FILLBRUSH_ACTION ):
1018 : {
1019 : sal_Int16 nBrushStyle;
1020 :
1021 0 : ImplReadColor( rIStm, aActionColor );
1022 0 : rIStm.SeekRel( 6L );
1023 0 : rIStm >> nBrushStyle;
1024 0 : rMtf.AddAction( new MetaFillColorAction( aActionColor, nBrushStyle != 0 ) );
1025 0 : rIStm.SeekRel( 2L );
1026 : }
1027 0 : break;
1028 :
1029 : case( GDI_MAPMODE_ACTION ):
1030 : {
1031 0 : ImplReadMapMode( rIStm, aMapMode );
1032 0 : rMtf.AddAction( new MetaMapModeAction( aMapMode ) );
1033 :
1034 : // #106172# Track font relevant data in shadow VDev
1035 0 : aFontVDev.SetMapMode( aMapMode );
1036 : }
1037 0 : break;
1038 :
1039 : case( GDI_CLIPREGION_ACTION ):
1040 : {
1041 0 : Region aRegion;
1042 : sal_Int16 nRegType;
1043 : sal_Int16 bIntersect;
1044 0 : sal_Bool bClip = sal_False;
1045 :
1046 0 : rIStm >> nRegType >> bIntersect;
1047 0 : ImplReadRect( rIStm, aRect );
1048 :
1049 0 : switch( nRegType )
1050 : {
1051 : case( 0 ):
1052 0 : break;
1053 :
1054 : case( 1 ):
1055 : {
1056 0 : Rectangle aRegRect;
1057 :
1058 0 : ImplReadRect( rIStm, aRegRect );
1059 0 : aRegion = Region( aRegRect );
1060 0 : bClip = sal_True;
1061 : }
1062 0 : break;
1063 :
1064 : case( 2 ):
1065 : {
1066 0 : ImplReadPoly( rIStm, aActionPoly );
1067 0 : aRegion = Region( aActionPoly );
1068 0 : bClip = sal_True;
1069 : }
1070 0 : break;
1071 :
1072 : case( 3 ):
1073 : {
1074 0 : PolyPolygon aPolyPoly;
1075 : sal_Int32 nPolyCount;
1076 :
1077 0 : rIStm >> nPolyCount;
1078 :
1079 0 : for( sal_uInt16 j = 0; j < (sal_uInt16) nPolyCount; j++ )
1080 : {
1081 0 : ImplReadPoly( rIStm, aActionPoly );
1082 0 : aPolyPoly.Insert( aActionPoly );
1083 : }
1084 :
1085 0 : aRegion = Region( aPolyPoly );
1086 0 : bClip = sal_True;
1087 : }
1088 0 : break;
1089 : }
1090 :
1091 0 : if( bIntersect )
1092 0 : aRegion.Intersect( aRect );
1093 :
1094 0 : rMtf.AddAction( new MetaClipRegionAction( aRegion, bClip ) );
1095 : }
1096 0 : break;
1097 :
1098 : case( GDI_MOVECLIPREGION_ACTION ):
1099 : {
1100 0 : rIStm >> nTmp >> nTmp1;
1101 0 : rMtf.AddAction( new MetaMoveClipRegionAction( nTmp, nTmp1 ) );
1102 : }
1103 0 : break;
1104 :
1105 : case( GDI_ISECTCLIPREGION_ACTION ):
1106 : {
1107 0 : ImplReadRect( rIStm, aRect );
1108 0 : rMtf.AddAction( new MetaISectRectClipRegionAction( aRect ) );
1109 : }
1110 0 : break;
1111 :
1112 : case( GDI_RASTEROP_ACTION ):
1113 : {
1114 : RasterOp eRasterOp;
1115 : sal_Int16 nRasterOp;
1116 :
1117 0 : rIStm >> nRasterOp;
1118 :
1119 0 : switch( nRasterOp )
1120 : {
1121 : case( 1 ):
1122 0 : eRasterOp = ROP_INVERT;
1123 0 : break;
1124 :
1125 : case( 4 ):
1126 : case( 5 ):
1127 0 : eRasterOp = ROP_XOR;
1128 0 : break;
1129 :
1130 : default:
1131 0 : eRasterOp = ROP_OVERPAINT;
1132 0 : break;
1133 : }
1134 :
1135 0 : rMtf.AddAction( new MetaRasterOpAction( eRasterOp ) );
1136 : }
1137 0 : break;
1138 :
1139 : case( GDI_PUSH_ACTION ):
1140 : {
1141 0 : aLIStack.push( new LineInfo( aLineInfo ) );
1142 0 : rMtf.AddAction( new MetaPushAction( PUSH_ALL ) );
1143 :
1144 : // #106172# Track font relevant data in shadow VDev
1145 0 : aFontVDev.Push();
1146 : }
1147 0 : break;
1148 :
1149 : case( GDI_POP_ACTION ):
1150 : {
1151 :
1152 : LineInfo* pLineInfo;
1153 0 : if (aLIStack.empty())
1154 0 : pLineInfo = NULL;
1155 : else
1156 : {
1157 0 : pLineInfo = aLIStack.top();
1158 0 : aLIStack.pop();
1159 : }
1160 :
1161 : // restore line info
1162 0 : if( pLineInfo )
1163 : {
1164 0 : aLineInfo = *pLineInfo;
1165 0 : delete pLineInfo;
1166 0 : bFatLine = ( LINE_NONE != aLineInfo.GetStyle() ) && !aLineInfo.IsDefault();
1167 : }
1168 :
1169 0 : rMtf.AddAction( new MetaPopAction() );
1170 :
1171 : // #106172# Track font relevant data in shadow VDev
1172 0 : aFontVDev.Pop();
1173 : }
1174 0 : break;
1175 :
1176 : case( GDI_GRADIENT_ACTION ):
1177 : {
1178 0 : Color aStartCol;
1179 0 : Color aEndCol;
1180 : sal_Int16 nStyle;
1181 : sal_Int16 nAngle;
1182 : sal_Int16 nBorder;
1183 : sal_Int16 nOfsX;
1184 : sal_Int16 nOfsY;
1185 : sal_Int16 nIntensityStart;
1186 : sal_Int16 nIntensityEnd;
1187 :
1188 0 : ImplReadRect( rIStm, aRect );
1189 0 : rIStm >> nStyle;
1190 0 : ImplReadColor( rIStm, aStartCol );
1191 0 : ImplReadColor( rIStm, aEndCol );
1192 0 : rIStm >> nAngle >> nBorder >> nOfsX >> nOfsY >> nIntensityStart >> nIntensityEnd;
1193 :
1194 0 : Gradient aGrad( (GradientStyle) nStyle, aStartCol, aEndCol );
1195 :
1196 0 : aGrad.SetAngle( nAngle );
1197 0 : aGrad.SetBorder( nBorder );
1198 0 : aGrad.SetOfsX( nOfsX );
1199 0 : aGrad.SetOfsY( nOfsY );
1200 0 : aGrad.SetStartIntensity( nIntensityStart );
1201 0 : aGrad.SetEndIntensity( nIntensityEnd );
1202 0 : rMtf.AddAction( new MetaGradientAction( aRect, aGrad ) );
1203 : }
1204 0 : break;
1205 :
1206 : case( GDI_TRANSPARENT_COMMENT ):
1207 : {
1208 0 : PolyPolygon aPolyPoly;
1209 : sal_Int32 nFollowingActionCount;
1210 : sal_Int16 nTrans;
1211 :
1212 0 : rIStm >> aPolyPoly >> nTrans >> nFollowingActionCount;
1213 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1214 0 : rMtf.AddAction( new MetaTransparentAction( aPolyPoly, nTrans ) );
1215 :
1216 0 : i += nFollowingActionCount;
1217 : }
1218 0 : break;
1219 :
1220 : case( GDI_FLOATTRANSPARENT_COMMENT ):
1221 : {
1222 0 : GDIMetaFile aMtf;
1223 0 : Point aPos;
1224 0 : Size aSize;
1225 0 : Gradient aGradient;
1226 : sal_Int32 nFollowingActionCount;
1227 :
1228 0 : rIStm >> aMtf >> aPos >> aSize >> aGradient >> nFollowingActionCount;
1229 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1230 0 : rMtf.AddAction( new MetaFloatTransparentAction( aMtf, aPos, aSize, aGradient ) );
1231 :
1232 0 : i += nFollowingActionCount;
1233 : }
1234 0 : break;
1235 :
1236 : case( GDI_HATCH_COMMENT ):
1237 : {
1238 0 : PolyPolygon aPolyPoly;
1239 0 : Hatch aHatch;
1240 : sal_Int32 nFollowingActionCount;
1241 :
1242 0 : rIStm >> aPolyPoly >> aHatch >> nFollowingActionCount;
1243 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1244 0 : rMtf.AddAction( new MetaHatchAction( aPolyPoly, aHatch ) );
1245 :
1246 0 : i += nFollowingActionCount;
1247 : }
1248 0 : break;
1249 :
1250 : case( GDI_REFPOINT_COMMENT ):
1251 : {
1252 0 : Point aRefPoint;
1253 : sal_Bool bSet;
1254 : sal_Int32 nFollowingActionCount;
1255 :
1256 0 : rIStm >> aRefPoint >> bSet >> nFollowingActionCount;
1257 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1258 0 : rMtf.AddAction( new MetaRefPointAction( aRefPoint, bSet ) );
1259 :
1260 0 : i += nFollowingActionCount;
1261 :
1262 : // #106172# Track font relevant data in shadow VDev
1263 0 : if( bSet )
1264 0 : aFontVDev.SetRefPoint( aRefPoint );
1265 : else
1266 0 : aFontVDev.SetRefPoint();
1267 : }
1268 0 : break;
1269 :
1270 : case( GDI_TEXTLINECOLOR_COMMENT ):
1271 : {
1272 0 : Color aColor;
1273 : sal_Bool bSet;
1274 : sal_Int32 nFollowingActionCount;
1275 :
1276 0 : rIStm >> aColor >> bSet >> nFollowingActionCount;
1277 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1278 0 : rMtf.AddAction( new MetaTextLineColorAction( aColor, bSet ) );
1279 :
1280 0 : i += nFollowingActionCount;
1281 : }
1282 0 : break;
1283 :
1284 : case( GDI_TEXTLINE_COMMENT ):
1285 : {
1286 0 : Point aStartPt;
1287 : //#fdo39428 SvStream no longer supports operator>>(long&)
1288 : sal_Int32 nWidth;
1289 : sal_uInt32 nStrikeout;
1290 : sal_uInt32 nUnderline;
1291 : sal_Int32 nFollowingActionCount;
1292 :
1293 0 : rIStm >> aStartPt >> nWidth >> nStrikeout >> nUnderline >> nFollowingActionCount;
1294 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1295 : rMtf.AddAction( new MetaTextLineAction( aStartPt, nWidth,
1296 : (FontStrikeout) nStrikeout,
1297 : (FontUnderline) nUnderline,
1298 0 : UNDERLINE_NONE ) );
1299 :
1300 0 : i += nFollowingActionCount;
1301 : }
1302 0 : break;
1303 :
1304 : case( GDI_GRADIENTEX_COMMENT ):
1305 : {
1306 0 : PolyPolygon aPolyPoly;
1307 0 : Gradient aGradient;
1308 : sal_Int32 nFollowingActionCount;
1309 :
1310 0 : rIStm >> aPolyPoly >> aGradient >> nFollowingActionCount;
1311 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1312 0 : rMtf.AddAction( new MetaGradientExAction( aPolyPoly, aGradient ) );
1313 :
1314 0 : i += nFollowingActionCount;
1315 : }
1316 0 : break;
1317 :
1318 : case( GDI_COMMENT_COMMENT ):
1319 : {
1320 : sal_Int32 nValue;
1321 : sal_uInt32 nDataSize;
1322 : sal_uInt8* pData;
1323 : sal_Int32 nFollowingActionCount;
1324 :
1325 0 : rtl::OString aComment = read_lenPrefixed_uInt8s_ToOString<sal_uInt16>(rIStm);
1326 0 : rIStm >> nValue >> nDataSize;
1327 :
1328 0 : if( nDataSize )
1329 : {
1330 0 : pData = new sal_uInt8[ nDataSize ];
1331 0 : rIStm.Read( pData, nDataSize );
1332 : }
1333 : else
1334 0 : pData = NULL;
1335 :
1336 0 : rIStm >> nFollowingActionCount;
1337 0 : ImplSkipActions( rIStm, nFollowingActionCount );
1338 0 : rMtf.AddAction( new MetaCommentAction( aComment, nValue, pData, nDataSize ) );
1339 :
1340 0 : i += nFollowingActionCount;
1341 : }
1342 0 : break;
1343 :
1344 : case ( GDI_UNICODE_COMMENT ):
1345 : {
1346 0 : nUnicodeCommentActionNumber = i + 1;
1347 0 : nUnicodeCommentStreamPos = rIStm.Tell() - 6;
1348 0 : rIStm.SeekRel( nActionSize - 4 );
1349 : }
1350 0 : break;
1351 :
1352 : default:
1353 0 : rIStm.SeekRel( nActionSize - 4L );
1354 0 : break;
1355 : }
1356 : }
1357 :
1358 : // cleanup push-pop stack if neccessary
1359 0 : while( !aLIStack.empty() )
1360 : {
1361 0 : delete aLIStack.top();
1362 0 : aLIStack.pop();
1363 : }
1364 :
1365 0 : rIStm.SetNumberFormatInt( nOldFormat );
1366 : }
1367 :
1368 : // ------------------------------------------------------------------------
1369 :
1370 0 : void SVMConverter::ImplConvertToSVM1( SvStream& rOStm, GDIMetaFile& rMtf )
1371 : {
1372 : sal_uLong nCountPos;
1373 0 : Font aSaveFont;
1374 0 : const sal_uInt16 nOldFormat = rOStm.GetNumberFormatInt();
1375 0 : rtl_TextEncoding eActualCharSet = osl_getThreadTextEncoding();
1376 0 : const Size aPrefSize( rMtf.GetPrefSize() );
1377 0 : sal_Bool bRop_0_1 = sal_False;
1378 0 : VirtualDevice aSaveVDev;
1379 0 : Color aLineCol( COL_BLACK );
1380 0 : ::std::stack< Color* > aLineColStack;
1381 :
1382 0 : rOStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
1383 :
1384 : //MagicCode schreiben
1385 0 : rOStm << "SVGDI"; // Kennung
1386 0 : rOStm << (sal_Int16) 42; // HeaderSize
1387 0 : rOStm << (sal_Int16) 200; // VERSION
1388 0 : rOStm << (sal_Int32) aPrefSize.Width();
1389 0 : rOStm << (sal_Int32) aPrefSize.Height();
1390 0 : ImplWriteMapMode( rOStm, rMtf.GetPrefMapMode() );
1391 :
1392 : // ActionCount wird spaeter geschrieben
1393 0 : nCountPos = rOStm.Tell();
1394 0 : rOStm.SeekRel( 4L );
1395 :
1396 0 : const sal_Int32 nActCount = ImplWriteActions( rOStm, rMtf, aSaveVDev, bRop_0_1, aLineCol, aLineColStack, eActualCharSet );
1397 0 : const sal_uLong nActPos = rOStm.Tell();
1398 :
1399 0 : rOStm.Seek( nCountPos );
1400 0 : rOStm << nActCount;
1401 0 : rOStm.Seek( nActPos );
1402 0 : rOStm.SetNumberFormatInt( nOldFormat );
1403 :
1404 : // cleanup push-pop stack if neccessary
1405 0 : while ( !aLineColStack.empty() )
1406 : {
1407 0 : delete aLineColStack.top();
1408 0 : aLineColStack.pop();
1409 0 : }
1410 0 : }
1411 :
1412 : // ------------------------------------------------------------------------
1413 :
1414 0 : sal_uLong SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf,
1415 : VirtualDevice& rSaveVDev, sal_Bool& rRop_0_1,
1416 : Color& rLineCol, ::std::stack< Color* >& rLineColStack,
1417 : rtl_TextEncoding& rActualCharSet )
1418 : {
1419 0 : sal_uLong nCount = 0;
1420 0 : for( size_t i = 0, nActionCount = rMtf.GetActionSize(); i < nActionCount; i++ )
1421 : {
1422 0 : const MetaAction* pAction = rMtf.GetAction( i );
1423 :
1424 0 : switch( pAction->GetType() )
1425 : {
1426 : case( META_PIXEL_ACTION ):
1427 : {
1428 0 : MetaPixelAction* pAct = (MetaPixelAction*) pAction;
1429 :
1430 0 : rOStm << (sal_Int16) GDI_PIXEL_ACTION;
1431 0 : rOStm << (sal_Int32) 18;
1432 0 : rOStm << pAct->GetPoint();
1433 0 : ImplWriteColor( rOStm, pAct->GetColor() );
1434 0 : nCount++;
1435 : }
1436 0 : break;
1437 :
1438 : case( META_POINT_ACTION ):
1439 : {
1440 0 : MetaPointAction* pAct = (MetaPointAction*) pAction;
1441 :
1442 0 : rOStm << (sal_Int16) GDI_POINT_ACTION;
1443 0 : rOStm << (sal_Int32) 12;
1444 0 : rOStm << pAct->GetPoint();
1445 0 : nCount++;
1446 : }
1447 0 : break;
1448 :
1449 : case( META_LINE_ACTION ):
1450 : {
1451 0 : MetaLineAction* pAct = (MetaLineAction*) pAction;
1452 0 : const LineInfo& rInfo = pAct->GetLineInfo();
1453 0 : const bool bFatLine(!rInfo.IsDefault() && (LINE_NONE != rInfo.GetStyle()));
1454 0 : const bool bLineJoin(bFatLine && basegfx::B2DLINEJOIN_ROUND != rInfo.GetLineJoin());
1455 0 : const bool bLineCap(bFatLine && com::sun::star::drawing::LineCap_BUTT != rInfo.GetLineCap());
1456 0 : const bool bLineDashDot(LINE_DASH == rInfo.GetStyle());
1457 :
1458 0 : if( bFatLine )
1459 : {
1460 0 : ImplWritePushAction( rOStm );
1461 0 : ImplWriteLineColor( rOStm, rLineCol, 1, rInfo.GetWidth() );
1462 :
1463 0 : if(bLineJoin)
1464 : {
1465 0 : rOStm << (sal_Int16) GDI_LINEJOIN_ACTION;
1466 0 : rOStm << (sal_Int32) 6;
1467 0 : rOStm << (sal_Int16) rInfo.GetLineJoin();
1468 : }
1469 :
1470 0 : if(bLineCap)
1471 : {
1472 0 : rOStm << (sal_Int16) GDI_LINECAP_ACTION;
1473 0 : rOStm << (sal_Int32) 6;
1474 0 : rOStm << (sal_Int16) rInfo.GetLineCap();
1475 : }
1476 : }
1477 :
1478 0 : if(bLineDashDot)
1479 : {
1480 0 : rOStm << (sal_Int16) GDI_LINEDASHDOT_ACTION;
1481 0 : rOStm << (sal_Int32) 4 + 16;
1482 0 : rOStm << (sal_Int16)rInfo.GetDashCount();
1483 0 : rOStm << (sal_Int32)rInfo.GetDashLen();
1484 0 : rOStm << (sal_Int16)rInfo.GetDotCount();
1485 0 : rOStm << (sal_Int32)rInfo.GetDotLen();
1486 0 : rOStm << (sal_Int32)rInfo.GetDistance();
1487 : }
1488 :
1489 0 : rOStm << (sal_Int16) GDI_LINE_ACTION;
1490 0 : rOStm << (sal_Int32) 20;
1491 0 : rOStm << pAct->GetStartPoint();
1492 0 : rOStm << pAct->GetEndPoint();
1493 0 : nCount++;
1494 :
1495 0 : if( bFatLine )
1496 : {
1497 0 : ImplWritePopAction( rOStm );
1498 0 : nCount += 3;
1499 :
1500 0 : if(bLineJoin)
1501 : {
1502 0 : nCount += 1;
1503 : }
1504 :
1505 0 : if(bLineCap)
1506 : {
1507 0 : nCount += 1;
1508 : }
1509 : }
1510 :
1511 0 : if(bLineDashDot)
1512 : {
1513 0 : nCount += 1;
1514 : }
1515 : }
1516 0 : break;
1517 :
1518 : case( META_RECT_ACTION ):
1519 : {
1520 0 : MetaRectAction* pAct = (MetaRectAction*) pAction;
1521 :
1522 0 : rOStm << (sal_Int16) GDI_RECT_ACTION;
1523 0 : rOStm << (sal_Int32) 28;
1524 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1525 0 : rOStm << (sal_Int32) 0;
1526 0 : rOStm << (sal_Int32) 0;
1527 0 : nCount++;
1528 : }
1529 0 : break;
1530 :
1531 : case( META_ROUNDRECT_ACTION ):
1532 : {
1533 0 : MetaRoundRectAction* pAct = (MetaRoundRectAction*) pAction;
1534 :
1535 0 : rOStm << (sal_Int16) GDI_RECT_ACTION;
1536 0 : rOStm << (sal_Int32) 28;
1537 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1538 0 : rOStm << (sal_Int32) pAct->GetHorzRound();
1539 0 : rOStm << (sal_Int32) pAct->GetVertRound();
1540 0 : nCount++;
1541 : }
1542 0 : break;
1543 :
1544 : case( META_ELLIPSE_ACTION ):
1545 : {
1546 0 : MetaEllipseAction* pAct = (MetaEllipseAction*) pAction;
1547 :
1548 0 : rOStm << (sal_Int16) GDI_ELLIPSE_ACTION;
1549 0 : rOStm << (sal_Int32) 20;
1550 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1551 0 : nCount++;
1552 : }
1553 0 : break;
1554 :
1555 : case( META_ARC_ACTION ):
1556 : {
1557 0 : MetaArcAction* pAct = (MetaArcAction*) pAction;
1558 :
1559 0 : rOStm << (sal_Int16) GDI_ARC_ACTION;
1560 0 : rOStm << (sal_Int32) 36;
1561 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1562 0 : rOStm << pAct->GetStartPoint();
1563 0 : rOStm << pAct->GetEndPoint();
1564 0 : nCount++;
1565 : }
1566 0 : break;
1567 :
1568 : case( META_PIE_ACTION ):
1569 : {
1570 0 : MetaPieAction* pAct = (MetaPieAction*) pAction;
1571 :
1572 0 : rOStm << (sal_Int16) GDI_PIE_ACTION;
1573 0 : rOStm << (sal_Int32) 36;
1574 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1575 0 : rOStm << pAct->GetStartPoint();
1576 0 : rOStm << pAct->GetEndPoint();
1577 0 : nCount++;
1578 : }
1579 0 : break;
1580 :
1581 : case( META_CHORD_ACTION ):
1582 : {
1583 0 : MetaChordAction* pAct = (MetaChordAction*) pAction;
1584 0 : Polygon aChordPoly( pAct->GetRect(), pAct->GetStartPoint(),
1585 0 : pAct->GetEndPoint(), POLY_CHORD );
1586 0 : const sal_uInt16 nPoints = aChordPoly.GetSize();
1587 :
1588 0 : rOStm << (sal_Int16) GDI_POLYGON_ACTION;
1589 0 : rOStm << (sal_Int32) ( 8 + ( nPoints << 3 ) );
1590 0 : rOStm << (sal_Int32) nPoints;
1591 :
1592 0 : for( sal_uInt16 n = 0; n < nPoints; n++ )
1593 0 : rOStm << aChordPoly[ n ];
1594 0 : nCount++;
1595 : }
1596 0 : break;
1597 :
1598 : case( META_POLYLINE_ACTION ):
1599 : {
1600 : // #i102224#
1601 0 : MetaPolyLineAction* pAct = (MetaPolyLineAction*) pAction;
1602 : // #i102224# Here the evtl. curved nature of Polygon was
1603 : // ignored (for all those Years). Adapted to at least write
1604 : // a polygon representing the curve as good as possible
1605 0 : Polygon aSimplePoly;
1606 0 : pAct->GetPolygon().AdaptiveSubdivide(aSimplePoly);
1607 0 : const LineInfo& rInfo = pAct->GetLineInfo();
1608 0 : const sal_uInt16 nPoints(aSimplePoly.GetSize());
1609 0 : const bool bFatLine(!rInfo.IsDefault() && (LINE_NONE != rInfo.GetStyle()));
1610 0 : const bool bLineJoin(bFatLine && basegfx::B2DLINEJOIN_ROUND != rInfo.GetLineJoin());
1611 0 : const bool bLineCap(bFatLine && com::sun::star::drawing::LineCap_BUTT != rInfo.GetLineCap());
1612 0 : const bool bLineDashDot(LINE_DASH == rInfo.GetStyle());
1613 :
1614 0 : if( bFatLine )
1615 : {
1616 0 : ImplWritePushAction( rOStm );
1617 0 : ImplWriteLineColor( rOStm, rLineCol, 1, rInfo.GetWidth() );
1618 :
1619 0 : if(bLineJoin)
1620 : {
1621 0 : rOStm << (sal_Int16) GDI_LINEJOIN_ACTION;
1622 0 : rOStm << (sal_Int32) 6;
1623 0 : rOStm << (sal_Int16) rInfo.GetLineJoin();
1624 : }
1625 :
1626 0 : if(bLineCap)
1627 : {
1628 0 : rOStm << (sal_Int16) GDI_LINECAP_ACTION;
1629 0 : rOStm << (sal_Int32) 6;
1630 0 : rOStm << (sal_Int16) rInfo.GetLineCap();
1631 : }
1632 : }
1633 :
1634 0 : if(bLineDashDot)
1635 : {
1636 0 : rOStm << (sal_Int16) GDI_LINEDASHDOT_ACTION;
1637 0 : rOStm << (sal_Int32) 4 + 16;
1638 0 : rOStm << (sal_Int16)rInfo.GetDashCount();
1639 0 : rOStm << (sal_Int32)rInfo.GetDashLen();
1640 0 : rOStm << (sal_Int16)rInfo.GetDotCount();
1641 0 : rOStm << (sal_Int32)rInfo.GetDotLen();
1642 0 : rOStm << (sal_Int32)rInfo.GetDistance();
1643 : }
1644 :
1645 0 : rOStm << (sal_Int16) GDI_POLYLINE_ACTION;
1646 0 : rOStm << (sal_Int32) ( 8 + ( nPoints << 3 ) );
1647 0 : rOStm << (sal_Int32) nPoints;
1648 :
1649 0 : for( sal_uInt16 n = 0; n < nPoints; n++ )
1650 : {
1651 0 : rOStm << aSimplePoly[ n ];
1652 : }
1653 :
1654 0 : nCount++;
1655 :
1656 0 : const PolyPolygon aPolyPolygon(pAct->GetPolygon());
1657 0 : if(ImplWriteExtendedPolyPolygonAction(rOStm, aPolyPolygon, true))
1658 : {
1659 0 : nCount++;
1660 : }
1661 :
1662 0 : if( bFatLine )
1663 : {
1664 0 : ImplWritePopAction( rOStm );
1665 0 : nCount += 3;
1666 :
1667 0 : if(bLineJoin)
1668 : {
1669 0 : nCount += 1;
1670 : }
1671 :
1672 0 : if(bLineCap)
1673 : {
1674 0 : nCount += 1;
1675 : }
1676 : }
1677 :
1678 0 : if(bLineDashDot)
1679 : {
1680 0 : nCount += 1;
1681 0 : }
1682 : }
1683 0 : break;
1684 :
1685 : case( META_POLYGON_ACTION ):
1686 : {
1687 0 : MetaPolygonAction* pAct = (MetaPolygonAction*)pAction;
1688 : // #i102224# Here the evtl. curved nature of Polygon was
1689 : // ignored (for all those Years). Adapted to at least write
1690 : // a polygon representing the curve as good as possible
1691 0 : Polygon aSimplePoly;
1692 0 : pAct->GetPolygon().AdaptiveSubdivide(aSimplePoly);
1693 0 : const sal_uInt16 nPoints(aSimplePoly.GetSize());
1694 :
1695 0 : rOStm << (sal_Int16) GDI_POLYGON_ACTION;
1696 0 : rOStm << (sal_Int32) ( 8 + ( nPoints << 3 ) );
1697 0 : rOStm << (sal_Int32) nPoints;
1698 :
1699 0 : for( sal_uInt16 n = 0; n < nPoints; n++ )
1700 0 : rOStm << aSimplePoly[ n ];
1701 :
1702 0 : nCount++;
1703 :
1704 0 : const PolyPolygon aPolyPolygon(pAct->GetPolygon());
1705 0 : if(ImplWriteExtendedPolyPolygonAction(rOStm, aPolyPolygon, true))
1706 : {
1707 0 : nCount++;
1708 0 : }
1709 : }
1710 0 : break;
1711 :
1712 : case( META_POLYPOLYGON_ACTION ):
1713 : {
1714 0 : MetaPolyPolygonAction* pAct = (MetaPolyPolygonAction*) pAction;
1715 0 : ImplWritePolyPolyAction( rOStm, pAct->GetPolyPolygon() );
1716 0 : nCount++;
1717 :
1718 0 : if(ImplWriteExtendedPolyPolygonAction(rOStm, pAct->GetPolyPolygon(), true))
1719 : {
1720 0 : nCount++;
1721 : }
1722 : }
1723 0 : break;
1724 :
1725 : case( META_TEXT_ACTION ):
1726 : {
1727 0 : MetaTextAction* pAct = (MetaTextAction*) pAction;
1728 0 : String aUniText( pAct->GetText() );
1729 : rtl::OString aText(rtl::OUStringToOString(aUniText,
1730 0 : rActualCharSet));
1731 0 : const sal_uLong nStrLen = aText.getLength();
1732 :
1733 0 : if ( ImplWriteUnicodeComment( rOStm, aUniText ) )
1734 0 : nCount++;
1735 :
1736 0 : rOStm << (sal_Int16) GDI_TEXT_ACTION;
1737 0 : rOStm << (sal_Int32) ( 24 + ( nStrLen + 1 ) );
1738 0 : rOStm << pAct->GetPoint();
1739 0 : rOStm << (sal_Int32) pAct->GetIndex();
1740 0 : rOStm << (sal_Int32) pAct->GetLen();
1741 0 : rOStm << (sal_Int32) nStrLen;
1742 0 : rOStm.Write( aText.getStr(), nStrLen + 1 );
1743 0 : nCount++;
1744 : }
1745 0 : break;
1746 :
1747 : case( META_TEXTARRAY_ACTION ):
1748 : {
1749 0 : MetaTextArrayAction* pAct = (MetaTextArrayAction*)pAction;
1750 0 : rtl::OString aText(rtl::OUStringToOString(pAct->GetText(),
1751 0 : rActualCharSet));
1752 0 : String aUniText( pAct->GetText(), pAct->GetIndex(), pAct->GetLen() );
1753 : sal_uLong nAryLen;
1754 0 : sal_uLong nLen = pAct->GetLen();
1755 0 : const sal_uLong nTextLen = aText.getLength();
1756 0 : sal_Int32* pDXArray = pAct->GetDXArray();
1757 :
1758 0 : if ( ImplWriteUnicodeComment( rOStm, aUniText ) )
1759 0 : nCount++;
1760 :
1761 0 : if( ( nLen + pAct->GetIndex() ) > nTextLen )
1762 : {
1763 0 : if( pAct->GetIndex() <= nTextLen )
1764 0 : nLen = nTextLen - pAct->GetIndex();
1765 : else
1766 0 : nLen = 0UL;
1767 : }
1768 :
1769 0 : if( !pDXArray || !nLen )
1770 0 : nAryLen = 0;
1771 : else
1772 0 : nAryLen = nLen; // #105987# Write out all of DX array
1773 :
1774 0 : rOStm << (sal_Int16) GDI_TEXTARRAY_ACTION;
1775 0 : rOStm << (sal_Int32) ( 28 + ( nLen + 1 ) + ( nAryLen * 4 ) );
1776 0 : rOStm << pAct->GetPoint();
1777 0 : rOStm << (sal_Int32) 0;
1778 0 : rOStm << (sal_Int32) nLen;
1779 0 : rOStm << (sal_Int32) nLen;
1780 0 : rOStm << (sal_Int32) nAryLen;
1781 0 : rOStm.Write( aText.getStr()+pAct->GetIndex(), nLen + 1 );
1782 :
1783 0 : for( sal_uLong n = 0UL ; n < nAryLen; n++ )
1784 0 : rOStm << (sal_Int32) pDXArray[ n ];
1785 :
1786 0 : nCount++;
1787 : }
1788 0 : break;
1789 :
1790 : case( META_STRETCHTEXT_ACTION ):
1791 : {
1792 0 : MetaStretchTextAction* pAct = (MetaStretchTextAction*) pAction;
1793 0 : String aUniText( pAct->GetText() );
1794 : rtl::OString aText(rtl::OUStringToOString(aUniText,
1795 0 : rActualCharSet));
1796 0 : const sal_uLong nStrLen = aText.getLength();
1797 :
1798 0 : if ( ImplWriteUnicodeComment( rOStm, aUniText ) )
1799 0 : nCount++;
1800 :
1801 0 : rOStm << (sal_Int16) GDI_STRETCHTEXT_ACTION;
1802 0 : rOStm << (sal_Int32) ( 28 + ( nStrLen + 1 ) );
1803 0 : rOStm << pAct->GetPoint();
1804 0 : rOStm << (sal_Int32) pAct->GetIndex();
1805 0 : rOStm << (sal_Int32) pAct->GetLen();
1806 0 : rOStm << (sal_Int32) nStrLen;
1807 0 : rOStm << (sal_Int32) pAct->GetWidth();
1808 0 : rOStm.Write( aText.getStr(), nStrLen + 1 );
1809 0 : nCount++;
1810 : }
1811 0 : break;
1812 :
1813 : case( META_BMP_ACTION ):
1814 : {
1815 0 : MetaBmpAction* pAct = (MetaBmpAction*) pAction;
1816 :
1817 0 : rOStm << (sal_Int16) GDI_BITMAP_ACTION;
1818 0 : rOStm << (sal_Int32) 12;
1819 0 : rOStm << pAct->GetPoint();
1820 0 : rOStm << pAct->GetBitmap();
1821 0 : nCount++;
1822 : }
1823 0 : break;
1824 :
1825 : case( META_BMPSCALE_ACTION ):
1826 : {
1827 0 : MetaBmpScaleAction* pAct = (MetaBmpScaleAction*) pAction;
1828 :
1829 0 : rOStm << (sal_Int16) GDI_BITMAPSCALE_ACTION;
1830 0 : rOStm << (sal_Int32) 20;
1831 0 : rOStm << pAct->GetPoint();
1832 0 : rOStm << pAct->GetSize();
1833 0 : rOStm << pAct->GetBitmap();
1834 0 : nCount++;
1835 : }
1836 0 : break;
1837 :
1838 : case( META_BMPSCALEPART_ACTION ):
1839 : {
1840 0 : MetaBmpScalePartAction* pAct = (MetaBmpScalePartAction*) pAction;
1841 :
1842 0 : rOStm << (sal_Int16) GDI_BITMAPSCALEPART_ACTION;
1843 0 : rOStm << (sal_Int32) 36;
1844 0 : rOStm << pAct->GetDestPoint();
1845 0 : rOStm << pAct->GetDestSize();
1846 0 : rOStm << pAct->GetSrcPoint();
1847 0 : rOStm << pAct->GetSrcSize();
1848 0 : rOStm << pAct->GetBitmap();
1849 0 : nCount++;
1850 : }
1851 0 : break;
1852 :
1853 : case( META_BMPEX_ACTION ):
1854 : {
1855 0 : MetaBmpExAction* pAct = (MetaBmpExAction*) pAction;
1856 0 : const Bitmap aBmp( Graphic( pAct->GetBitmapEx() ).GetBitmap() );
1857 :
1858 0 : rOStm << (sal_Int16) GDI_BITMAP_ACTION;
1859 0 : rOStm << (sal_Int32) 12;
1860 0 : rOStm << pAct->GetPoint();
1861 0 : rOStm << aBmp;
1862 0 : nCount++;
1863 : }
1864 0 : break;
1865 :
1866 : case( META_BMPEXSCALE_ACTION ):
1867 : {
1868 0 : MetaBmpExScaleAction* pAct = (MetaBmpExScaleAction*) pAction;
1869 0 : const Bitmap aBmp( Graphic( pAct->GetBitmapEx() ).GetBitmap() );
1870 :
1871 0 : rOStm << (sal_Int16) GDI_BITMAPSCALE_ACTION;
1872 0 : rOStm << (sal_Int32) 20;
1873 0 : rOStm << pAct->GetPoint();
1874 0 : rOStm << pAct->GetSize();
1875 0 : rOStm << aBmp;
1876 0 : nCount++;
1877 : }
1878 0 : break;
1879 :
1880 : case( META_BMPEXSCALEPART_ACTION ):
1881 : {
1882 0 : MetaBmpExScalePartAction* pAct = (MetaBmpExScalePartAction*) pAction;
1883 0 : const Bitmap aBmp( Graphic( pAct->GetBitmapEx() ).GetBitmap() );
1884 :
1885 0 : rOStm << (sal_Int16) GDI_BITMAPSCALEPART_ACTION;
1886 0 : rOStm << (sal_Int32) 36;
1887 0 : rOStm << pAct->GetDestPoint();
1888 0 : rOStm << pAct->GetDestSize();
1889 0 : rOStm << pAct->GetSrcPoint();
1890 0 : rOStm << pAct->GetSrcSize();
1891 0 : rOStm << aBmp;
1892 0 : nCount++;
1893 : }
1894 0 : break;
1895 :
1896 : case( META_GRADIENT_ACTION ):
1897 : {
1898 0 : MetaGradientAction* pAct = (MetaGradientAction*) pAction;
1899 0 : const Gradient& rGrad = pAct->GetGradient();
1900 :
1901 0 : rOStm << (sal_Int16) GDI_GRADIENT_ACTION;
1902 0 : rOStm << (sal_Int32) 46;
1903 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1904 0 : rOStm << (sal_Int16) rGrad.GetStyle();
1905 0 : ImplWriteColor( rOStm, rGrad.GetStartColor() );
1906 0 : ImplWriteColor( rOStm, rGrad.GetEndColor() );
1907 0 : rOStm << (sal_Int16) rGrad.GetAngle();
1908 0 : rOStm << (sal_Int16) rGrad.GetBorder();
1909 0 : rOStm << (sal_Int16) rGrad.GetOfsX();
1910 0 : rOStm << (sal_Int16) rGrad.GetOfsY();
1911 0 : rOStm << (sal_Int16) rGrad.GetStartIntensity();
1912 0 : rOStm << (sal_Int16) rGrad.GetEndIntensity();
1913 0 : nCount++;
1914 : }
1915 0 : break;
1916 :
1917 : case( META_GRADIENTEX_ACTION ):
1918 : {
1919 0 : const MetaGradientExAction* pA = (MetaGradientExAction*) pAction;
1920 : sal_uLong nOldPos, nNewPos;
1921 :
1922 : // write RefPoint comment
1923 0 : rOStm << (sal_Int16) GDI_GRADIENTEX_COMMENT;
1924 :
1925 : // we'll write the ActionSize later
1926 0 : nOldPos = rOStm.Tell();
1927 0 : rOStm.SeekRel( 4 );
1928 :
1929 : // write data
1930 0 : rOStm << pA->GetPolyPolygon() << pA->GetGradient();
1931 0 : rOStm << (sal_Int32) 0; // number of actions that follow this comment
1932 :
1933 : // calculate and write ActionSize of comment
1934 0 : nNewPos = rOStm.Tell();
1935 0 : rOStm.Seek( nOldPos );
1936 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
1937 0 : rOStm.Seek( nNewPos );
1938 :
1939 0 : nCount++;
1940 : }
1941 0 : break;
1942 :
1943 : case( META_WALLPAPER_ACTION ):
1944 : {
1945 0 : MetaWallpaperAction* pAct = (MetaWallpaperAction*) pAction;
1946 0 : const Color& rColor = pAct->GetWallpaper().GetColor();
1947 :
1948 0 : ImplWritePushAction( rOStm );
1949 0 : ImplWriteLineColor( rOStm, rColor, 1 );
1950 0 : ImplWriteFillColor( rOStm, rColor, 1 );
1951 :
1952 0 : rOStm << (sal_Int16) GDI_RECT_ACTION;
1953 0 : rOStm << (sal_Int32) 28;
1954 0 : ImplWriteRect( rOStm, pAct->GetRect() );
1955 0 : rOStm << (sal_Int32) 0;
1956 0 : rOStm << (sal_Int32) 0;
1957 :
1958 0 : ImplWritePopAction( rOStm );
1959 0 : nCount += 5;
1960 : }
1961 0 : break;
1962 :
1963 : case( META_CLIPREGION_ACTION ):
1964 : {
1965 0 : MetaClipRegionAction* pAct = (MetaClipRegionAction*) pAction;
1966 0 : const Region& rRegion = pAct->GetRegion();
1967 0 : Rectangle aClipRect;
1968 :
1969 0 : rOStm << (sal_Int16) GDI_CLIPREGION_ACTION;
1970 0 : rOStm << (sal_Int32) 24;
1971 :
1972 0 : if( pAct->IsClipping() )
1973 : {
1974 0 : aClipRect = rRegion.GetBoundRect();
1975 0 : rOStm << (sal_Int16) 1;
1976 : }
1977 : else
1978 0 : rOStm << (sal_Int16) 0;
1979 :
1980 0 : rOStm << (sal_Int16) 0;
1981 0 : ImplWriteRect( rOStm, aClipRect );
1982 :
1983 0 : if( pAct->IsClipping() )
1984 0 : ImplWriteRect( rOStm, aClipRect );
1985 :
1986 0 : nCount++;
1987 : }
1988 0 : break;
1989 :
1990 : case( META_ISECTRECTCLIPREGION_ACTION ):
1991 : {
1992 0 : MetaISectRectClipRegionAction* pAct = (MetaISectRectClipRegionAction*) pAction;
1993 :
1994 0 : rOStm << (sal_Int16) GDI_ISECTCLIPREGION_ACTION;
1995 0 : rOStm << (sal_Int32) 20;
1996 0 : rOStm << pAct->GetRect();
1997 0 : nCount++;
1998 : }
1999 0 : break;
2000 :
2001 : case( META_MOVECLIPREGION_ACTION ):
2002 : {
2003 0 : MetaMoveClipRegionAction* pAct = (MetaMoveClipRegionAction*) pAction;
2004 :
2005 0 : rOStm << (sal_Int16) GDI_MOVECLIPREGION_ACTION;
2006 0 : rOStm << (sal_Int32) 12;
2007 0 : rOStm << (sal_Int32) pAct->GetHorzMove();
2008 0 : rOStm << (sal_Int32) pAct->GetVertMove();
2009 0 : nCount++;
2010 : }
2011 0 : break;
2012 :
2013 : case( META_LINECOLOR_ACTION ):
2014 : {
2015 0 : MetaLineColorAction* pAct = (MetaLineColorAction*) pAction;
2016 0 : ImplWriteLineColor( rOStm, rLineCol = pAct->GetColor(), pAct->IsSetting() ? 1 : 0 );
2017 0 : nCount++;
2018 : }
2019 0 : break;
2020 :
2021 : case( META_FILLCOLOR_ACTION ):
2022 : {
2023 0 : MetaFillColorAction* pAct = (MetaFillColorAction*) pAction;
2024 0 : ImplWriteFillColor( rOStm, pAct->GetColor(), pAct->IsSetting() ? 1 : 0 );
2025 0 : nCount++;
2026 : }
2027 0 : break;
2028 :
2029 : case( META_FONT_ACTION ):
2030 : {
2031 0 : rSaveVDev.SetFont( ( (MetaFontAction*) pAction )->GetFont() );
2032 0 : ImplWriteFont( rOStm, rSaveVDev.GetFont(), rActualCharSet );
2033 0 : nCount++;
2034 : }
2035 0 : break;
2036 :
2037 : case( META_TEXTCOLOR_ACTION ):
2038 : {
2039 0 : Font aSaveFont( rSaveVDev.GetFont() );
2040 :
2041 0 : aSaveFont.SetColor( ( (MetaTextColorAction*) pAction )->GetColor() );
2042 0 : rSaveVDev.SetFont( aSaveFont );
2043 0 : ImplWriteFont( rOStm, rSaveVDev.GetFont(), rActualCharSet );
2044 0 : nCount++;
2045 : }
2046 0 : break;
2047 :
2048 : case( META_TEXTFILLCOLOR_ACTION ):
2049 : {
2050 0 : MetaTextFillColorAction* pAct = (MetaTextFillColorAction*) pAction;
2051 0 : Font aSaveFont( rSaveVDev.GetFont() );
2052 :
2053 0 : if( pAct->IsSetting() )
2054 0 : aSaveFont.SetFillColor( pAct->GetColor() );
2055 : else
2056 0 : aSaveFont.SetFillColor( Color( COL_TRANSPARENT ) );
2057 :
2058 0 : rSaveVDev.SetFont( aSaveFont );
2059 0 : ImplWriteFont( rOStm, rSaveVDev.GetFont(), rActualCharSet );
2060 0 : nCount++;
2061 : }
2062 0 : break;
2063 :
2064 : case( META_TEXTALIGN_ACTION ):
2065 : {
2066 0 : Font aSaveFont( rSaveVDev.GetFont() );
2067 :
2068 0 : aSaveFont.SetAlign( ( (MetaTextAlignAction*) pAction )->GetTextAlign() );
2069 0 : rSaveVDev.SetFont( aSaveFont );
2070 0 : ImplWriteFont( rOStm, rSaveVDev.GetFont(), rActualCharSet );
2071 0 : nCount++;
2072 : }
2073 0 : break;
2074 :
2075 : case( META_MAPMODE_ACTION ):
2076 : {
2077 0 : MetaMapModeAction* pAct = (MetaMapModeAction*) pAction;
2078 :
2079 0 : rOStm << (sal_Int16) GDI_MAPMODE_ACTION;
2080 0 : rOStm << (sal_Int32) 30;
2081 0 : ImplWriteMapMode( rOStm, pAct->GetMapMode() );
2082 0 : nCount++;
2083 : }
2084 0 : break;
2085 :
2086 : case( META_PUSH_ACTION ):
2087 : {
2088 0 : ImplWritePushAction( rOStm );
2089 0 : rLineColStack.push( new Color( rLineCol ) );
2090 0 : rSaveVDev.Push();
2091 0 : nCount++;
2092 : }
2093 0 : break;
2094 :
2095 : case( META_POP_ACTION ):
2096 : {
2097 : Color* pCol;
2098 0 : if (rLineColStack.empty())
2099 0 : pCol = NULL;
2100 : else
2101 : {
2102 0 : pCol = rLineColStack.top();
2103 0 : rLineColStack.pop();
2104 : }
2105 :
2106 0 : if( pCol )
2107 : {
2108 0 : rLineCol = *pCol;
2109 0 : delete pCol;
2110 : }
2111 :
2112 0 : ImplWritePopAction( rOStm );
2113 0 : rSaveVDev.Pop();
2114 0 : nCount++;
2115 : }
2116 0 : break;
2117 :
2118 : case( META_RASTEROP_ACTION ):
2119 : {
2120 0 : MetaRasterOpAction* pAct = (MetaRasterOpAction*) pAction;
2121 :
2122 0 : if( ( pAct->GetRasterOp() != ROP_0 ) && ( pAct->GetRasterOp() != ROP_1 ) )
2123 : {
2124 : sal_Int16 nRasterOp;
2125 :
2126 : // Falls vorher ROP_0/1 gesetzt war, alten
2127 : // Zustand durch Pop erst wieder herstellen
2128 0 : if( rRop_0_1 )
2129 : {
2130 0 : ImplWritePopAction( rOStm );
2131 0 : rSaveVDev.Pop();
2132 0 : rRop_0_1 = sal_False;
2133 0 : nCount++;
2134 : }
2135 :
2136 0 : switch( pAct->GetRasterOp() )
2137 : {
2138 0 : case( ROP_OVERPAINT ) : nRasterOp = 0; break;
2139 0 : case( ROP_XOR ) : nRasterOp = 4; break;
2140 0 : case( ROP_INVERT ): nRasterOp = 1; break;
2141 0 : default: nRasterOp = 0; break;
2142 : }
2143 :
2144 0 : ImplWriteRasterOpAction( rOStm, nRasterOp );
2145 0 : nCount++;
2146 : }
2147 : else
2148 : {
2149 0 : ImplWritePushAction( rOStm );
2150 0 : rSaveVDev.Push();
2151 :
2152 0 : if( pAct->GetRasterOp() == ROP_0 )
2153 : {
2154 0 : ImplWriteLineColor( rOStm, COL_BLACK, 1 );
2155 0 : ImplWriteFillColor( rOStm, COL_BLACK, 1 );
2156 : }
2157 : else
2158 : {
2159 0 : ImplWriteLineColor( rOStm, COL_WHITE, 1 );
2160 0 : ImplWriteFillColor( rOStm, COL_WHITE, 1 );
2161 : }
2162 :
2163 0 : ImplWriteRasterOpAction( rOStm, 0 );
2164 0 : rRop_0_1 = sal_True;
2165 0 : nCount += 4;
2166 : }
2167 : }
2168 0 : break;
2169 :
2170 : case( META_TRANSPARENT_ACTION ):
2171 : {
2172 0 : const PolyPolygon& rPolyPoly = ( (MetaTransparentAction*) pAction )->GetPolyPolygon();
2173 0 : const sal_Int16 nTrans = ( (MetaTransparentAction*) pAction )->GetTransparence();
2174 0 : const sal_Int16 nBrushStyle = ( nTrans < 38 ) ? 8 : ( nTrans < 63 ) ? 9 : 10;
2175 : sal_uLong nOldPos, nNewPos;
2176 :
2177 : // write transparence comment
2178 0 : rOStm << (sal_Int16) GDI_TRANSPARENT_COMMENT;
2179 :
2180 : // we'll write the ActionSize later
2181 0 : nOldPos = rOStm.Tell();
2182 0 : rOStm.SeekRel( 4 );
2183 :
2184 : // write comment data
2185 0 : rOStm << rPolyPoly;
2186 0 : rOStm << nTrans;
2187 0 : rOStm << (sal_Int32) 15; // number of actions that follow this comment
2188 :
2189 : // calculate and write ActionSize of comment
2190 0 : nNewPos = rOStm.Tell();
2191 0 : rOStm.Seek( nOldPos );
2192 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
2193 0 : rOStm.Seek( nNewPos );
2194 :
2195 : {
2196 : // write actions for transparence
2197 0 : ImplWritePushAction( rOStm );
2198 : {
2199 0 : ImplWriteRasterOpAction( rOStm, 4 );
2200 0 : ImplWritePolyPolyAction( rOStm, rPolyPoly );
2201 :
2202 0 : ImplWritePushAction( rOStm );
2203 : {
2204 0 : ImplWriteRasterOpAction( rOStm, 2 );
2205 0 : ImplWriteFillColor( rOStm, COL_BLACK, nBrushStyle );
2206 0 : ImplWritePolyPolyAction( rOStm, rPolyPoly );
2207 : }
2208 0 : ImplWritePopAction( rOStm );
2209 :
2210 0 : ImplWriteRasterOpAction( rOStm, 4 );
2211 0 : ImplWritePolyPolyAction( rOStm, rPolyPoly );
2212 : }
2213 0 : ImplWritePopAction( rOStm );
2214 :
2215 0 : ImplWritePushAction( rOStm );
2216 : {
2217 0 : ImplWriteFillColor( rOStm, Color(), 0 );
2218 0 : ImplWritePolyPolyAction( rOStm, rPolyPoly );
2219 : }
2220 0 : ImplWritePopAction( rOStm );
2221 :
2222 0 : nCount += 15;
2223 : }
2224 :
2225 0 : nCount++;
2226 : }
2227 0 : break;
2228 :
2229 : case( META_FLOATTRANSPARENT_ACTION ):
2230 : {
2231 0 : const MetaFloatTransparentAction* pA = (MetaFloatTransparentAction*) pAction;
2232 0 : const GDIMetaFile& rTransMtf = pA->GetGDIMetaFile();
2233 0 : const Point& rPos = pA->GetPoint();
2234 0 : const Size& rSize = pA->GetSize();
2235 0 : const Gradient& rGradient = pA->GetGradient();
2236 : sal_uLong nOldPos, nNewPos;
2237 :
2238 : // write RefPoint comment
2239 0 : rOStm << (sal_Int16) GDI_FLOATTRANSPARENT_COMMENT;
2240 :
2241 : // we'll write the ActionSize later
2242 0 : nOldPos = rOStm.Tell();
2243 0 : rOStm.SeekRel( 4 );
2244 :
2245 : // write comment data
2246 0 : rOStm << rTransMtf << rPos << rSize << rGradient;
2247 :
2248 : // calculate and write ActionSize of comment
2249 0 : nNewPos = rOStm.Tell();
2250 0 : rOStm.Seek( nOldPos );
2251 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos + 4 );
2252 0 : rOStm.Seek( ( nOldPos = nNewPos ) + 4 );
2253 :
2254 : {
2255 : // write actions for float transparence
2256 : sal_uLong nAddCount;
2257 0 : GDIMetaFile aMtf( rTransMtf );
2258 0 : const Size aSrcSize( rTransMtf.GetPrefSize() );
2259 0 : Point aSrcPt( rTransMtf.GetPrefMapMode().GetOrigin() );
2260 0 : const double fScaleX = aSrcSize.Width() ? (double) rSize.Width() / aSrcSize.Width() : 1.0;
2261 0 : const double fScaleY = aSrcSize.Height() ? (double) rSize.Height() / aSrcSize.Height() : 1.0;
2262 : long nMoveX, nMoveY;
2263 :
2264 0 : if( fScaleX != 1.0 || fScaleY != 1.0 )
2265 : {
2266 0 : aMtf.Scale( fScaleX, fScaleY );
2267 0 : aSrcPt.X() = FRound( aSrcPt.X() * fScaleX ), aSrcPt.Y() = FRound( aSrcPt.Y() * fScaleY );
2268 : }
2269 :
2270 0 : nMoveX = rPos.X() - aSrcPt.X(), nMoveY = rPos.Y() - aSrcPt.Y();
2271 :
2272 0 : if( nMoveX || nMoveY )
2273 0 : aMtf.Move( nMoveX, nMoveY );
2274 :
2275 0 : nAddCount = ImplWriteActions( rOStm, aMtf, rSaveVDev, rRop_0_1, rLineCol, rLineColStack, rActualCharSet );
2276 0 : nNewPos = rOStm.Tell();
2277 0 : rOStm.Seek( nOldPos );
2278 0 : rOStm << (sal_Int32) nAddCount;
2279 0 : rOStm.Seek( nNewPos );
2280 :
2281 0 : nCount += nAddCount;
2282 : }
2283 :
2284 0 : nCount++;
2285 : }
2286 0 : break;
2287 :
2288 : case( META_HATCH_ACTION ):
2289 : {
2290 0 : const MetaHatchAction* pA = (MetaHatchAction*) pAction;
2291 0 : const PolyPolygon& rPolyPoly = pA->GetPolyPolygon();
2292 0 : const Hatch& rHatch = pA->GetHatch();
2293 : sal_uLong nOldPos, nNewPos, nAddCount;
2294 :
2295 : // write hatch comment
2296 0 : rOStm << (sal_Int16) GDI_HATCH_COMMENT;
2297 :
2298 : // we'll write the ActionSize later
2299 0 : nOldPos = rOStm.Tell();
2300 0 : rOStm.SeekRel( 4 );
2301 :
2302 : // write comment data
2303 0 : rOStm << rPolyPoly;
2304 0 : rOStm << rHatch;
2305 :
2306 : // calculate and write ActionSize of comment
2307 0 : nNewPos = rOStm.Tell();
2308 0 : rOStm.Seek( nOldPos );
2309 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos + 4 );
2310 0 : rOStm.Seek( ( nOldPos = nNewPos ) + 4 );
2311 :
2312 : {
2313 : // write actions for hatch
2314 0 : VirtualDevice aVDev;
2315 0 : GDIMetaFile aTmpMtf;
2316 :
2317 0 : aVDev.AddHatchActions( rPolyPoly, rHatch, aTmpMtf );
2318 0 : nAddCount = ImplWriteActions( rOStm, aTmpMtf, rSaveVDev, rRop_0_1, rLineCol, rLineColStack, rActualCharSet );
2319 0 : nNewPos = rOStm.Tell();
2320 0 : rOStm.Seek( nOldPos );
2321 0 : rOStm << (sal_Int32) nAddCount;
2322 0 : rOStm.Seek( nNewPos );
2323 :
2324 0 : nCount += nAddCount;
2325 : }
2326 :
2327 0 : nCount++;
2328 : }
2329 0 : break;
2330 :
2331 : case( META_REFPOINT_ACTION ):
2332 : {
2333 0 : const MetaRefPointAction* pA = (MetaRefPointAction*) pAction;
2334 0 : const Point& rRefPoint = pA->GetRefPoint();
2335 0 : const sal_Bool bSet = pA->IsSetting();
2336 : sal_uLong nOldPos, nNewPos;
2337 :
2338 : // write RefPoint comment
2339 0 : rOStm << (sal_Int16) GDI_REFPOINT_COMMENT;
2340 :
2341 : // we'll write the ActionSize later
2342 0 : nOldPos = rOStm.Tell();
2343 0 : rOStm.SeekRel( 4 );
2344 :
2345 : // write data
2346 0 : rOStm << rRefPoint << bSet;
2347 0 : rOStm << (sal_Int32) 0; // number of actions that follow this comment
2348 :
2349 : // calculate and write ActionSize of comment
2350 0 : nNewPos = rOStm.Tell();
2351 0 : rOStm.Seek( nOldPos );
2352 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
2353 0 : rOStm.Seek( nNewPos );
2354 :
2355 0 : nCount++;
2356 : }
2357 0 : break;
2358 :
2359 : case( META_TEXTLINECOLOR_ACTION ):
2360 : {
2361 0 : const MetaTextLineColorAction* pA = (MetaTextLineColorAction*) pAction;
2362 0 : const Color& rColor = pA->GetColor();
2363 0 : const sal_Bool bSet = pA->IsSetting();
2364 : sal_uLong nOldPos, nNewPos;
2365 :
2366 : // write RefPoint comment
2367 0 : rOStm << (sal_Int16) GDI_TEXTLINECOLOR_COMMENT;
2368 :
2369 : // we'll write the ActionSize later
2370 0 : nOldPos = rOStm.Tell();
2371 0 : rOStm.SeekRel( 4 );
2372 :
2373 : // write data
2374 0 : rOStm << rColor << bSet;
2375 0 : rOStm << (sal_Int32) 0; // number of actions that follow this comment
2376 :
2377 : // calculate and write ActionSize of comment
2378 0 : nNewPos = rOStm.Tell();
2379 0 : rOStm.Seek( nOldPos );
2380 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
2381 0 : rOStm.Seek( nNewPos );
2382 :
2383 0 : nCount++;
2384 : }
2385 0 : break;
2386 :
2387 : case( META_TEXTLINE_ACTION ):
2388 : {
2389 0 : const MetaTextLineAction* pA = (MetaTextLineAction*) pAction;
2390 0 : const Point& rStartPt = pA->GetStartPoint();
2391 0 : const sal_Int32 nWidth = (sal_Int32) pA->GetWidth();
2392 0 : const FontStrikeout eStrikeout = pA->GetStrikeout();
2393 0 : const FontUnderline eUnderline = pA->GetUnderline();
2394 : sal_uLong nOldPos, nNewPos;
2395 :
2396 : // write RefPoint comment
2397 0 : rOStm << (sal_Int16) GDI_TEXTLINE_COMMENT;
2398 :
2399 : // we'll write the ActionSize later
2400 0 : nOldPos = rOStm.Tell();
2401 0 : rOStm.SeekRel( 4 );
2402 :
2403 : // write data
2404 0 : rOStm << rStartPt << nWidth <<
2405 0 : static_cast<sal_uInt32>(eStrikeout) <<
2406 0 : static_cast<sal_uInt32>(eUnderline);
2407 0 : rOStm << (sal_Int32) 0; // number of actions that follow this comment
2408 :
2409 : // calculate and write ActionSize of comment
2410 0 : nNewPos = rOStm.Tell();
2411 0 : rOStm.Seek( nOldPos );
2412 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
2413 0 : rOStm.Seek( nNewPos );
2414 :
2415 0 : nCount++;
2416 : }
2417 0 : break;
2418 :
2419 : case( META_EPS_ACTION ):
2420 0 : break;
2421 :
2422 : case( META_COMMENT_ACTION ):
2423 : {
2424 0 : const MetaCommentAction* pA = (MetaCommentAction*) pAction;
2425 0 : const sal_uInt32 nDataSize = pA->GetDataSize();
2426 : sal_uLong nOldPos, nNewPos;
2427 :
2428 : // write RefPoint comment
2429 0 : rOStm << (sal_Int16) GDI_COMMENT_COMMENT;
2430 :
2431 : // we'll write the ActionSize later
2432 0 : nOldPos = rOStm.Tell();
2433 0 : rOStm.SeekRel( 4 );
2434 :
2435 : // write data
2436 0 : write_lenPrefixed_uInt8s_FromOString<sal_uInt16>(rOStm, pA->GetComment());
2437 0 : rOStm << pA->GetValue() << nDataSize;
2438 :
2439 0 : if( nDataSize )
2440 0 : rOStm.Write( pA->GetData(), nDataSize );
2441 :
2442 0 : rOStm << (sal_Int32) 0; // number of actions that follow this comment
2443 :
2444 : // calculate and write ActionSize of comment
2445 0 : nNewPos = rOStm.Tell();
2446 0 : rOStm.Seek( nOldPos );
2447 0 : rOStm << (sal_Int32) ( nNewPos - nOldPos );
2448 0 : rOStm.Seek( nNewPos );
2449 :
2450 0 : nCount++;
2451 : }
2452 0 : break;
2453 :
2454 : #ifdef DBG_UTIL
2455 : default:
2456 : {
2457 : rtl::OStringBuffer aStr(RTL_CONSTASCII_STRINGPARAM(
2458 : "Missing implementation for Action#: "));
2459 : aStr.append(static_cast<sal_Int32>(pAction->GetType()));
2460 : aStr.append('!');
2461 : OSL_FAIL(aStr.getStr());
2462 : }
2463 : break;
2464 : #endif
2465 : }
2466 : }
2467 :
2468 0 : return nCount;
2469 : }
2470 :
2471 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|