1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
/*************************************************************************
*
* 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.
*
************************************************************************/
#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
#ifdef WIN // Windows 16 Bit
#define XPOLY_MAXPOINTS 8160 /* =0xFF00/sizeof(Point), also mit etwas Platz! */
#else
#define XPOLY_MAXPOINTS 0xFFF0 /* Auch fuer die 32-Bitter etwas Luft lassen */
#endif
/************************************************************************/
// 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(USHORT nPos, BOOL bCalcFirst, double fT);
void GenBezArc(const Point& rCenter, long nRx, long nRy,
long nXHdl, long nYHdl, USHORT nStart, USHORT nEnd,
USHORT nQuad, USHORT nFirst);
BOOL CheckAngles(USHORT& nStart, USHORT nEnd, USHORT& nA1, USHORT& nA2);
public:
XPolygon( USHORT nSize=16, USHORT 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,
USHORT nStartAngle = 0, USHORT nEndAngle = 3600,
BOOL bClose = TRUE );
~XPolygon();
void SetSize( USHORT nSize );
USHORT GetSize() const;
void SetPointCount( USHORT nPoints );
USHORT GetPointCount() const;
void Insert( USHORT nPos, const Point& rPt, XPolyFlags eFlags );
void Insert( USHORT nPos, const XPolygon& rXPoly );
void Insert( USHORT nPos, const Polygon& rPoly );
void Remove( USHORT nPos, USHORT nCount );
void Move( long nHorzMove, long nVertMove );
Rectangle GetBoundRect() const;
const Point& operator[]( USHORT nPos ) const;
Point& operator[]( USHORT nPos );
XPolygon& operator=( const XPolygon& rXPoly );
BOOL operator==( const XPolygon& rXPoly ) const;
BOOL operator!=( const XPolygon& rXPoly ) const;
XPolyFlags GetFlags( USHORT nPos ) const;
void SetFlags( USHORT nPos, XPolyFlags eFlags );
BOOL IsControl(USHORT nPos) const;
BOOL IsSmooth(USHORT nPos) const;
// Abstand zwischen zwei Punkten
double CalcDistance(USHORT nP1, USHORT nP2);
// Bezierkonvertierungen
void CalcSmoothJoin(USHORT nCenter, USHORT nDrag, USHORT nPnt);
void CalcTangent(USHORT nCenter, USHORT nPrev, USHORT nNext);
void PointsToBezier(USHORT nFirst);
// Transformationen
void Translate(const Point& rTrans);
void Rotate(const Point& rCenter, double fSin, double fCos);
void Rotate(const Point& rCenter, USHORT 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( USHORT nInitSize = 16, USHORT nResize = 16 );
XPolyPolygon( const XPolygon& rXPoly );
XPolyPolygon( const XPolyPolygon& rXPolyPoly );
XPolyPolygon( const PolyPolygon& rPolyPoly);
~XPolyPolygon();
void Insert( const XPolygon& rXPoly,
USHORT nPos = XPOLYPOLY_APPEND );
void Insert( const XPolyPolygon& rXPoly,
USHORT nPos=XPOLYPOLY_APPEND );
XPolygon Remove( USHORT nPos );
XPolygon Replace( const XPolygon& rXPoly, USHORT nPos );
const XPolygon& GetObject( USHORT nPos ) const;
void Clear();
USHORT Count() const;
void Move( long nHorzMove, long nVertMove );
Rectangle GetBoundRect() const;
const XPolygon& operator[]( USHORT nPos ) const
{ return GetObject( nPos ); }
XPolygon& operator[]( USHORT nPos );
XPolyPolygon& operator=( const XPolyPolygon& rXPolyPoly );
BOOL operator==( const XPolyPolygon& rXPolyPoly ) const;
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, USHORT 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
|