← Back to team overview

kicad-developers team mailing list archive

[PATCH] Add setting to have GAL draw axes on the grid

 

Hi all,

This patch adds the ability for GAL to draw axes when drawing the grid.
Right now this is only going to be used for GerbView.

Best,
Jon
From 384c6e7ca96421645f69976f695e52733b424469 Mon Sep 17 00:00:00 2001
From: Jon Evans <jon@xxxxxxxxxxxxx>
Date: Tue, 7 Mar 2017 21:33:19 -0500
Subject: [PATCH] Add setting to have GAL draw axes on the grid

---
 common/gal/cairo/cairo_gal.cpp            |  3 ++-
 common/gal/gal_display_options.cpp        | 10 +++++++++-
 common/gal/graphics_abstraction_layer.cpp | 21 +++++++++++++++++++++
 common/gal/opengl/opengl_gal.cpp          | 19 +++++++++++++++++++
 include/gal/gal_display_options.h         |  3 +++
 include/gal/graphics_abstraction_layer.h  | 12 ++++++++++++
 6 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp
index e499c9b..060c411 100644
--- a/common/gal/cairo/cairo_gal.cpp
+++ b/common/gal/cairo/cairo_gal.cpp
@@ -87,6 +87,7 @@ CAIRO_GAL::CAIRO_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions,
 
     // Grid color settings are different in Cairo and OpenGL
     SetGridColor( COLOR4D( 0.1, 0.1, 0.1, 0.8 ) );
+    SetAxesColor( COLOR4D( BLUE ) );
 
     // Allocate memory for pixel storage
     allocateBitmaps();
@@ -825,7 +826,7 @@ void CAIRO_GAL::drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndP
 {
     cairo_move_to( currentContext, aStartPoint.x, aStartPoint.y );
     cairo_line_to( currentContext, aEndPoint.x, aEndPoint.y );
-    cairo_set_source_rgba( currentContext, gridColor.r, gridColor.g, gridColor.b, strokeColor.a );
+    cairo_set_source_rgba( currentContext, strokeColor.r, strokeColor.g, strokeColor.b, strokeColor.a );
     cairo_stroke( currentContext );
 }
 
diff --git a/common/gal/gal_display_options.cpp b/common/gal/gal_display_options.cpp
index 3df7c3c..803adf3 100644
--- a/common/gal/gal_display_options.cpp
+++ b/common/gal/gal_display_options.cpp
@@ -35,6 +35,7 @@ static const wxString GalGLAntialiasingKeyword( "OpenGLAntialiasingMode" );
 static const wxString GalGridStyleConfig( "GridStyle" );
 static const wxString GalGridLineWidthConfig( "GridLineWidth" );
 static const wxString GalGridMaxDensityConfig( "GridMaxDensity" );
+static const wxString GalGridAxesEnabledConfig( "GridAxesEnabled" );
 
 
 static const UTIL::CFG_MAP<KIGFX::OPENGL_ANTIALIASING_MODE> aaModeConfigVals =
@@ -59,7 +60,8 @@ GAL_DISPLAY_OPTIONS::GAL_DISPLAY_OPTIONS()
     : gl_antialiasing_mode( OPENGL_ANTIALIASING_MODE::NONE ),
       m_gridStyle( GRID_STYLE::DOTS ),
       m_gridLineWidth( 0.5 ),
-      m_gridMinSpacing( 10 )
+      m_gridMinSpacing( 10 ),
+      m_axesEnabled( false )
 {}
 
 
@@ -81,6 +83,9 @@ void GAL_DISPLAY_OPTIONS::ReadConfig( wxConfigBase* aCfg, wxString aBaseName )
     aCfg->Read( aBaseName + GalGridMaxDensityConfig,
                 &m_gridMinSpacing, 10 );
 
+    aCfg->Read( aBaseName + GalGridAxesEnabledConfig,
+                &m_axesEnabled, false );
+
     NotifyChanged();
 }
 
@@ -98,6 +103,9 @@ void GAL_DISPLAY_OPTIONS::WriteConfig( wxConfigBase* aCfg, wxString aBaseName )
 
     aCfg->Write( aBaseName + GalGridMaxDensityConfig,
                  m_gridMinSpacing );
+
+    aCfg->Write( aBaseName + GalGridAxesEnabledConfig,
+                 m_axesEnabled );
 }
 
 
diff --git a/common/gal/graphics_abstraction_layer.cpp b/common/gal/graphics_abstraction_layer.cpp
index f9182f7..3d83d05 100644
--- a/common/gal/graphics_abstraction_layer.cpp
+++ b/common/gal/graphics_abstraction_layer.cpp
@@ -110,6 +110,12 @@ bool GAL::updatedGalDisplayOptions( const GAL_DISPLAY_OPTIONS& aOptions )
         refresh = true;
     }
 
+    if( options.m_axesEnabled != axesEnabled )
+    {
+        axesEnabled = options.m_axesEnabled;
+        refresh = true;
+    }
+
     // tell the derived class if the base class needs an update or not
     return refresh;
 }
@@ -335,6 +341,21 @@ void GAL::DrawGrid()
             }
         }
     }
+
+    // Draw axes if desired
+    if( axesEnabled )
+    {
+        SetIsFill( false );
+        SetIsStroke( true );
+        SetStrokeColor( axesColor );
+        SetLineWidth( marker );
+
+        drawGridLine( VECTOR2D( worldStartPoint.x, 0 ),
+                      VECTOR2D( worldEndPoint.x, 0 ) );
+
+        drawGridLine( VECTOR2D( 0, worldStartPoint.y ),
+                      VECTOR2D( 0, worldEndPoint.y ) );
+    }
 }
 
 
diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp
index 8a6ddf0..b0f2e62 100644
--- a/common/gal/opengl/opengl_gal.cpp
+++ b/common/gal/opengl/opengl_gal.cpp
@@ -129,6 +129,7 @@ OPENGL_GAL::OPENGL_GAL( GAL_DISPLAY_OPTIONS& aDisplayOptions, wxWindow* aParent,
 
     // Grid color settings are different in Cairo and OpenGL
     SetGridColor( COLOR4D( 0.8, 0.8, 0.8, 0.1 ) );
+    SetAxesColor( COLOR4D( BLUE ) );
 
     // Tesselator initialization
     tesselator = gluNewTess();
@@ -994,6 +995,24 @@ void OPENGL_GAL::DrawGrid()
             glDisable( GL_STENCIL_TEST );
     }
 
+    // Draw axes if desired
+    if( axesEnabled )
+    {
+        glLineWidth( minorLineWidth );
+        glColor4d( axesColor.r, axesColor.g, axesColor.b, 1.0 );
+
+        glBegin( GL_LINES );
+        glVertex2d( worldStartPoint.x, 0 );
+        glVertex2d( worldEndPoint.x, 0 );
+        glEnd();
+
+        glBegin( GL_LINES );
+        glVertex2d( 0, worldStartPoint.y );
+        glVertex2d( 0, worldEndPoint.y );
+        glEnd();
+
+    }
+
     glEnable( GL_DEPTH_TEST );
     glEnable( GL_TEXTURE_2D );
 }
diff --git a/include/gal/gal_display_options.h b/include/gal/gal_display_options.h
index de8f389..733cb2b 100644
--- a/include/gal/gal_display_options.h
+++ b/include/gal/gal_display_options.h
@@ -81,6 +81,9 @@ namespace KIGFX
 
         ///> Minimum pixel distance between displayed grid lines
         double m_gridMinSpacing;
+
+        ///> Whether or not to draw the coordinate system axes
+        bool m_axesEnabled;
     };
 
 }
diff --git a/include/gal/graphics_abstraction_layer.h b/include/gal/graphics_abstraction_layer.h
index 197eb08..2a59bb6 100644
--- a/include/gal/graphics_abstraction_layer.h
+++ b/include/gal/graphics_abstraction_layer.h
@@ -813,6 +813,16 @@ public:
     }
 
     /**
+     * @brief Set the axes color.
+     *
+     * @param aAxesColor is the color to draw the axes if enabled.
+     */
+    inline void SetAxesColor( const COLOR4D& aAxesColor )
+    {
+        axesColor = aAxesColor;
+    }
+
+    /**
      * @brief Draw every tick line wider.
      *
      * @param aInterval increase the width of every aInterval line, if 0 do not use this feature.
@@ -988,6 +998,8 @@ protected:
     VECTOR2D           gridOrigin;             ///< The grid origin
     VECTOR2D           gridOffset;             ///< The grid offset to compensate cursor position
     COLOR4D            gridColor;              ///< Color of the grid
+    COLOR4D            axesColor;              ///< Color of the axes
+    bool               axesEnabled;            ///< Should the axes be drawn
     int                gridTick;               ///< Every tick line gets the double width
     double             gridLineWidth;          ///< Line width of the grid
     int                gridMinSpacing;         ///< Minimum screen size of the grid (pixels)
-- 
2.7.4


Follow ups