diff options
Diffstat (limited to 'filter/source/flash/swfwriter.hxx')
-rw-r--r-- | filter/source/flash/swfwriter.hxx | 463 |
1 files changed, 463 insertions, 0 deletions
diff --git a/filter/source/flash/swfwriter.hxx b/filter/source/flash/swfwriter.hxx new file mode 100644 index 000000000000..e8c75b8095b6 --- /dev/null +++ b/filter/source/flash/swfwriter.hxx @@ -0,0 +1,463 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: swfwriter.hxx,v $ + * $Revision: 1.14 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SWF_WRITER_HXX_ +#define _SWF_WRITER_HXX_ + +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/i18n/XBreakIterator.hpp> +#include <vcl/font.hxx> +#include <vcl/gradient.hxx> +#include <unotools/tempfile.hxx> +#include <tools/color.hxx> +#include <tools/poly.hxx> +#include <tools/gen.hxx> +#include <tools/stream.hxx> + +// #i73264# +#include <basegfx/matrix/b2dhommatrix.hxx> +#include <osl/file.hxx> + +#include <vector> +#include <stack> +#include <map> + +#ifdef AUGUSTUS +#include "lame.h" +#include "sndfile.h" +#endif + +#include <stdio.h> + +class GDIMetaFile; +class BitmapEx; +class PolyPolygon; +class Gradient; +class SvtGraphicFill; +class SvtGraphicStroke; +class LineInfo; +namespace basegfx { class B2DPolygon; } + +inline sal_uInt16 _uInt16( sal_Int32 nValue ) +{ + OSL_ENSURE( (nValue >= 0) && ((sal_uInt32)nValue <= 0xffff), "overflow while converting sal_Int32 to sal_uInt16" ); + return (sal_uInt16)nValue; +} + +inline sal_Int16 _Int16( sal_Int32 nValue ) +{ + OSL_ENSURE( (nValue >= -32768) && (nValue <= 32767), "overflow while converting sal_Int32 to sal_Int16" ); + return (sal_Int16)nValue; +} + +class VirtualDevice; + +namespace swf { + +const sal_uInt8 TAG_END = 0; +const sal_uInt8 TAG_SHOWFRAME = 1; + +const sal_uInt8 TAG_DEFINEBUTTON = 7; + +const sal_uInt8 TAG_BACKGROUNDCOLOR = 9; + +const sal_uInt8 TAG_DOACTION = 12; +const sal_uInt8 TAG_STARTSOUND = 15; + +const sal_uInt8 TAG_SOUNDSTREAMBLOCK = 19; +const sal_uInt8 TAG_SOUNDSTREAMHEAD = 18; +const sal_uInt8 TAG_SOUNDSTREAMHEAD2 = 45; + +const sal_uInt8 TAG_JPEGTABLES = 8; +const sal_uInt8 TAG_DEFINEBITS = 6; +const sal_uInt8 TAG_DEFINEBITSLOSSLESS = 20; +const sal_uInt8 TAG_DEFINEBITSJPEG2 = 21; +const sal_uInt8 TAG_DEFINEBITSJPEG3 = 35; +const sal_uInt8 TAG_DEFINEBITSLOSSLESS2 = 36; +const sal_uInt8 TAG_DEFINEEDITTEXT= 37; +const sal_uInt8 TAG_PLACEOBJECT = 4; +const sal_uInt8 TAG_PLACEOBJECT2 = 26; +const sal_uInt8 TAG_REMOVEOBJECT2 = 28; + +const sal_uInt8 TAG_DEFINEFONT = 10; +const sal_uInt8 TAG_DEFINETEXT = 11; +const sal_uInt8 TAG_DEFINESHAPE3 = 32; +const sal_uInt8 TAG_DEFINESPRITE = 39; + +const sal_uInt8 TAG_FRAMELABEL = 43; + +const sal_uInt8 TAG_HEADER = 0xff; + +/////////////////////////////////////////////////////////////////////// + +/** converts a double to a 16.16 flash fixed value */ +sal_uInt32 getFixed( double fValue ); + +/////////////////////////////////////////////////////////////////////// + +typedef ::std::map<sal_uInt32, sal_uInt16> ChecksumCache; + +/** unsigned int 16 compare operation for stl */ +struct ltuint16 +{ + bool operator()(sal_uInt16 s1, sal_uInt16 s2) const + { + return s1 < s2; + } +}; + +/////////////////////////////////////////////////////////////////////// + +/** container class to create bit structures */ +class BitStream +{ +public: + BitStream(); + + void writeUB( sal_uInt32 nValue, sal_uInt16 nBits ); + void writeSB( sal_Int32 nValue, sal_uInt16 nBits ); + void writeFB( sal_uInt32 nValue, sal_uInt16 nBits ); + + void pad(); + void writeTo( SvStream& out ); + + sal_uInt32 getOffset() const; +private: + + std::vector< sal_uInt8 > maData; + sal_uInt8 mnBitPos; + sal_uInt8 mnCurrentByte; +}; + +/////////////////////////////////////////////////////////////////////// + +/** this class collects all used glyphs for a given fonts and maps + characters to glyph ids. +*/ +class FlashFont +{ +public: + FlashFont( const Font& rFont, sal_uInt16 nId ); + ~FlashFont(); + + sal_uInt16 getGlyph( sal_uInt16 nChar, VirtualDevice* pVDev ); + + void write( SvStream& out ); + + sal_uInt16 getID() const { return mnId; } + const Font& getFont() { return maFont; } + +private: + const Font maFont; + std::map<sal_uInt16, sal_uInt16, ltuint16> maGlyphIndex; + sal_uInt16 mnNextIndex; + sal_uInt16 mnId; + BitStream maGlyphData; + std::vector< sal_uInt16 > maGlyphOffsets; +}; + +typedef std::vector<FlashFont*> FontMap; + +/////////////////////////////////////////////////////////////////////// + +/** this class helps creating flash tags */ +class Tag : public SvMemoryStream +{ +public: + Tag( sal_uInt8 nTagId ); + + sal_uInt8 getTagId() const { return mnTagId; } + + void write( SvStream& out ); + + void addUI32( sal_uInt32 nValue ); + //unused as of yet void addI32( sal_Int32 nValue ); + void addUI16( sal_uInt16 nValue ); + //unused as of yet void addI16( sal_Int16 nValue ); + void addUI8( sal_uInt8 nValue ); + void addBits( BitStream& rIn ); + + void addRGBA( const Color& rColor ); + void addRGB( const Color& rColor ); + void addRect( const Rectangle& rRect ); + void addMatrix( const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264# + void addString( const char* pString ); + void addStream( SvStream& rIn ); + + static void writeMatrix( SvStream& rOut, const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264# + static void writeRect( SvStream& rOut, const Rectangle& rRect ); + +private: + sal_uInt8 mnTagId; +}; + +/////////////////////////////////////////////////////////////////////// + +/** this class helps to define flash sprites */ +class Sprite +{ +public: + Sprite( sal_uInt16 nId ); + ~Sprite(); + + void write( SvStream& out ); + + sal_uInt16 getId() const { return mnId; } + + void addTag( Tag* pNewTag ); + +private: + std::vector< Tag* > maTags; + sal_uInt16 mnId; + sal_uInt32 mnFrames; +}; + +/////////////////////////////////////////////////////////////////////// + +/** this class stores a flash fill style for shapes */ +class FillStyle +{ +public: + enum FillStyleType { solid = 0x00, linear_gradient = 0x10, radial_gradient = 0x12, tiled_bitmap = 0x40, clipped_bitmap = 0x41 }; + + /** this c'tor creates a solid fill style */ + FillStyle( const Color& rSolidColor ); + + /** this c'tor creates a linear or radial gradient fill style */ + FillStyle( const Rectangle& rBoundRect, const Gradient& rGradient ); + + /** this c'tor creates a tiled or clipped bitmap fill style */ + FillStyle( sal_uInt16 nBitmapId, bool bClipped, const ::basegfx::B2DHomMatrix& rMatrix ); // #i73264# + + void addTo( Tag* pTag ) const; + +private: + void Impl_addGradient( Tag* pTag ) const; + + FillStyleType meType; + ::basegfx::B2DHomMatrix maMatrix; // #i73264# + sal_uInt16 mnBitmapId; + Color maColor; + Gradient maGradient; + Rectangle maBoundRect; +}; + +/////////////////////////////////////////////////////////////////////// + +/** this class creates a flash movie from vcl geometry */ +class Writer +{ + friend class FlashFont; + +public: + /** creates a writer for a new flash movie. + nDocWidth and nDocHeight are the dimensions of the movie. + They must be in 100th/mm. + + An invisible shape with the size of the document is placed at depth 1 + and it clips all shapes on depth 2 and 3. + */ + Writer( sal_Int32 nDocWidthInput, sal_Int32 nDocHeightInput, sal_Int32 nDocWidth, sal_Int32 nDocHeight, sal_Int32 nJPEGcompressMode = -1 ); + ~Writer(); + + void storeTo( com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > &xOutStream ); + + // geometry + void setClipping( const PolyPolygon* pClipPolyPolygon ); + + /** defines a flash shape from a filled polygon. + The coordinates must be in twips */ + sal_uInt16 defineShape( const Polygon& rPoly, const FillStyle& rFillStyle ); + + /** defines a flash shape from a filled polypolygon. + The coordinates must be in twips */ + sal_uInt16 defineShape( const PolyPolygon& rPolyPoly, const FillStyle& rFillStyle ); + + /** defines a flash shape from a outlined polypolygon. + The coordinates must be in twips */ + sal_uInt16 defineShape( const PolyPolygon& rPolyPoly, sal_uInt16 nLineWidth, const Color& rLineColor ); + + /** defines a flash shape from a vcl metafile. + The mapmode of the metafile is used to map all coordinates to twips. + A character id of a flash sprite is returned that contains all geometry + from the metafile. + */ + sal_uInt16 defineShape( const GDIMetaFile& rMtf, sal_Int16 x = 0, sal_Int16 y = 0 ); + + /** defines a bitmap and returns its flash id. + */ + sal_uInt16 defineBitmap( const BitmapEx& bmpSource, sal_Int32 nJPEGQualityLevel ); + + // control tags + + /** inserts a place shape tag into the movie stream or the current sprite */ + void placeShape( sal_uInt16 nID, sal_uInt16 nDepth, sal_Int32 x, sal_Int32 y, sal_uInt16 nClipDepth = 0, const char* pName = NULL ); + + /** inserts a move shape tag into the movie stream or the current sprite */ + void moveShape( sal_uInt16 nDepth, sal_Int32 x, sal_Int32 y ); + + /** inserts a remove shape tag into the movie stream or the current sprite */ + void removeShape( sal_uInt16 nDepth ); + + /** inserts a show frame tag into the movie stream or the current sprite */ + void showFrame(); + + /** creates a new sprite and sets it as the current sprite for editing. + Only one sprite can be edited at one time */ + sal_uInt16 startSprite(); + + /** ends editing of the curent sprites and adds it to the movie stream */ + void endSprite(); + + /** inserts a doaction tag with an ActionStop */ + void stop(); + + /** inserts a doaction tag with an ActionStop, place a button on depth nDepth that + continues playback on click */ + void waitOnClick( sal_uInt16 nDepth ); + + /** inserts a doaction tag with an ActionGotoFrame */ + void gotoFrame( sal_uInt16 nFrame ); + +#ifdef AUGUSTUS + /** stream out a sound. Should make it more intelligent so it interleaves with other items.*/ + sal_Bool streamSound( const char * filename ); +#endif + +private: + Point map( const Point& rPoint ) const; + Size map( const Size& rSize ) const; + void map( PolyPolygon& rPolyPolygon ) const; + sal_Int32 mapRelative( sal_Int32 n100thMM ) const; + + void startTag( sal_uInt8 nTagId ); + void endTag(); + sal_uInt16 createID(); + + void Impl_writeBmp( sal_uInt16 nBitmapId, sal_uInt32 width, sal_uInt32 height, sal_uInt8 *pCompressed, sal_uInt32 compressed_size ); + void Impl_writeImage( const BitmapEx& rBmpEx, const Point& rPt, const Size& rSz, const Point& rSrcPt, const Size& rSrcSz, const Rectangle& rClipRect, bool bMap ); + void Impl_writeJPEG(sal_uInt16 nBitmapId, const sal_uInt8* pJpgData, sal_uInt32 nJpgDataLength, sal_uInt8 *pCompressed, sal_uInt32 compressed_size ); + void Impl_handleLineInfoPolyPolygons(const LineInfo& rInfo, const basegfx::B2DPolygon& rLinePolygon); + void Impl_writeActions( const GDIMetaFile& rMtf ); + void Impl_writePolygon( const Polygon& rPoly, sal_Bool bFilled ); + void Impl_writePolygon( const Polygon& rPoly, sal_Bool bFilled, const Color& rFillColor, const Color& rLineColor ); + void Impl_writePolyPolygon( const PolyPolygon& rPolyPoly, sal_Bool bFilled, sal_uInt8 nTransparence = 0); + void Impl_writePolyPolygon( const PolyPolygon& rPolyPoly, sal_Bool bFilled, const Color& rFillColor, const Color& rLineColor ); + void Impl_writeText( const Point& rPos, const String& rText, const sal_Int32* pDXArray, long nWidth ); + void Impl_writeText( const Point& rPos, const String& rText, const sal_Int32* pDXArray, long nWidth, Color aTextColor ); + void Impl_writeGradientEx( const PolyPolygon& rPolyPoly, const Gradient& rGradient ); + void Impl_writeLine( const Point& rPt1, const Point& rPt2, const Color* pLineColor = NULL ); + void Impl_writeRect( const Rectangle& rRect, long nRadX, long nRadY ); + void Impl_writeEllipse( const Point& rCenter, long nRadX, long nRadY ); + bool Impl_writeFilling( SvtGraphicFill& rFilling ); + bool Impl_writeStroke( SvtGraphicStroke& rStroke ); + + FlashFont& Impl_getFont( const Font& rFont ); + + static void Impl_addPolygon( BitStream& rBits, const Polygon& rPoly, sal_Bool bFilled ); + + static void Impl_addShapeRecordChange( BitStream& rBits, sal_Int16 dx, sal_Int16 dy, sal_Bool bFilled ); + static void Impl_addStraightEdgeRecord( BitStream& rBits, sal_Int16 dx, sal_Int16 dy ); + static void Impl_addCurvedEdgeRecord( BitStream& rBits, sal_Int16 control_dx, sal_Int16 control_dy, sal_Int16 anchor_dx, sal_Int16 anchor_dy ); + static void Impl_addEndShapeRecord( BitStream& rBits ); + + static void Impl_addStraightLine( BitStream& rBits, + Point& rLastPoint, + const double P2x, const double P2y ); + static void Impl_addQuadBezier( BitStream& rBits, + Point& rLastPoint, + const double P2x, const double P2y, + const double P3x, const double P3y ); + static void Impl_quadBezierApprox( BitStream& rBits, + Point& rLastPoint, + const double d2, + const double P1x, const double P1y, + const double P2x, const double P2y, + const double P3x, const double P3y, + const double P4x, const double P4y ); + + com::sun::star::uno::Reference < com::sun::star::i18n::XBreakIterator > Impl_GetBreakIterator(); + +private: + com::sun::star::uno::Reference< com::sun::star::i18n::XBreakIterator > mxBreakIterator; + + FontMap maFonts; + + sal_Int32 mnDocWidth; + sal_Int32 mnDocHeight; + + // AS: Scaling factor for output. + double mnDocXScale; + double mnDocYScale; + + sal_uInt16 mnWhiteBackgroundShapeId; + sal_uInt16 mnPageButtonId; + + VirtualDevice* mpVDev; + + const PolyPolygon* mpClipPolyPolygon; + + /** holds the informations of the objects defined in the movie stream + while executing defineShape + */ + typedef std::vector<sal_uInt16> CharacterIdVector; + CharacterIdVector maShapeIds; + + Tag* mpTag; + Sprite* mpSprite; + std::stack<Sprite*> mvSpriteStack; + ChecksumCache mBitmapCache; + + sal_uInt16 mnNextId; + sal_uInt32 mnFrames; + +// com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > mxOutStream; + oslFileHandle mxOutStream; + + utl::TempFile maMovieTempFile; + utl::TempFile maFontsTempFile; + + SvStream* mpMovieStream; + SvStream* mpFontsStream; + +#ifdef AUGUSTUS + lame_global_flags *m_lame_flags; +#endif + + sal_uInt8 mnGlobalTransparency; + sal_Int32 mnJPEGCompressMode; +}; + +/////////////////////////////////////////////////////////////////////// + +} + +#endif |