summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/graphictools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/source/gdi/graphictools.cxx')
-rw-r--r--vcl/source/gdi/graphictools.cxx759
1 files changed, 759 insertions, 0 deletions
diff --git a/vcl/source/gdi/graphictools.cxx b/vcl/source/gdi/graphictools.cxx
new file mode 100644
index 000000000000..83c0cd628cdb
--- /dev/null
+++ b/vcl/source/gdi/graphictools.cxx
@@ -0,0 +1,759 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+#include <tools/vcompat.hxx>
+
+#include <vcl/graphictools.hxx>
+
+static ::rtl::OString polyToString( const Polygon& rPoly )
+{
+ ::rtl::OString aStr;
+ USHORT nVertex;
+ for(nVertex=0; nVertex<rPoly.GetSize(); ++nVertex)
+ {
+ aStr += "(";
+ switch( rPoly.GetFlags(nVertex) )
+ {
+ case POLY_NORMAL:
+ case POLY_SMOOTH:
+ case POLY_SYMMTR:
+ aStr += "n: ";
+ break;
+
+ case POLY_CONTROL:
+ aStr += "c: ";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::polyToString invalid flag");
+ break;
+ }
+ aStr += ::rtl::OString::valueOf( static_cast< double >( rPoly[nVertex].getX() ) );
+ aStr += ",";
+ aStr += ::rtl::OString::valueOf( static_cast< double >( rPoly[nVertex].getY() ) );
+ aStr += ") ";
+ }
+
+ return aStr;
+}
+
+static ::rtl::OString polyPolyToString( const PolyPolygon& rPolyPoly )
+{
+ ::rtl::OString aStr;
+ USHORT nPoly;
+ for(nPoly=0; nPoly<rPolyPoly.Count(); ++nPoly)
+ {
+ const Polygon& rPoly = rPolyPoly[nPoly];
+
+ aStr += "{ ";
+ aStr += polyToString( rPoly );
+ aStr += "} ";
+ }
+
+ return aStr;
+}
+
+static ::rtl::OString dashToString( const SvtGraphicStroke::DashArray& rDashArray )
+{
+ ::rtl::OString aStr;
+
+ aStr += "dash: [ ";
+
+ int i, nDashes( rDashArray.size() );
+ for(i=0; i<nDashes; ++i)
+ {
+ aStr += ::rtl::OString::valueOf( rDashArray[i] );
+ aStr += " ";
+ }
+
+ aStr += "] ";
+
+ return aStr;
+}
+
+static ::rtl::OString colorToString( Color aColor )
+{
+ ::rtl::OString aStr;
+
+ aStr += "color: [ ";
+ aStr += ::rtl::OString::valueOf( aColor.GetRed() );
+ aStr += " ";
+ aStr += ::rtl::OString::valueOf( aColor.GetGreen() );
+ aStr += " ";
+ aStr += ::rtl::OString::valueOf( aColor.GetBlue() );
+ aStr += " ] ";
+
+ return aStr;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+SvtGraphicFill::Transform::Transform()
+{
+ matrix[0] = 1.0; matrix[1] = 0.0; matrix[2] = 0.0;
+ matrix[3] = 0.0; matrix[4] = 1.0; matrix[5] = 0.0;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+SvtGraphicStroke::SvtGraphicStroke() :
+ maPath(),
+ maStartArrow(),
+ maEndArrow(),
+ mfTransparency(),
+ mfStrokeWidth(),
+ maCapType(),
+ maJoinType(),
+ mfMiterLimit( 3.0 ),
+ maDashArray()
+{
+}
+
+SvtGraphicStroke::SvtGraphicStroke( const Polygon& rPath,
+ const PolyPolygon& rStartArrow,
+ const PolyPolygon& rEndArrow,
+ double fTransparency,
+ double fStrokeWidth,
+ CapType aCap,
+ JoinType aJoin,
+ double fMiterLimit,
+ const DashArray& rDashArray ) :
+ maPath( rPath ),
+ maStartArrow( rStartArrow ),
+ maEndArrow( rEndArrow ),
+ mfTransparency( fTransparency ),
+ mfStrokeWidth( fStrokeWidth ),
+ maCapType( aCap ),
+ maJoinType( aJoin ),
+ mfMiterLimit( fMiterLimit ),
+ maDashArray( rDashArray )
+{
+}
+
+void SvtGraphicStroke::getPath( Polygon& rPath ) const
+{
+ rPath = maPath;
+}
+
+void SvtGraphicStroke::getStartArrow( PolyPolygon& rPath ) const
+{
+ rPath = maStartArrow;
+}
+
+void SvtGraphicStroke::getEndArrow( PolyPolygon& rPath ) const
+{
+ rPath = maEndArrow;
+}
+
+double SvtGraphicStroke::getTransparency() const
+{
+ return mfTransparency;
+}
+
+double SvtGraphicStroke::getStrokeWidth() const
+{
+ return mfStrokeWidth;
+}
+
+SvtGraphicStroke::CapType SvtGraphicStroke::getCapType() const
+{
+ return maCapType;
+}
+
+SvtGraphicStroke::JoinType SvtGraphicStroke::getJoinType() const
+{
+ return maJoinType;
+}
+
+double SvtGraphicStroke::getMiterLimit() const
+{
+ return mfMiterLimit;
+}
+
+void SvtGraphicStroke::getDashArray( DashArray& rDashArray ) const
+{
+ rDashArray = maDashArray;
+}
+
+::rtl::OString SvtGraphicStroke::toString() const
+{
+ ::rtl::OString aStr;
+
+ aStr += polyToString( maPath );
+ aStr += "trans: ";
+ aStr += ::rtl::OString::valueOf( static_cast< double >(getTransparency()) );
+ aStr += " width: ";
+ aStr += ::rtl::OString::valueOf( static_cast< double >(getStrokeWidth()) );
+ aStr += " cap: ";
+ switch( getCapType() )
+ {
+ case capButt:
+ aStr += "butt";
+ break;
+
+ case capRound:
+ aStr += "round";
+ break;
+
+ case capSquare:
+ aStr += "square";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing cap type");
+ break;
+ }
+ aStr += " join: ";
+ switch( getJoinType() )
+ {
+ case joinMiter:
+ aStr += "miter";
+ break;
+
+ case joinRound:
+ aStr += "round";
+ break;
+
+ case joinBevel:
+ aStr += "bevel";
+ break;
+
+ case joinNone:
+ aStr += "none";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing join type");
+ break;
+ }
+ aStr += " ";
+
+ if( maStartArrow.Count() )
+ {
+ aStr += "start: ";
+ aStr += polyPolyToString( maStartArrow );
+ aStr += " ";
+ }
+
+ if( maEndArrow.Count() )
+ {
+ aStr += "end: ";
+ aStr += polyPolyToString( maEndArrow );
+ aStr += " ";
+ }
+
+ aStr += dashToString( maDashArray );
+
+ return aStr;
+}
+
+void SvtGraphicStroke::setPath( const Polygon& rPoly )
+{
+ maPath = rPoly;
+}
+
+void SvtGraphicStroke::setStartArrow( const PolyPolygon& rPoly )
+{
+ maStartArrow = rPoly;
+}
+
+void SvtGraphicStroke::setEndArrow( const PolyPolygon& rPoly )
+{
+ maEndArrow = rPoly;
+}
+
+void SvtGraphicStroke::setTransparency( double fTrans )
+{
+ mfTransparency = fTrans;
+}
+
+void SvtGraphicStroke::setStrokeWidth( double fWidth )
+{
+ mfStrokeWidth = fWidth;
+}
+
+void SvtGraphicStroke::setCapType( CapType eType )
+{
+ maCapType = eType;
+}
+
+void SvtGraphicStroke::setJoinType( JoinType eType )
+{
+ maJoinType = eType;
+}
+
+void SvtGraphicStroke::setMiterLimit( double fMiterLimit )
+{
+ mfMiterLimit = fMiterLimit;
+}
+
+void SvtGraphicStroke::setDashArray( const DashArray& rDashArray )
+{
+ maDashArray = rDashArray;
+}
+
+SvStream& operator<<( SvStream& rOStm, const SvtGraphicStroke& rClass )
+{
+ VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
+
+ rClass.maPath.Write( rOStm );
+ rClass.maStartArrow.Write( rOStm );
+ rClass.maEndArrow.Write( rOStm );
+ rOStm << rClass.mfTransparency;
+ rOStm << rClass.mfStrokeWidth;
+ UINT16 nTmp = sal::static_int_cast<UINT16>( rClass.maCapType );
+ rOStm << nTmp;
+ nTmp = sal::static_int_cast<UINT16>( rClass.maJoinType );
+ rOStm << nTmp;
+ rOStm << rClass.mfMiterLimit;
+
+ rOStm << static_cast<sal_uInt32>(rClass.maDashArray.size());
+ size_t i;
+ for(i=0; i<rClass.maDashArray.size(); ++i)
+ rOStm << rClass.maDashArray[i];
+
+ return rOStm;
+}
+
+SvStream& operator>>( SvStream& rIStm, SvtGraphicStroke& rClass )
+{
+ VersionCompat aCompat( rIStm, STREAM_READ );
+
+ rClass.maPath.Read( rIStm );
+ rClass.maStartArrow.Read( rIStm );
+ rClass.maEndArrow.Read( rIStm );
+ rIStm >> rClass.mfTransparency;
+ rIStm >> rClass.mfStrokeWidth;
+ UINT16 nTmp;
+ rIStm >> nTmp;
+ rClass.maCapType = SvtGraphicStroke::CapType(nTmp);
+ rIStm >> nTmp;
+ rClass.maJoinType = SvtGraphicStroke::JoinType(nTmp);
+ rIStm >> rClass.mfMiterLimit;
+
+ sal_uInt32 nSize;
+ rIStm >> nSize;
+ rClass.maDashArray.resize(nSize);
+ size_t i;
+ for(i=0; i<rClass.maDashArray.size(); ++i)
+ rIStm >> rClass.maDashArray[i];
+
+ return rIStm;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+SvtGraphicFill::SvtGraphicFill() :
+ maPath(),
+ maFillColor( COL_BLACK ),
+ mfTransparency(),
+ maFillRule(),
+ maFillType(),
+ maFillTransform(),
+ maHatchType(),
+ maHatchColor( COL_BLACK ),
+ maGradientType(),
+ maGradient1stColor( COL_BLACK ),
+ maGradient2ndColor( COL_BLACK ),
+ maGradientStepCount( gradientStepsInfinite ),
+ maFillGraphic()
+{
+}
+
+SvtGraphicFill::SvtGraphicFill( const PolyPolygon& rPath,
+ Color aFillColor,
+ double fTransparency,
+ FillRule aFillRule,
+ FillType aFillType,
+ const Transform& aFillTransform,
+ bool bTiling,
+ HatchType aHatchType,
+ Color aHatchColor,
+ GradientType aGradientType,
+ Color aGradient1stColor,
+ Color aGradient2ndColor,
+ int aGradientStepCount,
+ const Graphic& aFillGraphic ) :
+ maPath( rPath ),
+ maFillColor( aFillColor ),
+ mfTransparency( fTransparency ),
+ maFillRule( aFillRule ),
+ maFillType( aFillType ),
+ maFillTransform( aFillTransform ),
+ mbTiling( bTiling ),
+ maHatchType( aHatchType ),
+ maHatchColor( aHatchColor ),
+ maGradientType( aGradientType ),
+ maGradient1stColor( aGradient1stColor ),
+ maGradient2ndColor( aGradient2ndColor ),
+ maGradientStepCount( aGradientStepCount ),
+ maFillGraphic( aFillGraphic )
+{
+}
+
+void SvtGraphicFill::getPath( PolyPolygon& rPath ) const
+{
+ rPath = maPath;
+}
+
+Color SvtGraphicFill::getFillColor() const
+{
+ return maFillColor;
+}
+
+double SvtGraphicFill::getTransparency() const
+{
+ return mfTransparency;
+}
+
+SvtGraphicFill::FillRule SvtGraphicFill::getFillRule() const
+{
+ return maFillRule;
+}
+
+SvtGraphicFill::FillType SvtGraphicFill::getFillType() const
+{
+ return maFillType;
+}
+
+void SvtGraphicFill::getTransform( Transform& rTrans ) const
+{
+ rTrans = maFillTransform;
+}
+
+bool SvtGraphicFill::IsTiling() const
+{
+ return mbTiling;
+}
+
+bool SvtGraphicFill::isTiling() const
+{
+ return mbTiling;
+}
+
+SvtGraphicFill::HatchType SvtGraphicFill::getHatchType() const
+{
+ return maHatchType;
+}
+
+Color SvtGraphicFill::getHatchColor() const
+{
+ return maHatchColor;
+}
+
+SvtGraphicFill::GradientType SvtGraphicFill::getGradientType() const
+{
+ return maGradientType;
+}
+
+Color SvtGraphicFill::getGradient1stColor() const
+{
+ return maGradient1stColor;
+}
+
+Color SvtGraphicFill::getGradient2ndColor() const
+{
+ return maGradient2ndColor;
+}
+
+int SvtGraphicFill::getGradientStepCount() const
+{
+ return maGradientStepCount;
+}
+
+void SvtGraphicFill::getGraphic( Graphic& rGraphic ) const
+{
+ rGraphic = maFillGraphic;
+}
+
+::rtl::OString SvtGraphicFill::toString() const
+{
+ ::rtl::OString aStr;
+
+ aStr += polyPolyToString( maPath );
+ aStr += "fill";
+ aStr += colorToString( getFillColor() );
+ aStr += " trans: ";
+ aStr += ::rtl::OString::valueOf( static_cast< double >(getTransparency()) );
+ aStr += " rule: ";
+ switch( getFillRule() )
+ {
+ case fillNonZero:
+ aStr += "nonzero";
+ break;
+
+ case fillEvenOdd:
+ aStr += "evenodd";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicFill::toString missing fill rule");
+ break;
+ }
+ aStr += " type: ";
+ switch( getFillType() )
+ {
+ case fillSolid:
+ aStr += "solid";
+ break;
+
+ case fillGradient:
+ aStr += "gradient";
+ break;
+
+ case fillHatch:
+ aStr += "hatch";
+ break;
+
+ case fillTexture:
+ aStr += "bitmap";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing fill type");
+ break;
+ }
+
+ aStr += " transform: [ ";
+ int i;
+ for(i=0; i<Transform::MatrixSize; ++i)
+ aStr += ::rtl::OString::valueOf( maFillTransform.matrix[i] );
+ aStr += " ] ";
+
+ aStr += " hatch: ";
+ switch( getHatchType() )
+ {
+ case hatchSingle:
+ aStr += "single";
+ break;
+
+ case hatchDouble:
+ aStr += "double";
+ break;
+
+ case hatchTriple:
+ aStr += "triple";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing hatch type");
+ break;
+ }
+
+ aStr += " hatch";
+ aStr += colorToString( getHatchColor() );
+
+ aStr += " gradient: ";
+ switch( getGradientType() )
+ {
+ case gradientLinear:
+ aStr += "linear";
+ break;
+
+ case gradientRadial:
+ aStr += "radial";
+ break;
+
+ case gradientRectangular:
+ aStr += "rectangular";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing gradient type");
+ break;
+ }
+
+ aStr += " grad1st";
+ aStr += colorToString( getGradient1stColor() );
+
+ aStr += " grad2nd";
+ aStr += colorToString( getGradient2ndColor() );
+
+ aStr += " gradstep";
+ aStr += ::rtl::OString::valueOf( (sal_Int32)getGradientStepCount() );
+
+ if( maFillGraphic.GetType() != GRAPHIC_NONE )
+ {
+ aStr += " fillgraphic: ";
+ switch( maFillGraphic.GetType() )
+ {
+ case GRAPHIC_BITMAP:
+ aStr += "bitmap";
+ break;
+
+ case GRAPHIC_GDIMETAFILE:
+ aStr += "metafile";
+ break;
+
+ case GRAPHIC_DEFAULT:
+ aStr += "default";
+ break;
+
+ default:
+ DBG_ERROR( "SvtGraphicStroke::toString missing graphic type");
+ break;
+ }
+
+ aStr += " of ";
+ aStr += ::rtl::OString::valueOf( static_cast< sal_Int32 >(maFillGraphic.GetSizeBytes()) );
+ aStr += " bytes";
+ }
+
+ return aStr;
+}
+
+void SvtGraphicFill::setPath( const PolyPolygon& rPath )
+{
+ maPath = rPath;
+}
+
+void SvtGraphicFill::setFillColor( Color aFillColor )
+{
+ maFillColor = aFillColor;
+}
+
+void SvtGraphicFill::setTransparency( double fTransparency )
+{
+ mfTransparency = fTransparency;
+}
+
+void SvtGraphicFill::setFillRule( FillRule aFillRule )
+{
+ maFillRule = aFillRule;
+}
+
+void SvtGraphicFill::setFillType( FillType aFillType )
+{
+ maFillType = aFillType;
+}
+
+void SvtGraphicFill::setTransform( const Transform& rTransform )
+{
+ maFillTransform = rTransform;
+}
+
+void SvtGraphicFill::setTiling( bool bTiling )
+{
+ mbTiling = bTiling;
+}
+
+void SvtGraphicFill::setHatchType( HatchType aHatchType )
+{
+ maHatchType = aHatchType;
+}
+
+void SvtGraphicFill::setHatchColor( Color aHatchColor )
+{
+ maHatchColor = aHatchColor;
+}
+
+void SvtGraphicFill::setGradientType( GradientType aGradType )
+{
+ maGradientType = aGradType;
+}
+
+void SvtGraphicFill::setGradient1stColor( Color aColor )
+{
+ maGradient1stColor = aColor;
+}
+
+void SvtGraphicFill::setGradient2ndColor( Color aColor )
+{
+ maGradient2ndColor = aColor;
+}
+
+void SvtGraphicFill::setGradientStepCount( int aCount )
+{
+ maGradientStepCount = aCount;
+}
+
+void SvtGraphicFill::setGraphic( const Graphic& rGraphic )
+{
+ maFillGraphic = rGraphic;
+}
+
+SvStream& operator<<( SvStream& rOStm, const SvtGraphicFill& rClass )
+{
+ VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
+
+ rClass.maPath.Write( rOStm );
+ rOStm << rClass.maFillColor;
+ rOStm << rClass.mfTransparency;
+ UINT16 nTmp = sal::static_int_cast<UINT16>( rClass.maFillRule );
+ rOStm << nTmp;
+ nTmp = sal::static_int_cast<UINT16>( rClass.maFillType );
+ rOStm << nTmp;
+ int i;
+ for(i=0; i<SvtGraphicFill::Transform::MatrixSize; ++i)
+ rOStm << rClass.maFillTransform.matrix[i];
+ nTmp = rClass.mbTiling;
+ rOStm << nTmp;
+ nTmp = sal::static_int_cast<UINT16>( rClass.maHatchType );
+ rOStm << nTmp;
+ rOStm << rClass.maHatchColor;
+ nTmp = sal::static_int_cast<UINT16>( rClass.maGradientType );
+ rOStm << nTmp;
+ rOStm << rClass.maGradient1stColor;
+ rOStm << rClass.maGradient2ndColor;
+ rOStm << rClass.maGradientStepCount;
+ rOStm << rClass.maFillGraphic;
+
+ return rOStm;
+}
+
+SvStream& operator>>( SvStream& rIStm, SvtGraphicFill& rClass )
+{
+ VersionCompat aCompat( rIStm, STREAM_READ );
+
+ rClass.maPath.Read( rIStm );
+ rIStm >> rClass.maFillColor;
+ rIStm >> rClass.mfTransparency;
+ UINT16 nTmp;
+ rIStm >> nTmp;
+ rClass.maFillRule = SvtGraphicFill::FillRule( nTmp );
+ rIStm >> nTmp;
+ rClass.maFillType = SvtGraphicFill::FillType( nTmp );
+ int i;
+ for(i=0; i<SvtGraphicFill::Transform::MatrixSize; ++i)
+ rIStm >> rClass.maFillTransform.matrix[i];
+ rIStm >> nTmp;
+ rClass.mbTiling = nTmp;
+ rIStm >> nTmp;
+ rClass.maHatchType = SvtGraphicFill::HatchType( nTmp );
+ rIStm >> rClass.maHatchColor;
+ rIStm >> nTmp;
+ rClass.maGradientType = SvtGraphicFill::GradientType( nTmp );
+ rIStm >> rClass.maGradient1stColor;
+ rIStm >> rClass.maGradient2ndColor;
+ rIStm >> rClass.maGradientStepCount;
+ rIStm >> rClass.maFillGraphic;
+
+ return rIStm;
+}