1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_filter.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <vcl/metaact.hxx>
28*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
29*b1cdbd2cSJim Jagielski #include <svl/solar.hrc>
30*b1cdbd2cSJim Jagielski #include <svtools/fltcall.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <math.h>
33*b1cdbd2cSJim Jagielski #include <vcl/bmpacc.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/metaact.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/graph.hxx>
36*b1cdbd2cSJim Jagielski #include <vcl/bmpacc.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/gradient.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/hatch.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/metric.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/font.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
44*b1cdbd2cSJim Jagielski #include <vcl/gdimtf.hxx>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #include <tools/bigint.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
49*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygon.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski //============================== PictWriter ===================================
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski struct PictWriterAttrStackMember {
54*b1cdbd2cSJim Jagielski 	struct PictWriterAttrStackMember *	pSucc;
55*b1cdbd2cSJim Jagielski 	Color								aLineColor;
56*b1cdbd2cSJim Jagielski 	Color								aFillColor;
57*b1cdbd2cSJim Jagielski 	RasterOp							eRasterOp;
58*b1cdbd2cSJim Jagielski 	Font								aFont;
59*b1cdbd2cSJim Jagielski 	MapMode								aMapMode;
60*b1cdbd2cSJim Jagielski 	Rectangle							aClipRect;
61*b1cdbd2cSJim Jagielski };
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski enum PictDrawingMethod {
65*b1cdbd2cSJim Jagielski 	PDM_FRAME, PDM_PAINT, PDM_ERASE, PDM_INVERT, PDM_FILL
66*b1cdbd2cSJim Jagielski };
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski struct PictPattern {
70*b1cdbd2cSJim Jagielski 	sal_uInt32 nLo, nHi;
71*b1cdbd2cSJim Jagielski };
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski class PictWriter {
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski private:
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 	sal_Bool bStatus;
78*b1cdbd2cSJim Jagielski 	sal_uLong nLastPercent; // Mit welcher Zahl pCallback zuletzt aufgerufen wurde.
79*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Reference< com::sun::star::task::XStatusIndicator > xStatusIndicator;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski 	SvStream * pPict;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	// Aktuelle Attribute im Quell-Metafile:
84*b1cdbd2cSJim Jagielski 	Color		aLineColor;
85*b1cdbd2cSJim Jagielski 	Color		aFillColor;
86*b1cdbd2cSJim Jagielski 	RasterOp	eSrcRasterOp;
87*b1cdbd2cSJim Jagielski 	Font		aSrcFont;
88*b1cdbd2cSJim Jagielski 	MapMode		aSrcMapMode;
89*b1cdbd2cSJim Jagielski 	MapMode		aTargetMapMode;
90*b1cdbd2cSJim Jagielski 	Rectangle	aClipRect;
91*b1cdbd2cSJim Jagielski 	PictWriterAttrStackMember * pAttrStack;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 	// Aktuelle Attribute im Ziel-Metafile, und ob sie gueltig sind
94*b1cdbd2cSJim Jagielski 	sal_Bool		bDstBkPatVisible;   sal_Bool bDstBkPatValid;
95*b1cdbd2cSJim Jagielski 	sal_uInt8        nDstTxFace;			sal_Bool bDstTxFaceValid;
96*b1cdbd2cSJim Jagielski 	RasterOp    eDstTxMode;			sal_Bool bDstTxModeValid;
97*b1cdbd2cSJim Jagielski 	sal_uInt16      nDstPnSize;			sal_Bool bDstPnSizeValid;
98*b1cdbd2cSJim Jagielski 	RasterOp    eDstPnMode;			sal_Bool bDstPnModeValid;
99*b1cdbd2cSJim Jagielski 	PictPattern aDstPnPat;			sal_Bool bDstPnPatValid;
100*b1cdbd2cSJim Jagielski 	sal_Bool		bDstFillPatVisible;	sal_Bool bDstFillPatValid;
101*b1cdbd2cSJim Jagielski 	sal_uInt16      nDstTxSize;			sal_Bool bDstTxSizeValid;
102*b1cdbd2cSJim Jagielski 	Color       aDstFgCol;			sal_Bool bDstFgColValid;
103*b1cdbd2cSJim Jagielski 	Color       aDstBkCol;			sal_Bool bDstBkColValid;
104*b1cdbd2cSJim Jagielski 	Point       aDstPenPosition;	sal_Bool bDstPenPositionValid;
105*b1cdbd2cSJim Jagielski 	Point       aDstTextPosition;	sal_Bool bDstTextPositionValid;
106*b1cdbd2cSJim Jagielski 	String		aDstFontName; sal_uInt16 nDstFontNameId; sal_Bool bDstFontNameValid;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 	sal_uLong nNumberOfActions;  // Anzahl der Actions im GDIMetafile
109*b1cdbd2cSJim Jagielski 	sal_uLong nNumberOfBitmaps;  // Anzahl der Bitmaps
110*b1cdbd2cSJim Jagielski 	sal_uLong nWrittenActions;   // Anzahl der bereits verarbeiteten Actions beim Schreiben der Opcodes
111*b1cdbd2cSJim Jagielski 	sal_uLong nWrittenBitmaps;   // Anzahl der bereits geschriebenen Bitmaps
112*b1cdbd2cSJim Jagielski 	sal_uLong nActBitmapPercent; // Wieviel Prozent die naechste Bitmap schon geschrieben ist.
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	void MayCallback();
115*b1cdbd2cSJim Jagielski 		// Berechnet anhand der obigen 5 Parameter eine Prozentzahl
116*b1cdbd2cSJim Jagielski 		// und macht dann ggf. einen Callback. Setzt bStatus auf sal_False wenn User abbrechen
117*b1cdbd2cSJim Jagielski 		// moechte.
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	void CountActionsAndBitmaps(const GDIMetaFile & rMTF);
120*b1cdbd2cSJim Jagielski 		// Zaehlt die Bitmaps und Actions (nNumberOfActions und nNumberOfBitmaps muessen
121*b1cdbd2cSJim Jagielski 		// zu Anfang auf 0 gesetzt werden, weil diese Methode rekursiv ist)
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	Polygon PolyPolygonToPolygon(const PolyPolygon & rPoly);
124*b1cdbd2cSJim Jagielski 		// Macht aus einem PolyPolygon ein halbwegs vernuenftiges Polygon
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	Rectangle MapRectangle( const Rectangle& rRect );
127*b1cdbd2cSJim Jagielski 	void WritePoint(const Point & rPoint);
128*b1cdbd2cSJim Jagielski 	void WriteSize(const Size & rSize);
129*b1cdbd2cSJim Jagielski 	void WriteRGBColor(const Color & rColor);
130*b1cdbd2cSJim Jagielski 	void WriteString( const String & rString );
131*b1cdbd2cSJim Jagielski 	void WriteRectangle(const Rectangle & rRect);
132*b1cdbd2cSJim Jagielski 	void WritePolygon(const Polygon & rPoly);
133*b1cdbd2cSJim Jagielski 	void WriteArcAngles(const Rectangle & rRect, const Point & rStartPt, const Point & rEndPt);
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 	void ConvertLinePattern(PictPattern & rPat, sal_Bool bVisible);
136*b1cdbd2cSJim Jagielski 	void ConvertFillPattern(PictPattern & rPat, sal_Bool bVisible);
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 	void WriteOpcode_TxFace(const Font & rFont);
139*b1cdbd2cSJim Jagielski 	void WriteOpcode_TxMode(RasterOp eMode);
140*b1cdbd2cSJim Jagielski 	void WriteOpcode_PnSize(sal_uInt16 nSize);
141*b1cdbd2cSJim Jagielski 	void WriteOpcode_PnMode(RasterOp eMode);
142*b1cdbd2cSJim Jagielski 	void WriteOpcode_PnLinePat(sal_Bool bVisible);
143*b1cdbd2cSJim Jagielski 	void WriteOpcode_PnFillPat(sal_Bool bVisible);
144*b1cdbd2cSJim Jagielski 	void WriteOpcode_OvSize(const Size & rSize);
145*b1cdbd2cSJim Jagielski 	void WriteOpcode_TxSize(sal_uInt16 nSize);
146*b1cdbd2cSJim Jagielski 	void WriteOpcode_RGBFgCol(const Color & rColor);
147*b1cdbd2cSJim Jagielski 	void WriteOpcode_RGBBkCol(const Color & rColor);
148*b1cdbd2cSJim Jagielski 	void WriteOpcode_Line(const Point & rLocPt, const Point & rNewPt);
149*b1cdbd2cSJim Jagielski 	void WriteOpcode_LineFrom(const Point & rNewPt);
150*b1cdbd2cSJim Jagielski 	void WriteOpcode_Text(const Point & rPoint, const String& rString, sal_Bool bDelta);
151*b1cdbd2cSJim Jagielski 	void WriteOpcode_FontName(const Font & rFont);
152*b1cdbd2cSJim Jagielski 	void WriteOpcode_ClipRect( const Rectangle& rRect );
153*b1cdbd2cSJim Jagielski 	void WriteOpcode_Rect(PictDrawingMethod eMethod, const Rectangle & rRect);
154*b1cdbd2cSJim Jagielski 	void WriteOpcode_SameRect(PictDrawingMethod eMethod);
155*b1cdbd2cSJim Jagielski 	void WriteOpcode_RRect(PictDrawingMethod eMethod, const Rectangle & rRect);
156*b1cdbd2cSJim Jagielski 	void WriteOpcode_SameRRect(PictDrawingMethod eMethod);
157*b1cdbd2cSJim Jagielski 	void WriteOpcode_Oval(PictDrawingMethod eMethod, const Rectangle & rRect);
158*b1cdbd2cSJim Jagielski 	void WriteOpcode_SameOval(PictDrawingMethod eMethod);
159*b1cdbd2cSJim Jagielski 	void WriteOpcode_Arc(PictDrawingMethod eMethod, const Rectangle & rRect,
160*b1cdbd2cSJim Jagielski 						 const Point & rStartPt, const Point & rEndPt);
161*b1cdbd2cSJim Jagielski 	void WriteOpcode_SameArc(PictDrawingMethod eMethod, const Rectangle & rRect,
162*b1cdbd2cSJim Jagielski 							 const Point & rStartPt, const Point & rEndPt);
163*b1cdbd2cSJim Jagielski 	void WriteOpcode_Poly(PictDrawingMethod eMethod, const Polygon & rPoly);
164*b1cdbd2cSJim Jagielski 	void WriteOpcode_BitsRect(const Point & rPoint, const Size & rSize, const Bitmap & rBitmap);
165*b1cdbd2cSJim Jagielski 	void WriteOpcode_EndOfFile();
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 	void SetAttrForPaint();
168*b1cdbd2cSJim Jagielski 	void SetAttrForFrame();
169*b1cdbd2cSJim Jagielski 	void SetAttrForText();
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 	void WriteTextArray(Point & rPoint, const String& rString, const sal_Int32 * pDXAry);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	void HandleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon);
174*b1cdbd2cSJim Jagielski 	void WriteOpcodes(const GDIMetaFile & rMTF);
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	void WriteHeader(const GDIMetaFile & rMTF);
177*b1cdbd2cSJim Jagielski 	void UpdateHeader();
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski public:
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	sal_Bool WritePict( const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pFilterConfigItem );
182*b1cdbd2cSJim Jagielski };
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski //========================== Methoden von PictWriter ==========================
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 
MayCallback()188*b1cdbd2cSJim Jagielski void PictWriter::MayCallback()
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	if ( xStatusIndicator.is() )
191*b1cdbd2cSJim Jagielski 	{
192*b1cdbd2cSJim Jagielski 		sal_uLong nPercent;
193*b1cdbd2cSJim Jagielski 		nPercent=((nWrittenBitmaps<<14)+(nActBitmapPercent<<14)/100+nWrittenActions)
194*b1cdbd2cSJim Jagielski 				*100
195*b1cdbd2cSJim Jagielski 				/((nNumberOfBitmaps<<14)+nNumberOfActions);
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 		if (nPercent>=nLastPercent+3)
198*b1cdbd2cSJim Jagielski 		{
199*b1cdbd2cSJim Jagielski 			nLastPercent=nPercent;
200*b1cdbd2cSJim Jagielski 			if( nPercent<=100 )
201*b1cdbd2cSJim Jagielski 				xStatusIndicator->setValue( nPercent );
202*b1cdbd2cSJim Jagielski 		}
203*b1cdbd2cSJim Jagielski 	}
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski 
CountActionsAndBitmaps(const GDIMetaFile & rMTF)206*b1cdbd2cSJim Jagielski void PictWriter::CountActionsAndBitmaps(const GDIMetaFile & rMTF)
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	sal_uLong               nAction, nActionCount;
209*b1cdbd2cSJim Jagielski 	const MetaAction*   pMA;
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	nActionCount = rMTF.GetActionCount();
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	for (nAction=0; nAction<nActionCount; nAction++)
214*b1cdbd2cSJim Jagielski 	{
215*b1cdbd2cSJim Jagielski 		pMA = rMTF.GetAction( nAction );
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 		switch( pMA->GetType() )
218*b1cdbd2cSJim Jagielski 		{
219*b1cdbd2cSJim Jagielski 			case META_BMP_ACTION:
220*b1cdbd2cSJim Jagielski 			case META_BMPSCALE_ACTION:
221*b1cdbd2cSJim Jagielski 			case META_BMPSCALEPART_ACTION:
222*b1cdbd2cSJim Jagielski 			case META_BMPEX_ACTION:
223*b1cdbd2cSJim Jagielski 			case META_BMPEXSCALE_ACTION:
224*b1cdbd2cSJim Jagielski 			case META_BMPEXSCALEPART_ACTION:
225*b1cdbd2cSJim Jagielski 				nNumberOfBitmaps++;
226*b1cdbd2cSJim Jagielski 			break;
227*b1cdbd2cSJim Jagielski 		}
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 		nNumberOfActions++;
230*b1cdbd2cSJim Jagielski 	}
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 
PolyPolygonToPolygon(const PolyPolygon & rPolyPoly)234*b1cdbd2cSJim Jagielski Polygon PictWriter::PolyPolygonToPolygon(const PolyPolygon & rPolyPoly)
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount,nSize1,nSize2,np,i1,i2,i3,nBestIdx1,nBestIdx2;
237*b1cdbd2cSJim Jagielski 	long nDistSqr,nBestDistSqr, nCountdownTests;
238*b1cdbd2cSJim Jagielski 	Point aP1,aPRel;
239*b1cdbd2cSJim Jagielski 	Polygon aPoly1, aPoly2, aPoly3;
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	nCount=rPolyPoly.Count();
242*b1cdbd2cSJim Jagielski 	if (nCount==0) return Polygon(0);
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 	aPoly1=rPolyPoly.GetObject(0);
245*b1cdbd2cSJim Jagielski 	for (np=1; np<nCount; np++) {
246*b1cdbd2cSJim Jagielski 		aPoly2=rPolyPoly.GetObject(np);
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 		//-----------------Folgendes verschmilzt aPoly1 und aPoly2 zu aPoly1-----------------
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 		nSize1=aPoly1.GetSize();
251*b1cdbd2cSJim Jagielski 		nSize2=aPoly2.GetSize();
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 		// Zunaechst werden ein Punkt in aPoly1 (referenziert durch nBestIdx1) und ein
254*b1cdbd2cSJim Jagielski 		// Punkt in aPoly2 (referenziert durch nBestIdx2) gesucht, die moeglichst dicht
255*b1cdbd2cSJim Jagielski 		// beieinander liegen. Da dies mit quadratischem Aufwand einher geht, und somit
256*b1cdbd2cSJim Jagielski 		// manche Bilder Ewigkeiten benoetigen, um exportiert zu werden, begrenzen wir
257*b1cdbd2cSJim Jagielski 		// die Anzahl der Tests auf 1000, und brechen die Suche ggf. schon vorher ab.
258*b1cdbd2cSJim Jagielski 		// Dadruch wird das Ergebnis nicht falsch, sondern eventuell nicht so schoen.
259*b1cdbd2cSJim Jagielski 		nCountdownTests=1000;
260*b1cdbd2cSJim Jagielski 		nBestDistSqr=0x7fffffff;
261*b1cdbd2cSJim Jagielski 		nBestIdx1=0;
262*b1cdbd2cSJim Jagielski 		nBestIdx2=0;
263*b1cdbd2cSJim Jagielski 		for (i1=0; i1<nSize1; i1++) {
264*b1cdbd2cSJim Jagielski 			aP1=aPoly1.GetPoint(i1);
265*b1cdbd2cSJim Jagielski 			for (i2=0; i2<nSize2; i2++) {
266*b1cdbd2cSJim Jagielski 				aPRel=aPoly2.GetPoint(i2); aPRel-=aP1;
267*b1cdbd2cSJim Jagielski 				nDistSqr=aPRel.X()*aPRel.X()+aPRel.Y()*aPRel.Y();
268*b1cdbd2cSJim Jagielski 				if (nDistSqr<nBestDistSqr) {
269*b1cdbd2cSJim Jagielski 					nBestIdx1=i1;
270*b1cdbd2cSJim Jagielski 					nBestIdx2=i2;
271*b1cdbd2cSJim Jagielski 					nBestDistSqr=nDistSqr;
272*b1cdbd2cSJim Jagielski 				}
273*b1cdbd2cSJim Jagielski 				if (nCountdownTests<=0) break;
274*b1cdbd2cSJim Jagielski 				nCountdownTests--;
275*b1cdbd2cSJim Jagielski 			}
276*b1cdbd2cSJim Jagielski 			if (nCountdownTests<=0) break;
277*b1cdbd2cSJim Jagielski 		}
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 		// Nun werden aPoly1 und aPoly2 zu einem Polygon aPoly3 (spaeter aPoly1) zusammengefuegt.
280*b1cdbd2cSJim Jagielski 		// Die beiden Polygone werden verbunden durch zwei zusaetzliche Kanten zwischen den oben
281*b1cdbd2cSJim Jagielski 		// gefundenen Punkten.
282*b1cdbd2cSJim Jagielski 		aPoly3.Clear();
283*b1cdbd2cSJim Jagielski 		aPoly3.SetSize(nSize1+nSize2+2);
284*b1cdbd2cSJim Jagielski 		i3=0;
285*b1cdbd2cSJim Jagielski 		for (i1=nBestIdx1; i1<nSize1;     i1++) aPoly3.SetPoint(aPoly1.GetPoint(i1),i3++);
286*b1cdbd2cSJim Jagielski 		for (i1=0;         i1<=nBestIdx1; i1++) aPoly3.SetPoint(aPoly1.GetPoint(i1),i3++);
287*b1cdbd2cSJim Jagielski 		for (i2=nBestIdx2; i2<nSize2;     i2++) aPoly3.SetPoint(aPoly2.GetPoint(i2),i3++);
288*b1cdbd2cSJim Jagielski 		for (i2=0;         i2<=nBestIdx2; i2++) aPoly3.SetPoint(aPoly2.GetPoint(i2),i3++);
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 		aPoly1=aPoly3;
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 		//-----------------------------------------------------------------------------------
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	}
295*b1cdbd2cSJim Jagielski 	return aPoly1;
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 
WritePoint(const Point & rPoint)299*b1cdbd2cSJim Jagielski void PictWriter::WritePoint(const Point & rPoint)
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski 	Point aPoint = OutputDevice::LogicToLogic( rPoint, aSrcMapMode, aTargetMapMode );
302*b1cdbd2cSJim Jagielski 	*pPict << ((short)aPoint.Y()) << ((short)aPoint.X());
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 
WriteSize(const Size & rSize)306*b1cdbd2cSJim Jagielski void PictWriter::WriteSize(const Size & rSize)
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	OutputDevice::LogicToLogic( rSize, aSrcMapMode, aTargetMapMode ); // -Wall is this needed.
309*b1cdbd2cSJim Jagielski 	*pPict << ((short)rSize.Height()) << ((short)rSize.Width());
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 
WriteRGBColor(const Color & rColor)313*b1cdbd2cSJim Jagielski void PictWriter::WriteRGBColor(const Color & rColor)
314*b1cdbd2cSJim Jagielski {
315*b1cdbd2cSJim Jagielski 	const sal_uInt16 nR = ( (sal_uInt16) rColor.GetRed() << 8 ) | (sal_uInt16) rColor.GetRed();
316*b1cdbd2cSJim Jagielski 	const sal_uInt16 nG = ( (sal_uInt16) rColor.GetGreen() << 8 ) | (sal_uInt16) rColor.GetGreen();
317*b1cdbd2cSJim Jagielski 	const sal_uInt16 nB = ( (sal_uInt16) rColor.GetBlue() << 8 ) | (sal_uInt16) rColor.GetBlue();
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	*pPict << nR << nG << nB;
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 
WriteString(const String & rString)323*b1cdbd2cSJim Jagielski void PictWriter::WriteString( const String & rString )
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski 	sal_uInt16 i,nLen;
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	ByteString aByteString( rString, gsl_getSystemTextEncoding() );
328*b1cdbd2cSJim Jagielski 	nLen = aByteString.Len();
329*b1cdbd2cSJim Jagielski 	if ( nLen > 255 )
330*b1cdbd2cSJim Jagielski 		nLen = 255;
331*b1cdbd2cSJim Jagielski 	*pPict << ( (sal_uInt8)nLen );
332*b1cdbd2cSJim Jagielski 	for ( i = 0; i < nLen; i++ )
333*b1cdbd2cSJim Jagielski 		*pPict << aByteString.GetChar( i );
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
MapRectangle(const Rectangle & rRect)336*b1cdbd2cSJim Jagielski Rectangle PictWriter::MapRectangle( const Rectangle& rRect )
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski 	Point   aPoint = OutputDevice::LogicToLogic( rRect.TopLeft(), aSrcMapMode, aTargetMapMode );
339*b1cdbd2cSJim Jagielski 	Size    aSize = OutputDevice::LogicToLogic( rRect.GetSize(), aSrcMapMode, aTargetMapMode );
340*b1cdbd2cSJim Jagielski 	Rectangle aRect( aPoint, aSize );
341*b1cdbd2cSJim Jagielski 	aRect.Justify();
342*b1cdbd2cSJim Jagielski 	aRect.nBottom++;
343*b1cdbd2cSJim Jagielski 	aRect.nRight++;
344*b1cdbd2cSJim Jagielski 	return aRect;
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski 
WriteRectangle(const Rectangle & rRect)347*b1cdbd2cSJim Jagielski void PictWriter::WriteRectangle(const Rectangle & rRect)
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	Rectangle aRect( MapRectangle( rRect ) );
350*b1cdbd2cSJim Jagielski 	*pPict	<< (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left()
351*b1cdbd2cSJim Jagielski 			<< (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right();
352*b1cdbd2cSJim Jagielski }
353*b1cdbd2cSJim Jagielski 
WritePolygon(const Polygon & rPoly)354*b1cdbd2cSJim Jagielski void PictWriter::WritePolygon(const Polygon & rPoly)
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski 	sal_uInt16 nDataSize,i,nSize;
357*b1cdbd2cSJim Jagielski 	short nMinX = 0, nMinY = 0, nMaxX = 0, nMaxY = 0;
358*b1cdbd2cSJim Jagielski 	short nx,ny;
359*b1cdbd2cSJim Jagielski 	Polygon aPoly(rPoly);
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	nSize=aPoly.GetSize();
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	if (aPoly.GetPoint(0) != aPoly.GetPoint(nSize-1))
364*b1cdbd2cSJim Jagielski 	{
365*b1cdbd2cSJim Jagielski 		nSize++;
366*b1cdbd2cSJim Jagielski 		aPoly.SetSize(nSize);
367*b1cdbd2cSJim Jagielski 		aPoly.SetPoint(aPoly.GetPoint(0),nSize-1);
368*b1cdbd2cSJim Jagielski 	}
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski 	nDataSize=nSize*4+10;
371*b1cdbd2cSJim Jagielski 	for (i=0; i<nSize; i++)
372*b1cdbd2cSJim Jagielski 	{
373*b1cdbd2cSJim Jagielski 		Point aPoint = OutputDevice::LogicToLogic( aPoly.GetPoint( i ),
374*b1cdbd2cSJim Jagielski 												   aSrcMapMode,
375*b1cdbd2cSJim Jagielski 												   aTargetMapMode );
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 		nx = (short) aPoint.X();
378*b1cdbd2cSJim Jagielski 		ny = (short) aPoint.Y();
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 		if ( i==0 || nMinX>nx )
381*b1cdbd2cSJim Jagielski 			nMinX=nx;
382*b1cdbd2cSJim Jagielski 		if ( i==0 || nMinY>ny )
383*b1cdbd2cSJim Jagielski 			nMinY=ny;
384*b1cdbd2cSJim Jagielski 		if ( i==0 || nMaxX<nx )
385*b1cdbd2cSJim Jagielski 			nMaxX=nx;
386*b1cdbd2cSJim Jagielski 		if ( i==0 || nMaxY<ny )
387*b1cdbd2cSJim Jagielski 			nMaxY=ny;
388*b1cdbd2cSJim Jagielski 	}
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 	*pPict << nDataSize << nMinY << nMinX << nMaxY << nMaxX;
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 	for (i=0; i<nSize; i++)
393*b1cdbd2cSJim Jagielski 		WritePoint( aPoly.GetPoint(i) );
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski 
WriteArcAngles(const Rectangle & rRect,const Point & rStartPt,const Point & rEndPt)397*b1cdbd2cSJim Jagielski void PictWriter::WriteArcAngles(const Rectangle & rRect, const Point & rStartPt, const Point & rEndPt)
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski 	Point       aStartPt = OutputDevice::LogicToLogic( rStartPt,
400*b1cdbd2cSJim Jagielski 													   aSrcMapMode,
401*b1cdbd2cSJim Jagielski 													   aTargetMapMode );
402*b1cdbd2cSJim Jagielski 	Point       aEndPt = OutputDevice::LogicToLogic( rEndPt,
403*b1cdbd2cSJim Jagielski 													 aSrcMapMode,
404*b1cdbd2cSJim Jagielski 													 aTargetMapMode );
405*b1cdbd2cSJim Jagielski 	Rectangle   aRect( OutputDevice::LogicToLogic( rRect.TopLeft(),
406*b1cdbd2cSJim Jagielski 												   aSrcMapMode,
407*b1cdbd2cSJim Jagielski 												   aTargetMapMode ),
408*b1cdbd2cSJim Jagielski 					   OutputDevice::LogicToLogic( rRect.GetSize(),
409*b1cdbd2cSJim Jagielski 												   aSrcMapMode,
410*b1cdbd2cSJim Jagielski 												   aTargetMapMode ) );
411*b1cdbd2cSJim Jagielski 	Point aCenter;
412*b1cdbd2cSJim Jagielski 	double fAngS, fAngE, fdx, fdy;
413*b1cdbd2cSJim Jagielski 	short nStartAngle, nArcAngle;
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 	aCenter=Point( ( aRect.Left() + aRect.Right() ) >> 1,
417*b1cdbd2cSJim Jagielski 				   ( aRect.Top() + aRect.Bottom() ) >> 1 );
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 	fdx=(double)(aStartPt.X()-aCenter.X());
420*b1cdbd2cSJim Jagielski 	fdy=(double)(aStartPt.Y()-aCenter.Y());
421*b1cdbd2cSJim Jagielski 	if ( fdx==0.0 && fdy==0.0 )
422*b1cdbd2cSJim Jagielski 		fdx=1.0;
423*b1cdbd2cSJim Jagielski 	fAngE=atan2(fdx,-fdy);
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 	fdx=(double)(aEndPt.X()-aCenter.X());
426*b1cdbd2cSJim Jagielski 	fdy=(double)(aEndPt.Y()-aCenter.Y());
427*b1cdbd2cSJim Jagielski 	if ( fdx==0.0 && fdy==0.0 )
428*b1cdbd2cSJim Jagielski 		fdx=1.0;
429*b1cdbd2cSJim Jagielski 	fAngS=atan2(fdx,-fdy);
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 	nStartAngle=(short)(fAngS*180.0/3.14159265359);
432*b1cdbd2cSJim Jagielski 	nArcAngle=((short)(fAngE*180.0/3.14159265359))-nStartAngle;
433*b1cdbd2cSJim Jagielski 	if (nArcAngle<0)
434*b1cdbd2cSJim Jagielski 		nArcAngle += 360;
435*b1cdbd2cSJim Jagielski 	*pPict << nStartAngle << nArcAngle;
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 
ConvertLinePattern(PictPattern & rPat,sal_Bool bVisible)439*b1cdbd2cSJim Jagielski void PictWriter::ConvertLinePattern(PictPattern & rPat, sal_Bool bVisible)
440*b1cdbd2cSJim Jagielski {
441*b1cdbd2cSJim Jagielski 	if( bVisible )
442*b1cdbd2cSJim Jagielski 	{
443*b1cdbd2cSJim Jagielski 		rPat.nHi=0xffffffff;
444*b1cdbd2cSJim Jagielski 		rPat.nLo=0xffffffff;
445*b1cdbd2cSJim Jagielski 	}
446*b1cdbd2cSJim Jagielski 	else
447*b1cdbd2cSJim Jagielski 	{
448*b1cdbd2cSJim Jagielski 		rPat.nHi=0x00000000;
449*b1cdbd2cSJim Jagielski 		rPat.nLo=0x00000000;
450*b1cdbd2cSJim Jagielski 	}
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski 
ConvertFillPattern(PictPattern & rPat,sal_Bool bVisible)453*b1cdbd2cSJim Jagielski void PictWriter::ConvertFillPattern(PictPattern & rPat, sal_Bool bVisible)
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski 	if( bVisible )
456*b1cdbd2cSJim Jagielski 	{
457*b1cdbd2cSJim Jagielski 		rPat.nHi=0xffffffff;
458*b1cdbd2cSJim Jagielski 		rPat.nLo=0xffffffff;
459*b1cdbd2cSJim Jagielski 	}
460*b1cdbd2cSJim Jagielski 	else
461*b1cdbd2cSJim Jagielski 	{
462*b1cdbd2cSJim Jagielski 		rPat.nHi=0x00000000;
463*b1cdbd2cSJim Jagielski 		rPat.nLo=0x00000000;
464*b1cdbd2cSJim Jagielski 	}
465*b1cdbd2cSJim Jagielski }
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 
WriteOpcode_TxFace(const Font & rFont)468*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_TxFace(const Font & rFont)
469*b1cdbd2cSJim Jagielski {
470*b1cdbd2cSJim Jagielski 	sal_uInt8 nFace;
471*b1cdbd2cSJim Jagielski 	FontWeight eWeight;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 	nFace=0;
474*b1cdbd2cSJim Jagielski 	eWeight=rFont.GetWeight();
475*b1cdbd2cSJim Jagielski 	if (eWeight==WEIGHT_BOLD ||
476*b1cdbd2cSJim Jagielski 		eWeight==WEIGHT_SEMIBOLD ||
477*b1cdbd2cSJim Jagielski 		eWeight==WEIGHT_ULTRABOLD ||
478*b1cdbd2cSJim Jagielski 		eWeight==WEIGHT_BLACK)                nFace|=0x01;
479*b1cdbd2cSJim Jagielski 	if (rFont.GetItalic()!=ITALIC_NONE)       nFace|=0x02;
480*b1cdbd2cSJim Jagielski 	if (rFont.GetUnderline()!=UNDERLINE_NONE) nFace|=0x04;
481*b1cdbd2cSJim Jagielski 	if (rFont.IsOutline()==sal_True)              nFace|=0x08;
482*b1cdbd2cSJim Jagielski 	if (rFont.IsShadow()==sal_True)               nFace|=0x10;
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	if (bDstTxFaceValid==sal_False || nDstTxFace!=nFace) {
485*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0004 << nFace << (sal_uInt8)0;
486*b1cdbd2cSJim Jagielski 		nDstTxFace=nFace;
487*b1cdbd2cSJim Jagielski 		bDstTxFaceValid=sal_True;
488*b1cdbd2cSJim Jagielski 	}
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski 
WriteOpcode_TxMode(RasterOp eMode)492*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_TxMode(RasterOp eMode)
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski 	sal_uInt16 nVal;
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski 	if (bDstTxModeValid==sal_False || eDstTxMode!=eMode) {
497*b1cdbd2cSJim Jagielski 		switch (eMode) {
498*b1cdbd2cSJim Jagielski 			case ROP_INVERT: nVal=0x000c; break;
499*b1cdbd2cSJim Jagielski 			case ROP_XOR:    nVal=0x000a; break;
500*b1cdbd2cSJim Jagielski 			default:         nVal=0x0008;
501*b1cdbd2cSJim Jagielski 		}
502*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0005 << nVal;
503*b1cdbd2cSJim Jagielski 		eDstTxMode=eMode;
504*b1cdbd2cSJim Jagielski 		bDstTxModeValid=sal_True;
505*b1cdbd2cSJim Jagielski 	}
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 
WriteOpcode_PnSize(sal_uInt16 nSize)509*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_PnSize(sal_uInt16 nSize)
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski 	if (nSize==0) nSize=1;
512*b1cdbd2cSJim Jagielski 	if (bDstPnSizeValid==sal_False || nDstPnSize!=nSize) {
513*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0007 << nSize << nSize;
514*b1cdbd2cSJim Jagielski 		nDstPnSize=nSize;
515*b1cdbd2cSJim Jagielski 		bDstPnSizeValid=sal_True;
516*b1cdbd2cSJim Jagielski 	}
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski 
WriteOpcode_PnMode(RasterOp eMode)520*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_PnMode(RasterOp eMode)
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	sal_uInt16 nVal;
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski 	if (bDstPnModeValid==sal_False || eDstPnMode!=eMode) {
525*b1cdbd2cSJim Jagielski 		switch (eMode)
526*b1cdbd2cSJim Jagielski 		{
527*b1cdbd2cSJim Jagielski 			case ROP_INVERT: nVal=0x000c; break;
528*b1cdbd2cSJim Jagielski 			case ROP_XOR:    nVal=0x000a; break;
529*b1cdbd2cSJim Jagielski 			default:         nVal=0x0008;
530*b1cdbd2cSJim Jagielski 		}
531*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0008 << nVal;
532*b1cdbd2cSJim Jagielski 		eDstPnMode=eMode;
533*b1cdbd2cSJim Jagielski 		bDstPnModeValid=sal_True;
534*b1cdbd2cSJim Jagielski 	}
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 
WriteOpcode_PnLinePat(sal_Bool bVisible)538*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_PnLinePat(sal_Bool bVisible)
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski 	PictPattern aPat;
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 	ConvertLinePattern(aPat,bVisible);
543*b1cdbd2cSJim Jagielski 	if (bDstPnPatValid==sal_False || aDstPnPat.nHi!=aPat.nHi || aDstPnPat.nLo!=aPat.nLo) {
544*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0009 << aPat.nHi << aPat.nLo;
545*b1cdbd2cSJim Jagielski 		aDstPnPat=aPat;
546*b1cdbd2cSJim Jagielski 		bDstPnPatValid=sal_True;
547*b1cdbd2cSJim Jagielski 	}
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski 
WriteOpcode_PnFillPat(sal_Bool bVisible)551*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_PnFillPat(sal_Bool bVisible)
552*b1cdbd2cSJim Jagielski {
553*b1cdbd2cSJim Jagielski 	PictPattern aPat;
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 	ConvertFillPattern(aPat,bVisible);
556*b1cdbd2cSJim Jagielski 	if (bDstPnPatValid==sal_False || aDstPnPat.nHi!=aPat.nHi || aDstPnPat.nLo!=aPat.nLo) {
557*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0009 << aPat.nHi << aPat.nLo;
558*b1cdbd2cSJim Jagielski 		aDstPnPat=aPat;
559*b1cdbd2cSJim Jagielski 		bDstPnPatValid=sal_True;
560*b1cdbd2cSJim Jagielski 	}
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 
WriteOpcode_OvSize(const Size & rSize)564*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_OvSize(const Size & rSize)
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt16)0x000b;
567*b1cdbd2cSJim Jagielski 	WriteSize(rSize);
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 
WriteOpcode_TxSize(sal_uInt16 nSize)571*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_TxSize(sal_uInt16 nSize)
572*b1cdbd2cSJim Jagielski {
573*b1cdbd2cSJim Jagielski 	if (bDstTxSizeValid==sal_False || nDstTxSize!=nSize) {
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 		nDstTxSize = (sal_uInt16) OutputDevice::LogicToLogic( Size( 0, nSize ),
576*b1cdbd2cSJim Jagielski 														  aSrcMapMode, aTargetMapMode ).Height();
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x000d << nDstTxSize;
579*b1cdbd2cSJim Jagielski 		bDstTxSizeValid=sal_True;
580*b1cdbd2cSJim Jagielski 	}
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 
WriteOpcode_RGBFgCol(const Color & rColor)584*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_RGBFgCol(const Color & rColor)
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski 	if (bDstFgColValid==sal_False || aDstFgCol!=rColor) {
587*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x001a;
588*b1cdbd2cSJim Jagielski 		WriteRGBColor(rColor);
589*b1cdbd2cSJim Jagielski 		aDstFgCol=rColor;
590*b1cdbd2cSJim Jagielski 		bDstFgColValid=sal_True;
591*b1cdbd2cSJim Jagielski 	}
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 
WriteOpcode_RGBBkCol(const Color & rColor)595*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_RGBBkCol(const Color & rColor)
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski 	if (bDstBkColValid==sal_False || aDstBkCol!=rColor) {
598*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x001b;
599*b1cdbd2cSJim Jagielski 		WriteRGBColor(rColor);
600*b1cdbd2cSJim Jagielski 		aDstBkCol=rColor;
601*b1cdbd2cSJim Jagielski 		bDstBkColValid=sal_True;
602*b1cdbd2cSJim Jagielski 	}
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 
WriteOpcode_Line(const Point & rLocPt,const Point & rNewPt)606*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Line(const Point & rLocPt, const Point & rNewPt)
607*b1cdbd2cSJim Jagielski {
608*b1cdbd2cSJim Jagielski 	Point aLocPt = OutputDevice::LogicToLogic( rLocPt,
609*b1cdbd2cSJim Jagielski 											   aSrcMapMode,
610*b1cdbd2cSJim Jagielski 											   aTargetMapMode );
611*b1cdbd2cSJim Jagielski 	Point aNewPt = OutputDevice::LogicToLogic( rNewPt,
612*b1cdbd2cSJim Jagielski 											   aSrcMapMode,
613*b1cdbd2cSJim Jagielski 											   aTargetMapMode );
614*b1cdbd2cSJim Jagielski 	long  dh,dv;
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski 	dh=aNewPt.X()-aLocPt.X();
617*b1cdbd2cSJim Jagielski 	dv=aNewPt.Y()-aLocPt.Y();
618*b1cdbd2cSJim Jagielski 	if (dh<=127 && dh>=-128 && dv<=127 && dv>=-128)
619*b1cdbd2cSJim Jagielski 	{ // ShortLine
620*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0022;
621*b1cdbd2cSJim Jagielski 		WritePoint(rLocPt);
622*b1cdbd2cSJim Jagielski 		*pPict << (char)dh << (char)dv;
623*b1cdbd2cSJim Jagielski 	}
624*b1cdbd2cSJim Jagielski 	else
625*b1cdbd2cSJim Jagielski 	{
626*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0020;
627*b1cdbd2cSJim Jagielski 		WritePoint(rLocPt);
628*b1cdbd2cSJim Jagielski 		WritePoint(rNewPt);
629*b1cdbd2cSJim Jagielski 	}
630*b1cdbd2cSJim Jagielski 	aDstPenPosition=rNewPt;
631*b1cdbd2cSJim Jagielski 	bDstPenPositionValid=sal_True;
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 
WriteOpcode_LineFrom(const Point & rNewPt)635*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_LineFrom(const Point & rNewPt)
636*b1cdbd2cSJim Jagielski {
637*b1cdbd2cSJim Jagielski 	Point aNewPt = OutputDevice::LogicToLogic( rNewPt,
638*b1cdbd2cSJim Jagielski 											   aSrcMapMode,
639*b1cdbd2cSJim Jagielski 											   aTargetMapMode );
640*b1cdbd2cSJim Jagielski 	long  dh,dv;
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski 	dh = aNewPt.X()-aDstPenPosition.X();
643*b1cdbd2cSJim Jagielski 	dv = aNewPt.Y()-aDstPenPosition.Y();
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski 	if (dh<=127 && dh>=-128 && dv<=127 && dv>=-128)
646*b1cdbd2cSJim Jagielski 	{ // ShortLine
647*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0023;
648*b1cdbd2cSJim Jagielski 		*pPict << (char)dh << (char)dv;
649*b1cdbd2cSJim Jagielski 	}
650*b1cdbd2cSJim Jagielski 	else
651*b1cdbd2cSJim Jagielski 	{
652*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0021;
653*b1cdbd2cSJim Jagielski 		WritePoint(rNewPt);
654*b1cdbd2cSJim Jagielski 	}
655*b1cdbd2cSJim Jagielski 	aDstPenPosition=rNewPt;
656*b1cdbd2cSJim Jagielski 	bDstPenPositionValid=sal_True;
657*b1cdbd2cSJim Jagielski }
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 
WriteOpcode_Text(const Point & rPoint,const String & rString,sal_Bool bDelta)660*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Text(const Point & rPoint, const String& rString, sal_Bool bDelta)
661*b1cdbd2cSJim Jagielski {
662*b1cdbd2cSJim Jagielski 	Point aPoint = OutputDevice::LogicToLogic( rPoint,
663*b1cdbd2cSJim Jagielski 											   aSrcMapMode,
664*b1cdbd2cSJim Jagielski 											   aTargetMapMode );
665*b1cdbd2cSJim Jagielski 	long  dh,dv;
666*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski 	nPos = pPict->Tell();
669*b1cdbd2cSJim Jagielski 	dh = aPoint.X()-aDstTextPosition.X();
670*b1cdbd2cSJim Jagielski 	dv = aPoint.Y()-aDstTextPosition.Y();
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski 	if (bDstTextPositionValid==sal_False || dh<0 || dh>255 || dv<0 || dv>0 || bDelta==sal_False)
673*b1cdbd2cSJim Jagielski 	{
674*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0028;
675*b1cdbd2cSJim Jagielski 		WritePoint(rPoint);
676*b1cdbd2cSJim Jagielski 	}
677*b1cdbd2cSJim Jagielski 	else if (dv==0)
678*b1cdbd2cSJim Jagielski 	{
679*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0029 << (sal_uInt8)dh;
680*b1cdbd2cSJim Jagielski 	}
681*b1cdbd2cSJim Jagielski 	else if (dh==0)
682*b1cdbd2cSJim Jagielski 	{
683*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x002a << (sal_uInt8)dv;
684*b1cdbd2cSJim Jagielski 	}
685*b1cdbd2cSJim Jagielski 	else
686*b1cdbd2cSJim Jagielski 	{
687*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x002b << (sal_uInt8)dh << (sal_uInt8)dv;
688*b1cdbd2cSJim Jagielski 	}
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski 	WriteString( rString );
691*b1cdbd2cSJim Jagielski 	if (((pPict->Tell()-nPos)&1)!=0)
692*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt8)0;
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	aDstTextPosition = aPoint;
695*b1cdbd2cSJim Jagielski 	bDstTextPositionValid=sal_True;
696*b1cdbd2cSJim Jagielski }
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski 
WriteOpcode_FontName(const Font & rFont)699*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_FontName(const Font & rFont)
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski 	sal_uInt16 nDataLen,nFontId;
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 	switch (rFont.GetFamily()) {
704*b1cdbd2cSJim Jagielski 		case FAMILY_MODERN:     nFontId=22; break;
705*b1cdbd2cSJim Jagielski 		case FAMILY_ROMAN:      nFontId=20; break;
706*b1cdbd2cSJim Jagielski 		case FAMILY_SWISS:      nFontId=21; break;
707*b1cdbd2cSJim Jagielski 		default:                nFontId=1;
708*b1cdbd2cSJim Jagielski 	}
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski 	if (bDstFontNameValid==sal_False || nDstFontNameId!=nFontId || aDstFontName!=rFont.GetName())
711*b1cdbd2cSJim Jagielski 	{
712*b1cdbd2cSJim Jagielski 		ByteString aByteString( rFont.GetName(), gsl_getSystemTextEncoding() );
713*b1cdbd2cSJim Jagielski 		sal_uInt16 nFontNameLen = aByteString.Len();
714*b1cdbd2cSJim Jagielski 		if ( nFontNameLen )
715*b1cdbd2cSJim Jagielski 		{
716*b1cdbd2cSJim Jagielski 			nDataLen = 3 + nFontNameLen;
717*b1cdbd2cSJim Jagielski 			*pPict << (sal_uInt16)0x002c << nDataLen << nFontId;
718*b1cdbd2cSJim Jagielski 			WriteString( rFont.GetName() );
719*b1cdbd2cSJim Jagielski 			if ( ( nFontNameLen & 1 ) == 0 )
720*b1cdbd2cSJim Jagielski 				*pPict << (sal_uInt8)0;
721*b1cdbd2cSJim Jagielski 		}
722*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0003 << nFontId;
723*b1cdbd2cSJim Jagielski 		aDstFontName=rFont.GetName();
724*b1cdbd2cSJim Jagielski 		nDstFontNameId=nFontId;
725*b1cdbd2cSJim Jagielski 		bDstFontNameValid=sal_True;
726*b1cdbd2cSJim Jagielski 	}
727*b1cdbd2cSJim Jagielski }
728*b1cdbd2cSJim Jagielski 
WriteOpcode_ClipRect(const Rectangle & rRect)729*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_ClipRect( const Rectangle& rRect )
730*b1cdbd2cSJim Jagielski {
731*b1cdbd2cSJim Jagielski 	Rectangle aRect( MapRectangle( rRect ) );
732*b1cdbd2cSJim Jagielski 	aRect.nBottom++;
733*b1cdbd2cSJim Jagielski 	aRect.nRight++;
734*b1cdbd2cSJim Jagielski 	*pPict	<< (sal_uInt16)1	// opcode 1
735*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)10	// data size
736*b1cdbd2cSJim Jagielski 			<< (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left()
737*b1cdbd2cSJim Jagielski 			<< (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right();
738*b1cdbd2cSJim Jagielski 	aClipRect = aRect;
739*b1cdbd2cSJim Jagielski }
740*b1cdbd2cSJim Jagielski 
WriteOpcode_Rect(PictDrawingMethod eMethod,const Rectangle & rRect)741*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Rect(PictDrawingMethod eMethod, const Rectangle & rRect)
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
744*b1cdbd2cSJim Jagielski 	switch (eMethod) {
745*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0030; break;
746*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0031; break;
747*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x0032; break;
748*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x0033; break;
749*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x0034; break;
750*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
751*b1cdbd2cSJim Jagielski 	}
752*b1cdbd2cSJim Jagielski 	*pPict << oc;
753*b1cdbd2cSJim Jagielski 	WriteRectangle(rRect);
754*b1cdbd2cSJim Jagielski }
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski 
WriteOpcode_SameRect(PictDrawingMethod eMethod)757*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_SameRect(PictDrawingMethod eMethod)
758*b1cdbd2cSJim Jagielski {
759*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
760*b1cdbd2cSJim Jagielski 	switch (eMethod) {
761*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0038; break;
762*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0039; break;
763*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x003a; break;
764*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x003b; break;
765*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x003c; break;
766*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
767*b1cdbd2cSJim Jagielski 	}
768*b1cdbd2cSJim Jagielski 	*pPict << oc;
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski 
WriteOpcode_RRect(PictDrawingMethod eMethod,const Rectangle & rRect)772*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_RRect(PictDrawingMethod eMethod, const Rectangle & rRect)
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
775*b1cdbd2cSJim Jagielski 	switch (eMethod) {
776*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0040; break;
777*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0041; break;
778*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x0042; break;
779*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x0043; break;
780*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x0044; break;
781*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
782*b1cdbd2cSJim Jagielski 	}
783*b1cdbd2cSJim Jagielski 	*pPict << oc;
784*b1cdbd2cSJim Jagielski 	WriteRectangle(rRect);
785*b1cdbd2cSJim Jagielski }
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski 
WriteOpcode_SameRRect(PictDrawingMethod eMethod)788*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_SameRRect(PictDrawingMethod eMethod)
789*b1cdbd2cSJim Jagielski {
790*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
791*b1cdbd2cSJim Jagielski 	switch (eMethod) {
792*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0048; break;
793*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0049; break;
794*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x004a; break;
795*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x004b; break;
796*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x004c; break;
797*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
798*b1cdbd2cSJim Jagielski 	}
799*b1cdbd2cSJim Jagielski 	*pPict << oc;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski 
WriteOpcode_Oval(PictDrawingMethod eMethod,const Rectangle & rRect)803*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Oval(PictDrawingMethod eMethod, const Rectangle & rRect)
804*b1cdbd2cSJim Jagielski {
805*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
806*b1cdbd2cSJim Jagielski 	switch (eMethod) {
807*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0050; break;
808*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0051; break;
809*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x0052; break;
810*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x0053; break;
811*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x0054; break;
812*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
813*b1cdbd2cSJim Jagielski 	}
814*b1cdbd2cSJim Jagielski 	*pPict << oc;
815*b1cdbd2cSJim Jagielski 	WriteRectangle(rRect);
816*b1cdbd2cSJim Jagielski }
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 
WriteOpcode_SameOval(PictDrawingMethod eMethod)819*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_SameOval(PictDrawingMethod eMethod)
820*b1cdbd2cSJim Jagielski {
821*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
822*b1cdbd2cSJim Jagielski 	switch (eMethod) {
823*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0058; break;
824*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0059; break;
825*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x005a; break;
826*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x005b; break;
827*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x005c; break;
828*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
829*b1cdbd2cSJim Jagielski 	}
830*b1cdbd2cSJim Jagielski 	*pPict << oc;
831*b1cdbd2cSJim Jagielski }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski 
WriteOpcode_Arc(PictDrawingMethod eMethod,const Rectangle & rRect,const Point & rStartPt,const Point & rEndPt)834*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Arc(PictDrawingMethod eMethod, const Rectangle & rRect,
835*b1cdbd2cSJim Jagielski 								 const Point & rStartPt, const Point & rEndPt)
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
838*b1cdbd2cSJim Jagielski 	switch (eMethod) {
839*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0060; break;
840*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0061; break;
841*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x0062; break;
842*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x0063; break;
843*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x0064; break;
844*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
845*b1cdbd2cSJim Jagielski 	}
846*b1cdbd2cSJim Jagielski 	*pPict << oc;
847*b1cdbd2cSJim Jagielski 	WriteRectangle(rRect);
848*b1cdbd2cSJim Jagielski 	WriteArcAngles(rRect,rStartPt,rEndPt);
849*b1cdbd2cSJim Jagielski }
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski 
WriteOpcode_SameArc(PictDrawingMethod eMethod,const Rectangle & rRect,const Point & rStartPt,const Point & rEndPt)852*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_SameArc(PictDrawingMethod eMethod, const Rectangle & rRect,
853*b1cdbd2cSJim Jagielski 									 const Point & rStartPt, const Point & rEndPt)
854*b1cdbd2cSJim Jagielski {
855*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
856*b1cdbd2cSJim Jagielski 	switch (eMethod) {
857*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0068; break;
858*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0069; break;
859*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x006a; break;
860*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x006b; break;
861*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x006c; break;
862*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
863*b1cdbd2cSJim Jagielski 	}
864*b1cdbd2cSJim Jagielski 	*pPict << oc;
865*b1cdbd2cSJim Jagielski 	WriteArcAngles(rRect,rStartPt,rEndPt);
866*b1cdbd2cSJim Jagielski }
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 
WriteOpcode_Poly(PictDrawingMethod eMethod,const Polygon & rPoly)869*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_Poly(PictDrawingMethod eMethod, const Polygon & rPoly)
870*b1cdbd2cSJim Jagielski {
871*b1cdbd2cSJim Jagielski 	sal_uInt16 oc;
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski 	if (rPoly.GetSize()<3) return;
874*b1cdbd2cSJim Jagielski 	switch (eMethod) {
875*b1cdbd2cSJim Jagielski 		case PDM_FRAME:  oc=0x0070; break;
876*b1cdbd2cSJim Jagielski 		case PDM_PAINT:  oc=0x0071; break;
877*b1cdbd2cSJim Jagielski 		case PDM_ERASE:  oc=0x0072; break;
878*b1cdbd2cSJim Jagielski 		case PDM_INVERT: oc=0x0073; break;
879*b1cdbd2cSJim Jagielski 		case PDM_FILL:   oc=0x0074; break;
880*b1cdbd2cSJim Jagielski 		default:		 oc=0;		break;   // -Wall a default for oc...
881*b1cdbd2cSJim Jagielski 	}
882*b1cdbd2cSJim Jagielski 	*pPict << oc;
883*b1cdbd2cSJim Jagielski 	WritePolygon(rPoly);
884*b1cdbd2cSJim Jagielski }
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski 
WriteOpcode_BitsRect(const Point & rPoint,const Size & rSize,const Bitmap & rBitmap)887*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_BitsRect(const Point & rPoint, const Size & rSize, const Bitmap & rBitmap)
888*b1cdbd2cSJim Jagielski {
889*b1cdbd2cSJim Jagielski 	BitmapReadAccess*	pAcc = NULL;
890*b1cdbd2cSJim Jagielski 	Bitmap				aBitmap( rBitmap );
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski 	sal_uLong	nWidth, nHeight, nDstRowBytes, nx, nc, ny, nCount, nColTabSize, i;
893*b1cdbd2cSJim Jagielski 	sal_uLong	nDstRowPos, nSrcRowBytes, nEqu3, nPos, nDstMapPos;
894*b1cdbd2cSJim Jagielski 	sal_uInt16	nBitsPerPixel, nPackType;
895*b1cdbd2cSJim Jagielski 	sal_uInt8	*pComp[4], *pPix, *pTemp;
896*b1cdbd2cSJim Jagielski 	sal_uInt8    nEquData = 0;
897*b1cdbd2cSJim Jagielski 	sal_uInt8    nFlagCounterByte, nRed, nGreen, nBlue;
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski 	SetAttrForPaint();
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski 	// temopraere Windows-BMP-Datei erzeugen:
902*b1cdbd2cSJim Jagielski 	nActBitmapPercent=30;
903*b1cdbd2cSJim Jagielski 	MayCallback();
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski 	if ( bStatus == sal_False )
906*b1cdbd2cSJim Jagielski 		return;
907*b1cdbd2cSJim Jagielski 	if ( ( pAcc = aBitmap.AcquireReadAccess() ) == NULL )
908*b1cdbd2cSJim Jagielski 		return;
909*b1cdbd2cSJim Jagielski 
910*b1cdbd2cSJim Jagielski 	nBitsPerPixel = aBitmap.GetBitCount();
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski     // export code below only handles four discrete cases
913*b1cdbd2cSJim Jagielski     nBitsPerPixel =
914*b1cdbd2cSJim Jagielski         nBitsPerPixel <= 1 ? 1 : nBitsPerPixel <= 4 ? 4 : nBitsPerPixel <= 8 ? 8 : 24;
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski 	nWidth = pAcc->Width();
917*b1cdbd2cSJim Jagielski 	nHeight = pAcc->Height();
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 	// Wenn 24-Bit, dann den Opcode 'DirectBitsRect' erzeugen:
920*b1cdbd2cSJim Jagielski 	if ( nBitsPerPixel == 24 )
921*b1cdbd2cSJim Jagielski 	{
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski 		// Anzahl Bytes einer (ungepackten) Zeile in Quelle und Ziel berechnen:
924*b1cdbd2cSJim Jagielski 		nSrcRowBytes =( ( 3 * nWidth ) + 0x0003 ) & 0xfffc;
925*b1cdbd2cSJim Jagielski 		nDstRowBytes = nWidth * 4;
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski 		// Opcode und BaseAddr (?) schreiben:
928*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x009a << (sal_uInt32)0x000000ff;
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 		// Normalerweise wollen wir den Packing-Type 4 (Run length encoding
931*b1cdbd2cSJim Jagielski 		// for 32-Bit Pixels) erzeugen. Wenn aber RowBytes<8 gilt, sind die Daten
932*b1cdbd2cSJim Jagielski 		// grundsaetzlich ungepackt, auch wenn der Packing-Type 4 angegeben ist,
933*b1cdbd2cSJim Jagielski 		// was etwas komisch erscheint. Daher wollen wir in so einem Fall lieber
934*b1cdbd2cSJim Jagielski 		// gleich den Packing-Type 1 (ungepackt) angeben:
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski 		if ( nDstRowBytes < 8 )
937*b1cdbd2cSJim Jagielski 			nPackType = 1;
938*b1cdbd2cSJim Jagielski 		else
939*b1cdbd2cSJim Jagielski 			nPackType = 4;
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski 		// PixMap-Struktur schreiben:
942*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)(nDstRowBytes|0x8000) // Bytes pro Zeile und dass es eine 'PixMap' ist
943*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // Y1-Position der Bitmap in der Quelle
944*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // X1-Position der Bitmap in der Quelle
945*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nHeight               // Y2-Position der Bitmap in der Quelle
946*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nWidth                // X2-Position der Bitmap in der Quelle
947*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // Version
948*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nPackType             // Packing type
949*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // Packing size (?)
950*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00480000            // H-Res
951*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00480000            // V-Res
952*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0010                // Pixel type (?)
953*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0020                // Pixel size: 32 bit
954*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0004                // CmpCount: 4 Komponenten
955*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0008                // CmpSize: 8 Bits
956*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // PlaneBytes (?)
957*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // (?)
958*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000;           // (?)
959*b1cdbd2cSJim Jagielski 
960*b1cdbd2cSJim Jagielski 		// Source-Rectangle schreiben:
961*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0000                // Y1-Position auf der Bitmap
962*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // X1-Position auf der Bitmap
963*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nHeight               // Y2-Position auf der Bitmap
964*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nWidth;               // X2-Position auf der Bitmap
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 		// Destination-Rectangle schreiben:
967*b1cdbd2cSJim Jagielski 		WritePoint( rPoint );
968*b1cdbd2cSJim Jagielski 		WritePoint( Point( rPoint.X() + rSize.Width(), rPoint.Y() + rSize.Height() ) );
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski 		// Transfer mode schreiben:
971*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0000; // (?)
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski 		// Position der Map-Daten in Ziel merken:
974*b1cdbd2cSJim Jagielski 		nDstMapPos=pPict->Tell();
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski 		if ( nPackType == 1 )				// bei 24 bits nWidth == 1 !!
977*b1cdbd2cSJim Jagielski 		{									// nicht packen
978*b1cdbd2cSJim Jagielski 			for ( ny = 0; ny < nHeight; ny++ )
979*b1cdbd2cSJim Jagielski 			{
980*b1cdbd2cSJim Jagielski 				*pPict << (sal_uInt8)0;
981*b1cdbd2cSJim Jagielski 				*pPict << (sal_uInt8)pAcc->GetPixel( ny, 0 ).GetRed();
982*b1cdbd2cSJim Jagielski 				*pPict << (sal_uInt8)pAcc->GetPixel( ny, 0 ).GetGreen();
983*b1cdbd2cSJim Jagielski 				*pPict << (sal_uInt8)pAcc->GetPixel( ny, 0 ).GetBlue();
984*b1cdbd2cSJim Jagielski 				// Prozente zaehlen, Callback, Fehler pruefen:
985*b1cdbd2cSJim Jagielski 				nActBitmapPercent = ( ny * 70 / nHeight ) + 30;	// (30% machten schon das Schreiben der Win-BMP-Datei aus)
986*b1cdbd2cSJim Jagielski 				MayCallback();
987*b1cdbd2cSJim Jagielski 			}
988*b1cdbd2cSJim Jagielski 		}
989*b1cdbd2cSJim Jagielski 		else	// packen ( PackType == 4 )
990*b1cdbd2cSJim Jagielski 		{
991*b1cdbd2cSJim Jagielski 			// Speicher fuer Zeilen-Zwischen-Datenstruktur allozieren:
992*b1cdbd2cSJim Jagielski 			for ( nc = 0; nc < 4; nc++ )
993*b1cdbd2cSJim Jagielski 				pComp[ nc ] = new sal_uInt8[ nWidth ];
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 			// Schleife ueber Zeilen:
996*b1cdbd2cSJim Jagielski 			for ( ny = 0; ny < nHeight; ny++ )
997*b1cdbd2cSJim Jagielski 			{
998*b1cdbd2cSJim Jagielski 				// Zeil ny der Quelle in die Zwischen-Datenstrktur einlesen:
999*b1cdbd2cSJim Jagielski 
1000*b1cdbd2cSJim Jagielski 				for ( nx = 0; nx < nWidth; nx++ )
1001*b1cdbd2cSJim Jagielski 				{
1002*b1cdbd2cSJim Jagielski 					pComp[ 1 ][ nx ] = (sal_uInt8)pAcc->GetPixel( ny, nx ) .GetRed();
1003*b1cdbd2cSJim Jagielski 					pComp[ 2 ][ nx ] = (sal_uInt8)pAcc->GetPixel( ny, nx ) .GetGreen();
1004*b1cdbd2cSJim Jagielski 					pComp[ 3 ][ nx ] = (sal_uInt8)pAcc->GetPixel( ny, nx ) .GetBlue();
1005*b1cdbd2cSJim Jagielski 					pComp[ 0 ][ nx ] = 0;
1006*b1cdbd2cSJim Jagielski 				}
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski 				// Anfang der Zeile im Ziel merken:
1009*b1cdbd2cSJim Jagielski 				nDstRowPos = pPict->Tell();
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski 				// ByteCount (das ist die Groesse der gepackten Zeile) zunaechst 0 (wird spaeter berichtigt):
1012*b1cdbd2cSJim Jagielski 				if ( nDstRowBytes > 250 )
1013*b1cdbd2cSJim Jagielski 					*pPict << (sal_uInt16)0;
1014*b1cdbd2cSJim Jagielski 				else
1015*b1cdbd2cSJim Jagielski 					*pPict << (sal_uInt8)0;
1016*b1cdbd2cSJim Jagielski 
1017*b1cdbd2cSJim Jagielski 				// Schleife ueber Componenten:
1018*b1cdbd2cSJim Jagielski 				for ( nc = 0; nc < 4; nc++ )
1019*b1cdbd2cSJim Jagielski 				{
1020*b1cdbd2cSJim Jagielski 					// Schleife ueber x:
1021*b1cdbd2cSJim Jagielski 					nx = 0;
1022*b1cdbd2cSJim Jagielski 					while ( nx < nWidth )
1023*b1cdbd2cSJim Jagielski 					{
1024*b1cdbd2cSJim Jagielski 						// Die Position von 3 gleichen Bytes suchen und in nEqu3 merken.
1025*b1cdbd2cSJim Jagielski 						// wenn nicht gefunden, dann nEqu3=nWidth setzten.
1026*b1cdbd2cSJim Jagielski 						// Wenn doch gefunden, dann in nEquData den Wert der Bytes merken.
1027*b1cdbd2cSJim Jagielski 						nEqu3 = nx;
1028*b1cdbd2cSJim Jagielski 						for (;;)
1029*b1cdbd2cSJim Jagielski 						{
1030*b1cdbd2cSJim Jagielski 							if ( nEqu3 + 2 >= nWidth )
1031*b1cdbd2cSJim Jagielski 							{
1032*b1cdbd2cSJim Jagielski 								nEqu3 = nWidth;
1033*b1cdbd2cSJim Jagielski 								break;
1034*b1cdbd2cSJim Jagielski 							}
1035*b1cdbd2cSJim Jagielski 							nEquData = pComp[nc][nEqu3];
1036*b1cdbd2cSJim Jagielski 							if ( nEquData == pComp[nc][nEqu3+1] && nEquData==pComp[nc][nEqu3+2] )
1037*b1cdbd2cSJim Jagielski 								break;
1038*b1cdbd2cSJim Jagielski 							nEqu3++;
1039*b1cdbd2cSJim Jagielski 						}
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski 						// Die Daten von nx bis nEqu3 unkomprimiert schreiben (ggf. in mehreren Records):
1042*b1cdbd2cSJim Jagielski 						while ( nEqu3 > nx )
1043*b1cdbd2cSJim Jagielski 						{
1044*b1cdbd2cSJim Jagielski 							nCount = nEqu3 - nx;
1045*b1cdbd2cSJim Jagielski 							if ( nCount > 128 )
1046*b1cdbd2cSJim Jagielski 								nCount=128;
1047*b1cdbd2cSJim Jagielski 							nFlagCounterByte = (sal_uInt8)(nCount-1);
1048*b1cdbd2cSJim Jagielski 							*pPict << nFlagCounterByte;
1049*b1cdbd2cSJim Jagielski 							do
1050*b1cdbd2cSJim Jagielski 							{
1051*b1cdbd2cSJim Jagielski 								*pPict << pComp[nc][nx++];
1052*b1cdbd2cSJim Jagielski 								nCount--;
1053*b1cdbd2cSJim Jagielski 							}
1054*b1cdbd2cSJim Jagielski 							while ( nCount > 0 );
1055*b1cdbd2cSJim Jagielski 						}
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski 						// Jetzt einen Komprimierungs-Record erzeugen (falls oben mindestens 3
1058*b1cdbd2cSJim Jagielski 						// gleiche Bytes gefunden):
1059*b1cdbd2cSJim Jagielski 						if ( nx < nWidth )
1060*b1cdbd2cSJim Jagielski 						{				// Hinweis: es gilt nx==nEqu3 (hoffentlich)
1061*b1cdbd2cSJim Jagielski 							nCount=3;	// Drei Bytes sind gleich, wie weiter oben herausgefunden.
1062*b1cdbd2cSJim Jagielski 										// Pruefen, ob es weitere gleiche Bytes gibts (dabei Max.-Record-Groesse beachten):
1063*b1cdbd2cSJim Jagielski 							while ( nx + nCount < nWidth && nCount < 128 )
1064*b1cdbd2cSJim Jagielski 							{
1065*b1cdbd2cSJim Jagielski 								if ( nEquData != pComp[ nc ][ nx + nCount ] )
1066*b1cdbd2cSJim Jagielski 									break;
1067*b1cdbd2cSJim Jagielski 								nCount++;
1068*b1cdbd2cSJim Jagielski 							}
1069*b1cdbd2cSJim Jagielski 							// nCount gleiche Bytes komprimiert schreiben:
1070*b1cdbd2cSJim Jagielski 							nFlagCounterByte = (sal_uInt8)( 1 - (long)nCount );
1071*b1cdbd2cSJim Jagielski 							*pPict << nFlagCounterByte << nEquData;
1072*b1cdbd2cSJim Jagielski 							nx += nCount;
1073*b1cdbd2cSJim Jagielski 						}
1074*b1cdbd2cSJim Jagielski 					}
1075*b1cdbd2cSJim Jagielski 				}
1076*b1cdbd2cSJim Jagielski 				// ByteCount berichtigen:
1077*b1cdbd2cSJim Jagielski 				nPos = pPict->Tell();
1078*b1cdbd2cSJim Jagielski 				pPict->Seek( nDstRowPos );
1079*b1cdbd2cSJim Jagielski 				if ( nDstRowBytes > 250 )
1080*b1cdbd2cSJim Jagielski 					*pPict << ( (sal_uInt16)( nPos - nDstRowPos - 2 ) );
1081*b1cdbd2cSJim Jagielski 				else
1082*b1cdbd2cSJim Jagielski 					*pPict << ( (sal_uInt8)( nPos - nDstRowPos - 1 ) );
1083*b1cdbd2cSJim Jagielski 				pPict->Seek( nPos );
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski 				// Prozente zaehlen, Callback, Fehler pruefen:
1086*b1cdbd2cSJim Jagielski 				nActBitmapPercent = ( ny * 70 / nHeight ) + 30;	// (30% machten schon das Schreiben der Win-BMP-Datei aus)
1087*b1cdbd2cSJim Jagielski 				MayCallback();
1088*b1cdbd2cSJim Jagielski 			}
1089*b1cdbd2cSJim Jagielski 			// Aufraeumen:
1090*b1cdbd2cSJim Jagielski 			for ( nc = 0; nc < 4; nc++ )
1091*b1cdbd2cSJim Jagielski 				delete pComp[ nc ];
1092*b1cdbd2cSJim Jagielski 		}
1093*b1cdbd2cSJim Jagielski 	}
1094*b1cdbd2cSJim Jagielski 	else
1095*b1cdbd2cSJim Jagielski 	{	// nicht 24-Bit also Opcode 'PackBitsRect' erzeugen:
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 		// Bei 1-Bit-Bildern ignorieren manche Import-Filter die Palette und nehmen statt
1098*b1cdbd2cSJim Jagielski 		// dessen die Vorder- und Hintergrundfarbe:
1099*b1cdbd2cSJim Jagielski 		if ( nBitsPerPixel == 1 )
1100*b1cdbd2cSJim Jagielski 		{
1101*b1cdbd2cSJim Jagielski 			WriteOpcode_RGBBkCol( pAcc->GetPaletteColor( 0 ) );
1102*b1cdbd2cSJim Jagielski 			WriteOpcode_RGBFgCol( pAcc->GetPaletteColor( 1 ) );
1103*b1cdbd2cSJim Jagielski 		}
1104*b1cdbd2cSJim Jagielski 		else
1105*b1cdbd2cSJim Jagielski 		{
1106*b1cdbd2cSJim Jagielski 			WriteOpcode_RGBBkCol( Color( COL_BLACK ) );
1107*b1cdbd2cSJim Jagielski 			WriteOpcode_RGBFgCol( Color( COL_WHITE ) );
1108*b1cdbd2cSJim Jagielski 		}
1109*b1cdbd2cSJim Jagielski 
1110*b1cdbd2cSJim Jagielski 		// Anzahl Bytes einer (ungepackten) Zeile in Ziel und Quelle berechnen:
1111*b1cdbd2cSJim Jagielski 		nDstRowBytes = ( nWidth * nBitsPerPixel + 7 ) >> 3;
1112*b1cdbd2cSJim Jagielski 		nSrcRowBytes = ( nDstRowBytes + 3 ) & 0xfffffffc;
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski 		// Opcode schreiben:
1115*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0x0098;
1116*b1cdbd2cSJim Jagielski 
1117*b1cdbd2cSJim Jagielski 		// Normalerweise wollen wir den Packing-Type 0 (default Packing) erzeugen.
1118*b1cdbd2cSJim Jagielski 		// Wenn aber RowBytes<8 gilt, sind die Daten grundsaetzlich ungepackt,
1119*b1cdbd2cSJim Jagielski 		// auch wenn der Packing-Type 0 angegeben ist, was etwas komisch erscheint.
1120*b1cdbd2cSJim Jagielski 		// Daher wollen wir in so einem Fall lieber gleich den Packing-Type 1 (ungepackt)
1121*b1cdbd2cSJim Jagielski 		// angeben:
1122*b1cdbd2cSJim Jagielski 		if ( nDstRowBytes < 8 )
1123*b1cdbd2cSJim Jagielski 			nPackType = 1;
1124*b1cdbd2cSJim Jagielski 		else
1125*b1cdbd2cSJim Jagielski 			nPackType = 0;
1126*b1cdbd2cSJim Jagielski 
1127*b1cdbd2cSJim Jagielski 		// PixMap-Struktur schreiben:
1128*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)(nDstRowBytes|0x8000) // Bytes pro Zeile und dass es eine 'PixMap' ist
1129*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // Y1-Position der Bitmap in der Quelle
1130*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // X1-Position der Bitmap in der Quelle
1131*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nHeight               // Y2-Position der Bitmap in der Quelle
1132*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nWidth                // X2-Position der Bitmap in der Quelle
1133*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // Version
1134*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nPackType             // Packing type
1135*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // Packing size (?)
1136*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00480000            // H-Res
1137*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00480000            // V-Res
1138*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0000                // Pixel type (?)
1139*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nBitsPerPixel         // Pixel size
1140*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)0x0001                // CmpCount: 1 Komponente
1141*b1cdbd2cSJim Jagielski 			   << (sal_uInt16)nBitsPerPixel         // CmpSize
1142*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // PlaneBytes (?)
1143*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000            // (?)
1144*b1cdbd2cSJim Jagielski 			   << (sal_uInt32) 0x00000000;           // (?)
1145*b1cdbd2cSJim Jagielski 
1146*b1cdbd2cSJim Jagielski 		// Palette lesen und schreiben:
1147*b1cdbd2cSJim Jagielski 		nColTabSize = pAcc->GetPaletteEntryCount();
1148*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt32)0 << (sal_uInt16)0x8000 << (sal_uInt16)( nColTabSize - 1 );
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski 		for ( i = 0; i < nColTabSize; i++ )
1151*b1cdbd2cSJim Jagielski 		{
1152*b1cdbd2cSJim Jagielski 			nRed = (sal_uInt8)pAcc->GetPaletteColor( (sal_uInt16)i ).GetRed();
1153*b1cdbd2cSJim Jagielski 			nGreen = (sal_uInt8)pAcc->GetPaletteColor( (sal_uInt16)i ).GetGreen();
1154*b1cdbd2cSJim Jagielski 			nBlue = (sal_uInt8)pAcc->GetPaletteColor( (sal_uInt16)i ).GetBlue();
1155*b1cdbd2cSJim Jagielski 			*pPict << (sal_uInt16)0 << nRed << nRed << nGreen << nGreen << nBlue << nBlue;
1156*b1cdbd2cSJim Jagielski 		}
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 		// Source-Rectangle schreiben:
1159*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0 << (sal_uInt16)0 << (sal_uInt16)nHeight << (sal_uInt16)nWidth;
1160*b1cdbd2cSJim Jagielski 
1161*b1cdbd2cSJim Jagielski 		// Destination-Rectangle schreiben:
1162*b1cdbd2cSJim Jagielski 		WritePoint( rPoint );
1163*b1cdbd2cSJim Jagielski 		WritePoint( Point( rPoint.X() + rSize.Width(), rPoint.Y() + rSize.Height() ) );
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski 		// Transfer mode schreiben:
1166*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt16)0;			// (?)
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski 		// Speicher fuer eine Zeile allozieren:
1169*b1cdbd2cSJim Jagielski 		pPix = new sal_uInt8[ nSrcRowBytes ];
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski 		// Position der Map-Daten in Ziel merken:
1172*b1cdbd2cSJim Jagielski 		nDstMapPos=pPict->Tell();
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 		// Schleife ueber Zeilen:
1175*b1cdbd2cSJim Jagielski 		for ( ny = 0; ny < nHeight; ny++ )
1176*b1cdbd2cSJim Jagielski 		{
1177*b1cdbd2cSJim Jagielski 
1178*b1cdbd2cSJim Jagielski 			// Zeile ny der Quelle in den Zwischenspeicher einlesen:
1179*b1cdbd2cSJim Jagielski 
1180*b1cdbd2cSJim Jagielski 			switch ( nBitsPerPixel )
1181*b1cdbd2cSJim Jagielski 			{
1182*b1cdbd2cSJim Jagielski 				case 1 :
1183*b1cdbd2cSJim Jagielski 					for ( pTemp = pPix, i = 0; i < nSrcRowBytes; i++ )
1184*b1cdbd2cSJim Jagielski 						*pTemp++ = (sal_uInt8)0;
1185*b1cdbd2cSJim Jagielski 					for ( i = 0; i < nWidth; i++ )
1186*b1cdbd2cSJim Jagielski 						pPix[ ( i >> 3 ) ] |= (pAcc->GetPixelIndex( ny, i ) & 1) << ((i & 7) ^ 7);
1187*b1cdbd2cSJim Jagielski 					break;
1188*b1cdbd2cSJim Jagielski 				case 4 :
1189*b1cdbd2cSJim Jagielski 					for ( pTemp = pPix, i = 0; i < nSrcRowBytes; i++ )
1190*b1cdbd2cSJim Jagielski 						*pTemp++ = (sal_uInt8)0;
1191*b1cdbd2cSJim Jagielski 					for ( i = 0; i < nWidth; i++ )
1192*b1cdbd2cSJim Jagielski 						pPix[ ( i >> 1 ) ] |= (pAcc->GetPixelIndex( ny, i ) & 15) << ((i & 1) << 2);
1193*b1cdbd2cSJim Jagielski 					break;
1194*b1cdbd2cSJim Jagielski 				case 8 :
1195*b1cdbd2cSJim Jagielski 					for ( i = 0; i < nWidth; i++ )
1196*b1cdbd2cSJim Jagielski 						pPix[ i ] = pAcc->GetPixelIndex( ny, i );
1197*b1cdbd2cSJim Jagielski 					break;
1198*b1cdbd2cSJim Jagielski 			}
1199*b1cdbd2cSJim Jagielski 
1200*b1cdbd2cSJim Jagielski 			if ( nPackType == 1 )
1201*b1cdbd2cSJim Jagielski 			{	// nicht packen
1202*b1cdbd2cSJim Jagielski 				pPict->Write( pPix, nDstRowBytes );
1203*b1cdbd2cSJim Jagielski 			}
1204*b1cdbd2cSJim Jagielski 			else
1205*b1cdbd2cSJim Jagielski 			{	// Packen (nPackType==0)
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 				// Anfang der Zeile im Ziel merken:
1208*b1cdbd2cSJim Jagielski 				nDstRowPos = pPict->Tell();
1209*b1cdbd2cSJim Jagielski 
1210*b1cdbd2cSJim Jagielski 				// ByteCount (das ist die Groesse der gepackten Zeile) zunaechst 0 (wird spaeter berichtigt):
1211*b1cdbd2cSJim Jagielski 				if ( nDstRowBytes > 250 )
1212*b1cdbd2cSJim Jagielski 					*pPict << (sal_uInt16)0;
1213*b1cdbd2cSJim Jagielski 				else
1214*b1cdbd2cSJim Jagielski 					*pPict << (sal_uInt8)0;
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski 				// Schleife ueber Bytes der Zeile:
1217*b1cdbd2cSJim Jagielski 				nx=0;
1218*b1cdbd2cSJim Jagielski 				while ( nx < nDstRowBytes && bStatus )
1219*b1cdbd2cSJim Jagielski 				{
1220*b1cdbd2cSJim Jagielski 					// Die Position von 3 gleichen Bytes suchen und in nEqu3 merken.
1221*b1cdbd2cSJim Jagielski 					// wenn nicht gefunden, dann nEqu3=nDstRowBytes setzten.
1222*b1cdbd2cSJim Jagielski 					// Wenn doch gefunden, dann in nEquData den Wert der Bytes merken.
1223*b1cdbd2cSJim Jagielski 					nEqu3 = nx;
1224*b1cdbd2cSJim Jagielski 					for (;;)
1225*b1cdbd2cSJim Jagielski 					{
1226*b1cdbd2cSJim Jagielski 						if ( nEqu3 + 2 >= nDstRowBytes )
1227*b1cdbd2cSJim Jagielski 						{
1228*b1cdbd2cSJim Jagielski 							nEqu3 = nDstRowBytes;
1229*b1cdbd2cSJim Jagielski 							break;
1230*b1cdbd2cSJim Jagielski 						}
1231*b1cdbd2cSJim Jagielski 						nEquData = pPix[ nEqu3 ];
1232*b1cdbd2cSJim Jagielski 						if ( nEquData == pPix[ nEqu3 + 1 ] && nEquData == pPix[ nEqu3 + 2 ] )
1233*b1cdbd2cSJim Jagielski 							break;
1234*b1cdbd2cSJim Jagielski 						nEqu3++;
1235*b1cdbd2cSJim Jagielski 					}
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski 					// Die Daten von nx bis nEqu3 unkomprimiert schreiben (ggf. in mehreren Records):
1238*b1cdbd2cSJim Jagielski 					while ( nEqu3 > nx )
1239*b1cdbd2cSJim Jagielski 					{
1240*b1cdbd2cSJim Jagielski 						nCount = nEqu3 - nx;
1241*b1cdbd2cSJim Jagielski 						if ( nCount > 128 )
1242*b1cdbd2cSJim Jagielski 							nCount = 128;
1243*b1cdbd2cSJim Jagielski 						nFlagCounterByte = (sal_uInt8)( nCount - 1 );
1244*b1cdbd2cSJim Jagielski 						*pPict << nFlagCounterByte;
1245*b1cdbd2cSJim Jagielski 						do
1246*b1cdbd2cSJim Jagielski 						{
1247*b1cdbd2cSJim Jagielski 							*pPict << pPix[ nx++ ];
1248*b1cdbd2cSJim Jagielski 							nCount--;
1249*b1cdbd2cSJim Jagielski 						} while ( nCount > 0 );
1250*b1cdbd2cSJim Jagielski 					}
1251*b1cdbd2cSJim Jagielski 
1252*b1cdbd2cSJim Jagielski 					// Jetzt einen Komprimierungs-Record erzeugen (falls oben mindestens 3
1253*b1cdbd2cSJim Jagielski 					// gleiche Bytes gefunden):
1254*b1cdbd2cSJim Jagielski 					if ( nx < nDstRowBytes )
1255*b1cdbd2cSJim Jagielski 					{	// Hinweis: es gilt nx==nEqu3 (hoffentlich)
1256*b1cdbd2cSJim Jagielski 						nCount = 3; // Drei Bytes sind gleich, wie weiter oben herausgefunden.
1257*b1cdbd2cSJim Jagielski 						// Pruefen, ob es weitere gleiche Bytes gibts (dabei Max.-Record-Groesse beachten):
1258*b1cdbd2cSJim Jagielski 						while ( nx + nCount < nDstRowBytes && nCount < 128 )
1259*b1cdbd2cSJim Jagielski 						{
1260*b1cdbd2cSJim Jagielski 							if ( nEquData != pPix[ nx + nCount ] )
1261*b1cdbd2cSJim Jagielski 								break;
1262*b1cdbd2cSJim Jagielski 							nCount++;
1263*b1cdbd2cSJim Jagielski 						}
1264*b1cdbd2cSJim Jagielski 						// nCount gleiche Bytes komprimiert schreiben:
1265*b1cdbd2cSJim Jagielski 						nFlagCounterByte = (sal_uInt8)( 1 - (long)nCount );
1266*b1cdbd2cSJim Jagielski 						*pPict << nFlagCounterByte << nEquData;
1267*b1cdbd2cSJim Jagielski 						nx += nCount;
1268*b1cdbd2cSJim Jagielski 					}
1269*b1cdbd2cSJim Jagielski 				}
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 				// ByteCount berichtigen:
1272*b1cdbd2cSJim Jagielski 				nPos = pPict->Tell();
1273*b1cdbd2cSJim Jagielski 				pPict->Seek( nDstRowPos );
1274*b1cdbd2cSJim Jagielski 				if ( nDstRowBytes > 250 )
1275*b1cdbd2cSJim Jagielski 					*pPict << ( (sal_uInt16)( nPos - nDstRowPos - 2 ) );
1276*b1cdbd2cSJim Jagielski 				else
1277*b1cdbd2cSJim Jagielski 					*pPict << ( (sal_uInt8)( nPos - nDstRowPos - 1 ) );
1278*b1cdbd2cSJim Jagielski 				pPict->Seek( nPos );
1279*b1cdbd2cSJim Jagielski 			}
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 			// Prozente zaehlen, Callback, Fehler pruefen:
1282*b1cdbd2cSJim Jagielski 			nActBitmapPercent =( ny * 70 / nHeight ) + 30; // (30% machten schon das Schreiben der Win-BMP-Datei aus)
1283*b1cdbd2cSJim Jagielski 			MayCallback();
1284*b1cdbd2cSJim Jagielski 			if ( pPict->GetError() )
1285*b1cdbd2cSJim Jagielski 				bStatus = sal_False;
1286*b1cdbd2cSJim Jagielski 		}
1287*b1cdbd2cSJim Jagielski 		// Aufraeumen:
1288*b1cdbd2cSJim Jagielski 		delete[] pPix;
1289*b1cdbd2cSJim Jagielski 	}
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski 	// Map-Daten muessen gerade Anzahl von Bytes sein:
1292*b1cdbd2cSJim Jagielski 	if ( ( ( pPict->Tell() - nDstMapPos ) & 1 ) != 0 )
1293*b1cdbd2cSJim Jagielski 		*pPict << (sal_uInt8)0;
1294*b1cdbd2cSJim Jagielski 
1295*b1cdbd2cSJim Jagielski 	// Bitmaps zaehlen:
1296*b1cdbd2cSJim Jagielski 	nWrittenBitmaps++;
1297*b1cdbd2cSJim Jagielski 	nActBitmapPercent = 0;
1298*b1cdbd2cSJim Jagielski 	if ( pAcc )
1299*b1cdbd2cSJim Jagielski 		aBitmap.ReleaseAccess( pAcc );
1300*b1cdbd2cSJim Jagielski }
1301*b1cdbd2cSJim Jagielski 
WriteOpcode_EndOfFile()1302*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcode_EndOfFile()
1303*b1cdbd2cSJim Jagielski {
1304*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt16)0x00ff;
1305*b1cdbd2cSJim Jagielski }
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski 
SetAttrForPaint()1308*b1cdbd2cSJim Jagielski void PictWriter::SetAttrForPaint()
1309*b1cdbd2cSJim Jagielski {
1310*b1cdbd2cSJim Jagielski 	WriteOpcode_PnMode(eSrcRasterOp);
1311*b1cdbd2cSJim Jagielski 	WriteOpcode_RGBFgCol(aFillColor);
1312*b1cdbd2cSJim Jagielski 	WriteOpcode_RGBBkCol(aFillColor);
1313*b1cdbd2cSJim Jagielski 	WriteOpcode_PnFillPat(aFillColor!=Color( COL_TRANSPARENT ));
1314*b1cdbd2cSJim Jagielski }
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski 
SetAttrForFrame()1317*b1cdbd2cSJim Jagielski void PictWriter::SetAttrForFrame()
1318*b1cdbd2cSJim Jagielski {
1319*b1cdbd2cSJim Jagielski 	WriteOpcode_PnMode(eSrcRasterOp);
1320*b1cdbd2cSJim Jagielski 	WriteOpcode_PnSize(0);
1321*b1cdbd2cSJim Jagielski 	WriteOpcode_RGBFgCol(aLineColor);
1322*b1cdbd2cSJim Jagielski 	WriteOpcode_PnLinePat(aLineColor!=Color( COL_TRANSPARENT ));
1323*b1cdbd2cSJim Jagielski }
1324*b1cdbd2cSJim Jagielski 
1325*b1cdbd2cSJim Jagielski 
SetAttrForText()1326*b1cdbd2cSJim Jagielski void PictWriter::SetAttrForText()
1327*b1cdbd2cSJim Jagielski {
1328*b1cdbd2cSJim Jagielski 	WriteOpcode_RGBFgCol(aSrcFont.GetColor());
1329*b1cdbd2cSJim Jagielski 	WriteOpcode_RGBBkCol(aSrcFont.GetFillColor());
1330*b1cdbd2cSJim Jagielski 	WriteOpcode_PnLinePat(sal_True);
1331*b1cdbd2cSJim Jagielski 	WriteOpcode_FontName(aSrcFont);
1332*b1cdbd2cSJim Jagielski 	WriteOpcode_TxSize((sal_uInt16)(aSrcFont.GetSize().Height()));
1333*b1cdbd2cSJim Jagielski 	WriteOpcode_TxMode(eSrcRasterOp);
1334*b1cdbd2cSJim Jagielski 	WriteOpcode_TxFace(aSrcFont);
1335*b1cdbd2cSJim Jagielski }
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski 
WriteTextArray(Point & rPoint,const String & rString,const sal_Int32 * pDXAry)1338*b1cdbd2cSJim Jagielski void PictWriter::WriteTextArray(Point & rPoint, const String& rString, const sal_Int32 * pDXAry)
1339*b1cdbd2cSJim Jagielski {
1340*b1cdbd2cSJim Jagielski 	sal_uInt16 i,nLen;
1341*b1cdbd2cSJim Jagielski 	sal_Unicode c;
1342*b1cdbd2cSJim Jagielski 	sal_Bool bDelta;
1343*b1cdbd2cSJim Jagielski 	Point aPt;
1344*b1cdbd2cSJim Jagielski 
1345*b1cdbd2cSJim Jagielski 	if ( pDXAry == NULL )
1346*b1cdbd2cSJim Jagielski 		WriteOpcode_Text( rPoint, rString, sal_False );
1347*b1cdbd2cSJim Jagielski 	else
1348*b1cdbd2cSJim Jagielski 	{
1349*b1cdbd2cSJim Jagielski 		bDelta = sal_False;
1350*b1cdbd2cSJim Jagielski 		nLen = rString.Len();
1351*b1cdbd2cSJim Jagielski 		for ( i = 0; i < nLen; i++ )
1352*b1cdbd2cSJim Jagielski 		{
1353*b1cdbd2cSJim Jagielski 			c = rString.GetChar( i );
1354*b1cdbd2cSJim Jagielski 			if ( c && ( c != 0x20 ) )
1355*b1cdbd2cSJim Jagielski 			{
1356*b1cdbd2cSJim Jagielski 				aPt = rPoint;
1357*b1cdbd2cSJim Jagielski 				if ( i > 0 )
1358*b1cdbd2cSJim Jagielski 					aPt.X() += pDXAry[ i - 1 ];
1359*b1cdbd2cSJim Jagielski 
1360*b1cdbd2cSJim Jagielski 				WriteOpcode_Text( aPt, String( c ), bDelta );
1361*b1cdbd2cSJim Jagielski 				bDelta = sal_True;
1362*b1cdbd2cSJim Jagielski 			}
1363*b1cdbd2cSJim Jagielski 		}
1364*b1cdbd2cSJim Jagielski 	}
1365*b1cdbd2cSJim Jagielski }
1366*b1cdbd2cSJim Jagielski 
HandleLineInfoPolyPolygons(const LineInfo & rInfo,const basegfx::B2DPolygon & rLinePolygon)1367*b1cdbd2cSJim Jagielski void PictWriter::HandleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon)
1368*b1cdbd2cSJim Jagielski {
1369*b1cdbd2cSJim Jagielski 	if(rLinePolygon.count())
1370*b1cdbd2cSJim Jagielski 	{
1371*b1cdbd2cSJim Jagielski 		basegfx::B2DPolyPolygon aLinePolyPolygon(rLinePolygon);
1372*b1cdbd2cSJim Jagielski 		basegfx::B2DPolyPolygon aFillPolyPolygon;
1373*b1cdbd2cSJim Jagielski 
1374*b1cdbd2cSJim Jagielski 		rInfo.applyToB2DPolyPolygon(aLinePolyPolygon, aFillPolyPolygon);
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski 		if(aLinePolyPolygon.count())
1377*b1cdbd2cSJim Jagielski 		{
1378*b1cdbd2cSJim Jagielski 			aLinePolyPolygon = aLinePolyPolygon.getDefaultAdaptiveSubdivision();
1379*b1cdbd2cSJim Jagielski 			const sal_uInt32 nPolyCount(aLinePolyPolygon.count());
1380*b1cdbd2cSJim Jagielski 			SetAttrForFrame();
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski 			for(sal_uInt32 a(0); a < nPolyCount; a++)
1383*b1cdbd2cSJim Jagielski 			{
1384*b1cdbd2cSJim Jagielski 				const basegfx::B2DPolygon aCandidate(aLinePolyPolygon.getB2DPolygon(a));
1385*b1cdbd2cSJim Jagielski 				const sal_uInt32 nPointCount(aCandidate.count());
1386*b1cdbd2cSJim Jagielski 
1387*b1cdbd2cSJim Jagielski 				if(nPointCount)
1388*b1cdbd2cSJim Jagielski 				{
1389*b1cdbd2cSJim Jagielski 					const sal_uInt32 nEdgeCount(aCandidate.isClosed() ? nPointCount + 1 : nPointCount);
1390*b1cdbd2cSJim Jagielski 					const basegfx::B2DPoint aCurr(aCandidate.getB2DPoint(0));
1391*b1cdbd2cSJim Jagielski 					Point nCurr(basegfx::fround(aCurr.getX()), basegfx::fround(aCurr.getY()));
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski 					for(sal_uInt32 b(0); b < nEdgeCount; b++)
1394*b1cdbd2cSJim Jagielski 					{
1395*b1cdbd2cSJim Jagielski 						const sal_uInt32 nNextIndex((b + 1) % nPointCount);
1396*b1cdbd2cSJim Jagielski 						const basegfx::B2DPoint aNext(aCandidate.getB2DPoint(nNextIndex));
1397*b1cdbd2cSJim Jagielski 						const Point nNext(basegfx::fround(aNext.getX()), basegfx::fround(aNext.getY()));
1398*b1cdbd2cSJim Jagielski 
1399*b1cdbd2cSJim Jagielski 						WriteOpcode_Line(nCurr, nNext);
1400*b1cdbd2cSJim Jagielski 						nCurr = nNext;
1401*b1cdbd2cSJim Jagielski 					}
1402*b1cdbd2cSJim Jagielski 				}
1403*b1cdbd2cSJim Jagielski 			}
1404*b1cdbd2cSJim Jagielski 		}
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski 		if(aFillPolyPolygon.count())
1407*b1cdbd2cSJim Jagielski 		{
1408*b1cdbd2cSJim Jagielski 			const Color aOldLineColor(aLineColor);
1409*b1cdbd2cSJim Jagielski 			const Color aOldFillColor(aFillColor);
1410*b1cdbd2cSJim Jagielski 
1411*b1cdbd2cSJim Jagielski 			aLineColor = Color( COL_TRANSPARENT );
1412*b1cdbd2cSJim Jagielski 			aFillColor = aOldLineColor;
1413*b1cdbd2cSJim Jagielski 			SetAttrForPaint();
1414*b1cdbd2cSJim Jagielski 
1415*b1cdbd2cSJim Jagielski 			for(sal_uInt32 a(0); a < aFillPolyPolygon.count(); a++)
1416*b1cdbd2cSJim Jagielski 			{
1417*b1cdbd2cSJim Jagielski 				const Polygon aPolygon(aFillPolyPolygon.getB2DPolygon(a).getDefaultAdaptiveSubdivision());
1418*b1cdbd2cSJim Jagielski 				WriteOpcode_Poly(PDM_PAINT, aPolygon);
1419*b1cdbd2cSJim Jagielski 			}
1420*b1cdbd2cSJim Jagielski 
1421*b1cdbd2cSJim Jagielski 			aLineColor = aOldLineColor;
1422*b1cdbd2cSJim Jagielski 			aFillColor = aOldFillColor;
1423*b1cdbd2cSJim Jagielski 		}
1424*b1cdbd2cSJim Jagielski 	}
1425*b1cdbd2cSJim Jagielski }
1426*b1cdbd2cSJim Jagielski 
WriteOpcodes(const GDIMetaFile & rMTF)1427*b1cdbd2cSJim Jagielski void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF )
1428*b1cdbd2cSJim Jagielski {
1429*b1cdbd2cSJim Jagielski 	sal_uLong nA, nACount;
1430*b1cdbd2cSJim Jagielski 	const MetaAction* pMA;
1431*b1cdbd2cSJim Jagielski 
1432*b1cdbd2cSJim Jagielski 	if( !bStatus)
1433*b1cdbd2cSJim Jagielski 		return;
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski 	nACount=rMTF.GetActionCount();
1436*b1cdbd2cSJim Jagielski 
1437*b1cdbd2cSJim Jagielski 	for (nA=0; nA<nACount; nA++)
1438*b1cdbd2cSJim Jagielski 	{
1439*b1cdbd2cSJim Jagielski 		pMA = rMTF.GetAction(nA);
1440*b1cdbd2cSJim Jagielski 
1441*b1cdbd2cSJim Jagielski 		switch (pMA->GetType())
1442*b1cdbd2cSJim Jagielski 		{
1443*b1cdbd2cSJim Jagielski 			case META_PIXEL_ACTION:
1444*b1cdbd2cSJim Jagielski 			{
1445*b1cdbd2cSJim Jagielski 				const MetaPixelAction* pA = (const MetaPixelAction*) pMA;
1446*b1cdbd2cSJim Jagielski 				WriteOpcode_PnMode(eSrcRasterOp);
1447*b1cdbd2cSJim Jagielski 				WriteOpcode_PnSize(1);
1448*b1cdbd2cSJim Jagielski 				WriteOpcode_RGBFgCol(pA->GetColor());
1449*b1cdbd2cSJim Jagielski 				WriteOpcode_PnLinePat(sal_True);
1450*b1cdbd2cSJim Jagielski 				WriteOpcode_Line(pA->GetPoint(),pA->GetPoint());
1451*b1cdbd2cSJim Jagielski 			}
1452*b1cdbd2cSJim Jagielski 			break;
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 			case META_POINT_ACTION:
1455*b1cdbd2cSJim Jagielski 			{
1456*b1cdbd2cSJim Jagielski 				const MetaPointAction* pA = (const MetaPointAction*) pMA;
1457*b1cdbd2cSJim Jagielski 
1458*b1cdbd2cSJim Jagielski 				if( aLineColor != Color( COL_TRANSPARENT ) )
1459*b1cdbd2cSJim Jagielski 				{
1460*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1461*b1cdbd2cSJim Jagielski 					WriteOpcode_Line( pA->GetPoint(),pA->GetPoint() );
1462*b1cdbd2cSJim Jagielski 				}
1463*b1cdbd2cSJim Jagielski 			}
1464*b1cdbd2cSJim Jagielski 			break;
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski 			case META_LINE_ACTION:
1467*b1cdbd2cSJim Jagielski 			{
1468*b1cdbd2cSJim Jagielski 				const MetaLineAction* pA = (const MetaLineAction*) pMA;
1469*b1cdbd2cSJim Jagielski 
1470*b1cdbd2cSJim Jagielski 				if( aLineColor != Color( COL_TRANSPARENT ) )
1471*b1cdbd2cSJim Jagielski 				{
1472*b1cdbd2cSJim Jagielski                     if(pA->GetLineInfo().IsDefault())
1473*b1cdbd2cSJim Jagielski                     {
1474*b1cdbd2cSJim Jagielski 						SetAttrForFrame();
1475*b1cdbd2cSJim Jagielski 						WriteOpcode_Line( pA->GetStartPoint(),pA->GetEndPoint() );
1476*b1cdbd2cSJim Jagielski 					}
1477*b1cdbd2cSJim Jagielski 					else
1478*b1cdbd2cSJim Jagielski 					{
1479*b1cdbd2cSJim Jagielski                         // LineInfo used; handle Dash/Dot and fat lines
1480*b1cdbd2cSJim Jagielski                         basegfx::B2DPolygon aPolygon;
1481*b1cdbd2cSJim Jagielski                         aPolygon.append(basegfx::B2DPoint(pA->GetStartPoint().X(), pA->GetStartPoint().Y()));
1482*b1cdbd2cSJim Jagielski                         aPolygon.append(basegfx::B2DPoint(pA->GetEndPoint().X(), pA->GetEndPoint().Y()));
1483*b1cdbd2cSJim Jagielski                         HandleLineInfoPolyPolygons(pA->GetLineInfo(), aPolygon);
1484*b1cdbd2cSJim Jagielski 					}
1485*b1cdbd2cSJim Jagielski 				}
1486*b1cdbd2cSJim Jagielski 				break;
1487*b1cdbd2cSJim Jagielski 			}
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski 			case META_RECT_ACTION:
1490*b1cdbd2cSJim Jagielski 			{
1491*b1cdbd2cSJim Jagielski 				const MetaRectAction* pA = (const MetaRectAction*) pMA;
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1494*b1cdbd2cSJim Jagielski 				{
1495*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1496*b1cdbd2cSJim Jagielski 					WriteOpcode_Rect(PDM_PAINT,pA->GetRect());
1497*b1cdbd2cSJim Jagielski 					if (aLineColor!=Color( COL_TRANSPARENT ))
1498*b1cdbd2cSJim Jagielski 					{
1499*b1cdbd2cSJim Jagielski 						SetAttrForFrame();
1500*b1cdbd2cSJim Jagielski 						WriteOpcode_SameRect(PDM_FRAME);
1501*b1cdbd2cSJim Jagielski 					}
1502*b1cdbd2cSJim Jagielski 				}
1503*b1cdbd2cSJim Jagielski 				else if (aLineColor!=Color( COL_TRANSPARENT ))
1504*b1cdbd2cSJim Jagielski 				{
1505*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1506*b1cdbd2cSJim Jagielski 					WriteOpcode_Rect(PDM_FRAME,pA->GetRect());
1507*b1cdbd2cSJim Jagielski 				}
1508*b1cdbd2cSJim Jagielski 			}
1509*b1cdbd2cSJim Jagielski 			break;
1510*b1cdbd2cSJim Jagielski 
1511*b1cdbd2cSJim Jagielski 			case META_ROUNDRECT_ACTION:
1512*b1cdbd2cSJim Jagielski 			{
1513*b1cdbd2cSJim Jagielski 				const MetaRoundRectAction* pA = (const MetaRoundRectAction*) pMA;
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski 				WriteOpcode_OvSize( Size( pA->GetHorzRound(), pA->GetVertRound() ) );
1516*b1cdbd2cSJim Jagielski 
1517*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1518*b1cdbd2cSJim Jagielski 				{
1519*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1520*b1cdbd2cSJim Jagielski 					WriteOpcode_RRect(PDM_PAINT,pA->GetRect());
1521*b1cdbd2cSJim Jagielski 					if (aLineColor!=Color( COL_TRANSPARENT ))
1522*b1cdbd2cSJim Jagielski 					{
1523*b1cdbd2cSJim Jagielski 						SetAttrForFrame();
1524*b1cdbd2cSJim Jagielski 						WriteOpcode_SameRRect(PDM_FRAME);
1525*b1cdbd2cSJim Jagielski 					}
1526*b1cdbd2cSJim Jagielski 				}
1527*b1cdbd2cSJim Jagielski 				else if (aLineColor!=Color( COL_TRANSPARENT ))
1528*b1cdbd2cSJim Jagielski 				{
1529*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1530*b1cdbd2cSJim Jagielski 					WriteOpcode_RRect(PDM_FRAME,pA->GetRect());
1531*b1cdbd2cSJim Jagielski 				}
1532*b1cdbd2cSJim Jagielski 			}
1533*b1cdbd2cSJim Jagielski 			break;
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski 			case META_ELLIPSE_ACTION:
1536*b1cdbd2cSJim Jagielski 			{
1537*b1cdbd2cSJim Jagielski 				const MetaEllipseAction* pA = (const MetaEllipseAction*) pMA;
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1540*b1cdbd2cSJim Jagielski 				{
1541*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1542*b1cdbd2cSJim Jagielski 					WriteOpcode_Oval(PDM_PAINT,pA->GetRect());
1543*b1cdbd2cSJim Jagielski 					if (aLineColor!=Color( COL_TRANSPARENT ))
1544*b1cdbd2cSJim Jagielski 					{
1545*b1cdbd2cSJim Jagielski 						SetAttrForFrame();
1546*b1cdbd2cSJim Jagielski 						WriteOpcode_SameOval(PDM_FRAME);
1547*b1cdbd2cSJim Jagielski 					}
1548*b1cdbd2cSJim Jagielski 				}
1549*b1cdbd2cSJim Jagielski 				else if (aLineColor!=Color( COL_TRANSPARENT ))
1550*b1cdbd2cSJim Jagielski 				{
1551*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1552*b1cdbd2cSJim Jagielski 					WriteOpcode_Oval(PDM_FRAME,pA->GetRect());
1553*b1cdbd2cSJim Jagielski 				}
1554*b1cdbd2cSJim Jagielski 			}
1555*b1cdbd2cSJim Jagielski 			break;
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski 			case META_ARC_ACTION:
1558*b1cdbd2cSJim Jagielski 			{
1559*b1cdbd2cSJim Jagielski 				const MetaArcAction* pA = (const MetaArcAction*) pMA;
1560*b1cdbd2cSJim Jagielski 
1561*b1cdbd2cSJim Jagielski 				if (aLineColor!=Color( COL_TRANSPARENT ))
1562*b1cdbd2cSJim Jagielski 				{
1563*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1564*b1cdbd2cSJim Jagielski 					WriteOpcode_Arc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint());
1565*b1cdbd2cSJim Jagielski 				}
1566*b1cdbd2cSJim Jagielski 			}
1567*b1cdbd2cSJim Jagielski 			break;
1568*b1cdbd2cSJim Jagielski 
1569*b1cdbd2cSJim Jagielski 			case META_PIE_ACTION:
1570*b1cdbd2cSJim Jagielski 			{
1571*b1cdbd2cSJim Jagielski 				const MetaPieAction* pA = (const MetaPieAction *) pMA;
1572*b1cdbd2cSJim Jagielski 
1573*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1574*b1cdbd2cSJim Jagielski 				{
1575*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1576*b1cdbd2cSJim Jagielski 					WriteOpcode_Arc(PDM_PAINT,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint());
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 					if (aLineColor!=Color( COL_TRANSPARENT ))
1579*b1cdbd2cSJim Jagielski 					{
1580*b1cdbd2cSJim Jagielski 						SetAttrForFrame();
1581*b1cdbd2cSJim Jagielski 						WriteOpcode_SameArc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint());
1582*b1cdbd2cSJim Jagielski 					}
1583*b1cdbd2cSJim Jagielski 				}
1584*b1cdbd2cSJim Jagielski 				else if (aLineColor!=Color( COL_TRANSPARENT ))
1585*b1cdbd2cSJim Jagielski 				{
1586*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1587*b1cdbd2cSJim Jagielski 					WriteOpcode_Arc(PDM_FRAME,pA->GetRect(),pA->GetStartPoint(),pA->GetEndPoint());
1588*b1cdbd2cSJim Jagielski 				}
1589*b1cdbd2cSJim Jagielski 
1590*b1cdbd2cSJim Jagielski 				if (aLineColor!=Color( COL_TRANSPARENT ))
1591*b1cdbd2cSJim Jagielski 				{
1592*b1cdbd2cSJim Jagielski 					double fxc,fyc,fxr,fyr,fx1,fy1,fx2,fy2,l1,l2;
1593*b1cdbd2cSJim Jagielski 
1594*b1cdbd2cSJim Jagielski 					fxc=((double)(pA->GetRect().Left()+pA->GetRect().Right()))/2.0;
1595*b1cdbd2cSJim Jagielski 					fyc=((double)(pA->GetRect().Top()+pA->GetRect().Bottom()))/2.0;
1596*b1cdbd2cSJim Jagielski 					fxr=((double)pA->GetRect().GetWidth())/2.0;
1597*b1cdbd2cSJim Jagielski 					fyr=((double)pA->GetRect().GetHeight())/2.0;
1598*b1cdbd2cSJim Jagielski 					fx1=((double)pA->GetStartPoint().X())-fxc;
1599*b1cdbd2cSJim Jagielski 					fy1=((double)pA->GetStartPoint().Y())-fyc;
1600*b1cdbd2cSJim Jagielski 					fx2=((double)pA->GetEndPoint().X())-fxc;
1601*b1cdbd2cSJim Jagielski 					fy2=((double)pA->GetEndPoint().Y())-fyc;
1602*b1cdbd2cSJim Jagielski 					l1=sqrt(fx1*fx1+fy1*fy1);
1603*b1cdbd2cSJim Jagielski 					l2=sqrt(fx2*fx2+fy2*fy2);
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski 					if (l1>0)
1606*b1cdbd2cSJim Jagielski 					{
1607*b1cdbd2cSJim Jagielski 						fx1=fx1/l1*fxr;
1608*b1cdbd2cSJim Jagielski 						fy1=fy1/l1*fyr;
1609*b1cdbd2cSJim Jagielski 					}
1610*b1cdbd2cSJim Jagielski 
1611*b1cdbd2cSJim Jagielski 					if (l2>0)
1612*b1cdbd2cSJim Jagielski 					{
1613*b1cdbd2cSJim Jagielski 						fx2=fx2/l2*fxr;
1614*b1cdbd2cSJim Jagielski 						fy2=fy2/l2*fyr;
1615*b1cdbd2cSJim Jagielski 					}
1616*b1cdbd2cSJim Jagielski 					fx1+=fxc; fy1+=fyc; fx2+=fxc; fy2+=fyc;
1617*b1cdbd2cSJim Jagielski 					WriteOpcode_Line(Point((long)(fx1+0.5),(long)(fy1+0.5)), Point((long)(fxc+0.5),(long)(fyc+0.5)));
1618*b1cdbd2cSJim Jagielski 					WriteOpcode_LineFrom(Point((long)(fx2+0.5),(long)(fy2+0.5)));
1619*b1cdbd2cSJim Jagielski 				}
1620*b1cdbd2cSJim Jagielski 			}
1621*b1cdbd2cSJim Jagielski 			break;
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski 			case META_CHORD_ACTION:
1624*b1cdbd2cSJim Jagielski 			{
1625*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_CHORD_ACTION!" );
1626*b1cdbd2cSJim Jagielski 			}
1627*b1cdbd2cSJim Jagielski 			break;
1628*b1cdbd2cSJim Jagielski 
1629*b1cdbd2cSJim Jagielski 			case META_POLYLINE_ACTION:
1630*b1cdbd2cSJim Jagielski 			{
1631*b1cdbd2cSJim Jagielski 				const MetaPolyLineAction* pA = (const MetaPolyLineAction*) pMA;
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski 				if( aLineColor!=Color( COL_TRANSPARENT ) )
1634*b1cdbd2cSJim Jagielski 				{
1635*b1cdbd2cSJim Jagielski 					const Polygon&  rPoly = pA->GetPolygon();
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski 			        if( rPoly.GetSize() )
1638*b1cdbd2cSJim Jagielski                     {
1639*b1cdbd2cSJim Jagielski                         if(pA->GetLineInfo().IsDefault())
1640*b1cdbd2cSJim Jagielski                         {
1641*b1cdbd2cSJim Jagielski 							Polygon aSimplePoly;
1642*b1cdbd2cSJim Jagielski 							if ( rPoly.HasFlags() )
1643*b1cdbd2cSJim Jagielski 								rPoly.AdaptiveSubdivide( aSimplePoly );
1644*b1cdbd2cSJim Jagielski 							else
1645*b1cdbd2cSJim Jagielski 								aSimplePoly = rPoly;
1646*b1cdbd2cSJim Jagielski 
1647*b1cdbd2cSJim Jagielski 							const sal_uInt16    nSize = aSimplePoly.GetSize();
1648*b1cdbd2cSJim Jagielski 							Point           aLast;
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski 							if ( nSize )
1651*b1cdbd2cSJim Jagielski 							{
1652*b1cdbd2cSJim Jagielski 								SetAttrForFrame();
1653*b1cdbd2cSJim Jagielski 								aLast = aSimplePoly[0];
1654*b1cdbd2cSJim Jagielski 
1655*b1cdbd2cSJim Jagielski 								for ( sal_uInt16 i = 1; i < nSize; i++ )
1656*b1cdbd2cSJim Jagielski 								{
1657*b1cdbd2cSJim Jagielski 									WriteOpcode_Line( aLast, aSimplePoly[i] );
1658*b1cdbd2cSJim Jagielski 									aLast = aSimplePoly[i];
1659*b1cdbd2cSJim Jagielski 								}
1660*b1cdbd2cSJim Jagielski 							}
1661*b1cdbd2cSJim Jagielski 						}
1662*b1cdbd2cSJim Jagielski 						else
1663*b1cdbd2cSJim Jagielski 						{
1664*b1cdbd2cSJim Jagielski                             // LineInfo used; handle Dash/Dot and fat lines
1665*b1cdbd2cSJim Jagielski                             HandleLineInfoPolyPolygons(pA->GetLineInfo(), rPoly.getB2DPolygon());
1666*b1cdbd2cSJim Jagielski 						}
1667*b1cdbd2cSJim Jagielski 					}
1668*b1cdbd2cSJim Jagielski 				}
1669*b1cdbd2cSJim Jagielski 			}
1670*b1cdbd2cSJim Jagielski 			break;
1671*b1cdbd2cSJim Jagielski 
1672*b1cdbd2cSJim Jagielski 			case META_POLYGON_ACTION:
1673*b1cdbd2cSJim Jagielski 			{
1674*b1cdbd2cSJim Jagielski 				const MetaPolygonAction* pA = (const MetaPolygonAction*) pMA;
1675*b1cdbd2cSJim Jagielski 
1676*b1cdbd2cSJim Jagielski 				const Polygon& rPoly = pA->GetPolygon();
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski 				Polygon aSimplePoly;
1679*b1cdbd2cSJim Jagielski 				if ( rPoly.HasFlags() )
1680*b1cdbd2cSJim Jagielski 					rPoly.AdaptiveSubdivide( aSimplePoly );
1681*b1cdbd2cSJim Jagielski 				else
1682*b1cdbd2cSJim Jagielski 					aSimplePoly = rPoly;
1683*b1cdbd2cSJim Jagielski 
1684*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1685*b1cdbd2cSJim Jagielski 				{
1686*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1687*b1cdbd2cSJim Jagielski 					WriteOpcode_Poly( PDM_PAINT, aSimplePoly );
1688*b1cdbd2cSJim Jagielski 				}
1689*b1cdbd2cSJim Jagielski 				if (aLineColor!=Color( COL_TRANSPARENT ))
1690*b1cdbd2cSJim Jagielski 				{
1691*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1692*b1cdbd2cSJim Jagielski 					WriteOpcode_Poly( PDM_FRAME, aSimplePoly );
1693*b1cdbd2cSJim Jagielski 				}
1694*b1cdbd2cSJim Jagielski 			}
1695*b1cdbd2cSJim Jagielski 			break;
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 			case META_POLYPOLYGON_ACTION:
1698*b1cdbd2cSJim Jagielski 			{
1699*b1cdbd2cSJim Jagielski 				const MetaPolyPolygonAction* pA = (const MetaPolyPolygonAction*) pMA;
1700*b1cdbd2cSJim Jagielski 
1701*b1cdbd2cSJim Jagielski 				const PolyPolygon& rPolyPoly = pA->GetPolyPolygon();
1702*b1cdbd2cSJim Jagielski 				sal_uInt16 nPolyCount = rPolyPoly.Count();
1703*b1cdbd2cSJim Jagielski 				PolyPolygon aSimplePolyPoly( rPolyPoly );
1704*b1cdbd2cSJim Jagielski 				for ( sal_uInt16 i = 0; i < nPolyCount; i++ )
1705*b1cdbd2cSJim Jagielski 				{
1706*b1cdbd2cSJim Jagielski 					if ( aSimplePolyPoly[ i ].HasFlags() )
1707*b1cdbd2cSJim Jagielski 					{
1708*b1cdbd2cSJim Jagielski 						Polygon aSimplePoly;
1709*b1cdbd2cSJim Jagielski 						aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly );
1710*b1cdbd2cSJim Jagielski 						aSimplePolyPoly[ i ] = aSimplePoly;
1711*b1cdbd2cSJim Jagielski 					}
1712*b1cdbd2cSJim Jagielski 				}
1713*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
1714*b1cdbd2cSJim Jagielski 				{
1715*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
1716*b1cdbd2cSJim Jagielski 					WriteOpcode_Poly( PDM_PAINT, PolyPolygonToPolygon( aSimplePolyPoly ));
1717*b1cdbd2cSJim Jagielski 				}
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski 				if (aLineColor!=Color( COL_TRANSPARENT ))
1720*b1cdbd2cSJim Jagielski 				{
1721*b1cdbd2cSJim Jagielski 					sal_uInt16 nCount,i;
1722*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
1723*b1cdbd2cSJim Jagielski 					nCount = aSimplePolyPoly.Count();
1724*b1cdbd2cSJim Jagielski 					for ( i = 0; i < nCount; i++ )
1725*b1cdbd2cSJim Jagielski 						WriteOpcode_Poly( PDM_FRAME, aSimplePolyPoly.GetObject( i ) );
1726*b1cdbd2cSJim Jagielski 				}
1727*b1cdbd2cSJim Jagielski 			}
1728*b1cdbd2cSJim Jagielski 			break;
1729*b1cdbd2cSJim Jagielski 
1730*b1cdbd2cSJim Jagielski 			case META_TEXT_ACTION:
1731*b1cdbd2cSJim Jagielski 			{
1732*b1cdbd2cSJim Jagielski 				const MetaTextAction*   pA = (const MetaTextAction*) pMA;
1733*b1cdbd2cSJim Jagielski 				Point                   aPt( pA->GetPoint() );
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski 				if ( aSrcFont.GetAlign() != ALIGN_BASELINE )
1736*b1cdbd2cSJim Jagielski 				{
1737*b1cdbd2cSJim Jagielski 					VirtualDevice aVirDev;
1738*b1cdbd2cSJim Jagielski 
1739*b1cdbd2cSJim Jagielski 					if (aSrcFont.GetAlign()==ALIGN_TOP)
1740*b1cdbd2cSJim Jagielski 						aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent();
1741*b1cdbd2cSJim Jagielski 					else
1742*b1cdbd2cSJim Jagielski 						aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent();
1743*b1cdbd2cSJim Jagielski 				}
1744*b1cdbd2cSJim Jagielski 
1745*b1cdbd2cSJim Jagielski 				SetAttrForText();
1746*b1cdbd2cSJim Jagielski 				String aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() );
1747*b1cdbd2cSJim Jagielski 				WriteOpcode_Text( aPt, aStr, sal_False );
1748*b1cdbd2cSJim Jagielski 			}
1749*b1cdbd2cSJim Jagielski 			break;
1750*b1cdbd2cSJim Jagielski 
1751*b1cdbd2cSJim Jagielski 			case META_TEXTARRAY_ACTION:
1752*b1cdbd2cSJim Jagielski 			{
1753*b1cdbd2cSJim Jagielski 				const MetaTextArrayAction*  pA = (const MetaTextArrayAction*) pMA;
1754*b1cdbd2cSJim Jagielski 				Point                       aPt( pA->GetPoint() );
1755*b1cdbd2cSJim Jagielski 
1756*b1cdbd2cSJim Jagielski 				if (aSrcFont.GetAlign()!=ALIGN_BASELINE)
1757*b1cdbd2cSJim Jagielski 				{
1758*b1cdbd2cSJim Jagielski 					VirtualDevice aVirDev;
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski 					if (aSrcFont.GetAlign()==ALIGN_TOP)
1761*b1cdbd2cSJim Jagielski 						aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent();
1762*b1cdbd2cSJim Jagielski 					else
1763*b1cdbd2cSJim Jagielski 						aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent();
1764*b1cdbd2cSJim Jagielski 				}
1765*b1cdbd2cSJim Jagielski 				SetAttrForText();
1766*b1cdbd2cSJim Jagielski 				String aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() );
1767*b1cdbd2cSJim Jagielski 				WriteTextArray( aPt, aStr, pA->GetDXArray() );
1768*b1cdbd2cSJim Jagielski 				break;
1769*b1cdbd2cSJim Jagielski 			}
1770*b1cdbd2cSJim Jagielski 
1771*b1cdbd2cSJim Jagielski 			case META_STRETCHTEXT_ACTION:
1772*b1cdbd2cSJim Jagielski 			{
1773*b1cdbd2cSJim Jagielski 				const MetaStretchTextAction*    pA = (const MetaStretchTextAction*) pMA;
1774*b1cdbd2cSJim Jagielski 				Point                           aPt( pA->GetPoint() );
1775*b1cdbd2cSJim Jagielski 				String                          aStr( pA->GetText(),pA->GetIndex(),pA->GetLen() );
1776*b1cdbd2cSJim Jagielski 				VirtualDevice                   aVirDev;
1777*b1cdbd2cSJim Jagielski 				sal_Int32*                      pDXAry = new sal_Int32[ aStr.Len() ];
1778*b1cdbd2cSJim Jagielski 				sal_Int32                       nNormSize( aVirDev.GetTextArray( aStr,pDXAry ) );
1779*b1cdbd2cSJim Jagielski 				sal_uInt16                          i;
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski 				if (aSrcFont.GetAlign()!=ALIGN_BASELINE)
1782*b1cdbd2cSJim Jagielski 				{
1783*b1cdbd2cSJim Jagielski 					if (aSrcFont.GetAlign()==ALIGN_TOP)
1784*b1cdbd2cSJim Jagielski 						aPt.Y()+=(long)aVirDev.GetFontMetric(aSrcFont).GetAscent();
1785*b1cdbd2cSJim Jagielski 					else
1786*b1cdbd2cSJim Jagielski 						aPt.Y()-=(long)aVirDev.GetFontMetric(aSrcFont).GetDescent();
1787*b1cdbd2cSJim Jagielski 				}
1788*b1cdbd2cSJim Jagielski 
1789*b1cdbd2cSJim Jagielski 				for ( i = 0; i < aStr.Len() - 1; i++ )
1790*b1cdbd2cSJim Jagielski 					pDXAry[ i ] = pDXAry[ i ] * ( (long)pA->GetWidth() ) / nNormSize;
1791*b1cdbd2cSJim Jagielski 
1792*b1cdbd2cSJim Jagielski 				SetAttrForText();
1793*b1cdbd2cSJim Jagielski 				WriteTextArray( aPt, aStr, pDXAry );
1794*b1cdbd2cSJim Jagielski 				delete[] pDXAry;
1795*b1cdbd2cSJim Jagielski 			}
1796*b1cdbd2cSJim Jagielski 			break;
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski 			case META_TEXTRECT_ACTION:
1799*b1cdbd2cSJim Jagielski 			{
1800*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_TEXTRECT_ACTION!" );
1801*b1cdbd2cSJim Jagielski 			}
1802*b1cdbd2cSJim Jagielski 			break;
1803*b1cdbd2cSJim Jagielski 
1804*b1cdbd2cSJim Jagielski 			case META_BMP_ACTION:
1805*b1cdbd2cSJim Jagielski 			{
1806*b1cdbd2cSJim Jagielski 				const MetaBmpAction*    pA = (const MetaBmpAction*) pMA;
1807*b1cdbd2cSJim Jagielski 				const Bitmap            aBmp( pA->GetBitmap() );
1808*b1cdbd2cSJim Jagielski 				VirtualDevice           aVirDev;
1809*b1cdbd2cSJim Jagielski 
1810*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetPoint(), aVirDev.PixelToLogic( aBmp.GetSizePixel(), aSrcMapMode ), aBmp );
1811*b1cdbd2cSJim Jagielski 			}
1812*b1cdbd2cSJim Jagielski 			break;
1813*b1cdbd2cSJim Jagielski 
1814*b1cdbd2cSJim Jagielski 			case META_BMPSCALE_ACTION:
1815*b1cdbd2cSJim Jagielski 			{
1816*b1cdbd2cSJim Jagielski 				const MetaBmpScaleAction* pA = (const MetaBmpScaleAction*) pMA;
1817*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), pA->GetBitmap() );
1818*b1cdbd2cSJim Jagielski 			}
1819*b1cdbd2cSJim Jagielski 			break;
1820*b1cdbd2cSJim Jagielski 
1821*b1cdbd2cSJim Jagielski 			case META_BMPSCALEPART_ACTION:
1822*b1cdbd2cSJim Jagielski 			{
1823*b1cdbd2cSJim Jagielski 				const MetaBmpScalePartAction*   pA = (const MetaBmpScalePartAction*) pMA;
1824*b1cdbd2cSJim Jagielski 				Bitmap                          aBmp( pA->GetBitmap() );
1825*b1cdbd2cSJim Jagielski 
1826*b1cdbd2cSJim Jagielski 				aBmp.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
1827*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetDestPoint(), pA->GetDestSize(), aBmp );
1828*b1cdbd2cSJim Jagielski 			}
1829*b1cdbd2cSJim Jagielski 			break;
1830*b1cdbd2cSJim Jagielski 
1831*b1cdbd2cSJim Jagielski 			case META_BMPEX_ACTION:
1832*b1cdbd2cSJim Jagielski 			{
1833*b1cdbd2cSJim Jagielski 				const MetaBmpExAction*  pA = (const MetaBmpExAction*) pMA;
1834*b1cdbd2cSJim Jagielski 				const Bitmap            aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() );
1835*b1cdbd2cSJim Jagielski 				VirtualDevice           aVirDev;
1836*b1cdbd2cSJim Jagielski 
1837*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetPoint(), aVirDev.PixelToLogic( aBmp.GetSizePixel(), aSrcMapMode ), aBmp );
1838*b1cdbd2cSJim Jagielski 			}
1839*b1cdbd2cSJim Jagielski 			break;
1840*b1cdbd2cSJim Jagielski 
1841*b1cdbd2cSJim Jagielski 			case META_BMPEXSCALE_ACTION:
1842*b1cdbd2cSJim Jagielski 			{
1843*b1cdbd2cSJim Jagielski 				const MetaBmpExScaleAction* pA = (const MetaBmpExScaleAction*) pMA;
1844*b1cdbd2cSJim Jagielski 				const Bitmap                aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() );
1845*b1cdbd2cSJim Jagielski 
1846*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), aBmp );
1847*b1cdbd2cSJim Jagielski 			}
1848*b1cdbd2cSJim Jagielski 			break;
1849*b1cdbd2cSJim Jagielski 
1850*b1cdbd2cSJim Jagielski 			case META_BMPEXSCALEPART_ACTION:
1851*b1cdbd2cSJim Jagielski 			{
1852*b1cdbd2cSJim Jagielski 				const MetaBmpExScalePartAction* pA = (const MetaBmpExScalePartAction*) pMA;
1853*b1cdbd2cSJim Jagielski 				Bitmap                          aBmp( Graphic( pA->GetBitmapEx() ).GetBitmap() );
1854*b1cdbd2cSJim Jagielski 
1855*b1cdbd2cSJim Jagielski 				aBmp.Crop( Rectangle( pA->GetSrcPoint(), pA->GetSrcSize() ) );
1856*b1cdbd2cSJim Jagielski 				WriteOpcode_BitsRect( pA->GetDestPoint(), pA->GetDestSize(), aBmp );
1857*b1cdbd2cSJim Jagielski 			}
1858*b1cdbd2cSJim Jagielski 			break;
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski 			case META_EPS_ACTION :
1861*b1cdbd2cSJim Jagielski 			{
1862*b1cdbd2cSJim Jagielski 				const MetaEPSAction* pA = (const MetaEPSAction*)pMA;
1863*b1cdbd2cSJim Jagielski 				const GDIMetaFile aGDIMetaFile( pA->GetSubstitute() );
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski 				sal_Int32 nCount = aGDIMetaFile.GetActionCount();
1866*b1cdbd2cSJim Jagielski 				for ( sal_Int32 i = 0; i < nCount; i++ )
1867*b1cdbd2cSJim Jagielski 				{
1868*b1cdbd2cSJim Jagielski 					const MetaAction* pMetaAct = aGDIMetaFile.GetAction( i );
1869*b1cdbd2cSJim Jagielski 					if ( pMetaAct->GetType() == META_BMPSCALE_ACTION )
1870*b1cdbd2cSJim Jagielski 					{
1871*b1cdbd2cSJim Jagielski 						const MetaBmpScaleAction* pBmpScaleAction = (const MetaBmpScaleAction*)pMetaAct;
1872*b1cdbd2cSJim Jagielski 						WriteOpcode_BitsRect( pA->GetPoint(), pA->GetSize(), pBmpScaleAction->GetBitmap() );
1873*b1cdbd2cSJim Jagielski 						break;
1874*b1cdbd2cSJim Jagielski 					}
1875*b1cdbd2cSJim Jagielski 				}
1876*b1cdbd2cSJim Jagielski 			}
1877*b1cdbd2cSJim Jagielski 			break;
1878*b1cdbd2cSJim Jagielski 
1879*b1cdbd2cSJim Jagielski 			case META_MASK_ACTION:
1880*b1cdbd2cSJim Jagielski 			case META_MASKSCALE_ACTION:
1881*b1cdbd2cSJim Jagielski 			case META_MASKSCALEPART_ACTION:
1882*b1cdbd2cSJim Jagielski 			{
1883*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_MASK..._ACTION!" );
1884*b1cdbd2cSJim Jagielski 			}
1885*b1cdbd2cSJim Jagielski 			break;
1886*b1cdbd2cSJim Jagielski 
1887*b1cdbd2cSJim Jagielski 			case META_GRADIENT_ACTION:
1888*b1cdbd2cSJim Jagielski 			{
1889*b1cdbd2cSJim Jagielski 				VirtualDevice               aVDev;
1890*b1cdbd2cSJim Jagielski 				GDIMetaFile                 aTmpMtf;
1891*b1cdbd2cSJim Jagielski 				const MetaGradientAction*   pA = (const MetaGradientAction*) pMA;
1892*b1cdbd2cSJim Jagielski 
1893*b1cdbd2cSJim Jagielski 				aVDev.SetMapMode( aTargetMapMode );
1894*b1cdbd2cSJim Jagielski 				aVDev.AddGradientActions( pA->GetRect(), pA->GetGradient(), aTmpMtf );
1895*b1cdbd2cSJim Jagielski 				WriteOpcodes( aTmpMtf );
1896*b1cdbd2cSJim Jagielski 			}
1897*b1cdbd2cSJim Jagielski 			break;
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski 			case META_HATCH_ACTION:
1900*b1cdbd2cSJim Jagielski 			{
1901*b1cdbd2cSJim Jagielski 				VirtualDevice           aVDev;
1902*b1cdbd2cSJim Jagielski 				GDIMetaFile             aTmpMtf;
1903*b1cdbd2cSJim Jagielski 				const MetaHatchAction*	pA = (const MetaHatchAction*) pMA;
1904*b1cdbd2cSJim Jagielski 
1905*b1cdbd2cSJim Jagielski 				aVDev.SetMapMode( aTargetMapMode );
1906*b1cdbd2cSJim Jagielski 				aVDev.AddHatchActions( pA->GetPolyPolygon(), pA->GetHatch(), aTmpMtf );
1907*b1cdbd2cSJim Jagielski 				WriteOpcodes( aTmpMtf );
1908*b1cdbd2cSJim Jagielski 			}
1909*b1cdbd2cSJim Jagielski 			break;
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski 			case META_WALLPAPER_ACTION:
1912*b1cdbd2cSJim Jagielski 			{
1913*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_WALLPAPER_ACTION!" );
1914*b1cdbd2cSJim Jagielski 			}
1915*b1cdbd2cSJim Jagielski 			break;
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski 			case META_CLIPREGION_ACTION:
1918*b1cdbd2cSJim Jagielski 			{
1919*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_CLIPREGION_ACTION!" );
1920*b1cdbd2cSJim Jagielski 			}
1921*b1cdbd2cSJim Jagielski 			break;
1922*b1cdbd2cSJim Jagielski 
1923*b1cdbd2cSJim Jagielski 			case META_ISECTRECTCLIPREGION_ACTION:
1924*b1cdbd2cSJim Jagielski 			{
1925*b1cdbd2cSJim Jagielski 				const MetaISectRectClipRegionAction* pA = (const MetaISectRectClipRegionAction*) pMA;
1926*b1cdbd2cSJim Jagielski 				WriteOpcode_ClipRect( pA->GetRect() );
1927*b1cdbd2cSJim Jagielski 			}
1928*b1cdbd2cSJim Jagielski 			break;
1929*b1cdbd2cSJim Jagielski 
1930*b1cdbd2cSJim Jagielski 			case META_ISECTREGIONCLIPREGION_ACTION:
1931*b1cdbd2cSJim Jagielski 			{
1932*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_ISECTREGIONCLIPREGION_ACTION!" );
1933*b1cdbd2cSJim Jagielski 			}
1934*b1cdbd2cSJim Jagielski 			break;
1935*b1cdbd2cSJim Jagielski 
1936*b1cdbd2cSJim Jagielski 			case META_MOVECLIPREGION_ACTION:
1937*b1cdbd2cSJim Jagielski 			{
1938*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_MOVECLIPREGION_ACTION!" );
1939*b1cdbd2cSJim Jagielski 			}
1940*b1cdbd2cSJim Jagielski 			break;
1941*b1cdbd2cSJim Jagielski 
1942*b1cdbd2cSJim Jagielski 			case META_LINECOLOR_ACTION:
1943*b1cdbd2cSJim Jagielski 			{
1944*b1cdbd2cSJim Jagielski 				const MetaLineColorAction* pA = (const MetaLineColorAction*) pMA;
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski 				if( pA->IsSetting() )
1947*b1cdbd2cSJim Jagielski 					aLineColor = pA->GetColor();
1948*b1cdbd2cSJim Jagielski 				else
1949*b1cdbd2cSJim Jagielski 					aLineColor = Color( COL_TRANSPARENT );
1950*b1cdbd2cSJim Jagielski 			}
1951*b1cdbd2cSJim Jagielski 			break;
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski 			case META_FILLCOLOR_ACTION:
1954*b1cdbd2cSJim Jagielski 			{
1955*b1cdbd2cSJim Jagielski 				const MetaFillColorAction* pA = (const MetaFillColorAction*) pMA;
1956*b1cdbd2cSJim Jagielski 
1957*b1cdbd2cSJim Jagielski 				if( pA->IsSetting() )
1958*b1cdbd2cSJim Jagielski 					aFillColor = pA->GetColor();
1959*b1cdbd2cSJim Jagielski 				else
1960*b1cdbd2cSJim Jagielski 					aFillColor = Color( COL_TRANSPARENT );
1961*b1cdbd2cSJim Jagielski 			}
1962*b1cdbd2cSJim Jagielski 			break;
1963*b1cdbd2cSJim Jagielski 
1964*b1cdbd2cSJim Jagielski 			case META_TEXTCOLOR_ACTION:
1965*b1cdbd2cSJim Jagielski 			{
1966*b1cdbd2cSJim Jagielski 				const MetaTextColorAction* pA = (const MetaTextColorAction*) pMA;
1967*b1cdbd2cSJim Jagielski 				aSrcFont.SetColor( pA->GetColor() );
1968*b1cdbd2cSJim Jagielski 			}
1969*b1cdbd2cSJim Jagielski 			break;
1970*b1cdbd2cSJim Jagielski 
1971*b1cdbd2cSJim Jagielski 			case META_TEXTFILLCOLOR_ACTION:
1972*b1cdbd2cSJim Jagielski 			{
1973*b1cdbd2cSJim Jagielski 				const MetaTextFillColorAction* pA = (const MetaTextFillColorAction*) pMA;
1974*b1cdbd2cSJim Jagielski 
1975*b1cdbd2cSJim Jagielski 				if( pA->IsSetting() )
1976*b1cdbd2cSJim Jagielski 					aSrcFont.SetFillColor( pA->GetColor() );
1977*b1cdbd2cSJim Jagielski 				else
1978*b1cdbd2cSJim Jagielski 					aSrcFont.SetFillColor( Color( COL_TRANSPARENT ) );
1979*b1cdbd2cSJim Jagielski 			}
1980*b1cdbd2cSJim Jagielski 			break;
1981*b1cdbd2cSJim Jagielski 
1982*b1cdbd2cSJim Jagielski 			case META_TEXTALIGN_ACTION:
1983*b1cdbd2cSJim Jagielski 			{
1984*b1cdbd2cSJim Jagielski //                DBG_ERROR( "Unsupported PICT-Action: META_TEXTALIGN_ACTION!" );
1985*b1cdbd2cSJim Jagielski 			}
1986*b1cdbd2cSJim Jagielski 			break;
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski 			case META_MAPMODE_ACTION:
1989*b1cdbd2cSJim Jagielski 			{
1990*b1cdbd2cSJim Jagielski 				const MetaMapModeAction* pA = (const MetaMapModeAction*) pMA;
1991*b1cdbd2cSJim Jagielski 
1992*b1cdbd2cSJim Jagielski 				if (aSrcMapMode!=pA->GetMapMode())
1993*b1cdbd2cSJim Jagielski 				{
1994*b1cdbd2cSJim Jagielski 					if( pA->GetMapMode().GetMapUnit() == MAP_RELATIVE )
1995*b1cdbd2cSJim Jagielski 					{
1996*b1cdbd2cSJim Jagielski 						MapMode aMM = pA->GetMapMode();
1997*b1cdbd2cSJim Jagielski 						Fraction aScaleX = aMM.GetScaleX();
1998*b1cdbd2cSJim Jagielski 						Fraction aScaleY = aMM.GetScaleY();
1999*b1cdbd2cSJim Jagielski 
2000*b1cdbd2cSJim Jagielski 						Point aOrigin = aSrcMapMode.GetOrigin();
2001*b1cdbd2cSJim Jagielski 						BigInt aX( aOrigin.X() );
2002*b1cdbd2cSJim Jagielski 						aX *= BigInt( aScaleX.GetDenominator() );
2003*b1cdbd2cSJim Jagielski 						if( aOrigin.X() >= 0 )
2004*b1cdbd2cSJim Jagielski 						{
2005*b1cdbd2cSJim Jagielski 							if( aScaleX.GetNumerator() >= 0 )
2006*b1cdbd2cSJim Jagielski 								aX += BigInt( aScaleX.GetNumerator()/2 );
2007*b1cdbd2cSJim Jagielski 							else
2008*b1cdbd2cSJim Jagielski 								aX -= BigInt( (aScaleX.GetNumerator()+1)/2 );
2009*b1cdbd2cSJim Jagielski 						}
2010*b1cdbd2cSJim Jagielski 						else
2011*b1cdbd2cSJim Jagielski 						{
2012*b1cdbd2cSJim Jagielski 							if( aScaleX.GetNumerator() >= 0 )
2013*b1cdbd2cSJim Jagielski 								aX -= BigInt( (aScaleX.GetNumerator()-1)/2 );
2014*b1cdbd2cSJim Jagielski 							else
2015*b1cdbd2cSJim Jagielski 								aX += BigInt( aScaleX.GetNumerator()/2 );
2016*b1cdbd2cSJim Jagielski 						}
2017*b1cdbd2cSJim Jagielski 
2018*b1cdbd2cSJim Jagielski 						aX /= BigInt( aScaleX.GetNumerator() );
2019*b1cdbd2cSJim Jagielski 						aOrigin.X() = (long)aX + aMM.GetOrigin().X();
2020*b1cdbd2cSJim Jagielski 						BigInt aY( aOrigin.Y() );
2021*b1cdbd2cSJim Jagielski 						aY *= BigInt( aScaleY.GetDenominator() );
2022*b1cdbd2cSJim Jagielski 
2023*b1cdbd2cSJim Jagielski 						if( aOrigin.Y() >= 0 )
2024*b1cdbd2cSJim Jagielski 						{
2025*b1cdbd2cSJim Jagielski 							if( aScaleY.GetNumerator() >= 0 )
2026*b1cdbd2cSJim Jagielski 								aY += BigInt( aScaleY.GetNumerator()/2 );
2027*b1cdbd2cSJim Jagielski 							else
2028*b1cdbd2cSJim Jagielski 								aY -= BigInt( (aScaleY.GetNumerator()+1)/2 );
2029*b1cdbd2cSJim Jagielski 						}
2030*b1cdbd2cSJim Jagielski 						else
2031*b1cdbd2cSJim Jagielski 						{
2032*b1cdbd2cSJim Jagielski 							if( aScaleY.GetNumerator() >= 0 )
2033*b1cdbd2cSJim Jagielski 								aY -= BigInt( (aScaleY.GetNumerator()-1)/2 );
2034*b1cdbd2cSJim Jagielski 							else
2035*b1cdbd2cSJim Jagielski 								aY += BigInt( aScaleY.GetNumerator()/2 );
2036*b1cdbd2cSJim Jagielski 						}
2037*b1cdbd2cSJim Jagielski 
2038*b1cdbd2cSJim Jagielski 						aY /= BigInt( aScaleY.GetNumerator() );
2039*b1cdbd2cSJim Jagielski 						aOrigin.Y() = (long)aY + aMM.GetOrigin().Y();
2040*b1cdbd2cSJim Jagielski 						aSrcMapMode.SetOrigin( aOrigin );
2041*b1cdbd2cSJim Jagielski 
2042*b1cdbd2cSJim Jagielski 						aScaleX *= aSrcMapMode.GetScaleX();
2043*b1cdbd2cSJim Jagielski 						aScaleY *= aSrcMapMode.GetScaleY();
2044*b1cdbd2cSJim Jagielski 						aSrcMapMode.SetScaleX( aScaleX );
2045*b1cdbd2cSJim Jagielski 						aSrcMapMode.SetScaleY( aScaleY );
2046*b1cdbd2cSJim Jagielski 					}
2047*b1cdbd2cSJim Jagielski 					else
2048*b1cdbd2cSJim Jagielski 						aSrcMapMode = pA->GetMapMode();
2049*b1cdbd2cSJim Jagielski 				}
2050*b1cdbd2cSJim Jagielski 			}
2051*b1cdbd2cSJim Jagielski 			break;
2052*b1cdbd2cSJim Jagielski 
2053*b1cdbd2cSJim Jagielski 			case META_FONT_ACTION:
2054*b1cdbd2cSJim Jagielski 			{
2055*b1cdbd2cSJim Jagielski 				const MetaFontAction* pA = (const MetaFontAction*) pMA;
2056*b1cdbd2cSJim Jagielski 				aSrcFont=pA->GetFont();
2057*b1cdbd2cSJim Jagielski 			}
2058*b1cdbd2cSJim Jagielski 			break;
2059*b1cdbd2cSJim Jagielski 
2060*b1cdbd2cSJim Jagielski 			case META_PUSH_ACTION:
2061*b1cdbd2cSJim Jagielski 			{
2062*b1cdbd2cSJim Jagielski 				PictWriterAttrStackMember * pAt = new PictWriterAttrStackMember;
2063*b1cdbd2cSJim Jagielski 				pAt->aLineColor=aLineColor;
2064*b1cdbd2cSJim Jagielski 				pAt->aFillColor=aFillColor;
2065*b1cdbd2cSJim Jagielski 				pAt->eRasterOp=eSrcRasterOp;
2066*b1cdbd2cSJim Jagielski 				pAt->aFont=aSrcFont;
2067*b1cdbd2cSJim Jagielski 				pAt->aMapMode=aSrcMapMode;
2068*b1cdbd2cSJim Jagielski 				pAt->aClipRect=aClipRect;
2069*b1cdbd2cSJim Jagielski 				pAt->pSucc=pAttrStack;
2070*b1cdbd2cSJim Jagielski 				pAttrStack=pAt;
2071*b1cdbd2cSJim Jagielski 			}
2072*b1cdbd2cSJim Jagielski 			break;
2073*b1cdbd2cSJim Jagielski 
2074*b1cdbd2cSJim Jagielski 			case META_POP_ACTION:
2075*b1cdbd2cSJim Jagielski 			{
2076*b1cdbd2cSJim Jagielski 				PictWriterAttrStackMember* pAt=pAttrStack;
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski 				if( pAt )
2079*b1cdbd2cSJim Jagielski 				{
2080*b1cdbd2cSJim Jagielski 					aLineColor=pAt->aLineColor;
2081*b1cdbd2cSJim Jagielski 					aFillColor=pAt->aFillColor;
2082*b1cdbd2cSJim Jagielski 					eSrcRasterOp=pAt->eRasterOp;
2083*b1cdbd2cSJim Jagielski 					aSrcFont=pAt->aFont;
2084*b1cdbd2cSJim Jagielski 					aSrcMapMode=pAt->aMapMode;
2085*b1cdbd2cSJim Jagielski 					if ( pAt->aClipRect != aClipRect )
2086*b1cdbd2cSJim Jagielski 					{
2087*b1cdbd2cSJim Jagielski 						Rectangle aRect( pAt->aClipRect );
2088*b1cdbd2cSJim Jagielski 						*pPict	<< (sal_uInt16)1	// opcode 1
2089*b1cdbd2cSJim Jagielski 								<< (sal_uInt16)10	// data size
2090*b1cdbd2cSJim Jagielski 								<< (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left()
2091*b1cdbd2cSJim Jagielski 								<< (sal_Int16)aRect.Bottom() << (sal_Int16)aRect.Right();
2092*b1cdbd2cSJim Jagielski 					}
2093*b1cdbd2cSJim Jagielski 					aClipRect=pAt->aClipRect;
2094*b1cdbd2cSJim Jagielski 					pAttrStack=pAt->pSucc;
2095*b1cdbd2cSJim Jagielski 					delete pAt;
2096*b1cdbd2cSJim Jagielski 				}
2097*b1cdbd2cSJim Jagielski 			}
2098*b1cdbd2cSJim Jagielski 			break;
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski 			case META_RASTEROP_ACTION:
2101*b1cdbd2cSJim Jagielski 			{
2102*b1cdbd2cSJim Jagielski 				const MetaRasterOpAction* pA = (const MetaRasterOpAction*) pMA;
2103*b1cdbd2cSJim Jagielski 				eSrcRasterOp=pA->GetRasterOp();
2104*b1cdbd2cSJim Jagielski 			}
2105*b1cdbd2cSJim Jagielski 			break;
2106*b1cdbd2cSJim Jagielski 
2107*b1cdbd2cSJim Jagielski 			case META_TRANSPARENT_ACTION:
2108*b1cdbd2cSJim Jagielski 			{
2109*b1cdbd2cSJim Jagielski 				const PolyPolygon& rPolyPoly = ( (const MetaTransparentAction*) pMA )->GetPolyPolygon();
2110*b1cdbd2cSJim Jagielski 
2111*b1cdbd2cSJim Jagielski 				if (aFillColor!=Color( COL_TRANSPARENT ))
2112*b1cdbd2cSJim Jagielski 				{
2113*b1cdbd2cSJim Jagielski 					SetAttrForPaint();
2114*b1cdbd2cSJim Jagielski 					WriteOpcode_Poly( PDM_PAINT, PolyPolygonToPolygon( rPolyPoly ) );
2115*b1cdbd2cSJim Jagielski 				}
2116*b1cdbd2cSJim Jagielski 
2117*b1cdbd2cSJim Jagielski 				if (aLineColor!=Color( COL_TRANSPARENT ))
2118*b1cdbd2cSJim Jagielski 				{
2119*b1cdbd2cSJim Jagielski 					SetAttrForFrame();
2120*b1cdbd2cSJim Jagielski 					for( sal_uInt16 i = 0, nCount = rPolyPoly.Count(); i < nCount; i++ )
2121*b1cdbd2cSJim Jagielski 						WriteOpcode_Poly( PDM_FRAME, rPolyPoly.GetObject( i ) );
2122*b1cdbd2cSJim Jagielski 				}
2123*b1cdbd2cSJim Jagielski 			}
2124*b1cdbd2cSJim Jagielski 			break;
2125*b1cdbd2cSJim Jagielski 
2126*b1cdbd2cSJim Jagielski 			case META_FLOATTRANSPARENT_ACTION:
2127*b1cdbd2cSJim Jagielski 			{
2128*b1cdbd2cSJim Jagielski 				const MetaFloatTransparentAction* pA = (const MetaFloatTransparentAction*) pMA;
2129*b1cdbd2cSJim Jagielski 
2130*b1cdbd2cSJim Jagielski 				GDIMetaFile		aTmpMtf( pA->GetGDIMetaFile() );
2131*b1cdbd2cSJim Jagielski 				Point			aSrcPt( aTmpMtf.GetPrefMapMode().GetOrigin() );
2132*b1cdbd2cSJim Jagielski 				const Size		aSrcSize( aTmpMtf.GetPrefSize() );
2133*b1cdbd2cSJim Jagielski 				const Point		aDestPt( pA->GetPoint() );
2134*b1cdbd2cSJim Jagielski 				const Size		aDestSize( pA->GetSize() );
2135*b1cdbd2cSJim Jagielski 				const double	fScaleX = aSrcSize.Width() ? (double) aDestSize.Width() / aSrcSize.Width() : 1.0;
2136*b1cdbd2cSJim Jagielski 				const double	fScaleY = aSrcSize.Height() ? (double) aDestSize.Height() / aSrcSize.Height() : 1.0;
2137*b1cdbd2cSJim Jagielski 				long			nMoveX, nMoveY;
2138*b1cdbd2cSJim Jagielski 
2139*b1cdbd2cSJim Jagielski 				if( fScaleX != 1.0 || fScaleY != 1.0 )
2140*b1cdbd2cSJim Jagielski 				{
2141*b1cdbd2cSJim Jagielski 					aTmpMtf.Scale( fScaleX, fScaleY );
2142*b1cdbd2cSJim Jagielski 					aSrcPt.X() = FRound( aSrcPt.X() * fScaleX ), aSrcPt.Y() = FRound( aSrcPt.Y() * fScaleY );
2143*b1cdbd2cSJim Jagielski 				}
2144*b1cdbd2cSJim Jagielski 
2145*b1cdbd2cSJim Jagielski 				nMoveX = aDestPt.X() - aSrcPt.X(), nMoveY = aDestPt.Y() - aSrcPt.Y();
2146*b1cdbd2cSJim Jagielski 
2147*b1cdbd2cSJim Jagielski 				if( nMoveX || nMoveY )
2148*b1cdbd2cSJim Jagielski 					aTmpMtf.Move( nMoveX, nMoveY );
2149*b1cdbd2cSJim Jagielski 
2150*b1cdbd2cSJim Jagielski 				WriteOpcodes( aTmpMtf );
2151*b1cdbd2cSJim Jagielski 			}
2152*b1cdbd2cSJim Jagielski 			break;
2153*b1cdbd2cSJim Jagielski 
2154*b1cdbd2cSJim Jagielski 		}
2155*b1cdbd2cSJim Jagielski 
2156*b1cdbd2cSJim Jagielski 		nWrittenActions++;
2157*b1cdbd2cSJim Jagielski 		MayCallback();
2158*b1cdbd2cSJim Jagielski 
2159*b1cdbd2cSJim Jagielski 		if (pPict->GetError())
2160*b1cdbd2cSJim Jagielski 		bStatus=sal_False;
2161*b1cdbd2cSJim Jagielski 
2162*b1cdbd2cSJim Jagielski 		if (bStatus==sal_False)
2163*b1cdbd2cSJim Jagielski 		break;
2164*b1cdbd2cSJim Jagielski 	}
2165*b1cdbd2cSJim Jagielski }
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski 
WriteHeader(const GDIMetaFile & rMTF)2168*b1cdbd2cSJim Jagielski void PictWriter::WriteHeader(const GDIMetaFile & rMTF)
2169*b1cdbd2cSJim Jagielski {
2170*b1cdbd2cSJim Jagielski 	sal_uInt16  i;
2171*b1cdbd2cSJim Jagielski 	Size aSize( rMTF.GetPrefSize() );
2172*b1cdbd2cSJim Jagielski 	Point aPoint;
2173*b1cdbd2cSJim Jagielski 	Rectangle	aRect( aPoint, aSize );
2174*b1cdbd2cSJim Jagielski 
2175*b1cdbd2cSJim Jagielski 	// 512 Bytes "Muell" am Anfang:
2176*b1cdbd2cSJim Jagielski 	for (i=0;i<128;i++) *pPict << (sal_uInt32)0;
2177*b1cdbd2cSJim Jagielski 
2178*b1cdbd2cSJim Jagielski 	// Lo-16-Bits der Groesse der Datei ohne die 512 Bytes Muell:
2179*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt16)0; // wird spaeter durch UpdateHeader() berichtigt
2180*b1cdbd2cSJim Jagielski 
2181*b1cdbd2cSJim Jagielski 	// Das Bounding-Rectangle (y1,x1,y2,x2 !):
2182*b1cdbd2cSJim Jagielski 	WriteRectangle( aRect );
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski 	// Version 2:
2185*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt32)0x001102ff;
2186*b1cdbd2cSJim Jagielski 
2187*b1cdbd2cSJim Jagielski 	// Extended-Version-2-Header:
2188*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt16)0x0c00                            // Opcode
2189*b1cdbd2cSJim Jagielski 		   << (sal_uInt16)0xfffe                            // Version (?)
2190*b1cdbd2cSJim Jagielski 		   << (sal_uInt16)0x0000                            // Reserved
2191*b1cdbd2cSJim Jagielski 		   << (sal_uInt32) 0x00480000                        // hRes
2192*b1cdbd2cSJim Jagielski 		   << (sal_uInt32) 0x00480000;
2193*b1cdbd2cSJim Jagielski 	WriteRectangle( aRect );
2194*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt32)0x00000000;                        // Reserved
2195*b1cdbd2cSJim Jagielski 
2196*b1cdbd2cSJim Jagielski 	// viele Import-Filter verlangen die Angabe eines
2197*b1cdbd2cSJim Jagielski 	// Clipping-Bereichs am Anfang
2198*b1cdbd2cSJim Jagielski 
2199*b1cdbd2cSJim Jagielski 	WriteOpcode_ClipRect( aRect );
2200*b1cdbd2cSJim Jagielski }
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski 
UpdateHeader()2203*b1cdbd2cSJim Jagielski void PictWriter::UpdateHeader()
2204*b1cdbd2cSJim Jagielski {
2205*b1cdbd2cSJim Jagielski 	sal_uLong nPos;
2206*b1cdbd2cSJim Jagielski 
2207*b1cdbd2cSJim Jagielski 	// Lo-16-Bits der Groesse der Datei ohne die 512 Bytes Muell berichtigen:
2208*b1cdbd2cSJim Jagielski 	nPos=pPict->Tell();
2209*b1cdbd2cSJim Jagielski 	pPict->Seek(512);
2210*b1cdbd2cSJim Jagielski 	*pPict << (sal_uInt16)((nPos-512)&0x0000ffff);
2211*b1cdbd2cSJim Jagielski 	pPict->Seek(nPos);
2212*b1cdbd2cSJim Jagielski }
2213*b1cdbd2cSJim Jagielski 
2214*b1cdbd2cSJim Jagielski 
WritePict(const GDIMetaFile & rMTF,SvStream & rTargetStream,FilterConfigItem * pFilterConfigItem)2215*b1cdbd2cSJim Jagielski sal_Bool PictWriter::WritePict(const GDIMetaFile & rMTF, SvStream & rTargetStream, FilterConfigItem* pFilterConfigItem )
2216*b1cdbd2cSJim Jagielski {
2217*b1cdbd2cSJim Jagielski 	PictWriterAttrStackMember*  pAt;
2218*b1cdbd2cSJim Jagielski 	MapMode                     aMap72( MAP_INCH );
2219*b1cdbd2cSJim Jagielski 	Fraction                    aDPIFrac( 1, 72 );
2220*b1cdbd2cSJim Jagielski 
2221*b1cdbd2cSJim Jagielski 	bStatus=sal_True;
2222*b1cdbd2cSJim Jagielski 	nLastPercent=0;
2223*b1cdbd2cSJim Jagielski 
2224*b1cdbd2cSJim Jagielski 	if ( pFilterConfigItem )
2225*b1cdbd2cSJim Jagielski 	{
2226*b1cdbd2cSJim Jagielski 		xStatusIndicator = pFilterConfigItem->GetStatusIndicator();
2227*b1cdbd2cSJim Jagielski 		if ( xStatusIndicator.is() )
2228*b1cdbd2cSJim Jagielski 		{
2229*b1cdbd2cSJim Jagielski 			rtl::OUString aMsg;
2230*b1cdbd2cSJim Jagielski 			xStatusIndicator->start( aMsg, 100 );
2231*b1cdbd2cSJim Jagielski 		}
2232*b1cdbd2cSJim Jagielski 	}
2233*b1cdbd2cSJim Jagielski 
2234*b1cdbd2cSJim Jagielski 	pPict=&rTargetStream;
2235*b1cdbd2cSJim Jagielski 	pPict->SetNumberFormatInt(NUMBERFORMAT_INT_BIGENDIAN);
2236*b1cdbd2cSJim Jagielski 
2237*b1cdbd2cSJim Jagielski 	aLineColor=Color( COL_BLACK );
2238*b1cdbd2cSJim Jagielski 	aFillColor=Color( COL_WHITE );
2239*b1cdbd2cSJim Jagielski 	eSrcRasterOp=ROP_OVERPAINT;
2240*b1cdbd2cSJim Jagielski 	aSrcFont=Font();
2241*b1cdbd2cSJim Jagielski 	aSrcMapMode = rMTF.GetPrefMapMode();
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 	aMap72.SetScaleX( aDPIFrac );
2244*b1cdbd2cSJim Jagielski 	aMap72.SetScaleY( aDPIFrac );
2245*b1cdbd2cSJim Jagielski 	aTargetMapMode = aMap72;
2246*b1cdbd2cSJim Jagielski 
2247*b1cdbd2cSJim Jagielski 	pAttrStack=NULL;
2248*b1cdbd2cSJim Jagielski 
2249*b1cdbd2cSJim Jagielski 	bDstBkPatValid=sal_False;
2250*b1cdbd2cSJim Jagielski 	bDstTxFaceValid=sal_False;
2251*b1cdbd2cSJim Jagielski 	bDstTxModeValid=sal_False;
2252*b1cdbd2cSJim Jagielski 	bDstPnSizeValid=sal_False;
2253*b1cdbd2cSJim Jagielski 	bDstPnModeValid=sal_False;
2254*b1cdbd2cSJim Jagielski 	bDstPnPatValid=sal_False;
2255*b1cdbd2cSJim Jagielski 	bDstFillPatValid=sal_False;
2256*b1cdbd2cSJim Jagielski 	bDstTxSizeValid=sal_False;
2257*b1cdbd2cSJim Jagielski 	bDstFgColValid=sal_False;
2258*b1cdbd2cSJim Jagielski 	bDstBkColValid=sal_False;
2259*b1cdbd2cSJim Jagielski 	bDstPenPositionValid=sal_False;
2260*b1cdbd2cSJim Jagielski 	bDstTextPositionValid=sal_False;
2261*b1cdbd2cSJim Jagielski 	bDstFontNameValid=sal_False;
2262*b1cdbd2cSJim Jagielski 
2263*b1cdbd2cSJim Jagielski 	nNumberOfActions=0;
2264*b1cdbd2cSJim Jagielski 	nNumberOfBitmaps=0;
2265*b1cdbd2cSJim Jagielski 	nWrittenActions=0;
2266*b1cdbd2cSJim Jagielski 	nWrittenBitmaps=0;
2267*b1cdbd2cSJim Jagielski 	nActBitmapPercent=0;
2268*b1cdbd2cSJim Jagielski 
2269*b1cdbd2cSJim Jagielski 	CountActionsAndBitmaps(rMTF);
2270*b1cdbd2cSJim Jagielski 
2271*b1cdbd2cSJim Jagielski 	WriteHeader(rMTF);
2272*b1cdbd2cSJim Jagielski 	WriteOpcodes(rMTF);
2273*b1cdbd2cSJim Jagielski 	WriteOpcode_EndOfFile();
2274*b1cdbd2cSJim Jagielski 	UpdateHeader();
2275*b1cdbd2cSJim Jagielski 
2276*b1cdbd2cSJim Jagielski 	while (pAttrStack!=NULL) {
2277*b1cdbd2cSJim Jagielski 		pAt=pAttrStack;
2278*b1cdbd2cSJim Jagielski 		pAttrStack=pAt->pSucc;
2279*b1cdbd2cSJim Jagielski 		delete pAt;
2280*b1cdbd2cSJim Jagielski 	}
2281*b1cdbd2cSJim Jagielski 
2282*b1cdbd2cSJim Jagielski 	if ( xStatusIndicator.is() )
2283*b1cdbd2cSJim Jagielski 		xStatusIndicator->end();
2284*b1cdbd2cSJim Jagielski 
2285*b1cdbd2cSJim Jagielski 	return bStatus;
2286*b1cdbd2cSJim Jagielski }
2287*b1cdbd2cSJim Jagielski 
2288*b1cdbd2cSJim Jagielski //================== GraphicExport - die exportierte Funktion ================
2289*b1cdbd2cSJim Jagielski 
GraphicExport(SvStream & rStream,Graphic & rGraphic,FilterConfigItem * pFilterConfigItem,sal_Bool)2290*b1cdbd2cSJim Jagielski extern "C" sal_Bool __LOADONCALLAPI GraphicExport(SvStream & rStream, Graphic & rGraphic, FilterConfigItem* pFilterConfigItem, sal_Bool)
2291*b1cdbd2cSJim Jagielski {
2292*b1cdbd2cSJim Jagielski 	PictWriter      aPictWriter;
2293*b1cdbd2cSJim Jagielski 
2294*b1cdbd2cSJim Jagielski     // #119735# just use GetGDIMetaFile, it will create a bufferd version of contained bitmap now automatically
2295*b1cdbd2cSJim Jagielski 	GDIMetaFile aScaledMtf( rGraphic.GetGDIMetaFile() );
2296*b1cdbd2cSJim Jagielski 
2297*b1cdbd2cSJim Jagielski 	return aPictWriter.WritePict( aScaledMtf, rStream, pFilterConfigItem );
2298*b1cdbd2cSJim Jagielski }
2299*b1cdbd2cSJim Jagielski 
2300