blob: 7bd8982d2fb8437d1eae8598746db357274c4a4d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SVGWRITER_HXX
#define SVGWRITER_HXX
#include <cppuhelper/weak.hxx>
#include <rtl/ustring.hxx>
#include <tools/debug.hxx>
#include <tools/stream.hxx>
#include <tools/string.hxx>
#include <tools/urlobj.hxx>
#include <tools/stack.hxx>
#ifndef _SALBTYPE_HXX
#include <vcl/salbtype.hxx>
#endif
#ifndef _GDIMTF_HXX
#include <vcl/gdimtf.hxx>
#endif
#ifndef _METAACT_HXX
#include <vcl/metaact.hxx>
#endif
#ifndef _METAACT_HXX
#include <vcl/metric.hxx>
#endif
#ifndef _VIRDEV_HXX
#include <vcl/virdev.hxx>
#endif
#ifndef _CVTGRF_HXX
#include <vcl/cvtgrf.hxx>
#endif
#include <vcl/graphictools.hxx>
#include <xmloff/xmlexp.hxx>
#include <xmloff/nmspmap.hxx>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/uno/RuntimeException.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/registry/XRegistryKey.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <com/sun/star/io/XOutputStream.hpp>
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
#include <com/sun/star/i18n/XBreakIterator.hpp>
#include <com/sun/star/svg/XSVGWriter.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
// -----------------------------------------------------------------------------
#define _SVG_WRITE_EXTENTS 1
#undef _SVG_WRITE_TEXT_DESC
#undef _SVG_USE_CONFIG
// -----------------------------------------------------------------------------
#define NMSP_CPPU cppu
#define NMSP_UNO com::sun::star::uno
#define NMSP_LANG com::sun::star::lang
#define NMSP_SAX com::sun::star::xml::sax
#define NMSP_SVG com::sun::star::svg
#define NMSP_REGISTRY com::sun::star::registry
#define REF( _def_Obj ) NMSP_UNO::Reference< _def_Obj >
#define SEQ( _def_Obj ) NMSP_UNO::Sequence< _def_Obj >
#define B2UCONST( _def_pChar ) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(_def_pChar )))
#define SVG_DTD_STRING B2UCONST( "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">" )
#define SVG_TINY_DTD_STRING B2UCONST( "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG Tiny 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd\">" )
#define SVGWRITER_WRITE_NONE 0x00000000
#define SVGWRITER_WRITE_FILL 0x00000001
#define SVGWRITER_WRITE_TEXT 0x00000002
#define SVGWRITER_NO_SHAPE_COMMENTS 0x01000000
// ----------------------
// - SVGAttributeWriter -
// ----------------------
class SVGActionWriter;
class SVGExport;
class SVGFontExport;
class SVGAttributeWriter
{
private:
Font maCurFont;
Color maCurLineColor;
Color maCurFillColor;
SVGExport& mrExport;
SVGFontExport& mrFontExport;
SvXMLElementExport* mpElemFont;
SvXMLElementExport* mpElemPaint;
SVGAttributeWriter();
void ImplGetColorStr( const Color& rColor, ::rtl::OUString& rColorStr );
double ImplRound( double fVal, sal_Int32 nDecs = 3 );
public:
SVGAttributeWriter( SVGExport& rExport, SVGFontExport& rFontExport );
virtual ~SVGAttributeWriter();
void AddColorAttr( const char* pColorAttrName, const char* pColorOpacityAttrName, const Color& rColor );
void AddGradientDef( const Rectangle& rObjRect,const Gradient& rGradient, ::rtl::OUString& rGradientId );
void AddPaintAttr( const Color& rLineColor, const Color& rFillColor,
const Rectangle* pObjBoundRect = NULL, const Gradient* pFillGradient = NULL );
void SetFontAttr( const Font& rFont );
};
// ----------------------
// - SVGShapeDescriptor -
// ----------------------
struct SVGShapeDescriptor
{
PolyPolygon maShapePolyPoly;
Color maShapeFillColor;
Color maShapeLineColor;
sal_Int32 mnStrokeWidth;
SvtGraphicStroke::DashArray maDashArray;
::std::auto_ptr< Gradient > mapShapeGradient;
::rtl::OUString maId;
// added support for LineJoin and LineCap
basegfx::B2DLineJoin maLineJoin;
com::sun::star::drawing::LineCap maLineCap;
// -------------------------------------------------------------------------
SVGShapeDescriptor() :
maShapeFillColor( Color( COL_TRANSPARENT ) ),
maShapeLineColor( Color( COL_TRANSPARENT ) ),
mnStrokeWidth( 0 ),
maLineJoin(basegfx::B2DLINEJOIN_MITER), // miter is Svg 'stroke-linejoin' default
maLineCap(com::sun::star::drawing::LineCap_BUTT) // butt is Svg 'stroke-linecap' default
{
}
};
// -------------------
// - SVGActionWriter -
// -------------------
class SVGAttributeWriter;
class SVGExport;
class GDIMetaFile;
class SVGActionWriter
{
private:
Stack maContextStack;
::std::auto_ptr< SVGShapeDescriptor > mapCurShape;
SVGExport& mrExport;
SVGFontExport& mrFontExport;
SVGAttributeWriter* mpContext;
VirtualDevice* mpVDev;
MapMode maTargetMapMode;
sal_uInt32 mnInnerMtfCount;
sal_Bool mbDestroyVDev;
sal_Bool mbPaintAttrChanged;
sal_Bool mbFontAttrChanged;
sal_Bool mbClipAttrChanged;
SVGAttributeWriter* ImplAcquireContext() { maContextStack.Push( mpContext = new SVGAttributeWriter( mrExport, mrFontExport ) ); return mpContext; }
void ImplReleaseContext() { delete (SVGAttributeWriter*) maContextStack.Pop(); mpContext = (SVGAttributeWriter*) maContextStack.Top(); }
long ImplMap( sal_Int32 nVal ) const;
Point& ImplMap( const Point& rPt, Point& rDstPt ) const;
Size& ImplMap( const Size& rSz, Size& rDstSz ) const;
Rectangle& ImplMap( const Rectangle& rRect, Rectangle& rDstRect ) const;
Polygon& ImplMap( const Polygon& rPoly, Polygon& rDstPoly ) const;
PolyPolygon& ImplMap( const PolyPolygon& rPolyPoly, PolyPolygon& rDstPolyPoly ) const;
void ImplWriteLine( const Point& rPt1, const Point& rPt2, const Color* pLineColor = NULL,
sal_Bool bApplyMapping = sal_True );
void ImplWriteRect( const Rectangle& rRect, long nRadX = 0, long nRadY = 0,
sal_Bool bApplyMapping = sal_True );
void ImplWriteEllipse( const Point& rCenter, long nRadX, long nRadY,
sal_Bool bApplyMapping = sal_True );
void ImplWritePolyPolygon( const PolyPolygon& rPolyPoly, sal_Bool bLineOnly,
sal_Bool bApplyMapping = sal_True );
void ImplWriteShape( const SVGShapeDescriptor& rShape, sal_Bool bApplyMapping = sal_True );
void ImplWriteGradientEx( const PolyPolygon& rPolyPoly, const Gradient& rGradient, sal_uInt32 nWriteFlags,
sal_Bool bApplyMapping = sal_True );
void ImplWriteText( const Point& rPos, const String& rText, const sal_Int32* pDXArray, long nWidth,
sal_Bool bApplyMapping = sal_True );
void ImplWriteBmp( const BitmapEx& rBmpEx, const Point& rPt, const Size& rSz, const Point& rSrcPt, const Size& rSrcSz,
sal_Bool bApplyMapping = sal_True );
void ImplCheckFontAttributes();
void ImplCheckPaintAttributes();
void ImplWriteActions( const GDIMetaFile& rMtf, sal_uInt32 nWriteFlags, const ::rtl::OUString* pElementId );
public:
static ::rtl::OUString GetPathString( const PolyPolygon& rPolyPoly, sal_Bool bLine );
public:
SVGActionWriter( SVGExport& rExport, SVGFontExport& rFontExport );
virtual ~SVGActionWriter();
void WriteMetaFile( const Point& rPos100thmm,
const Size& rSize100thmm,
const GDIMetaFile& rMtf,
sal_uInt32 nWriteFlags,
const ::rtl::OUString* pElementId = NULL );
};
class SVGWriter : public NMSP_CPPU::OWeakObject, NMSP_SVG::XSVGWriter, com::sun::star::lang::XInitialization
{
private:
REF( NMSP_LANG::XMultiServiceFactory ) mxFact;
com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > maFilterData;
SVGWriter();
public:
SVGWriter( const REF( NMSP_LANG::XMultiServiceFactory )& rxMgr );
virtual ~SVGWriter();
// XInterface
virtual NMSP_UNO::Any SAL_CALL queryInterface( const NMSP_UNO::Type & rType ) throw( NMSP_UNO::RuntimeException );
virtual void SAL_CALL acquire() throw();
virtual void SAL_CALL release() throw();
// XSVGWriter
virtual void SAL_CALL write( const REF( NMSP_SAX::XDocumentHandler )& rxDocHandler,
const SEQ( sal_Int8 )& rMtfSeq ) throw( NMSP_UNO::RuntimeException );
// ::com::sun::star::lang::XInitialization
void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
};
::rtl::OUString SVGWriter_getImplementationName ()
throw ( ::com::sun::star::uno::RuntimeException );
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL SVGWriter_supportsService( const ::rtl::OUString& ServiceName )
throw ( ::com::sun::star::uno::RuntimeException );
// -----------------------------------------------------------------------------
::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL SVGWriter_getSupportedServiceNames( )
throw ( ::com::sun::star::uno::RuntimeException );
// -----------------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
SAL_CALL SVGWriter_createInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & rSMgr)
throw ( ::com::sun::star::uno::Exception );
#endif