From b0e2908c9b21fdcd9e7b84736f76875765b5444e Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Sat, 19 Oct 2013 12:29:54 +0200 Subject: [PATCH] pl_editor: add a PPI (pixel per inch) setup option for bitmaps. --- common/class_bitmap_base.cpp | 8 +- .../page_layout/class_worksheet_dataitem.cpp | 34 ++++ include/class_bitmap_base.h | 3 +- include/class_worksheet_dataitem.h | 23 ++- .../dialogs/properties_frame_base.cpp | 29 ++- .../dialogs/properties_frame_base.fbp | 191 +++++++++++++++++- .../dialogs/properties_frame_base.h | 4 + pagelayout_editor/properties_frame.cpp | 68 +++++-- pcbnew/pcbnew_config.cpp | 4 +- 9 files changed, 317 insertions(+), 47 deletions(-) diff --git a/common/class_bitmap_base.cpp b/common/class_bitmap_base.cpp index 94797b0a66..c02f6c1e98 100644 --- a/common/class_bitmap_base.cpp +++ b/common/class_bitmap_base.cpp @@ -46,11 +46,12 @@ BITMAP_BASE::BITMAP_BASE( const wxPoint& pos ) { - m_Scale = 1.0; // 1.0 = original bitmap size + m_Scale = 1.0; // 1.0 = original bitmap size m_bitmap = NULL; m_image = NULL; - m_pixelScaleFactor = 3.33; // a value OK for bitmaps using 300 PPI - // (Eeschema uses currently 1000PPI + m_ppi = 300; // the bitmap definition. the default is 300PPI + m_pixelScaleFactor = 1000.0 / m_ppi; // a value OK for bitmaps using 300 PPI + // for Eeschema which uses currently 1000PPI } @@ -72,6 +73,7 @@ void BITMAP_BASE::ImportData( BITMAP_BASE* aItem ) *m_image = *aItem->m_image; *m_bitmap = *aItem->m_bitmap; m_Scale = aItem->m_Scale; + m_ppi = aItem->m_ppi; m_pixelScaleFactor = aItem->m_pixelScaleFactor; } diff --git a/common/page_layout/class_worksheet_dataitem.cpp b/common/page_layout/class_worksheet_dataitem.cpp index ba6ce4604a..819fc1a5ff 100644 --- a/common/page_layout/class_worksheet_dataitem.cpp +++ b/common/page_layout/class_worksheet_dataitem.cpp @@ -540,4 +540,38 @@ void WORKSHEET_DATAITEM_TEXT::SetConstrainedTextSize() } } +/* set the pixel scale factor of the bitmap + * this factor depend on the application internal unit + * and the PPI bitmap factor + * the pixel scale factor should be initialized before drawing the bitmap + */ +void WORKSHEET_DATAITEM_BITMAP::SetPixelScaleFactor() +{ + if( m_ImageBitmap ) + { + // m_WSunits2Iu is the page layout unit to application internal unit + // i.e. the mm to to application internal unit + // however the bitmap definition is always known in pixels per inches + double scale = m_WSunits2Iu * 25.4 / m_ImageBitmap->GetPPI(); + m_ImageBitmap->SetPixelScaleFactor( scale ); + } +} + +/* return the PPI of the bitmap + */ +int WORKSHEET_DATAITEM_BITMAP::GetPPI() const +{ + if( m_ImageBitmap ) + return m_ImageBitmap->GetPPI() / m_ImageBitmap->m_Scale; + + return 300; +} + +/*adjust the PPI of the bitmap + */ +void WORKSHEET_DATAITEM_BITMAP::SetPPI( int aBitmapPPI ) +{ + if( m_ImageBitmap ) + m_ImageBitmap->m_Scale = (double) m_ImageBitmap->GetPPI() / aBitmapPPI; +} diff --git a/include/class_bitmap_base.h b/include/class_bitmap_base.h index c922122803..db07c41d6c 100644 --- a/include/class_bitmap_base.h +++ b/include/class_bitmap_base.h @@ -54,6 +54,7 @@ private: // to convert the bitmap size (in pixels) // to internal KiCad units // Usually does not change + int m_ppi; // the bitmap definition. the default is 300PPI public: BITMAP_BASE( const wxPoint& pos = wxPoint( 0, 0 ) ); @@ -128,7 +129,7 @@ public: BITMAP_BASE( const wxPoint& pos = wxPoint( 0, 0 ) ); */ int GetPPI() const { - return 300; + return m_ppi; } /** diff --git a/include/class_worksheet_dataitem.h b/include/class_worksheet_dataitem.h index 18b57b16e9..192cc009ac 100644 --- a/include/class_worksheet_dataitem.h +++ b/include/class_worksheet_dataitem.h @@ -485,6 +485,17 @@ public: */ virtual bool HasEndPoint() { return false; } + /** + * @return the PPI of the bitmap + */ + int GetPPI() const; + + /** + * adjust the PPI of the bitmap + * @param aBitmapPPI = the ned PPI for the bitmap + */ + void SetPPI( int aBitmapPPI ); + /** * set the pixel scale factor of the bitmap * this factor depend on the application internal unit @@ -492,17 +503,7 @@ public: * the pixel scale factor is the pixel size to application internal unit * and should be initialized before printing or drawing the bitmap */ - void SetPixelScaleFactor() - { - if( m_ImageBitmap ) - { - // m_WSunits2Iu is the page layout unit to application internal unit - // i.e. the mm to to application internal unit - // however the bitmap definition is always known in pixels per inches - double scale = m_WSunits2Iu * 25.4 / m_ImageBitmap->GetPPI(); - m_ImageBitmap->SetPixelScaleFactor( scale ); - } - } + void SetPixelScaleFactor(); }; diff --git a/pagelayout_editor/dialogs/properties_frame_base.cpp b/pagelayout_editor/dialogs/properties_frame_base.cpp index ab6543c85b..a6492cfd64 100644 --- a/pagelayout_editor/dialogs/properties_frame_base.cpp +++ b/pagelayout_editor/dialogs/properties_frame_base.cpp @@ -317,28 +317,27 @@ PANEL_PROPERTIES_BASE::PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, c bSizerMain->Add( m_SizerEndPosition, 0, 0, 5 ); - wxBoxSizer* bSizerLineThickness; - bSizerLineThickness = new wxBoxSizer( wxHORIZONTAL ); + m_SizerLineThickness = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizerthickness; - bSizerthickness = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizerThickness; + bSizerThickness = new wxBoxSizer( wxVERTICAL ); m_staticTextThickness = new wxStaticText( m_swItemProperties, wxID_ANY, _("Thickness"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextThickness->Wrap( -1 ); - bSizerthickness->Add( m_staticTextThickness, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + bSizerThickness->Add( m_staticTextThickness, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_textCtrlThickness = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerthickness->Add( m_textCtrlThickness, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizerThickness->Add( m_textCtrlThickness, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizerLineThickness->Add( bSizerthickness, 0, wxEXPAND, 5 ); + m_SizerLineThickness->Add( bSizerThickness, 0, wxEXPAND, 5 ); m_staticTextInfoThickness = new wxStaticText( m_swItemProperties, wxID_ANY, _("Set to 0 to use default"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextInfoThickness->Wrap( -1 ); - bSizerLineThickness->Add( m_staticTextInfoThickness, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_SizerLineThickness->Add( m_staticTextInfoThickness, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerMain->Add( bSizerLineThickness, 0, 0, 5 ); + bSizerMain->Add( m_SizerLineThickness, 0, 0, 5 ); m_SizerRotation = new wxBoxSizer( wxVERTICAL ); @@ -361,6 +360,18 @@ PANEL_PROPERTIES_BASE::PANEL_PROPERTIES_BASE( wxWindow* parent, wxWindowID id, c bSizerMain->Add( m_SizerRotation, 0, wxEXPAND, 5 ); + m_SizerBitmapPPI = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextBitmapPPI = new wxStaticText( m_swItemProperties, wxID_ANY, _("Bitmap PPI"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBitmapPPI->Wrap( -1 ); + m_SizerBitmapPPI->Add( m_staticTextBitmapPPI, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlBitmapPPI = new wxTextCtrl( m_swItemProperties, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_SizerBitmapPPI->Add( m_textCtrlBitmapPPI, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerMain->Add( m_SizerBitmapPPI, 0, wxEXPAND, 5 ); + m_staticline4 = new wxStaticLine( m_swItemProperties, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerMain->Add( m_staticline4, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); diff --git a/pagelayout_editor/dialogs/properties_frame_base.fbp b/pagelayout_editor/dialogs/properties_frame_base.fbp index cdbfedd814..7e112d688e 100644 --- a/pagelayout_editor/dialogs/properties_frame_base.fbp +++ b/pagelayout_editor/dialogs/properties_frame_base.fbp @@ -3953,16 +3953,16 @@ 0 - bSizerLineThickness + m_SizerLineThickness wxHORIZONTAL - none + protected 5 wxEXPAND 0 - bSizerthickness + bSizerThickness wxVERTICAL none @@ -4503,6 +4503,191 @@ + + 5 + wxEXPAND + 0 + + + m_SizerBitmapPPI + wxHORIZONTAL + protected + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Bitmap PPI + + 0 + + + 0 + + 1 + m_staticTextBitmapPPI + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_textCtrlBitmapPPI + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 wxEXPAND|wxTOP|wxRIGHT|wxLEFT diff --git a/pagelayout_editor/dialogs/properties_frame_base.h b/pagelayout_editor/dialogs/properties_frame_base.h index 922ae56df1..89d89aa7f6 100644 --- a/pagelayout_editor/dialogs/properties_frame_base.h +++ b/pagelayout_editor/dialogs/properties_frame_base.h @@ -85,6 +85,7 @@ class PANEL_PROPERTIES_BASE : public wxPanel wxTextCtrl* m_textCtrlEndY; wxStaticText* m_staticTextOrgEnd; wxComboBox* m_comboBoxCornerEnd; + wxBoxSizer* m_SizerLineThickness; wxStaticText* m_staticTextThickness; wxTextCtrl* m_textCtrlThickness; wxStaticText* m_staticTextInfoThickness; @@ -92,6 +93,9 @@ class PANEL_PROPERTIES_BASE : public wxPanel wxStaticLine* m_staticline1; wxStaticText* m_staticTextRot; wxTextCtrl* m_textCtrlRotation; + wxBoxSizer* m_SizerBitmapPPI; + wxStaticText* m_staticTextBitmapPPI; + wxTextCtrl* m_textCtrlBitmapPPI; wxStaticLine* m_staticline4; wxStaticText* m_staticTextRepeatPrms; wxStaticText* m_staticTextRepeatCnt; diff --git a/pagelayout_editor/properties_frame.cpp b/pagelayout_editor/properties_frame.cpp index 9857896960..b626f9d19f 100644 --- a/pagelayout_editor/properties_frame.cpp +++ b/pagelayout_editor/properties_frame.cpp @@ -153,6 +153,7 @@ void PROPERTIES_FRAME::CopyPrmsFromItemToPanel( WORKSHEET_DATAITEM* aItem ) m_textCtrlPosX->SetValue( msg ); msg.Printf( wxT("%.3f"), aItem->m_Pos.m_Pos.y ); m_textCtrlPosY->SetValue( msg ); + switch( aItem->m_Pos.m_Anchor ) { case RB_CORNER: // right bottom corner @@ -170,6 +171,7 @@ void PROPERTIES_FRAME::CopyPrmsFromItemToPanel( WORKSHEET_DATAITEM* aItem ) m_textCtrlEndX->SetValue( msg ); msg.Printf( wxT("%.3f"), aItem->m_End.m_Pos.y ); m_textCtrlEndY->SetValue( msg ); + switch( aItem->m_End.m_Anchor ) { case RB_CORNER: // right bottom corner @@ -242,33 +244,53 @@ void PROPERTIES_FRAME::CopyPrmsFromItemToPanel( WORKSHEET_DATAITEM* aItem ) if( aItem->GetType() == WORKSHEET_DATAITEM::WS_POLYPOLYGON ) { - m_staticTextInfoThickness->Show( false ); - WORKSHEET_DATAITEM_POLYPOLYGON* item = (WORKSHEET_DATAITEM_POLYPOLYGON*) aItem; // Rotation (poly and text) msg.Printf( wxT("%.3f"), item->m_Orient ); m_textCtrlRotation->SetValue( msg ); } - else if(aItem->GetType() == WORKSHEET_DATAITEM::WS_BITMAP ) + + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_BITMAP ) { - m_staticTextInfoThickness->Show( false ); - } - else - { - m_staticTextInfoThickness->Show( true ); + WORKSHEET_DATAITEM_BITMAP* item = (WORKSHEET_DATAITEM_BITMAP*) aItem; + // select definition in PPI + msg.Printf( wxT("%d"), item->GetPPI() ); + m_textCtrlBitmapPPI->SetValue( msg ); } - if( aItem->GetType() == WORKSHEET_DATAITEM::WS_SEGMENT || - aItem->GetType() == WORKSHEET_DATAITEM::WS_RECT || - aItem->GetType() == WORKSHEET_DATAITEM::WS_BITMAP ) + switch( aItem->GetType() ) { - m_SizerRotation->Show( false ); - m_SizerEndPosition->Show(true); - } - else - { - m_SizerRotation->Show( true ); - m_SizerEndPosition->Show(false); + case WORKSHEET_DATAITEM::WS_SEGMENT: + case WORKSHEET_DATAITEM::WS_RECT: + m_SizerBitmapPPI->Show( false ); + m_SizerLineThickness->Show( true ); + m_staticTextInfoThickness->Show( true ); + m_SizerRotation->Show( false ); + m_SizerEndPosition->Show(true); + break; + + case WORKSHEET_DATAITEM::WS_TEXT: + m_SizerBitmapPPI->Show( false ); + m_SizerLineThickness->Show( true ); + m_staticTextInfoThickness->Show( true ); + m_SizerRotation->Show( true ); + m_SizerEndPosition->Show(false); + break; + + case WORKSHEET_DATAITEM::WS_POLYPOLYGON: + m_SizerBitmapPPI->Show( false ); + m_SizerLineThickness->Show( true ); + m_staticTextInfoThickness->Show( false ); // No defaut value for thickness + m_SizerRotation->Show( true ); + m_SizerEndPosition->Show(false); + break; + + case WORKSHEET_DATAITEM::WS_BITMAP: + m_SizerBitmapPPI->Show( true ); + m_SizerLineThickness->Show( false ); + m_SizerRotation->Show( false ); + m_SizerEndPosition->Show(false); + break; } // Repeat parameters @@ -456,6 +478,16 @@ bool PROPERTIES_FRAME::CopyPrmsFromPanelToItem( WORKSHEET_DATAITEM* aItem ) item->m_Orient = dtmp; } + if( aItem->GetType() == WORKSHEET_DATAITEM::WS_BITMAP ) + { + WORKSHEET_DATAITEM_BITMAP* item = (WORKSHEET_DATAITEM_BITMAP*) aItem; + // Set definition in PPI + long value; + msg = m_textCtrlBitmapPPI->GetValue(); + if( msg.ToLong( &value ) ) + item->SetPPI( (int)value ); + } + return true; } diff --git a/pcbnew/pcbnew_config.cpp b/pcbnew/pcbnew_config.cpp index 8beacacd1e..a2f8d9d6b7 100644 --- a/pcbnew/pcbnew_config.cpp +++ b/pcbnew/pcbnew_config.cpp @@ -101,7 +101,7 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) wxString msg; msg.Printf( _( "Error occurred saving the global footprint library " "table:\n\n%s" ), ioe.errorText.GetData() ); - wxMessageBox( msg, _( "File Seave Error" ), wxOK | wxICON_ERROR ); + wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR ); } } @@ -120,7 +120,7 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event ) wxString msg; msg.Printf( _( "Error occurred saving project specific footprint library " "table:\n\n%s" ), ioe.errorText.GetData() ); - wxMessageBox( msg, _( "File Seave Error" ), wxOK | wxICON_ERROR ); + wxMessageBox( msg, _( "File Save Error" ), wxOK | wxICON_ERROR ); } } }