| /************************************************************** |
| * |
| * 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 _XPOLY_HXX |
| #define _XPOLY_HXX |
| |
| // include --------------------------------------------------------------- |
| |
| #include <tools/solar.h> |
| #include <basegfx/polygon/b2dpolypolygon.hxx> |
| #include "svx/svxdllapi.h" |
| |
| class Point; |
| class Rectangle; |
| class SvStream; |
| class Polygon; |
| class PolyPolygon; |
| class OutputDevice; |
| |
| /************************************************************************/ |
| |
| #define XPOLYPOLY_APPEND 0xFFFF |
| #define XPOLY_APPEND 0xFFFF |
| |
| #define XPOLY_MAXPOINTS 0xFFF0 /* Auch fuer die 32-Bitter etwas Luft lassen */ |
| |
| /************************************************************************/ |
| // Punktstile im XPolygon: |
| // NORMAL : Anfangs- oder Endpunkt einer Kurve oder Linie |
| // SMOOTH : Glatter Uebergang zwischen Kurven |
| // SYMMTR : glatter und symmetrischer Uebergang zwischen Kurven |
| // CONTROL: Kontrollpunkt einer Bezierkurve |
| |
| enum XPolyFlags { XPOLY_NORMAL, XPOLY_SMOOTH, XPOLY_CONTROL, XPOLY_SYMMTR }; |
| |
| |
| /************************************************************************* |
| |* |
| |* Klasse XPolygon; hat neben dem Point-Array noch ein Array mit Flags, |
| |* die Informationen ueber den jeweiligen Punkt enthalten |
| |* |
| \************************************************************************/ |
| |
| class ImpXPolygon; |
| |
| class SVX_DLLPUBLIC XPolygon |
| { |
| protected: |
| ImpXPolygon* pImpXPolygon; |
| |
| // ImpXPolygon-ReferenceCount pruefen und ggf. abkoppeln |
| void CheckReference(); |
| |
| // Hilfsfunktionen fuer Bezierkonvertierung |
| void SubdivideBezier(sal_uInt16 nPos, sal_Bool bCalcFirst, double fT); |
| void GenBezArc(const Point& rCenter, long nRx, long nRy, |
| long nXHdl, long nYHdl, sal_uInt16 nStart, sal_uInt16 nEnd, |
| sal_uInt16 nQuad, sal_uInt16 nFirst); |
| sal_Bool CheckAngles(sal_uInt16& nStart, sal_uInt16 nEnd, sal_uInt16& nA1, sal_uInt16& nA2); |
| |
| public: |
| XPolygon( sal_uInt16 nSize=16, sal_uInt16 nResize=16 ); |
| XPolygon( const XPolygon& rXPoly ); |
| XPolygon( const Polygon& rPoly ); |
| XPolygon( const Rectangle& rRect, long nRx = 0, long nRy = 0 ); |
| XPolygon( const Point& rCenter, long nRx, long nRy, |
| sal_uInt16 nStartAngle = 0, sal_uInt16 nEndAngle = 3600, |
| sal_Bool bClose = sal_True ); |
| |
| ~XPolygon(); |
| |
| void SetSize( sal_uInt16 nSize ); |
| sal_uInt16 GetSize() const; |
| |
| void SetPointCount( sal_uInt16 nPoints ); |
| sal_uInt16 GetPointCount() const; |
| |
| void Insert( sal_uInt16 nPos, const Point& rPt, XPolyFlags eFlags ); |
| void Insert( sal_uInt16 nPos, const XPolygon& rXPoly ); |
| void Insert( sal_uInt16 nPos, const Polygon& rPoly ); |
| void Remove( sal_uInt16 nPos, sal_uInt16 nCount ); |
| void Move( long nHorzMove, long nVertMove ); |
| Rectangle GetBoundRect() const; |
| |
| const Point& operator[]( sal_uInt16 nPos ) const; |
| Point& operator[]( sal_uInt16 nPos ); |
| XPolygon& operator=( const XPolygon& rXPoly ); |
| sal_Bool operator==( const XPolygon& rXPoly ) const; |
| sal_Bool operator!=( const XPolygon& rXPoly ) const; |
| |
| XPolyFlags GetFlags( sal_uInt16 nPos ) const; |
| void SetFlags( sal_uInt16 nPos, XPolyFlags eFlags ); |
| sal_Bool IsControl(sal_uInt16 nPos) const; |
| sal_Bool IsSmooth(sal_uInt16 nPos) const; |
| |
| // Abstand zwischen zwei Punkten |
| double CalcDistance(sal_uInt16 nP1, sal_uInt16 nP2); |
| |
| // Bezierkonvertierungen |
| void CalcSmoothJoin(sal_uInt16 nCenter, sal_uInt16 nDrag, sal_uInt16 nPnt); |
| void CalcTangent(sal_uInt16 nCenter, sal_uInt16 nPrev, sal_uInt16 nNext); |
| void PointsToBezier(sal_uInt16 nFirst); |
| |
| // Transformationen |
| void Translate(const Point& rTrans); |
| void Rotate(const Point& rCenter, double fSin, double fCos); |
| void Rotate(const Point& rCenter, sal_uInt16 nAngle); |
| void Scale(double fSx, double fSy); |
| void SlantX(long nYRef, double fSin, double fCos); |
| void SlantY(long nXRef, double fSin, double fCos); |
| void Distort(const Rectangle& rRefRect, const XPolygon& rDistortedRect); |
| void Rotate20 (); |
| |
| // #116512# convert to basegfx::B2DPolygon and return |
| basegfx::B2DPolygon getB2DPolygon() const; |
| |
| // #116512# constructor to convert from basegfx::B2DPolygon |
| // #i76339# made explicit |
| explicit XPolygon(const basegfx::B2DPolygon& rPolygon); |
| }; |
| |
| /************************************************************************* |
| |* |
| |* Klasse XPolyPolygon; wie PolyPolygon, nur statt aus Polygonen aus |
| |* XPolygonen bestehend |
| |* |
| \************************************************************************/ |
| |
| class ImpXPolyPolygon; |
| |
| class SVX_DLLPUBLIC XPolyPolygon |
| { |
| protected: |
| ImpXPolyPolygon* pImpXPolyPolygon; |
| |
| // ImpXPolyPolygon-ReferenceCount pruefen und ggf. abkoppeln |
| void CheckReference(); |
| |
| public: |
| XPolyPolygon( sal_uInt16 nInitSize = 16, sal_uInt16 nResize = 16 ); |
| XPolyPolygon( const XPolygon& rXPoly ); |
| XPolyPolygon( const XPolyPolygon& rXPolyPoly ); |
| XPolyPolygon( const PolyPolygon& rPolyPoly); |
| |
| ~XPolyPolygon(); |
| |
| void Insert( const XPolygon& rXPoly, |
| sal_uInt16 nPos = XPOLYPOLY_APPEND ); |
| void Insert( const XPolyPolygon& rXPoly, |
| sal_uInt16 nPos=XPOLYPOLY_APPEND ); |
| XPolygon Remove( sal_uInt16 nPos ); |
| XPolygon Replace( const XPolygon& rXPoly, sal_uInt16 nPos ); |
| const XPolygon& GetObject( sal_uInt16 nPos ) const; |
| |
| void Clear(); |
| sal_uInt16 Count() const; |
| |
| void Move( long nHorzMove, long nVertMove ); |
| Rectangle GetBoundRect() const; |
| |
| const XPolygon& operator[]( sal_uInt16 nPos ) const |
| { return GetObject( nPos ); } |
| XPolygon& operator[]( sal_uInt16 nPos ); |
| |
| XPolyPolygon& operator=( const XPolyPolygon& rXPolyPoly ); |
| sal_Bool operator==( const XPolyPolygon& rXPolyPoly ) const; |
| sal_Bool operator!=( const XPolyPolygon& rXPolyPoly ) const; |
| |
| // Transformationen |
| void Translate(const Point& rTrans); |
| void Rotate(const Point& rCenter, double fSin, double fCos); |
| void Rotate(const Point& rCenter, sal_uInt16 nAngle); |
| void Scale(double fSx, double fSy); |
| void SlantX(long nYRef, double fSin, double fCos); |
| void SlantY(long nXRef, double fSin, double fCos); |
| void Distort(const Rectangle& rRefRect, const XPolygon& rDistortedRect); |
| void Rotate20 (); |
| |
| // #116512# convert to basegfx::B2DPolyPolygon and return |
| basegfx::B2DPolyPolygon getB2DPolyPolygon() const; |
| |
| // #116512# constructor to convert from basegfx::B2DPolyPolygon |
| // #i76339# made explicit |
| explicit XPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon); |
| }; |
| |
| #endif // _XPOLY_HXX |
| |
| // eof |