diff --git a/bitmap2component/bitmap2cmp_gui.cpp b/bitmap2component/bitmap2cmp_gui.cpp index d83a0fce8c..52f5c134b7 100644 --- a/bitmap2component/bitmap2cmp_gui.cpp +++ b/bitmap2component/bitmap2cmp_gui.cpp @@ -27,10 +27,6 @@ #include #include -#include -#include -#include - #include #include @@ -50,7 +46,10 @@ #define KEYWORD_BINARY_THRESHOLD wxT( "Threshold" ) #define KEYWORD_BW_NEGATIVE wxT( "Negative_choice" ) -extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFormat ); +#define DEFAULT_DPI 300 // Default resolution in Bit per inches + +extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, + int aFormat, int aDpi_X, int aDpi_Y ); /* Class BM2CMP_FRAME_BASE This is the main frame for this application @@ -64,11 +63,13 @@ private: wxBitmap m_Greyscale_Bitmap; wxImage m_NB_Image; wxBitmap m_BN_Bitmap; + wxSize m_imageDPI; // The initial image resolution. When unknown, + // set to DEFAULT_DPI x DEFAULT_DPI per Inch wxString m_BitmapFileName; wxString m_ConvertedFileName; - wxSize m_FrameSize; - wxPoint m_FramePos; - wxConfig * m_Config; + wxSize m_frameSize; + wxPoint m_framePos; + wxConfig* m_config; public: BM2CMP_FRAME(); @@ -109,27 +110,43 @@ private: void Binarize( double aThreshold ); // aThreshold = 0.0 (black level) to 1.0 (white level) void OnOptionsSelection( wxCommandEvent& event ); void OnThresholdChange( wxScrollEvent& event ); + void OnResolutionChange( wxCommandEvent& event ); + + // called when texts controls which handle the image resolution + // lose the focus, to ensure the rigyht vaules are displayed + // because the m_imageDPI are clipped to acceptable values, and + // the text displayed could be differ duringa text edition + // We are using ChangeValue here to avoid generating a wxEVT_TEXT event. + void UpdateDPITextValueX( wxMouseEvent& event ) + { + m_DPIValueX->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.x ) ); + } + void UpdateDPITextValueY( wxMouseEvent& event ) + { + m_DPIValueY->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.y ) ); + } + void NegateGreyscaleImage( ); void ExportFile( FILE* aOutfile, int aFormat ); + void updateImageInfo(); }; - BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL ) { int tmp; - m_Config = new wxConfig(); - m_Config->Read( KEYWORD_FRAME_POSX, & m_FramePos.x, -1 ); - m_Config->Read( KEYWORD_FRAME_POSY, & m_FramePos.y, -1 ); - m_Config->Read( KEYWORD_FRAME_SIZEX, & m_FrameSize.x, -1 ); - m_Config->Read( KEYWORD_FRAME_SIZEY, & m_FrameSize.y, -1 ); - m_Config->Read( KEYWORD_LAST_INPUT_FILE, &m_BitmapFileName ); - m_Config->Read( KEYWORD_LAST_OUTPUT_FILE, &m_ConvertedFileName ); - if( m_Config->Read( KEYWORD_BINARY_THRESHOLD, &tmp ) ) + m_config = new wxConfig(); + m_config->Read( KEYWORD_FRAME_POSX, & m_framePos.x, -1 ); + m_config->Read( KEYWORD_FRAME_POSY, & m_framePos.y, -1 ); + m_config->Read( KEYWORD_FRAME_SIZEX, & m_frameSize.x, -1 ); + m_config->Read( KEYWORD_FRAME_SIZEY, & m_frameSize.y, -1 ); + m_config->Read( KEYWORD_LAST_INPUT_FILE, &m_BitmapFileName ); + m_config->Read( KEYWORD_LAST_OUTPUT_FILE, &m_ConvertedFileName ); + if( m_config->Read( KEYWORD_BINARY_THRESHOLD, &tmp ) ) m_sliderThreshold->SetValue( tmp ); - if( m_Config->Read( KEYWORD_BW_NEGATIVE, &tmp ) ) + if( m_config->Read( KEYWORD_BW_NEGATIVE, &tmp ) ) m_rbOptions->SetSelection( tmp ? 1 : 0 ); - m_Config->Read( KEYWORD_LAST_FORMAT, &tmp ); + m_config->Read( KEYWORD_LAST_FORMAT, &tmp ); m_radioBoxFormat->SetSelection( tmp ); @@ -140,34 +157,36 @@ BM2CMP_FRAME::BM2CMP_FRAME() : BM2CMP_FRAME_BASE( NULL ) GetSizer()->SetSizeHints( this ); - SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); + SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y ); m_buttonExport->Enable( false ); - if ( m_FramePos == wxDefaultPosition ) + m_imageDPI.x = m_imageDPI.y = DEFAULT_DPI; // Default resolution in Bit per inches + + if ( m_framePos == wxDefaultPosition ) Centre(); } BM2CMP_FRAME::~BM2CMP_FRAME() { - if( ( m_Config == NULL ) || IsIconized() ) + if( ( m_config == NULL ) || IsIconized() ) return; - m_FrameSize = GetSize(); - m_FramePos = GetPosition(); + m_frameSize = GetSize(); + m_framePos = GetPosition(); - m_Config->Write( KEYWORD_FRAME_POSX, (long) m_FramePos.x ); - m_Config->Write( KEYWORD_FRAME_POSY, (long) m_FramePos.y ); - m_Config->Write( KEYWORD_FRAME_SIZEX, (long) m_FrameSize.x ); - m_Config->Write( KEYWORD_FRAME_SIZEY, (long) m_FrameSize.y ); - m_Config->Write( KEYWORD_LAST_INPUT_FILE, m_BitmapFileName ); - m_Config->Write( KEYWORD_LAST_OUTPUT_FILE, m_ConvertedFileName ); - m_Config->Write( KEYWORD_BINARY_THRESHOLD, m_sliderThreshold->GetValue() ); - m_Config->Write( KEYWORD_BW_NEGATIVE, m_rbOptions->GetSelection() ); - m_Config->Write( KEYWORD_LAST_FORMAT, m_radioBoxFormat->GetSelection() ); + m_config->Write( KEYWORD_FRAME_POSX, (long) m_framePos.x ); + m_config->Write( KEYWORD_FRAME_POSY, (long) m_framePos.y ); + m_config->Write( KEYWORD_FRAME_SIZEX, (long) m_frameSize.x ); + m_config->Write( KEYWORD_FRAME_SIZEY, (long) m_frameSize.y ); + m_config->Write( KEYWORD_LAST_INPUT_FILE, m_BitmapFileName ); + m_config->Write( KEYWORD_LAST_OUTPUT_FILE, m_ConvertedFileName ); + m_config->Write( KEYWORD_BINARY_THRESHOLD, m_sliderThreshold->GetValue() ); + m_config->Write( KEYWORD_BW_NEGATIVE, m_rbOptions->GetSelection() ); + m_config->Write( KEYWORD_LAST_FORMAT, m_radioBoxFormat->GetSelection() ); - delete m_Config; + delete m_config; /* This needed for OSX: avoids further OnDraw processing after this * destructor and before the native window is destroyed @@ -246,15 +265,31 @@ bool BM2CMP_FRAME::LoadFile( wxString& aFullFileName ) int h = m_Pict_Bitmap.GetHeight(); int w = m_Pict_Bitmap.GetWidth(); - int nb = m_Pict_Bitmap.GetDepth(); + // Determine image resolution in DPI (does not existing in all formats). + // the resolution can be given in bit per inches or bit per cm in file + m_imageDPI.x = m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONX ); + m_imageDPI.y = m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONY ); - wxString msg; - msg.Printf( wxT( "%d" ), w ); - m_SizeXValue->SetLabel(msg); - msg.Printf( wxT( "%d" ), h ); - m_SizeYValue->SetLabel(msg); - msg.Printf( wxT( "%d" ), nb ); - m_BPPValue->SetLabel(msg); + if( m_imageDPI.x > 1 && m_imageDPI.y > 1 ) + { + if( m_Pict_Image.GetOptionInt( wxIMAGE_OPTION_RESOLUTIONUNIT ) == wxIMAGE_RESOLUTION_CM ) + { + // When the initial resolution is given in bits per cm, + // experience shows adding 1.27 to the resolution converted in dpi + // before convert to int value reduce the conversion error + // but it is not perfect + m_imageDPI.x = m_imageDPI.x * 2.54 + 1.27; + m_imageDPI.y = m_imageDPI.y * 2.54 + 1.27; + } + } + else // fallback to the default value + m_imageDPI.x = m_imageDPI.y = DEFAULT_DPI; + + // Display image info: + // We are using ChangeValue here to avoid generating a wxEVT_TEXT event. + m_DPIValueX->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.x ) ); + m_DPIValueY->ChangeValue( wxString::Format( wxT( "%d" ), m_imageDPI.y ) ); + updateImageInfo(); m_InitialPicturePanel->SetVirtualSize( w, h ); m_GreyscalePicturePanel->SetVirtualSize( w, h ); @@ -272,6 +307,43 @@ bool BM2CMP_FRAME::LoadFile( wxString& aFullFileName ) return true; } +void BM2CMP_FRAME::updateImageInfo() +{ + // Note: the image resolution text controls are not modified + // here, to avoid a race between text change when entered by user and + // a text change if it is modifed here. + int h = m_Pict_Bitmap.GetHeight(); + int w = m_Pict_Bitmap.GetWidth(); + int nb = m_Pict_Bitmap.GetDepth(); + + m_SizeXValue->SetLabel( wxString::Format( wxT( "%d" ), w ) ); + m_SizeYValue->SetLabel( wxString::Format( wxT( "%d" ), h ) ); + m_BPPValue->SetLabel( wxString::Format( wxT( "%d" ), nb ) ); + + m_SizeXValue_mm->SetLabel( wxString::Format( wxT( "%.1f" ), + (double) w / m_imageDPI.x * 25.4 ) ); + m_SizeYValue_mm->SetLabel( wxString::Format( wxT( "%.1f" ), + (double) h / m_imageDPI.y * 25.4 ) ); +} + +void BM2CMP_FRAME::OnResolutionChange( wxCommandEvent& event ) +{ + long tmp; + + if( m_DPIValueX->GetValue().ToLong( &tmp ) ) + m_imageDPI.x = tmp; + + if( m_DPIValueY->GetValue().ToLong( &tmp ) ) + m_imageDPI.y = tmp; + + if( m_imageDPI.x < 32 ) + m_imageDPI.x = 32; + + if( m_imageDPI.y < 32 ) + m_imageDPI.y = 32; + + updateImageInfo(); +} void BM2CMP_FRAME::Binarize( double aThreshold ) { @@ -514,14 +586,14 @@ void BM2CMP_FRAME::ExportFile( FILE* aOutfile, int aFormat ) /* fill the bitmap with data */ for( int y = 0; y < h; y++ ) { - for( int x = 0; xAddGrowableCol( 1 ); + fgSizerInfo->AddGrowableCol( 2 ); fgSizerInfo->SetFlexibleDirection( wxBOTH ); fgSizerInfo->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextSizeX = new wxStaticText( m_panelRight, wxID_ANY, _("Size X:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSizeX->Wrap( -1 ); - fgSizerInfo->Add( m_staticTextSizeX, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextSize = new wxStaticText( m_panelRight, wxID_ANY, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSize->Wrap( -1 ); + fgSizerInfo->Add( m_staticTextSize, 0, wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_SizeXValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 ); m_SizeXValue->Wrap( -1 ); - fgSizerInfo->Add( m_SizeXValue, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_SizeXunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 ); - m_SizeXunits->Wrap( -1 ); - fgSizerInfo->Add( m_SizeXunits, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextSizeY = new wxStaticText( m_panelRight, wxID_ANY, _("Size Y:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSizeY->Wrap( -1 ); - fgSizerInfo->Add( m_staticTextSizeY, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizerInfo->Add( m_SizeXValue, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); m_SizeYValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 ); m_SizeYValue->Wrap( -1 ); - fgSizerInfo->Add( m_SizeYValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizerInfo->Add( m_SizeYValue, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - m_SizeYunits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 ); - m_SizeYunits->Wrap( -1 ); - fgSizerInfo->Add( m_SizeYunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_SizePixUnits = new wxStaticText( m_panelRight, wxID_ANY, _("pixels"), wxDefaultPosition, wxDefaultSize, 0 ); + m_SizePixUnits->Wrap( -1 ); + fgSizerInfo->Add( m_SizePixUnits, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + m_staticTextSize1 = new wxStaticText( m_panelRight, wxID_ANY, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSize1->Wrap( -1 ); + fgSizerInfo->Add( m_staticTextSize1, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT, 5 ); + + m_SizeXValue_mm = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 ); + m_SizeXValue_mm->Wrap( -1 ); + fgSizerInfo->Add( m_SizeXValue_mm, 0, wxBOTTOM|wxRIGHT, 5 ); + + m_SizeYValue_mm = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 ); + m_SizeYValue_mm->Wrap( -1 ); + fgSizerInfo->Add( m_SizeYValue_mm, 0, wxBOTTOM|wxRIGHT, 5 ); + + m_Size_mmxUnits = new wxStaticText( m_panelRight, wxID_ANY, _("mm"), wxDefaultPosition, wxDefaultSize, 0 ); + m_Size_mmxUnits->Wrap( -1 ); + fgSizerInfo->Add( m_Size_mmxUnits, 0, wxBOTTOM|wxRIGHT, 5 ); m_staticTextBPP = new wxStaticText( m_panelRight, wxID_ANY, _("BPP:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextBPP->Wrap( -1 ); @@ -75,17 +85,38 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS m_BPPValue = new wxStaticText( m_panelRight, wxID_ANY, _("0000"), wxDefaultPosition, wxDefaultSize, 0 ); m_BPPValue->Wrap( -1 ); - fgSizerInfo->Add( m_BPPValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizerInfo->Add( m_BPPValue, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); m_BPPunits = new wxStaticText( m_panelRight, wxID_ANY, _("bits"), wxDefaultPosition, wxDefaultSize, 0 ); m_BPPunits->Wrap( -1 ); fgSizerInfo->Add( m_BPPunits, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizerInfo->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextBPI = new wxStaticText( m_panelRight, wxID_ANY, _("Resolution:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBPI->Wrap( -1 ); + fgSizerInfo->Add( m_staticTextBPI, 0, wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_DPIValueX = new wxTextCtrl( m_panelRight, wxID_ANY, _("300"), wxDefaultPosition, wxDefaultSize, 0 ); + m_DPIValueX->SetMinSize( wxSize( 40,-1 ) ); + + fgSizerInfo->Add( m_DPIValueX, 0, wxBOTTOM|wxRIGHT, 5 ); + + m_DPIValueY = new wxTextCtrl( m_panelRight, wxID_ANY, _("300"), wxDefaultPosition, wxDefaultSize, 0 ); + m_DPIValueY->SetMinSize( wxSize( 40,-1 ) ); + + fgSizerInfo->Add( m_DPIValueY, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); + + m_DPI_Units = new wxStaticText( m_panelRight, wxID_ANY, _("DPI"), wxDefaultPosition, wxDefaultSize, 0 ); + m_DPI_Units->Wrap( -1 ); + fgSizerInfo->Add( m_DPI_Units, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); + + sbSizerInfo->Add( fgSizerInfo, 0, wxEXPAND|wxBOTTOM, 5 ); - brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + brightSizer->Add( sbSizerInfo, 0, wxEXPAND|wxALL, 5 ); m_buttonLoad = new wxButton( m_panelRight, wxID_ANY, _("Load Bitmap"), wxDefaultPosition, wxDefaultSize, 0 ); brightSizer->Add( m_buttonLoad, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); @@ -98,18 +129,18 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS wxString m_radioBoxFormatChoices[] = { _("Eeschema"), _("Pcbnew old fmt (.emp)"), _("Pcbnew kicad_mod"), _("Postscript"), _("Logo for title block") }; int m_radioBoxFormatNChoices = sizeof( m_radioBoxFormatChoices ) / sizeof( wxString ); m_radioBoxFormat = new wxRadioBox( m_panelRight, wxID_ANY, _("Format"), wxDefaultPosition, wxDefaultSize, m_radioBoxFormatNChoices, m_radioBoxFormatChoices, 1, wxRA_SPECIFY_COLS ); - m_radioBoxFormat->SetSelection( 4 ); - brightSizer->Add( m_radioBoxFormat, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_radioBoxFormat->SetSelection( 2 ); + brightSizer->Add( m_radioBoxFormat, 0, wxEXPAND|wxALL, 5 ); wxString m_rbOptionsChoices[] = { _("Normal"), _("Negative") }; int m_rbOptionsNChoices = sizeof( m_rbOptionsChoices ) / sizeof( wxString ); m_rbOptions = new wxRadioBox( m_panelRight, wxID_ANY, _("Options"), wxDefaultPosition, wxDefaultSize, m_rbOptionsNChoices, m_rbOptionsChoices, 1, wxRA_SPECIFY_COLS ); m_rbOptions->SetSelection( 0 ); - brightSizer->Add( m_rbOptions, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + brightSizer->Add( m_rbOptions, 0, wxEXPAND|wxALL, 5 ); m_ThresholdText = new wxStaticText( m_panelRight, wxID_ANY, _("Threshold Value:"), wxDefaultPosition, wxDefaultSize, 0 ); m_ThresholdText->Wrap( -1 ); - brightSizer->Add( m_ThresholdText, 0, wxRIGHT|wxLEFT, 5 ); + brightSizer->Add( m_ThresholdText, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_sliderThreshold = new wxSlider( m_panelRight, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL|wxSL_LABELS ); m_sliderThreshold->SetToolTip( _("Adjust the level to convert the greyscale picture to a black and white picture.") ); @@ -131,6 +162,10 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS m_InitialPicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); m_GreyscalePicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); m_BNPicturePanel->Connect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); + m_DPIValueX->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueX ), NULL, this ); + m_DPIValueX->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this ); + m_DPIValueY->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueY ), NULL, this ); + m_DPIValueY->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this ); m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this ); m_buttonExport->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this ); m_rbOptions->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this ); @@ -143,6 +178,10 @@ BM2CMP_FRAME_BASE::~BM2CMP_FRAME_BASE() m_InitialPicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); m_GreyscalePicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); m_BNPicturePanel->Disconnect( wxEVT_PAINT, wxPaintEventHandler( BM2CMP_FRAME_BASE::OnPaint ), NULL, this ); + m_DPIValueX->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueX ), NULL, this ); + m_DPIValueX->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this ); + m_DPIValueY->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( BM2CMP_FRAME_BASE::UpdatePPITextValueY ), NULL, this ); + m_DPIValueY->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnResolutionChange ), NULL, this ); m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnLoadFile ), NULL, this ); m_buttonExport->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnExport ), NULL, this ); m_rbOptions->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this ); diff --git a/bitmap2component/bitmap2cmp_gui_base.fbp b/bitmap2component/bitmap2cmp_gui_base.fbp index d848aa0d8c..c53486ff54 100644 --- a/bitmap2component/bitmap2cmp_gui_base.fbp +++ b/bitmap2component/bitmap2cmp_gui_base.fbp @@ -20,8 +20,10 @@ . 1 + 1 1 1 + UI 0 0 @@ -506,7 +508,7 @@ none 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + wxEXPAND|wxALL 0 wxID_ANY @@ -521,16 +523,16 @@ wxEXPAND|wxBOTTOM 0 - 3 + 4 wxBOTH - + 1,2 0 fgSizerInfo wxFLEX_GROWMODE_SPECIFIED none - 3 + 0 0 5 @@ -564,7 +566,7 @@ 0 0 wxID_ANY - Size X: + Size: 0 @@ -572,7 +574,7 @@ 0 1 - m_staticTextSizeX + m_staticTextSize 1 @@ -617,7 +619,7 @@ 5 - wxALL|wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 1 @@ -700,173 +702,7 @@ 5 - wxALL|wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - pixels - - 0 - - - 0 - - 1 - m_SizeXunits - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Size Y: - - 0 - - - 0 - - 1 - m_staticTextSizeY - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - 5 - wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 1 @@ -949,7 +785,7 @@ 5 - wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 1 @@ -987,7 +823,339 @@ 0 1 - m_SizeYunits + m_SizePixUnits + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Size: + + 0 + + + 0 + + 1 + m_staticTextSize1 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 0000 + + 0 + + + 0 + + 1 + m_SizeXValue_mm + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + 0000 + + 0 + + + 0 + + 1 + m_SizeYValue_mm + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + mm + + 0 + + + 0 + + 1 + m_Size_mmxUnits 1 @@ -1115,7 +1283,7 @@ 5 - wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT 0 1 @@ -1279,6 +1447,364 @@ + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Resolution: + + 0 + + + 0 + + 1 + m_staticTextBPI + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + 40,-1 + 1 + m_DPIValueX + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 300 + + + + + + + + + + UpdatePPITextValueX + + + + + + + + + + + + + + + + OnResolutionChange + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + 40,-1 + 1 + m_DPIValueY + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 300 + + + + + + + + + + UpdatePPITextValueY + + + + + + + + + + + + + + + + OnResolutionChange + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + DPI + + 0 + + + 0 + + 1 + m_DPI_Units + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1461,7 +1987,7 @@ 5 - wxBOTTOM|wxRIGHT|wxLEFT + wxEXPAND|wxALL 0 1 @@ -1509,7 +2035,7 @@ 1 Resizable - 4 + 2 1 wxRA_SPECIFY_COLS @@ -1551,7 +2077,7 @@ 5 - wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + wxEXPAND|wxALL 0 1 @@ -1641,7 +2167,7 @@ 5 - wxRIGHT|wxLEFT + wxTOP|wxRIGHT|wxLEFT 0 1 diff --git a/bitmap2component/bitmap2cmp_gui_base.h b/bitmap2component/bitmap2cmp_gui_base.h index 301a63398b..0963e547ca 100644 --- a/bitmap2component/bitmap2cmp_gui_base.h +++ b/bitmap2component/bitmap2cmp_gui_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Oct 8 2012) +// C++ code generated with wxFormBuilder (version Nov 6 2013) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -47,15 +48,21 @@ class BM2CMP_FRAME_BASE : public wxFrame wxScrolledWindow* m_GreyscalePicturePanel; wxScrolledWindow* m_BNPicturePanel; wxPanel* m_panelRight; - wxStaticText* m_staticTextSizeX; + wxStaticText* m_staticTextSize; wxStaticText* m_SizeXValue; - wxStaticText* m_SizeXunits; - wxStaticText* m_staticTextSizeY; wxStaticText* m_SizeYValue; - wxStaticText* m_SizeYunits; + wxStaticText* m_SizePixUnits; + wxStaticText* m_staticTextSize1; + wxStaticText* m_SizeXValue_mm; + wxStaticText* m_SizeYValue_mm; + wxStaticText* m_Size_mmxUnits; wxStaticText* m_staticTextBPP; wxStaticText* m_BPPValue; wxStaticText* m_BPPunits; + wxStaticText* m_staticTextBPI; + wxTextCtrl* m_DPIValueX; + wxTextCtrl* m_DPIValueY; + wxStaticText* m_DPI_Units; wxButton* m_buttonLoad; wxButton* m_buttonExport; wxRadioBox* m_radioBoxFormat; @@ -66,6 +73,9 @@ class BM2CMP_FRAME_BASE : public wxFrame // Virtual event handlers, overide them in your derived class virtual void OnPaint( wxPaintEvent& event ) { event.Skip(); } + virtual void UpdatePPITextValueX( wxMouseEvent& event ) { event.Skip(); } + virtual void OnResolutionChange( wxCommandEvent& event ) { event.Skip(); } + virtual void UpdatePPITextValueY( wxMouseEvent& event ) { event.Skip(); } virtual void OnLoadFile( wxCommandEvent& event ) { event.Skip(); } virtual void OnExport( wxCommandEvent& event ) { event.Skip(); } virtual void OnOptionsSelection( wxCommandEvent& event ) { event.Skip(); } diff --git a/bitmap2component/bitmap2component.cpp b/bitmap2component/bitmap2component.cpp index 245cfc3447..83014cfa93 100644 --- a/bitmap2component/bitmap2component.cpp +++ b/bitmap2component/bitmap2component.cpp @@ -138,12 +138,12 @@ BITMAPCONV_INFO::BITMAPCONV_INFO() } -int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFormat ) +int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, + int aFormat, int aDpi_X, int aDpi_Y ) { potrace_param_t* param; potrace_state_t* st; - // set tracing parameters, starting from defaults param = potrace_param_default(); if( !param ) @@ -171,8 +171,8 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFo { case 4: info.m_Format = KICAD_LOGO; - info.m_ScaleX = 1e3 * 25.4 / 300; // the conversion scale from PPI to micro - info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom + info.m_ScaleX = 1e3 * 25.4 / aDpi_X; // the conversion scale from PPI to micro + info.m_ScaleY = 1e3 * 25.4 / aDpi_Y; // Y axis is top to bottom info.CreateOutputFile(); break; @@ -186,22 +186,22 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, int aFo case 2: info.m_Format = EESCHEMA_FMT; - info.m_ScaleX = 1000.0 / 300; // the conversion scale from PPI to UI - info.m_ScaleY = -info.m_ScaleX; // Y axis is bottom to Top for components in libs + info.m_ScaleX = 1000.0 / aDpi_X; // the conversion scale from PPI to UI + info.m_ScaleY = -1000.0 / aDpi_Y; // Y axis is bottom to Top for components in libs info.CreateOutputFile(); break; case 1: info.m_Format = PCBNEW_KICAD_MOD; - info.m_ScaleX = 1e6 * 25.4 / 300; // the conversion scale from PPI to UI - info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit + info.m_ScaleX = 1e6 * 25.4 / aDpi_X; // the conversion scale from PPI to UI + info.m_ScaleY = 1e6 * 25.4 / aDpi_Y; // Y axis is top to bottom in modedit info.CreateOutputFile(); break; case 0: info.m_Format = PCBNEW_LEGACY_EMP; - info.m_ScaleX = 10000.0 / 300; // the conversion scale - info.m_ScaleY = info.m_ScaleX; // Y axis is top to bottom in modedit + info.m_ScaleX = 10000.0 / aDpi_X; // the conversion scale + info.m_ScaleY = 10000.0 / aDpi_Y; // Y axis is top to bottom in modedit info.CreateOutputFile(); break;