diff options
Diffstat (limited to 'goodies/source/filter.vcl/eps/eps.cxx')
-rw-r--r-- | goodies/source/filter.vcl/eps/eps.cxx | 2796 |
1 files changed, 0 insertions, 2796 deletions
diff --git a/goodies/source/filter.vcl/eps/eps.cxx b/goodies/source/filter.vcl/eps/eps.cxx deleted file mode 100644 index 83b5a94f97f2..000000000000 --- a/goodies/source/filter.vcl/eps/eps.cxx +++ /dev/null @@ -1,2796 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: eps.cxx,v $ - * $Revision: 1.37 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_goodies.hxx" - -#include <vcl/sv.h> -#include <tools/stream.hxx> -#include <tools/bigint.hxx> -#include <tools/poly.hxx> -#include <vcl/svapp.hxx> -#include <vcl/metaact.hxx> -#include <vcl/graph.hxx> -#include <vcl/bmpacc.hxx> -#include <vcl/region.hxx> -#include <vcl/metric.hxx> -#include <vcl/font.hxx> -#include <vcl/virdev.hxx> -#include <vcl/msgbox.hxx> -#include <vcl/cvtgrf.hxx> -#include <vcl/gradient.hxx> -#include <svl/solar.hrc> -#include <svtools/fltcall.hxx> -#include <svtools/FilterConfigItem.hxx> -#include <vcl/graphictools.hxx> -#include "strings.hrc" -#include "dlgeps.hrc" -#include "dlgeps.hxx" - -#include <math.h> - -#define POSTSCRIPT_BOUNDINGSEARCH 0x1000 // we only try to get the BoundingBox - // in the first 4096 bytes - -#define EPS_PREVIEW_TIFF 1 -#define EPS_PREVIEW_EPSI 2 - -#define PS_LINESIZE 70 // maximum number of characters a line in the output - -#define PS_NONE 0 // formating mode: action which is inserted behind the output -#define PS_SPACE 1 -#define PS_RET 2 -#define PS_WRAP 4 - -// -----------------------------Feld-Typen------------------------------- - -struct ChrSet -{ - struct ChrSet * pSucc; - BYTE nSet; - String aName; - FontWeight eWeight; -}; - -struct StackMember -{ - struct StackMember * pSucc; - Color aGlobalCol; - BOOL bLineCol; - Color aLineCol; - BOOL bFillCol; - Color aFillCol; - Color aTextCol; - BOOL bTextFillCol; - Color aTextFillCol; - Color aBackgroundCol; - Font aFont; - TextAlign eTextAlign; - - double fLineWidth; - double fMiterLimit; - SvtGraphicStroke::CapType eLineCap; - SvtGraphicStroke::JoinType eJoinType; - SvtGraphicStroke::DashArray aDashArray; -}; - -struct PSLZWCTreeNode -{ - - PSLZWCTreeNode* pBrother; // naechster Knoten, der den selben Vater hat - PSLZWCTreeNode* pFirstChild; // erster Sohn - USHORT nCode; // Der Code fuer den String von Pixelwerten, der sich ergibt, wenn - USHORT nValue; // Der Pixelwert -}; - -class PSWriter -{ -private: - BOOL mbStatus; - ULONG mnLevelWarning; // number of embedded eps files which was not exported - ULONG mnLastPercent; // Mit welcher Zahl pCallback zuletzt aufgerufen wurde. - UINT32 mnLatestPush; // offset auf streamposition, an der zuletzt gepusht wurde - - long mnLevel; // dialog options - sal_Bool mbGrayScale; - sal_Bool mbCompression; - sal_Int32 mnPreview; - sal_Int32 mnTextMode; - - SvStream* mpPS; - const GDIMetaFile* pMTF; - GDIMetaFile* pAMTF; // only created if Graphics is not a Metafile - VirtualDevice aVDev; - - double nBoundingX1; // this represents the bounding box - double nBoundingY1; - double nBoundingX2; - double nBoundingY2; - // - StackMember* pGDIStack; - ULONG mnCursorPos; // aktuelle Cursorposition im Output - Color aColor; // aktuelle Farbe die fuer den Output benutzt wird - BOOL bLineColor; - Color aLineColor; // aktuelle GDIMetafile Farbeinstellungen - BOOL bFillColor; // - Color aFillColor; // - Color aTextColor; // - BOOL bTextFillColor; // - Color aTextFillColor; // - Color aBackgroundColor; // - BOOL bRegionChanged; - TextAlign eTextAlign; // - - double fLineWidth; - double fMiterLimit; - SvtGraphicStroke::CapType eLineCap; - SvtGraphicStroke::JoinType eJoinType; - SvtGraphicStroke::DashArray aDashArray; - - Font maFont; - Font maLastFont; - BYTE nChrSet; - ChrSet* pChrSetList; // Liste der Character-Sets - BYTE nNextChrSetId; // die erste unbenutzte ChrSet-Id - - PSLZWCTreeNode* pTable; // LZW compression data - PSLZWCTreeNode* pPrefix; // the compression is as same as the TIFF compression - USHORT nDataSize; - USHORT nClearCode; - USHORT nEOICode; - USHORT nTableSize; - USHORT nCodeSize; - ULONG nOffset; - ULONG dwShift; - - com::sun::star::uno::Reference< com::sun::star::task::XStatusIndicator > xStatusIndicator; - - void ImplWriteProlog( const Graphic* pPreviewEPSI = NULL ); - void ImplWriteEpilog(); - void ImplWriteActions( const GDIMetaFile& rMtf, VirtualDevice& rVDev ); - - // this method makes LF's, space inserting and word wrapping as used in all nMode - // parameters - inline void ImplExecMode( ULONG nMode ); - - // writes char[] + LF to stream - inline void ImplWriteLine( const char*, ULONG nMode = PS_RET ); - - // writes ( nNumb / 10^nCount ) in ASCII format to stream - void ImplWriteF( sal_Int32 nNumb, ULONG nCount = 3, ULONG nMode = PS_SPACE ); - - // writes a double in ASCII format to stream - void ImplWriteDouble( double, ULONG nMode = PS_SPACE ); - - // writes a long in ASCII format to stream - void ImplWriteLong( sal_Int32 nNumb, ULONG nMode = PS_SPACE ); - - // writes a byte in ASCII format to stream - void ImplWriteByte( BYTE nNumb, ULONG nMode = PS_SPACE ); - - // writes a byte in ASCII (hex) format to stream - void ImplWriteHexByte( BYTE nNumb, ULONG nMode = PS_WRAP ); - - // writes nNumb as number from 0.000 till 1.000 in ASCII format to stream - void ImplWriteB1( BYTE nNumb, ULONG nMode = PS_SPACE ); - - inline void ImplWritePoint( const Point&, sal_uInt32 nMode = PS_SPACE ); - void ImplMoveTo( const Point&, sal_uInt32 nMode = PS_SPACE ); - void ImplLineTo( const Point&, sal_uInt32 nMode = PS_SPACE ); - void ImplCurveTo( const Point& rP1, const Point& rP2, const Point& rP3, sal_uInt32 nMode = PS_SPACE ); - void ImplTranslate( const double& fX, const double& fY, sal_uInt32 nMode = PS_RET ); - void ImplScale( const double& fX, const double& fY, sal_uInt32 nMode = PS_RET ); - - void ImplWriteLine( const Polygon & rPolygon ); - void ImplAddPath( const Polygon & rPolygon ); - void ImplWriteLineInfo( double fLineWidth, double fMiterLimit, SvtGraphicStroke::CapType eLineCap, - SvtGraphicStroke::JoinType eJoinType, SvtGraphicStroke::DashArray& rDashArray ); - void ImplWriteLineInfo( const LineInfo& rLineInfo ); - void ImplRect( const Rectangle & rRectangle ); - void ImplRectFill ( const Rectangle & rRectangle ); - void ImplWriteGradient( const PolyPolygon& rPolyPoly, const Gradient& rGradient, VirtualDevice& rVDev ); - void ImplIntersect( const PolyPolygon& rPolyPoly ); - void ImplPolyPoly( const PolyPolygon & rPolyPolygon, sal_Bool bTextOutline = sal_False ); - void ImplPolyLine( const Polygon & rPolygon ); - - void ImplSetClipRegion( Region& rRegion ); - void ImplBmp( Bitmap*, Bitmap*, const Point &, double nWidth, double nHeight ); - void ImplText( const String& rUniString, const Point& rPos, const INT32* pDXArry, sal_Int32 nWidth, VirtualDevice& rVDev ); - void ImplSetAttrForText( const Point & rPoint ); - void ImplWriteCharacter( sal_Char ); - void ImplWriteString( const ByteString&, VirtualDevice& rVDev, const INT32* pDXArry = NULL, BOOL bStretch = FALSE ); - void ImplDefineFont( const char*, const char* ); - - void ImplClosePathDraw( ULONG nMode = PS_RET ); - void ImplPathDraw(); - - inline void ImplWriteLineColor( ULONG nMode = PS_RET ); - inline void ImplWriteFillColor( ULONG nMode = PS_RET ); - inline void ImplWriteTextColor( ULONG nMode = PS_RET ); - inline void ImplWriteTextFillColor( ULONG nMode = PS_RET ); - void ImplWriteColor( ULONG nMode ); - - double ImplGetScaling( const MapMode& ); - void ImplGetMapMode( const MapMode& ); - BOOL ImplGetBoundingBox( double* nNumb, BYTE* pSource, ULONG nSize ); - BYTE* ImplSearchEntry( BYTE* pSource, BYTE* pDest, ULONG nComp, ULONG nSize ); - // LZW methods - void StartCompression(); - void Compress( BYTE nSrc ); - void EndCompression(); - inline void WriteBits( USHORT nCode, USHORT nCodeLen ); - -public: - BOOL WritePS( const Graphic& rGraphic, SvStream& rTargetStream, FilterConfigItem* ); - PSWriter(); - ~PSWriter(); -}; - -//========================== Methoden von PSWriter ========================== - -//--------------------------------------------------------------------------------- - -PSWriter::PSWriter() -{ - pAMTF = NULL; -} - - -PSWriter::~PSWriter() -{ - delete pAMTF; -} - -//--------------------------------------------------------------------------------- - -BOOL PSWriter::WritePS( const Graphic& rGraphic, SvStream& rTargetStream, FilterConfigItem* pFilterConfigItem ) -{ - UINT32 nStreamPosition = 0, nPSPosition = 0; // -Wall warning, unset, check - - mbStatus = TRUE; - mnPreview = 0; - mnLevelWarning = 0; - mnLastPercent = 0; - mnLatestPush = 0xEFFFFFFE; - - if ( pFilterConfigItem ) - { - xStatusIndicator = pFilterConfigItem->GetStatusIndicator(); - if ( xStatusIndicator.is() ) - { - rtl::OUString aMsg; - xStatusIndicator->start( aMsg, 100 ); - } - } - - mpPS = &rTargetStream; - mpPS->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); - - // default values for the dialog options - mnLevel = 2; - mbGrayScale = FALSE; - mbCompression = TRUE; - mnTextMode = 0; // default0 : export glyph outlines - - // try to get the dialog selection - if ( pFilterConfigItem ) - { - ByteString aResMgrName( "eps" ); - ResMgr* pResMgr; - - pResMgr = ResMgr::CreateResMgr( aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() ); - - if( pResMgr ) - { - String aPreviewStr( RTL_CONSTASCII_USTRINGPARAM( "Preview" ) ); - String aVersionStr( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ); - String aColorStr( RTL_CONSTASCII_USTRINGPARAM( "ColorFormat" ) ); - String aComprStr( RTL_CONSTASCII_USTRINGPARAM( "CompressionMode" ) ); - mnPreview = pFilterConfigItem->ReadInt32( aPreviewStr, 1 ); - mnLevel = pFilterConfigItem->ReadInt32( aVersionStr, 2 ); - if ( mnLevel != 1 ) - mnLevel = 2; - mbGrayScale = pFilterConfigItem->ReadInt32( aColorStr, 1 ) == 2; - mbCompression = pFilterConfigItem->ReadInt32( aComprStr, 1 ) == 1; - String sTextMode( RTL_CONSTASCII_USTRINGPARAM( "TextMode" ) ); - mnTextMode = pFilterConfigItem->ReadInt32( sTextMode, 0 ); - if ( mnTextMode > 2 ) - mnTextMode = 0; - delete pResMgr; - } - } - - // compression is not available for Level 1 - if ( mnLevel == 1 ) - { - mbGrayScale = TRUE; - mbCompression = FALSE; - } - - if ( mnPreview & EPS_PREVIEW_TIFF ) - { - rTargetStream << (UINT32)0xC6D3D0C5; - nStreamPosition = rTargetStream.Tell(); - rTargetStream << (UINT32)0 << (UINT32)0 << (UINT32)0 << (UINT32)0 - << nStreamPosition + 26 << (UINT32)0 << (UINT16)0xffff; - - UINT32 nErrCode; - if ( mbGrayScale ) - { - BitmapEx aTempBitmapEx( rGraphic.GetBitmapEx() ); - aTempBitmapEx.Convert( BMP_CONVERSION_8BIT_GREYS ); - nErrCode = GraphicConverter::Export( rTargetStream, aTempBitmapEx, CVT_TIF ) ; - } - else - nErrCode = GraphicConverter::Export( rTargetStream, rGraphic, CVT_TIF ) ; - - if ( nErrCode == ERRCODE_NONE ) - { - rTargetStream.Seek( STREAM_SEEK_TO_END ); - nPSPosition = rTargetStream.Tell(); - rTargetStream.Seek( nStreamPosition + 20 ); - rTargetStream << nPSPosition - 30; // size of tiff gfx - rTargetStream.Seek( nPSPosition ); - } - else - { - mnPreview &=~ EPS_PREVIEW_TIFF; - rTargetStream.Seek( nStreamPosition - 4 ); - } - } - - // global default value setting - ChrSet* pCS; - StackMember* pGS; - - if ( rGraphic.GetType() == GRAPHIC_GDIMETAFILE ) - pMTF = &rGraphic.GetGDIMetaFile(); - else - pMTF = pAMTF = new GDIMetaFile( rGraphic.GetGDIMetaFile() ); - aVDev.SetMapMode( pMTF->GetPrefMapMode() ); - nBoundingX1 = nBoundingY1 = 0; - nBoundingX2 = pMTF->GetPrefSize().Width(); - nBoundingY2 = pMTF->GetPrefSize().Height(); - - pGDIStack = NULL; - aColor = Color( COL_TRANSPARENT ); - bLineColor = TRUE; - aLineColor = Color( COL_BLACK ); - bFillColor = TRUE; - aFillColor = Color( COL_WHITE ); - bTextFillColor = TRUE; - aTextFillColor = Color( COL_BLACK ); - fLineWidth = 1; - fMiterLimit = 15; // use same limit as most graphic systems and basegfx - eLineCap = SvtGraphicStroke::capButt; - eJoinType = SvtGraphicStroke::joinMiter; - aBackgroundColor = Color( COL_WHITE ); - eTextAlign = ALIGN_BASELINE; - bRegionChanged = FALSE; - - nChrSet = 0x00; - pChrSetList = NULL; - nNextChrSetId = 1; - - if( pMTF->GetActionCount() ) - { - ImplWriteProlog( ( mnPreview & EPS_PREVIEW_EPSI ) ? &rGraphic : NULL ); - mnCursorPos = 0; - ImplWriteActions( *pMTF, aVDev ); - ImplWriteEpilog(); - if ( mnPreview & EPS_PREVIEW_TIFF ) - { - UINT32 nPosition = rTargetStream.Tell(); - rTargetStream.Seek( nStreamPosition ); - rTargetStream << nPSPosition; - rTargetStream << nPosition - nPSPosition; - rTargetStream.Seek( nPosition ); - } - while( pChrSetList ) - { - pCS=pChrSetList; - pChrSetList=pCS->pSucc; - delete pCS; - } - while( pGDIStack ) - { - pGS=pGDIStack; - pGDIStack=pGS->pSucc; - delete pGS; - } - } - else - mbStatus = FALSE; - - if ( mbStatus && mnLevelWarning && pFilterConfigItem ) - { - ByteString aResMgrName( "eps" ); - ResMgr* pResMgr; - pResMgr = ResMgr::CreateResMgr( aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() ); - if( pResMgr ) - { - InfoBox aInfoBox( NULL, String( ResId( KEY_VERSION_CHECK, *pResMgr ) ) ); - aInfoBox.Execute(); - delete pResMgr; - } - } - - if ( xStatusIndicator.is() ) - xStatusIndicator->end(); - - return mbStatus; -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteProlog( const Graphic* pPreview ) -{ - ImplWriteLine( "%!PS-Adobe-3.0 EPSF-3.0 " ); - *mpPS << "%%BoundingBox: "; // BoundingBox - ImplWriteLong( 0 ); - ImplWriteLong( 0 ); - Size aSizePoint = Application::GetDefaultDevice()->LogicToLogic( pMTF->GetPrefSize(), - pMTF->GetPrefMapMode(), MAP_POINT ); - ImplWriteLong( aSizePoint.Width() ); - ImplWriteLong( aSizePoint.Height() ,PS_RET ); - ImplWriteLine( "%%Pages: 0" ); - ImplWriteLine( "%%Creator: Sun Microsystems, Inc." ); - ImplWriteLine( "%%Title: none" ); - ImplWriteLine( "%%CreationDate: none" ); - -// defaults - - *mpPS << "%%LanguageLevel: "; // Language level - ImplWriteLong( mnLevel, PS_RET ); - if ( !mbGrayScale && mnLevel == 1 ) - ImplWriteLine( "%%Extensions: CMYK" ); // CMYK extension is to set in color mode in level 1 - ImplWriteLine( "%%EndComments" ); - if ( pPreview && aSizePoint.Width() && aSizePoint.Height() ) - { - Size aSizeBitmap( ( aSizePoint.Width() + 7 ) & ~7, aSizePoint.Height() ); - Bitmap aTmpBitmap( pPreview->GetBitmap() ); - aTmpBitmap.Scale( aSizeBitmap, BMP_SCALE_INTERPOLATE ); - aTmpBitmap.Convert( BMP_CONVERSION_1BIT_THRESHOLD ); - BitmapReadAccess* pAcc = aTmpBitmap.AcquireReadAccess(); - if ( pAcc ) - { - *mpPS << "%%BeginPreview: "; // BoundingBox - ImplWriteLong( aSizeBitmap.Width() ); - ImplWriteLong( aSizeBitmap.Height() ); - *mpPS << "1 "; - INT32 nLines = aSizeBitmap.Width() / 312; - if ( ( nLines * 312 ) != aSizeBitmap.Width() ) - nLines++; - nLines *= aSizeBitmap.Height(); - ImplWriteLong( nLines ); - char nVal; - INT32 nX, nY, nCount2, nCount = 4; - const BitmapColor aBlack( pAcc->GetBestMatchingColor( Color( COL_BLACK ) ) ); - for ( nY = 0; nY < aSizeBitmap.Height(); nY++ ) - { - nCount2 = 0; - nVal = 0; - for ( nX = 0; nX < aSizeBitmap.Width(); nX++ ) - { - if ( !nCount2 ) - { - ImplExecMode( PS_RET ); - *mpPS << "%"; - nCount2 = 312; - } - nVal <<= 1; - if ( pAcc->GetPixel( nY, nX ) == aBlack ) - nVal |= 1; - if ( ! ( --nCount ) ) - { - if ( nVal > 9 ) - nVal += 'A' - 10; - else - nVal += '0'; - *mpPS << nVal; - nVal = 0; - nCount += 4; - } - nCount2--; - } - } - aTmpBitmap.ReleaseAccess( pAcc ); - ImplExecMode( PS_RET ); - ImplWriteLine( "%%EndPreview" ); - } - } - ImplWriteLine( "%%BeginProlog" ); - ImplWriteLine( "%%BeginResource: procset SDRes-Prolog 1.0 0" ); - -// BEGIN EPSF - ImplWriteLine( "/b4_inc_state save def\n/dict_count countdictstack def\n/op_count count 1 sub def\nuserdict begin" ); - ImplWriteLine( "0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath" ); - ImplWriteLine( "/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if" ); - - ImplWriteLine( "/bdef {bind def} bind def" ); // der neue operator bdef wird erzeugt - if ( mbGrayScale ) - ImplWriteLine( "/c {setgray} bdef" ); - else - ImplWriteLine( "/c {setrgbcolor} bdef" ); - ImplWriteLine( "/l {neg lineto} bdef" ); - ImplWriteLine( "/rl {neg rlineto} bdef" ); - ImplWriteLine( "/lc {setlinecap} bdef" ); - ImplWriteLine( "/lj {setlinejoin} bdef" ); - ImplWriteLine( "/lw {setlinewidth} bdef" ); - ImplWriteLine( "/ml {setmiterlimit} bdef" ); - ImplWriteLine( "/ld {setdash} bdef" ); - ImplWriteLine( "/m {neg moveto} bdef" ); - ImplWriteLine( "/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef" ); - ImplWriteLine( "/r {rotate} bdef" ); - ImplWriteLine( "/t {neg translate} bdef" ); - ImplWriteLine( "/s {scale} bdef" ); - ImplWriteLine( "/sw {show} bdef" ); - ImplWriteLine( "/gs {gsave} bdef" ); - ImplWriteLine( "/gr {grestore} bdef" ); - - ImplWriteLine( "/f {findfont dup length dict begin" ); // Setfont - ImplWriteLine( "{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def" ); - ImplWriteLine( "currentdict end /NFont exch definefont pop /NFont findfont} bdef" ); - - ImplWriteLine( "/p {closepath} bdef" ); - ImplWriteLine( "/sf {scalefont setfont} bdef" ); - - ImplWriteLine( "/ef {eofill}bdef" ); // close path and fill - ImplWriteLine( "/pc {closepath stroke}bdef" ); // close path and draw - ImplWriteLine( "/ps {stroke}bdef" ); // draw current path - ImplWriteLine( "/pum {matrix currentmatrix}bdef" ); // pushes the current matrix - ImplWriteLine( "/pom {setmatrix}bdef" ); // pops the matrix - ImplWriteLine( "/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef" ); - ImplWriteLine( "%%EndResource" ); - ImplWriteLine( "%%EndProlog" ); - ImplWriteLine( "%%BeginSetup" ); - ImplWriteLine( "%%EndSetup" ); - ImplWriteLine( "%%Page: 1 1" ); - ImplWriteLine( "%%BeginPageSetup" ); - ImplWriteLine( "%%EndPageSetup" ); - ImplWriteLine( "pum" ); - ImplScale( (double)aSizePoint.Width() / (double)pMTF->GetPrefSize().Width(), (double)aSizePoint.Height() / (double)pMTF->GetPrefSize().Height() ); - ImplWriteDouble( 0 ); - ImplWriteDouble( -pMTF->GetPrefSize().Height() ); - ImplWriteLine( "t" ); - ImplWriteLine( "/tm matrix currentmatrix def" ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteEpilog() -{ - ImplTranslate( 0, nBoundingY2 ); - ImplWriteLine( "pom" ); - ImplWriteLine( "count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore" ); - - ImplWriteLine( "%%PageTrailer" ); - ImplWriteLine( "%%Trailer" ); - - ImplWriteLine( "%%EOF" ); -} - -//--------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteActions( const GDIMetaFile& rMtf, VirtualDevice& rVDev ) -{ - PolyPolygon aFillPath; - - for( ULONG nCurAction = 0, nCount = rMtf.GetActionCount(); nCurAction < nCount; nCurAction++ ) - { - MetaAction* pMA = rMtf.GetAction( nCurAction ); - - switch( pMA->GetType() ) - { - case META_NULL_ACTION : - break; - - case META_PIXEL_ACTION : - { - Color aOldLineColor( aLineColor ); - aLineColor = ( (const MetaPixelAction*) pMA )->GetColor(); - ImplWriteLineColor( PS_SPACE ); - ImplMoveTo( ( (const MetaPixelAction*)pMA )->GetPoint() ); - ImplLineTo( ( (const MetaPixelAction*)pMA )->GetPoint() ); - ImplPathDraw(); - aLineColor = aOldLineColor; - } - break; - - case META_POINT_ACTION : - { - ImplWriteLineColor( PS_SPACE ); - ImplMoveTo( ( (const MetaPointAction*)pMA )->GetPoint() ); - ImplLineTo( ( (const MetaPointAction*)pMA )->GetPoint() ); - ImplPathDraw(); - } - break; - - case META_LINE_ACTION : - { - const LineInfo& rLineInfo = ( ( const MetaLineAction*)pMA )->GetLineInfo(); - ImplWriteLineInfo( rLineInfo ); - if ( bLineColor ) - { - ImplWriteLineColor( PS_SPACE ); - ImplMoveTo( ( (const MetaLineAction*) pMA )->GetStartPoint() ); - ImplLineTo( ( (const MetaLineAction*) pMA )->GetEndPoint() ); - ImplPathDraw(); - } - } - break; - - case META_RECT_ACTION : - { - ImplRect( ( (const MetaRectAction*) pMA )->GetRect() ); - } - break; - - case META_ROUNDRECT_ACTION : - ImplRect( ( (const MetaRoundRectAction*) pMA )->GetRect() ); - break; - - case META_ELLIPSE_ACTION : - { - Rectangle aRect = ( ( (const MetaEllipseAction*) pMA )->GetRect() ); - Point aCenter = aRect.Center(); - Polygon aPoly( aCenter, aRect.GetWidth() / 2, aRect.GetHeight() / 2 ); - PolyPolygon aPolyPoly( aPoly ); - ImplPolyPoly( aPolyPoly ); - } - break; - - case META_ARC_ACTION : - { - Polygon aPoly( ( (const MetaArcAction*)pMA )->GetRect(), ( (const MetaArcAction*)pMA )->GetStartPoint(), - ( (const MetaArcAction*)pMA )->GetEndPoint(), POLY_ARC ); - PolyPolygon aPolyPoly( aPoly ); - ImplPolyPoly( aPolyPoly ); - } - break; - - case META_PIE_ACTION : - { - Polygon aPoly( ( (const MetaPieAction*)pMA )->GetRect(), ( (const MetaPieAction*)pMA )->GetStartPoint(), - ( (const MetaPieAction*)pMA )->GetEndPoint(), POLY_PIE ); - PolyPolygon aPolyPoly( aPoly ); - ImplPolyPoly( aPolyPoly ); - } - break; - - case META_CHORD_ACTION : - { - Polygon aPoly( ( (const MetaChordAction*)pMA )->GetRect(), ( (const MetaChordAction*)pMA )->GetStartPoint(), - ( (const MetaChordAction*)pMA )->GetEndPoint(), POLY_CHORD ); - PolyPolygon aPolyPoly( aPoly ); - ImplPolyPoly( aPolyPoly ); - } - break; - - case META_POLYLINE_ACTION : - { - Polygon aPoly( ( (const MetaPolyLineAction*) pMA )->GetPolygon() ); - const LineInfo& rLineInfo = ( ( const MetaPolyLineAction*)pMA )->GetLineInfo(); - ImplWriteLineInfo( rLineInfo ); - - if(basegfx::B2DLINEJOIN_NONE == rLineInfo.GetLineJoin() - && rLineInfo.GetWidth() > 1) - { - // emulate B2DLINEJOIN_NONE by creating single edges - const sal_uInt16 nPoints(aPoly.GetSize()); - const bool bCurve(aPoly.HasFlags()); - - for(sal_uInt16 a(0); a + 1 < nPoints; a++) - { - if(bCurve - && POLY_NORMAL != aPoly.GetFlags(a + 1) - && a + 2 < nPoints - && POLY_NORMAL != aPoly.GetFlags(a + 2) - && a + 3 < nPoints) - { - const Polygon aSnippet(4, - aPoly.GetConstPointAry() + a, - aPoly.GetConstFlagAry() + a); - ImplPolyLine(aSnippet); - a += 2; - } - else - { - const Polygon aSnippet(2, - aPoly.GetConstPointAry() + a); - ImplPolyLine(aSnippet); - } - } - } - else - { - ImplPolyLine( aPoly ); - } - } - break; - - case META_POLYGON_ACTION : - { - PolyPolygon aPolyPoly( ( (const MetaPolygonAction*) pMA )->GetPolygon() ); - ImplPolyPoly( aPolyPoly ); - } - break; - - case META_POLYPOLYGON_ACTION : - { - ImplPolyPoly( ( (const MetaPolyPolygonAction*) pMA )->GetPolyPolygon() ); - } - break; - - case META_TEXT_ACTION: - { - const MetaTextAction * pA = (const MetaTextAction*) pMA; - - String aUniStr( pA->GetText(), pA->GetIndex(), pA->GetLen() ); - Point aPoint( pA->GetPoint() ); - - ImplText( aUniStr, aPoint, NULL, 0, rVDev ); - } - break; - - case META_TEXTRECT_ACTION: - { - DBG_ERROR( "Unsupported action: TextRect...Action!" ); - } - break; - - case META_STRETCHTEXT_ACTION : - { - const MetaStretchTextAction* pA = (const MetaStretchTextAction*)pMA; - String aUniStr( pA->GetText(), pA->GetIndex(), pA->GetLen() ); - Point aPoint( pA->GetPoint() ); - - ImplText( aUniStr, aPoint, NULL, pA->GetWidth(), rVDev ); - } - break; - - case META_TEXTARRAY_ACTION: - { - const MetaTextArrayAction* pA = (const MetaTextArrayAction*)pMA; - String aUniStr( pA->GetText(), pA->GetIndex(), pA->GetLen() ); - Point aPoint( pA->GetPoint() ); - - ImplText( aUniStr, aPoint, pA->GetDXArray(), 0, rVDev ); - } - break; - - case META_BMP_ACTION : - { - Bitmap aBitmap = ( (const MetaBmpAction*)pMA )->GetBitmap(); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Point aPoint = ( (const MetaBmpAction*) pMA )->GetPoint(); - Size aSize = aBitmap.GetSizePixel(); - ImplBmp( &aBitmap, NULL, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - case META_BMPSCALE_ACTION : - { - Bitmap aBitmap = ( (const MetaBmpScaleAction*)pMA )->GetBitmap(); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Point aPoint = ( (const MetaBmpScaleAction*) pMA )->GetPoint(); - Size aSize = ( (const MetaBmpScaleAction*)pMA )->GetSize(); - ImplBmp( &aBitmap, NULL, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - case META_BMPSCALEPART_ACTION : - { - Bitmap aBitmap( ( (const MetaBmpScalePartAction*)pMA )->GetBitmap() ); - aBitmap.Crop( Rectangle( ( (const MetaBmpScalePartAction*)pMA )->GetSrcPoint(), - ( (const MetaBmpScalePartAction*)pMA )->GetSrcSize() ) ); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Point aPoint = ( (const MetaBmpScalePartAction*) pMA)->GetDestPoint(); - Size aSize = ( (const MetaBmpScalePartAction*)pMA )->GetDestSize(); - ImplBmp( &aBitmap, NULL, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - case META_BMPEX_ACTION : - { - BitmapEx aBitmapEx( ( (MetaBmpExAction*)pMA)->GetBitmapEx() ); - Bitmap aBitmap( aBitmapEx.GetBitmap() ); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Bitmap aMask( aBitmapEx.GetMask() ); - Point aPoint = ( (const MetaBmpExAction*) pMA)->GetPoint(); - Size aSize = ( aBitmap.GetSizePixel() ); - ImplBmp( &aBitmap, &aMask, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - case META_BMPEXSCALE_ACTION : - { - BitmapEx aBitmapEx( ( (MetaBmpExScaleAction*)pMA)->GetBitmapEx() ); - Bitmap aBitmap( aBitmapEx.GetBitmap() ); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Bitmap aMask( aBitmapEx.GetMask() ); - Point aPoint = ( (const MetaBmpExScaleAction*) pMA)->GetPoint(); - Size aSize( ( (const MetaBmpExScaleAction*)pMA )->GetSize() ); - ImplBmp( &aBitmap, &aMask, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - case META_BMPEXSCALEPART_ACTION : - { - BitmapEx aBitmapEx( ( (const MetaBmpExScalePartAction*)pMA )->GetBitmapEx() ); - aBitmapEx.Crop( Rectangle( ( (const MetaBmpExScalePartAction*)pMA )->GetSrcPoint(), - ( (const MetaBmpExScalePartAction*)pMA )->GetSrcSize() ) ); - Bitmap aBitmap( aBitmapEx.GetBitmap() ); - if ( mbGrayScale ) - aBitmap.Convert( BMP_CONVERSION_8BIT_GREYS ); - Bitmap aMask( aBitmapEx.GetMask() ); - Point aPoint = ( (const MetaBmpExScalePartAction*) pMA)->GetDestPoint(); - Size aSize = ( (const MetaBmpExScalePartAction*)pMA )->GetDestSize(); - ImplBmp( &aBitmap, &aMask, aPoint, aSize.Width(), aSize.Height() ); - } - break; - - // Unsupported Actions - case META_MASK_ACTION: - case META_MASKSCALE_ACTION: - case META_MASKSCALEPART_ACTION: - { - DBG_ERROR( "Unsupported action: MetaMask...Action!" ); - } - break; - - case META_GRADIENT_ACTION : - { - PolyPolygon aPolyPoly( ( (const MetaGradientAction*)pMA)->GetRect() ); - ImplWriteGradient( aPolyPoly, ( (const MetaGradientAction*) pMA )->GetGradient(), rVDev ); - } - break; - - case META_GRADIENTEX_ACTION : - { - PolyPolygon aPolyPoly( ( (const MetaGradientExAction*)pMA)->GetPolyPolygon() ); - ImplWriteGradient( aPolyPoly, ( (const MetaGradientExAction*) pMA )->GetGradient(), rVDev ); - } - break; - - case META_HATCH_ACTION : - { - VirtualDevice l_aVDev; - GDIMetaFile aTmpMtf; - - l_aVDev.SetMapMode( rVDev.GetMapMode() ); - l_aVDev.AddHatchActions( ( (const MetaHatchAction*)pMA)->GetPolyPolygon(), - ( (const MetaHatchAction*)pMA )->GetHatch(), aTmpMtf ); - ImplWriteActions( aTmpMtf, rVDev ); - } - break; - - case META_WALLPAPER_ACTION : - { - const MetaWallpaperAction* pA = (const MetaWallpaperAction*)pMA; - Rectangle aRect = pA->GetRect(); - Wallpaper aWallpaper = pA->GetWallpaper(); - - if ( aWallpaper.IsBitmap() ) - { - BitmapEx aBitmapEx = aWallpaper.GetBitmap(); - Bitmap aBitmap( aBitmapEx.GetBitmap() ); - if ( aBitmapEx.IsTransparent() ) - { - if ( aWallpaper.IsGradient() ) - { - - // gradient action - - } - Bitmap aMask( aBitmapEx.GetMask() ); - ImplBmp( &aBitmap, &aMask, Point( aRect.Left(), aRect.Top() ), aRect.GetWidth(), aRect.GetHeight() ); - } - else - ImplBmp( &aBitmap, NULL, Point( aRect.Left(), aRect.Top() ), aRect.GetWidth(), aRect.GetHeight() ); - - // wallpaper Style - - } - else if ( aWallpaper.IsGradient() ) - { - - // gradient action - - } - else - { - aColor = aWallpaper.GetColor(); - ImplRectFill( aRect ); - } - } - break; - - case META_ISECTRECTCLIPREGION_ACTION: - { - const MetaISectRectClipRegionAction* pA = (const MetaISectRectClipRegionAction*) pMA; - Region aRegion( pA->GetRect() ); - ImplSetClipRegion( aRegion ); - } - break; - - case META_CLIPREGION_ACTION: - { - const MetaClipRegionAction* pA = (const MetaClipRegionAction*) pMA; - Region aRegion( pA->GetRegion() ); - ImplSetClipRegion( aRegion ); - } - break; - - case META_ISECTREGIONCLIPREGION_ACTION: - { - const MetaISectRegionClipRegionAction* pA = (const MetaISectRegionClipRegionAction*) pMA; - Region aRegion( pA->GetRegion() ); - ImplSetClipRegion( aRegion ); - } - break; - - case META_MOVECLIPREGION_ACTION: - { -/* - if ( !aClipRegion.IsEmpty() ) - { - const MetaMoveClipRegionAction* pA = (const MetaMoveClipRegionAction*) pMA; - aClipRegion.Move( pA->GetHorzMove(), pA->GetVertMove() ); - ImplSetClipRegion(); - } -*/ - } - break; - - case META_LINECOLOR_ACTION : - { - if ( ( (const MetaLineColorAction*) pMA)->IsSetting() ) - { - bLineColor = TRUE; - aLineColor = ( (const MetaLineColorAction*) pMA )->GetColor(); - } - else - bLineColor = FALSE; - } - break; - - case META_FILLCOLOR_ACTION : - { - if ( ( (const MetaFillColorAction*) pMA )->IsSetting() ) - { - bFillColor = TRUE; - aFillColor = ( (const MetaFillColorAction*) pMA )->GetColor(); - } - else - bFillColor = FALSE; - } - break; - - case META_TEXTCOLOR_ACTION : - { - aTextColor = ( (const MetaTextColorAction*) pMA )->GetColor(); - } - break; - - case META_TEXTFILLCOLOR_ACTION : - { - if ( ( (const MetaTextFillColorAction*) pMA )->IsSetting() ) - { - bTextFillColor = TRUE; - aTextFillColor = ( (const MetaTextFillColorAction*) pMA )->GetColor(); - } - else - bTextFillColor = FALSE; - } - break; - - case META_TEXTALIGN_ACTION : - { - eTextAlign = ( (const MetaTextAlignAction*) pMA )->GetTextAlign(); - } - break; - - case META_MAPMODE_ACTION : - { - pMA->Execute( &rVDev ); - ImplGetMapMode( rVDev.GetMapMode() ); - } - break; - - case META_FONT_ACTION : - { - maFont = ((const MetaFontAction*)pMA)->GetFont(); - rVDev.SetFont( maFont ); - } - break; - - case META_PUSH_ACTION : - { - rVDev.Push(((const MetaPushAction*)pMA)->GetFlags() ); - StackMember* pGS = new StackMember; - pGS->pSucc = pGDIStack; - pGDIStack = pGS; - pGS->aDashArray = aDashArray; - pGS->eJoinType = eJoinType; - pGS->eLineCap = eLineCap; - pGS->fLineWidth = fLineWidth; - pGS->fMiterLimit = fMiterLimit; - pGS->eTextAlign = eTextAlign; - pGS->aGlobalCol = aColor; - pGS->bLineCol = bLineColor; - pGS->aLineCol = aLineColor; - pGS->bFillCol = bFillColor; - pGS->aFillCol = aFillColor; - pGS->aTextCol = aTextColor; - pGS->bTextFillCol = bTextFillColor; - pGS->aTextFillCol = aTextFillColor; - pGS->aBackgroundCol = aBackgroundColor; - bRegionChanged = FALSE; - pGS->aFont = maFont; - mnLatestPush = mpPS->Tell(); - ImplWriteLine( "gs" ); - } - break; - - case META_POP_ACTION : - { - rVDev.Pop(); - StackMember* pGS; - if( pGDIStack ) - { - pGS = pGDIStack; - pGDIStack = pGS->pSucc; - aDashArray = pGS->aDashArray; - eJoinType = pGS->eJoinType; - eLineCap = pGS->eLineCap; - fLineWidth = pGS->fLineWidth; - fMiterLimit = pGS->fMiterLimit; - eTextAlign = pGS->eTextAlign; - aColor = pGS->aGlobalCol; - bLineColor = pGS->bLineCol; - aLineColor = pGS->aLineCol; - bFillColor = pGS->bFillCol; - aFillColor = pGS->aFillCol; - aTextColor = pGS->aTextCol; - bTextFillColor = pGS->bTextFillCol; - aTextFillColor = pGS->aTextFillCol; - aBackgroundColor = pGS->aBackgroundCol; - maFont = pGS->aFont; - maLastFont = Font(); // set maLastFont != maFont -> so that - delete pGS; - sal_uInt32 nCurrentPos = mpPS->Tell(); - if ( nCurrentPos - 3 == mnLatestPush ) - { - mpPS->Seek( mnLatestPush ); - ImplWriteLine( " " ); - mpPS->Seek( mnLatestPush ); - } - else - ImplWriteLine( "gr" ); - } - } - break; - - case META_EPS_ACTION : - { - GfxLink aGfxLink = ( (const MetaEPSAction*) pMA )->GetLink(); - const GDIMetaFile aSubstitute( ( ( const MetaEPSAction*) pMA )->GetSubstitute() ); - - BOOL bLevelConflict = FALSE; - BYTE* pSource = (BYTE*) aGfxLink.GetData(); - ULONG nSize = aGfxLink.GetDataSize(); - ULONG nParseThis = POSTSCRIPT_BOUNDINGSEARCH; - if ( nSize < 64 ) // assuming eps is larger than 64 bytes - pSource = NULL; - if ( nParseThis > nSize ) - nParseThis = nSize; - - if ( pSource && ( mnLevel == 1 ) ) - { - BYTE* pFound = ImplSearchEntry( pSource, (BYTE*)"%%LanguageLevel:", nParseThis - 10, 16 ); - if ( pFound ) - { - BYTE k, i = 10; - pFound += 16; - while ( --i ) - { - k = *pFound++; - if ( ( k > '0' ) && ( k <= '9' ) ) - { - if ( k != '1' ) - { - bLevelConflict = TRUE; - mnLevelWarning++; - } - break; - } - } - } - } - if ( !bLevelConflict ) - { - double nBoundingBox[4]; - if ( pSource && ImplGetBoundingBox( nBoundingBox, pSource, nParseThis ) ) - { - Point aPoint = ( (const MetaEPSAction*) pMA )->GetPoint(); - Size aSize = ( (const MetaEPSAction*) pMA )->GetSize(); - - MapMode aMapMode( aSubstitute.GetPrefMapMode() ); - Size aOutSize( rVDev.LogicToLogic( aSize, rVDev.GetMapMode(), aMapMode ) ); - Point aOrigin( rVDev.LogicToLogic( aPoint, rVDev.GetMapMode(), aMapMode ) ); - aOrigin.Y() += aOutSize.Height(); - aMapMode.SetOrigin( aOrigin ); - aMapMode.SetScaleX( aOutSize.Width() / ( nBoundingBox[ 2 ] - nBoundingBox[ 0 ] ) ); - aMapMode.SetScaleY( aOutSize.Height() / ( nBoundingBox[ 3 ] - nBoundingBox[ 1 ] ) ); - ImplWriteLine( "gs" ); - ImplGetMapMode( aMapMode ); - ImplWriteLine( "%%BeginDocument:" ); - mpPS->Write( pSource, aGfxLink.GetDataSize() ); - ImplWriteLine( "%%EndDocument\ngr" ); - } - } - } - break; - - case META_TRANSPARENT_ACTION: - { -// ImplLine( ( (const MetaTransparentAction*) pMA )->GetPolyPolygon() ); - } - break; - - case META_RASTEROP_ACTION: - { - pMA->Execute( &rVDev ); - } - break; - - case META_FLOATTRANSPARENT_ACTION: - { - const MetaFloatTransparentAction* pA = (const MetaFloatTransparentAction*) pMA; - - GDIMetaFile aTmpMtf( pA->GetGDIMetaFile() ); - Point aSrcPt( aTmpMtf.GetPrefMapMode().GetOrigin() ); - const Size aSrcSize( aTmpMtf.GetPrefSize() ); - const Point aDestPt( pA->GetPoint() ); - const Size aDestSize( pA->GetSize() ); - const double fScaleX = aSrcSize.Width() ? (double) aDestSize.Width() / aSrcSize.Width() : 1.0; - const double fScaleY = aSrcSize.Height() ? (double) aDestSize.Height() / aSrcSize.Height() : 1.0; - long nMoveX, nMoveY; - - if( fScaleX != 1.0 || fScaleY != 1.0 ) - { - aTmpMtf.Scale( fScaleX, fScaleY ); - aSrcPt.X() = FRound( aSrcPt.X() * fScaleX ), aSrcPt.Y() = FRound( aSrcPt.Y() * fScaleY ); - } - - nMoveX = aDestPt.X() - aSrcPt.X(), nMoveY = aDestPt.Y() - aSrcPt.Y(); - - if( nMoveX || nMoveY ) - aTmpMtf.Move( nMoveX, nMoveY ); - - ImplWriteActions( aTmpMtf, rVDev ); - } - break; - - case META_COMMENT_ACTION: - { - const MetaCommentAction* pA = (const MetaCommentAction*) pMA; - if ( pA->GetComment().CompareIgnoreCaseToAscii( "XGRAD_SEQ_BEGIN" ) == COMPARE_EQUAL ) - { - const MetaGradientExAction* pGradAction = NULL; - while( ++nCurAction < nCount ) - { - MetaAction* pAction = rMtf.GetAction( nCurAction ); - if( pAction->GetType() == META_GRADIENTEX_ACTION ) - pGradAction = (const MetaGradientExAction*) pAction; - else if( ( pAction->GetType() == META_COMMENT_ACTION ) && - ( ( (const MetaCommentAction*) pAction )->GetComment().CompareIgnoreCaseToAscii( "XGRAD_SEQ_END" ) == COMPARE_EQUAL ) ) - { - break; - } - } - if( pGradAction ) - ImplWriteGradient( pGradAction->GetPolyPolygon(), pGradAction->GetGradient(), rVDev ); - } - else if ( pA->GetComment().Equals( "XPATHFILL_SEQ_END" ) ) - { - if ( aFillPath.Count() ) - { - aFillPath = PolyPolygon(); - ImplWriteLine( "gr" ); - } - } - else - { - const BYTE* pData = pA->GetData(); - if ( pData ) - { - SvMemoryStream aMemStm( (void*)pData, pA->GetDataSize(), STREAM_READ ); - sal_Bool bSkipSequence = sal_False; - ByteString sSeqEnd; - - if( pA->GetComment().Equals( "XPATHSTROKE_SEQ_BEGIN" ) ) - { - sSeqEnd = ByteString( "XPATHSTROKE_SEQ_END" ); - SvtGraphicStroke aStroke; - aMemStm >> aStroke; - - Polygon aPath; - aStroke.getPath( aPath ); - - PolyPolygon aStartArrow; - PolyPolygon aEndArrow; -// double fTransparency( aStroke.getTransparency() ); - double fStrokeWidth( aStroke.getStrokeWidth() ); - SvtGraphicStroke::JoinType eJT( aStroke.getJoinType() ); - SvtGraphicStroke::DashArray l_aDashArray; - - aStroke.getStartArrow( aStartArrow ); - aStroke.getEndArrow( aEndArrow ); - aStroke.getDashArray( l_aDashArray ); - - bSkipSequence = sal_True; - if ( l_aDashArray.size() > 11 ) // ps dasharray limit is 11 - bSkipSequence = sal_False; - if ( aStartArrow.Count() || aEndArrow.Count() ) - bSkipSequence = sal_False; - if ( (sal_uInt32)eJT > 2 ) - bSkipSequence = sal_False; - if ( l_aDashArray.size() && ( fStrokeWidth != 0.0 ) ) - bSkipSequence = sal_False; - if ( bSkipSequence ) - { - ImplWriteLineInfo( fStrokeWidth, aStroke.getMiterLimit(), - aStroke.getCapType(), eJT, l_aDashArray ); - ImplPolyLine( aPath ); - } - } - else if( pA->GetComment().Equals( "XPATHFILL_SEQ_BEGIN" ) ) - { - sSeqEnd = ByteString( "XPATHFILL_SEQ_END" ); - SvtGraphicFill aFill; - aMemStm >> aFill; - switch( aFill.getFillType() ) - { - case SvtGraphicFill::fillSolid : - { - bSkipSequence = sal_True; - PolyPolygon aPolyPoly; - aFill.getPath( aPolyPoly ); - sal_uInt16 i, nPolyCount = aPolyPoly.Count(); - if ( nPolyCount ) - { - aFillColor = aFill.getFillColor(); - ImplWriteFillColor( PS_SPACE ); - for ( i = 0; i < nPolyCount; ) - { - ImplAddPath( aPolyPoly.GetObject( i ) ); - if ( ++i < nPolyCount ) - { - *mpPS << "p"; - mnCursorPos += 2; - ImplExecMode( PS_RET ); - } - } - *mpPS << "p ef"; - mnCursorPos += 4; - ImplExecMode( PS_RET ); - } - } - break; - - case SvtGraphicFill::fillTexture : - { - aFill.getPath( aFillPath ); - - /* normally an object filling is consisting of three MetaActions: - MetaBitmapAction using RasterOp xor, - MetaPolyPolygonAction using RasterOp rop_0 - MetaBitmapAction using RasterOp xor - - Because RasterOps cannot been used in Postscript, we have to - replace these actions. The MetaComment "XPATHFILL_SEQ_BEGIN" is - providing the clippath of the object. The following loop is - trying to find the bitmap that is matching the clippath, so that - only one bitmap is exported, otherwise if the bitmap is not - locatable, all metaactions are played normally. - */ - sal_uInt32 nCommentStartAction = nCurAction; - sal_uInt32 nBitmapCount = 0; - sal_uInt32 nBitmapAction = 0; - - sal_Bool bOk = sal_True; - while( bOk && ( ++nCurAction < nCount ) ) - { - MetaAction* pAction = rMtf.GetAction( nCurAction ); - switch( pAction->GetType() ) - { - case META_BMPSCALE_ACTION : - case META_BMPSCALEPART_ACTION : - case META_BMPEXSCALE_ACTION : - case META_BMPEXSCALEPART_ACTION : - { - nBitmapCount++; - nBitmapAction = nCurAction; - } - break; - case META_COMMENT_ACTION : - { - if (((const MetaCommentAction*)pAction)->GetComment().Equals( "XPATHFILL_SEQ_END" )) - bOk = sal_False; - } - break; - } - } - if( nBitmapCount == 2 ) - { - ImplWriteLine( "gs" ); - ImplIntersect( aFillPath ); - GDIMetaFile aTempMtf; - aTempMtf.AddAction( rMtf.GetAction( nBitmapAction )->Clone() ); - ImplWriteActions( aTempMtf, rVDev ); - ImplWriteLine( "gr" ); - aFillPath = PolyPolygon(); - } - else - nCurAction = nCommentStartAction + 1; - } - break; - - case SvtGraphicFill::fillGradient : - aFill.getPath( aFillPath ); - break; - - case SvtGraphicFill::fillHatch : - break; - } - if ( aFillPath.Count() ) - { - ImplWriteLine( "gs" ); - ImplIntersect( aFillPath ); - } - } - if ( bSkipSequence ) - { - while( ++nCurAction < nCount ) - { - pMA = rMtf.GetAction( nCurAction ); - if ( pMA->GetType() == META_COMMENT_ACTION ) - { - ByteString sComment( ((MetaCommentAction*)pMA)->GetComment() ); - if ( sComment.Equals( sSeqEnd ) ) - break; - } - } - } - } - } - } - break; - } - } -} - - - -//--------------------------------------------------------------------------------- - -inline void PSWriter::ImplWritePoint( const Point& rPoint, sal_uInt32 nMode ) -{ - ImplWriteDouble( rPoint.X() ); - ImplWriteDouble( rPoint.Y(), nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplMoveTo( const Point& rPoint, sal_uInt32 nMode ) -{ - ImplWritePoint( rPoint ); - ImplWriteByte( 'm' ); - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplLineTo( const Point& rPoint, sal_uInt32 nMode ) -{ - ImplWritePoint( rPoint ); - ImplWriteByte( 'l' ); - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplCurveTo( const Point& rP1, const Point& rP2, const Point& rP3, sal_uInt32 nMode ) -{ - ImplWritePoint( rP1 ); - ImplWritePoint( rP2 ); - ImplWritePoint( rP3 ); - *mpPS << "ct "; - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplTranslate( const double& fX, const double& fY, sal_uInt32 nMode ) -{ - ImplWriteDouble( fX ); - ImplWriteDouble( fY ); - ImplWriteByte( 't' ); - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplScale( const double& fX, const double& fY, sal_uInt32 nMode ) -{ - ImplWriteDouble( fX ); - ImplWriteDouble( fY ); - ImplWriteByte( 's' ); - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplRect( const Rectangle & rRect ) -{ - if ( bFillColor ) - ImplRectFill( rRect ); - if ( bLineColor ) - { - double nWidth = rRect.GetWidth(); - double nHeight = rRect.GetHeight(); - - ImplWriteLineColor( PS_SPACE ); - ImplMoveTo( rRect.TopLeft() ); - ImplWriteDouble( nWidth ); - *mpPS << "0 rl 0 "; - ImplWriteDouble( nHeight ); - *mpPS << "rl "; - ImplWriteDouble( nWidth ); - *mpPS << "neg 0 rl "; - ImplClosePathDraw(); - } - *mpPS << (BYTE)10; - mnCursorPos = 0; -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplRectFill( const Rectangle & rRect ) -{ - double nWidth = rRect.GetWidth(); - double nHeight = rRect.GetHeight(); - - ImplWriteFillColor( PS_SPACE ); - ImplMoveTo( rRect.TopLeft() ); - ImplWriteDouble( nWidth ); - *mpPS << "0 rl 0 "; - ImplWriteDouble( nHeight ); - *mpPS << "rl "; - ImplWriteDouble( nWidth ); - *mpPS << "neg 0 rl ef "; - *mpPS << "p ef"; - mnCursorPos += 2; - ImplExecMode( PS_RET ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplAddPath( const Polygon & rPolygon ) -{ - USHORT i = 1; - USHORT nPointCount = rPolygon.GetSize(); - if ( nPointCount > 1 ) - { - ImplMoveTo( rPolygon.GetPoint( 0 ) ); - while ( i < nPointCount ) - { - if ( ( rPolygon.GetFlags( i ) == POLY_CONTROL ) - && ( ( i + 2 ) < nPointCount ) - && ( rPolygon.GetFlags( i + 1 ) == POLY_CONTROL ) - && ( rPolygon.GetFlags( i + 2 ) != POLY_CONTROL ) ) - { - ImplCurveTo( rPolygon[ i ], rPolygon[ i + 1 ], rPolygon[ i + 2 ], PS_WRAP ); - i += 3; - } - else - ImplLineTo( rPolygon.GetPoint( i++ ), PS_SPACE | PS_WRAP ); - } - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplIntersect( const PolyPolygon& rPolyPoly ) -{ - sal_uInt16 i, nPolyCount = rPolyPoly.Count(); - for ( i = 0; i < nPolyCount; ) - { - ImplAddPath( rPolyPoly.GetObject( i ) ); - if ( ++i < nPolyCount ) - { - *mpPS << "p"; - mnCursorPos += 2; - ImplExecMode( PS_RET ); - } - } - ImplWriteLine( "eoclip newpath" ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteGradient( const PolyPolygon& rPolyPoly, const Gradient& rGradient, VirtualDevice& rVDev ) -{ - VirtualDevice l_aVDev; - GDIMetaFile aTmpMtf; - l_aVDev.SetMapMode( rVDev.GetMapMode() ); - l_aVDev.AddGradientActions( rPolyPoly.GetBoundRect(), rGradient, aTmpMtf ); - ImplWriteActions( aTmpMtf, rVDev ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplPolyPoly( const PolyPolygon & rPolyPoly, sal_Bool bTextOutline ) -{ - sal_uInt16 i, nPolyCount = rPolyPoly.Count(); - if ( nPolyCount ) - { - if ( bFillColor || bTextOutline ) - { - if ( bTextOutline ) - ImplWriteTextColor( PS_SPACE ); - else - ImplWriteFillColor( PS_SPACE ); - for ( i = 0; i < nPolyCount; ) - { - ImplAddPath( rPolyPoly.GetObject( i ) ); - if ( ++i < nPolyCount ) - { - *mpPS << "p"; - mnCursorPos += 2; - ImplExecMode( PS_RET ); - } - } - *mpPS << "p ef"; - mnCursorPos += 4; - ImplExecMode( PS_RET ); - } - if ( bLineColor ) - { - ImplWriteLineColor( PS_SPACE ); - for ( i = 0; i < nPolyCount; i++ ) - ImplAddPath( rPolyPoly.GetObject( i ) ); - ImplClosePathDraw( PS_RET ); - } - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplPolyLine( const Polygon & rPoly ) -{ - if ( bLineColor ) - { - ImplWriteLineColor( PS_SPACE ); - sal_uInt16 i, nPointCount = rPoly.GetSize(); - if ( nPointCount ) - { - if ( nPointCount > 1 ) - { - ImplMoveTo( rPoly.GetPoint( 0 ) ); - i = 1; - while ( i < nPointCount ) - { - if ( ( rPoly.GetFlags( i ) == POLY_CONTROL ) - && ( ( i + 2 ) < nPointCount ) - && ( rPoly.GetFlags( i + 1 ) == POLY_CONTROL ) - && ( rPoly.GetFlags( i + 2 ) != POLY_CONTROL ) ) - { - ImplCurveTo( rPoly[ i ], rPoly[ i + 1 ], rPoly[ i + 2 ], PS_WRAP ); - i += 3; - } - else - ImplLineTo( rPoly.GetPoint( i++ ), PS_SPACE | PS_WRAP ); - } - } - - // #104645# explicitely close path if polygon is closed - if( rPoly[ 0 ] == rPoly[ nPointCount-1 ] ) - ImplClosePathDraw( PS_RET ); - else - ImplPathDraw(); - } - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplSetClipRegion( Region& rClipRegion ) -{ - if ( !rClipRegion.IsEmpty() ) - { - Rectangle aRect; - RegionHandle hRegionHandle = rClipRegion.BeginEnumRects(); - - while ( rClipRegion.GetNextEnumRect( hRegionHandle, aRect ) ) - { - double nX1 = aRect.Left(); - double nY1 = aRect.Top(); - double nX2 = aRect.Right(); - double nY2 = aRect.Bottom(); - ImplWriteDouble( nX1 ); - ImplWriteDouble( nY1 ); - ImplWriteByte( 'm' ); - ImplWriteDouble( nX2 ); - ImplWriteDouble( nY1 ); - ImplWriteByte( 'l' ); - ImplWriteDouble( nX2 ); - ImplWriteDouble( nY2 ); - ImplWriteByte( 'l' ); - ImplWriteDouble( nX1 ); - ImplWriteDouble( nY2 ); - ImplWriteByte( 'l' ); - ImplWriteDouble( nX1 ); - ImplWriteDouble( nY1 ); - ImplWriteByte( 'l', PS_SPACE | PS_WRAP ); - }; - rClipRegion.EndEnumRects( hRegionHandle ); - ImplWriteLine( "eoclip newpath" ); - } -} - -//--------------------------------------------------------------------------------- -// possible gfx formats: -// -// level 1: grayscale 8 bit -// color 24 bit -// -// level 2: grayscale 8 bit -// color 1(pal), 4(pal), 8(pal), 24 Bit -// - -void PSWriter::ImplBmp( Bitmap* pBitmap, Bitmap* pMaskBitmap, const Point & rPoint, double nXWidth, double nYHeightOrg ) -{ - if ( !pBitmap ) - return; - - INT32 nHeightOrg = pBitmap->GetSizePixel().Height(); - INT32 nHeightLeft = nHeightOrg; - long nWidth = pBitmap->GetSizePixel().Width(); - Point aSourcePos( rPoint ); - - while ( nHeightLeft ) - { - Bitmap aTileBitmap( *pBitmap ); - long nHeight = nHeightLeft; - double nYHeight = nYHeightOrg; - - BOOL bDoTrans = FALSE; - - Rectangle aRect; - Region aRegion; - - if ( pMaskBitmap ) - { - bDoTrans = TRUE; - while (TRUE) - { - if ( mnLevel == 1 ) - { - if ( nHeight > 10 ) - nHeight = 8; - } - aRect = Rectangle( Point( 0, nHeightOrg - nHeightLeft ), Size( (long)nWidth, (long)nHeight ) ); - aRegion = Region( pMaskBitmap->CreateRegion( COL_BLACK, aRect ) ); - - if ( ( mnLevel == 1 ) && ( aRegion.GetRectCount() * 5 > 1000 ) ) - { - nHeight >>= 1; - if ( nHeight < 2 ) - return; - continue; - } - break; - } - } - if ( nHeight != nHeightOrg ) - { - nYHeight = nYHeightOrg * nHeight / nHeightOrg; - aTileBitmap.Crop( Rectangle( Point( 0, nHeightOrg - nHeightLeft ), Size( nWidth, nHeight ) ) ); - } - if ( bDoTrans ) - { - ImplWriteLine( "gs\npum" ); - ImplTranslate( aSourcePos.X(), aSourcePos.Y() ); - ImplScale( nXWidth / nWidth, nYHeight / nHeight ); - RegionHandle hRegionHandle = aRegion.BeginEnumRects(); - - while ( aRegion.GetNextEnumRect( hRegionHandle, aRect ) ) - { - aRect.Move( 0, - ( nHeightOrg - nHeightLeft ) ); - ImplWriteLong( aRect.Left() ); - ImplWriteLong( aRect.Top() ); - ImplWriteByte( 'm' ); - ImplWriteLong( aRect.Right() + 1 ); - ImplWriteLong( aRect.Top() ); - ImplWriteByte( 'l' ); - ImplWriteLong( aRect.Right() + 1 ); - ImplWriteLong( aRect.Bottom() + 1 ); - ImplWriteByte( 'l' ); - ImplWriteLong( aRect.Left() ); - ImplWriteLong( aRect.Bottom() + 1 ); - ImplWriteByte( 'l' ); - ImplWriteByte( 'p', PS_SPACE | PS_WRAP ); - }; - aRegion.EndEnumRects( hRegionHandle ); - ImplWriteLine( "eoclip newpath" ); - ImplWriteLine( "pom" ); - } - BitmapReadAccess* pAcc = aTileBitmap.AcquireReadAccess(); - - if (!bDoTrans ) - ImplWriteLine( "pum" ); - - ImplTranslate( aSourcePos.X(), aSourcePos.Y() + nYHeight ); - ImplScale( nXWidth, nYHeight ); - if ( mnLevel == 1 ) // level 1 is always grayscale !!! - { - ImplWriteLong( nWidth ); - ImplWriteLong( nHeight ); - *mpPS << "8 ["; - ImplWriteLong( nWidth ); - *mpPS << "0 0 "; - ImplWriteLong( -nHeight ); - ImplWriteLong( 0 ); - ImplWriteLong( nHeight ); - ImplWriteLine( "]" ); - *mpPS << "{currentfile "; - ImplWriteLong( nWidth ); - ImplWriteLine( "string readhexstring pop}" ); - ImplWriteLine( "image" ); - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - ImplWriteHexByte( (BYTE)pAcc->GetPixel( y, x ) ); - } - } - *mpPS << (BYTE)10; - } - else // Level 2 - { - if ( mbGrayScale ) - { - ImplWriteLine( "/DeviceGray setcolorspace" ); - ImplWriteLine( "<<" ); - ImplWriteLine( "/ImageType 1" ); - *mpPS << "/Width "; - ImplWriteLong( nWidth, PS_RET ); - *mpPS << "/Height "; - ImplWriteLong( nHeight, PS_RET ); - ImplWriteLine( "/BitsPerComponent 8" ); - ImplWriteLine( "/Decode[0 1]" ); - *mpPS << "/ImageMatrix["; - ImplWriteLong( nWidth ); - *mpPS << "0 0 "; - ImplWriteLong( -nHeight ); - ImplWriteLong( 0 ); - ImplWriteLong( nHeight, PS_NONE ); - ImplWriteByte( ']', PS_RET ); - ImplWriteLine( "/DataSource currentfile" ); - ImplWriteLine( "/ASCIIHexDecode filter" ); - if ( mbCompression ) - ImplWriteLine( "/LZWDecode filter" ); - ImplWriteLine( ">>" ); - ImplWriteLine( "image" ); - if ( mbCompression ) - { - StartCompression(); - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - Compress( (BYTE)pAcc->GetPixel( y, x ) ); - } - } - EndCompression(); - } - else - { - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - ImplWriteHexByte( (BYTE)pAcc->GetPixel( y, x ) ); - } - } - } - } - else - { - // have we to write a palette ? - - if ( pAcc->HasPalette() ) - { - ImplWriteLine( "[/Indexed /DeviceRGB " ); - ImplWriteLong( pAcc->GetPaletteEntryCount() - 1, PS_RET ); - ImplWriteByte( '<', PS_NONE ); - for ( USHORT i = 0; i < pAcc->GetPaletteEntryCount(); i++ ) - { - BitmapColor aBitmapColor = pAcc->GetPaletteColor( i ); - ImplWriteHexByte( aBitmapColor.GetRed(), PS_NONE ); - ImplWriteHexByte( aBitmapColor.GetGreen(), PS_NONE ); - ImplWriteHexByte( aBitmapColor.GetBlue(), PS_SPACE | PS_WRAP ); - } - ImplWriteByte( '>', PS_RET ); - - ImplWriteLine( "] setcolorspace" ); - ImplWriteLine( "<<" ); - ImplWriteLine( "/ImageType 1" ); - *mpPS << "/Width "; - ImplWriteLong( nWidth, PS_RET ); - *mpPS << "/Height "; - ImplWriteLong( nHeight, PS_RET ); - ImplWriteLine( "/BitsPerComponent 8" ); - ImplWriteLine( "/Decode[0 255]" ); - *mpPS << "/ImageMatrix["; - ImplWriteLong( nWidth ); - *mpPS << "0 0 "; - ImplWriteLong( -nHeight ); - ImplWriteLong( 0); - ImplWriteLong( nHeight, PS_NONE ); - ImplWriteByte( ']', PS_RET ); - ImplWriteLine( "/DataSource currentfile" ); - ImplWriteLine( "/ASCIIHexDecode filter" ); - if ( mbCompression ) - ImplWriteLine( "/LZWDecode filter" ); - ImplWriteLine( ">>" ); - ImplWriteLine( "image" ); - if ( mbCompression ) - { - StartCompression(); - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - Compress( (BYTE)pAcc->GetPixel( y, x ) ); - } - } - EndCompression(); - } - else - { - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - ImplWriteHexByte( (BYTE)pAcc->GetPixel( y, x ) ); - } - } - } - } - else // 24 bit color - { - ImplWriteLine( "/DeviceRGB setcolorspace" ); - ImplWriteLine( "<<" ); - ImplWriteLine( "/ImageType 1" ); - *mpPS << "/Width "; - ImplWriteLong( nWidth, PS_RET ); - *mpPS << "/Height "; - ImplWriteLong( nHeight, PS_RET ); - ImplWriteLine( "/BitsPerComponent 8" ); - ImplWriteLine( "/Decode[0 1 0 1 0 1]" ); - *mpPS << "/ImageMatrix["; - ImplWriteLong( nWidth ); - *mpPS << "0 0 "; - ImplWriteLong( -nHeight ); - ImplWriteLong( 0 ); - ImplWriteLong( nHeight, PS_NONE ); - ImplWriteByte( ']', PS_RET ); - ImplWriteLine( "/DataSource currentfile" ); - ImplWriteLine( "/ASCIIHexDecode filter" ); - if ( mbCompression ) - ImplWriteLine( "/LZWDecode filter" ); - ImplWriteLine( ">>" ); - ImplWriteLine( "image" ); - if ( mbCompression ) - { - StartCompression(); - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - const BitmapColor aBitmapColor( pAcc->GetPixel( y, x ) ); - Compress( aBitmapColor.GetRed() ); - Compress( aBitmapColor.GetGreen() ); - Compress( aBitmapColor.GetBlue() ); - } - } - EndCompression(); - } - else - { - for ( long y = 0; y < nHeight; y++ ) - { - for ( long x = 0; x < nWidth; x++ ) - { - const BitmapColor aBitmapColor( pAcc->GetPixel( y, x ) ); - ImplWriteHexByte( aBitmapColor.GetRed() ); - ImplWriteHexByte( aBitmapColor.GetGreen() ); - ImplWriteHexByte( aBitmapColor.GetBlue() ); - } - } - } - } - } - ImplWriteLine( ">" ); // in Level 2 the dictionary needs to be closed (eod) - } - if ( bDoTrans ) - ImplWriteLine( "gr" ); - else - ImplWriteLine( "pom" ); - - aTileBitmap.ReleaseAccess( pAcc ); - nHeightLeft -= nHeight; - if ( nHeightLeft ) - { - nHeightLeft++; - aSourcePos.Y() = (long) ( rPoint.Y() + ( nYHeightOrg * ( nHeightOrg - nHeightLeft ) ) / nHeightOrg ); - } - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteCharacter( sal_Char nChar ) -{ - switch( nChar ) - { - case '(' : - case ')' : - case '\\' : - ImplWriteByte( (BYTE)'\\', PS_NONE ); - } - ImplWriteByte( (BYTE)nChar, PS_NONE ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteString( const ByteString& rString, VirtualDevice& rVDev, const INT32* pDXArry, BOOL bStretch ) -{ - USHORT nLen = rString.Len(); - if ( nLen ) - { - USHORT i; - if ( pDXArry ) - { - double nx = 0; - - for( i = 0; i < nLen; i++ ) - { - if ( i > 0 ) - nx = pDXArry[ i - 1 ]; - ImplWriteDouble( ( bStretch ) ? nx : rVDev.GetTextWidth( rString.GetChar( i ) ) ); - ImplWriteDouble( nx ); - ImplWriteLine( "(", PS_NONE ); - ImplWriteCharacter( rString.GetChar( i ) ); - ImplWriteLine( ") bs" ); - } - } - else - { - ImplWriteByte( '(', PS_NONE ); - for ( i = 0; i < nLen; i++ ) - ImplWriteCharacter( rString.GetChar( i ) ); - ImplWriteLine( ") sw" ); - } - } -} - -// ------------------------------------------------------------------------ - -void PSWriter::ImplText( const String& rUniString, const Point& rPos, const INT32* pDXArry, sal_Int32 nWidth, VirtualDevice& rVDev ) -{ - sal_uInt16 nLen = rUniString.Len(); - if ( !nLen ) - return; - if ( mnTextMode == 0 ) // using glpyh outlines - { - Font aNotRotatedFont( maFont ); - aNotRotatedFont.SetOrientation( 0 ); - - VirtualDevice aVirDev( 1 ); - aVirDev.SetMapMode( rVDev.GetMapMode() ); - aVirDev.SetFont( aNotRotatedFont ); - aVirDev.SetTextAlign( eTextAlign ); - - sal_Int16 nRotation = maFont.GetOrientation(); - Polygon aPolyDummy( 1 ); - - PolyPolygon aPolyPoly; - Point aPos( rPos ); - if ( nRotation ) - { - aPolyDummy.SetPoint( aPos, 0 ); - aPolyDummy.Rotate( rPos, nRotation ); - aPos = aPolyDummy.GetPoint( 0 ); - } - sal_Bool bOldLineColor = bLineColor; - bLineColor = sal_False; - std::vector<PolyPolygon> aPolyPolyVec; - if ( aVirDev.GetTextOutlines( aPolyPolyVec, rUniString, 0, 0, STRING_LEN, TRUE, nWidth, pDXArry ) ) - { - // always adjust text position to match baseline alignment - ImplWriteLine( "pum" ); - ImplWriteDouble( aPos.X() ); - ImplWriteDouble( aPos.Y() ); - ImplWriteLine( "t" ); - if ( nRotation ) - { - ImplWriteF( nRotation, 1 ); - *mpPS << "r "; - } - std::vector<PolyPolygon>::iterator aIter( aPolyPolyVec.begin() ); - while ( aIter != aPolyPolyVec.end() ) - ImplPolyPoly( *aIter++, sal_True ); - ImplWriteLine( "pom" ); - } - bLineColor = bOldLineColor; - } - else if ( ( mnTextMode == 1 ) || ( mnTextMode == 2 ) ) // normal text output - { - if ( mnTextMode == 2 ) // forcing output one complete text packet, by - pDXArry = NULL; // ignoring the kerning array - ImplSetAttrForText( rPos ); - ByteString aStr( rUniString, maFont.GetCharSet() ); - ImplWriteString( aStr, rVDev, pDXArry, nWidth != 0 ); - if ( maFont.GetOrientation() ) - ImplWriteLine( "gr" ); - } -} - -// ------------------------------------------------------------------------ - -void PSWriter::ImplSetAttrForText( const Point& rPoint ) -{ - Point aPoint( rPoint ); - - long nRotation = maFont.GetOrientation(); - ImplWriteTextColor(); - - Size aSize = maFont.GetSize(); - - if ( maLastFont != maFont ) - { - if ( maFont.GetPitch() == PITCH_FIXED ) // a little bit font selection - ImplDefineFont( "Courier", "Oblique" ); - else if ( maFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL ) - ImplWriteLine( "/Symbol findfont" ); - else if ( maFont.GetFamily() == FAMILY_SWISS ) - ImplDefineFont( "Helvetica", "Oblique" ); - else - ImplDefineFont( "Times", "Italic" ); - - maLastFont = maFont; - aSize = maFont.GetSize(); - ImplWriteDouble( aSize.Height() ); - *mpPS << "sf "; - } - if ( eTextAlign != ALIGN_BASELINE ) - { // PostScript kennt kein FontAlignment - if ( eTextAlign == ALIGN_TOP ) // -> ich gehe daher davon aus, dass - aPoint.Y() += ( aSize.Height() * 4 / 5 ); // der Bereich unter der Baseline - else if ( eTextAlign == ALIGN_BOTTOM ) // in etwa 20% der Fontsize ausmacht - aPoint.Y() -= ( aSize.Height() / 5 ); - } - ImplMoveTo( aPoint ); - if ( nRotation ) - { - *mpPS << "gs "; - ImplWriteF( nRotation, 1 ); - *mpPS << "r "; - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplDefineFont( const char* pOriginalName, const char* pItalic ) -{ - *mpPS << (BYTE)'/'; //convert the font pOriginalName using ISOLatin1Encoding - *mpPS << pOriginalName; - switch ( maFont.GetWeight() ) - { - case WEIGHT_SEMIBOLD : - case WEIGHT_BOLD : - case WEIGHT_ULTRABOLD : - case WEIGHT_BLACK : - *mpPS << "-Bold"; - if ( maFont.GetItalic() != ITALIC_NONE ) - *mpPS << pItalic; - break; - default: - if ( maFont.GetItalic() != ITALIC_NONE ) - *mpPS << pItalic; - break; - } - ImplWriteLine( " f" ); -} - -//--------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------- - -void PSWriter::ImplClosePathDraw( ULONG nMode ) -{ - *mpPS << "pc"; - mnCursorPos += 2; - ImplExecMode( nMode ); -} - -void PSWriter::ImplPathDraw() -{ - *mpPS << "ps"; - mnCursorPos += 2; - ImplExecMode( PS_RET ); -} - -//--------------------------------------------------------------------------------- - -inline void PSWriter::ImplWriteLineColor( ULONG nMode ) -{ - if ( aColor != aLineColor ) - { - aColor = aLineColor; - ImplWriteColor( nMode ); - } -} -inline void PSWriter::ImplWriteFillColor( ULONG nMode ) -{ - if ( aColor != aFillColor ) - { - aColor = aFillColor; - ImplWriteColor( nMode ); - } -} -inline void PSWriter::ImplWriteTextColor( ULONG nMode ) -{ - if ( aColor != aTextColor ) - { - aColor = aTextColor; - ImplWriteColor( nMode ); - } -} -inline void PSWriter::ImplWriteTextFillColor( ULONG nMode ) -{ - if ( aColor != aTextFillColor ) - { - aColor = aTextFillColor; - ImplWriteColor( nMode ); - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteColor( ULONG nMode ) -{ - if ( mbGrayScale ) - { - // writes the Color (grayscale) as a Number from 0.000 up to 1.000 - - ImplWriteF( 1000 * ( (BYTE)aColor.GetRed() * 77 + (BYTE)aColor.GetGreen() * 151 + - (BYTE)aColor.GetBlue() * 28 + 1 ) / 65536, 3, nMode ); - } - else - { - ImplWriteB1 ( (BYTE)aColor.GetRed() ); - ImplWriteB1 ( (BYTE)aColor.GetGreen() ); - ImplWriteB1 ( (BYTE)aColor.GetBlue() ); - } - *mpPS << "c"; // ( c is defined as setrgbcolor or setgray ) - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -double PSWriter::ImplGetScaling( const MapMode& rMapMode ) -{ - double nMul; - switch ( rMapMode.GetMapUnit() ) - { - case MAP_PIXEL : - case MAP_SYSFONT : - case MAP_APPFONT : - - case MAP_100TH_MM : - nMul = 1; - break; - case MAP_10TH_MM : - nMul = 10; - break; - case MAP_MM : - nMul = 100; - break; - case MAP_CM : - nMul = 1000; - break; - case MAP_1000TH_INCH : - nMul = 2.54; - break; - case MAP_100TH_INCH : - nMul = 25.4; - break; - case MAP_10TH_INCH : - nMul = 254; - break; - case MAP_INCH : - nMul = 2540; - break; - case MAP_TWIP : - nMul = 1.76388889; - break; - case MAP_POINT : - nMul = 35.27777778; - break; - default: - nMul = 1.0; - break; - } - return nMul; -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplGetMapMode( const MapMode& rMapMode ) -{ - ImplWriteLine( "tm setmatrix" ); - double fMul = ImplGetScaling( rMapMode ); - double fScaleX = (double)rMapMode.GetScaleX() * fMul; - double fScaleY = (double)rMapMode.GetScaleY() * fMul; - ImplTranslate( rMapMode.GetOrigin().X() * fScaleX, rMapMode.GetOrigin().Y() * fScaleY ); - ImplScale( fScaleX, fScaleY ); -} - -//--------------------------------------------------------------------------------- - -inline void PSWriter::ImplExecMode( ULONG nMode ) -{ - if ( nMode & PS_WRAP ) - { - if ( mnCursorPos >= PS_LINESIZE ) - { - mnCursorPos = 0; - *mpPS << (BYTE)0xa; - return; - } - } - if ( nMode & PS_SPACE ) - { - *mpPS << (BYTE)32; - mnCursorPos++; - } - if ( nMode & PS_RET ) - { - *mpPS << (BYTE)0xa; - mnCursorPos = 0; - } -} - -//--------------------------------------------------------------------------------- - -inline void PSWriter::ImplWriteLine( const char* pString, ULONG nMode ) -{ - ULONG i = 0; - while ( pString[ i ] ) - { - *mpPS << (BYTE)pString[ i++ ]; - } - mnCursorPos += i; - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteLineInfo( double fLWidth, double fMLimit, - SvtGraphicStroke::CapType eLCap, - SvtGraphicStroke::JoinType eJoin, - SvtGraphicStroke::DashArray& rLDash ) -{ - if ( fLineWidth != fLWidth ) - { - fLineWidth = fLWidth; - ImplWriteDouble( fLineWidth ); - ImplWriteLine( "lw", PS_SPACE ); - } - if ( eLineCap != eLCap ) - { - eLineCap = eLCap; - ImplWriteLong( (sal_Int32)eLineCap, PS_SPACE ); - ImplWriteLine( "lc", PS_SPACE ); - } - if ( eJoinType != eJoin ) - { - eJoinType = eJoin; - ImplWriteLong( (sal_Int32)eJoinType, PS_SPACE ); - ImplWriteLine( "lj", PS_SPACE ); - } - if ( eJoinType == SvtGraphicStroke::joinMiter ) - { - if ( fMiterLimit != fMLimit ) - { - fMiterLimit = fMLimit; - ImplWriteDouble( fMiterLimit ); - ImplWriteLine( "ml", PS_SPACE ); - } - } - if ( aDashArray != rLDash ) - { - aDashArray = rLDash; - sal_uInt32 j, i = aDashArray.size(); - ImplWriteLine( "[", PS_SPACE ); - for ( j = 0; j < i; j++ ) - ImplWriteDouble( aDashArray[ j ] ); - ImplWriteLine( "] 0 ld" ); - } -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteLineInfo( const LineInfo& rLineInfo ) -{ - SvtGraphicStroke::DashArray l_aDashArray; - if ( rLineInfo.GetStyle() == LINE_DASH ) - l_aDashArray.push_back( 2 ); - const double fLWidth(( ( rLineInfo.GetWidth() + 1 ) + ( rLineInfo.GetWidth() + 1 ) ) * 0.5); - SvtGraphicStroke::JoinType aJoinType(SvtGraphicStroke::joinMiter); - - switch(rLineInfo.GetLineJoin()) - { - default: // B2DLINEJOIN_NONE, B2DLINEJOIN_MIDDLE - // do NOT use SvtGraphicStroke::joinNone here - // since it will be written as numerical value directly - // and is NOT a valid EPS value - break; - case basegfx::B2DLINEJOIN_MITER: - aJoinType = SvtGraphicStroke::joinMiter; - break; - case basegfx::B2DLINEJOIN_BEVEL: - aJoinType = SvtGraphicStroke::joinBevel; - break; - case basegfx::B2DLINEJOIN_ROUND: - aJoinType = SvtGraphicStroke::joinRound; - break; - } - - ImplWriteLineInfo( fLWidth, fMiterLimit, SvtGraphicStroke::capButt, aJoinType, l_aDashArray ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteLong( sal_Int32 nNumber, ULONG nMode ) -{ - const ByteString aNumber( ByteString::CreateFromInt32( nNumber ) ); - ULONG nLen = aNumber.Len(); - mnCursorPos += nLen; - for ( USHORT n = 0; n < nLen; n++ ) - *mpPS << aNumber.GetChar( n ); - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteDouble( double fNumber, ULONG nMode ) -{ - sal_Int32 nLength; - - sal_Int32 nPTemp = (sal_Int32)fNumber; - sal_Int32 nATemp = labs( (sal_Int32)( ( fNumber - nPTemp ) * 100000 ) ); - - if ( !nPTemp && nATemp && ( fNumber < 0.0 ) ) - *mpPS << (sal_Char)'-'; - - ByteString aNumber1( ByteString::CreateFromInt32( nPTemp ) ); - nLength = aNumber1.Len(); - mnCursorPos += nLength; - for ( sal_Int32 n = 0; n < nLength; n++ ) - *mpPS << aNumber1.GetChar( (sal_uInt16)n ); - - int zCount = 0; - if ( nATemp ) - { - *mpPS << (BYTE)'.'; - mnCursorPos++; - const ByteString aNumber2( ByteString::CreateFromInt32( nATemp ) ); - - sal_Int16 n, nLen = aNumber2.Len(); - if ( nLen < 8 ) - { - mnCursorPos += 6 - nLen; - for ( n = 0; n < ( 5 - nLen ); n++ ) - { - *mpPS << (BYTE)'0'; - } - } - mnCursorPos += nLen; - for ( n = 0; n < nLen; n++ ) - { - *mpPS << aNumber2.GetChar( n ); - zCount--; - if ( aNumber2.GetChar( n ) != '0' ) - zCount = 0; - } - if ( zCount ) - mpPS->SeekRel( zCount ); - } - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -// writes the number to stream: nNumber / ( 10^nCount ) - -void PSWriter::ImplWriteF( sal_Int32 nNumber, ULONG nCount, ULONG nMode ) -{ - if ( nNumber < 0 ) - { - *mpPS << (BYTE)'-'; - nNumber = -nNumber; - mnCursorPos++; - } - const ByteString aScaleFactor( ByteString::CreateFromInt32( nNumber ) ); - ULONG nLen = aScaleFactor.Len(); - long nStSize = ( nCount + 1 ) - nLen; - if ( nStSize >= 1 ) - { - *mpPS << (BYTE)'0'; - mnCursorPos++; - } - if ( nStSize >= 2 ) - { - *mpPS << (BYTE)'.'; - for ( long i = 1; i < nStSize; i++ ) - { - *mpPS << (BYTE)'0'; - mnCursorPos++; - } - } - mnCursorPos += nLen; - for( USHORT n = 0UL; n < nLen; n++ ) - { - if ( n == nLen - nCount ) - { - *mpPS << (BYTE)'.'; - mnCursorPos++; - } - *mpPS << aScaleFactor.GetChar( n ); - } - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteByte( BYTE nNumb, ULONG nMode ) -{ - *mpPS << ( nNumb ); - mnCursorPos++; - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -void PSWriter::ImplWriteHexByte( BYTE nNumb, ULONG nMode ) -{ - if ( ( nNumb >> 4 ) > 9 ) - *mpPS << (BYTE)( ( nNumb >> 4 ) + 'A' - 10 ); - else - *mpPS << (BYTE)( ( nNumb >> 4 ) + '0' ); - - if ( ( nNumb & 0xf ) > 9 ) - *mpPS << (BYTE)( ( nNumb & 0xf ) + 'A' - 10 ); - else - *mpPS << (BYTE)( ( nNumb & 0xf ) + '0' ); - mnCursorPos += 2; - ImplExecMode( nMode ); -} - -//--------------------------------------------------------------------------------- - -// writes the BYTE nNumb as a Number from 0.000 up to 1.000 - -void PSWriter::ImplWriteB1( BYTE nNumb, ULONG nMode ) -{ - ImplWriteF( 1000 * ( nNumb + 1 ) / 256 , 3, nMode ); -} - - -// ------------------------------------------------------------------------ - -inline void PSWriter::WriteBits( USHORT nCode, USHORT nCodeLen ) -{ - dwShift |= ( nCode << ( nOffset - nCodeLen ) ); - nOffset -= nCodeLen; - while ( nOffset < 24 ) - { - ImplWriteHexByte( (BYTE)( dwShift >> 24 ) ); - dwShift <<= 8; - nOffset += 8; - } - if ( nCode == 257 && nOffset != 32 ) - ImplWriteHexByte( (BYTE)( dwShift >> 24 ) ); -} - -// ------------------------------------------------------------------------ - -void PSWriter::StartCompression() -{ - USHORT i; - nDataSize = 8; - - nClearCode = 1 << nDataSize; - nEOICode = nClearCode + 1; - nTableSize = nEOICode + 1; - nCodeSize = nDataSize + 1; - - nOffset = 32; // anzahl freier bits in dwShift - dwShift = 0; - - pTable = new PSLZWCTreeNode[ 4096 ]; - - for ( i = 0; i < 4096; i++ ) - { - pTable[ i ].pBrother = pTable[ i ].pFirstChild = NULL; - pTable[ i ].nValue = (BYTE)( pTable[ i ].nCode = i ); - } - pPrefix = NULL; - WriteBits( nClearCode, nCodeSize ); -} - -// ------------------------------------------------------------------------ - -void PSWriter::Compress( BYTE nCompThis ) -{ - PSLZWCTreeNode* p; - USHORT i; - BYTE nV; - - if( !pPrefix ) - { - pPrefix = pTable + nCompThis; - } - else - { - nV = nCompThis; - for( p = pPrefix->pFirstChild; p != NULL; p = p->pBrother ) - { - if ( p->nValue == nV ) - break; - } - - if( p ) - pPrefix = p; - else - { - WriteBits( pPrefix->nCode, nCodeSize ); - - if ( nTableSize == 409 ) - { - WriteBits( nClearCode, nCodeSize ); - - for ( i = 0; i < nClearCode; i++ ) - pTable[ i ].pFirstChild = NULL; - - nCodeSize = nDataSize + 1; - nTableSize = nEOICode + 1; - } - else - { - if( nTableSize == (USHORT)( ( 1 << nCodeSize ) - 1 ) ) - nCodeSize++; - - p = pTable + ( nTableSize++ ); - p->pBrother = pPrefix->pFirstChild; - pPrefix->pFirstChild = p; - p->nValue = nV; - p->pFirstChild = NULL; - } - - pPrefix = pTable + nV; - } - } -} - -// ------------------------------------------------------------------------ - -void PSWriter::EndCompression() -{ - if( pPrefix ) - WriteBits( pPrefix->nCode, nCodeSize ); - - WriteBits( nEOICode, nCodeSize ); - delete[] pTable; -} - -// ------------------------------------------------------------------------ - -BYTE* PSWriter::ImplSearchEntry( BYTE* pSource, BYTE* pDest, ULONG nComp, ULONG nSize ) -{ - while ( nComp-- >= nSize ) - { - ULONG i; - for ( i = 0; i < nSize; i++ ) - { - if ( ( pSource[i]&~0x20 ) != ( pDest[i]&~0x20 ) ) - break; - } - if ( i == nSize ) - return pSource; - pSource++; - } - return NULL; -} - -// ------------------------------------------------------------------------ - -BOOL PSWriter::ImplGetBoundingBox( double* nNumb, BYTE* pSource, ULONG nSize ) -{ - BOOL bRetValue = FALSE; - ULONG nBytesRead; - - if ( nSize < 256 ) // we assume that the file is greater than 256 bytes - return FALSE; - - if ( nSize < POSTSCRIPT_BOUNDINGSEARCH ) - nBytesRead = nSize; - else - nBytesRead = POSTSCRIPT_BOUNDINGSEARCH; - - BYTE* pDest = ImplSearchEntry( pSource, (BYTE*)"%%BoundingBox:", nBytesRead, 14 ); - if ( pDest ) - { - int nSecurityCount = 100; // only 100 bytes following the bounding box will be checked - nNumb[0] = nNumb[1] = nNumb[2] = nNumb[3] = 0; - pDest += 14; - for ( int i = 0; ( i < 4 ) && nSecurityCount; i++ ) - { - int nDivision = 1; - BOOL bDivision = FALSE; - BOOL bNegative = FALSE; - BOOL bValid = TRUE; - - while ( ( --nSecurityCount ) && ( ( *pDest == ' ' ) || ( *pDest == 0x9 ) ) ) - pDest++; - BYTE nByte = *pDest; - while ( nSecurityCount && ( nByte != ' ' ) && ( nByte != 0x9 ) && ( nByte != 0xd ) && ( nByte != 0xa ) ) - { - switch ( nByte ) - { - case '.' : - if ( bDivision ) - bValid = FALSE; - else - bDivision = TRUE; - break; - case '-' : - bNegative = TRUE; - break; - default : - if ( ( nByte < '0' ) || ( nByte > '9' ) ) - nSecurityCount = 1; // error parsing the bounding box values - else if ( bValid ) - { - if ( bDivision ) - nDivision*=10; - nNumb[i] *= 10; - nNumb[i] += nByte - '0'; - } - break; - } - nSecurityCount--; - nByte = *(++pDest); - } - if ( bNegative ) - nNumb[i] = -nNumb[i]; - if ( bDivision && ( nDivision != 1 ) ) - nNumb[i] /= nDivision; - } - if ( nSecurityCount) - bRetValue = TRUE; - } - return bRetValue; -} - -//================== GraphicExport - die exportierte Funktion ================ - -extern "C" BOOL __LOADONCALLAPI GraphicExport( SvStream & rStream, Graphic & rGraphic, FilterConfigItem* pFilterConfigItem, BOOL) -{ - PSWriter aPSWriter; - return aPSWriter.WritePS( rGraphic, rStream, pFilterConfigItem ); -} - -//--------------------------------------------------------------------------------- - -extern "C" BOOL __LOADONCALLAPI DoExportDialog( FltCallDialogParameter& rPara ) -{ - BOOL bRet = FALSE; - - if ( rPara.pWindow ) - { - ByteString aResMgrName( "eps" ); - ResMgr* pResMgr; - - pResMgr = ResMgr::CreateResMgr( aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() ); - - if( pResMgr ) - { - rPara.pResMgr = pResMgr; - bRet = ( DlgExportEPS( rPara ).Execute() == RET_OK ); - delete pResMgr; - } - else - bRet = TRUE; - } - - return bRet; -} - -//================== ein bischen Muell fuer Windows ========================== -#ifndef GCC -#endif - -#ifdef WIN - -static HINSTANCE hDLLInst = 0; // HANDLE der DLL - -extern "C" int CALLBACK LibMain( HINSTANCE hDLL, WORD, WORD nHeap, LPSTR ) -{ -#ifndef WNT - if ( nHeap ) - UnlockData( 0 ); -#endif - - hDLLInst = hDLL; - - return TRUE; -} - -extern "C" int CALLBACK WEP( int ) -{ - return 1; -} - -#endif |