KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eda_shape.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2018 Jean-Pierre Charras jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#ifndef EDA_SHAPE_H
26#define EDA_SHAPE_H
27
28#include <trigo.h>
31#include <properties/property.h>
32#include <stroke_params.h>
33
34class LINE_READER;
35class EDA_DRAW_FRAME;
36class FOOTPRINT;
37class MSG_PANEL_ITEM;
38
39using KIGFX::COLOR4D;
40
41enum class SHAPE_T : int
42{
43 UNDEFINED = -1,
44 SEGMENT = 0,
45 RECTANGLE,
46 ARC,
47 CIRCLE,
48 POLY,
49 BEZIER
50};
51
52
53// WARNING: Do not change these values without updating dialogs that depend on their position values
54enum class FILL_T : int
55{
56 NO_FILL = 1,
57 FILLED_SHAPE, // Fill with object color
58 FILLED_WITH_BG_BODYCOLOR, // Fill with background body color
59 FILLED_WITH_COLOR // Fill with a separate color
60};
61
62
63// Holding struct to keep originating midpoint
64struct ARC_MID
65{
70};
71
73{
74public:
75 EDA_SHAPE( SHAPE_T aType, int aLineWidth, FILL_T aFill );
76
77 // Do not create a copy constructor & operator=.
78 // The ones generated by the compiler are adequate.
79
80 virtual ~EDA_SHAPE();
81
82 void SwapShape( EDA_SHAPE* aImage );
83
84 wxString ShowShape() const;
85
86 wxString SHAPE_T_asString() const;
87
88 virtual bool IsProxyItem() const { return m_proxyItem; }
89 virtual void SetIsProxyItem( bool aIsProxy = true ) { m_proxyItem = aIsProxy; }
90
91 bool IsFilled() const
92 {
93 return GetFillMode() != FILL_T::NO_FILL;
94 }
95
96 virtual bool IsFilledForHitTesting() const
97 {
98 return IsFilled();
99 }
100
101 void SetFilled( bool aFlag )
102 {
103 setFilled( aFlag );
104 }
105
106 void SetFillMode( FILL_T aFill ) { m_fill = aFill; }
107 FILL_T GetFillMode() const { return m_fill; }
108
109 bool IsClosed() const;
110
111 COLOR4D GetFillColor() const { return m_fillColor; }
112 void SetFillColor( const COLOR4D& aColor ) { m_fillColor = aColor; }
113
114 void SetWidth( int aWidth ) { m_stroke.SetWidth( aWidth ); }
115 virtual int GetWidth() const { return m_stroke.GetWidth(); }
116 virtual int GetEffectiveWidth() const { return GetWidth(); }
117
118 void SetLineStyle( const LINE_STYLE aStyle );
119 LINE_STYLE GetLineStyle() const;
120
121 void SetLineColor( const COLOR4D& aColor ) { m_stroke.SetColor( aColor ); }
122 COLOR4D GetLineColor() const { return m_stroke.GetColor(); }
123
124 void SetShape( SHAPE_T aShape ) { m_shape = aShape; }
125 SHAPE_T GetShape() const { return m_shape; }
126
130 const VECTOR2I& GetStart() const { return m_start; }
131 int GetStartY() const { return m_start.y; }
132 int GetStartX() const { return m_start.x; }
133
134 void SetStart( const VECTOR2I& aStart )
135 {
136 m_start = aStart;
137 m_endsSwapped = false;
138 }
139
140 void SetStartY( int y )
141 {
142 m_start.y = y;
143 m_endsSwapped = false;
144 }
145
146 void SetStartX( int x )
147 {
148 m_start.x = x;
149 m_endsSwapped = false;
150 }
151
152 void SetCenterY( int y )
153 {
154 m_end.y += y - m_start.y;
155 m_start.y = y;
156 }
157
158 void SetCenterX( int x )
159 {
160 m_end.x += x - m_start.x;
161 m_start.x = x;
162 }
163
167 const VECTOR2I& GetEnd() const { return m_end; }
168 int GetEndY() const { return m_end.y; }
169 int GetEndX() const { return m_end.x; }
170
171 void SetEnd( const VECTOR2I& aEnd )
172 {
173 m_end = aEnd;
174 m_endsSwapped = false;
175 }
176
177 void SetEndY( int aY )
178 {
179 m_end.y = aY;
180 m_endsSwapped = false;
181 }
182
183 void SetEndX( int aX )
184 {
185 m_end.x = aX;
186 m_endsSwapped = false;
187 }
188
189 void SetRadius( int aX )
190 {
191 m_end = m_start + VECTOR2I( aX, 0 );
192 }
193
194 virtual VECTOR2I GetTopLeft() const { return GetStart(); }
195 virtual VECTOR2I GetBotRight() const { return GetEnd(); }
196
197 virtual void SetTop( int val ) { SetStartY( val ); }
198 virtual void SetLeft( int val ) { SetStartX( val ); }
199 virtual void SetRight( int val ) { SetEndX( val ); }
200 virtual void SetBottom( int val ) { SetEndY( val ); }
201
202 void SetBezierC1( const VECTOR2I& aPt ) { m_bezierC1 = aPt; }
203 const VECTOR2I& GetBezierC1() const { return m_bezierC1; }
204
205 void SetBezierC2( const VECTOR2I& aPt ) { m_bezierC2 = aPt; }
206 const VECTOR2I& GetBezierC2() const { return m_bezierC2; }
207
208 VECTOR2I getCenter() const;
209 void SetCenter( const VECTOR2I& aCenter );
210
217 void SetArcAngleAndEnd( const EDA_ANGLE& aAngle, bool aCheckNegativeAngle = false );
218
219 EDA_ANGLE GetArcAngle() const;
220
222
227 bool EndsSwapped() const { return m_endsSwapped; }
228
229 // Some attributes are read only, since they are derived from m_Start, m_End, and m_Angle.
230 // No Set...() function for these attributes.
231
232 VECTOR2I GetArcMid() const;
233 std::vector<VECTOR2I> GetRectCorners() const;
234
239 void CalcArcAngles( EDA_ANGLE& aStartAngle, EDA_ANGLE& aEndAngle ) const;
240
241 int GetRadius() const;
242
249 void SetArcGeometry( const VECTOR2I& aStart, const VECTOR2I& aMid, const VECTOR2I& aEnd );
250
260 void SetCachedArcData( const VECTOR2I& aStart, const VECTOR2I& aMid, const VECTOR2I& aEnd, const VECTOR2I& aCenter );
261
262 const std::vector<VECTOR2I>& GetBezierPoints() const { return m_bezierPoints; }
263
271 void DupPolyPointsList( std::vector<VECTOR2I>& aBuffer ) const;
272
276 int GetPointCount() const;
277
278 // Accessors to the polygonal shape
280 const SHAPE_POLY_SET& GetPolyShape() const { return m_poly; }
281
285 bool IsPolyShapeValid() const;
286
287 void SetPolyShape( const SHAPE_POLY_SET& aShape )
288 {
289 m_poly = aShape;
290
291 for( int ii = 0; ii < m_poly.OutlineCount(); ++ii )
292 {
293 if( m_poly.HoleCount( ii ) )
294 {
296 break;
297 }
298 }
299 }
300
301 void SetPolyPoints( const std::vector<VECTOR2I>& aPoints );
302
313 void RebuildBezierToSegmentsPointsList( int aMinSegLen );
314
321 virtual std::vector<SHAPE*> MakeEffectiveShapes( bool aEdgeOnly = false ) const
322 {
323 return makeEffectiveShapes( aEdgeOnly );
324 }
325
326 void ShapeGetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList );
327
328 void SetLength( const double& aLength );
329
330 void SetRectangleHeight( const int& aHeight );
331
332 void SetRectangleWidth( const int& aWidth );
333
334 void SetRectangle( const long long int& aHeight, const long long int& aWidth );
335
336 void SetSegmentAngle( const EDA_ANGLE& aAngle );
337
338 bool IsClockwiseArc() const;
339
343 double GetLength() const;
344
345 int GetRectangleHeight() const;
346 int GetRectangleWidth() const;
347
358 void TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, int aClearance, int aError,
359 ERROR_LOC aErrorLoc, bool ignoreLineWidth = false ) const;
360
361 int Compare( const EDA_SHAPE* aOther ) const;
362
363 double Similarity( const EDA_SHAPE& aOther ) const;
364
365 bool operator==( const EDA_SHAPE& aOther ) const;
366
367protected:
368 wxString getFriendlyName() const;
369
370 void setPosition( const VECTOR2I& aPos );
371 VECTOR2I getPosition() const;
372
373 virtual void setFilled( bool aFlag )
374 {
375 m_fill = aFlag ? FILL_T::FILLED_SHAPE : FILL_T::NO_FILL;
376 }
377
378 void move( const VECTOR2I& aMoveVector );
379 void rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle );
380 void flip( const VECTOR2I& aCentre, bool aFlipLeftRight );
381 void scale( double aScale );
382
383 const BOX2I getBoundingBox() const;
384
385 void computeArcBBox( BOX2I& aBBox ) const;
386
387 bool hitTest( const VECTOR2I& aPosition, int aAccuracy = 0 ) const;
388 bool hitTest( const BOX2I& aRect, bool aContained, int aAccuracy = 0 ) const;
389
390 const std::vector<VECTOR2I> buildBezierToSegmentsPointsList( int aMinSegLen ) const;
391
392 void beginEdit( const VECTOR2I& aStartPoint );
393 bool continueEdit( const VECTOR2I& aPosition );
394 void calcEdit( const VECTOR2I& aPosition );
395
400 void endEdit( bool aClosed = true );
401 void setEditState( int aState ) { m_editState = aState; }
402
411 // fixme: move to shape_compound
412 std::vector<SHAPE*> makeEffectiveShapes( bool aEdgeOnly, bool aLineChainOnly = false ) const;
413
414protected:
415 bool m_endsSwapped; // true if start/end were swapped e.g. SetArcAngleAndEnd
416 SHAPE_T m_shape; // Shape: line, Circle, Arc
417 STROKE_PARAMS m_stroke; // Line style, width, etc.
420
421 long long int m_rectangleHeight;
422 long long int m_rectangleWidth;
423
426
427 VECTOR2I m_start; // Line start point or Circle center
428 VECTOR2I m_end; // Line end point or Circle 3 o'clock point
429
430 VECTOR2I m_arcCenter; // Used only for Arcs: arc end point
431 ARC_MID m_arcMidData; // Used to store originating data
432
433 VECTOR2I m_bezierC1; // Bezier Control Point 1
434 VECTOR2I m_bezierC2; // Bezier Control Point 2
435
436 std::vector<VECTOR2I> m_bezierPoints;
437 SHAPE_POLY_SET m_poly; // Stores the S_POLYGON shape
438
440 bool m_proxyItem; // A shape storing proxy information (ie: a pad
441 // number box, thermal spoke template, etc.)
442};
443
444#ifndef SWIG
447#endif
448
449#endif // EDA_SHAPE_H
Generic cubic Bezier representation.
Definition: bezier_curves.h:78
The base class for create windows for drawing purpose.
EDA_ANGLE GetArcAngle() const
Definition: eda_shape.cpp:689
SHAPE_T m_shape
Definition: eda_shape.h:416
void SetStartX(int x)
Definition: eda_shape.h:146
bool m_proxyItem
Definition: eda_shape.h:440
bool m_endsSwapped
Definition: eda_shape.h:415
const VECTOR2I & GetBezierC2() const
Definition: eda_shape.h:206
void SetBezierC2(const VECTOR2I &aPt)
Definition: eda_shape.h:205
void SetCenter(const VECTOR2I &aCenter)
Definition: eda_shape.cpp:571
VECTOR2I getCenter() const
Definition: eda_shape.cpp:545
int GetStartY() const
Definition: eda_shape.h:131
void SetLength(const double &aLength)
Definition: eda_shape.cpp:177
int m_editState
Definition: eda_shape.h:439
virtual VECTOR2I GetTopLeft() const
Definition: eda_shape.h:194
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Definition: eda_shape.cpp:364
void flip(const VECTOR2I &aCentre, bool aFlipLeftRight)
Definition: eda_shape.cpp:421
FILL_T GetFillMode() const
Definition: eda_shape.h:107
virtual ~EDA_SHAPE()
Definition: eda_shape.cpp:57
long long int m_rectangleHeight
Definition: eda_shape.h:421
void SetEndY(int aY)
Definition: eda_shape.h:177
void RebuildBezierToSegmentsPointsList(int aMinSegLen)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:506
virtual int GetEffectiveWidth() const
Definition: eda_shape.h:116
COLOR4D GetLineColor() const
Definition: eda_shape.h:122
int GetEndX() const
Definition: eda_shape.h:169
int GetRectangleWidth() const
Definition: eda_shape.cpp:165
void SetLineStyle(const LINE_STYLE aStyle)
Definition: eda_shape.cpp:1810
const std::vector< VECTOR2I > buildBezierToSegmentsPointsList(int aMinSegLen) const
Definition: eda_shape.cpp:532
void calcEdit(const VECTOR2I &aPosition)
Definition: eda_shape.cpp:1436
void SetStartY(int y)
Definition: eda_shape.h:140
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.h:321
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:279
bool IsFilled() const
Definition: eda_shape.h:91
void SetCenterY(int y)
Definition: eda_shape.h:152
void CalcArcAngles(EDA_ANGLE &aStartAngle, EDA_ANGLE &aEndAngle) const
Calc arc start and end angles such that aStartAngle < aEndAngle.
Definition: eda_shape.cpp:603
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Definition: eda_shape.cpp:759
void SetFilled(bool aFlag)
Definition: eda_shape.h:101
bool operator==(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:1825
int GetRadius() const
Definition: eda_shape.cpp:619
SHAPE_T GetShape() const
Definition: eda_shape.h:125
void SetPolyShape(const SHAPE_POLY_SET &aShape)
Definition: eda_shape.h:287
virtual VECTOR2I GetBotRight() const
Definition: eda_shape.h:195
virtual void SetBottom(int val)
Definition: eda_shape.h:200
void SetRectangleHeight(const int &aHeight)
Definition: eda_shape.cpp:188
VECTOR2I m_arcCenter
Definition: eda_shape.h:430
double m_segmentLength
Definition: eda_shape.h:424
void SetCenterX(int x)
Definition: eda_shape.h:158
virtual void SetTop(int val)
Definition: eda_shape.h:197
virtual bool IsFilledForHitTesting() const
Definition: eda_shape.h:96
bool continueEdit(const VECTOR2I &aPosition)
Definition: eda_shape.cpp:1402
wxString ShowShape() const
Definition: eda_shape.cpp:62
ARC_MID m_arcMidData
Definition: eda_shape.h:431
void SetFillColor(const COLOR4D &aColor)
Definition: eda_shape.h:112
int GetEndY() const
Definition: eda_shape.h:168
std::vector< SHAPE * > makeEffectiveShapes(bool aEdgeOnly, bool aLineChainOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.cpp:1236
bool hitTest(const VECTOR2I &aPosition, int aAccuracy=0) const
Definition: eda_shape.cpp:870
void SetCachedArcData(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, const VECTOR2I &aCenter)
Set the data used for mid point caching.
Definition: eda_shape.cpp:642
void SetEndX(int aX)
Definition: eda_shape.h:183
void beginEdit(const VECTOR2I &aStartPoint)
Definition: eda_shape.cpp:1361
VECTOR2I m_start
Definition: eda_shape.h:427
int GetPointCount() const
Definition: eda_shape.cpp:1353
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:167
bool IsClosed() const
Definition: eda_shape.cpp:238
void SetRadius(int aX)
Definition: eda_shape.h:189
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:134
void DupPolyPointsList(std::vector< VECTOR2I > &aBuffer) const
Duplicate the list of corners in a std::vector<VECTOR2I>
Definition: eda_shape.cpp:1329
LINE_STYLE GetLineStyle() const
Definition: eda_shape.cpp:1816
void endEdit(bool aClosed=true)
Finishes editing the shape.
Definition: eda_shape.cpp:1590
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:130
void SetLineColor(const COLOR4D &aColor)
Definition: eda_shape.h:121
COLOR4D GetFillColor() const
Definition: eda_shape.h:111
void SetRectangle(const long long int &aHeight, const long long int &aWidth)
Definition: eda_shape.cpp:214
void SetShape(SHAPE_T aShape)
Definition: eda_shape.h:124
void SwapShape(EDA_SHAPE *aImage)
Definition: eda_shape.cpp:1627
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1161
void SetSegmentAngle(const EDA_ANGLE &aAngle)
Definition: eda_shape.cpp:228
std::vector< VECTOR2I > m_bezierPoints
Definition: eda_shape.h:436
void setPosition(const VECTOR2I &aPos)
Definition: eda_shape.cpp:106
virtual void setFilled(bool aFlag)
Definition: eda_shape.h:373
const std::vector< VECTOR2I > & GetBezierPoints() const
Definition: eda_shape.h:262
virtual bool IsProxyItem() const
Definition: eda_shape.h:88
void computeArcBBox(BOX2I &aBBox) const
Definition: eda_shape.cpp:1176
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:171
bool EndsSwapped() const
Have the start and end points been swapped since they were set?
Definition: eda_shape.h:227
void SetRectangleWidth(const int &aWidth)
Definition: eda_shape.cpp:201
const SHAPE_POLY_SET & GetPolyShape() const
Definition: eda_shape.h:280
void SetBezierC1(const VECTOR2I &aPt)
Definition: eda_shape.h:202
void SetArcGeometry(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Set the three controlling points for an arc.
Definition: eda_shape.cpp:651
virtual void SetLeft(int val)
Definition: eda_shape.h:198
double GetLength() const
Definition: eda_shape.cpp:123
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:89
int GetStartX() const
Definition: eda_shape.h:132
double Similarity(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:1870
const VECTOR2I & GetBezierC1() const
Definition: eda_shape.h:203
VECTOR2I m_end
Definition: eda_shape.h:428
const BOX2I getBoundingBox() const
Definition: eda_shape.cpp:816
void SetArcAngleAndEnd(const EDA_ANGLE &aAngle, bool aCheckNegativeAngle=false)
Set the end point from the angle center and start.
Definition: eda_shape.cpp:717
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:437
int GetRectangleHeight() const
Definition: eda_shape.cpp:153
virtual int GetWidth() const
Definition: eda_shape.h:115
VECTOR2I getPosition() const
Definition: eda_shape.cpp:112
bool IsClockwiseArc() const
Definition: eda_shape.cpp:700
STROKE_PARAMS m_stroke
Definition: eda_shape.h:417
EDA_ANGLE m_segmentAngle
Definition: eda_shape.h:425
void setEditState(int aState)
Definition: eda_shape.h:401
void SetPolyPoints(const std::vector< VECTOR2I > &aPoints)
Definition: eda_shape.cpp:1226
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the shape to a closed polygon.
Definition: eda_shape.cpp:1691
wxString getFriendlyName() const
Definition: eda_shape.cpp:732
VECTOR2I m_bezierC1
Definition: eda_shape.h:433
FILL_T m_fill
Definition: eda_shape.h:418
COLOR4D m_fillColor
Definition: eda_shape.h:419
void SetWidth(int aWidth)
Definition: eda_shape.h:114
EDA_ANGLE GetSegmentAngle() const
Definition: eda_shape.cpp:680
virtual void SetRight(int val)
Definition: eda_shape.h:199
void SetFillMode(FILL_T aFill)
Definition: eda_shape.h:106
virtual void SetIsProxyItem(bool aIsProxy=true)
Definition: eda_shape.h:89
long long int m_rectangleWidth
Definition: eda_shape.h:422
VECTOR2I m_bezierC2
Definition: eda_shape.h:434
bool IsPolyShapeValid() const
Definition: eda_shape.cpp:1346
int Compare(const EDA_SHAPE *aOther) const
Definition: eda_shape.cpp:1650
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:589
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:93
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Represent a set of closed polygons.
void Fracture(POLYGON_MODE aFastMode)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
int OutlineCount() const
Return the number of outlines in the set.
Simple container to manage line stroke parameters.
Definition: stroke_params.h:81
int GetWidth() const
Definition: stroke_params.h:91
void SetWidth(int aWidth)
Definition: stroke_params.h:92
void SetColor(const KIGFX::COLOR4D &aColor)
Definition: stroke_params.h:98
KIGFX::COLOR4D GetColor() const
Definition: stroke_params.h:97
SHAPE_T
Definition: eda_shape.h:42
@ ARC
use RECTANGLE instead of RECT to avoid collision in a Windows header
FILL_T
Definition: eda_shape.h:55
@ FILLED_WITH_COLOR
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
a few functions useful in geometry calculations.
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
#define DECLARE_ENUM_TO_WXANY(type)
Definition: property.h:729
const int scale
LINE_STYLE
Dashed line types.
Definition: stroke_params.h:48
VECTOR2I end
Definition: eda_shape.h:68
VECTOR2I center
Definition: eda_shape.h:69
VECTOR2I start
Definition: eda_shape.h:67
VECTOR2I mid
Definition: eda_shape.h:66
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:638