xref: /aoo4110/main/filter/source/flash/swfwriter.hxx (revision b1cdbd2c)
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 #ifndef _SWF_WRITER_HXX_
25*b1cdbd2cSJim Jagielski #define _SWF_WRITER_HXX_
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XBreakIterator.hpp>
30*b1cdbd2cSJim Jagielski #include <vcl/font.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/gradient.hxx>
32*b1cdbd2cSJim Jagielski #include <unotools/tempfile.hxx>
33*b1cdbd2cSJim Jagielski #include <tools/color.hxx>
34*b1cdbd2cSJim Jagielski #include <tools/poly.hxx>
35*b1cdbd2cSJim Jagielski #include <tools/gen.hxx>
36*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski // #i73264#
39*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
40*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <vector>
43*b1cdbd2cSJim Jagielski #include <stack>
44*b1cdbd2cSJim Jagielski #include <map>
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski #ifdef AUGUSTUS
47*b1cdbd2cSJim Jagielski #include "lame.h"
48*b1cdbd2cSJim Jagielski #include "sndfile.h"
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #include <stdio.h>
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski class GDIMetaFile;
54*b1cdbd2cSJim Jagielski class BitmapEx;
55*b1cdbd2cSJim Jagielski class PolyPolygon;
56*b1cdbd2cSJim Jagielski class Gradient;
57*b1cdbd2cSJim Jagielski class SvtGraphicFill;
58*b1cdbd2cSJim Jagielski class SvtGraphicStroke;
59*b1cdbd2cSJim Jagielski class LineInfo;
60*b1cdbd2cSJim Jagielski namespace basegfx { class B2DPolygon; }
61*b1cdbd2cSJim Jagielski 
_uInt16(sal_Int32 nValue)62*b1cdbd2cSJim Jagielski inline sal_uInt16 _uInt16( sal_Int32 nValue )
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski 	OSL_ENSURE( (nValue >= 0) && ((sal_uInt32)nValue <= 0xffff), "overflow while converting sal_Int32 to sal_uInt16" );
65*b1cdbd2cSJim Jagielski 	return (sal_uInt16)nValue;
66*b1cdbd2cSJim Jagielski }
67*b1cdbd2cSJim Jagielski 
_Int16(sal_Int32 nValue)68*b1cdbd2cSJim Jagielski inline sal_Int16 _Int16( sal_Int32 nValue )
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski 	OSL_ENSURE( (nValue >= -32768) && (nValue <= 32767), "overflow while converting sal_Int32 to sal_Int16" );
71*b1cdbd2cSJim Jagielski 	return (sal_Int16)nValue;
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski class VirtualDevice;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski namespace swf {
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_END				= 0;
79*b1cdbd2cSJim Jagielski const sal_uInt8	TAG_SHOWFRAME		= 1;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBUTTON	= 7;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_BACKGROUNDCOLOR = 9;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DOACTION		= 12;
86*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_STARTSOUND		= 15;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_SOUNDSTREAMBLOCK = 19;
89*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_SOUNDSTREAMHEAD = 18;
90*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_SOUNDSTREAMHEAD2 = 45;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_JPEGTABLES		= 8;
93*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBITS		= 6;
94*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBITSLOSSLESS = 20;
95*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBITSJPEG2 = 21;
96*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBITSJPEG3 = 35;
97*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEBITSLOSSLESS2 = 36;
98*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEEDITTEXT= 37;
99*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_PLACEOBJECT		= 4;
100*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_PLACEOBJECT2	= 26;
101*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_REMOVEOBJECT2	= 28;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINEFONT		= 10;
104*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINETEXT		= 11;
105*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINESHAPE3	= 32;
106*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_DEFINESPRITE	= 39;
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_FRAMELABEL		= 43;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski const sal_uInt8 TAG_HEADER			= 0xff;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski /** converts a double to a 16.16 flash fixed value */
115*b1cdbd2cSJim Jagielski sal_uInt32 getFixed( double fValue );
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski typedef ::std::map<sal_uInt32, sal_uInt16> ChecksumCache;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski /** unsigned int 16 compare operation for stl */
122*b1cdbd2cSJim Jagielski struct ltuint16
123*b1cdbd2cSJim Jagielski {
operator ()swf::ltuint16124*b1cdbd2cSJim Jagielski   bool operator()(sal_uInt16 s1, sal_uInt16 s2) const
125*b1cdbd2cSJim Jagielski   {
126*b1cdbd2cSJim Jagielski     return s1 < s2;
127*b1cdbd2cSJim Jagielski   }
128*b1cdbd2cSJim Jagielski };
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski /** container class to create bit structures */
133*b1cdbd2cSJim Jagielski class BitStream
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski public:
136*b1cdbd2cSJim Jagielski 	BitStream();
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 	void writeUB( sal_uInt32 nValue, sal_uInt16 nBits );
139*b1cdbd2cSJim Jagielski 	void writeSB( sal_Int32 nValue, sal_uInt16 nBits );
140*b1cdbd2cSJim Jagielski 	void writeFB( sal_uInt32 nValue, sal_uInt16 nBits );
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	void pad();
143*b1cdbd2cSJim Jagielski 	void writeTo( SvStream& out );
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 	sal_uInt32 getOffset() const;
146*b1cdbd2cSJim Jagielski private:
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	std::vector< sal_uInt8 > maData;
149*b1cdbd2cSJim Jagielski 	sal_uInt8 mnBitPos;
150*b1cdbd2cSJim Jagielski 	sal_uInt8 mnCurrentByte;
151*b1cdbd2cSJim Jagielski };
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski /** this class collects all used glyphs for a given fonts and maps
156*b1cdbd2cSJim Jagielski 	characters to glyph ids.
157*b1cdbd2cSJim Jagielski */
158*b1cdbd2cSJim Jagielski class FlashFont
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski public:
161*b1cdbd2cSJim Jagielski 	FlashFont( const Font& rFont, sal_uInt16 nId );
162*b1cdbd2cSJim Jagielski 	~FlashFont();
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 	sal_uInt16 getGlyph( sal_uInt16 nChar, VirtualDevice* pVDev );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 	void write( SvStream& out );
167*b1cdbd2cSJim Jagielski 
getID() const168*b1cdbd2cSJim Jagielski 	sal_uInt16 getID() const { return mnId; }
getFont()169*b1cdbd2cSJim Jagielski 	const Font& getFont() { return maFont; }
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski private:
172*b1cdbd2cSJim Jagielski 	const Font	maFont;
173*b1cdbd2cSJim Jagielski 	std::map<sal_uInt16, sal_uInt16, ltuint16> maGlyphIndex;
174*b1cdbd2cSJim Jagielski 	sal_uInt16 mnNextIndex;
175*b1cdbd2cSJim Jagielski 	sal_uInt16 mnId;
176*b1cdbd2cSJim Jagielski 	BitStream maGlyphData;
177*b1cdbd2cSJim Jagielski 	std::vector< sal_uInt16 > maGlyphOffsets;
178*b1cdbd2cSJim Jagielski };
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski typedef std::vector<FlashFont*> FontMap;
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski /** this class helps creating flash tags */
185*b1cdbd2cSJim Jagielski class Tag : public SvMemoryStream
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski public:
188*b1cdbd2cSJim Jagielski 	Tag( sal_uInt8 nTagId );
189*b1cdbd2cSJim Jagielski 
getTagId() const190*b1cdbd2cSJim Jagielski 	sal_uInt8 getTagId() const { return mnTagId; }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	void write( SvStream& out );
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	void addUI32( sal_uInt32 nValue );
195*b1cdbd2cSJim Jagielski 	//unused as of yet void addI32( sal_Int32 nValue );
196*b1cdbd2cSJim Jagielski 	void addUI16( sal_uInt16 nValue );
197*b1cdbd2cSJim Jagielski 	//unused as of yet void addI16( sal_Int16 nValue );
198*b1cdbd2cSJim Jagielski 	void addUI8( sal_uInt8 nValue );
199*b1cdbd2cSJim Jagielski 	void addBits( BitStream& rIn );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	void addRGBA( const Color& rColor );
202*b1cdbd2cSJim Jagielski 	void addRGB( const Color& rColor );
203*b1cdbd2cSJim Jagielski 	void addRect( const Rectangle& rRect );
204*b1cdbd2cSJim Jagielski 	void addMatrix( const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264#
205*b1cdbd2cSJim Jagielski 	void addString( const char* pString );
206*b1cdbd2cSJim Jagielski 	void addStream( SvStream& rIn );
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	static void writeMatrix( SvStream& rOut, const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264#
209*b1cdbd2cSJim Jagielski 	static void writeRect( SvStream& rOut, const Rectangle& rRect );
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski private:
212*b1cdbd2cSJim Jagielski 	sal_uInt8 mnTagId;
213*b1cdbd2cSJim Jagielski };
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski /** this class helps to define flash sprites */
218*b1cdbd2cSJim Jagielski class Sprite
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski public:
221*b1cdbd2cSJim Jagielski 	Sprite( sal_uInt16 nId );
222*b1cdbd2cSJim Jagielski 	~Sprite();
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	void write( SvStream& out );
225*b1cdbd2cSJim Jagielski 
getId() const226*b1cdbd2cSJim Jagielski 	sal_uInt16 getId() const { return mnId; }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	void addTag( Tag* pNewTag );
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski private:
231*b1cdbd2cSJim Jagielski 	std::vector< Tag* > maTags;
232*b1cdbd2cSJim Jagielski 	sal_uInt16	mnId;
233*b1cdbd2cSJim Jagielski 	sal_uInt32	mnFrames;
234*b1cdbd2cSJim Jagielski };
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski /** this class stores a flash fill style for shapes */
239*b1cdbd2cSJim Jagielski class FillStyle
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski public:
242*b1cdbd2cSJim Jagielski 	enum FillStyleType { solid = 0x00, linear_gradient = 0x10, radial_gradient = 0x12, tiled_bitmap = 0x40, clipped_bitmap = 0x41 };
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 	/** this c'tor creates a solid fill style */
245*b1cdbd2cSJim Jagielski 	FillStyle( const Color& rSolidColor );
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	/** this c'tor creates a linear or radial gradient fill style */
248*b1cdbd2cSJim Jagielski 	FillStyle( const Rectangle& rBoundRect, const Gradient& rGradient );
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 	/** this c'tor creates a tiled or clipped bitmap fill style */
251*b1cdbd2cSJim Jagielski 	FillStyle( sal_uInt16 nBitmapId, bool bClipped, const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264#
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski 	void addTo( Tag* pTag ) const;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski private:
256*b1cdbd2cSJim Jagielski 	void Impl_addGradient( Tag* pTag ) const;
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski 	FillStyleType	meType;
259*b1cdbd2cSJim Jagielski 	::basegfx::B2DHomMatrix		maMatrix; // #i73264#
260*b1cdbd2cSJim Jagielski 	sal_uInt16		mnBitmapId;
261*b1cdbd2cSJim Jagielski 	Color			maColor;
262*b1cdbd2cSJim Jagielski 	Gradient		maGradient;
263*b1cdbd2cSJim Jagielski 	Rectangle		maBoundRect;
264*b1cdbd2cSJim Jagielski };
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski /** this class creates a flash movie from vcl geometry */
269*b1cdbd2cSJim Jagielski class Writer
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski 	friend class FlashFont;
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski public:
274*b1cdbd2cSJim Jagielski 	/** creates a writer for a new flash movie.
275*b1cdbd2cSJim Jagielski 		nDocWidth and nDocHeight are the dimensions of the movie.
276*b1cdbd2cSJim Jagielski 		They must be in 100th/mm.
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 		An invisible shape with the size of the document is placed at depth 1
279*b1cdbd2cSJim Jagielski 		and it clips all shapes on depth 2 and 3.
280*b1cdbd2cSJim Jagielski 	*/
281*b1cdbd2cSJim Jagielski 	Writer( sal_Int32 nDocWidthInput, sal_Int32 nDocHeightInput, sal_Int32 nDocWidth, sal_Int32 nDocHeight, sal_Int32 nJPEGcompressMode = -1 );
282*b1cdbd2cSJim Jagielski 	~Writer();
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	void storeTo( com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > &xOutStream );
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 	// geometry
287*b1cdbd2cSJim Jagielski 	void setClipping( const PolyPolygon* pClipPolyPolygon );
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 	/** defines a flash shape from a filled polygon.
290*b1cdbd2cSJim Jagielski 		The coordinates must be in twips */
291*b1cdbd2cSJim Jagielski 	sal_uInt16 defineShape( const Polygon& rPoly, const FillStyle& rFillStyle );
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 	/** defines a flash shape from a filled polypolygon.
294*b1cdbd2cSJim Jagielski 		The coordinates must be in twips */
295*b1cdbd2cSJim Jagielski 	sal_uInt16 defineShape( const PolyPolygon& rPolyPoly, const FillStyle& rFillStyle );
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	/** defines a flash shape from a outlined polypolygon.
298*b1cdbd2cSJim Jagielski 		The coordinates must be in twips */
299*b1cdbd2cSJim Jagielski 	sal_uInt16 defineShape( const PolyPolygon& rPolyPoly, sal_uInt16 nLineWidth, const Color& rLineColor );
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 	/** defines a flash shape from a vcl metafile.
302*b1cdbd2cSJim Jagielski 		The mapmode of the metafile is used to map all coordinates to twips.
303*b1cdbd2cSJim Jagielski 		A character id of a flash sprite is returned that contains all geometry
304*b1cdbd2cSJim Jagielski 		from the metafile.
305*b1cdbd2cSJim Jagielski 	*/
306*b1cdbd2cSJim Jagielski 	sal_uInt16 defineShape( const GDIMetaFile& rMtf, sal_Int16 x = 0, sal_Int16 y = 0 );
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski 	/** defines a bitmap and returns its flash id.
309*b1cdbd2cSJim Jagielski 	*/
310*b1cdbd2cSJim Jagielski 	sal_uInt16 defineBitmap( const BitmapEx& bmpSource, sal_Int32 nJPEGQualityLevel  );
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 	// control tags
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	/** inserts a place shape tag into the movie stream or the current sprite */
315*b1cdbd2cSJim Jagielski 	void placeShape( sal_uInt16 nID, sal_uInt16 nDepth, sal_Int32 x, sal_Int32 y, sal_uInt16 nClipDepth = 0, const char* pName = NULL );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski #ifdef THEFUTURE
318*b1cdbd2cSJim Jagielski 	/** inserts a move shape tag into the movie stream or the current sprite */
319*b1cdbd2cSJim Jagielski 	void moveShape( sal_uInt16 nDepth, sal_Int32 x, sal_Int32 y );
320*b1cdbd2cSJim Jagielski #endif
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 	/** inserts a remove shape tag into the movie stream or the current sprite */
323*b1cdbd2cSJim Jagielski 	void removeShape( sal_uInt16 nDepth );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 	/** inserts a show frame tag into the movie stream or the current sprite */
326*b1cdbd2cSJim Jagielski 	void showFrame();
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 	/** creates a new sprite and sets it as the current sprite for editing.
329*b1cdbd2cSJim Jagielski 		Only one sprite can be edited at one time */
330*b1cdbd2cSJim Jagielski 	sal_uInt16 startSprite();
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 	/** ends editing of the curent sprites and adds it to the movie stream */
333*b1cdbd2cSJim Jagielski 	void endSprite();
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	/** inserts a doaction tag with an ActionStop */
336*b1cdbd2cSJim Jagielski 	void stop();
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 	/** inserts a doaction tag with an ActionStop, place a button on depth nDepth that
339*b1cdbd2cSJim Jagielski 		continues playback on click */
340*b1cdbd2cSJim Jagielski 	void waitOnClick( sal_uInt16 nDepth );
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski 	/** inserts a doaction tag with an ActionGotoFrame */
343*b1cdbd2cSJim Jagielski 	void gotoFrame( sal_uInt16 nFrame );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski #ifdef AUGUSTUS
346*b1cdbd2cSJim Jagielski 	/** stream out a sound.  Should make it more intelligent so it interleaves with other items.*/
347*b1cdbd2cSJim Jagielski 	sal_Bool streamSound( const char * filename );
348*b1cdbd2cSJim Jagielski #endif
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski private:
351*b1cdbd2cSJim Jagielski 	Point					map( const Point& rPoint ) const;
352*b1cdbd2cSJim Jagielski 	Size					map( const Size& rSize ) const;
353*b1cdbd2cSJim Jagielski 	void					map( PolyPolygon& rPolyPolygon ) const;
354*b1cdbd2cSJim Jagielski 	sal_Int32				mapRelative( sal_Int32 n100thMM ) const;
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	void startTag( sal_uInt8 nTagId );
357*b1cdbd2cSJim Jagielski 	void endTag();
358*b1cdbd2cSJim Jagielski 	sal_uInt16 createID();
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski 	void Impl_writeBmp( sal_uInt16 nBitmapId, sal_uInt32 width, sal_uInt32 height, sal_uInt8 *pCompressed, sal_uInt32 compressed_size );
361*b1cdbd2cSJim Jagielski 	void Impl_writeImage( const BitmapEx& rBmpEx, const Point& rPt, const Size& rSz, const Point& rSrcPt, const Size& rSrcSz, const Rectangle& rClipRect, bool bMap );
362*b1cdbd2cSJim Jagielski 	void Impl_writeJPEG(sal_uInt16 nBitmapId, const sal_uInt8* pJpgData, sal_uInt32 nJpgDataLength, sal_uInt8 *pCompressed, sal_uInt32 compressed_size );
363*b1cdbd2cSJim Jagielski     void Impl_handleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon);
364*b1cdbd2cSJim Jagielski     void Impl_writeActions( const GDIMetaFile& rMtf );
365*b1cdbd2cSJim Jagielski 	void Impl_writePolygon( const Polygon& rPoly, sal_Bool bFilled );
366*b1cdbd2cSJim Jagielski 	void Impl_writePolygon( const Polygon& rPoly, sal_Bool bFilled, const Color& rFillColor, const Color& rLineColor );
367*b1cdbd2cSJim Jagielski 	void Impl_writePolyPolygon( const PolyPolygon& rPolyPoly, sal_Bool bFilled, sal_uInt8 nTransparence = 0);
368*b1cdbd2cSJim Jagielski 	void Impl_writePolyPolygon( const PolyPolygon& rPolyPoly, sal_Bool bFilled, const Color& rFillColor, const Color& rLineColor );
369*b1cdbd2cSJim Jagielski 	void Impl_writeText( const Point& rPos, const String& rText, const sal_Int32* pDXArray, long nWidth );
370*b1cdbd2cSJim Jagielski 	void Impl_writeText( const Point& rPos, const String& rText, const sal_Int32* pDXArray, long nWidth, Color aTextColor );
371*b1cdbd2cSJim Jagielski 	void Impl_writeGradientEx( const PolyPolygon& rPolyPoly, const Gradient& rGradient );
372*b1cdbd2cSJim Jagielski 	void Impl_writeLine( const Point& rPt1, const Point& rPt2, const Color* pLineColor = NULL );
373*b1cdbd2cSJim Jagielski 	void Impl_writeRect( const Rectangle& rRect, long nRadX, long nRadY );
374*b1cdbd2cSJim Jagielski 	void Impl_writeEllipse( const Point& rCenter, long nRadX, long nRadY );
375*b1cdbd2cSJim Jagielski 	bool Impl_writeFilling( SvtGraphicFill& rFilling );
376*b1cdbd2cSJim Jagielski 	bool Impl_writeStroke( SvtGraphicStroke& rStroke );
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski 	FlashFont& Impl_getFont( const Font& rFont );
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 	static void Impl_addPolygon( BitStream& rBits, const Polygon& rPoly, sal_Bool bFilled );
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	static void Impl_addShapeRecordChange( BitStream& rBits, sal_Int16 dx, sal_Int16 dy, sal_Bool bFilled );
383*b1cdbd2cSJim Jagielski 	static void Impl_addStraightEdgeRecord( BitStream& rBits, sal_Int16 dx, sal_Int16 dy );
384*b1cdbd2cSJim Jagielski 	static void Impl_addCurvedEdgeRecord( BitStream& rBits, sal_Int16 control_dx, sal_Int16 control_dy, sal_Int16 anchor_dx, sal_Int16 anchor_dy );
385*b1cdbd2cSJim Jagielski 	static void Impl_addEndShapeRecord( BitStream& rBits );
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	static void Impl_addStraightLine( BitStream& rBits,
388*b1cdbd2cSJim Jagielski 								  Point& rLastPoint,
389*b1cdbd2cSJim Jagielski                                   const double P2x, const double P2y );
390*b1cdbd2cSJim Jagielski 	static void Impl_addQuadBezier( BitStream& rBits,
391*b1cdbd2cSJim Jagielski 								Point& rLastPoint,
392*b1cdbd2cSJim Jagielski                                 const double P2x, const double P2y,
393*b1cdbd2cSJim Jagielski                                 const double P3x, const double P3y );
394*b1cdbd2cSJim Jagielski 	static void Impl_quadBezierApprox( BitStream& rBits,
395*b1cdbd2cSJim Jagielski 								   Point& rLastPoint,
396*b1cdbd2cSJim Jagielski                                    const double d2,
397*b1cdbd2cSJim Jagielski                                    const double P1x, const double P1y,
398*b1cdbd2cSJim Jagielski                                    const double P2x, const double P2y,
399*b1cdbd2cSJim Jagielski                                    const double P3x, const double P3y,
400*b1cdbd2cSJim Jagielski                                    const double P4x, const double P4y );
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Reference < com::sun::star::i18n::XBreakIterator > Impl_GetBreakIterator();
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski private:
405*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator > mxBreakIterator;
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski 	FontMap					maFonts;
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	sal_Int32 mnDocWidth;
410*b1cdbd2cSJim Jagielski 	sal_Int32 mnDocHeight;
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	// AS: Scaling factor for output.
413*b1cdbd2cSJim Jagielski 	double mnDocXScale;
414*b1cdbd2cSJim Jagielski 	double mnDocYScale;
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 	sal_uInt16 mnWhiteBackgroundShapeId;
417*b1cdbd2cSJim Jagielski 	sal_uInt16 mnPageButtonId;
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 	VirtualDevice*	mpVDev;
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 	const PolyPolygon* mpClipPolyPolygon;
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski 	/** holds the informations of the objects defined in the movie stream
424*b1cdbd2cSJim Jagielski 		while executing defineShape
425*b1cdbd2cSJim Jagielski 	*/
426*b1cdbd2cSJim Jagielski 	typedef std::vector<sal_uInt16> CharacterIdVector;
427*b1cdbd2cSJim Jagielski 	CharacterIdVector		maShapeIds;
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 	Tag* mpTag;
430*b1cdbd2cSJim Jagielski 	Sprite*	mpSprite;
431*b1cdbd2cSJim Jagielski 	std::stack<Sprite*> mvSpriteStack;
432*b1cdbd2cSJim Jagielski 	ChecksumCache mBitmapCache;
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 	sal_uInt16 mnNextId;
435*b1cdbd2cSJim Jagielski 	sal_uInt32	mnFrames;
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski //	com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > mxOutStream;
438*b1cdbd2cSJim Jagielski 	oslFileHandle mxOutStream;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 	utl::TempFile maMovieTempFile;
441*b1cdbd2cSJim Jagielski 	utl::TempFile maFontsTempFile;
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski 	SvStream* mpMovieStream;
444*b1cdbd2cSJim Jagielski 	SvStream* mpFontsStream;
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski #ifdef AUGUSTUS
447*b1cdbd2cSJim Jagielski 	lame_global_flags *m_lame_flags;
448*b1cdbd2cSJim Jagielski #endif
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski 	sal_uInt8 mnGlobalTransparency;
451*b1cdbd2cSJim Jagielski 	sal_Int32 mnJPEGCompressMode;
452*b1cdbd2cSJim Jagielski };
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski #endif
459