eeschema-gal: support for global labels and bitmaps

This commit is contained in:
Tomasz Wlostowski 2018-08-27 15:25:48 +02:00 committed by Jeff Young
parent d9f0dc63a5
commit ccb594f599
4 changed files with 65 additions and 31 deletions

View File

@ -1002,18 +1002,16 @@ void OPENGL_GAL::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aContro
void OPENGL_GAL::DrawBitmap( const BITMAP_BASE& aBitmap )
{
int ppi = aBitmap.GetPPI();
double worldIU_per_mm = 1.0 / ( worldUnitLength / 2.54 )/ 1000;
double pix_size_iu = worldIU_per_mm * ( 25.4 / ppi );
double w = aBitmap.GetSizePixels().x * pix_size_iu;
double h = aBitmap.GetSizePixels().y * pix_size_iu;
double w = (double) aBitmap.GetSizePixels().x / (double) ppi / worldUnitLength * 10.0; // no idea where the factor 10 comes from...
double h = (double) aBitmap.GetSizePixels().y / (double) ppi / worldUnitLength * 10.0;
auto xform = currentManager->GetTransformation();
glm::vec4 v0 = xform * glm::vec4( -w/2, -h/2, 0.0, 0.0 );
glm::vec4 v1 = xform * glm::vec4( w/2, h/2, 0.0, 0.0 );
glm::vec4 trans = xform[3];
auto id = bitmapCache->RequestBitmap( &aBitmap );
auto oldTarget = GetTarget();

View File

@ -28,11 +28,12 @@
#include <fctsys.h>
#include <sch_draw_panel.h>
#include <sch_view.h>
#include <sch_edit_frame.h>
#include <sch_bitmap.h>
#include <dialog_image_editor.h>
#include <view/view_group.h>
static void abortMoveBitmap( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
{
@ -72,29 +73,25 @@ static void abortMoveBitmap( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
static void moveBitmap( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase )
{
auto panel = static_cast<SCH_DRAW_PANEL*> ( aPanel );
SCH_SCREEN* screen = (SCH_SCREEN*) aPanel->GetScreen();
SCH_BITMAP* image = (SCH_BITMAP*) screen->GetCurItem();
auto preview = panel->GetView()->GetPreview();
if( aErase )
{
// Erase the current bitmap at its current position.
// Note also items flagged IS_MOVING are not drawn,
// and if image is new, it is not yet il draw list
// so image is erased from screen
EDA_RECT dirty = image->GetBoundingBox();
dirty.Inflate( 4 ); // Give a margin
aPanel->SetMouseCapture( NULL, NULL ); // Avoid loop in redraw panel
STATUS_FLAGS flgs = image->GetFlags();
image->ClearFlags();
aPanel->RefreshDrawingRect( dirty );
image->SetFlags( flgs );
aPanel->SetMouseCapture( moveBitmap, abortMoveBitmap );
}
if ( ! image )
return;
// Draw the bitmap at it's new position.
image->SetPosition( aPanel->GetParent()->GetCrossHairPosition() - image->GetStoredPos() );
image->Draw( aPanel, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
auto view = panel->GetView();
view->ClearPreview();
view->AddToPreview( image, false );
view->SetVisible( preview, true );
view->Update( preview );
view->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
}
@ -128,8 +125,11 @@ SCH_BITMAP* SCH_EDIT_FRAME::CreateNewImage( wxDC* aDC )
}
image->SetFlags( IS_NEW | IS_MOVED );
image->Draw( m_canvas, aDC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
auto view = static_cast<SCH_DRAW_PANEL*>( m_canvas )->GetView();
view->ClearPreview();
view->AddToPreview( image, false );
m_canvas->SetMouseCapture( moveBitmap, abortMoveBitmap );
GetScreen()->SetCurItem( image );

View File

@ -42,6 +42,7 @@
#include <sch_text.h>
#include <sch_no_connect.h>
#include <sch_bus_entry.h>
#include <sch_bitmap.h>
#include <draw_graphic_text.h>
#include <lib_edit_frame.h>
@ -140,14 +141,14 @@ bool SCH_PAINTER::Draw( const VIEW_ITEM *aItem, int aLayer )
*/
switch(item->Type())
{
HANDLE_ITEM(LIB_PART_T, LIB_PART);
HANDLE_ITEM(LIB_RECTANGLE_T, LIB_RECTANGLE);
HANDLE_ITEM(LIB_PART_T, LIB_PART);
HANDLE_ITEM(LIB_RECTANGLE_T, LIB_RECTANGLE);
HANDLE_ITEM(LIB_POLYLINE_T, LIB_POLYLINE);
HANDLE_ITEM(LIB_CIRCLE_T, LIB_CIRCLE);
HANDLE_ITEM(LIB_PIN_T, LIB_PIN);
HANDLE_ITEM(LIB_ARC_T, LIB_ARC);
HANDLE_ITEM(LIB_FIELD_T, LIB_FIELD);
HANDLE_ITEM(LIB_TEXT_T, LIB_TEXT);
HANDLE_ITEM(LIB_TEXT_T, LIB_TEXT);
HANDLE_ITEM(SCH_COMPONENT_T, SCH_COMPONENT);
HANDLE_ITEM(SCH_JUNCTION_T, SCH_JUNCTION);
HANDLE_ITEM(SCH_LINE_T, SCH_LINE);
@ -160,7 +161,9 @@ bool SCH_PAINTER::Draw( const VIEW_ITEM *aItem, int aLayer )
HANDLE_ITEM(SCH_NO_CONNECT_T, SCH_NO_CONNECT);
HANDLE_ITEM(SCH_BUS_WIRE_ENTRY_T, SCH_BUS_ENTRY_BASE);
HANDLE_ITEM(SCH_BUS_BUS_ENTRY_T, SCH_BUS_ENTRY_BASE);
HANDLE_ITEM(SCH_BITMAP_T, SCH_BITMAP);
HANDLE_ITEM(SCH_MARKER_T, SCH_MARKER);
default:
return false;
}
@ -705,6 +708,9 @@ void SCH_PAINTER::draw ( SCH_TEXT *aText, int aLayer )
case SCH_HIERARCHICAL_LABEL_T:
color = m_schSettings.GetLayerColor( LAYER_SHEETLABEL );
break;
case SCH_GLOBAL_LABEL_T:
color = m_schSettings.GetLayerColor( LAYER_GLOBLABEL );
break;
default:
color = m_schSettings.GetLayerColor( LAYER_NOTES );
break;
@ -910,9 +916,24 @@ void SCH_PAINTER::draw ( SCH_FIELD *aField, int aLayer )
m_gal->StrokeText( aField->GetFullyQualifiedText(), textpos, orient == TEXT_ANGLE_VERT ? -M_PI/2 : 0 );
}
void SCH_PAINTER::draw ( SCH_GLOBALLABEL *aLabel, int aLayer )
{
std::vector<wxPoint> pts;
std::deque<VECTOR2D> pts2;
aLabel->CreateGraphicShape( pts, aLabel->GetTextPos() );
for( auto p : pts )
pts2.push_back( VECTOR2D(p.x, p.y ) );
m_gal->SetIsFill( false );
m_gal->SetIsStroke( true );
m_gal->SetStrokeColor( m_schSettings.GetLayerColor( LAYER_GLOBLABEL ) );
m_gal->DrawPolyline( pts2 );
m_gal->AdvanceDepth(); // fixme
draw( static_cast<SCH_TEXT*>( aLabel ), aLayer );
}
@ -1022,5 +1043,18 @@ void SCH_PAINTER::draw ( SCH_BUS_ENTRY_BASE *aEntry, int aLayer )
}
void SCH_PAINTER::draw ( SCH_BITMAP *aBitmap, int aLayer )
{
m_gal->Save();
m_gal->Translate( aBitmap->GetPosition() );
m_gal->DrawBitmap( *aBitmap->GetImage() );
m_gal->Restore();
}
void SCH_PAINTER::draw ( SCH_MARKER *aMarker, int aLayer )
{
}
}; // namespace KIGFX

View File

@ -49,6 +49,7 @@ class SCH_MARKER;
class SCH_NO_CONNECT;
class SCH_LINE;
class SCH_BUS_ENTRY_BASE;
class SCH_BITMAP;
namespace KIGFX
{
@ -134,8 +135,9 @@ private:
void draw( SCH_SHEET_PIN *, int );
void draw( SCH_NO_CONNECT *, int );
void draw( SCH_MARKER *, int );
void draw( SCH_BITMAP *, int );
void draw( SCH_LINE *, int );
void draw ( SCH_BUS_ENTRY_BASE *aEntry, int aLayer );
void draw( SCH_BUS_ENTRY_BASE *aEntry, int aLayer );
void defaultColors( const LIB_ITEM *aItem );