kicad-source/qa/gal/gal_pixel_alignment/test_gal_pixel_alignment.cpp
Tomasz Włostowski bbee30671a gal: pixel alignment hacks, works for Retina display too now.
gal: pixel alignment for Cairo.
gal: pixel alignment for OpenGL

Cleanup of pixel alignment patches

gal/opengl: more pixel alignment patches:
- works on Retina displays now
- pixel alignment for circles
- correct 1-pixel strokes
- fixed unfinished 1-pixel line ends

GAL: Restore antialiasing options in Cairo
GAL: Fix arc drawing

Removes DrawArcSegment, which drew arcs whose edge was optionally
stroked (a feature that we did not use).  Fixes Cairo arc drawing issue
where arcs were not visible in pcbnew.

gal: further cleanup
gal: removed unused shader parameter
2019-02-16 20:03:13 +01:00

232 lines
7.0 KiB
C++

#include <pcb_test_frame.h>
#include <tool/tool_manager.h>
#include <gal/graphics_abstraction_layer.h>
#include <view/view.h>
#include <view/view_item.h>
#include <pcb_draw_panel_gal.h>
#include <layers_id_colors_and_visibility.h>
const VECTOR2D xform2( const MATRIX3x3D& minv, const VECTOR2D& p )
{
auto t = minv * p;
return VECTOR2D((float)t.x, (float)t.y);
}
void screenSpaceLine( KIGFX::GAL* gal, const VECTOR2D& p0, const VECTOR2D& p1, double w )
{
auto minv = gal->GetScreenWorldMatrix();
auto pa = xform2 ( minv, p0 );
auto pb = xform2 ( minv, p1 );
#if 0
//shader->Deactivate();
currentManager->Reserve( 6 );
currentManager->Shader( SHADER_NONE );
currentManager->Color( strokeColor.r, strokeColor.g, strokeColor.b, strokeColor.a );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pa.x, pa.y, layerDepth );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pb.x, pb.y, layerDepth );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pc.x, pc.y, layerDepth );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pa.x, pa.y, layerDepth );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pc.x, pc.y, layerDepth );
currentManager->Shader( SHADER_NONE ); currentManager->Vertex( pd.x, pd.y, layerDepth );
shader->Use();
#endif
gal->SetLineWidth( w * minv.GetScale().x );
gal->DrawLine( pa, pb );
}
void screenSpaceCircle( KIGFX::GAL* gal, const VECTOR2D& p0, double r, double w )
{
auto minv = gal->GetScreenWorldMatrix();
auto pa = xform2 ( minv, p0 );
gal->SetLineWidth( w * minv.GetScale().x );
gal->DrawCircle( pa, r * minv.GetScale().x );
}
class MY_DRAWING : public EDA_ITEM
{
public:
MY_DRAWING() : EDA_ITEM( NOT_USED ) {};
virtual ~MY_DRAWING(){};
wxString GetClass() const override
{
return wxT( "MyDrawing" );
}
#ifdef DEBUG
virtual void Show( int nestLevel, std::ostream& os ) const override {}
#endif
const BOX2I ViewBBox() const override
{
BOX2I bb;
bb.SetMaximum();
return bb;
}
virtual void ViewDraw( int aLayer, KIGFX::VIEW* aView ) const override
{
auto gal = aView->GetGAL();
int i;
gal->SetTarget( KIGFX::TARGET_NONCACHED );
gal->SetIsStroke( true );
gal->SetStrokeColor( COLOR4D::WHITE );
/* for(i=0;i < 100; i++)
{
gal->SetLineWidth( 10000 );
gal->DrawLine( VECTOR2I(0, i * 30000), VECTOR2I(1000000, i * 30000) );
gal->DrawLine( VECTOR2I(- 2000000 + i * 30000, 0), VECTOR2I(- 2000000 + i * 30000, 1000000) );
}
for( float alpha = 0.0; alpha <= 360.0; alpha += 6.0)
{
float ca = cos(alpha * M_PI / 180.0);
float sa = sin(alpha * M_PI / 180.0);
VECTOR2I p0(2000000, 0);
float r = 800000.0;
gal->DrawLine( p0, p0 + VECTOR2I( r*ca, r*sa));
}
*/
int k = 0;
double w = 0.0;
//gal->Rotate( 1.0 / 3.0 * M_PI );
for(int step = 10; step < 80; step += 11, k+=100)
{
for (int i = 0; i < 100; i++)
{
/*auto p0 = VECTOR2D( k + 100, 100 + i * step );
auto p1 = VECTOR2D( k + 100 + step/2, 100 + i * step );
auto p2 = VECTOR2D( k + 100 + step/2, 100 + i * step + step/2 );
auto p3 = VECTOR2D( k + 100, 100 + i * step + step/2 );
auto p4 = VECTOR2D( k + 100, 100 + i * step + step );*/
auto p0 = VECTOR2D( k + 100, 100 + i * step );
auto p1 = VECTOR2D( k + 100 + step/2, 100 + i * step );
auto p2 = VECTOR2D( k + 100 + step/2, 100 + i * step + step/2 );
auto p3 = VECTOR2D( k + 100, 100 + i * step + step/2 );
auto p4 = VECTOR2D( k + 100, 100 + i * step + step );
screenSpaceLine( gal, p0, p1 , w);
screenSpaceLine( gal, p3, p2 , w);
p0 += VECTOR2D(50, 0);
p1 += VECTOR2D(50, 0);
p2 += VECTOR2D(50, 0);
p3 += VECTOR2D(50, 0);
screenSpaceLine( gal, p0, p3 , w);
screenSpaceLine( gal, p1, p2 , w);
/* screenSpaceLine( gal, p1, p2 , w);
screenSpaceLine( gal, p2, p3 , w);
screenSpaceLine( gal, p3, p4 , w);
std::swap(p0.x, p0.y );
std::swap(p1.x, p1.y );
std::swap(p2.x, p2.y );
std::swap(p3.x, p3.y );
std::swap(p4.x, p4.y );
screenSpaceLine( gal, p0, p1 , w);
screenSpaceLine( gal, p1, p2 , w);
screenSpaceLine( gal, p2, p3 , w);
screenSpaceLine( gal, p3, p4 , w);*/
}
}
/*
for(i=0;i < 1000; i++)
{
int k = 0;
for(double w=1.0; w<=8.0; w+=1.0, k += 50)
{
//screenSpaceLine( gal, VECTOR2D( k, i*step ), VECTOR2D( k, i*step ) + VECTOR2D( 50, 0 ), w );
//screenSpaceLine( gal, VECTOR2D( i*step, k ), VECTOR2D( i*step, k ) + VECTOR2D( 0, 50 ), w );
}
//gal->ScreenSpaceQuad( VECTOR2D( 250, 100 + i*8 ), VECTOR2D( 100, 2 ) );
//gal->ScreenSpaceQuad( VECTOR2D( 400, 100 + i*4 + 0.5 ), VECTOR2D( 100, 1 ) );
//gal->ScreenSpaceQuad( VECTOR2D( 550, 100 + i*8 + 0.5 ), VECTOR2D( 100, 2 ) );
}*/
for(int i = 1; i < 16; i+=1)
{
for(int j = 1; j < 16; j+=1)
{
gal->SetIsStroke( true );
gal->SetIsFill( false );
//screenSpaceCircle(gal, VECTOR2D(100 + i * 25, 100 + j * 25), (float)i/2.0, 1);
gal->SetIsStroke( false );
gal->SetIsFill( true );
//screenSpaceCircle(gal, VECTOR2D(100 + i * 25, 500 + 100 + j * 25), (float)i/2.0, 1);
}
}
}
virtual void ViewGetLayers( int aLayers[], int& aCount ) const override
{
aLayers[0] = LAYER_GP_OVERLAY;
aCount = 1;
}
};
class MY_PCB_TEST_FRAME : public PCB_TEST_FRAME
{
public:
MY_PCB_TEST_FRAME( wxFrame* frame, const wxString& title,
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE )
: PCB_TEST_FRAME( frame, title, pos, size, style, PCB_DRAW_PANEL_GAL::GAL_TYPE_OPENGL )
{
registerTools();
m_galPanel->GetView()->Add( new MY_DRAWING );
m_galPanel->GetView()->SetScale( 41.3526000000, VECTOR2D( 837362.6373626292, 1581684.9816849837 ) );
}
void registerTools();
virtual ~MY_PCB_TEST_FRAME()
{
}
};
wxFrame* CreateMainFrame( const std::string& aFileName )
{
auto frame = new MY_PCB_TEST_FRAME( nullptr, wxT( "Test PCB Frame" ) );
if( aFileName != "" )
{
frame->LoadAndDisplayBoard( aFileName );
}
return frame;
}
void MY_PCB_TEST_FRAME::registerTools()
{
m_toolManager->InitTools();
m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD );
}