KiCad PCB EDA Suite
Loading...
Searching...
No Matches
graphics_abstraction_layer.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) 2012 Torsten Hueter, torstenhtr <at> gmx.de
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * Graphics Abstraction Layer (GAL) - base class
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#ifndef GRAPHICSABSTRACTIONLAYER_H_
28#define GRAPHICSABSTRACTIONLAYER_H_
29
30#include <deque>
31#include <stack>
32#include <limits>
33
34#include <math/matrix3x3.h>
35
36#include <gal/gal.h>
37#include <gal/color4d.h>
38#include <gal/cursors.h>
39#include <gal/definitions.h>
41#include <font/stroke_font.h>
42#include <geometry/eda_angle.h>
43#include <pgm_base.h>
45
47class SHAPE_POLY_SET;
48class BITMAP_BASE;
49
50namespace KIGFX
51{
62class GAL_API GAL : GAL_DISPLAY_OPTIONS_OBSERVER
63{
64 // These friend declarations allow us to hide routines that should not be called. The
65 // corresponding RAII objects must be used instead.
66 friend class GAL_CONTEXT_LOCKER;
67 friend class GAL_UPDATE_CONTEXT;
68 friend class GAL_DRAWING_CONTEXT;
69
70public:
71 // Constructor / Destructor
72 GAL( GAL_DISPLAY_OPTIONS& aOptions );
73 virtual ~GAL();
74
76 virtual bool IsInitialized() const { return true; }
77
79 virtual bool IsVisible() const { return true; }
80
82 virtual bool IsCairoEngine() { return false; }
83
85 virtual bool IsOpenGlEngine() { return false; }
86
87 // ---------------
88 // Drawing methods
89 // ---------------
90
99 virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) {};
100
110 virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint,
111 double aWidth ){};
112
119 virtual void DrawSegmentChain( const std::vector<VECTOR2D>& aPointList, double aWidth ){};
120 virtual void DrawSegmentChain( const SHAPE_LINE_CHAIN& aLineChain, double aWidth ){};
121
127 virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) {};
128 virtual void DrawPolyline( const std::vector<VECTOR2D>& aPointList ) {};
129 virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) {};
130 virtual void DrawPolyline( const SHAPE_LINE_CHAIN& aLineChain ) {};
131
137 virtual void DrawPolylines( const std::vector<std::vector<VECTOR2D>>& aPointLists ){};
138
145 virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ) {};
146
154 virtual void DrawHoleWall( const VECTOR2D& aCenterPoint, double aHoleRadius,
155 double aWallWidth ) {};
156
165 virtual void DrawArc( const VECTOR2D& aCenterPoint, double aRadius,
166 const EDA_ANGLE& aStartAngle, const EDA_ANGLE& aAngle ){};
167
188 virtual void DrawArcSegment( const VECTOR2D& aCenterPoint, double aRadius,
189 const EDA_ANGLE& aStartAngle, const EDA_ANGLE& aAngle,
190 double aWidth, double aMaxError ){};
191
200 virtual void DrawEllipse( const VECTOR2D& aCenterPoint, double aMajorRadius, double aMinorRadius,
201 const EDA_ANGLE& aRotation );
202
213 virtual void DrawEllipseArc( const VECTOR2D& aCenterPoint, double aMajorRadius, double aMinorRadius,
214 const EDA_ANGLE& aRotation, const EDA_ANGLE& aStartAngle, const EDA_ANGLE& aEndAngle );
215
222 virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) {};
223
224 void DrawRectangle( const BOX2I& aRect )
225 {
226 DrawRectangle( aRect.GetOrigin(), aRect.GetEnd() );
227 }
228
232 virtual void DrawGlyph( const KIFONT::GLYPH& aGlyph, int aNth = 0, int aTotal = 1 ) {};
233
237 virtual void DrawGlyphs( const std::vector<std::unique_ptr<KIFONT::GLYPH>>& aGlyphs )
238 {
239 COLOR4D fillColor = GetFillColor();
240 COLOR4D strokeColor = GetStrokeColor();
241
242 for( size_t i = 0; i < aGlyphs.size(); i++ )
243 {
244 if( aGlyphs[i]->IsHover() )
245 {
248 }
249
250 DrawGlyph( *aGlyphs[i], i, aGlyphs.size() );
251
252 if( aGlyphs[i]->IsHover() )
253 {
254 SetFillColor( fillColor );
255 SetStrokeColor( strokeColor );
256 }
257 }
258 }
259
260
266 virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) {};
267 virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) {};
268 virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet,
269 bool aStrokeTriangulation = false ) {};
270 virtual void DrawPolygon( const SHAPE_LINE_CHAIN& aPolySet ) {};
271
283 virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA,
284 const VECTOR2D& controlPointB, const VECTOR2D& endPoint,
285 double aFilterValue = 0.0 ) {};
286
290 virtual void DrawBitmap( const BITMAP_BASE& aBitmap, double alphaBlend = 1.0 ) {};
291
292 // --------------
293 // Screen methods
294 // --------------
295
297 virtual void ResizeScreen( int aWidth, int aHeight ) {};
298
300 virtual bool Show( bool aShow ) { return true; };
301
304 {
305 return m_screenSize;
306 }
307
309 virtual int GetSwapInterval() const { return 0; };
310
312 virtual void Flush() {};
313
314 void SetClearColor( const COLOR4D& aColor )
315 {
316 m_clearColor = aColor;
317 }
318
319 const COLOR4D& GetClearColor( ) const
320 {
321 return m_clearColor;
322 }
323
329 virtual void ClearScreen() {};
330
331 // -----------------
332 // Attribute setting
333 // -----------------
334
340 virtual void SetIsFill( bool aIsFillEnabled )
341 {
342 m_isFillEnabled = aIsFillEnabled;
343 }
344
350 inline bool GetIsFill() const
351 {
352 return m_isFillEnabled;
353 }
354
360 virtual void SetIsStroke( bool aIsStrokeEnabled )
361 {
362 m_isStrokeEnabled = aIsStrokeEnabled;
363 }
364
370 inline bool GetIsStroke() const
371 {
372 return m_isStrokeEnabled;
373 }
374
380 virtual void SetFillColor( const COLOR4D& aColor )
381 {
382 m_fillColor = aColor;
383 }
384
390 inline const COLOR4D& GetFillColor() const
391 {
392 return m_fillColor;
393 }
394
400 virtual void SetStrokeColor( const COLOR4D& aColor )
401 {
402 m_strokeColor = aColor;
403 }
404
405 virtual void SetHoverColor( const COLOR4D& aColor )
406 {
407 m_hoverColor = aColor;
408 }
409
415 inline const COLOR4D& GetStrokeColor() const
416 {
417 return m_strokeColor;
418 }
419
425 virtual void SetLineWidth( float aLineWidth )
426 {
427 m_lineWidth = aLineWidth;
428 }
429
435 virtual void SetMinLineWidth( float aLineWidth )
436 {
437 m_minLineWidth = aLineWidth;
438 }
439
445 inline float GetLineWidth() const
446 {
447 return m_lineWidth;
448 }
449
455 inline float GetMinLineWidth() const
456 {
457 return m_minLineWidth;
458 }
459
468 virtual void SetLayerDepth( double aLayerDepth )
469 {
470 wxCHECK_MSG( aLayerDepth <= m_depthRange.y, /*void*/,
471 wxT( "SetLayerDepth: below minimum" ) );
472 wxCHECK_MSG( aLayerDepth >= m_depthRange.x, /*void*/,
473 wxT( "SetLayerDepth: above maximum" ) );
474
475 m_layerDepth = aLayerDepth;
476 }
477
485 inline void AdvanceDepth()
486 {
488 }
489
490 // ----
491 // Text
492 // ----
493
502 virtual void BitmapText( const wxString& aText, const VECTOR2I& aPosition,
503 const EDA_ANGLE& aAngle );
504
511 void ResetTextAttributes();
512
513 void SetGlyphSize( const VECTOR2I aSize ) { m_attributes.m_Size = aSize; }
514 const VECTOR2I& GetGlyphSize() const { return m_attributes.m_Size; }
515
516 inline void SetFontBold( const bool aBold ) { m_attributes.m_Bold = aBold; }
517 inline bool IsFontBold() const { return m_attributes.m_Bold; }
518
519 inline void SetFontItalic( bool aItalic ) { m_attributes.m_Italic = aItalic; }
520 inline bool IsFontItalic() const { return m_attributes.m_Italic; }
521
522 inline void SetFontUnderlined( bool aUnderlined ) { m_attributes.m_Underlined = aUnderlined; }
523 inline bool IsFontUnderlined() const { return m_attributes.m_Underlined; }
524
525 void SetTextMirrored( const bool aMirrored ) { m_attributes.m_Mirrored = aMirrored; }
526 bool IsTextMirrored() const { return m_attributes.m_Mirrored; }
527
528 void SetHorizontalJustify( const GR_TEXT_H_ALIGN_T aHorizontalJustify )
529 {
530 m_attributes.m_Halign = aHorizontalJustify;
531 }
532
534
535 void SetVerticalJustify( const GR_TEXT_V_ALIGN_T aVerticalJustify )
536 {
537 m_attributes.m_Valign = aVerticalJustify;
538 }
539
541
542
543 // --------------
544 // Transformation
545 // --------------
546
552 virtual void Transform( const MATRIX3x3D& aTransformation ) {};
553
559 virtual void Rotate( double aAngle ) {};
560
566 virtual void Translate( const VECTOR2D& aTranslation ) {};
567
573 virtual void Scale( const VECTOR2D& aScale ) {};
574
576 virtual void Save() {};
577
579 virtual void Restore() {};
580
581 // --------------------------------------------
582 // Group methods
583 // ---------------------------------------------
584
593 virtual int BeginGroup() { return 0; };
594
596 virtual void EndGroup() {};
597
603 virtual void DrawGroup( int aGroupNumber ) {};
604
611 virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ) {};
612
619 virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ) {};
620
626 virtual void DeleteGroup( int aGroupNumber ) {};
627
631 virtual void ClearCache() {};
632
633 // --------------------------------------------------------
634 // Handling the world <-> screen transformation
635 // --------------------------------------------------------
636
638 virtual void ComputeWorldScreenMatrix();
639
646 {
647 return m_worldScreenMatrix;
648 }
649
656 {
657 return m_screenWorldMatrix;
658 }
659
665 inline void SetWorldScreenMatrix( const MATRIX3x3D& aMatrix )
666 {
667 m_worldScreenMatrix = aMatrix;
668 }
669
673 BOX2D GetVisibleWorldExtents() const;
674
682 void SetWorldUnitLength( double aWorldUnitLength ) { m_worldUnitLength = aWorldUnitLength; }
683
684 void SetScreenSize( const VECTOR2I& aSize ) { m_screenSize = aSize; }
685
692 void SetScreenDPI( double aScreenDPI ) { m_screenDPI = aScreenDPI; }
693 double GetScreenDPI() const { return m_screenDPI; }
694
700 void SetLookAtPoint( const VECTOR2D& aPoint ) { m_lookAtPoint = aPoint; }
701 const VECTOR2D& GetLookAtPoint() const { return m_lookAtPoint; }
702
703 void SetZoomFactor( double aZoomFactor ) { m_zoomFactor = aZoomFactor; }
704 double GetZoomFactor() const { return m_zoomFactor; }
705
709 void SetRotation( double aRotation ) { m_rotation = aRotation; }
710 double GetRotation() const { return m_rotation; }
711
720 void SetDepthRange( const VECTOR2D& aDepthRange ) { m_depthRange = aDepthRange; }
721 double GetMinDepth() const { return m_depthRange.x; }
722 double GetMaxDepth() const { return m_depthRange.y; }
723
729 double GetWorldScale() const { return m_worldScale; }
730
737 inline void SetFlip( bool xAxis, bool yAxis )
738 {
739 m_globalFlipX = xAxis;
740 m_globalFlipY = yAxis;
741 }
742
743 bool IsFlippedX() const { return m_globalFlipX; }
744 bool IsFlippedY() const { return m_globalFlipY; }
745
746 // ---------------------------
747 // Buffer manipulation methods
748 // ---------------------------
749
755 virtual void SetTarget( RENDER_TARGET aTarget ) {};
756
762 virtual RENDER_TARGET GetTarget() const { return TARGET_CACHED; };
763
769 virtual void ClearTarget( RENDER_TARGET aTarget ) {};
770
776 virtual bool HasTarget( RENDER_TARGET aTarget )
777 {
778 return true;
779 };
780
792 virtual void SetNegativeDrawMode( bool aSetting ) {};
793
801 virtual void StartDiffLayer() {};
802
808 virtual void EndDiffLayer() {};
809
818 virtual void StartNegativesLayer(){};
819
824 virtual void EndNegativesLayer(){};
825
826 // -------------
827 // Grid methods
828 // -------------
829
835 void SetGridVisibility( bool aVisibility ) { m_gridVisibility = aVisibility; }
836
837 bool GetGridVisibility() const { return m_gridVisibility; }
838
839 bool GetGridSnapping() const
840 {
841 return m_options.m_gridSnapping == KIGFX::GRID_SNAPPING::ALWAYS ||
843 }
844
850 inline void SetGridOrigin( const VECTOR2D& aGridOrigin )
851 {
852 m_gridOrigin = aGridOrigin;
853
854 if( m_gridSize.x == 0.0 || m_gridSize.y == 0.0 )
855 {
856 m_gridOffset = VECTOR2D( 0.0, 0.0);
857 }
858 else
859 {
860 m_gridOffset = VECTOR2D( (long) m_gridOrigin.x % (long) m_gridSize.x,
861 (long) m_gridOrigin.y % (long) m_gridSize.y );
862 }
863 }
864
865 inline const VECTOR2D& GetGridOrigin() const
866 {
867 return m_gridOrigin;
868 }
869
875 inline void SetGridSize( const VECTOR2D& aGridSize )
876 {
877 m_gridSize = aGridSize;
878
879 // Avoid stupid grid size values: a grid size should be >= 1 in internal units
880 m_gridSize.x = std::max( 1.0, m_gridSize.x );
881 m_gridSize.y = std::max( 1.0, m_gridSize.y );
882
883 m_gridOffset = VECTOR2D( (long) m_gridOrigin.x % (long) m_gridSize.x,
884 (long) m_gridOrigin.y % (long) m_gridSize.y );
885 }
886
892 inline const VECTOR2D& GetGridSize() const
893 {
894 return m_gridSize;
895 }
896
903 {
904 VECTOR2D gridScreenSize( m_gridSize );
905 gridScreenSize.x = std::max( 100.0, gridScreenSize.x );
906 gridScreenSize.y = std::max( 100.0, gridScreenSize.y );
907
908 double gridThreshold = computeMinGridSpacing() / m_worldScale;
909
911 gridThreshold *= 2.0;
912
913 // If we cannot display the grid density, scale down by a tick size and
914 // try again. Eventually, we get some representation of the grid
915 while( std::min( gridScreenSize.x, gridScreenSize.y ) <= gridThreshold )
916 {
917 gridScreenSize = gridScreenSize * static_cast<double>( m_gridTick );
918 }
919
920 return gridScreenSize;
921 }
922
928 inline void SetGridColor( const COLOR4D& aGridColor )
929 {
930 m_gridColor = aGridColor;
931 }
932
938 inline void SetAxesColor( const COLOR4D& aAxesColor )
939 {
940 m_axesColor = aAxesColor;
941 }
942
946 inline void SetAxesEnabled( bool aAxesEnabled )
947 {
948 m_axesEnabled = aAxesEnabled;
949 }
950
956 inline void SetCoarseGrid( int aInterval )
957 {
958 m_gridTick = aInterval;
959 }
960
966 inline float GetGridLineWidth() const
967 {
968 return m_gridLineWidth;
969 }
970
972 virtual void DrawGrid() {};
973
980 VECTOR2D GetGridPoint( const VECTOR2D& aPoint ) const;
981
988 inline VECTOR2D ToWorld( const VECTOR2D& aPoint ) const
989 {
990 return VECTOR2D( m_screenWorldMatrix * aPoint );
991 }
992
999 inline VECTOR2D ToScreen( const VECTOR2D& aPoint ) const
1000 {
1001 return VECTOR2D( m_worldScreenMatrix * aPoint );
1002 }
1003
1010 virtual bool SetNativeCursorStyle( KICURSOR aCursor, bool aHiDPI );
1011
1017 inline void SetCursorEnabled( bool aCursorEnabled )
1018 {
1019 m_isCursorEnabled = aCursorEnabled;
1020 }
1021
1027 bool IsCursorEnabled() const
1028 {
1030 }
1031
1037 inline void SetCursorColor( const COLOR4D& aCursorColor )
1038 {
1039 m_cursorColor = aCursorColor;
1040 }
1041
1047 virtual void DrawCursor( const VECTOR2D& aCursorPosition ) {};
1048
1049 virtual void EnableDepthTest( bool aEnabled = false ) {};
1050
1055 virtual bool IsContextLocked()
1056 {
1057 return false;
1058 }
1059
1060
1062 virtual void LockContext( int aClientCookie ) {}
1063
1064 virtual void UnlockContext( int aClientCookie ) {}
1065
1070
1073 virtual void BeginDrawing() {};
1074
1077 virtual void EndDrawing() {};
1078protected:
1079
1082 virtual void beginUpdate() {}
1083
1085 virtual void endUpdate() {}
1086
1087
1088
1090 inline void computeWorldScale()
1091 {
1093
1094 PGM_BASE* pgm = PgmOrNull();
1095
1096 if( pgm && pgm->GetCommonSettings() )
1098 }
1099
1105 double computeMinGridSpacing() const;
1106
1108 static const int MIN_DEPTH;
1109 static const int MAX_DEPTH;
1110
1112 static const int GRID_DEPTH;
1113
1117 COLOR4D getCursorColor() const;
1118
1119 // ---------------
1120 // Settings observer interface
1121 // ---------------
1125 void OnGalDisplayOptionsChanged( const GAL_DISPLAY_OPTIONS& aOptions ) override;
1126
1135 virtual bool updatedGalDisplayOptions( const GAL_DISPLAY_OPTIONS& aOptions );
1136
1140 template <typename T>
1141 void normalize( T &a, T &b )
1142 {
1143 if( a > b )
1144 {
1145 T tmp = a;
1146 a = b;
1147 b = tmp;
1148 }
1149 }
1150
1153
1154 std::stack<double> m_depthStack;
1156
1160
1162 double m_rotation;
1166
1169
1172
1175
1180
1183
1184 // Grid settings
1197
1198 // Cursor settings
1204
1206
1207private:
1208
1209 inline double getLayerDepth() const
1210 {
1211 return m_layerDepth;
1212 }
1213
1215
1216 friend class GAL_SCOPED_ATTRS;
1217};
1218
1219
1221{
1222public:
1224 m_gal( aGal )
1225 {
1226 m_cookie = rand();
1227 m_gal->LockContext( m_cookie );
1228 }
1229
1231 {
1232 m_gal->UnlockContext( m_cookie );
1233 }
1234
1235protected:
1238};
1239
1240
1242{
1243public:
1245 GAL_CONTEXT_LOCKER( aGal )
1246 {
1247 m_gal->beginUpdate();
1248 }
1249
1251 {
1252 m_gal->endUpdate();
1253 }
1254};
1255
1256
1258{
1259public:
1261 GAL_CONTEXT_LOCKER( aGal )
1262 {
1263 m_gal->BeginDrawing();
1264 }
1265
1266 ~GAL_DRAWING_CONTEXT() noexcept( false )
1267 {
1268 m_gal->EndDrawing();
1269 }
1270};
1271
1272
1277{
1278public:
1280 {
1287
1288 // It is not clear to me that GAL needs to save text attributes.
1289 // Only BitmapText uses it, and maybe that should be passed in
1290 // explicitly (like for Draw) - every caller of BitmapText sets
1291 // the text attributes anyway.
1292 // TEXT_ATTRS = 64,
1293
1294 // Convenience flags
1298
1300 };
1301
1307 GAL_SCOPED_ATTRS( KIGFX::GAL& aGal, int aFlags )
1308 : m_gal( aGal ), m_flags( aFlags )
1309 {
1310 // Save what we need to restore later.
1311 // These are all so cheap to copy, it's likely not worth if'ing
1312 m_strokeWidth = aGal.GetLineWidth();
1314 m_isStroke = aGal.GetIsStroke();
1315 m_fillColor = aGal.GetFillColor();
1316 m_isFill = aGal.GetIsFill();
1317 m_layerDepth = aGal.getLayerDepth();
1318 }
1319
1321 {
1322 // Restore the attributes that were saved
1323 // based on the flags that were set.
1324
1325 if( m_flags & STROKE_WIDTH )
1326 m_gal.SetLineWidth( m_strokeWidth );
1327
1328 if( m_flags & STROKE_COLOR )
1329 m_gal.SetStrokeColor( m_strokeColor );
1330
1331 if( m_flags & IS_STROKE )
1332 m_gal.SetIsStroke( m_isStroke );
1333
1334 if( m_flags & FILL_COLOR )
1335 m_gal.SetFillColor( m_fillColor );
1336
1337 if( m_flags & IS_FILL )
1338 m_gal.SetIsFill( m_isFill );
1339
1340 if( m_flags & LAYER_DEPTH )
1341 m_gal.SetLayerDepth( m_layerDepth );
1342 }
1343
1344private:
1347
1351
1354
1356};
1357
1358
1359}; // namespace KIGFX
1360
1361#endif /* GRAPHICSABSTRACTIONLAYER_H_ */
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
This class handle bitmap images in KiCad.
Definition bitmap_base.h:49
constexpr const Vec GetEnd() const
Definition box2.h:212
constexpr const Vec & GetOrigin() const
Definition box2.h:210
APPEARANCE m_Appearance
GAL(GAL_DISPLAY_OPTIONS &aOptions)
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
GAL_SCOPED_ATTRS(KIGFX::GAL &aGal, int aFlags)
Instantiate a GAL_SCOPED_ATTRS object, saving the current attributes of the GAL.
Abstract interface for drawing on a 2D-surface.
const VECTOR2D & GetGridOrigin() const
virtual void ResizeScreen(int aWidth, int aHeight)
Resize the canvas.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
void SetGridColor(const COLOR4D &aGridColor)
Set the grid color.
float GetGridLineWidth() const
Get the grid line width.
virtual bool Show(bool aShow)
Show/hide the GAL canvas.
virtual void SetLayerDepth(double aLayerDepth)
Set the depth of the layer (position on the z-axis)
double GetScreenDPI() const
const MATRIX3x3D & GetWorldScreenMatrix() const
Get the world <-> screen transformation matrix.
bool IsCursorEnabled() const
Return information about cursor visibility.
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
friend class GAL_DRAWING_CONTEXT
COLOR4D m_hoverColor
Color for hovered (active) links.
friend class GAL_CONTEXT_LOCKER
virtual void EndDrawing()
End the drawing, needs to be called for every new frame.
virtual void StartDiffLayer()
Begins rendering of a differential layer.
bool m_isCursorEnabled
Is the cursor enabled?
virtual void DrawGlyph(const KIFONT::GLYPH &aGlyph, int aNth=0, int aTotal=1)
Draw a polygon representing a font glyph.
virtual void EndDiffLayer()
Ends rendering of a differential layer.
virtual void Rotate(double aAngle)
Rotate the context.
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a rectangle.
MATRIX3x3D m_worldScreenMatrix
World transformation.
VECTOR2D GetVisibleGridSize() const
Return the visible grid size in x and y directions.
double m_layerDepth
The actual layer depth.
void SetVerticalJustify(const GR_TEXT_V_ALIGN_T aVerticalJustify)
bool GetIsFill() const
Get the fill status.
void AdvanceDepth()
Change the current depth to deeper, so it is possible to draw objects right beneath other.
const COLOR4D & GetFillColor() const
Get the fill color.
void SetFontBold(const bool aBold)
MATRIX3x3D m_screenWorldMatrix
Screen transformation.
void SetFontUnderlined(bool aUnderlined)
void SetHorizontalJustify(const GR_TEXT_H_ALIGN_T aHorizontalJustify)
virtual RENDER_TARGET GetTarget() const
Get the currently used target for rendering.
double GetMaxDepth() const
bool m_axesEnabled
Should the axes be drawn.
void SetRotation(double aRotation)
Get/set the rotation angle (in radians).
float m_gridLineWidth
Line width of the grid.
void SetFlip(bool xAxis, bool yAxis)
Sets flipping of the screen.
VECTOR2I m_screenSize
Screen size in screen (wx logical) coordinates.
virtual void Flush()
Force all remaining objects to be drawn.
virtual int GetSwapInterval() const
Return the swap interval. -1 for adaptive, 0 for disabled/unknown.
virtual void DeleteGroup(int aGroupNumber)
Delete the group from the memory.
std::stack< double > m_depthStack
Stored depth values.
GR_TEXT_H_ALIGN_T GetHorizontalJustify() const
void normalize(T &a, T &b)
Ensure that the first element is smaller than the second.
VECTOR2D m_depthRange
Range of the depth.
double GetZoomFactor() const
virtual void SetFillColor(const COLOR4D &aColor)
Set the fill color.
void OnGalDisplayOptionsChanged(const GAL_DISPLAY_OPTIONS &aOptions) override
Handler for observer settings changes.
double m_zoomFactor
The zoom factor.
virtual void Translate(const VECTOR2D &aTranslation)
Translate the context.
VECTOR2D ToScreen(const VECTOR2D &aPoint) const
Compute the point position in screen coordinates from given world coordinates.
void SetCursorEnabled(bool aCursorEnabled)
Enable/disable cursor.
void SetAxesEnabled(bool aAxesEnabled)
Enable drawing the axes.
virtual void DrawPolylines(const std::vector< std::vector< VECTOR2D > > &aPointLists)
Draw multiple polylines.
virtual bool HasTarget(RENDER_TARGET aTarget)
Return true if the target exists.
GRID_STYLE m_gridStyle
Grid display style.
void SetCursorColor(const COLOR4D &aCursorColor)
Set the cursor color.
COLOR4D m_cursorColor
Cursor color.
COLOR4D m_axesColor
Color of the axes.
int m_gridMinSpacing
Minimum screen size of the grid (pixels) below which the grid is not drawn.
void SetGridSize(const VECTOR2D &aGridSize)
Set the grid size.
const VECTOR2D & GetLookAtPoint() const
double GetRotation() const
const MATRIX3x3D & GetScreenWorldMatrix() const
Get the screen <-> world transformation matrix.
bool IsFontUnderlined() const
virtual void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius)
Draw a circle using world coordinates.
virtual void Restore()
Restore the context.
float m_lineWidth
The line width.
virtual void DrawHoleWall(const VECTOR2D &aCenterPoint, double aHoleRadius, double aWallWidth)
Draw a hole wall ring.
const COLOR4D & GetStrokeColor() const
Get the stroke color.
virtual void ClearTarget(RENDER_TARGET aTarget)
Clear the target for rendering.
void SetZoomFactor(double aZoomFactor)
virtual void BeginDrawing()
Start/end drawing functions, draw calls can be only made in between the calls to BeginDrawing()/EndDr...
void computeWorldScale()
Compute the scaling factor for the world->screen matrix.
virtual bool IsOpenGlEngine()
Return true if the GAL engine is a OpenGL based type.
virtual int BeginGroup()
Begin a group.
TEXT_ATTRIBUTES m_attributes
static const int MIN_DEPTH
Possible depth range.
const VECTOR2D & GetGridSize() const
Return the grid size.
virtual void DrawPolygon(const VECTOR2D aPointList[], int aListSize)
virtual void SetLineWidth(float aLineWidth)
Set the line width.
double m_rotation
Rotation transformation (radians)
VECTOR2D m_gridSize
The grid size.
virtual void DrawPolygon(const SHAPE_POLY_SET &aPolySet, bool aStrokeTriangulation=false)
COLOR4D getCursorColor() const
Get the actual cursor color to draw.
virtual void ChangeGroupDepth(int aGroupNumber, int aDepth)
Change the depth (Z-axis position) of the group.
virtual void SetHoverColor(const COLOR4D &aColor)
COLOR4D m_fillColor
The fill color.
virtual void EndNegativesLayer()
Ends rendering of a negatives layer and draws it to the main layer.
void DrawRectangle(const BOX2I &aRect)
double m_worldUnitLength
The unit length of the world coordinates [inch].
virtual void StartNegativesLayer()
Begins rendering in a new layer that will be copied to the main layer in EndNegativesLayer().
void SetTextMirrored(const bool aMirrored)
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList)
Draw a polyline.
void SetCoarseGrid(int aInterval)
Draw every tick line wider.
virtual bool updatedGalDisplayOptions(const GAL_DISPLAY_OPTIONS &aOptions)
Handle updating display options.
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
virtual void SetStrokeColor(const COLOR4D &aColor)
Set the stroke color.
virtual void ChangeGroupColor(int aGroupNumber, const COLOR4D &aNewColor)
Change the color used to draw the group.
virtual void DrawArcSegment(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aWidth, double aMaxError)
Draw an arc segment.
virtual bool IsContextLocked()
Checks the state of the context lock.
VECTOR2D m_cursorPosition
Current cursor position (world coordinates)
VECTOR2D m_gridOffset
The grid offset to compensate cursor position.
virtual void SetIsStroke(bool aIsStrokeEnabled)
Enable/disable stroked outlines.
virtual void beginUpdate()
Enable item update mode.
virtual void DrawGroup(int aGroupNumber)
Draw the stored group.
double getLayerDepth() const
const VECTOR2I & GetGlyphSize() const
int m_gridTick
Every tick line gets the double width.
double m_worldScale
The scale factor world->screen.
void SetLookAtPoint(const VECTOR2D &aPoint)
Get/set the Point in world space to look at.
virtual void DrawPolygon(const SHAPE_LINE_CHAIN &aPolySet)
bool GetGridVisibility() const
void SetGridOrigin(const VECTOR2D &aGridOrigin)
Set the origin point for the grid.
virtual bool IsCairoEngine()
Return true if the GAL engine is a Cairo based type.
virtual void ClearScreen()
Clear the screen.
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a line.
VECTOR2D m_gridOrigin
The grid origin.
virtual void endUpdate()
Disable item update mode.
void SetWorldUnitLength(double aWorldUnitLength)
Set the unit length.
virtual void DrawPolyline(const std::vector< VECTOR2D > &aPointList)
virtual void SetMinLineWidth(float aLineWidth)
Set the minimum line width in pixels.
KICURSOR m_currentNativeCursor
Current cursor.
bool m_globalFlipY
Flag for Y axis flipping.
virtual void UnlockContext(int aClientCookie)
void SetClearColor(const COLOR4D &aColor)
void SetScreenSize(const VECTOR2I &aSize)
const COLOR4D & GetClearColor() const
virtual void DrawSegmentChain(const SHAPE_LINE_CHAIN &aLineChain, double aWidth)
static const int GRID_DEPTH
Depth level on which the grid is drawn.
virtual bool IsInitialized() const
Return the initialization status for the canvas.
float GetMinLineWidth() const
Get the minimum line width in pixels.
void SetGlyphSize(const VECTOR2I aSize)
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs)
Draw polygons representing font glyphs.
virtual void Scale(const VECTOR2D &aScale)
Scale the context.
virtual void DrawCurve(const VECTOR2D &startPoint, const VECTOR2D &controlPointA, const VECTOR2D &controlPointB, const VECTOR2D &endPoint, double aFilterValue=0.0)
Draw a cubic bezier spline.
bool m_isFillEnabled
Is filling of graphic objects enabled ?
float m_minLineWidth
Minimum line width in pixels.
virtual void EndGroup()
End the group.
virtual void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle)
Draw an arc.
virtual void Transform(const MATRIX3x3D &aTransformation)
Transform the context.
virtual void SetNegativeDrawMode(bool aSetting)
Set negative draw mode in the renderer.
COLOR4D m_gridColor
Color of the grid.
VECTOR2D ToWorld(const VECTOR2D &aPoint) const
Compute the point position in world coordinates from given screen coordinates.
COLOR4D m_strokeColor
The color of the outlines.
double computeMinGridSpacing() const
Compute minimum grid spacing from the grid settings.
void SetFontItalic(bool aItalic)
bool m_isStrokeEnabled
Are the outlines stroked ?
virtual void DrawBitmap(const BITMAP_BASE &aBitmap, double alphaBlend=1.0)
Draw a bitmap image.
GAL_DISPLAY_OPTIONS & m_options
bool m_gridVisibility
Should the grid be shown.
double GetMinDepth() const
virtual void ClearCache()
Delete all data created during caching of graphic items.
virtual void SetTarget(RENDER_TARGET aTarget)
Set the target for rendering.
virtual void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth)
Draw a rounded segment.
double m_screenDPI
The dots per inch of the screen.
virtual void DrawPolyline(const SHAPE_LINE_CHAIN &aLineChain)
const VECTOR2I & GetScreenPixelSize() const
Return GAL canvas size in pixels.
friend class GAL_UPDATE_CONTEXT
void SetGridVisibility(bool aVisibility)
Set the visibility setting of the grid.
float GetLineWidth() const
Get the line width.
virtual void Save()
Save the context.
bool m_globalFlipX
Flag for X axis flipping.
virtual void LockContext(int aClientCookie)
Use GAL_CONTEXT_LOCKER RAII object unless you know what you're doing.
virtual void DrawSegmentChain(const std::vector< VECTOR2D > &aPointList, double aWidth)
Draw a chain of rounded segments.
void SetWorldScreenMatrix(const MATRIX3x3D &aMatrix)
Set the world <-> screen transformation matrix.
GR_TEXT_V_ALIGN_T GetVerticalJustify() const
bool GetIsStroke() const
Get the stroke status.
KIGFX::CROSS_HAIR_MODE m_crossHairMode
Crosshair drawing mode.
virtual void DrawCursor(const VECTOR2D &aCursorPosition)
Draw the cursor.
void SetDepthRange(const VECTOR2D &aDepthRange)
Set the range of the layer depth.
double GetWorldScale() const
Get the world scale.
VECTOR2D m_lookAtPoint
Point to be looked at in world space.
GAL(GAL_DISPLAY_OPTIONS &aOptions)
virtual bool IsVisible() const
Return true if the GAL canvas is visible on the screen.
void SetScreenDPI(double aScreenDPI)
Set the dots per inch of the screen.
virtual void DrawPolyline(const VECTOR2D aPointList[], int aListSize)
virtual void EnableDepthTest(bool aEnabled=false)
bool m_forceDisplayCursor
Always show cursor.
static const int MAX_DEPTH
Container for data for KiCad programs.
Definition pgm_base.h:108
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:541
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
KICURSOR
Definition cursors.h:44
#define GAL_API
Definition gal.h:27
MATRIX3x3< double > MATRIX3x3D
Definition matrix3x3.h:473
The Cairo implementation of the graphics abstraction layer.
Definition eda_group.h:33
GRID_STYLE
Type definition of the grid style.
@ SMALL_CROSS
Use small cross instead of dots for the grid.
RENDER_TARGET
RENDER_TARGET: Possible rendering targets.
Definition definitions.h:36
@ TARGET_CACHED
Main rendering target (cached)
Definition definitions.h:37
PGM_BASE * PgmOrNull()
Return a reference that can be nullptr when running a shared lib from a script, not from a kicad app.
see class PGM_BASE
GR_TEXT_H_ALIGN_T
This is API surface mapped to common.types.HorizontalAlignment.
GR_TEXT_V_ALIGN_T
This is API surface mapped to common.types.VertialAlignment.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687
VECTOR2< double > VECTOR2D
Definition vector2d.h:686