diff options
Diffstat (limited to 'goodies/source/filter.vcl/epict/epict.cxx')
-rw-r--r-- | goodies/source/filter.vcl/epict/epict.cxx | 2390 |
1 files changed, 0 insertions, 2390 deletions
diff --git a/goodies/source/filter.vcl/epict/epict.cxx b/goodies/source/filter.vcl/epict/epict.cxx deleted file mode 100644 index cd9e33edd5d9..000000000000 --- a/goodies/source/filter.vcl/epict/epict.cxx +++ /dev/null @@ -1,2390 +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: epict.cxx,v $ - * $Revision: 1.23 $ - * - * 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/metaact.hxx> -#include <svtools/filter.hxx> -#include <svl/solar.hrc> -#include <svtools/fltcall.hxx> - -#include <math.h> -#include <vcl/bmpacc.hxx> -#include <vcl/metaact.hxx> -#include <vcl/graph.hxx> -#include <vcl/bmpacc.hxx> -#include <vcl/gradient.hxx> -#include <vcl/hatch.hxx> -#include <vcl/metric.hxx> -#include <vcl/font.hxx> -#include <vcl/virdev.hxx> -#include <vcl/svapp.hxx> -#include <vcl/msgbox.hxx> -#include <vcl/gdimtf.hxx> - -#include <tools/bigint.hxx> -#include "strings.hrc" -#include "dlgepct.hrc" -#include "dlgepct.hxx" - -#include <basegfx/polygon/b2dpolygon.hxx> -#include <basegfx/polygon/b2dpolypolygon.hxx> - -//============================== PictWriter =================================== - -struct PictWriterAttrStackMember { - struct PictWriterAttrStackMember * pSucc; - Color aLineColor; - Color aFillColor; - RasterOp eRasterOp; - Font aFont; - MapMode aMapMode; - Rectangle aClipRect; -}; - - -enum PictDrawingMethod { - PDM_FRAME, PDM_PAINT, PDM_ERASE, PDM_INVERT, PDM_FILL -}; - - -struct PictPattern { - sal_uInt32 nLo, nHi; -}; - -class PictWriter { - -private: - - BOOL bStatus; - ULONG nLastPercent; // Mit welcher Zahl pCallback zuletzt aufgerufen wurde. - com::sun::star::uno::Reference< com::sun::star::task::XStatusIndicator > xStatusIndicator; - - SvStream * pPict; - - // Aktuelle Attribute im Quell-Metafile: - Color aLineColor; - Color aFillColor; - RasterOp eSrcRasterOp; - Font aSrcFont; - MapMode aSrcMapMode; - MapMode aTargetMapMode; - Rectangle aClipRect; - PictWriterAttrStackMember * pAttrStack; - - // Aktuelle Attribute im Ziel-Metafile, und ob sie gueltig sind - BOOL bDstBkPatVisible; BOOL bDstBkPatValid; - BYTE nDstTxFace; BOOL bDstTxFaceValid; - RasterOp eDstTxMode; BOOL bDstTxModeValid; - USHORT nDstPnSize; BOOL bDstPnSizeValid; - RasterOp eDstPnMode; BOOL bDstPnModeValid; - PictPattern aDstPnPat; BOOL bDstPnPatValid; - BOOL bDstFillPatVisible; BOOL bDstFillPatValid; - USHORT nDstTxSize; BOOL bDstTxSizeValid; - Color aDstFgCol; BOOL bDstFgColValid; - Color aDstBkCol; BOOL bDstBkColValid; - Point aDstPenPosition; BOOL bDstPenPositionValid; - Point aDstTextPosition; BOOL bDstTextPositionValid; - String aDstFontName; USHORT nDstFontNameId; BOOL bDstFontNameValid; - - ULONG nNumberOfActions; // Anzahl der Actions im GDIMetafile - ULONG nNumberOfBitmaps; // Anzahl der Bitmaps - ULONG nWrittenActions; // Anzahl der bereits verarbeiteten Actions beim Schreiben der Opcodes - ULONG nWrittenBitmaps; // Anzahl der bereits geschriebenen Bitmaps - ULONG nActBitmapPercent; // Wieviel Prozent die naechste Bitmap schon geschrieben ist. - - void MayCallback(); - // Berechnet anhand der obigen 5 Parameter eine Prozentzahl - // und macht dann ggf. einen Callback. Setzt bStatus auf FALSE wenn User abbrechen - // moechte. - - void CountActionsAndBitmaps(const GDIMetaFile & rMTF); - // Zaehlt die Bitmaps und Actions (nNumberOfActions und nNumberOfBitmaps muessen - // zu Anfang auf 0 gesetzt werden, weil diese Methode rekursiv ist) - - Polygon PolyPolygonToPolygon(const PolyPolygon & rPoly); - // Macht aus einem PolyPolygon ein halbwegs vernuenftiges Polygon - - Rectangle MapRectangle( const Rectangle& rRect ); - void WritePoint(const Point & rPoint); - void WriteSize(const Size & rSize); - void WriteRGBColor(const Color & rColor); - void WriteString( const String & rString ); - void WriteRectangle(const Rectangle & rRect); - void WritePolygon(const Polygon & rPoly); - void WriteArcAngles(const Rectangle & rRect, const Point & rStartPt, const Point & rEndPt); - - void ConvertLinePattern(PictPattern & rPat, BOOL bVisible); - void ConvertFillPattern(PictPattern & rPat, BOOL bVisible); - - void WriteOpcode_TxFace(const Font & rFont); - void WriteOpcode_TxMode(RasterOp eMode); - void WriteOpcode_PnSize(USHORT nSize); - void WriteOpcode_PnMode(RasterOp eMode); - void WriteOpcode_PnLinePat(BOOL bVisible); - void WriteOpcode_PnFillPat(BOOL bVisible); - void WriteOpcode_OvSize(const Size & rSize); - void WriteOpcode_TxSize(USHORT nSize); - void WriteOpcode_RGBFgCol(const Color & rColor); - void WriteOpcode_RGBBkCol(const Color & rColor); - void WriteOpcode_Line(const Point & rLocPt, const Point & rNewPt); - void WriteOpcode_LineFrom(const Point & rNewPt); - void WriteOpcode_Text(const Point & rPoint, const String& rString, BOOL bDelta); - void WriteOpcode_FontName(const Font & rFont); - void WriteOpcode_ClipRect( const Rectangle& rRect ); - void WriteOpcode_Rect(PictDrawingMethod eMethod, const Rectangle & rRect); - void WriteOpcode_SameRect(PictDrawingMethod eMethod); - void WriteOpcode_RRect(PictDrawingMethod eMethod, const Rectangle & rRect); - void WriteOpcode_SameRRect(PictDrawingMethod eMethod); - void WriteOpcode_Oval(PictDrawingMethod eMethod, const Rectangle & rRect); - void WriteOpcode_SameOval(PictDrawingMethod eMethod); - void WriteOpcode_Arc(PictDrawingMethod eMethod, const Rectangle & rRect, - const Point & rStartPt, const Point & rEndPt); - void WriteOpcode_SameArc(PictDrawingMethod eMethod, const Rectangle & rRect, - const Point & rStartPt, const Point & rEndPt); - void WriteOpcode_Poly(PictDrawingMethod eMethod, const Polygon & rPoly); - void WriteOpcode_BitsRect(const Point & rPoint, const Size & rSize, const Bitmap & rBitmap); - void WriteOpcode_EndOfFile(); - - void SetAttrForPaint(); - void SetAttrForFrame(); - void SetAttrForText(); - - void WriteTextArray(Point & rPoint, const String& rString, const sal_Int32 * pDXAry); - - void HandleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon); - void WriteOpcodes(const GDIMetaFile & rMTF); - - void WriteHeader(const GDIMetaFile & rMTF); - void UpdateHeader(); - -public: - - BOOL WritePict( const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pFilterConfigItem ); -}; - - -//========================== Methoden von PictWriter ========================== - - -void PictWriter::MayCallback() -{ - if ( xStatusIndicator.is() ) - { - ULONG nPercent; - nPercent=((nWrittenBitmaps<<14)+(nActBitmapPercent<<14)/100+nWrittenActions) - *100 - /((nNumberOfBitmaps<<14)+nNumberOfActions); - - if (nPercent>=nLastPercent+3) - { - nLastPercent=nPercent; - if( nPercent<=100 ) - xStatusIndicator->setValue( nPercent ); - } - } -} - -void PictWriter::CountActionsAndBitmaps(const GDIMetaFile & rMTF) -{ - ULONG nAction, nActionCount; - const MetaAction* pMA; - - nActionCount = rMTF.GetActionCount(); - - for (nAction=0; nAction<nActionCount; nAction++) - { - pMA = rMTF.GetAction( nAction ); - - switch( pMA->GetType() ) - { - case META_BMP_ACTION: - case META_BMPSCALE_ACTION: - case META_BMPSCALEPART_ACTION: - case META_BMPEX_ACTION: - case META_BMPEXSCALE_ACTION: - case META_BMPEXSCALEPART_ACTION: - nNumberOfBitmaps++; - break; - } - - nNumberOfActions++; - } -} - - -Polygon PictWriter::PolyPolygonToPolygon(const PolyPolygon & rPolyPoly) -{ - USHORT nCount,nSize1,nSize2,np,i1,i2,i3,nBestIdx1,nBestIdx2; - long nDistSqr,nBestDistSqr, nCountdownTests; - Point aP1,aPRel; - Polygon aPoly1, aPoly2, aPoly3; - - nCount=rPolyPoly.Count(); - if (nCount==0) return Polygon(0); - - aPoly1=rPolyPoly.GetObject(0); - for (np=1; np<nCount; np++) { - aPoly2=rPolyPoly.GetObject(np); - - //-----------------Folgendes verschmilzt aPoly1 und aPoly2 zu aPoly1----------------- - - nSize1=aPoly1.GetSize(); - nSize2=aPoly2.GetSize(); - - // Zunaechst werden ein Punkt in aPoly1 (referenziert durch nBestIdx1) und ein - // Punkt in aPoly2 (referenziert durch nBestIdx2) gesucht, die moeglichst dicht - // beieinander liegen. Da dies mit quadratischem Aufwand einher geht, und somit - // manche Bilder Ewigkeiten benoetigen, um exportiert zu werden, begrenzen wir - // die Anzahl der Tests auf 1000, und brechen die Suche ggf. schon vorher ab. - // Dadruch wird das Ergebnis nicht falsch, sondern eventuell nicht so schoen. - nCountdownTests=1000; - nBestDistSqr=0x7fffffff; - nBestIdx1=0; - nBestIdx2=0; - for (i1=0; i1<nSize1; i1++) { - aP1=aPoly1.GetPoint(i1); - for (i2=0; i2<nSize2; i2++) { - aPRel=aPoly2.GetPoint(i2); aPRel-=aP1; - nDistSqr=aPRel.X()*aPRel.X()+aPRel.Y()*aPRel.Y(); - if (nDistSqr<nBestDistSqr) { - nBestIdx1=i1; - nBestIdx2=i2; - nBestDistSqr=nDistSqr; - } - if (nCountdownTests<=0) break; - nCountdownTests--; - } - if (nCountdownTests<=0) break; - } - - // Nun werden aPoly1 und aPoly2 zu einem Polygon aPoly3 (spaeter aPoly1) zusammengefuegt. - // Die beiden Polygone werden verbunden durch zwei zusaetzliche Kanten zwischen den oben - // gefundenen Punkten. - aPoly3.Clear(); - aPoly3.SetSize(nSize1+nSize2+2); - i3=0; - for (i1=nBestIdx1; i1<nSize1; i1++) aPoly3.SetPoint(aPoly1.GetPoint(i1),i3++); - for (i1=0; i1<=nBestIdx1; i1++) aPoly3.SetPoint(aPoly1.GetPoint(i1),i3++); - for (i2=nBestIdx2; i2<nSize2; i2++) aPoly3.SetPoint(aPoly2.GetPoint(i2),i3++); - for (i2=0; i2<=nBestIdx2; i2++) aPoly3.SetPoint(aPoly2.GetPoint(i2),i3++); - - aPoly1=aPoly3; - - //----------------------------------------------------------------------------------- - - } - return aPoly1; -} - - -void PictWriter::WritePoint(const Point & rPoint) -{ - Point aPoint = OutputDevice::LogicToLogic( rPoint, aSrcMapMode, aTargetMapMode ); - *pPict << ((short)aPoint.Y()) << ((short)aPoint.X()); -} - - -void PictWriter::WriteSize(const Size & rSize) -{ - OutputDevice::LogicToLogic( rSize, aSrcMapMode, aTargetMapMode ); // -Wall is this needed. - *pPict << ((short)rSize.Height()) << ((short)rSize.Width()); -} - - -void PictWriter::WriteRGBColor(const Color & rColor) -{ - const UINT16 nR = ( (UINT16) rColor.GetRed() << 8 ) | (UINT16) rColor.GetRed(); - const UINT16 nG = ( (UINT16) rColor.GetGreen() << 8 ) | (UINT16) rColor.GetGreen(); - const UINT16 nB = ( (UINT16) rColor.GetBlue() << 8 ) | (UINT16) rColor.GetBlue(); - - *pPict << nR << nG << nB; -} - - -void PictWriter::WriteString( const String & rString ) -{ - USHORT i,nLen; - - ByteString aByteString( rString, gsl_getSystemTextEncoding() ); - nLen = aByteString.Len(); - if ( nLen > 255 ) - nLen = 255; - *pPict << ( (BYTE)nLen ); - for ( i = 0; i < nLen; i++ ) - *pPict << aByteString.GetChar( i ); -} - -Rectangle PictWriter::MapRectangle( const Rectangle& rRect ) -{ - Point aPoint = OutputDevice::LogicToLogic( rRect.TopLeft(), aSrcMapMode, aTargetMapMode ); - Size aSize = OutputDevice::LogicToLogic( rRect.GetSize(), aSrcMapMode, aTargetMapMode ); - Rectangle aRect( aPoint, aSize ); - aRect.Justify(); - aRect.nBottom++; - aRect.nRight++; - return aRect; -} - -void PictWriter::WriteRectangle(const Rectangle & rRect) -{ - Rectangle aRect( MapRectangle( rRect ) ); - *pPict << (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left() - << (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right(); -} - -void PictWriter::WritePolygon(const Polygon & rPoly) -{ - USHORT nDataSize,i,nSize; - short nMinX = 0, nMinY = 0, nMaxX = 0, nMaxY = 0; - short nx,ny; - Polygon aPoly(rPoly); - - nSize=aPoly.GetSize(); - - if (aPoly.GetPoint(0) != aPoly.GetPoint(nSize-1)) - { - nSize++; - aPoly.SetSize(nSize); - aPoly.SetPoint(aPoly.GetPoint(0),nSize-1); - } - - nDataSize=nSize*4+10; - for (i=0; i<nSize; i++) - { - Point aPoint = OutputDevice::LogicToLogic( aPoly.GetPoint( i ), - aSrcMapMode, - aTargetMapMode ); - - nx = (short) aPoint.X(); - ny = (short) aPoint.Y(); - - if ( i==0 || nMinX>nx ) - nMinX=nx; - if ( i==0 || nMinY>ny ) - nMinY=ny; - if ( i==0 || nMaxX<nx ) - nMaxX=nx; - if ( i==0 || nMaxY<ny ) - nMaxY=ny; - } - - *pPict << nDataSize << nMinY << nMinX << nMaxY << nMaxX; - - for (i=0; i<nSize; i++) - WritePoint( aPoly.GetPoint(i) ); -} - - -void PictWriter::WriteArcAngles(const Rectangle & rRect, const Point & rStartPt, const Point & rEndPt) -{ - Point aStartPt = OutputDevice::LogicToLogic( rStartPt, - aSrcMapMode, - aTargetMapMode ); - Point aEndPt = OutputDevice::LogicToLogic( rEndPt, - aSrcMapMode, - aTargetMapMode ); - Rectangle aRect( OutputDevice::LogicToLogic( rRect.TopLeft(), - aSrcMapMode, - aTargetMapMode ), - OutputDevice::LogicToLogic( rRect.GetSize(), - aSrcMapMode, - aTargetMapMode ) ); - Point aCenter; - double fAngS, fAngE, fdx, fdy; - short nStartAngle, nArcAngle; - - - aCenter=Point( ( aRect.Left() + aRect.Right() ) >> 1, - ( aRect.Top() + aRect.Bottom() ) >> 1 ); - - fdx=(double)(aStartPt.X()-aCenter.X()); - fdy=(double)(aStartPt.Y()-aCenter.Y()); - if ( fdx==0.0 && fdy==0.0 ) - fdx=1.0; - fAngE=atan2(fdx,-fdy); - - fdx=(double)(aEndPt.X()-aCenter.X()); - fdy=(double)(aEndPt.Y()-aCenter.Y()); - if ( fdx==0.0 && fdy==0.0 ) - fdx=1.0; - fAngS=atan2(fdx,-fdy); - - nStartAngle=(short)(fAngS*180.0/3.14159265359); - nArcAngle=((short)(fAngE*180.0/3.14159265359))-nStartAngle; - if (nArcAngle<0) - nArcAngle += 360; - *pPict << nStartAngle << nArcAngle; -} - - -void PictWriter::ConvertLinePattern(PictPattern & rPat, BOOL bVisible) -{ - if( bVisible ) - { - rPat.nHi=0xffffffff; - rPat.nLo=0xffffffff; - } - else - { - rPat.nHi=0x00000000; - rPat.nLo=0x00000000; - } -} - -void PictWriter::ConvertFillPattern(PictPattern & rPat, BOOL bVisible) -{ - if( bVisible ) - { - rPat.nHi=0xffffffff; - rPat.nLo=0xffffffff; - } - else - { - rPat.nHi=0x00000000; - rPat.nLo=0x00000000; - } -} - - -void PictWriter::WriteOpcode_TxFace(const Font & rFont) -{ - BYTE nFace; - FontWeight eWeight; - - nFace=0; - eWeight=rFont.GetWeight(); - if (eWeight==WEIGHT_BOLD || - eWeight==WEIGHT_SEMIBOLD || - eWeight==WEIGHT_ULTRABOLD || - eWeight==WEIGHT_BLACK) nFace|=0x01; - if (rFont.GetItalic()!=ITALIC_NONE) nFace|=0x02; - if (rFont.GetUnderline()!=UNDERLINE_NONE) nFace|=0x04; - if (rFont.IsOutline()==TRUE) nFace|=0x08; - if (rFont.IsShadow()==TRUE) nFace|=0x10; - - if (bDstTxFaceValid==FALSE || nDstTxFace!=nFace) { - *pPict << (USHORT)0x0004 << nFace << (BYTE)0; - nDstTxFace=nFace; - bDstTxFaceValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_TxMode(RasterOp eMode) -{ - USHORT nVal; - - if (bDstTxModeValid==FALSE || eDstTxMode!=eMode) { - switch (eMode) { - case ROP_INVERT: nVal=0x000c; break; - case ROP_XOR: nVal=0x000a; break; - default: nVal=0x0008; - } - *pPict << (USHORT)0x0005 << nVal; - eDstTxMode=eMode; - bDstTxModeValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_PnSize(USHORT nSize) -{ - if (nSize==0) nSize=1; - if (bDstPnSizeValid==FALSE || nDstPnSize!=nSize) { - *pPict << (USHORT)0x0007 << nSize << nSize; - nDstPnSize=nSize; - bDstPnSizeValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_PnMode(RasterOp eMode) -{ - USHORT nVal; - - if (bDstPnModeValid==FALSE || eDstPnMode!=eMode) { - switch (eMode) - { - case ROP_INVERT: nVal=0x000c; break; - case ROP_XOR: nVal=0x000a; break; - default: nVal=0x0008; - } - *pPict << (USHORT)0x0008 << nVal; - eDstPnMode=eMode; - bDstPnModeValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_PnLinePat(BOOL bVisible) -{ - PictPattern aPat; - - ConvertLinePattern(aPat,bVisible); - if (bDstPnPatValid==FALSE || aDstPnPat.nHi!=aPat.nHi || aDstPnPat.nLo!=aPat.nLo) { - *pPict << (USHORT)0x0009 << aPat.nHi << aPat.nLo; - aDstPnPat=aPat; - bDstPnPatValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_PnFillPat(BOOL bVisible) -{ - PictPattern aPat; - - ConvertFillPattern(aPat,bVisible); - if (bDstPnPatValid==FALSE || aDstPnPat.nHi!=aPat.nHi || aDstPnPat.nLo!=aPat.nLo) { - *pPict << (USHORT)0x0009 << aPat.nHi << aPat.nLo; - aDstPnPat=aPat; - bDstPnPatValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_OvSize(const Size & rSize) -{ - *pPict << (USHORT)0x000b; - WriteSize(rSize); -} - - -void PictWriter::WriteOpcode_TxSize(USHORT nSize) -{ - if (bDstTxSizeValid==FALSE || nDstTxSize!=nSize) { - - nDstTxSize = (USHORT) OutputDevice::LogicToLogic( Size( 0, nSize ), - aSrcMapMode, aTargetMapMode ).Height(); - - *pPict << (USHORT)0x000d << nDstTxSize; - bDstTxSizeValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_RGBFgCol(const Color & rColor) -{ - if (bDstFgColValid==FALSE || aDstFgCol!=rColor) { - *pPict << (USHORT)0x001a; - WriteRGBColor(rColor); - aDstFgCol=rColor; - bDstFgColValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_RGBBkCol(const Color & rColor) -{ - if (bDstBkColValid==FALSE || aDstBkCol!=rColor) { - *pPict << (USHORT)0x001b; - WriteRGBColor(rColor); - aDstBkCol=rColor; - bDstBkColValid=TRUE; - } -} - - -void PictWriter::WriteOpcode_Line(const Point & rLocPt, const Point & rNewPt) -{ - Point aLocPt = OutputDevice::LogicToLogic( rLocPt, - aSrcMapMode, - aTargetMapMode ); - Point aNewPt = OutputDevice::LogicToLogic( rNewPt, - aSrcMapMode, - aTargetMapMode ); - long dh,dv; - - dh=aNewPt.X()-aLocPt.X(); - dv=aNewPt.Y()-aLocPt.Y(); - if (dh<=127 && dh>=-128 && dv<=127 && dv>=-128) - { // ShortLine - *pPict << (USHORT)0x0022; - WritePoint(rLocPt); - *pPict << (char)dh << (char)dv; - } - else - { - *pPict << (USHORT)0x0020; - WritePoint(rLocPt); - WritePoint(rNewPt); - } - aDstPenPosition=rNewPt; - bDstPenPositionValid=TRUE; -} - - -void PictWriter::WriteOpcode_LineFrom(const Point & rNewPt) -{ - Point aNewPt = OutputDevice::LogicToLogic( rNewPt, - aSrcMapMode, - aTargetMapMode ); - long dh,dv; - - dh = aNewPt.X()-aDstPenPosition.X(); - dv = aNewPt.Y()-aDstPenPosition.Y(); - - if (dh<=127 && dh>=-128 && dv<=127 && dv>=-128) - { // ShortLine - *pPict << (USHORT)0x0023; - *pPict << (char)dh << (char)dv; - } - else - { - *pPict << (USHORT)0x0021; - WritePoint(rNewPt); - } - aDstPenPosition=rNewPt; - bDstPenPositionValid=TRUE; -} - - -void PictWriter::WriteOpcode_Text(const Point & rPoint, const String& rString, BOOL bDelta) -{ - Point aPoint = OutputDevice::LogicToLogic( rPoint, - aSrcMapMode, - aTargetMapMode ); - long dh,dv; - ULONG nPos; - - nPos = pPict->Tell(); - dh = aPoint.X()-aDstTextPosition.X(); - dv = aPoint.Y()-aDstTextPosition.Y(); - - if (bDstTextPositionValid==FALSE || dh<0 || dh>255 || dv<0 || dv>0 || bDelta==FALSE) - { - *pPict << (USHORT)0x0028; - WritePoint(rPoint); - } - else if (dv==0) - { - *pPict << (USHORT)0x0029 << (BYTE)dh; - } - else if (dh==0) - { - *pPict << (USHORT)0x002a << (BYTE)dv; - } - else - { - *pPict << (USHORT)0x002b << (BYTE)dh << (BYTE)dv; - } - - WriteString( rString ); - if (((pPict->Tell()-nPos)&1)!=0) - *pPict << (BYTE)0; - - aDstTextPosition = aPoint; - bDstTextPositionValid=TRUE; -} - - -void PictWriter::WriteOpcode_FontName(const Font & rFont) -{ - USHORT nDataLen,nFontId; - - switch (rFont.GetFamily()) { - case FAMILY_MODERN: nFontId=22; break; - case FAMILY_ROMAN: nFontId=20; break; - case FAMILY_SWISS: nFontId=21; break; - default: nFontId=1; - } - - if (bDstFontNameValid==FALSE || nDstFontNameId!=nFontId || aDstFontName!=rFont.GetName()) - { - ByteString aByteString( rFont.GetName(), gsl_getSystemTextEncoding() ); - sal_uInt16 nFontNameLen = aByteString.Len(); - if ( nFontNameLen ) - { - nDataLen = 3 + nFontNameLen; - *pPict << (USHORT)0x002c << nDataLen << nFontId; - WriteString( rFont.GetName() ); - if ( ( nFontNameLen & 1 ) == 0 ) - *pPict << (BYTE)0; - } - *pPict << (USHORT)0x0003 << nFontId; - aDstFontName=rFont.GetName(); - nDstFontNameId=nFontId; - bDstFontNameValid=TRUE; - } -} - -void PictWriter::WriteOpcode_ClipRect( const Rectangle& rRect ) -{ - Rectangle aRect( MapRectangle( rRect ) ); - aRect.nBottom++; - aRect.nRight++; - *pPict << (sal_uInt16)1 // opcode 1 - << (sal_uInt16)10 // data size - << (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left() - << (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right(); - aClipRect = aRect; -} - -void PictWriter::WriteOpcode_Rect(PictDrawingMethod eMethod, const Rectangle & rRect) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0030; break; - case PDM_PAINT: oc=0x0031; break; - case PDM_ERASE: oc=0x0032; break; - case PDM_INVERT: oc=0x0033; break; - case PDM_FILL: oc=0x0034; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WriteRectangle(rRect); -} - - -void PictWriter::WriteOpcode_SameRect(PictDrawingMethod eMethod) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0038; break; - case PDM_PAINT: oc=0x0039; break; - case PDM_ERASE: oc=0x003a; break; - case PDM_INVERT: oc=0x003b; break; - case PDM_FILL: oc=0x003c; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; -} - - -void PictWriter::WriteOpcode_RRect(PictDrawingMethod eMethod, const Rectangle & rRect) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0040; break; - case PDM_PAINT: oc=0x0041; break; - case PDM_ERASE: oc=0x0042; break; - case PDM_INVERT: oc=0x0043; break; - case PDM_FILL: oc=0x0044; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WriteRectangle(rRect); -} - - -void PictWriter::WriteOpcode_SameRRect(PictDrawingMethod eMethod) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0048; break; - case PDM_PAINT: oc=0x0049; break; - case PDM_ERASE: oc=0x004a; break; - case PDM_INVERT: oc=0x004b; break; - case PDM_FILL: oc=0x004c; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; -} - - -void PictWriter::WriteOpcode_Oval(PictDrawingMethod eMethod, const Rectangle & rRect) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0050; break; - case PDM_PAINT: oc=0x0051; break; - case PDM_ERASE: oc=0x0052; break; - case PDM_INVERT: oc=0x0053; break; - case PDM_FILL: oc=0x0054; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WriteRectangle(rRect); -} - - -void PictWriter::WriteOpcode_SameOval(PictDrawingMethod eMethod) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0058; break; - case PDM_PAINT: oc=0x0059; break; - case PDM_ERASE: oc=0x005a; break; - case PDM_INVERT: oc=0x005b; break; - case PDM_FILL: oc=0x005c; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; -} - - -void PictWriter::WriteOpcode_Arc(PictDrawingMethod eMethod, const Rectangle & rRect, - const Point & rStartPt, const Point & rEndPt) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0060; break; - case PDM_PAINT: oc=0x0061; break; - case PDM_ERASE: oc=0x0062; break; - case PDM_INVERT: oc=0x0063; break; - case PDM_FILL: oc=0x0064; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WriteRectangle(rRect); - WriteArcAngles(rRect,rStartPt,rEndPt); -} - - -void PictWriter::WriteOpcode_SameArc(PictDrawingMethod eMethod, const Rectangle & rRect, - const Point & rStartPt, const Point & rEndPt) -{ - USHORT oc; - switch (eMethod) { - case PDM_FRAME: oc=0x0068; break; - case PDM_PAINT: oc=0x0069; break; - case PDM_ERASE: oc=0x006a; break; - case PDM_INVERT: oc=0x006b; break; - case PDM_FILL: oc=0x006c; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WriteArcAngles(rRect,rStartPt,rEndPt); -} - - -void PictWriter::WriteOpcode_Poly(PictDrawingMethod eMethod, const Polygon & rPoly) -{ - USHORT oc; - - if (rPoly.GetSize()<3) return; - switch (eMethod) { - case PDM_FRAME: oc=0x0070; break; - case PDM_PAINT: oc=0x0071; break; - case PDM_ERASE: oc=0x0072; break; - case PDM_INVERT: oc=0x0073; break; - case PDM_FILL: oc=0x0074; break; - default: oc=0; break; // -Wall a default for oc... - } - *pPict << oc; - WritePolygon(rPoly); -} - - -void PictWriter::WriteOpcode_BitsRect(const Point & rPoint, const Size & rSize, const Bitmap & rBitmap) -{ - BitmapReadAccess* pAcc = NULL; - Bitmap aBitmap( rBitmap ); - - ULONG nWidth, nHeight, nDstRowBytes, nx, nc, ny, nCount, nColTabSize, i; - ULONG nDstRowPos, nSrcRowBytes, nEqu3, nPos, nDstMapPos; - USHORT nBitsPerPixel, nPackType; - BYTE *pComp[4], *pPix, *pTemp; - BYTE nEquData = 0; - BYTE nFlagCounterByte, nRed, nGreen, nBlue; - - SetAttrForPaint(); - - // temopraere Windows-BMP-Datei erzeugen: - nActBitmapPercent=30; - MayCallback(); - - if ( bStatus == FALSE ) - return; - if ( ( pAcc = aBitmap.AcquireReadAccess() ) == NULL ) - return; - - nBitsPerPixel = aBitmap.GetBitCount(); - - // export code below only handles four discrete cases - nBitsPerPixel = - nBitsPerPixel <= 1 ? 1 : nBitsPerPixel <= 4 ? 4 : nBitsPerPixel <= 8 ? 8 : 24; - - nWidth = pAcc->Width(); - nHeight = pAcc->Height(); - - // Wenn 24-Bit, dann den Opcode 'DirectBitsRect' erzeugen: - if ( nBitsPerPixel == 24 ) - { - - // Anzahl Bytes einer (ungepackten) Zeile in Quelle und Ziel berechnen: - nSrcRowBytes =( ( 3 * nWidth ) + 0x0003 ) & 0xfffc; - nDstRowBytes = nWidth * 4; - - // Opcode und BaseAddr (?) schreiben: - *pPict << (USHORT)0x009a << (sal_uInt32)0x000000ff; - - // Normalerweise wollen wir den Packing-Type 4 (Run length encoding - // for 32-Bit Pixels) erzeugen. Wenn aber RowBytes<8 gilt, sind die Daten - // grundsaetzlich ungepackt, auch wenn der Packing-Type 4 angegeben ist, - // was etwas komisch erscheint. Daher wollen wir in so einem Fall lieber - // gleich den Packing-Type 1 (ungepackt) angeben: - - if ( nDstRowBytes < 8 ) - nPackType = 1; - else - nPackType = 4; - - // PixMap-Struktur schreiben: - *pPict << (USHORT)(nDstRowBytes|0x8000) // Bytes pro Zeile und dass es eine 'PixMap' ist - << (USHORT)0x0000 // Y1-Position der Bitmap in der Quelle - << (USHORT)0x0000 // X1-Position der Bitmap in der Quelle - << (USHORT)nHeight // Y2-Position der Bitmap in der Quelle - << (USHORT)nWidth // X2-Position der Bitmap in der Quelle - << (USHORT)0x0000 // Version - << (USHORT)nPackType // Packing type - << (sal_uInt32) 0x00000000 // Packing size (?) - << (sal_uInt32) 0x00480000 // H-Res - << (sal_uInt32) 0x00480000 // V-Res - << (USHORT)0x0010 // Pixel type (?) - << (USHORT)0x0020 // Pixel size: 32 bit - << (USHORT)0x0004 // CmpCount: 4 Komponenten - << (USHORT)0x0008 // CmpSize: 8 Bits - << (sal_uInt32) 0x00000000 // PlaneBytes (?) - << (sal_uInt32) 0x00000000 // (?) - << (sal_uInt32) 0x00000000; // (?) - - // Source-Rectangle schreiben: - *pPict << (USHORT)0x0000 // Y1-Position auf der Bitmap - << (USHORT)0x0000 // X1-Position auf der Bitmap - << (USHORT)nHeight // Y2-Position auf der Bitmap - << (USHORT)nWidth; // X2-Position auf der Bitmap - - // Destination-Rectangle schreiben: - WritePoint( rPoint ); - WritePoint( Point( rPoint.X() + rSize.Width(), rPoint.Y() + rSize.Height() ) ); - - // Transfer mode schreiben: - *pPict << (USHORT)0x0000; // (?) - - // Position der Map-Daten in Ziel merken: - nDstMapPos=pPict->Tell(); - - if ( nPackType == 1 ) // bei 24 bits nWidth == 1 !! - { // nicht packen - for ( ny = 0; ny < nHeight; ny++ ) - { - *pPict << (BYTE)0; - *pPict << (BYTE)pAcc->GetPixel( ny, 0 ).GetRed(); - *pPict << (BYTE)pAcc->GetPixel( ny, 0 ).GetGreen(); - *pPict << (BYTE)pAcc->GetPixel( ny, 0 ).GetBlue(); - // Prozente zaehlen, Callback, Fehler pruefen: - nActBitmapPercent = ( ny * 70 / nHeight ) + 30; // (30% machten schon das Schreiben der Win-BMP-Datei aus) - MayCallback(); - } - } - else // packen ( PackType == 4 ) - { - // Speicher fuer Zeilen-Zwischen-Datenstruktur allozieren: - for ( nc = 0; nc < 4; nc++ ) - pComp[ nc ] = new BYTE[ nWidth ]; - - // Schleife ueber Zeilen: - for ( ny = 0; ny < nHeight; ny++ ) - { - // Zeil ny der Quelle in die Zwischen-Datenstrktur einlesen: - - for ( nx = 0; nx < nWidth; nx++ ) - { - pComp[ 1 ][ nx ] = (BYTE)pAcc->GetPixel( ny, nx ) .GetRed(); - pComp[ 2 ][ nx ] = (BYTE)pAcc->GetPixel( ny, nx ) .GetGreen(); - pComp[ 3 ][ nx ] = (BYTE)pAcc->GetPixel( ny, nx ) .GetBlue(); - pComp[ 0 ][ nx ] = 0; - } - - // Anfang der Zeile im Ziel merken: - nDstRowPos = pPict->Tell(); - - // ByteCount (das ist die Groesse der gepackten Zeile) zunaechst 0 (wird spaeter berichtigt): - if ( nDstRowBytes > 250 ) - *pPict << (USHORT)0; - else - *pPict << (BYTE)0; - - // Schleife ueber Componenten: - for ( nc = 0; nc < 4; nc++ ) - { - // Schleife ueber x: - nx = 0; - while ( nx < nWidth ) - { - // Die Position von 3 gleichen Bytes suchen und in nEqu3 merken. - // wenn nicht gefunden, dann nEqu3=nWidth setzten. - // Wenn doch gefunden, dann in nEquData den Wert der Bytes merken. - nEqu3 = nx; - for (;;) - { - if ( nEqu3 + 2 >= nWidth ) - { - nEqu3 = nWidth; - break; - } - nEquData = pComp[nc][nEqu3]; - if ( nEquData == pComp[nc][nEqu3+1] && nEquData==pComp[nc][nEqu3+2] ) - break; - nEqu3++; - } - - // Die Daten von nx bis nEqu3 unkomprimiert schreiben (ggf. in mehreren Records): - while ( nEqu3 > nx ) - { - nCount = nEqu3 - nx; - if ( nCount > 128 ) - nCount=128; - nFlagCounterByte = (BYTE)(nCount-1); - *pPict << nFlagCounterByte; - do - { - *pPict << pComp[nc][nx++]; - nCount--; - } - while ( nCount > 0 ); - } - - // Jetzt einen Komprimierungs-Record erzeugen (falls oben mindestens 3 - // gleiche Bytes gefunden): - if ( nx < nWidth ) - { // Hinweis: es gilt nx==nEqu3 (hoffentlich) - nCount=3; // Drei Bytes sind gleich, wie weiter oben herausgefunden. - // Pruefen, ob es weitere gleiche Bytes gibts (dabei Max.-Record-Groesse beachten): - while ( nx + nCount < nWidth && nCount < 128 ) - { - if ( nEquData != pComp[ nc ][ nx + nCount ] ) - break; - nCount++; - } - // nCount gleiche Bytes komprimiert schreiben: - nFlagCounterByte = (BYTE)( 1 - (long)nCount ); - *pPict << nFlagCounterByte << nEquData; - nx += nCount; - } - } - } - // ByteCount berichtigen: - nPos = pPict->Tell(); - pPict->Seek( nDstRowPos ); - if ( nDstRowBytes > 250 ) - *pPict << ( (USHORT)( nPos - nDstRowPos - 2 ) ); - else - *pPict << ( (BYTE)( nPos - nDstRowPos - 1 ) ); - pPict->Seek( nPos ); - - // Prozente zaehlen, Callback, Fehler pruefen: - nActBitmapPercent = ( ny * 70 / nHeight ) + 30; // (30% machten schon das Schreiben der Win-BMP-Datei aus) - MayCallback(); - } - // Aufraeumen: - for ( nc = 0; nc < 4; nc++ ) - delete pComp[ nc ]; - } - } - else - { // nicht 24-Bit also Opcode 'PackBitsRect' erzeugen: - - // Bei 1-Bit-Bildern ignorieren manche Import-Filter die Palette und nehmen statt - // dessen die Vorder- und Hintergrundfarbe: - if ( nBitsPerPixel == 1 ) - { - WriteOpcode_RGBBkCol( pAcc->GetPaletteColor( 0 ) ); - WriteOpcode_RGBFgCol( pAcc->GetPaletteColor( 1 ) ); - } - else - { - WriteOpcode_RGBBkCol( Color( COL_BLACK ) ); - WriteOpcode_RGBFgCol( Color( COL_WHITE ) ); - } - - // Anzahl Bytes einer (ungepackten) Zeile in Ziel und Quelle berechnen: - nDstRowBytes = ( nWidth * nBitsPerPixel + 7 ) >> 3; - nSrcRowBytes = ( nDstRowBytes + 3 ) & 0xfffffffc; - - // Opcode schreiben: - *pPict << (USHORT)0x0098; - - // Normalerweise wollen wir den Packing-Type 0 (default Packing) erzeugen. - // Wenn aber RowBytes<8 gilt, sind die Daten grundsaetzlich ungepackt, - // auch wenn der Packing-Type 0 angegeben ist, was etwas komisch erscheint. - // Daher wollen wir in so einem Fall lieber gleich den Packing-Type 1 (ungepackt) - // angeben: - if ( nDstRowBytes < 8 ) - nPackType = 1; - else - nPackType = 0; - - // PixMap-Struktur schreiben: - *pPict << (USHORT)(nDstRowBytes|0x8000) // Bytes pro Zeile und dass es eine 'PixMap' ist - << (USHORT)0x0000 // Y1-Position der Bitmap in der Quelle - << (USHORT)0x0000 // X1-Position der Bitmap in der Quelle - << (USHORT)nHeight // Y2-Position der Bitmap in der Quelle - << (USHORT)nWidth // X2-Position der Bitmap in der Quelle - << (USHORT)0x0000 // Version - << (USHORT)nPackType // Packing type - << (sal_uInt32) 0x00000000 // Packing size (?) - << (sal_uInt32) 0x00480000 // H-Res - << (sal_uInt32) 0x00480000 // V-Res - << (USHORT)0x0000 // Pixel type (?) - << (USHORT)nBitsPerPixel // Pixel size - << (USHORT)0x0001 // CmpCount: 1 Komponente - << (USHORT)nBitsPerPixel // CmpSize - << (sal_uInt32) 0x00000000 // PlaneBytes (?) - << (sal_uInt32) 0x00000000 // (?) - << (sal_uInt32) 0x00000000; // (?) - - // Palette lesen und schreiben: - nColTabSize = pAcc->GetPaletteEntryCount(); - *pPict << (sal_uInt32)0 << (USHORT)0x8000 << (USHORT)( nColTabSize - 1 ); - - for ( i = 0; i < nColTabSize; i++ ) - { - nRed = (BYTE)pAcc->GetPaletteColor( (USHORT)i ).GetRed(); - nGreen = (BYTE)pAcc->GetPaletteColor( (USHORT)i ).GetGreen(); - nBlue = (BYTE)pAcc->GetPaletteColor( (USHORT)i ).GetBlue(); - *pPict << (UINT16)0 << nRed << nRed << nGreen << nGreen << nBlue << nBlue; - } - - // Source-Rectangle schreiben: - *pPict << (USHORT)0 << (USHORT)0 << (USHORT)nHeight << (USHORT)nWidth; - - // Destination-Rectangle schreiben: - WritePoint( rPoint ); - WritePoint( Point( rPoint.X() + rSize.Width(), rPoint.Y() + rSize.Height() ) ); - - // Transfer mode schreiben: - *pPict << (USHORT)0; // (?) - - // Speicher fuer eine Zeile allozieren: - pPix = new BYTE[ nSrcRowBytes ]; - - // Position der Map-Daten in Ziel merken: - nDstMapPos=pPict->Tell(); - - // Schleife ueber Zeilen: - for ( ny = 0; ny < nHeight; ny++ ) - { - - // Zeile ny der Quelle in den Zwischenspeicher einlesen: - - switch ( nBitsPerPixel ) - { - case 1 : - for ( pTemp = pPix, i = 0; i < nSrcRowBytes; i++ ) - *pTemp++ = (BYTE)0; - for ( i = 0; i < nWidth; i++ ) - pPix[ ( i >> 3 ) ] |= (BYTE)( pAcc->GetPixel( ny, i ) & 1 ) << ( ( i & 7 ) ^ 7 ); - break; - case 4 : - for ( pTemp = pPix, i = 0; i < nSrcRowBytes; i++ ) - *pTemp++ = (BYTE)0; - for ( i = 0; i < nWidth; i++ ) - pPix[ ( i >> 1 ) ] |= (BYTE)( pAcc->GetPixel( ny, i ) & 15 ) << ( ( i & 1 ) << 2 ) ; - break; - case 8 : - for ( i = 0; i < nWidth; i++ ) - pPix[ i ] = (BYTE)pAcc->GetPixel( ny, i ); - break; - } - - if ( nPackType == 1 ) - { // nicht packen - pPict->Write( pPix, nDstRowBytes ); - } - else - { // Packen (nPackType==0) - - // Anfang der Zeile im Ziel merken: - nDstRowPos = pPict->Tell(); - - // ByteCount (das ist die Groesse der gepackten Zeile) zunaechst 0 (wird spaeter berichtigt): - if ( nDstRowBytes > 250 ) - *pPict << (USHORT)0; - else - *pPict << (BYTE)0; - - // Schleife ueber Bytes der Zeile: - nx=0; - while ( nx < nDstRowBytes && bStatus ) - { - // Die Position von 3 gleichen Bytes suchen und in nEqu3 merken. - // wenn nicht gefunden, dann nEqu3=nDstRowBytes setzten. - // Wenn doch gefunden, dann in nEquData den Wert der Bytes merken. - nEqu3 = nx; - for (;;) - { - if ( nEqu3 + 2 >= nDstRowBytes ) - { - nEqu3 = nDstRowBytes; - break; - } - nEquData = pPix[ nEqu3 ]; - if ( nEquData == pPix[ nEqu3 + 1 ] && nEquData == pPix[ nEqu3 + 2 ] ) - break; - nEqu3++; - } - - // Die Daten von nx bis nEqu3 unkomprimiert schreiben (ggf. in mehreren Records): - while ( nEqu3 > nx ) - { - nCount = nEqu3 - nx; - if ( nCount > 128 ) - nCount = 128; - nFlagCounterByte = (BYTE)( nCount - 1 ); - *pPict << nFlagCounterByte; - do - { - *pPict << pPix[ nx++ ]; - nCount--; - } while ( nCount > 0 ); - } - - // Jetzt einen Komprimierungs-Record erzeugen (falls oben mindestens 3 - // gleiche Bytes gefunden): - if ( nx < nDstRowBytes ) - { // Hinweis: es gilt nx==nEqu3 (hoffentlich) - nCount = 3; // Drei Bytes sind gleich, wie weiter oben herausgefunden. - // Pruefen, ob es weitere gleiche Bytes gibts (dabei Max.-Record-Groesse beachten): - while ( nx + nCount < nDstRowBytes && nCount < 128 ) - { - if ( nEquData != pPix[ nx + nCount ] ) - break; - nCount++; - } - // nCount gleiche Bytes komprimiert schreiben: - nFlagCounterByte = (BYTE)( 1 - (long)nCount ); - *pPict << nFlagCounterByte << nEquData; - nx += nCount; - } - } - - // ByteCount berichtigen: - nPos = pPict->Tell(); - pPict->Seek( nDstRowPos ); - if ( nDstRowBytes > 250 ) - *pPict << ( (USHORT)( nPos - nDstRowPos - 2 ) ); - else - *pPict << ( (BYTE)( nPos - nDstRowPos - 1 ) ); - pPict->Seek( nPos ); - } - - // Prozente zaehlen, Callback, Fehler pruefen: - nActBitmapPercent =( ny * 70 / nHeight ) + 30; // (30% machten schon das Schreiben der Win-BMP-Datei aus) - MayCallback(); - if ( pPict->GetError() ) - bStatus = FALSE; - } - // Aufraeumen: - delete[] pPix; - } - - // Map-Daten muessen gerade Anzahl von Bytes sein: - if ( ( ( pPict->Tell() - nDstMapPos ) & 1 ) != 0 ) - *pPict << (BYTE)0; - - // Bitmaps zaehlen: - nWrittenBitmaps++; - nActBitmapPercent = 0; - if ( pAcc ) - aBitmap.ReleaseAccess( pAcc ); -} - -void PictWriter::WriteOpcode_EndOfFile() -{ - *pPict << (USHORT)0x00ff; -} - - -void PictWriter::SetAttrForPaint() -{ - WriteOpcode_PnMode(eSrcRasterOp); - WriteOpcode_RGBFgCol(aFillColor); - WriteOpcode_RGBBkCol(aFillColor); - WriteOpcode_PnFillPat(aFillColor!=Color( COL_TRANSPARENT )); -} - - -void PictWriter::SetAttrForFrame() -{ - WriteOpcode_PnMode(eSrcRasterOp); - WriteOpcode_PnSize(0); - WriteOpcode_RGBFgCol(aLineColor); - WriteOpcode_PnLinePat(aLineColor!=Color( COL_TRANSPARENT )); -} - - -void PictWriter::SetAttrForText() -{ - WriteOpcode_RGBFgCol(aSrcFont.GetColor()); - WriteOpcode_RGBBkCol(aSrcFont.GetFillColor()); - WriteOpcode_PnLinePat(TRUE); - WriteOpcode_FontName(aSrcFont); - WriteOpcode_TxSize((USHORT)(aSrcFont.GetSize().Height())); - WriteOpcode_TxMode(eSrcRasterOp); - WriteOpcode_TxFace(aSrcFont); -} - - -void PictWriter::WriteTextArray(Point & rPoint, const String& rString, const sal_Int32 * pDXAry) -{ - USHORT i,nLen; - sal_Unicode c; - BOOL bDelta; - Point aPt; - - if ( pDXAry == NULL ) - WriteOpcode_Text( rPoint, rString, FALSE ); - else - { - bDelta = FALSE; - nLen = rString.Len(); - for ( i = 0; i < nLen; i++ ) - { - c = rString.GetChar( i ); - if ( c && ( c != 0x20 ) ) - { - aPt = rPoint; - if ( i > 0 ) - aPt.X() += pDXAry[ i - 1 ]; - - WriteOpcode_Text( aPt, String( c ), bDelta ); - bDelta = TRUE; - } - } - } -} - -void PictWriter::HandleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon) -{ - if(rLinePolygon.count()) - { - basegfx::B2DPolyPolygon aLinePolyPolygon(rLinePolygon); - basegfx::B2DPolyPolygon aFillPolyPolygon; - - rInfo.applyToB2DPolyPolygon(aLinePolyPolygon, aFillPolyPolygon); - - if(aLinePolyPolygon.count()) - { - aLinePolyPolygon = aLinePolyPolygon.getDefaultAdaptiveSubdivision(); - const sal_uInt32 nPolyCount(aLinePolyPolygon.count()); - SetAttrForFrame(); - - for(sal_uInt32 a(0); a < nPolyCount; a++) - { - const basegfx::B2DPolygon aCandidate(aLinePolyPolygon.getB2DPolygon(a)); - const sal_uInt32 nPointCount(aCandidate.count()); - - if(nPointCount) - { - const sal_uInt32 nEdgeCount(aCandidate.isClosed() ? nPointCount + 1 : nPointCount); - const basegfx::B2DPoint aCurr(aCandidate.getB2DPoint(0)); - Point nCurr(basegfx::fround(aCurr.getX()), basegfx::fround(aCurr.getY())); - - for(sal_uInt32 b(0); b < nEdgeCount; b++) - { - const sal_uInt32 nNextIndex((b + 1) % nPointCount); - const basegfx::B2DPoint aNext(aCandidate.getB2DPoint(nNextIndex)); - const Point nNext(basegfx::fround(aNext.getX()), basegfx::fround(aNext.getY())); - - WriteOpcode_Line(nCurr, nNext); - nCurr = nNext; - } - } - } - } - - if(aFillPolyPolygon.count()) - { - const Color aOldLineColor(aLineColor); - const Color aOldFillColor(aFillColor); - - aLineColor = Color( COL_TRANSPARENT ); - aFillColor = aOldLineColor; - SetAttrForPaint(); - - for(sal_uInt32 a(0); a < aFillPolyPolygon.count(); a++) - { - const Polygon aPolygon(aFillPolyPolygon.getB2DPolygon(a).getDefaultAdaptiveSubdivision()); - WriteOpcode_Poly(PDM_PAINT, aPolygon); - } - - aLineColor = aOldLineColor; - aFillColor = aOldFillColor; - } - } -} - -void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF ) -{ - ULONG nA, nACount; - const MetaAction* pMA; - - if( !bStatus) - return; - - nACount=rMTF.GetActionCount(); - - for (nA=0; nA<nACount; nA++) - { - pMA = rMTF.GetAction(nA); - - switch (pMA->GetType()) - { - case META_PIXEL_ACTION: - { - const MetaPixelAction* pA = (const MetaPixelAction*) pMA; - WriteOpcode_PnMode(eSrcRasterOp); - WriteOpcode_PnSize(1); - WriteOpcode_RGBFgCol(pA->GetColor()); - WriteOpcode_PnLinePat(TRUE); - WriteOpcode_Line(pA->GetPoint(),pA->GetPoint()); - } - break; - - case META_POINT_ACTION: - { - const MetaPointAction* pA = (const MetaPointAction*) pMA; - - if( aLineColor != Color( COL_TRANSPARENT ) ) - { - SetAttrForFrame(); - WriteOpcode_Line( pA->GetPoint(),pA->GetPoint() ); - } - } - break; - - case META_LINE_ACTION: - { - const MetaLineAction* pA = (const MetaLineAction*) pMA; - - if( aLineColor != Color( COL_TRANSPARENT ) ) - { - if(pA->GetLineInfo().IsDefault()) - { - SetAttrForFrame(); - WriteOpcode_Line( pA->GetStartPoint(),pA->GetEndPoint() ); - } - else - { - // LineInfo used; handle Dash/Dot and fat lines - basegfx::B2DPolygon aPolygon; - aPolygon.append(basegfx::B2DPoint(pA->GetStartPoint().X(), pA->GetStartPoint().Y())); - aPolygon.append(basegfx::B2DPoint(pA->GetEndPoint().X(), pA->GetEndPoint().Y())); - HandleLineInfoPolyPolygons(pA->GetLineInfo(), aPolygon); - } - } - break; - } - - case META_RECT_ACTION: - { - const MetaRectAction* pA = (const MetaRectAction*) pMA; - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Rect(PDM_PAINT,pA->GetRect()); - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_SameRect(PDM_FRAME); - } - } - else if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_Rect(PDM_FRAME,pA->GetRect()); - } - } - break; - - case META_ROUNDRECT_ACTION: - { - const MetaRoundRectAction* pA = (const MetaRoundRectAction*) pMA; - - WriteOpcode_OvSize( Size( pA->GetHorzRound(), pA->GetVertRound() ) ); - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_RRect(PDM_PAINT,pA->GetRect()); - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_SameRRect(PDM_FRAME); - } - } - else if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_RRect(PDM_FRAME,pA->GetRect()); - } - } - break; - - case META_ELLIPSE_ACTION: - { - const MetaEllipseAction* pA = (const MetaEllipseAction*) pMA; - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Oval(PDM_PAINT,pA->GetRect()); - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_SameOval(PDM_FRAME); - } - } - else if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_Oval(PDM_FRAME,pA->GetRect()); - } - } - break; - - case META_ARC_ACTION: - { - const MetaArcAction* pA = (const MetaArcAction*) pMA; - - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_Arc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint()); - } - } - break; - - case META_PIE_ACTION: - { - const MetaPieAction* pA = (const MetaPieAction *) pMA; - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Arc(PDM_PAINT,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint()); - - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_SameArc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint()); - } - } - else if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_Arc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint()); - } - - if (aLineColor!=Color( COL_TRANSPARENT )) - { - double fxc,fyc,fxr,fyr,fx1,fy1,fx2,fy2,l1,l2; - - fxc=((double)(pA->GetRect().Left()+pA->GetRect().Right()))/2.0; - fyc=((double)(pA->GetRect().Top()+pA->GetRect().Bottom()))/2.0; - fxr=((double)pA->GetRect().GetWidth())/2.0; - fyr=((double)pA->GetRect().GetHeight())/2.0; - fx1=((double)pA->GetStartPoint().X())-fxc; - fy1=((double)pA->GetStartPoint().Y())-fyc; - fx2=((double)pA->GetEndPoint().X())-fxc; - fy2=((double)pA->GetEndPoint().Y())-fyc; - l1=sqrt(fx1*fx1+fy1*fy1); - l2=sqrt(fx2*fx2+fy2*fy2); - - if (l1>0) - { - fx1=fx1/l1*fxr; - fy1=fy1/l1*fyr; - } - - if (l2>0) - { - fx2=fx2/l2*fxr; - fy2=fy2/l2*fyr; - } - fx1+=fxc; fy1+=fyc; fx2+=fxc; fy2+=fyc; - WriteOpcode_Line(Point((long)(fx1+0.5),(long)(fy1+0.5)), Point((long)(fxc+0.5),(long)(fyc+0.5))); - WriteOpcode_LineFrom(Point((long)(fx2+0.5),(long)(fy2+0.5))); - } - } - break; - - case META_CHORD_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_CHORD_ACTION!" ); - } - break; - - case META_POLYLINE_ACTION: - { - const MetaPolyLineAction* pA = (const MetaPolyLineAction*) pMA; - - if( aLineColor!=Color( COL_TRANSPARENT ) ) - { - const Polygon& rPoly = pA->GetPolygon(); - - if( rPoly.GetSize() ) - { - if(pA->GetLineInfo().IsDefault()) - { - Polygon aSimplePoly; - if ( rPoly.HasFlags() ) - rPoly.AdaptiveSubdivide( aSimplePoly ); - else - aSimplePoly = rPoly; - - const USHORT nSize = aSimplePoly.GetSize(); - Point aLast; - - if ( nSize ) - { - SetAttrForFrame(); - aLast = aSimplePoly[0]; - - for ( USHORT i = 1; i < nSize; i++ ) - { - WriteOpcode_Line( aLast, aSimplePoly[i] ); - aLast = aSimplePoly[i]; - } - } - } - else - { - // LineInfo used; handle Dash/Dot and fat lines - HandleLineInfoPolyPolygons(pA->GetLineInfo(), rPoly.getB2DPolygon()); - } - } - } - } - break; - - case META_POLYGON_ACTION: - { - const MetaPolygonAction* pA = (const MetaPolygonAction*) pMA; - - const Polygon& rPoly = pA->GetPolygon(); - - Polygon aSimplePoly; - if ( rPoly.HasFlags() ) - rPoly.AdaptiveSubdivide( aSimplePoly ); - else - aSimplePoly = rPoly; - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Poly( PDM_PAINT, aSimplePoly ); - } - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - WriteOpcode_Poly( PDM_FRAME, aSimplePoly ); - } - } - break; - - case META_POLYPOLYGON_ACTION: - { - const MetaPolyPolygonAction* pA = (const MetaPolyPolygonAction*) pMA; - - const PolyPolygon& rPolyPoly = pA->GetPolyPolygon(); - sal_uInt16 nPolyCount = rPolyPoly.Count(); - PolyPolygon aSimplePolyPoly( rPolyPoly ); - for ( sal_uInt16 i = 0; i < nPolyCount; i++ ) - { - if ( aSimplePolyPoly[ i ].HasFlags() ) - { - Polygon aSimplePoly; - aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly ); - aSimplePolyPoly[ i ] = aSimplePoly; - } - } - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Poly( PDM_PAINT, PolyPolygonToPolygon( aSimplePolyPoly )); - } - - if (aLineColor!=Color( COL_TRANSPARENT )) - { - USHORT nCount,i; - SetAttrForFrame(); - nCount = aSimplePolyPoly.Count(); - for ( i = 0; i < nCount; i++ ) - WriteOpcode_Poly( PDM_FRAME, aSimplePolyPoly.GetObject( i ) ); - } - } - break; - - case META_TEXT_ACTION: - { - const MetaTextAction* pA = (const MetaTextAction*) pMA; - Point aPt( pA->GetPoint() ); - - if ( aSrcFont.GetAlign() != ALIGN_BASELINE ) - { - VirtualDevice aVirDev; - - if (aSrcFont.GetAlign()==ALIGN_TOP) - aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent(); - else - aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent(); - } - - SetAttrForText(); - String aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() ); - WriteOpcode_Text( aPt, aStr, FALSE ); - } - break; - - case META_TEXTARRAY_ACTION: - { - const MetaTextArrayAction* pA = (const MetaTextArrayAction*) pMA; - Point aPt( pA->GetPoint() ); - - if (aSrcFont.GetAlign()!=ALIGN_BASELINE) - { - VirtualDevice aVirDev; - - if (aSrcFont.GetAlign()==ALIGN_TOP) - aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent(); - else - aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent(); - } - SetAttrForText(); - String aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() ); - WriteTextArray( aPt, aStr, pA->GetDXArray() ); - break; - } - - case META_STRETCHTEXT_ACTION: - { - const MetaStretchTextAction* pA = (const MetaStretchTextAction*) pMA; - Point aPt( pA->GetPoint() ); - String aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() ); - VirtualDevice aVirDev; - sal_Int32* pDXAry = new sal_Int32[ aStr.Len() ]; - sal_Int32 nNormSize( aVirDev.GetTextArray( aStr,pDXAry ) ); - USHORT i; - - if (aSrcFont.GetAlign()!=ALIGN_BASELINE) - { - if (aSrcFont.GetAlign()==ALIGN_TOP) - aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent(); - else - aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent(); - } - - for ( i = 0; i < aStr.Len() - 1; i++ ) - pDXAry[ i ] = pDXAry[ i ] * ( (long)pA->GetWidth() ) / nNormSize; - - SetAttrForText(); - WriteTextArray( aPt, aStr, pDXAry ); - delete[] pDXAry; - } - break; - - case META_TEXTRECT_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_TEXTRECT_ACTION!" ); - } - break; - - case META_BMP_ACTION: - { - const MetaBmpAction* pA = (const MetaBmpAction*) pMA; - WriteOpcode_BitsRect( pA->GetPoint(),pA->GetBitmap().GetSizePixel(), pA->GetBitmap() ); - } - break; - - case META_BMPSCALE_ACTION: - { - const MetaBmpScaleAction* pA = (const MetaBmpScaleAction*) pMA; - WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), pA->GetBitmap() ); - } - break; - - case META_BMPSCALEPART_ACTION: - { - const MetaBmpScalePartAction* pA = (const MetaBmpScalePartAction*) pMA; - Bitmap aBmp( pA->GetBitmap() ); - - aBmp.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) ); - WriteOpcode_BitsRect( pA->GetDestPoint(), pA->GetDestSize(), aBmp ); - } - break; - - case META_BMPEX_ACTION: - { - const MetaBmpExAction* pA = (const MetaBmpExAction*) pMA; - const Bitmap aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() ); - - WriteOpcode_BitsRect( pA->GetPoint(), aBmp.GetSizePixel(), aBmp ); - } - break; - - case META_BMPEXSCALE_ACTION: - { - const MetaBmpExScaleAction* pA = (const MetaBmpExScaleAction*) pMA; - const Bitmap aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() ); - - WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), aBmp ); - } - break; - - case META_BMPEXSCALEPART_ACTION: - { - const MetaBmpExScalePartAction* pA = (const MetaBmpExScalePartAction*) pMA; - Bitmap aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() ); - - aBmp.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) ); - WriteOpcode_BitsRect( pA->GetDestPoint(), pA->GetDestSize(), aBmp ); - } - break; - - case META_EPS_ACTION : - { - const MetaEPSAction* pA = (const MetaEPSAction*)pMA; - const GDIMetaFile aGDIMetaFile( pA->GetSubstitute() ); - - INT32 nCount = aGDIMetaFile.GetActionCount(); - for ( INT32 i = 0; i < nCount; i++ ) - { - const MetaAction* pMetaAct = aGDIMetaFile.GetAction( i ); - if ( pMetaAct->GetType() == META_BMPSCALE_ACTION ) - { - const MetaBmpScaleAction* pBmpScaleAction = (const MetaBmpScaleAction*)pMetaAct; - WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), pBmpScaleAction->GetBitmap() ); - break; - } - } - } - break; - - case META_MASK_ACTION: - case META_MASKSCALE_ACTION: - case META_MASKSCALEPART_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_MASK..._ACTION!" ); - } - break; - - case META_GRADIENT_ACTION: - { - VirtualDevice aVDev; - GDIMetaFile aTmpMtf; - const MetaGradientAction* pA = (const MetaGradientAction*) pMA; - - aVDev.SetMapMode( aTargetMapMode ); - aVDev.AddGradientActions( pA->GetRect(), pA->GetGradient(), aTmpMtf ); - WriteOpcodes( aTmpMtf ); - } - break; - - case META_HATCH_ACTION: - { - VirtualDevice aVDev; - GDIMetaFile aTmpMtf; - const MetaHatchAction* pA = (const MetaHatchAction*) pMA; - - aVDev.SetMapMode( aTargetMapMode ); - aVDev.AddHatchActions( pA->GetPolyPolygon(), pA->GetHatch(), aTmpMtf ); - WriteOpcodes( aTmpMtf ); - } - break; - - case META_WALLPAPER_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_WALLPAPER_ACTION!" ); - } - break; - - case META_CLIPREGION_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_CLIPREGION_ACTION!" ); - } - break; - - case META_ISECTRECTCLIPREGION_ACTION: - { - const MetaISectRectClipRegionAction* pA = (const MetaISectRectClipRegionAction*) pMA; - WriteOpcode_ClipRect( pA->GetRect() ); - } - break; - - case META_ISECTREGIONCLIPREGION_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_ISECTREGIONCLIPREGION_ACTION!" ); - } - break; - - case META_MOVECLIPREGION_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_MOVECLIPREGION_ACTION!" ); - } - break; - - case META_LINECOLOR_ACTION: - { - const MetaLineColorAction* pA = (const MetaLineColorAction*) pMA; - - if( pA->IsSetting() ) - aLineColor = pA->GetColor(); - else - aLineColor = Color( COL_TRANSPARENT ); - } - break; - - case META_FILLCOLOR_ACTION: - { - const MetaFillColorAction* pA = (const MetaFillColorAction*) pMA; - - if( pA->IsSetting() ) - aFillColor = pA->GetColor(); - else - aFillColor = Color( COL_TRANSPARENT ); - } - break; - - case META_TEXTCOLOR_ACTION: - { - const MetaTextColorAction* pA = (const MetaTextColorAction*) pMA; - aSrcFont.SetColor( pA->GetColor() ); - } - break; - - case META_TEXTFILLCOLOR_ACTION: - { - const MetaTextFillColorAction* pA = (const MetaTextFillColorAction*) pMA; - - if( pA->IsSetting() ) - aSrcFont.SetFillColor( pA->GetColor() ); - else - aSrcFont.SetFillColor( Color( COL_TRANSPARENT ) ); - } - break; - - case META_TEXTALIGN_ACTION: - { -// DBG_ERROR( "Unsupported PICT-Action: META_TEXTALIGN_ACTION!" ); - } - break; - - case META_MAPMODE_ACTION: - { - const MetaMapModeAction* pA = (const MetaMapModeAction*) pMA; - - if (aSrcMapMode!=pA->GetMapMode()) - { - if( pA->GetMapMode().GetMapUnit() == MAP_RELATIVE ) - { - MapMode aMM = pA->GetMapMode(); - Fraction aScaleX = aMM.GetScaleX(); - Fraction aScaleY = aMM.GetScaleY(); - - Point aOrigin = aSrcMapMode.GetOrigin(); - BigInt aX( aOrigin.X() ); - aX *= BigInt( aScaleX.GetDenominator() ); - if( aOrigin.X() >= 0 ) - { - if( aScaleX.GetNumerator() >= 0 ) - aX += BigInt( aScaleX.GetNumerator()/2 ); - else - aX -= BigInt( (aScaleX.GetNumerator()+1)/2 ); - } - else - { - if( aScaleX.GetNumerator() >= 0 ) - aX -= BigInt( (aScaleX.GetNumerator()-1)/2 ); - else - aX += BigInt( aScaleX.GetNumerator()/2 ); - } - - aX /= BigInt( aScaleX.GetNumerator() ); - aOrigin.X() = (long)aX + aMM.GetOrigin().X(); - BigInt aY( aOrigin.Y() ); - aY *= BigInt( aScaleY.GetDenominator() ); - - if( aOrigin.Y() >= 0 ) - { - if( aScaleY.GetNumerator() >= 0 ) - aY += BigInt( aScaleY.GetNumerator()/2 ); - else - aY -= BigInt( (aScaleY.GetNumerator()+1)/2 ); - } - else - { - if( aScaleY.GetNumerator() >= 0 ) - aY -= BigInt( (aScaleY.GetNumerator()-1)/2 ); - else - aY += BigInt( aScaleY.GetNumerator()/2 ); - } - - aY /= BigInt( aScaleY.GetNumerator() ); - aOrigin.Y() = (long)aY + aMM.GetOrigin().Y(); - aSrcMapMode.SetOrigin( aOrigin ); - - aScaleX *= aSrcMapMode.GetScaleX(); - aScaleY *= aSrcMapMode.GetScaleY(); - aSrcMapMode.SetScaleX( aScaleX ); - aSrcMapMode.SetScaleY( aScaleY ); - } - else - aSrcMapMode = pA->GetMapMode(); - } - } - break; - - case META_FONT_ACTION: - { - const MetaFontAction* pA = (const MetaFontAction*) pMA; - aSrcFont=pA->GetFont(); - } - break; - - case META_PUSH_ACTION: - { - PictWriterAttrStackMember * pAt = new PictWriterAttrStackMember; - pAt->aLineColor=aLineColor; - pAt->aFillColor=aFillColor; - pAt->eRasterOp=eSrcRasterOp; - pAt->aFont=aSrcFont; - pAt->aMapMode=aSrcMapMode; - pAt->aClipRect=aClipRect; - pAt->pSucc=pAttrStack; - pAttrStack=pAt; - } - break; - - case META_POP_ACTION: - { - PictWriterAttrStackMember* pAt=pAttrStack; - - if( pAt ) - { - aLineColor=pAt->aLineColor; - aFillColor=pAt->aFillColor; - eSrcRasterOp=pAt->eRasterOp; - aSrcFont=pAt->aFont; - aSrcMapMode=pAt->aMapMode; - if ( pAt->aClipRect != aClipRect ) - { - Rectangle aRect( pAt->aClipRect ); - *pPict << (sal_uInt16)1 // opcode 1 - << (sal_uInt16)10 // data size - << (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left() - << (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right(); - } - aClipRect=pAt->aClipRect; - pAttrStack=pAt->pSucc; - delete pAt; - } - } - break; - - case META_RASTEROP_ACTION: - { - const MetaRasterOpAction* pA = (const MetaRasterOpAction*) pMA; - eSrcRasterOp=pA->GetRasterOp(); - } - break; - - case META_TRANSPARENT_ACTION: - { - const PolyPolygon& rPolyPoly = ( (const MetaTransparentAction*) pMA )->GetPolyPolygon(); - - if (aFillColor!=Color( COL_TRANSPARENT )) - { - SetAttrForPaint(); - WriteOpcode_Poly( PDM_PAINT, PolyPolygonToPolygon( rPolyPoly ) ); - } - - if (aLineColor!=Color( COL_TRANSPARENT )) - { - SetAttrForFrame(); - for( USHORT i = 0, nCount = rPolyPoly.Count(); i < nCount; i++ ) - WriteOpcode_Poly( PDM_FRAME, rPolyPoly.GetObject( i ) ); - } - } - 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 ); - - WriteOpcodes( aTmpMtf ); - } - break; - } - - nWrittenActions++; - MayCallback(); - - if (pPict->GetError()) - bStatus=FALSE; - - if (bStatus==FALSE) - break; - } -} - - -void PictWriter::WriteHeader(const GDIMetaFile & rMTF) -{ - USHORT i; - Size aSize( rMTF.GetPrefSize() ); - Point aPoint; - Rectangle aRect( aPoint, aSize ); - - // 512 Bytes "Muell" am Anfang: - for (i=0;i<128;i++) *pPict << (sal_uInt32)0; - - // Lo-16-Bits der Groesse der Datei ohne die 512 Bytes Muell: - *pPict << (USHORT)0; // wird spaeter durch UpdateHeader() berichtigt - - // Das Bounding-Rectangle (y1,x1,y2,x2 !): - WriteRectangle( aRect ); - - // Version 2: - *pPict << (sal_uInt32)0x001102ff; - - // Extended-Version-2-Header: - *pPict << (USHORT)0x0c00 // Opcode - << (USHORT)0xfffe // Version (?) - << (USHORT)0x0000 // Reserved - << (sal_uInt32) 0x00480000 // hRes - << (sal_uInt32) 0x00480000; - WriteRectangle( aRect ); - *pPict << (sal_uInt32)0x00000000; // Reserved - - // viele Import-Filter verlangen die Angabe eines - // Clipping-Bereichs am Anfang - - WriteOpcode_ClipRect( aRect ); -} - - -void PictWriter::UpdateHeader() -{ - ULONG nPos; - - // Lo-16-Bits der Groesse der Datei ohne die 512 Bytes Muell berichtigen: - nPos=pPict->Tell(); - pPict->Seek(512); - *pPict << (USHORT)((nPos-512)&0x0000ffff); - pPict->Seek(nPos); -} - - -BOOL PictWriter::WritePict(const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pFilterConfigItem ) -{ - PictWriterAttrStackMember* pAt; - MapMode aMap72( MAP_INCH ); - Fraction aDPIFrac( 1, 72 ); - - bStatus=TRUE; - nLastPercent=0; - - if ( pFilterConfigItem ) - { - xStatusIndicator = pFilterConfigItem->GetStatusIndicator(); - if ( xStatusIndicator.is() ) - { - rtl::OUString aMsg; - xStatusIndicator->start( aMsg, 100 ); - } - } - - pPict=&rTargetStream; - pPict->SetNumberFormatInt(NUMBERFORMAT_INT_BIGENDIAN); - - aLineColor=Color( COL_BLACK ); - aFillColor=Color( COL_WHITE ); - eSrcRasterOp=ROP_OVERPAINT; - aSrcFont=Font(); - aSrcMapMode = rMTF.GetPrefMapMode(); - - aMap72.SetScaleX( aDPIFrac ); - aMap72.SetScaleY( aDPIFrac ); - aTargetMapMode = aMap72; - - pAttrStack=NULL; - - bDstBkPatValid=FALSE; - bDstTxFaceValid=FALSE; - bDstTxModeValid=FALSE; - bDstPnSizeValid=FALSE; - bDstPnModeValid=FALSE; - bDstPnPatValid=FALSE; - bDstFillPatValid=FALSE; - bDstTxSizeValid=FALSE; - bDstFgColValid=FALSE; - bDstBkColValid=FALSE; - bDstPenPositionValid=FALSE; - bDstTextPositionValid=FALSE; - bDstFontNameValid=FALSE; - - nNumberOfActions=0; - nNumberOfBitmaps=0; - nWrittenActions=0; - nWrittenBitmaps=0; - nActBitmapPercent=0; - - CountActionsAndBitmaps(rMTF); - - WriteHeader(rMTF); - WriteOpcodes(rMTF); - WriteOpcode_EndOfFile(); - UpdateHeader(); - - while (pAttrStack!=NULL) { - pAt=pAttrStack; - pAttrStack=pAt->pSucc; - delete pAt; - } - - if ( xStatusIndicator.is() ) - xStatusIndicator->end(); - - return bStatus; -} - -//================== GraphicExport - die exportierte Funktion ================ - -extern "C" BOOL __LOADONCALLAPI GraphicExport(SvStream & rStream, Graphic & rGraphic, FilterConfigItem* pFilterConfigItem, BOOL) -{ - PictWriter aPictWriter; - - if (rGraphic.GetType()==GRAPHIC_GDIMETAFILE) - { - GDIMetaFile aScaledMtf( rGraphic.GetGDIMetaFile() ); - -/* - MapMode aMap72( MAP_INCH ); - Fraction aDPIFrac( 1, 72 ); - Size aOldSize = aScaledMtf.GetPrefSize(); - - aMap72.SetScaleX( aDPIFrac ); - aMap72.SetScaleY( aDPIFrac ); - - Size aNewSize = OutputDevice::LogicToLogic( aOldSize, - aScaledMtf.GetPrefMapMode(), - aMap72 ); - - aScaledMtf.Scale( Fraction( aNewSize.Width(), aOldSize.Width() ), - Fraction( aNewSize.Height(), aOldSize.Height() ) ); - aScaledMtf.SetPrefMapMode( aMap72 ); - aScaledMtf.SetPrefSize( aNewSize ); -*/ - - return aPictWriter.WritePict( aScaledMtf, rStream, pFilterConfigItem ); - } - else - { - Bitmap aBmp=rGraphic.GetBitmap(); - GDIMetaFile aMTF; - VirtualDevice aVirDev; - - aMTF.Record(&aVirDev); - aVirDev.DrawBitmap(Point(),aBmp); - aMTF.Stop(); - aMTF.SetPrefSize(aBmp.GetSizePixel()); - return aPictWriter.WritePict( aMTF, rStream, pFilterConfigItem ); - } -} - -//================== GraphicDialog - die exportierte Funktion ================ - -extern "C" BOOL SAL_CALL DoExportDialog( FltCallDialogParameter& rPara ) -{ - BOOL bRet = FALSE; - - if ( rPara.pWindow ) - { - ByteString aResMgrName( "ept" ); - ResMgr* pResMgr; - - pResMgr = ResMgr::CreateResMgr( aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() ); - - if( pResMgr ) - { - rPara.pResMgr = pResMgr; - bRet = ( DlgExportEPCT( rPara ).Execute() == RET_OK ); - delete pResMgr; - } - else - bRet = TRUE; - } - - return bRet; -} - - -//=============================== 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 - |