From 1cffcafe2d4ef761c5be509d52a2b1b8734e19aa Mon Sep 17 00:00:00 2001
From: jean-pierre charras <jp.charras@wanadoo.fr>
Date: Wed, 1 Mar 2017 10:29:19 +0100
Subject: [PATCH] GAL mode: Add small cross option to grid style (now: options
 are Dots, Grid, Small cross)

---
 common/gal/gal_display_options.cpp            |   1 +
 common/gal/graphics_abstraction_layer.cpp     |  35 ++++++
 common/gal/opengl/opengl_gal.cpp              | 110 ++++++++++++------
 include/gal/gal_display_options.h             |   5 +-
 pcbnew/dialogs/dialog_display_options.cpp     |   5 +-
 .../dialogs/dialog_display_options_base.cpp   |   2 +-
 .../dialogs/dialog_display_options_base.fbp   |   2 +-
 7 files changed, 118 insertions(+), 42 deletions(-)

diff --git a/common/gal/gal_display_options.cpp b/common/gal/gal_display_options.cpp
index 01688aaca0..ee72e43b3c 100644
--- a/common/gal/gal_display_options.cpp
+++ b/common/gal/gal_display_options.cpp
@@ -51,6 +51,7 @@ static const UTIL::CFG_MAP<KIGFX::GRID_STYLE> gridStyleConfigVals =
 {
     { KIGFX::GRID_STYLE::DOTS,       0 },
     { KIGFX::GRID_STYLE::LINES,      1 },
+    { KIGFX::GRID_STYLE::SMALL_CROSS,2 },
 };
 
 
diff --git a/common/gal/graphics_abstraction_layer.cpp b/common/gal/graphics_abstraction_layer.cpp
index 9bd8a98d8b..f9182f79c8 100644
--- a/common/gal/graphics_abstraction_layer.cpp
+++ b/common/gal/graphics_abstraction_layer.cpp
@@ -267,6 +267,41 @@ void GAL::DrawGrid()
                 }
             }
         }
+        else if( gridStyle == GRID_STYLE::SMALL_CROSS )
+        {
+            SetIsFill( false );
+            SetIsStroke( true );
+            SetStrokeColor( gridColor );
+
+            SetLineWidth( marker );
+            double lineLen = GetLineWidth() * 2;
+
+            // Vertical positions:
+            for( int j = gridStartY; j != gridEndY; j += dirY )
+            {
+                if( ( j % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                    || gridScreenSizeDense > gridThreshold )
+                {
+                    int posY =  j * gridSize.y + gridOrigin.y;
+
+                    // Horizontal positions:
+                    for( int i = gridStartX; i != gridEndX; i += dirX )
+                    {
+                        if( ( i % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                            || gridScreenSizeDense > gridThreshold )
+                        {
+                            int posX = i * gridSize.x + gridOrigin.x;
+
+                            drawGridLine( VECTOR2D( posX - lineLen, posY ),
+                                          VECTOR2D( posX + lineLen,   posY ) );
+
+                            drawGridLine( VECTOR2D( posX, posY - lineLen ),
+                                          VECTOR2D( posX, posY + lineLen ) );
+                        }
+                    }
+                }
+            }
+        }
         else    // Dotted grid
         {
             bool tickX, tickY;
diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp
index 0153360176..a2480411b5 100644
--- a/common/gal/opengl/opengl_gal.cpp
+++ b/common/gal/opengl/opengl_gal.cpp
@@ -906,50 +906,88 @@ void OPENGL_GAL::DrawGrid()
         glColor4d( gridColor.r, gridColor.g, gridColor.b, 1.0 );
     }
 
-    // Vertical lines
-    for( int j = gridStartY; j != gridEndY; j += dirY )
+    if( gridStyle == GRID_STYLE::SMALL_CROSS )
     {
-        if( j % gridTick == 0 && gridScreenSizeDense > gridThreshold )
-            glLineWidth( majorLineWidth );
-        else
-            glLineWidth( minorLineWidth );
+        glLineWidth( minorLineWidth );
 
-        if( ( j % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
-            || gridScreenSizeDense > gridThreshold )
+        // calculate a line len = 2 minorLineWidth, in internal unit value
+        // (in fact the size of cross is lineLen*2)
+        int lineLen = KiROUND( minorLineWidth / worldScale *2 );
+
+        // Vertical positions
+        for( int j = gridStartY; j != gridEndY; j += dirY )
         {
-            glBegin( GL_LINES );
-            glVertex2d( gridStartX * gridSize.x, j * gridSize.y + gridOrigin.y );
-            glVertex2d( gridEndX * gridSize.x, j * gridSize.y + gridOrigin.y );
-            glEnd();
+            if( ( j % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                || gridScreenSizeDense > gridThreshold )
+            {
+                int posY =  j * gridSize.y + gridOrigin.y;
+
+                // Horizontal positions
+                for( int i = gridStartX; i != gridEndX; i += dirX )
+                {
+                    if( ( i % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                        || gridScreenSizeDense > gridThreshold )
+                    {
+                        int posX = i * gridSize.x + gridOrigin.x;
+
+                        glBegin( GL_LINES );
+                        glVertex2d( posX -lineLen, posY );
+                        glVertex2d( posX + lineLen, posY );
+                        glVertex2d( posX, posY - lineLen );
+                        glVertex2d( posX, posY + lineLen );
+                        glEnd();
+                    }
+                }
+            }
         }
     }
-
-    if( gridStyle == GRID_STYLE::DOTS )
+    else
     {
-        glStencilFunc( GL_NOTEQUAL, 0, 1 );
-        glColor4d( gridColor.r, gridColor.g, gridColor.b, 1.0 );
-    }
-
-    // Horizontal lines
-    for( int i = gridStartX; i != gridEndX; i += dirX )
-    {
-        if( i % gridTick == 0 && gridScreenSizeDense > gridThreshold )
-            glLineWidth( majorLineWidth );
-        else
-            glLineWidth( minorLineWidth );
-
-        if( ( i % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
-            || gridScreenSizeDense > gridThreshold )
+        // Vertical lines
+        for( int j = gridStartY; j != gridEndY; j += dirY )
         {
-            glBegin( GL_LINES );
-            glVertex2d( i * gridSize.x + gridOrigin.x, gridStartY * gridSize.y );
-            glVertex2d( i * gridSize.x + gridOrigin.x, gridEndY * gridSize.y );
-            glEnd();
-        }
-    }
+            if( j % gridTick == 0 && gridScreenSizeDense > gridThreshold )
+                glLineWidth( majorLineWidth );
+            else
+                glLineWidth( minorLineWidth );
 
-    if( gridStyle == GRID_STYLE::DOTS )
-        glDisable( GL_STENCIL_TEST );
+            if( ( j % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                || gridScreenSizeDense > gridThreshold )
+            {
+                glBegin( GL_LINES );
+                glVertex2d( gridStartX * gridSize.x, j * gridSize.y + gridOrigin.y );
+                glVertex2d( gridEndX * gridSize.x, j * gridSize.y + gridOrigin.y );
+                glEnd();
+            }
+        }
+
+        if( gridStyle == GRID_STYLE::DOTS )
+        {
+            glStencilFunc( GL_NOTEQUAL, 0, 1 );
+            glColor4d( gridColor.r, gridColor.g, gridColor.b, 1.0 );
+        }
+
+        // Horizontal lines
+        for( int i = gridStartX; i != gridEndX; i += dirX )
+        {
+            if( i % gridTick == 0 && gridScreenSizeDense > gridThreshold )
+                glLineWidth( majorLineWidth );
+            else
+                glLineWidth( minorLineWidth );
+
+            if( ( i % gridTick == 0 && gridScreenSizeCoarse > gridThreshold )
+                || gridScreenSizeDense > gridThreshold )
+            {
+                glBegin( GL_LINES );
+                glVertex2d( i * gridSize.x + gridOrigin.x, gridStartY * gridSize.y );
+                glVertex2d( i * gridSize.x + gridOrigin.x, gridEndY * gridSize.y );
+                glEnd();
+            }
+        }
+
+        if( gridStyle == GRID_STYLE::DOTS )
+            glDisable( GL_STENCIL_TEST );
+    }
 
     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 666a92e736..de8f389a56 100644
--- a/include/gal/gal_display_options.h
+++ b/include/gal/gal_display_options.h
@@ -36,8 +36,9 @@ namespace KIGFX
      */
     enum class GRID_STYLE
     {
-        LINES,   ///< Use lines for the grid
-        DOTS     ///< Use dots for the grid
+        LINES,      ///< Use lines for the grid
+        DOTS,       ///< Use dots for the grid
+        SMALL_CROSS ///< Use small cross instead of dots for the grid
     };
 
     enum class OPENGL_ANTIALIASING_MODE
diff --git a/pcbnew/dialogs/dialog_display_options.cpp b/pcbnew/dialogs/dialog_display_options.cpp
index dc706943b0..4333c56976 100644
--- a/pcbnew/dialogs/dialog_display_options.cpp
+++ b/pcbnew/dialogs/dialog_display_options.cpp
@@ -59,8 +59,9 @@ static const double gridMinSpacingStep = 5;
 
 static const UTIL::CFG_MAP<KIGFX::GRID_STYLE> gridStyleSelectMap =
 {
-    { KIGFX::GRID_STYLE::DOTS,     0 },    // Default
-    { KIGFX::GRID_STYLE::LINES,    1 },
+    { KIGFX::GRID_STYLE::DOTS,        0 },  // Default
+    { KIGFX::GRID_STYLE::LINES,       1 },
+    { KIGFX::GRID_STYLE::SMALL_CROSS, 2 },
 };
 
 
diff --git a/pcbnew/dialogs/dialog_display_options_base.cpp b/pcbnew/dialogs/dialog_display_options_base.cpp
index 4ba3706e55..3d189c1818 100644
--- a/pcbnew/dialogs/dialog_display_options_base.cpp
+++ b/pcbnew/dialogs/dialog_display_options_base.cpp
@@ -49,7 +49,7 @@ DIALOG_DISPLAY_OPTIONS_BASE::DIALOG_DISPLAY_OPTIONS_BASE( wxWindow* parent, wxWi
 	wxStaticBoxSizer* sGridSettings;
 	sGridSettings = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Grid Display (OpenGL && Cairo)") ), wxVERTICAL );
 	
-	wxString m_gridStyleChoices[] = { _("Dots"), _("Lines") };
+	wxString m_gridStyleChoices[] = { _("Dots"), _("Lines"), _("Small crosses") };
 	int m_gridStyleNChoices = sizeof( m_gridStyleChoices ) / sizeof( wxString );
 	m_gridStyle = new wxRadioBox( sGridSettings->GetStaticBox(), wxID_ANY, _("Grid Style"), wxDefaultPosition, wxDefaultSize, m_gridStyleNChoices, m_gridStyleChoices, 1, wxRA_SPECIFY_COLS );
 	m_gridStyle->SetSelection( 0 );
diff --git a/pcbnew/dialogs/dialog_display_options_base.fbp b/pcbnew/dialogs/dialog_display_options_base.fbp
index 8b659a6eca..960b8087e5 100644
--- a/pcbnew/dialogs/dialog_display_options_base.fbp
+++ b/pcbnew/dialogs/dialog_display_options_base.fbp
@@ -436,7 +436,7 @@
                                                 <property name="caption"></property>
                                                 <property name="caption_visible">1</property>
                                                 <property name="center_pane">0</property>
-                                                <property name="choices">&quot;Dots&quot; &quot;Lines&quot;</property>
+                                                <property name="choices">&quot;Dots&quot; &quot;Lines&quot; &quot;Small crosses&quot;</property>
                                                 <property name="close_button">1</property>
                                                 <property name="context_help"></property>
                                                 <property name="context_menu">1</property>