From 1cffcafe2d4ef761c5be509d52a2b1b8734e19aa Mon Sep 17 00:00:00 2001 From: jean-pierre charras 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 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 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 @@ 1 0 - "Dots" "Lines" + "Dots" "Lines" "Small crosses" 1 1