Correct Cairo GAL dot rendering
This matches the OpenGL dot rendering. Patch from dsa-t with minor changes Fixes https://gitlab.com/kicad/code/kicad/issues/5832
This commit is contained in:
parent
69d47c90ea
commit
ae1004776f
|
@ -37,6 +37,7 @@
|
||||||
#include <bitmap_base.h>
|
#include <bitmap_base.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
#include <pixman.h>
|
#include <pixman.h>
|
||||||
|
@ -999,12 +1000,12 @@ void CAIRO_GAL_BASE::drawGridCross( const VECTOR2D& aPoint )
|
||||||
{
|
{
|
||||||
syncLineWidth();
|
syncLineWidth();
|
||||||
VECTOR2D offset( 0, 0 );
|
VECTOR2D offset( 0, 0 );
|
||||||
auto size = 2.0 * lineWidthInPixels;
|
double size = 2.0 * lineWidthInPixels + 0.5;
|
||||||
|
|
||||||
auto p0 = roundp( xform( aPoint ) ) - VECTOR2D( size, 0 ) + offset;
|
VECTOR2D p0 = roundp( xform( aPoint ) ) - VECTOR2D( size, 0 ) + offset;
|
||||||
auto p1 = roundp( xform( aPoint ) ) + VECTOR2D( size, 0 ) + offset;
|
VECTOR2D p1 = roundp( xform( aPoint ) ) + VECTOR2D( size, 0 ) + offset;
|
||||||
auto p2 = roundp( xform( aPoint ) ) - VECTOR2D( 0, size ) + offset;
|
VECTOR2D p2 = roundp( xform( aPoint ) ) - VECTOR2D( 0, size ) + offset;
|
||||||
auto p3 = roundp( xform( aPoint ) ) + VECTOR2D( 0, size ) + offset;
|
VECTOR2D p3 = roundp( xform( aPoint ) ) + VECTOR2D( 0, size ) + offset;
|
||||||
|
|
||||||
cairo_set_source_rgba( currentContext, gridColor.r, gridColor.g, gridColor.b, gridColor.a );
|
cairo_set_source_rgba( currentContext, gridColor.r, gridColor.g, gridColor.b, gridColor.a );
|
||||||
cairo_move_to( currentContext, p0.x, p0.y );
|
cairo_move_to( currentContext, p0.x, p0.y );
|
||||||
|
@ -1015,15 +1016,16 @@ void CAIRO_GAL_BASE::drawGridCross( const VECTOR2D& aPoint )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CAIRO_GAL_BASE::drawGridPoint( const VECTOR2D& aPoint, double aSize )
|
void CAIRO_GAL_BASE::drawGridPoint( const VECTOR2D& aPoint, double aWidth, double aHeight )
|
||||||
{
|
{
|
||||||
auto p = roundp( xform( aPoint ) );
|
VECTOR2D p = roundp( xform( aPoint ) );
|
||||||
auto s = std::max( 1.0, xform( aSize / 2.0 ) );
|
|
||||||
|
double sw = std::max( 1.0, aWidth );
|
||||||
|
double sh = std::max( 1.0, aHeight );
|
||||||
|
|
||||||
cairo_set_source_rgba( currentContext, gridColor.r, gridColor.g, gridColor.b, gridColor.a );
|
cairo_set_source_rgba( currentContext, gridColor.r, gridColor.g, gridColor.b, gridColor.a );
|
||||||
cairo_move_to( currentContext, p.x, p.y );
|
cairo_rectangle( currentContext, p.x - std::floor( sw / 2 ) - 0.5,
|
||||||
cairo_arc( currentContext, p.x, p.y, s, 0.0, 2.0 * M_PI );
|
p.y - std::floor( sh / 2 ) - 0.5, sw, sh );
|
||||||
cairo_close_path( currentContext );
|
|
||||||
|
|
||||||
cairo_fill( currentContext );
|
cairo_fill( currentContext );
|
||||||
}
|
}
|
||||||
|
@ -1621,6 +1623,8 @@ void CAIRO_GAL_BASE::DrawGrid()
|
||||||
}
|
}
|
||||||
else // Dots or Crosses grid
|
else // Dots or Crosses grid
|
||||||
{
|
{
|
||||||
|
lineWidthIsOdd = true;
|
||||||
|
isStrokeEnabled = true;
|
||||||
for( int j = gridStartY; j <= gridEndY; j++ )
|
for( int j = gridStartY; j <= gridEndY; j++ )
|
||||||
{
|
{
|
||||||
bool tickY = ( j % gridTick == 0 );
|
bool tickY = ( j % gridTick == 0 );
|
||||||
|
@ -1628,14 +1632,20 @@ void CAIRO_GAL_BASE::DrawGrid()
|
||||||
for( int i = gridStartX; i <= gridEndX; i++ )
|
for( int i = gridStartX; i <= gridEndX; i++ )
|
||||||
{
|
{
|
||||||
bool tickX = ( i % gridTick == 0 );
|
bool tickX = ( i % gridTick == 0 );
|
||||||
SetLineWidth( ( ( tickX && tickY ) ? doubleMarker : marker ) );
|
VECTOR2D pos{ i * gridScreenSize.x + gridOrigin.x,
|
||||||
auto pos = VECTOR2D( i * gridScreenSize.x + gridOrigin.x,
|
j * gridScreenSize.y + gridOrigin.y };
|
||||||
j * gridScreenSize.y + gridOrigin.y );
|
|
||||||
|
|
||||||
if( gridStyle == GRID_STYLE::SMALL_CROSS )
|
if( gridStyle == GRID_STYLE::SMALL_CROSS )
|
||||||
|
{
|
||||||
|
SetLineWidth( ( tickX && tickY ) ? doubleMarker : marker );
|
||||||
drawGridCross( pos );
|
drawGridCross( pos );
|
||||||
|
}
|
||||||
else if( gridStyle == GRID_STYLE::DOTS )
|
else if( gridStyle == GRID_STYLE::DOTS )
|
||||||
drawGridPoint( pos, GetLineWidth() );
|
{
|
||||||
|
double doubleGridLineWidth = gridLineWidth * 2.0f;
|
||||||
|
drawGridPoint( pos, ( tickX ) ? doubleGridLineWidth : gridLineWidth,
|
||||||
|
( tickY ) ? doubleGridLineWidth : gridLineWidth );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,7 +244,7 @@ protected:
|
||||||
*/
|
*/
|
||||||
void drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
void drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
||||||
void drawGridCross( const VECTOR2D& aPoint );
|
void drawGridCross( const VECTOR2D& aPoint );
|
||||||
void drawGridPoint( const VECTOR2D& aPoint, double aSize );
|
void drawGridPoint( const VECTOR2D& aPoint, double aWidth, double aHeight );
|
||||||
void drawAxes( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
void drawAxes( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint );
|
||||||
|
|
||||||
/// Super class definition
|
/// Super class definition
|
||||||
|
|
Loading…
Reference in New Issue