LCOV - code coverage report
Current view: top level - vcl/source/gdi - cvtsvm.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 25 1311 1.9 %
Date: 2015-06-13 12:38:46 Functions: 2 24 8.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11