mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-15 02:33:15 +02:00
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
232 lines
7.0 KiB
C++
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 );
|
|
}
|