From 483a7b27476b9412bfdba1140b6bb90e90c51b30 Mon Sep 17 00:00:00 2001 From: Alexander Golubev Date: Wed, 5 Nov 2014 19:39:36 +0300 Subject: [PATCH 1/8] A small cmake enhancement: An ugly if-condition replaced with a CACHE'd cmake variable. --- CMakeLists.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0d4e73b0a..25d55f0d63 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,20 +269,15 @@ if( USE_WX_GRAPHICS_CONTEXT ) endif() -# Allow user to override the default settings for adding images to menu items. By default -# images in menu items are enabled on all platforms except OSX. This can be over ridden by -# defining -DUSE_IMAGES_IN_MENUS=ON/OFF to force the preferred behavior. -if( NOT DEFINED USE_IMAGES_IN_MENUS ) - if( NOT APPLE ) - set( USE_IMAGES_IN_MENUS ON ) - endif() +# By default images in menu items are enabled on all platforms except OSX. +if( NOT APPLE ) + set ( USE_IMAGES_IN_MENUS ON CACHE BOOL "Enable images in menus" ) else() - if( USE_IMAGES_IN_MENUS ) - set( USE_IMAGES_IN_MENUS ON ) - endif() + set ( USE_IMAGES_IN_MENUS OFF CACHE BOOL "Enable images in menus" ) endif() + # KIFACE_SUFFIX is the file extension used for top level program modules which # implement the KIFACE interface. A valid suffix starts with a period '.'. From 1188cd433bb76ffaa21a756e95299069c4a53d2e Mon Sep 17 00:00:00 2001 From: Blair Bonnett Date: Sun, 9 Nov 2014 14:24:37 -0500 Subject: [PATCH 2/8] Fix wxWidgets debug assertion for wxTextCtrl::IsSingleLine() in GTK. * Fix assertions in Eeschema when editing net labels, electronic rules check, and plotting. * Fix assertion when opening PCB calculator. * Fix assertions in Pcbnew when changing footprints in footprint properties dialog and adding or editing text. --- eeschema/dialogs/dialog_edit_label_base.cpp | 1 - eeschema/dialogs/dialog_edit_label_base.fbp | 2 +- eeschema/dialogs/dialog_erc_base.cpp | 1 - eeschema/dialogs/dialog_erc_base.fbp | 2 +- eeschema/dialogs/dialog_plot_schematic_base.cpp | 1 - eeschema/dialogs/dialog_plot_schematic_base.fbp | 2 +- pcb_calculator/dialogs/pcb_calculator_frame_base.cpp | 1 - pcb_calculator/dialogs/pcb_calculator_frame_base.fbp | 2 +- pcbnew/dialogs/dialog_exchange_modules_base.cpp | 1 - pcbnew/dialogs/dialog_exchange_modules_base.fbp | 2 +- pcbnew/dialogs/dialog_pcb_text_properties_base.cpp | 1 - pcbnew/dialogs/dialog_pcb_text_properties_base.fbp | 2 +- 12 files changed, 6 insertions(+), 12 deletions(-) diff --git a/eeschema/dialogs/dialog_edit_label_base.cpp b/eeschema/dialogs/dialog_edit_label_base.cpp index c46b70895b..545bf09211 100644 --- a/eeschema/dialogs/dialog_edit_label_base.cpp +++ b/eeschema/dialogs/dialog_edit_label_base.cpp @@ -37,7 +37,6 @@ DIALOG_LABEL_EDITOR_BASE::DIALOG_LABEL_EDITOR_BASE( wxWindow* parent, wxWindowID bSizeText->Add( m_textLabelSingleLine, 0, wxEXPAND|wxLEFT, 3 ); m_textLabelMultiLine = new wxTextCtrl( this, wxID_VALUEMULTI, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_PROCESS_ENTER ); - m_textLabelMultiLine->SetMaxLength( 0 ); m_textLabelMultiLine->SetMinSize( wxSize( -1,60 ) ); bSizeText->Add( m_textLabelMultiLine, 1, wxEXPAND|wxLEFT, 3 ); diff --git a/eeschema/dialogs/dialog_edit_label_base.fbp b/eeschema/dialogs/dialog_edit_label_base.fbp index 1d8f475b0e..8874a2f0cf 100644 --- a/eeschema/dialogs/dialog_edit_label_base.fbp +++ b/eeschema/dialogs/dialog_edit_label_base.fbp @@ -327,7 +327,7 @@ 0 - 0 + 0 -1,60 diff --git a/eeschema/dialogs/dialog_erc_base.cpp b/eeschema/dialogs/dialog_erc_base.cpp index a204d6e0c0..3f62099ffa 100644 --- a/eeschema/dialogs/dialog_erc_base.cpp +++ b/eeschema/dialogs/dialog_erc_base.cpp @@ -80,7 +80,6 @@ DIALOG_ERC_BASE::DIALOG_ERC_BASE( wxWindow* parent, wxWindowID id, const wxStrin bSizerMessages->Add( m_titleMessages, 0, wxRIGHT|wxLEFT, 5 ); m_MessagesList = new wxTextCtrl( m_PanelERC, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); - m_MessagesList->SetMaxLength( 0 ); bSizerMessages->Add( m_MessagesList, 1, wxEXPAND|wxLEFT, 5 ); diff --git a/eeschema/dialogs/dialog_erc_base.fbp b/eeschema/dialogs/dialog_erc_base.fbp index 554b236564..b5ed65fbe8 100644 --- a/eeschema/dialogs/dialog_erc_base.fbp +++ b/eeschema/dialogs/dialog_erc_base.fbp @@ -1032,7 +1032,7 @@ 0 - 0 + 0 -1,-1 diff --git a/eeschema/dialogs/dialog_plot_schematic_base.cpp b/eeschema/dialogs/dialog_plot_schematic_base.cpp index d1b5fdb3a0..38ae92464f 100644 --- a/eeschema/dialogs/dialog_plot_schematic_base.cpp +++ b/eeschema/dialogs/dialog_plot_schematic_base.cpp @@ -146,7 +146,6 @@ DIALOG_PLOT_SCHEMATIC_BASE::DIALOG_PLOT_SCHEMATIC_BASE( wxWindow* parent, wxWind bSizer4->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_MessagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); - m_MessagesBox->SetMaxLength( 0 ); m_MessagesBox->SetMinSize( wxSize( -1,80 ) ); bSizer4->Add( m_MessagesBox, 1, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT, 5 ); diff --git a/eeschema/dialogs/dialog_plot_schematic_base.fbp b/eeschema/dialogs/dialog_plot_schematic_base.fbp index 9648366f91..280cd023ae 100644 --- a/eeschema/dialogs/dialog_plot_schematic_base.fbp +++ b/eeschema/dialogs/dialog_plot_schematic_base.fbp @@ -1799,7 +1799,7 @@ 0 - 0 + 0 -1,80 diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp index c20b6b5080..ce70c49846 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp @@ -1140,7 +1140,6 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow bMiddleSizerAtt->Add( m_staticTextAttMsg, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_Attenuator_Messages = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); - m_Attenuator_Messages->SetMaxLength( 0 ); bMiddleSizerAtt->Add( m_Attenuator_Messages, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp index da5cd391c3..e66ca96c35 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp @@ -16799,7 +16799,7 @@ 0 - 0 + 0 diff --git a/pcbnew/dialogs/dialog_exchange_modules_base.cpp b/pcbnew/dialogs/dialog_exchange_modules_base.cpp index c8cbddaa0d..4fb582e87f 100644 --- a/pcbnew/dialogs/dialog_exchange_modules_base.cpp +++ b/pcbnew/dialogs/dialog_exchange_modules_base.cpp @@ -87,7 +87,6 @@ DIALOG_EXCHANGE_MODULE_BASE::DIALOG_EXCHANGE_MODULE_BASE( wxWindow* parent, wxWi bMainSizer->Add( m_staticTextMsg, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_WinMessages = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); - m_WinMessages->SetMaxLength( 0 ); m_WinMessages->SetMinSize( wxSize( 450,300 ) ); bMainSizer->Add( m_WinMessages, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); diff --git a/pcbnew/dialogs/dialog_exchange_modules_base.fbp b/pcbnew/dialogs/dialog_exchange_modules_base.fbp index 99ee9a7b1c..38acfe7e23 100644 --- a/pcbnew/dialogs/dialog_exchange_modules_base.fbp +++ b/pcbnew/dialogs/dialog_exchange_modules_base.fbp @@ -1219,7 +1219,7 @@ 0 - 0 + 0 450,300 diff --git a/pcbnew/dialogs/dialog_pcb_text_properties_base.cpp b/pcbnew/dialogs/dialog_pcb_text_properties_base.cpp index d04c149bcf..7473eb8191 100644 --- a/pcbnew/dialogs/dialog_pcb_text_properties_base.cpp +++ b/pcbnew/dialogs/dialog_pcb_text_properties_base.cpp @@ -26,7 +26,6 @@ DIALOG_PCB_TEXT_PROPERTIES_BASE::DIALOG_PCB_TEXT_PROPERTIES_BASE( wxWindow* pare bSizer9->Add( m_TextLabel, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_TextContentCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); - m_TextContentCtrl->SetMaxLength( 0 ); m_TextContentCtrl->SetToolTip( _("Enter the text placed on selected layer.") ); m_TextContentCtrl->SetMinSize( wxSize( 400,60 ) ); diff --git a/pcbnew/dialogs/dialog_pcb_text_properties_base.fbp b/pcbnew/dialogs/dialog_pcb_text_properties_base.fbp index 18ad8d4662..22b5ab4529 100644 --- a/pcbnew/dialogs/dialog_pcb_text_properties_base.fbp +++ b/pcbnew/dialogs/dialog_pcb_text_properties_base.fbp @@ -218,7 +218,7 @@ 0 - 0 + 0 400,60 From 9e6ed2b75fdf3d4cc04c619be48633f085b5c09e Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 12 Nov 2014 11:32:02 +0100 Subject: [PATCH 3/8] Eeschema plot: fix Bug #1391538 (eeschema PS/PDF export, objects have wrong Z-order ) --- eeschema/class_libentry.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index fc1954c97e..f55b74c21a 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -413,9 +413,11 @@ void LIB_PART::Plot( PLOTTER* aPlotter, int aUnit, int aConvert, aPlotter->SetColor( GetLayerColor( LAYER_DEVICE ) ); bool fill = aPlotter->GetColorMode(); + // draw background for filled items using background option + // Solid lines will be drawn after the background BOOST_FOREACH( LIB_ITEM& item, drawings ) { - // Lib Fields not are plotted here, because this plot function + // Lib Fields are not plotted here, because this plot function // is used to plot schematic items, which have they own fields if( item.Type() == LIB_FIELD_T ) continue; @@ -426,7 +428,25 @@ void LIB_PART::Plot( PLOTTER* aPlotter, int aUnit, int aConvert, if( aConvert && item.m_Convert && ( item.m_Convert != aConvert ) ) continue; - item.Plot( aPlotter, aOffset, fill, aTransform ); + if( item.m_Fill == FILLED_WITH_BG_BODYCOLOR ) + item.Plot( aPlotter, aOffset, fill, aTransform ); + } + + // Not filled items and filled shapes are now plotted + // (plot only items which are not already plotted) + BOOST_FOREACH( LIB_ITEM& item, drawings ) + { + if( item.Type() == LIB_FIELD_T ) + continue; + + if( aUnit && item.m_Unit && ( item.m_Unit != aUnit ) ) + continue; + + if( aConvert && item.m_Convert && ( item.m_Convert != aConvert ) ) + continue; + + if( item.m_Fill != FILLED_WITH_BG_BODYCOLOR ) + item.Plot( aPlotter, aOffset, fill, aTransform ); } } From 9524ad1f177a04b1f45271638c2cdb87c4bd9f15 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Nov 2014 11:46:40 +0100 Subject: [PATCH 4/8] Cvpcb: fix bug Bug #1386933 (Horizontal scrollbars not appearing in CvPcb) --- cvpcb/class_components_listbox.cpp | 8 +++-- cvpcb/class_footprints_listbox.cpp | 19 +++--------- cvpcb/class_library_listbox.cpp | 18 +++-------- cvpcb/cvframe.cpp | 16 +++------- cvpcb/cvstruct.h | 16 +++++++++- cvpcb/listboxes.cpp | 49 ++++++++++++++++++++++++------ 6 files changed, 75 insertions(+), 51 deletions(-) diff --git a/cvpcb/class_components_listbox.cpp b/cvpcb/class_components_listbox.cpp index 3b79ad8a6c..3a46ebab37 100644 --- a/cvpcb/class_components_listbox.cpp +++ b/cvpcb/class_components_listbox.cpp @@ -47,7 +47,6 @@ COMPONENTS_LISTBOX::~COMPONENTS_LISTBOX() BEGIN_EVENT_TABLE( COMPONENTS_LISTBOX, ITEMS_LISTBOX_BASE ) - EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) EVT_CHAR( COMPONENTS_LISTBOX::OnChar ) EVT_LIST_ITEM_SELECTED( ID_CVPCB_COMPONENT_LIST, COMPONENTS_LISTBOX::OnSelectComponent ) END_EVENT_TABLE() @@ -72,14 +71,19 @@ void COMPONENTS_LISTBOX::SetString( unsigned linecount, const wxString& text ) linecount = m_ComponentList.Count() - 1; if( m_ComponentList.Count() > 0 ) + { m_ComponentList[linecount] = text; + UpdateWidth( linecount ); + } } void COMPONENTS_LISTBOX::AppendLine( const wxString& text ) { m_ComponentList.Add( text ); - SetItemCount( m_ComponentList.Count() ); + int lines = m_ComponentList.Count(); + SetItemCount( lines ); + UpdateWidth( lines - 1 ); } diff --git a/cvpcb/class_footprints_listbox.cpp b/cvpcb/class_footprints_listbox.cpp index 1ba1669a3a..f2ef7b1008 100644 --- a/cvpcb/class_footprints_listbox.cpp +++ b/cvpcb/class_footprints_listbox.cpp @@ -67,6 +67,7 @@ void FOOTPRINTS_LISTBOX::SetString( unsigned linecount, const wxString& text ) linecount = count - 1; m_footprintList[linecount] = text; } + UpdateWidth( linecount ); } @@ -90,7 +91,9 @@ wxString FOOTPRINTS_LISTBOX::GetSelectedFootprint() void FOOTPRINTS_LISTBOX::AppendLine( const wxString& text ) { m_footprintList.Add( text ); - SetItemCount( m_footprintList.Count() ); + int lines = m_footprintList.Count(); + SetItemCount( lines ); + UpdateWidth( lines - 1 ); } @@ -179,24 +182,12 @@ void FOOTPRINTS_LISTBOX::SetFootprints( FOOTPRINT_LIST& aList, const wxString& a SetItemCount( m_footprintList.GetCount() ); SetSelection( selection, true ); RefreshItems( 0L, m_footprintList.GetCount()-1 ); - -#if defined (__WXGTK__ ) //&& wxMINOR_VERSION == 8 - // @bug On GTK and wxWidgets 2.8.x, this will assert in debug builds because the - - // column parameter is -1. This was the only way to prevent GTK3 from - // ellipsizing long strings down to a few characters. It still doesn't set - // the scroll bars correctly (too short) but it's better than any of the - // other alternatives. If someone knows how to fix this, please do. - SetColumnWidth( -1, wxLIST_AUTOSIZE ); -#else - SetColumnWidth( 0, wxLIST_AUTOSIZE ); -#endif + UpdateWidth(); } } BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE ) - EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar ) EVT_LIST_ITEM_SELECTED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftClick ) EVT_LIST_ITEM_ACTIVATED( ID_CVPCB_FOOTPRINT_LIST, FOOTPRINTS_LISTBOX::OnLeftDClick ) diff --git a/cvpcb/class_library_listbox.cpp b/cvpcb/class_library_listbox.cpp index 366c208478..259c2b15b1 100644 --- a/cvpcb/class_library_listbox.cpp +++ b/cvpcb/class_library_listbox.cpp @@ -66,6 +66,7 @@ void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text ) if( linecount >= count ) linecount = count - 1; m_libraryList[linecount] = text; + UpdateWidth( linecount ); } } @@ -87,7 +88,9 @@ wxString LIBRARY_LISTBOX::GetSelectedLibrary() void LIBRARY_LISTBOX::AppendLine( const wxString& text ) { m_libraryList.Add( text ); - SetItemCount( m_libraryList.Count() ); + int lines = m_libraryList.Count(); + SetItemCount( lines ); + UpdateWidth( lines - 1 ); } @@ -129,23 +132,12 @@ void LIBRARY_LISTBOX::SetLibraryList( const wxArrayString& aList ) if( m_libraryList.Count() ) { RefreshItems( 0L, m_libraryList.Count()-1 ); - -#if defined (__WXGTK__ ) && wxMINOR_VERSION == 8 - // @bug On GTK and wxWidgets 2.8.x, this will assert in debug builds because the - // column parameter is -1. This was the only way to prevent GTK3 from - // ellipsizing long strings down to a few characters. It still doesn't set - // the scroll bars correctly (too short) but it's better than any of the - // other alternatives. If someone knows how to fix this, please do. - SetColumnWidth( -1, wxLIST_AUTOSIZE ); -#else - SetColumnWidth( 0, wxLIST_AUTOSIZE ); -#endif + UpdateWidth(); } } BEGIN_EVENT_TABLE( LIBRARY_LISTBOX, ITEMS_LISTBOX_BASE ) - EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) EVT_CHAR( LIBRARY_LISTBOX::OnChar ) EVT_LIST_ITEM_SELECTED( ID_CVPCB_LIBRARY_LIST, LIBRARY_LISTBOX::OnSelectLibrary ) END_EVENT_TABLE() diff --git a/cvpcb/cvframe.cpp b/cvpcb/cvframe.cpp index 2c8e13c17d..3fde5b30ac 100644 --- a/cvpcb/cvframe.cpp +++ b/cvpcb/cvframe.cpp @@ -445,6 +445,10 @@ bool CVPCB_MAINFRAME::OpenProjectFiles( const std::vector& aFileSet, i UpdateTitle(); + // Resize the components list box. This is needed in case the + // contents have shrunk compared to the previous netlist. + m_compListBox->UpdateWidth(); + // OSX need it since some objects are "rebuild" just make aware AUI // Fixes #1258081 m_auimgr.Update(); @@ -949,17 +953,7 @@ void CVPCB_MAINFRAME::BuildCmpListBox() m_compListBox->SetItemCount( m_compListBox->m_ComponentList.Count() ); m_compListBox->SetSelection( 0, true ); m_compListBox->RefreshItems( 0L, m_compListBox->m_ComponentList.Count()-1 ); - -#if defined (__WXGTK__ ) - // @bug On GTK and wxWidgets 2.8.x, this will assert in debug builds because the - // column parameter is -1. This was the only way to prevent GTK3 from - // ellipsizing long strings down to a few characters. It still doesn't set - // the scroll bars correctly (too short) but it's better than any of the - // other alternatives. If someone knows how to fix this, please do. - m_compListBox->SetColumnWidth( -1, wxLIST_AUTOSIZE ); -#else - m_compListBox->SetColumnWidth( 0, wxLIST_AUTOSIZE ); -#endif + m_compListBox->UpdateWidth(); } } diff --git a/cvpcb/cvstruct.h b/cvpcb/cvstruct.h index fcf9cf419d..7623658ac8 100644 --- a/cvpcb/cvstruct.h +++ b/cvpcb/cvstruct.h @@ -50,9 +50,23 @@ public: ~ITEMS_LISTBOX_BASE(); int GetSelection(); - void OnSize( wxSizeEvent& event ); virtual CVPCB_MAINFRAME* GetParent() const; + + /* Function UpdateWidth + * + * Update the width of the column based on its contents. + * + * @param aLine is the line to calculate the width from. If positive, the + * width will only be increased if needed. If negative, we start from + * scratch and all lines are considered, i.e., the column may be shrunk. + */ + void UpdateWidth( int aLine = -1 ); + +private: + void UpdateLineWidth( unsigned aLine ); + + int columnWidth; }; diff --git a/cvpcb/listboxes.cpp b/cvpcb/listboxes.cpp index bc7f364658..da2d6cf938 100644 --- a/cvpcb/listboxes.cpp +++ b/cvpcb/listboxes.cpp @@ -44,10 +44,9 @@ ITEMS_LISTBOX_BASE::ITEMS_LISTBOX_BASE( CVPCB_MAINFRAME* aParent, wxWindowID aId, const wxPoint& aLocation, const wxSize& aSize, long aStyle) : - wxListView( aParent, aId, aLocation, aSize, LISTB_STYLE | aStyle ) + wxListView( aParent, aId, aLocation, aSize, LISTB_STYLE | aStyle ), columnWidth(0) { InsertColumn( 0, wxEmptyString ); - SetColumnWidth( 0, wxLIST_AUTOSIZE ); } @@ -56,17 +55,47 @@ ITEMS_LISTBOX_BASE::~ITEMS_LISTBOX_BASE() } -/* - * Adjust the column width to the entire available window width - */ -void ITEMS_LISTBOX_BASE::OnSize( wxSizeEvent& event ) +void ITEMS_LISTBOX_BASE::UpdateWidth( int aLine ) { - wxSize size = GetClientSize(); - int width = 0; + // Less than zero: recalculate width of all items. + if( aLine < 0 ) + { + columnWidth = 0; + for( int ii = 0; ii < GetItemCount(); ii++ ) + { + UpdateLineWidth( (unsigned)ii ); + } + } - SetColumnWidth( 0, std::max( width, size.x ) ); + // Zero or above: update from a single line. + else + { + if( aLine < GetItemCount() ) + UpdateLineWidth( (unsigned)aLine ); + } +} - event.Skip(); + +/* + * Calculate the width of the given line, and increase the column width + * if needed. This is effectively the wxListCtrl code for autosizing. + * NB. it relies on the caller checking the given line number is valid. + */ +void ITEMS_LISTBOX_BASE::UpdateLineWidth( unsigned aLine ) +{ + wxClientDC dc( this ); + wxCoord w; + int newWidth = 10; // Value of AUTOSIZE_COL_MARGIN from wxWidgets source. + + dc.SetFont( GetFont() ); + dc.GetTextExtent( GetItemText( aLine, 0 ) + " ", &w, NULL ); + newWidth += w; + + if( newWidth > columnWidth ) + { + columnWidth = newWidth; + SetColumnWidth( 0, columnWidth ); + } } From b411b240f2d287ccf7d91b1e1417391389f2970d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Nov 2014 17:59:12 +0100 Subject: [PATCH 5/8] bitmap2component: Add a layer selection to export a logo for Pcbnew from a Cirilo Bernardo's patch. Apply patch from Cirilo Bernardo with some minor changes: mainly allows also the solder mask layer and keep ref and value fields on the silk layer. --- bitmap2component/bitmap2cmp_gui.cpp | 37 ++++- bitmap2component/bitmap2cmp_gui_base.cpp | 28 ++-- bitmap2component/bitmap2cmp_gui_base.fbp | 164 ++++++++++++++++++----- bitmap2component/bitmap2cmp_gui_base.h | 8 +- bitmap2component/bitmap2component.cpp | 68 +++++++--- bitmap2component/bitmap2component.h | 9 ++ 6 files changed, 247 insertions(+), 67 deletions(-) diff --git a/bitmap2component/bitmap2cmp_gui.cpp b/bitmap2component/bitmap2cmp_gui.cpp index e0de783ad8..0a1a29c16c 100644 --- a/bitmap2component/bitmap2cmp_gui.cpp +++ b/bitmap2component/bitmap2cmp_gui.cpp @@ -50,13 +50,15 @@ #define KEYWORD_LAST_INPUT_FILE wxT( "Last_input" ) #define KEYWORD_LAST_OUTPUT_FILE wxT( "Last_output" ) #define KEYWORD_LAST_FORMAT wxT( "Last_format" ) +#define KEYWORD_LAST_MODLAYER wxT( "Last_modlayer" ) #define KEYWORD_BINARY_THRESHOLD wxT( "Threshold" ) #define KEYWORD_BW_NEGATIVE wxT( "Negative_choice" ) #define DEFAULT_DPI 300 // Default resolution in Bit per inches extern int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, - OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y ); + OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y, + BMP2CMP_MOD_LAYER aModLayer ); /** * Class BM2CMP_FRAME_BASE @@ -138,6 +140,7 @@ private: void NegateGreyscaleImage( ); void ExportFile( FILE* aOutfile, OUTPUT_FMT_ID aFormat ); void updateImageInfo(); + void OnFormatChange( wxCommandEvent& event ); }; @@ -169,6 +172,19 @@ BM2CMP_FRAME::BM2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_radioBoxFormat->SetSelection( tmp ); } + if( tmp == PCBNEW_KICAD_MOD ) + m_radio_PCBLayer->Enable( true ); + else + m_radio_PCBLayer->Enable( false ); + + if( m_config->Read( KEYWORD_LAST_MODLAYER, &tmp ) ) + { + if( (unsigned) tmp > MOD_LYR_FINAL ) // Out of range + m_radio_PCBLayer->SetSelection( MOD_LYR_FSILKS ); + else + m_radio_PCBLayer->SetSelection( tmp ); + } + // Give an icon wxIcon icon; icon.CopyFromBitmap( KiBitmap( icon_bitmap2component_xpm ) ); @@ -204,6 +220,7 @@ BM2CMP_FRAME::~BM2CMP_FRAME() 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_LAST_MODLAYER, m_radio_PCBLayer->GetSelection() ); delete m_config; @@ -628,7 +645,14 @@ void BM2CMP_FRAME::ExportFile( FILE* aOutfile, OUTPUT_FMT_ID aFormat ) } } - bitmap2component( potrace_bitmap, aOutfile, aFormat, m_imageDPI.x, m_imageDPI.y ); + // choices of m_radio_PCBLayer are expected to be in same order as + // BMP2CMP_MOD_LAYER. See bitmap2component.h + BMP2CMP_MOD_LAYER modLayer = MOD_LYR_FSILKS; + + if( aFormat == PCBNEW_KICAD_MOD ) + modLayer = (BMP2CMP_MOD_LAYER) m_radio_PCBLayer->GetSelection(); + + bitmap2component( potrace_bitmap, aOutfile, aFormat, m_imageDPI.x, m_imageDPI.y, modLayer ); } @@ -711,3 +735,12 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits ) return start_common( aCtlBits ); } +void BM2CMP_FRAME::OnFormatChange( wxCommandEvent& event ) +{ + if( m_radioBoxFormat->GetSelection() == PCBNEW_KICAD_MOD ) + m_radio_PCBLayer->Enable( true ); + else + m_radio_PCBLayer->Enable( false ); + + event.Skip(); +} diff --git a/bitmap2component/bitmap2cmp_gui_base.cpp b/bitmap2component/bitmap2cmp_gui_base.cpp index e309839e92..be48e480d3 100644 --- a/bitmap2component/bitmap2cmp_gui_base.cpp +++ b/bitmap2component/bitmap2cmp_gui_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -16,22 +16,22 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS wxBoxSizer* bMainSizer; bMainSizer = new wxBoxSizer( wxHORIZONTAL ); - m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_InitialPicturePanel = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_Notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_InitialPicturePanel = new wxScrolledWindow( m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); m_InitialPicturePanel->SetScrollRate( 5, 5 ); m_InitialPicturePanel->SetMinSize( wxSize( 400,300 ) ); - m_notebook1->AddPage( m_InitialPicturePanel, _("Original Picture"), true ); - m_GreyscalePicturePanel = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_Notebook->AddPage( m_InitialPicturePanel, _("Original Picture"), true ); + m_GreyscalePicturePanel = new wxScrolledWindow( m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); m_GreyscalePicturePanel->SetScrollRate( 5, 5 ); m_GreyscalePicturePanel->SetMinSize( wxSize( 400,300 ) ); - m_notebook1->AddPage( m_GreyscalePicturePanel, _("Greyscale Picture"), false ); - m_BNPicturePanel = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_Notebook->AddPage( m_GreyscalePicturePanel, _("Greyscale Picture"), false ); + m_BNPicturePanel = new wxScrolledWindow( m_Notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); m_BNPicturePanel->SetScrollRate( 5, 5 ); - m_notebook1->AddPage( m_BNPicturePanel, _("Black&&White Picture"), false ); + m_Notebook->AddPage( m_BNPicturePanel, _("Black&&White Picture"), false ); - bMainSizer->Add( m_notebook1, 1, wxEXPAND, 5 ); + bMainSizer->Add( m_Notebook, 1, wxEXPAND, 5 ); m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); wxBoxSizer* brightSizer; @@ -147,6 +147,14 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS brightSizer->Add( m_sliderThreshold, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + wxString m_radio_PCBLayerChoices[] = { _("Front silk screen"), _("Front solder mask"), _("User layer Eco1"), _("User Layer Eco2") }; + int m_radio_PCBLayerNChoices = sizeof( m_radio_PCBLayerChoices ) / sizeof( wxString ); + m_radio_PCBLayer = new wxRadioBox( m_panelRight, wxID_ANY, _("Board Layer for Outline:"), wxDefaultPosition, wxDefaultSize, m_radio_PCBLayerNChoices, m_radio_PCBLayerChoices, 1, wxRA_SPECIFY_COLS ); + m_radio_PCBLayer->SetSelection( 0 ); + m_radio_PCBLayer->SetToolTip( _("Choose the board layer to place the outline.\nThe 2 invisible fields reference and value and always placed on the silk screen layer.") ); + + brightSizer->Add( m_radio_PCBLayer, 0, wxALL|wxEXPAND, 5 ); + m_panelRight->SetSizer( brightSizer ); m_panelRight->Layout(); @@ -168,6 +176,7 @@ BM2CMP_FRAME_BASE::BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id, const wxS 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_radioBoxFormat->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnFormatChange ), NULL, this ); m_rbOptions->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this ); m_sliderThreshold->Connect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( BM2CMP_FRAME_BASE::OnThresholdChange ), NULL, this ); } @@ -184,6 +193,7 @@ BM2CMP_FRAME_BASE::~BM2CMP_FRAME_BASE() 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_radioBoxFormat->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnFormatChange ), NULL, this ); m_rbOptions->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( BM2CMP_FRAME_BASE::OnOptionsSelection ), NULL, this ); m_sliderThreshold->Disconnect( wxEVT_SCROLL_THUMBTRACK, wxScrollEventHandler( BM2CMP_FRAME_BASE::OnThresholdChange ), NULL, this ); diff --git a/bitmap2component/bitmap2cmp_gui_base.fbp b/bitmap2component/bitmap2cmp_gui_base.fbp index d0674b2210..4c0193b481 100644 --- a/bitmap2component/bitmap2cmp_gui_base.fbp +++ b/bitmap2component/bitmap2cmp_gui_base.fbp @@ -1,6 +1,6 @@ - + C++ @@ -44,7 +44,7 @@ BM2CMP_FRAME_BASE - 527,470 + 733,634 wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER KIWAY_PLAYER; kiway_player.h Bitmap to Component Converter @@ -133,7 +133,7 @@ 0 1 - m_notebook1 + m_Notebook 1 @@ -522,7 +522,7 @@ 5 wxEXPAND|wxBOTTOM 0 - + 4 wxBOTH 1,2 @@ -534,11 +534,11 @@ none 0 0 - + 5 wxALIGN_RIGHT|wxALL|wxALIGN_CENTER_VERTICAL 0 - + 1 1 1 @@ -617,11 +617,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -700,11 +700,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -783,11 +783,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -866,11 +866,11 @@ - + 5 wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT 0 - + 1 1 1 @@ -949,11 +949,11 @@ - + 5 wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1032,11 +1032,11 @@ - + 5 wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1115,11 +1115,11 @@ - + 5 wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1198,11 +1198,11 @@ - + 5 wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL 0 - + 1 1 1 @@ -1281,11 +1281,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1364,11 +1364,11 @@ - + 5 wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL 0 - + 1 1 1 @@ -1447,21 +1447,21 @@ - + 5 wxEXPAND 1 - + 0 protected 0 - + 5 wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL 0 - + 1 1 1 @@ -1540,11 +1540,11 @@ - + 5 wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1631,11 +1631,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -1722,11 +1722,11 @@ - + 5 wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT 0 - + 1 1 1 @@ -2066,7 +2066,7 @@ - + OnFormatChange @@ -2356,6 +2356,96 @@ + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + "Front silk screen" "Front solder mask" "User layer Eco1" "User Layer Eco2" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Board Layer for Outline: + 1 + + 0 + + + 0 + + 1 + m_radio_PCBLayer + 1 + + + protected + 1 + + Resizable + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + Choose the board layer to place the outline. The 2 invisible fields reference and value and always placed on the silk screen layer. + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bitmap2component/bitmap2cmp_gui_base.h b/bitmap2component/bitmap2cmp_gui_base.h index 7d4270392e..0c7ddff659 100644 --- a/bitmap2component/bitmap2cmp_gui_base.h +++ b/bitmap2component/bitmap2cmp_gui_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Nov 6 2013) +// C++ code generated with wxFormBuilder (version Jun 5 2014) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -46,7 +46,7 @@ class BM2CMP_FRAME_BASE : public KIWAY_PLAYER private: protected: - wxNotebook* m_notebook1; + wxNotebook* m_Notebook; wxScrolledWindow* m_InitialPicturePanel; wxScrolledWindow* m_GreyscalePicturePanel; wxScrolledWindow* m_BNPicturePanel; @@ -72,6 +72,7 @@ class BM2CMP_FRAME_BASE : public KIWAY_PLAYER wxRadioBox* m_rbOptions; wxStaticText* m_ThresholdText; wxSlider* m_sliderThreshold; + wxRadioBox* m_radio_PCBLayer; wxStatusBar* m_statusBar; // Virtual event handlers, overide them in your derived class @@ -81,13 +82,14 @@ class BM2CMP_FRAME_BASE : public KIWAY_PLAYER virtual void UpdatePPITextValueY( wxMouseEvent& event ) { event.Skip(); } virtual void OnLoadFile( wxCommandEvent& event ) { event.Skip(); } virtual void OnExport( wxCommandEvent& event ) { event.Skip(); } + virtual void OnFormatChange( wxCommandEvent& event ) { event.Skip(); } virtual void OnOptionsSelection( wxCommandEvent& event ) { event.Skip(); } virtual void OnThresholdChange( wxScrollEvent& event ) { event.Skip(); } public: - BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Bitmap to Component Converter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 527,470 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); + BM2CMP_FRAME_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Bitmap to Component Converter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 733,634 ), long style = wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER|wxTAB_TRAVERSAL ); ~BM2CMP_FRAME_BASE(); diff --git a/bitmap2component/bitmap2component.cpp b/bitmap2component/bitmap2component.cpp index ddf83fc268..6e3427ebff 100644 --- a/bitmap2component/bitmap2component.cpp +++ b/bitmap2component/bitmap2component.cpp @@ -86,7 +86,7 @@ public: * Creates the output file specified by m_Outfile, * depending on file format given by m_Format */ - void CreateOutputFile(); + void CreateOutputFile( BMP2CMP_MOD_LAYER aModLayer = (BMP2CMP_MOD_LAYER) 0 ); private: @@ -94,7 +94,7 @@ private: * Function OuputFileHeader * write to file the header depending on file format */ - void OuputFileHeader(); + void OuputFileHeader( const char * aBrdLayerName ); /** * Function OuputFileEnd @@ -103,12 +103,18 @@ private: void OuputFileEnd(); + /** + * @return the board layer name depending on the board layer selected + * @param aChoice = the choice (MOD_LYR_FSILKS to MOD_LYR_FINAL) + */ + const char * getBrdLayerName( BMP2CMP_MOD_LAYER aChoice ); + /** * Function OuputOnePolygon * write one polygon to output file. * Polygon coordinates are expected scaled by the polugon extraction function */ - void OuputOnePolygon( KPolygon & aPolygon ); + void OuputOnePolygon( KPolygon & aPolygon, const char * aBrdLayerName ); }; @@ -133,7 +139,8 @@ BITMAPCONV_INFO::BITMAPCONV_INFO() int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, - OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y ) + OUTPUT_FMT_ID aFormat, int aDpi_X, int aDpi_Y, + BMP2CMP_MOD_LAYER aModLayer ) { potrace_param_t* param; potrace_state_t* st; @@ -189,7 +196,7 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, info.m_Format = PCBNEW_KICAD_MOD; 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(); + info.CreateOutputFile( aModLayer ); break; default: @@ -204,8 +211,33 @@ int bitmap2component( potrace_bitmap_t* aPotrace_bitmap, FILE* aOutfile, return 0; } +const char* BITMAPCONV_INFO::getBrdLayerName( BMP2CMP_MOD_LAYER aChoice ) +{ + const char * layerName = "F.SilkS"; -void BITMAPCONV_INFO::OuputFileHeader() + switch( aChoice ) + { + case MOD_LYR_FSOLDERMASK: + layerName = "F.Mask"; + break; + + case MOD_LYR_ECO1: + layerName = "Eco1.User"; + break; + + case MOD_LYR_ECO2: + layerName = "Eco2.User"; + break; + + case MOD_LYR_FSILKS: + default: // case MOD_LYR_FSILKS only unless there is a bug + break; + } + + return layerName; +} + +void BITMAPCONV_INFO::OuputFileHeader( const char * aBrdLayerName ) { int Ypos = (int) ( m_PixmapHeight / 2 * m_ScaleY ); int fieldSize; // fields text size = 60 mils @@ -225,11 +257,10 @@ void BITMAPCONV_INFO::OuputFileHeader() // fields text thickness = 1.5 / 5 = 0.3mm fprintf( m_Outfile, "(module %s (layer F.Cu)\n (at 0 0)\n", m_CmpName ); - fprintf( m_Outfile, " (fp_text reference \"G***\" (at 0 0) (layer F.SilkS) hide\n" - " (effects (font (thickness 0.3)))\n )\n" ); - fprintf( m_Outfile, " (fp_text value \"%s\" (at 0.75 0) (layer F.SilkS) hide\n" - " (effects (font (thickness 0.3)))\n )\n", - m_CmpName ); + fprintf( m_Outfile, " (fp_text reference \"G***\" (at 0 0) (layer %s) hide\n" + " (effects (font (thickness 0.3)))\n )\n", aBrdLayerName ); + fprintf( m_Outfile, " (fp_text value \"%s\" (at 0.75 0) (layer %s) hide\n" + " (effects (font (thickness 0.3)))\n )\n", m_CmpName, aBrdLayerName ); break; case KICAD_LOGO: @@ -283,7 +314,7 @@ void BITMAPCONV_INFO::OuputFileEnd() * write one polygon to output file. * Polygon coordinates are expected scaled by the polygon extraction function */ -void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon ) +void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon, const char * aBrdLayerName ) { unsigned ii, jj; KPolyPoint currpoint; @@ -338,7 +369,9 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon ) // Close polygon fprintf( m_Outfile, " (xy %f %f) )", (startpoint.x() - offsetX) / 1e6, (startpoint.y() - offsetY) / 1e6 ); - fprintf( m_Outfile, "(layer F.SilkS) (width %f)\n )\n", width ); + + fprintf( m_Outfile, "(layer %s) (width %f)\n )\n", aBrdLayerName, width ); + } break; @@ -383,7 +416,7 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon ) } -void BITMAPCONV_INFO::CreateOutputFile() +void BITMAPCONV_INFO::CreateOutputFile( BMP2CMP_MOD_LAYER aModLayer ) { KPolyPoint currpoint; @@ -400,7 +433,10 @@ void BITMAPCONV_INFO::CreateOutputFile() setlocale( LC_NUMERIC, "C" ); // Switch the locale to standard C - OuputFileHeader(); + // The layer name has meaning only for .kicad_mod files. + // For these files the header creates 2 invisible texts: value and ref + // (needed but not usefull) on silk screen layer + OuputFileHeader( getBrdLayerName( MOD_LYR_FSILKS ) ); bool main_outline = true; @@ -477,7 +513,7 @@ void BITMAPCONV_INFO::CreateOutputFile() for( unsigned ii = 0; ii < polyset_areas.size(); ii++ ) { KPolygon& poly = polyset_areas[ii]; - OuputOnePolygon(poly ); + OuputOnePolygon(poly, getBrdLayerName( aModLayer ) ); } polyset_areas.clear(); diff --git a/bitmap2component/bitmap2component.h b/bitmap2component/bitmap2component.h index 2f3f9f88df..602a713891 100644 --- a/bitmap2component/bitmap2component.h +++ b/bitmap2component/bitmap2component.h @@ -35,4 +35,13 @@ enum OUTPUT_FMT_ID FINAL_FMT = KICAD_LOGO }; +enum BMP2CMP_MOD_LAYER +{ + MOD_LYR_FSILKS = 0, + MOD_LYR_FSOLDERMASK, + MOD_LYR_ECO1, + MOD_LYR_ECO2, + MOD_LYR_FINAL = MOD_LYR_ECO2 +}; + #endif // BITMAP2COMPONENT_H From 8da93abcb883cadbd12f71e9c0df09b4c7fe2d19 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 12 Nov 2014 18:58:39 +0100 Subject: [PATCH 6/8] Polygon tools: update Clipper lib to 6.2.1 Minor doc update. --- Documentation/compiling/COMPILING.txt | 4 +- Documentation/compiling/build-config.txt | 44 +- Documentation/compiling/build-msw.txt | 21 +- polygon/clipper.cpp | 920 ++++++++++------------- polygon/clipper.hpp | 67 +- 5 files changed, 436 insertions(+), 620 deletions(-) diff --git a/Documentation/compiling/COMPILING.txt b/Documentation/compiling/COMPILING.txt index dbdcca25d5..618b5f9c9d 100644 --- a/Documentation/compiling/COMPILING.txt +++ b/Documentation/compiling/COMPILING.txt @@ -130,10 +130,10 @@ In order to have a working Kicad installtion, you need - documentation and translations (they are not included in sources) product branch: -bzr branch lp:kicad kicad_src +bzr branch https://code.launchpad.net/~kicad-product-committers/kicad kicad_src Stable branch: -bzr branch lp:kicad/stable kicad_src +bzr branch https://code.launchpad.net/~kicad-product-committers/kicad/stable kicad_src Components and Footprints libraries all (schematic libs, 3D shapes ...) but new footprints libraries (use Download zip tool) diff --git a/Documentation/compiling/build-config.txt b/Documentation/compiling/build-config.txt index 5d162f133f..4478aa40e4 100644 --- a/Documentation/compiling/build-config.txt +++ b/Documentation/compiling/build-config.txt @@ -14,7 +14,7 @@ boost libraries will be downloaded the first time you build Kicad. CMake ===== -KiCad uses CMake to generate the build files specific for the target platform +KiCad uses CMake (version 2.12 or later) to generate the build files specific for the target platform specified by the developer. This document attempts to define some of the more common CMake and KiCad build configuration settings. You can use CMake either by the command CMake on or the graphical version ccmake. This document only @@ -78,24 +78,6 @@ the wxWidgets library. If you wish to use a custom built wxWidgets library, set wxWidgets_ROOT_DIR to the correct path. -wxWidgets_USE_DEBUG (ON/OFF) ----------------------------- -Default: OFF - -When creating a debug build of KiCad, it is often useful to link against the -debug build of the wxWidgets. To use the debug build of wxWidgets, set -wxWidgets_USE_DEBUG to ON. - - -wxWidgets_USE_UNICODE (ON/OFF) ------------------------------- -Default: ON (wxWidgets 2.9 or later), OFF (older versions) - -If your platform supports Unicode and you wish to build KiCad with Unicode -support, set wxWidgets_USE_UNICODE to ON. Please note as of the 2.9 branch -this option is not required. - - KiCad Specific Options ====================== @@ -114,17 +96,6 @@ WARNING: The KiCad developers strongly advise you to build the bundled copy of the Boost library, as it is known to work with KiCad. Other versions may contain bugs that may result in KiCad errors. - -USE_WX_GRAPHICS_CONTEXT (ON/OFF) --------------------------------- -Default: OFF - -This option is *Experimental*. It enables advanced drawing library code using -wxGraphicsContext and should only be used for testing purposes. Under Windows, -a very recent version of mingw is needed. It also requires wxWidgets to be -built with the --enable-graphics_ctx configuration switch. - - USE_IMAGES_IN_MENUS (ON/OFF) ---------------------------- Default: OFF for OSX, ON for other platforms. @@ -147,20 +118,11 @@ to avoid download and building the dependencies multiple times. KICAD_USER_CONFIG_DIR (PATH) ---------------------------- -Default: Home directory (Unix-based systems), Application data directory (Windows) +Default: ~/.config (Unix-based systems), Application data directory (Windows) This option specifies where to store user-specific configuration information. -KICAD_KEEPCASE (ON/OFF) ------------------------ -Default: ON - -If this is OFF, component names are automatically converted to uppercase meaning -they are case insensitive. If it is ON, component names are not changed and -are therefore case sensitive. - - USE_WX_OVERLAY (ON/OFF) ----------------------- Default: ON for OSX, OFF for other platforms. @@ -192,7 +154,7 @@ KICAD_SCRIPTING_WXPYTHON (ON/OFF) Default: OFF This option enables or disables building wxPython support into the KiCad -scripting support. Currently only Pcbnew is supported. This option requires +scripting support. Currently only Pcbnew has scripting support. This option requires SWIG, Python, and wxPython to be installed on the system. diff --git a/Documentation/compiling/build-msw.txt b/Documentation/compiling/build-msw.txt index 679f4c609f..27bbf02ad4 100644 --- a/Documentation/compiling/build-msw.txt +++ b/Documentation/compiling/build-msw.txt @@ -103,16 +103,16 @@ install the wxWidgets library into MinGW then enter the following commands: #mkdir Release #cd Release -#../configure --with-opengl +#../configure --enable-monolithic=no --enable-shared=yes --with-opengl #make If you want to install wxWidgets in MinGW then enter the following commands: #mkdir Release #cd Release -#../configure --prefix=/mingw --enable-monolithic=no --disable-shared --with-opengl +#../configure --prefix=/mingw --enable-monolithic=no --enable-shared=yes --with-opengl #make && make install -wxWidgets will be statically linked to Kicad, which avoid issus with wxWidgets dlls +wxWidgets cannot be statically linked to Kicad. Download the KiCad Source Code ------------------------------ @@ -126,16 +126,19 @@ Launchpad repository has two branches for KiCad sources: near a stable state) To download the testing branch: -#bzr branch lp:kicad kicad_testing +#bzr branch https://code.launchpad.net/~kicad-product-committers/kicad kicad_testing To download the stable branch: -#bzr branch lp:kicad/stable kicad_stable +#bzr branch https://code.launchpad.net/~kicad-product-committers/kicad/stable kicad_stable -To download the component and footprint libraries -#bzr branch lp:~kicad-lib-committers/kicad/library kicad_libraries +To download the component and footprint libraries: +(This branch is a bzr/launchpad import of the Git repository +at https://github.com/KiCad/kicad-library.git. +It has schematic parts and 3D models in it.) +#bzr branch https://code.launchpad.net/~kicad-product-committers/kicad/library kicad_libraries To download the documentation and translation files: -#bzr branch lp:~kicad-developers/kicad/doc kicad_doc +#bzr branch https://code.launchpad.net/~kicad-developers/kicad/doc kicad_doc Create Makefiles with CMake --------------------------- @@ -219,7 +222,7 @@ Building the Developer Documentation ------------------------------------ To build the HTML developer documentation, run the following commands: -#cd /build/debug +#cd /build/release #make doxygen-docs The documentation will be created in the /Documentation/html diff --git a/polygon/clipper.cpp b/polygon/clipper.cpp index bb657fd993..6022853c95 100644 --- a/polygon/clipper.cpp +++ b/polygon/clipper.cpp @@ -1,8 +1,8 @@ /******************************************************************************* * * * Author : Angus Johnson * -* Version : 6.1.3a * -* Date : 22 January 2014 * +* Version : 6.2.1 * +* Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * @@ -50,15 +50,6 @@ namespace ClipperLib { -#ifdef use_int32 - static cInt const loRange = 46340; - static cInt const hiRange = 46340; -#else - static cInt const loRange = 0x3FFFFFFF; - static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; - typedef unsigned long long ulong64; -#endif - static double const pi = 3.141592653589793238; static double const two_pi = pi *2; static double const def_arc_tolerance = 0.25; @@ -99,11 +90,10 @@ struct IntersectNode { IntPoint Pt; }; -struct LocalMinima { +struct LocalMinimum { cInt Y; TEdge *LeftBound; TEdge *RightBound; - LocalMinima *Next; }; struct OutPt; @@ -131,6 +121,14 @@ struct Join { IntPoint OffPt; }; +struct LocMinSorter +{ + inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) + { + return locMin2.Y < locMin1.Y; + } +}; + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -170,7 +168,10 @@ PolyNode* PolyTree::GetFirst() const int PolyTree::Total() const { - return (int)AllNodes.size(); + int result = (int)AllNodes.size(); + //with negative offsets, ignore the hidden outer polygon ... + if (result > 0 && Childs[0] != AllNodes[0]) result--; + return result; } //------------------------------------------------------------------------------ @@ -240,8 +241,8 @@ bool PolyNode::IsOpen() const //------------------------------------------------------------------------------ // Int128 class (enables safe math on signed 64bit integers) -// eg Int128 val1((cInt)9223372036854775807); //ie 2^63 -1 -// Int128 val2((cInt)9223372036854775807); +// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 +// Int128 val2((long64)9223372036854775807); // Int128 val3 = val1 * val2; // val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) //------------------------------------------------------------------------------ @@ -249,22 +250,21 @@ bool PolyNode::IsOpen() const class Int128 { public: + ulong64 lo; + long64 hi; - cUInt lo; - cInt hi; - - Int128(cInt _lo = 0) + Int128(long64 _lo = 0) { - lo = (cUInt)_lo; + lo = (ulong64)_lo; if (_lo < 0) hi = -1; else hi = 0; } Int128(const Int128 &val): lo(val.lo), hi(val.hi){} - Int128(const cInt& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} + Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} - Int128& operator = (const cInt &val) + Int128& operator = (const long64 &val) { lo = (ulong64)val; if (val < 0) hi = -1; else hi = 0; @@ -330,81 +330,18 @@ class Int128 Int128 operator-() const //unary negation { if (lo == 0) - return Int128(-hi,0); + return Int128(-hi, 0); else - return Int128(~hi,~lo +1); + return Int128(~hi, ~lo + 1); } - Int128 operator/ (const Int128 &rhs) const - { - if (rhs.lo == 0 && rhs.hi == 0) - throw "Int128 operator/: divide by zero"; - - bool negate = (rhs.hi < 0) != (hi < 0); - Int128 dividend = *this; - Int128 divisor = rhs; - if (dividend.hi < 0) dividend = -dividend; - if (divisor.hi < 0) divisor = -divisor; - - if (divisor < dividend) - { - Int128 result = Int128(0); - Int128 cntr = Int128(1); - while (divisor.hi >= 0 && !(divisor > dividend)) - { - divisor.hi <<= 1; - if ((cInt)divisor.lo < 0) divisor.hi++; - divisor.lo <<= 1; - - cntr.hi <<= 1; - if ((cInt)cntr.lo < 0) cntr.hi++; - cntr.lo <<= 1; - } - divisor.lo >>= 1; - if ((divisor.hi & 1) == 1) - divisor.lo |= 0x8000000000000000LL; - divisor.hi = (ulong64)divisor.hi >> 1; - - cntr.lo >>= 1; - if ((cntr.hi & 1) == 1) - cntr.lo |= 0x8000000000000000LL; - cntr.hi >>= 1; - - while (cntr.hi != 0 || cntr.lo != 0) - { - if (!(dividend < divisor)) - { - dividend -= divisor; - result.hi |= cntr.hi; - result.lo |= cntr.lo; - } - divisor.lo >>= 1; - if ((divisor.hi & 1) == 1) - divisor.lo |= 0x8000000000000000LL; - divisor.hi >>= 1; - - cntr.lo >>= 1; - if ((cntr.hi & 1) == 1) - cntr.lo |= 0x8000000000000000LL; - cntr.hi >>= 1; - } - if (negate) result = -result; - return result; - } - else if (rhs.hi == this->hi && rhs.lo == this->lo) - return Int128(negate ? -1: 1); - else - return Int128(0); - } - - double AsDouble() const + operator double() const { const double shift64 = 18446744073709551616.0; //2^64 if (hi < 0) { - cUInt lo_ = ~lo + 1; - if (lo_ == 0) return (double)hi * shift64; - else return -(double)(lo_ + ~hi * shift64); + if (lo == 0) return (double)hi * shift64; + else return -(double)(~lo + ~hi * shift64); } else return (double)(lo + hi * shift64); @@ -413,7 +350,7 @@ class Int128 }; //------------------------------------------------------------------------------ -Int128 Int128Mul (cInt lhs, cInt rhs) +Int128 Int128Mul (long64 lhs, long64 rhs) { bool negate = (lhs < 0) != (rhs < 0); @@ -431,9 +368,9 @@ Int128 Int128Mul (cInt lhs, cInt rhs) ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; Int128 tmp; - tmp.hi = cInt(a + (c >> 32)); - tmp.lo = cInt(c << 32); - tmp.lo += cInt(b); + tmp.hi = long64(a + (c >> 32)); + tmp.lo = long64(c << 32); + tmp.lo += long64(b); if (tmp.lo < b) tmp.hi++; if (negate) tmp = -tmp; return tmp; @@ -444,6 +381,13 @@ Int128 Int128Mul (cInt lhs, cInt rhs) // Miscellaneous global functions //------------------------------------------------------------------------------ +void Swap(cInt& val1, cInt& val2) +{ + cInt tmp = val1; + val1 = val2; + val2 = tmp; +} +//------------------------------------------------------------------------------ bool Orientation(const Path &poly) { return Area(poly) >= 0; @@ -494,6 +438,7 @@ bool PointIsVertex(const IntPoint &Pt, OutPt *pp) int PointInPolygon (const IntPoint &pt, const Path &path) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf int result = 0; size_t cnt = path.size(); @@ -539,7 +484,6 @@ int PointInPolygon (const IntPoint &pt, const Path &path) int PointInPolygon (const IntPoint &pt, OutPt *op) { //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf int result = 0; OutPt* startOp = op; for(;;) @@ -584,8 +528,9 @@ bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) OutPt* op = OutPt1; do { + //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon int res = PointInPolygon(op->Pt, OutPt2); - if (res >= 0) return res != 0; + if (res >= 0) return res > 0; op = op->Next; } while (op != OutPt1); @@ -674,20 +619,18 @@ inline cInt TopX(TEdge &edge, const cInt currentY) } //------------------------------------------------------------------------------ -bool IntersectPoint(TEdge &Edge1, TEdge &Edge2, - IntPoint &ip, bool UseFullInt64Range) +void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) { #ifdef use_xyz ip.Z = 0; #endif + double b1, b2; - //nb: with very large coordinate values, it's possible for SlopesEqual() to - //return false but for the edge.Dx value be equal due to double precision rounding. - if (SlopesEqual(Edge1, Edge2, UseFullInt64Range) || Edge1.Dx == Edge2.Dx) + if (Edge1.Dx == Edge2.Dx) { - if (Edge2.Bot.Y > Edge1.Bot.Y) ip = Edge2.Bot; - else ip = Edge1.Bot; - return false; + ip.Y = Edge1.Curr.Y; + ip.X = TopX(Edge1, ip.Y); + return; } else if (Edge1.Delta.X == 0) { @@ -734,7 +677,15 @@ bool IntersectPoint(TEdge &Edge1, TEdge &Edge2, else ip.X = TopX(Edge2, ip.Y); } - return true; + //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... + if (ip.Y > Edge1.Curr.Y) + { + ip.Y = Edge1.Curr.Y; + //use the more vertical edge to derive X ... + if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) + ip.X = TopX(Edge2, ip.Y); else + ip.X = TopX(Edge1, ip.Y); + } } //------------------------------------------------------------------------------ @@ -807,13 +758,9 @@ inline void ReverseHorizontal(TEdge &e) //swap horizontal edges' Top and Bottom x's so they follow the natural //progression of the bounds - ie so their xbots will align with the //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] - cInt tmp = e.Top.X; - e.Top.X = e.Bot.X; - e.Bot.X = tmp; + Swap(e.Top.X, e.Bot.X); #ifdef use_xyz - tmp = e.Top.Z; - e.Top.Z = e.Bot.Z; - e.Bot.Z = tmp; + Swap(e.Top.Z, e.Bot.Z); #endif } //------------------------------------------------------------------------------ @@ -905,26 +852,6 @@ OutPt* GetBottomPt(OutPt *pp) } //------------------------------------------------------------------------------ -bool FindSegment(OutPt* &pp, bool UseFullInt64Range, - IntPoint &pt1, IntPoint &pt2) -{ - //OutPt1 & OutPt2 => the overlap segment (if the function returns true) - if (!pp) return false; - OutPt* pp2 = pp; - IntPoint pt1a = pt1, pt2a = pt2; - do - { - if (SlopesEqual(pt1a, pt2a, pp->Pt, pp->Prev->Pt, UseFullInt64Range) && - SlopesEqual(pt1a, pt2a, pp->Pt, UseFullInt64Range) && - GetOverlapSegment(pt1a, pt2a, pp->Pt, pp->Prev->Pt, pt1, pt2)) - return true; - pp = pp->Next; - } - while (pp != pp2); - return false; -} -//------------------------------------------------------------------------------ - bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, const IntPoint pt2, const IntPoint pt3) { @@ -937,41 +864,12 @@ bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, } //------------------------------------------------------------------------------ -OutPt* InsertPolyPtBetween(OutPt* p1, OutPt* p2, const IntPoint Pt) +bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) { - if (p1 == p2) throw "JoinError"; - OutPt* result = new OutPt; - result->Pt = Pt; - if (p2 == p1->Next) - { - p1->Next = result; - p2->Prev = result; - result->Next = p2; - result->Prev = p1; - } else - { - p2->Next = result; - p1->Prev = result; - result->Next = p1; - result->Prev = p2; - } - return result; + if (seg1a > seg1b) Swap(seg1a, seg1b); + if (seg2a > seg2b) Swap(seg2a, seg2b); + return (seg1a < seg2b) && (seg2a < seg1b); } -//------------------------------------------------------------------------------ - -bool HorzSegmentsOverlap(const IntPoint& pt1a, const IntPoint& pt1b, - const IntPoint& pt2a, const IntPoint& pt2b) -{ - //precondition: both segments are horizontal - if ((pt1a.X > pt2a.X) == (pt1a.X < pt2b.X)) return true; - else if ((pt1b.X > pt2a.X) == (pt1b.X < pt2b.X)) return true; - else if ((pt2a.X > pt1a.X) == (pt2a.X < pt1b.X)) return true; - else if ((pt2b.X > pt1a.X) == (pt2b.X < pt1b.X)) return true; - else if ((pt1a.X == pt2a.X) && (pt1b.X == pt2b.X)) return true; - else if ((pt1a.X == pt2b.X) && (pt1b.X == pt2a.X)) return true; - else return false; -} - //------------------------------------------------------------------------------ // ClipperBase class methods ... @@ -979,8 +877,7 @@ bool HorzSegmentsOverlap(const IntPoint& pt1a, const IntPoint& pt1b, ClipperBase::ClipperBase() //constructor { - m_MinimaList = 0; - m_CurrentLM = 0; + m_CurrentLM = m_MinimaList.begin(); //begin() == end() here m_UseFullRange = false; } //------------------------------------------------------------------------------ @@ -1023,114 +920,129 @@ TEdge* FindNextLocMin(TEdge* E) } //------------------------------------------------------------------------------ -TEdge* ClipperBase::ProcessBound(TEdge* E, bool IsClockwise) +TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) { - TEdge *EStart = E, *Result = E; + TEdge *Result = E; TEdge *Horz = 0; - cInt StartX; - if (IsHorizontal(*E)) - { - //it's possible for adjacent overlapping horz edges to start heading left - //before finishing right, so ... - if (IsClockwise) StartX = E->Prev->Bot.X; - else StartX = E->Next->Bot.X; - if (E->Bot.X != StartX) ReverseHorizontal(*E); - } - if (Result->OutIdx != Skip) - { - if (IsClockwise) - { - while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) - Result = Result->Next; - if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) - { - //nb: at the top of a bound, horizontals are added to the bound - //only when the preceding edge attaches to the horizontal's left vertex - //unless a Skip edge is encountered when that becomes the top divide - Horz = Result; - while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; - if (Horz->Prev->Top.X == Result->Next->Top.X) - { - if (!IsClockwise) Result = Horz->Prev; - } - else if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; - } - while (E != Result) - { - E->NextInLML = E->Next; - if (IsHorizontal(*E) && E != EStart && - E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); - E = E->Next; - } - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) - ReverseHorizontal(*E); - Result = Result->Next; //move to the edge just beyond current bound - } else - { - while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) - Result = Result->Prev; - if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) - { - Horz = Result; - while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; - if (Horz->Next->Top.X == Result->Prev->Top.X) - { - if (!IsClockwise) Result = Horz->Next; - } - else if (Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; - } - - while (E != Result) - { - E->NextInLML = E->Prev; - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) - ReverseHorizontal(*E); - E = E->Prev; - } - if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) - ReverseHorizontal(*E); - Result = Result->Prev; //move to the edge just beyond current bound - } - } - - if (Result->OutIdx == Skip) + if (E->OutIdx == Skip) { //if edges still remain in the current bound beyond the skip edge then //create another LocMin and call ProcessBound once more - E = Result; - if (IsClockwise) + if (NextIsForward) { while (E->Top.Y == E->Next->Bot.Y) E = E->Next; //don't include top horizontals when parsing a bound a second time, //they will be contained in the opposite bound ... while (E != Result && IsHorizontal(*E)) E = E->Prev; - } else + } + else { while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; while (E != Result && IsHorizontal(*E)) E = E->Next; } + if (E == Result) { - if (IsClockwise) Result = E->Next; + if (NextIsForward) Result = E->Next; else Result = E->Prev; - } else + } + else { //there are more edges in the bound beyond result starting with E - if (IsClockwise) + if (NextIsForward) E = Result->Next; else E = Result->Prev; - LocalMinima* locMin = new LocalMinima; - locMin->Next = 0; - locMin->Y = E->Bot.Y; - locMin->LeftBound = 0; - locMin->RightBound = E; - locMin->RightBound->WindDelta = 0; - Result = ProcessBound(locMin->RightBound, IsClockwise); - InsertLocalMinima(locMin); + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + E->WindDelta = 0; + Result = ProcessBound(E, NextIsForward); + m_MinimaList.push_back(locMin); + } + return Result; + } + + TEdge *EStart; + + if (IsHorizontal(*E)) + { + //We need to be careful with open paths because this may not be a + //true local minima (ie E may be following a skip edge). + //Also, consecutive horz. edges may start heading left before going right. + if (NextIsForward) + EStart = E->Prev; + else + EStart = E->Next; + if (EStart->OutIdx != Skip) + { + if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge + { + if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) + ReverseHorizontal(*E); + } + else if (EStart->Bot.X != E->Bot.X) + ReverseHorizontal(*E); } } + + EStart = E; + if (NextIsForward) + { + while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) + Result = Result->Next; + if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) + { + //nb: at the top of a bound, horizontals are added to the bound + //only when the preceding edge attaches to the horizontal's left vertex + //unless a Skip edge is encountered when that becomes the top divide + Horz = Result; + while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; + if (Horz->Prev->Top.X == Result->Next->Top.X) + { + if (!NextIsForward) Result = Horz->Prev; + } + else if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; + } + while (E != Result) + { + E->NextInLML = E->Next; + if (IsHorizontal(*E) && E != EStart && + E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); + E = E->Next; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) + ReverseHorizontal(*E); + Result = Result->Next; //move to the edge just beyond current bound + } else + { + while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) + Result = Result->Prev; + if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) + { + Horz = Result; + while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; + if (Horz->Next->Top.X == Result->Prev->Top.X) + { + if (!NextIsForward) Result = Horz->Next; + } + else if (Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; + } + + while (E != Result) + { + E->NextInLML = E->Prev; + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + E = E->Prev; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + Result = Result->Prev; //move to the edge just beyond current bound + } + return Result; } //------------------------------------------------------------------------------ @@ -1179,7 +1091,8 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) TEdge *E = eStart, *eLoopStop = eStart; for (;;) { - if ((E->Curr == E->Next->Curr)) + //nb: allows matching start and end points when not Closed ... + if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) { if (E == E->Next) break; if (E == eStart) eStart = E->Next; @@ -1205,7 +1118,7 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) continue; } E = E->Next; - if (E == eLoopStop) break; + if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; } if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) @@ -1243,27 +1156,31 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) } E->Prev->OutIdx = Skip; if (E->Prev->Bot.X < E->Prev->Top.X) ReverseHorizontal(*E->Prev); - LocalMinima* locMin = new LocalMinima(); - locMin->Next = 0; - locMin->Y = E->Bot.Y; - locMin->LeftBound = 0; - locMin->RightBound = E; - locMin->RightBound->Side = esRight; - locMin->RightBound->WindDelta = 0; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + locMin.RightBound->Side = esRight; + locMin.RightBound->WindDelta = 0; while (E->Next->OutIdx != Skip) { E->NextInLML = E->Next; if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); E = E->Next; } - InsertLocalMinima(locMin); + m_MinimaList.push_back(locMin); m_edges.push_back(edges); return true; } m_edges.push_back(edges); - bool clockwise; + bool leftBoundIsForward; TEdge* EMin = 0; + + //workaround to avoid an endless loop in the while loop below when + //open paths have matching start and end points ... + if (E->Prev->Bot == E->Prev->Top) E = E->Next; + for (;;) { E = FindNextLocMin(E); @@ -1272,38 +1189,40 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) //E and E.Prev now share a local minima (left aligned if horizontal). //Compare their slopes to find which starts which bound ... - LocalMinima* locMin = new LocalMinima; - locMin->Next = 0; - locMin->Y = E->Bot.Y; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; if (E->Dx < E->Prev->Dx) { - locMin->LeftBound = E->Prev; - locMin->RightBound = E; - clockwise = false; //Q.nextInLML = Q.prev + locMin.LeftBound = E->Prev; + locMin.RightBound = E; + leftBoundIsForward = false; //Q.nextInLML = Q.prev } else { - locMin->LeftBound = E; - locMin->RightBound = E->Prev; - clockwise = true; //Q.nextInLML = Q.next + locMin.LeftBound = E; + locMin.RightBound = E->Prev; + leftBoundIsForward = true; //Q.nextInLML = Q.next } - locMin->LeftBound->Side = esLeft; - locMin->RightBound->Side = esRight; + locMin.LeftBound->Side = esLeft; + locMin.RightBound->Side = esRight; - if (!Closed) locMin->LeftBound->WindDelta = 0; - else if (locMin->LeftBound->Next == locMin->RightBound) - locMin->LeftBound->WindDelta = -1; - else locMin->LeftBound->WindDelta = 1; - locMin->RightBound->WindDelta = -locMin->LeftBound->WindDelta; + if (!Closed) locMin.LeftBound->WindDelta = 0; + else if (locMin.LeftBound->Next == locMin.RightBound) + locMin.LeftBound->WindDelta = -1; + else locMin.LeftBound->WindDelta = 1; + locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; - E = ProcessBound(locMin->LeftBound, clockwise); - TEdge* E2 = ProcessBound(locMin->RightBound, !clockwise); + E = ProcessBound(locMin.LeftBound, leftBoundIsForward); + if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); - if (locMin->LeftBound->OutIdx == Skip) - locMin->LeftBound = 0; - else if (locMin->RightBound->OutIdx == Skip) - locMin->RightBound = 0; - InsertLocalMinima(locMin); - if (!clockwise) E = E2; + TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); + if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); + + if (locMin.LeftBound->OutIdx == Skip) + locMin.LeftBound = 0; + else if (locMin.RightBound->OutIdx == Skip) + locMin.RightBound = 0; + m_MinimaList.push_back(locMin); + if (!leftBoundIsForward) E = E2; } return true; } @@ -1318,27 +1237,6 @@ bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) } //------------------------------------------------------------------------------ -void ClipperBase::InsertLocalMinima(LocalMinima *newLm) -{ - if( ! m_MinimaList ) - { - m_MinimaList = newLm; - } - else if( newLm->Y >= m_MinimaList->Y ) - { - newLm->Next = m_MinimaList; - m_MinimaList = newLm; - } else - { - LocalMinima* tmpLm = m_MinimaList; - while( tmpLm->Next && ( newLm->Y < tmpLm->Next->Y ) ) - tmpLm = tmpLm->Next; - newLm->Next = tmpLm->Next; - tmpLm->Next = newLm; - } -} -//------------------------------------------------------------------------------ - void ClipperBase::Clear() { DisposeLocalMinimaList(); @@ -1357,12 +1255,12 @@ void ClipperBase::Clear() void ClipperBase::Reset() { - m_CurrentLM = m_MinimaList; - if( !m_CurrentLM ) return; //ie nothing to process + m_CurrentLM = m_MinimaList.begin(); + if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process + std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); //reset all edges ... - LocalMinima* lm = m_MinimaList; - while( lm ) + for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) { TEdge* e = lm->LeftBound; if (e) @@ -1379,35 +1277,29 @@ void ClipperBase::Reset() e->Side = esRight; e->OutIdx = Unassigned; } - lm = lm->Next; } } //------------------------------------------------------------------------------ void ClipperBase::DisposeLocalMinimaList() { - while( m_MinimaList ) - { - LocalMinima* tmpLm = m_MinimaList->Next; - delete m_MinimaList; - m_MinimaList = tmpLm; - } - m_CurrentLM = 0; + m_MinimaList.clear(); + m_CurrentLM = m_MinimaList.begin(); } //------------------------------------------------------------------------------ void ClipperBase::PopLocalMinima() { - if( ! m_CurrentLM ) return; - m_CurrentLM = m_CurrentLM->Next; + if (m_CurrentLM == m_MinimaList.end()) return; + ++m_CurrentLM; } //------------------------------------------------------------------------------ IntRect ClipperBase::GetBounds() { IntRect result; - LocalMinima* lm = m_MinimaList; - if (!lm) + MinimaList::iterator lm = m_MinimaList.begin(); + if (lm == m_MinimaList.end()) { result.left = result.top = result.right = result.bottom = 0; return result; @@ -1416,10 +1308,9 @@ IntRect ClipperBase::GetBounds() result.top = lm->LeftBound->Bot.Y; result.right = lm->LeftBound->Bot.X; result.bottom = lm->LeftBound->Bot.Y; - while (lm) + while (lm != m_MinimaList.end()) { - if (lm->LeftBound->Bot.Y > result.bottom) - result.bottom = lm->LeftBound->Bot.Y; + result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); TEdge* e = lm->LeftBound; for (;;) { TEdge* bottomE = e; @@ -1429,16 +1320,15 @@ IntRect ClipperBase::GetBounds() if (e->Bot.X > result.right) result.right = e->Bot.X; e = e->NextInLML; } - if (e->Bot.X < result.left) result.left = e->Bot.X; - if (e->Bot.X > result.right) result.right = e->Bot.X; - if (e->Top.X < result.left) result.left = e->Top.X; - if (e->Top.X > result.right) result.right = e->Top.X; - if (e->Top.Y < result.top) result.top = e->Top.Y; - + result.left = std::min(result.left, e->Bot.X); + result.right = std::max(result.right, e->Bot.X); + result.left = std::min(result.left, e->Top.X); + result.right = std::max(result.right, e->Top.X); + result.top = std::min(result.top, e->Top.Y); if (bottomE == lm->LeftBound) e = lm->RightBound; else break; } - lm = lm->Next; + ++lm; } return result; } @@ -1466,12 +1356,11 @@ Clipper::Clipper(int initOptions) : ClipperBase() //constructor Clipper::~Clipper() //destructor { Clear(); - m_Scanbeam.clear(); } //------------------------------------------------------------------------------ #ifdef use_xyz -void Clipper::ZFillFunction(TZFillCallback zFillFunc) +void Clipper::ZFillFunction(ZFillCallback zFillFunc) { m_ZFill = zFillFunc; } @@ -1481,15 +1370,11 @@ void Clipper::ZFillFunction(TZFillCallback zFillFunc) void Clipper::Reset() { ClipperBase::Reset(); - m_Scanbeam.clear(); + m_Scanbeam = ScanbeamList(); m_ActiveEdges = 0; m_SortedEdges = 0; - LocalMinima* lm = m_MinimaList; - while (lm) - { + for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) InsertScanbeam(lm->Y); - lm = lm->Next; - } } //------------------------------------------------------------------------------ @@ -1550,7 +1435,7 @@ bool Clipper::ExecuteInternal() bool succeeded = true; try { Reset(); - if (!m_CurrentLM) return false; + if (m_CurrentLM == m_MinimaList.end()) return true; cInt botY = PopScanbeam(); do { InsertLocalMinimaIntoAEL(botY); @@ -1558,11 +1443,11 @@ bool Clipper::ExecuteInternal() ProcessHorizontals(false); if (m_Scanbeam.empty()) break; cInt topY = PopScanbeam(); - succeeded = ProcessIntersections(botY, topY); + succeeded = ProcessIntersections(topY); if (!succeeded) break; ProcessEdgesAtTopOfScanbeam(topY); botY = topY; - } while (!m_Scanbeam.empty() || m_CurrentLM); + } while (!m_Scanbeam.empty() || m_CurrentLM != m_MinimaList.end()); } catch(...) { @@ -1601,14 +1486,16 @@ bool Clipper::ExecuteInternal() void Clipper::InsertScanbeam(const cInt Y) { - m_Scanbeam.insert(Y); + //if (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) return;// avoid duplicates. + m_Scanbeam.push(Y); } //------------------------------------------------------------------------------ cInt Clipper::PopScanbeam() { - cInt Y = *m_Scanbeam.begin(); - m_Scanbeam.erase(m_Scanbeam.begin()); + const cInt Y = m_Scanbeam.top(); + m_Scanbeam.pop(); + while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. return Y; } //------------------------------------------------------------------------------ @@ -1967,7 +1854,7 @@ void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) { - while( m_CurrentLM && ( m_CurrentLM->Y == botY ) ) + while (m_CurrentLM != m_MinimaList.end() && (m_CurrentLM->Y == botY)) { TEdge* lb = m_CurrentLM->LeftBound; TEdge* rb = m_CurrentLM->RightBound; @@ -2018,7 +1905,7 @@ void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) Join* jr = m_GhostJoins[i]; //if the horizontal Rb and a 'ghost' horizontal overlap, then convert //the 'ghost' join to a real join ready for later ... - if (HorzSegmentsOverlap(jr->OutPt1->Pt, jr->OffPt, rb->Bot, rb->Top)) + if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) AddJoin(jr->OutPt1, Op1, jr->OffPt); } } @@ -2088,45 +1975,34 @@ void Clipper::DeleteFromSEL(TEdge *e) //------------------------------------------------------------------------------ #ifdef use_xyz - -void Clipper::SetZ(IntPoint& pt, TEdge& e) +void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) { - pt.Z = 0; - if (m_ZFill) - { - //put the 'preferred' point as first parameter ... - if (e.OutIdx < 0) - (*m_ZFill)(e.Bot, e.Top, pt); //outside a path so presume entering - else - (*m_ZFill)(e.Top, e.Bot, pt); //inside a path so presume exiting - } + if (pt.Z != 0 || !m_ZFill) return; + else if (pt == e1.Bot) pt.Z = e1.Bot.Z; + else if (pt == e1.Top) pt.Z = e1.Top.Z; + else if (pt == e2.Bot) pt.Z = e2.Bot.Z; + else if (pt == e2.Top) pt.Z = e2.Top.Z; + else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); } //------------------------------------------------------------------------------ #endif -void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, - const IntPoint &Pt, bool protect) +void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) { - //e1 will be to the Left of e2 BELOW the intersection. Therefore e1 is before - //e2 in AEL except when e1 is being inserted at the intersection point ... - bool e1stops = !protect && !e1->NextInLML && - e1->Top.X == Pt.X && e1->Top.Y == Pt.Y; - bool e2stops = !protect && !e2->NextInLML && - e2->Top.X == Pt.X && e2->Top.Y == Pt.Y; bool e1Contributing = ( e1->OutIdx >= 0 ); bool e2Contributing = ( e2->OutIdx >= 0 ); +#ifdef use_xyz + SetZ(Pt, *e1, *e2); +#endif + #ifdef use_lines //if either edge is on an OPEN path ... if (e1->WindDelta == 0 || e2->WindDelta == 0) { //ignore subject-subject open path intersections UNLESS they //are both open paths, AND they are both 'contributing maximas' ... - if (e1->WindDelta == 0 && e2->WindDelta == 0) - { - if ((e1stops || e2stops) && e1Contributing && e2Contributing) - AddLocalMaxPoly(e1, e2, Pt); - } + if (e1->WindDelta == 0 && e2->WindDelta == 0) return; //if intersecting a subj line with a subj poly ... else if (e1->PolyTyp == e2->PolyTyp && @@ -2165,13 +2041,6 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, if (e2Contributing) e2->OutIdx = Unassigned; } } - - if (e1stops) - if (e1->OutIdx < 0) DeleteFromAEL(e1); - else throw clipperException("Error intersecting polylines"); - if (e2stops) - if (e2->OutIdx < 0) DeleteFromAEL(e2); - else throw clipperException("Error intersecting polylines"); return; } #endif @@ -2236,10 +2105,11 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, if ( e1Contributing && e2Contributing ) { - if ( e1stops || e2stops || - (e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || + if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) - AddLocalMaxPoly(e1, e2, Pt); + { + AddLocalMaxPoly(e1, e2, Pt); + } else { AddOutPt(e1, Pt); @@ -2266,8 +2136,7 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, SwapPolyIndexes(*e1, *e2); } } - else if ( (e1Wc == 0 || e1Wc == 1) && - (e2Wc == 0 || e2Wc == 1) && !e1stops && !e2stops ) + else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) { //neither edge is currently contributing ... @@ -2286,7 +2155,9 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, } if (e1->PolyTyp != e2->PolyTyp) - AddLocalMinPoly(e1, e2, Pt); + { + AddLocalMinPoly(e1, e2, Pt); + } else if (e1Wc == 1 && e2Wc == 1) switch( m_ClipType ) { case ctIntersection: @@ -2308,17 +2179,6 @@ void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, else SwapSides( *e1, *e2 ); } - - if( (e1stops != e2stops) && - ( (e1stops && (e1->OutIdx >= 0)) || (e2stops && (e2->OutIdx >= 0)) ) ) - { - SwapSides( *e1, *e2 ); - SwapPolyIndexes( *e1, *e2 ); - } - - //finally, delete any non-contributing maxima edges ... - if( e1stops ) DeleteFromAEL( e1 ); - if( e2stops ) DeleteFromAEL( e2 ); } //------------------------------------------------------------------------------ @@ -2509,12 +2369,7 @@ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) newOp->Prev = newOp; if (!outRec->IsOpen) SetHoleState(e, outRec); -#ifdef use_xyz - if (pt == e->Bot) newOp->Pt = e->Bot; - else if (pt == e->Top) newOp->Pt = e->Top; - else SetZ(newOp->Pt, *e); -#endif - e->OutIdx = outRec->Idx; //nb: do this after SetZ ! + e->OutIdx = outRec->Idx; return newOp; } else { @@ -2533,11 +2388,6 @@ OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) newOp->Prev->Next = newOp; op->Prev = newOp; if (ToFront) outRec->Pts = newOp; -#ifdef use_xyz - if (pt == e->Bot) newOp->Pt = e->Bot; - else if (pt == e->Top) newOp->Pt = e->Top; - else SetZ(newOp->Pt, *e); -#endif return newOp; } } @@ -2704,37 +2554,6 @@ void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) } //------------------------------------------------------------------------ -void Clipper::PrepareHorzJoins(TEdge* horzEdge, bool isTopOfScanbeam) -{ - //get the last Op for this horizontal edge - //the point may be anywhere along the horizontal ... - OutPt* outPt = m_PolyOuts[horzEdge->OutIdx]->Pts; - if (horzEdge->Side != esLeft) outPt = outPt->Prev; - - //First, match up overlapping horizontal edges (eg when one polygon's - //intermediate horz edge overlaps an intermediate horz edge of another, or - //when one polygon sits on top of another) ... - //for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) - //{ - // Join* j = m_GhostJoins[i]; - // if (HorzSegmentsOverlap(j->OutPt1->Pt, j->OffPt, horzEdge->Bot, horzEdge->Top)) - // AddJoin(j->OutPt1, outPt, j->OffPt); - //} - - //Also, since horizontal edges at the top of one SB are often removed from - //the AEL before we process the horizontal edges at the bottom of the next, - //we need to create 'ghost' Join records of 'contrubuting' horizontals that - //we can compare with horizontals at the bottom of the next SB. - if (isTopOfScanbeam) - { - if (outPt->Pt == horzEdge->Top) - AddGhostJoin(outPt, horzEdge->Bot); - else - AddGhostJoin(outPt, horzEdge->Top); - } -} -//------------------------------------------------------------------------------ - /******************************************************************************* * Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * * Bottom of a scanbeam) are processed as if layered. The order in which HEs * @@ -2774,28 +2593,42 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) if ((dir == dLeftToRight && e->Curr.X <= horzRight) || (dir == dRightToLeft && e->Curr.X >= horzLeft)) { - if (horzEdge->OutIdx >= 0 && horzEdge->WindDelta != 0) - PrepareHorzJoins(horzEdge, isTopOfScanbeam); //so far we're still in range of the horizontal Edge but make sure //we're at the last of consec. horizontals when matching with eMaxPair if(e == eMaxPair && IsLastHorz) { - if (dir == dLeftToRight) - IntersectEdges(horzEdge, e, e->Top); - else - IntersectEdges(e, horzEdge, e->Top); - if (eMaxPair->OutIdx >= 0) throw clipperException("ProcessHorizontal error"); + + if (horzEdge->OutIdx >= 0) + { + OutPt* op1 = AddOutPt(horzEdge, horzEdge->Top); + TEdge* eNextHorz = m_SortedEdges; + while (eNextHorz) + { + if (eNextHorz->OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge->Bot.X, + horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) + { + OutPt* op2 = AddOutPt(eNextHorz, eNextHorz->Bot); + AddJoin(op2, op1, eNextHorz->Top); + } + eNextHorz = eNextHorz->NextInSEL; + } + AddGhostJoin(op1, horzEdge->Bot); + AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); + } + DeleteFromAEL(horzEdge); + DeleteFromAEL(eMaxPair); return; } else if(dir == dLeftToRight) { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); - IntersectEdges(horzEdge, e, Pt, true); + IntersectEdges(horzEdge, e, Pt); } else { IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); - IntersectEdges( e, horzEdge, Pt, true); + IntersectEdges( e, horzEdge, Pt); } SwapPositionsInAEL( horzEdge, e ); } @@ -2804,9 +2637,6 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) e = eNext; } //end while - if (horzEdge->OutIdx >= 0 && horzEdge->WindDelta != 0) - PrepareHorzJoins(horzEdge, isTopOfScanbeam); - if (horzEdge->NextInLML && IsHorizontal(*horzEdge->NextInLML)) { UpdateEdgeIntoAEL(horzEdge); @@ -2821,6 +2651,7 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) if(horzEdge->OutIdx >= 0) { OutPt* op1 = AddOutPt( horzEdge, horzEdge->Top); + if (isTopOfScanbeam) AddGhostJoin(op1, horzEdge->Bot); UpdateEdgeIntoAEL(horzEdge); if (horzEdge->WindDelta == 0) return; //nb: HorzEdge is no longer horizontal here @@ -2846,22 +2677,7 @@ void Clipper::ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam) else UpdateEdgeIntoAEL(horzEdge); } - else if (eMaxPair) - { - if (eMaxPair->OutIdx >= 0) - { - if (dir == dLeftToRight) - IntersectEdges(horzEdge, eMaxPair, horzEdge->Top); - else - IntersectEdges(eMaxPair, horzEdge, horzEdge->Top); - if (eMaxPair->OutIdx >= 0) - throw clipperException("ProcessHorizontal error"); - } else - { - DeleteFromAEL(horzEdge); - DeleteFromAEL(eMaxPair); - } - } else + else { if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); DeleteFromAEL(horzEdge); @@ -2892,11 +2708,11 @@ void Clipper::UpdateEdgeIntoAEL(TEdge *&e) } //------------------------------------------------------------------------------ -bool Clipper::ProcessIntersections(const cInt botY, const cInt topY) +bool Clipper::ProcessIntersections(const cInt topY) { if( !m_ActiveEdges ) return true; try { - BuildIntersectList(botY, topY); + BuildIntersectList(topY); size_t IlSize = m_IntersectList.size(); if (IlSize == 0) return true; if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); @@ -2921,7 +2737,7 @@ void Clipper::DisposeIntersectNodes() } //------------------------------------------------------------------------------ -void Clipper::BuildIntersectList(const cInt botY, const cInt topY) +void Clipper::BuildIntersectList(const cInt topY) { if ( !m_ActiveEdges ) return; @@ -2948,16 +2764,7 @@ void Clipper::BuildIntersectList(const cInt botY, const cInt topY) IntPoint Pt; if(e->Curr.X > eNext->Curr.X) { - if (!IntersectPoint(*e, *eNext, Pt, m_UseFullRange) && e->Curr.X > eNext->Curr.X +1) - throw clipperException("Intersection error"); - if (Pt.Y > botY) - { - Pt.Y = botY; - if (std::fabs(e->Dx) > std::fabs(eNext->Dx)) - Pt.X = TopX(*eNext, botY); else - Pt.X = TopX(*e, botY); - } - + IntersectPoint(*e, *eNext, Pt); IntersectNode * newNode = new IntersectNode; newNode->Edge1 = e; newNode->Edge2 = eNext; @@ -2985,7 +2792,7 @@ void Clipper::ProcessIntersectList() { IntersectNode* iNode = m_IntersectList[i]; { - IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt, true); + IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); } delete iNode; @@ -3044,7 +2851,7 @@ void Clipper::DoMaxima(TEdge *e) TEdge* eNext = e->NextInAEL; while(eNext && eNext != eMaxPair) { - IntersectEdges(e, eNext, e->Top, true); + IntersectEdges(e, eNext, e->Top); SwapPositionsInAEL(e, eNext); eNext = e->NextInAEL; } @@ -3056,7 +2863,9 @@ void Clipper::DoMaxima(TEdge *e) } else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) { - IntersectEdges( e, eMaxPair, e->Top); + if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); } #ifdef use_lines else if (e->WindDelta == 0) @@ -3124,9 +2933,13 @@ void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) { - OutPt* op = AddOutPt(ePrev, e->Curr); - OutPt* op2 = AddOutPt(e, e->Curr); - AddJoin(op, op2, e->Curr); //StrictlySimple (type-3) join + IntPoint pt = e->Curr; +#ifdef use_xyz + SetZ(pt, *ePrev, *e); +#endif + OutPt* op = AddOutPt(ePrev, pt); + OutPt* op2 = AddOutPt(e, pt); + AddJoin(op, op2, pt); //StrictlySimple (type-3) join } } @@ -3508,6 +3321,7 @@ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) (j->OffPt == j->OutPt2->Pt)) { //Strictly Simple join ... + if (outRec1 != outRec2) return false; op1b = j->OutPt1->Next; while (op1b != op1 && (op1b->Pt == j->OffPt)) op1b = op1b->Next; @@ -3648,13 +3462,23 @@ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) } //---------------------------------------------------------------------- +static OutRec* ParseFirstLeft(OutRec* FirstLeft) +{ + while (FirstLeft && !FirstLeft->Pts) + FirstLeft = FirstLeft->FirstLeft; + return FirstLeft; +} +//------------------------------------------------------------------------------ + void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) { - + //tests if NewOutRec contains the polygon before reassigning FirstLeft for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; - if (outRec->Pts && outRec->FirstLeft == OldOutRec) + if (!outRec->Pts || !outRec->FirstLeft) continue; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (firstLeft == OldOutRec) { if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) outRec->FirstLeft = NewOutRec; @@ -3665,6 +3489,7 @@ void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) { + //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) { OutRec* outRec = m_PolyOuts[i]; @@ -3673,14 +3498,6 @@ void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) } //---------------------------------------------------------------------- -static OutRec* ParseFirstLeft(OutRec* FirstLeft) -{ - while (FirstLeft && !FirstLeft->Pts) - FirstLeft = FirstLeft->FirstLeft; - return FirstLeft; -} -//------------------------------------------------------------------------------ - void Clipper::JoinCommonEdges() { for (JoinList::size_type i = 0; i < m_Joins.size(); i++) @@ -3848,8 +3665,7 @@ void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType (path[i].Y == newNode->Contour[k].Y && path[i].X < newNode->Contour[k].X)) k = j; } - if ((endType == etClosedPolygon && j < 2) || - (endType != etClosedPolygon && j < 0)) + if (endType == etClosedPolygon && j < 2) { delete newNode; return; @@ -3859,7 +3675,7 @@ void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType //if this path's lowest pt is lower than all the others then update m_lowest if (endType != etClosedPolygon) return; if (m_lowest.X < 0) - m_lowest = IntPoint(0, k); + m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); else { IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; @@ -3965,6 +3781,7 @@ void ClipperOffset::Execute(PolyTree& solution, double delta) PolyNode* outerNode = solution.Childs[0]; solution.Childs.reserve(outerNode->ChildCount()); solution.Childs[0] = outerNode->Childs[0]; + solution.Childs[0]->Parent = outerNode->Parent; for (int i = 1; i < outerNode->ChildCount(); ++i) solution.AddChild(*outerNode->Childs[i]); } @@ -4149,8 +3966,20 @@ void ClipperOffset::DoOffset(double delta) void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) { + //cross product ... m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); - if (m_sinA < 0.00005 && m_sinA > -0.00005) return; + if (std::fabs(m_sinA * m_delta) < 1.0) + { + //dot product ... + double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); + if (cosA > 0) // angle => 0 degrees + { + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + return; + } + //else angle => 180 degrees + } else if (m_sinA > 1.0) m_sinA = 1.0; else if (m_sinA < -1.0) m_sinA = -1.0; @@ -4204,7 +4033,7 @@ void ClipperOffset::DoRound(int j, int k) { double a = std::atan2(m_sinA, m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); - int steps = (int)Round(m_StepsPerRad * std::fabs(a)); + int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); double X = m_normals[k].X, Y = m_normals[k].Y, X2; for (int i = 0; i < steps; ++i) @@ -4232,7 +4061,7 @@ void Clipper::DoSimplePolygons() { OutRec* outrec = m_PolyOuts[i++]; OutPt* op = outrec->Pts; - if (!op) continue; + if (!op || outrec->IsOpen) continue; do //for each Pt in Polygon until duplicate found do ... { OutPt* op2 = op->Next; @@ -4257,6 +4086,7 @@ void Clipper::DoSimplePolygons() //OutRec2 is contained by OutRec1 ... outrec2->IsHole = !outrec->IsHole; outrec2->FirstLeft = outrec; + if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); } else if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) @@ -4266,12 +4096,15 @@ void Clipper::DoSimplePolygons() outrec->IsHole = !outrec2->IsHole; outrec2->FirstLeft = outrec->FirstLeft; outrec->FirstLeft = outrec2; - } else + if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); + } + else { //the 2 polygons are separate ... outrec2->IsHole = outrec->IsHole; outrec2->FirstLeft = outrec->FirstLeft; - } + if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); + } op2 = op; //ie get ready for the Next iteration } op2 = op2->Next; @@ -4348,7 +4181,27 @@ double DistanceFromLineSqrd( bool SlopesNearCollinear(const IntPoint& pt1, const IntPoint& pt2, const IntPoint& pt3, double distSqrd) { - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + //this function is more accurate when the point that's geometrically + //between the other 2 points is the one that's tested for distance. + //ie makes it more likely to pick up 'spikes' ... + if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) + { + if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } + else + { + if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } } //------------------------------------------------------------------------------ @@ -4476,8 +4329,8 @@ void Minkowski(const Path& poly, const Path& path, pp.push_back(p); } - Paths quads; - quads.reserve((pathCnt + delta) * (polyCnt + 1)); + solution.clear(); + solution.reserve((pathCnt + delta) * (polyCnt + 1)); for (size_t i = 0; i < pathCnt - 1 + delta; ++i) for (size_t j = 0; j < polyCnt; ++j) { @@ -4488,23 +4341,30 @@ void Minkowski(const Path& poly, const Path& path, quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); if (!Orientation(quad)) ReversePath(quad); - quads.push_back(quad); + solution.push_back(quad); } - - Clipper c; - c.AddPaths(quads, ptSubject, true); - c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) { Minkowski(pattern, path, solution, true, pathIsClosed); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ -void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, - PolyFillType pathFillType, bool pathIsClosed) +void TranslatePath(const Path& input, Path& output, IntPoint delta) +{ + //precondition: input != output + output.resize(input.size()); + for (size_t i = 0; i < input.size(); ++i) + output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); +} +//------------------------------------------------------------------------------ + +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) { Clipper c; for (size_t i = 0; i < paths.size(); ++i) @@ -4512,21 +4372,29 @@ void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, Paths tmp; Minkowski(pattern, paths[i], tmp, true, pathIsClosed); c.AddPaths(tmp, ptSubject, true); + if (pathIsClosed) + { + Path tmp2; + TranslatePath(paths[i], tmp2, pattern[0]); + c.AddPath(tmp2, ptClip, true); + } } - if (pathIsClosed) c.AddPaths(paths, ptClip, true); - c.Execute(ctUnion, solution, pathFillType, pathFillType); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) { Minkowski(poly1, poly2, solution, false, true); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); } //------------------------------------------------------------------------------ enum NodeType {ntAny, ntOpen, ntClosed}; -void AddPolyNodeToPolygons(const PolyNode& polynode, NodeType nodetype, Paths& paths) +void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) { bool match = true; if (nodetype == ntClosed) match = !polynode.IsOpen(); @@ -4535,7 +4403,7 @@ void AddPolyNodeToPolygons(const PolyNode& polynode, NodeType nodetype, Paths& p if (!polynode.Contour.empty() && match) paths.push_back(polynode.Contour); for (int i = 0; i < polynode.ChildCount(); ++i) - AddPolyNodeToPolygons(*polynode.Childs[i], nodetype, paths); + AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); } //------------------------------------------------------------------------------ @@ -4543,7 +4411,7 @@ void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); - AddPolyNodeToPolygons(polytree, ntAny, paths); + AddPolyNodeToPaths(polytree, ntAny, paths); } //------------------------------------------------------------------------------ @@ -4551,7 +4419,7 @@ void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) { paths.resize(0); paths.reserve(polytree.Total()); - AddPolyNodeToPolygons(polytree, ntClosed, paths); + AddPolyNodeToPaths(polytree, ntClosed, paths); } //------------------------------------------------------------------------------ @@ -4593,18 +4461,4 @@ std::ostream& operator <<(std::ostream &s, const Paths &p) } //------------------------------------------------------------------------------ -#ifdef use_deprecated - -void OffsetPaths(const Paths &in_polys, Paths &out_polys, - double delta, JoinType jointype, EndType_ endtype, double limit) -{ - ClipperOffset co(limit, limit); - co.AddPaths(in_polys, jointype, (EndType)endtype); - co.Execute(out_polys, delta); -} -//------------------------------------------------------------------------------ - -#endif - - } //ClipperLib namespace diff --git a/polygon/clipper.hpp b/polygon/clipper.hpp index d16fd8b693..5f3cc1c832 100644 --- a/polygon/clipper.hpp +++ b/polygon/clipper.hpp @@ -1,8 +1,8 @@ /******************************************************************************* * * * Author : Angus Johnson * -* Version : 6.1.3a * -* Date : 22 January 2014 * +* Version : 6.2.1 * +* Date : 31 October 2014 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2010-2014 * * * @@ -34,7 +34,7 @@ #ifndef clipper_hpp #define clipper_hpp -#define CLIPPER_VERSION "6.1.3" +#define CLIPPER_VERSION "6.2.0" //use_int32: When enabled 32bit ints are used instead of 64bit ints. This //improve performance but coordinate values are limited to the range +/- 46340 @@ -46,9 +46,8 @@ //use_lines: Enables line clipping. Adds a very minor cost to performance. //#define use_lines -//use_deprecated: Enables support for the obsolete OffsetPaths() function -//which has been replace with the ClipperOffset class. -#define use_deprecated +//use_deprecated: Enables temporary support for the obsolete functions +//#define use_deprecated #include #include @@ -57,6 +56,7 @@ #include #include #include +#include namespace ClipperLib { @@ -69,11 +69,16 @@ enum PolyType { ptSubject, ptClip }; enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; #ifdef use_int32 -typedef int cInt; -typedef unsigned int cUInt; + typedef int cInt; + static cInt const loRange = 0x7FFF; + static cInt const hiRange = 0x7FFF; #else -typedef signed long long cInt; -typedef unsigned long long cUInt; + typedef signed long long cInt; + static cInt const loRange = 0x3FFFFFFF; + static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; + typedef signed long long long64; //used by Int128 class + typedef unsigned long long ulong64; + #endif struct IntPoint { @@ -117,15 +122,12 @@ struct DoublePoint //------------------------------------------------------------------------------ #ifdef use_xyz -typedef void (*TZFillCallback)(IntPoint& z1, IntPoint& z2, IntPoint& pt); +typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); #endif enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4}; enum JoinType {jtSquare, jtRound, jtMiter}; enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound}; -#ifdef use_deprecated - enum EndType_ {etClosed, etButt = 2, etSquare, etRound}; -#endif class PolyNode; typedef std::vector< PolyNode* > PolyNodes; @@ -134,6 +136,7 @@ class PolyNode { public: PolyNode(); + virtual ~PolyNode(){}; Path Contour; PolyNodes Childs; PolyNode* Parent; @@ -168,11 +171,6 @@ bool Orientation(const Path &poly); double Area(const Path &poly); int PointInPolygon(const IntPoint &pt, const Path &path); -#ifdef use_deprecated - void OffsetPaths(const Paths &in_polys, Paths &out_polys, - double delta, JoinType jointype, EndType_ endtype, double limit = 0); -#endif - void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); @@ -183,8 +181,7 @@ void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1. void CleanPolygons(Paths& polys, double distance = 1.415); void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); -void MinkowskiSum(const Path& pattern, const Paths& paths, - Paths& solution, PolyFillType pathFillType, bool pathIsClosed); +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed); void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); @@ -202,7 +199,7 @@ enum EdgeSide { esLeft = 1, esRight = 2}; //forward declarations (for stuff used internally) ... struct TEdge; struct IntersectNode; -struct LocalMinima; +struct LocalMinimum; struct Scanbeam; struct OutPt; struct OutRec; @@ -213,7 +210,6 @@ typedef std::vector < TEdge* > EdgeList; typedef std::vector < Join* > JoinList; typedef std::vector < IntersectNode* > IntersectList; - //------------------------------------------------------------------------------ //ClipperBase is the ancestor to the Clipper class. It should not be @@ -236,12 +232,14 @@ protected: void PopLocalMinima(); virtual void Reset(); TEdge* ProcessBound(TEdge* E, bool IsClockwise); - void InsertLocalMinima(LocalMinima *newLm); void DoMinimaLML(TEdge* E1, TEdge* E2, bool IsClosed); TEdge* DescendToMin(TEdge *&E); void AscendToMax(TEdge *&E, bool Appending, bool IsClosed); - LocalMinima *m_CurrentLM; - LocalMinima *m_MinimaList; + + typedef std::vector MinimaList; + MinimaList::iterator m_CurrentLM; + MinimaList m_MinimaList; + bool m_UseFullRange; EdgeList m_edges; bool m_PreserveCollinear; @@ -268,7 +266,7 @@ public: void StrictlySimple(bool value) {m_StrictSimple = value;}; //set the callback function for z value filling on intersections (otherwise Z is 0) #ifdef use_xyz - void ZFillFunction(TZFillCallback zFillFunc); + void ZFillFunction(ZFillCallback zFillFunc); #endif protected: void Reset(); @@ -279,7 +277,8 @@ private: JoinList m_GhostJoins; IntersectList m_IntersectList; ClipType m_ClipType; - std::set< cInt, std::greater > m_Scanbeam; + typedef std::priority_queue ScanbeamList; + ScanbeamList m_Scanbeam; TEdge *m_ActiveEdges; TEdge *m_SortedEdges; bool m_ExecuteLocked; @@ -289,7 +288,7 @@ private: bool m_UsingPolyTree; bool m_StrictSimple; #ifdef use_xyz - TZFillCallback m_ZFill; //custom callback + ZFillCallback m_ZFill; //custom callback #endif void SetWindingCount(TEdge& edge); bool IsEvenOddFillType(const TEdge& edge) const; @@ -308,21 +307,19 @@ private: bool IsTopHorz(const cInt XPos); void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); void DoMaxima(TEdge *e); - void PrepareHorzJoins(TEdge* horzEdge, bool isTopOfScanbeam); void ProcessHorizontals(bool IsTopOfScanbeam); void ProcessHorizontal(TEdge *horzEdge, bool isTopOfScanbeam); void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); OutRec* GetOutRec(int idx); void AppendPolygon(TEdge *e1, TEdge *e2); - void IntersectEdges(TEdge *e1, TEdge *e2, - const IntPoint &pt, bool protect = false); + void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); OutRec* CreateOutRec(); OutPt* AddOutPt(TEdge *e, const IntPoint &pt); void DisposeAllOutRecs(); void DisposeOutRec(PolyOutList::size_type index); - bool ProcessIntersections(const cInt botY, const cInt topY); - void BuildIntersectList(const cInt botY, const cInt topY); + bool ProcessIntersections(const cInt topY); + void BuildIntersectList(const cInt topY); void ProcessIntersectList(); void ProcessEdgesAtTopOfScanbeam(const cInt topY); void BuildResult(Paths& polys); @@ -344,7 +341,7 @@ private: void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); void FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec); #ifdef use_xyz - void SetZ(IntPoint& pt, TEdge& e); + void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); #endif }; //------------------------------------------------------------------------------ From 37da6766ec1b0e30bebf9ff8e929d53a1354a211 Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Wed, 12 Nov 2014 19:13:27 -0500 Subject: [PATCH 7/8] Update avhttp-master.zip to the latest version so Boost 1.57 can be used to build KiCad. --- pcbnew/github/avhttp-master.zip | Bin 157913 -> 173539 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pcbnew/github/avhttp-master.zip b/pcbnew/github/avhttp-master.zip index 4e68fee6a777a904f502307c0dac4a6b366dd048..2fa261a0c6516d072d8a30d97e4b937b282a48ce 100644 GIT binary patch delta 98549 zcmZs?V|Zq5(KkKM-|JZxg zs;X6It1MnsKH{=`^IFIBWK#5gH3UpT$?i@>&!vY=iMU!CHXrRf}i~O2=t!JhO7H zD|EHd0wB|mHedVOhg?=fQ5$I+QH4u7=}?DwFAk~P)|ldHjhCj4;3 z8Sjxqc)y>1dwzV(rfMLKg6zmfCYMCaDL}nDK16;3RCqLR!*{xOkaKYtJe2S@8q&mP9Pbzzq` zZ};^CBHhA^7*y$8%#t7!hj5P=-{x39%WFxPcU{P1Wc_OUb5y(;FK&E67fzJ=o=kC) z12HV8v@%INK6c`*AX)qtVjnP)0sw!}1oIz|{R^igTnMUv(IXAv2>%aMs*JRlb%23@ z(7}=>AjtoNl^Eqorz{3k-K^TVHqAbwnWDH1x{f|ETMJu3!D35xEHD#sxLU||N3tZq z?ay+#14nXA|G8yO@fV4(u7lM;)rQpN4kM|p>JsD-@7N@kXh^OcpSx@|)?U#X-LF%r z%N6IH;`EMJ;8~^%`O|b!%oyegqrBXLpbw4+K+gfD>0+}l!KqvTC`am!cx^kBi=pO zfa~#XJCxp&eV0ydnukJz5TNj@lC8l$e*PjBvz5|*5E;7pSjSmRUX+%Rg3rVwHG!oN zoeni#;(f3ONq-5E1pHCwtyy56>7J{f&D3#3u6i{v{m>EuHQ1!0r+8a0VKYKZS>`|3 zS~K`OybD^););{gBCEL3M+n&@qU7-50J~F0%vge@ zM%i#9zQgcAr5`>D^ zfcf&dVhWSLE=i;rFO&GZ#+Pl~C#G)bgI|71N%1SLBeaasj(#B2^sbPX_x?|Y3wmS? zYyt%W>VO9V`kAB+jr$*bHu^yKfc{Hwd?-5O0GccrokZ=7#@V)+*e4YOiC0^1T5hlRQ-pQ8E*umj{ zze87H(`twS(O0k6C_N-G#1tf?r_Iu@IGJI3BZh^GEwfMQ{npipzJUIs{V)7iUJiX2 z{hMGZLlzN%EB_#DYQ$PH9c{q93}jSOYN5GT@o=JmJb?!XiEF@V!EjNV`T~ous6#vz zxCvR=wnv!(v}|U=&DBG#X|2`Cgx0Ah!)(IO3!97Ps>5hB0lWj?O?PH?+d_vnM$g{? zixtq$Z0mf3gsyHt>2P@q-nTG)=neHA#QG$kOW)Uh*_Pp;%tj^T{>Y544=^lHwF% zOxYkE(3=_dZ$OnE!q?l)@h+gpK)gcfSikqv>-l7PGi^7{BUDk>ERgiH7Qg{`I=KeO z)6e*Qzg@-c&H#L-o!LeR>46DHujM_E%v}TPhDA$A8hl3Ev7tMzeinv{dJcqQf?I0# zz!)esBn^|;O1dghPNmhE856ck{l>FA9bPLmW0>_St?hQ>p3zVZa3ml?AP8>2Gvfg# zrh&zk-jv@=MQhPk2Jh{!kBnkCBB}%^;N4@W2Sm{g6_%r_P(cY>Pf=O?hDkjXGU`7R zmc44y{)PAu4wDDtd$!Oo*&m`keIU;lewS>qGRff5c1B==$H-YD@C^&Ol5P)z6-rSO zuSi27hk<~@h>X9gQ6Z6B3H*oI0!0-7+C`9;a_bvHoJ`S8=Mh@A>U>!^8U+f-12xt1 zQ(L%ZlSZy(ZX+-*l>N3+%@#rpWt}HFphS)6p_cPZt>0E3Tf|?-JjE zEo_^(a#b#D>_HeztXRrh_9GvQkNK1{_!!Hy7$(sePRtt9z}3gDHShpt1C5n}MvDQ- z&9X{r>nn$NVmO`HVc%solG8Po>}WwJiBu&Qm9ZQc=Jb#IeU3G4Fk+=iJ`SE4CSdhW& z1Ns%onPF_~YS87vOArp9(y!e%+&TpmEy-eI8{jTo1=+s{5gmk66{+)^``sp9A{0}Q zHli{$t4Co$sCGo(F^`DLk4SwI8#}00QEPwuEs6EUZ**AI%NFhA{`Ct z-C45>QI6V{s%6vSIvs~rHZg%aj}*O^MLF%n$)m6?GTB5_G*!Vkv+H6_#`*H1o27l* zj9w9k80>eVQby+B06gzs~BVMn_V_+&#{=a@Rz(KyK8`E2>Qe|Nac}n z^0@cvxHu&$3T-PuE4!_Cl*HeB_6)wI)v&=B66dm2T$f}~>#gt4qEoJHe(R6=jGW|% z^bFRsJ|jhHUVhk{1DtyJv_yQykjDn?_uR!=Mk9^8noRb!ei9BN*U~X3tlPCdaAw^1 zgwCI3G8@2~0g}FmBd!i?;t`d>S#xu`>R;^GgU!f!6f_hz!=&7s6k7ae zpvrfjD|WBR;Y^M)aLgf=g_^j^q|{9oK@Aw*bsbWvx&%JjbfkO86X|iO4IVJUuM$h~ ztB>LIB^(E8OE6PkNg8hm^O+)Qz34qA_k>Bw3if*>cIMbMELOO65ql$o#Ez29ft1VZ zy;!+%zJCD4PyqL5ap6G`0_#PF>xg0B%EssaBhw}QpkVno2XRv1fc&TW5}v-k>ix^R zaxiI*JwH(Y$zVwUYV`jQaEO|%{3RRe*Vb30Fe0g?G!}GLlTbn^3uE#1jg`QJy;gY4#{DnrE^qW0*Bz3LU5R?qgi5w{%1nidyQ` zvV2q_ZRCnf8T+5@*g>|66|i&8KRpZgHlgsMJ;1cWA19GIfI&0ZM-Q}mx$ZCR-c_Y$ zO#hAnUHb-X?wpS%5-4sp=eBVwA z&)Xw53(_=`MAyZ}TG4Uhg5W7bcyzMEaZnd3)V;8Pf$~}c7}}Ks?!|KRpColLsEi^F z9;B!yz)yr90Nz}6YY&jmUqRH5yl{ItOsi)kfo%ShRGv2HbZ%P7`jk~X@Y3z5$%YQg zf-XRiKz2z{sYLAaPt?8 z>o9_xnI6L;nChMRvSqmB{2UNoe#_pRQY&1h8nHBx?XOb|1 zGD8lb1Q7GpX#3R|upmFJLq(3`%mkg6j z;g8Ub1gJPiHLD1COn4gUeT*_?%K@{4g&}NE2w*+zvU18U*Qsn7$o#bBYxL~-_JbaM zv4fBqvmQ3XE@hl_a%&~`l7j_glqXI!Fy{Af{a!vEAGq7zE&kx%KaTD%lX*3bHB7Vv z8hoc5!1a0KDM4g^a_RH~9$2IKvKVoA3YQh`orsCxg_NvP2OJ-{^a$KSSoB(;Bdu*M zq5$Ps73@-;kF+86_HE4f(F^6WAoKZHG(%d zl)~%z!QL`gGs4VrV@mZcbwPOzGJh5bEUAHyVCZoN*@yO;NTk3f*lmIh+ z@hpN_$dErbxD4>kv(aT4p(}=@!(TYcCdns*50Lb10#->D`?R^dxyjM*$Dw$LL|36! zojzU!YwoP_v3oeDK}*&A!XvSLbz;Q8_jR*9QPQ~#FEOHi3)hu-E?VG0JHDZ0|1rl| z+R`|O`&s70fiuv8 zOVm!sRO9Ib+Gg*G{)dQB)Y3QTJ}n&m(cTv56EV&Co741tkOGi@Ylb_=`au6bOU)!J z2L69Z@D~F-Fv`Desfg6XP7MeUkT)a{5cxl)cv3tA7{Joj(A?C>((Zqh| zezAVT5#XQ;2GVXD#UWQF6c2Mhx_?-Q<&VJzq{h6 z`3Q+MwzyPk!0{Mffz;}VBSlY8vA#v8YiO88I?-X%BCMiww~&?`(vV0Pe@~zVNJmF@ z>_9M-tR2Q_QtKK0UbCo%4^OqOXrrr4uXe6?E5|!&>=e4(i1(d66cQe8gPej;zO(_= z>|d%q`M5Dd^7{4=_W=tq?8lK4z73}kkC{m#5iT*{gXp!T_yYBDu6IfbDH+`2pw^Mh-u?kNPfh=?2yjV-T=J2TKUrrUerp zC8ZKG&xzJ7V2fzEAdBQ`71yAwGEyJ#RO>=8OUDK5k6(d5%h9ay<>V;hZ!rL?5SSkR zjVDz>L|+KZU#cw%%`u@``%Jb9+xM^m(!gziPzOor&K)=L zKGKj~VpKot`uU1#SCEsi;%OvDK`ht3?*M9*@=v5!HKJH|bK(=C(Xev5i(RWiy*i$k z!CMs@nGAj7FsFGEN$IX+kzlfE{38^4X|z016v!IMvM&3*Lv)U~Qs%ZV7vC?YV0KsC z16I0SN8G$_kDuKfVSC$vTYbJRe8F*hq#YwSYT-7j!UtHP3^K}#CZmy77n_<-3 z;^)ub{FFT>2Liz#chsprIeHR>s5P-FB6*`_?~;74vSL zW@7hUZ9UT8a(yh@a*LaM&ff2!Qy~nxfve? zEW}0r>o(dR8N`< zvQN^LJ7`z8fXOkAWf}=wHloo7pIqf@vBBy3kYF|BdX$+pE@*SvRXb`^4AoEX zJF-zv!d8NYdt2a)bgwyOWY{_@rIA#APy=gxQHt4!CDK^xV=0*h!4tZGC7>7~fDct_ zS4wC+uipK<_Y8A<=SfuW0Aimr?Kb;u#+0VYL{k7iwmH`Nkb|uZpWe@dDKIs7*P?=3|L)kImA7STu8CuVxZaD!7-3qU+B=RTaOl3pqgRwrWp{9!D)qRZ%2)J^)*P%e9ZXI+Ub)9MB}lSJlxtC+-MC^6kAb2sgo0Wkdg z6fnEPJ6SaI^~d4sGj6>z&lz0!d;u|v`TOp*cX#)6LdN-PGO1A=z-ATJI-A>--VNaX zIJKnP*xj8KIGxp-)$if_c&b$;;F-}s24auC{XEZlJ8b3Lv*%xy@)rNo!%Q+$$9dHx zvFLb}M5y$nN}5J&C|9;SDN%*L1E^W86@CklA(W~wS_tkZZ8(pLw<=}Gb9(x{fUw#1 zrX;F@z9=>*KvgrEV5+473Uksj75{4FkA$vQKO!Ge<-Q_q@L|Bcs5pkk*eGelCo2r6 z1suXy#39XI3|ZD!#9@MjQaS;d;d=GeaGd(fhJEuH>inexp-%P%ng+*v4!~mxZ@X}T zkHDo%(!0xC>W$6p2n7nKqW}0ResJBSKj~n55m{T8tF~$98W4pj$`L{%qfsE)FM}2; z?mMbKDmO&#bq=cB@`<1m6rW_Y5>vJgtxl$N)zl5GCf3#U3(gdg#;Zx7Q-fHBvLc+C z_vD5_Mzu}Ym=6>pVBW&A9?-(SiCgBm)I7co?{|aH@y86?K31J3b5lF)ts{7vf)4>x z@=!s^9tn)85Y6Wr+RLYx`zqe;J8OsO2AobVERzn2J%yMImb`N*G7?C7NXVWXXjT1! zI9pqehZBh!y|ZmD1=dz*-h@ggQ1xz1!fTPW`nu3|%@%v8%|2W+5Wf>v4KJVMi5@>c z1zgXQ_8a1VrSkvAaVHzo|09lhyxftL!GVCj{|b5xf8&@SiH046`k#33R=1VkR73s3 z`HlpU7|U27se6{zsuT)WBh#ZoCcGbKdWLh%TFXeXXD0pUkxWyR;-h+K({Gv72wnAq6R@CvdNXcCMc zmbhcB6&J$E;c|r4l`E`;^yQi8+U#@2_rKa0($4@_H&|zQXf=ABBhC5wg^A4LN`rkz zrg~?>;{`(oh+5hOe1Vg=b1Qf;;O%H*mqbbknN&zMA>~X|MOo&{rybzniIjvH7cx&n zNU}_f=|UB?9&B+9U>`NJ}g*)Cx*X(+JP7J86ewma;#zWIpig$BFW~nGBY!S z&?^AgmC3YYpqay2$;*(wkQlN=Cl))b>{4?IrV$ZHs3dT@1@1eZiD*#uICVxMUwm-bw}HMRwm+ z6;m2TdZ#2c=Na<#SOZhTFr0bOP#E`(7$pIV&4Cfg&WAcZ42i1680dG@ccTVPf&2Y} z@(D60sx)eIjlcZk5YZvC!)t$vZPg=H?gznsAQVc$I^hlTd=w=SWm=qf(Szq?qtZ^=l&tk-vnwNQLJwfO?O3sJ3pW_c^#Od03YFF=ywdr$|M4*IWGiM zocqL^`*~Gkih>CLj6%{~b%AY(_Cul!E*@(u_mKugrOg~dl+jgz3$8W>IrA@v=nrG( zW8m=rnS3Ts3hs#xRHK~XpLmiLE)r(5mCw4Bbaws45-$#y=&pJ(^DZ%jdM{9rpCH~F zj&0T>2m5Y?yo}l)g3HS6!*F&;=6?m)3o?Oo3cjL1P7VQ|&A=l|)|^wF4Lv1H$S*on z#@A80mzQ3w<-lBLn3!2|cC^cy5ajxyTI zU!hnH+Z7VMJtFE`6>x|CUIOl2mR?~E;dB5;lwG0e5TM*KJf7uKqaN+7$JGzu7m}|k zRwJN`e~)d>iT8-j$`4z(51pQm7pIcOUfBWJ-8TTV9op2WOCJxGk+NWxdMeWLH@X2D z%@MLkH}g~-(9EtEoJ`+pU`G6UojKZdXlK0)u2RsKuPL)DyL7~vXSO;K^F>en#&>cH zJ~WO`pHJkUFTk~%pHHsOIn4q01y7D(wq8A&omq6{)H7Ldr#D8?J%=eEmD-oEgqtIt zJ!aRp8lB!LDXq_2Zm!n5dOk*JXxXFo6|^K<8Qy`Sk@DVNqja*kbi7q|wjut1w2xU& zpV5K(8~GSsrHPLA9y(A)>KJ{T5{m zd^`>2Uv=ouu?ISy-S)ldt&@vk)*mxpTCS(ll$ss~EE^&UD<8MIBF~T9mwO4_ZKm`) z6>@U*(zw@2GfA4}*Xn?y%7%t0lY-R7HVs<)k3Z!l(-)x-@AJNw2Fu1c-I?1}JZonA zPPsP(=bOyS`hMp7ql%W11+CAkzqUP75$sxYFbRtyp;_|nNVXdrR;afz{Ts8>exN={ z(9-X>!0I3G#4>wwU#-7gB}D#NHO--7MyEumCSuD|yWQ@0H-iLRrUQ>+o8h*cg0+(_ zSZfy%e}4|S_Y&Xfjq?215V=x!r$#W>7-ufT?16g0gl|;*CHT&S!PHgANFNITzsKxa z%{@NZ#i5o0%-6481Ge^5Z+Z1*nM54|oY4cPBtBnl_5*Ut7GZ%ah#(6>%fo zn$~mPynQ<_)cH~4N3rI*0RCJVgmdhU&S>^jeu4h4?DKEWNTa_FZw>(jRF3hFbVi(( zAq9*`|4){=*0BBCAtHX+d`DUbaXv_YCc+OIkpEa<(O_Bm)LLjGT(m+CbB1Jl=cYAYF!%axI&5`r8a;Dk(o||3Br_Ax^?*08e z=i}k?;p$?!{o{SR^Bu2dQbNUco^ft7;IIcbuN{A8m%U)#{{TuZ*3ci%ZsmnQlGg^ zTiZ!VUW7__;pF#pw*W=7sk})~8e|#~#x#p1?}MF4ss~?asO5fDcPYYxmTW{8$s_7H zW+9nFvjX}>v0f6AnGBWc%<6s&_z()N_oEz2ky*V>-L z#0lNABzHg-YE)z=Cp;q>hex%_6{!1Wj>wliiEPbVs-#}UkHB2LU)$Di|yVT;=b>OH&1`!4E|hkzitV!pZhp5JZ7 z#3eo?tDd(&em)Cd4o3MU8pJEdcM%8uh8A5Rn#m=!mo;h_Z!dFXGvaV6`byYHnAqLbfu-Mhc)55P z#r)#J!v_Fd$8X;+Rm}B3iI3h@-RsT?Mym{9$J)h1eChsO%X4Ey&+`728*2<~B_v~0E+_!VsN^pN>`9T$vkkE~g`oN?GovCevBF<|!d zNsfi6G4_O~*M@+XhoHAbNsP}GY=dX+8gf;-5rYE?*n1$i1j}Ku2^N+l=o*zg!N$X( zA!mQ~^b?mCNTCPfDm?&xcpux*3IC9TiL)x7CxQV-ZDT8tHQ}-Hvk6~3x&&S&X&8eD zQgp)%3-mR;Yn{+c)+h9=03CkqK4;HaB+IymZKjWb$W9rObjm$gMPj7&f4RI7LkC}_ zaHh`osFfY{T7qEeRI7I)mnLPJ5g{#vLths#7NcVS`2}2-sI3T?FK@G$$3#okR?XO! zJf6j!FEJX~F_wAmmeDXcrV3TKnHdQ!6-aGXj#o_$OR3c6V0!!a%j z@nIfK^3Yd@2I~NNr<)AGv>w8Q5he28qtfVFF)>vzEb}((s1!9z8w5vm8k@~(=!9s9 z)quSZ7unq%b_n>CbO|Prs*92gln)1~_TnGTjtg{6WhRJzv&vUo@Tfdq* zI$hhgL}IMAb{>E5e&Jj_md&PvPFw;J+G`x)fpF=jI{akWt9@_83-}c(&u8pzNW#69 z9T_WyVBi|3)N5sV81-6P3{9&#$O+M3�Yr>6pjmgPg?3L8JL1{OaNOb`Vc?Vg43* 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 L1^6tBo%R0#nJg&t delta 83589 zcmZs?Qefc|Lxv``7j@Pi!q;i^qA2{ z#K8p2+8i{3k}N0~4A6fbZwCg^1O!qP%Skqs|3RVtqN2=T|3T}$Izhnx6PCmUO8+mC zWDQF47m52X(%1`11&sQipgF<>ojYJ4pm*8VGesM**4)V~Hi{gsE->9kg|)$Da#cmqdFE4oKXw`)S%KRsvG{g$W1_ zId8!{>J@K$BD-VOVJ_Qb9>!$itsfkDDM}qcAuY%y%$VAjv?Ilm+dvK5nkaiYz2spz z(F|$uwYx`j034M%@rNwF9a(&3H3_j5$dqXtA+6p{HwJ_4p@x@_axJK2;pEb#wP23u zIQEX(mtM6;ipkXhP}DJ0QiwBgJM0qyq3RL)ZAq5HpyAYopFwaq`yA>T`PW315h{EV z!3;sl0g_jC7J8y_i4YA$_D8?zgg{M?gKPsYVK~Q303OnV9R5}F^b`tiDd-39=&b7m zErT%4J|RyDKh3#`C+r<3b2PKgnKUQW+w{8S^O~mmee{fQ(Xov>Csm#VDrKx@M-*?22bNDJrxi}soiy)95 z0>h0$0e&=V)x4TarP6Sw1&RaniFTJ8wtI~CMr}e6mZk5 zJZ73s3>)u$!!7yjJTFosgjS(8^cxBOL%R}!VXm zR|IwI8G8=dCjLwr6bb=_UNA#mVp13rOgCU28q+kdeNJ)jb?)gyA|=)woLEvms{x<3 zm@d}ROiI=}2~@jPr~(|?hKiYw3|MqrBqgKF{CA>k-H7^~+E1O`pmQ}>b*lB<#Agak%mMRUb?DqCG}%>4)Zb`oGC zP5dMC_2Ba&Jz1NAMJW8dMgGlqA0H>1uPZ(xM%8AQp##u)c8 z_;qE_oWK~E(gADQ3UGhQ_3EOuXhtAD&Sq#y#NsAYQ7Iv8o5%MciYbsai4y0r5#2g1 zTo#d$aCrVJVX72!nQ9E zb7yinyva?ji1fhvBq+9wRGWnDuB~Z*GKe3bmpN|)dZy!<%Nk2jmmr=q;9Wo6jH2zX zd7LsS=l-ifFNJntsquXFZYvV}i-fZurnPqea`;WEf7a~UuP9KF^xQ|EV%WI+y>lWx zgfP(eXA_`_wGT0`3m<>8=0sb$gTMtMk9>IWs#^4jl=>KJOv!=b{ z1_#oY-FIXZ4A`IDQHA;9kV`YFK$C$th${TRLRK&x9$h^$6>{p6k}1GWLb5$~bCA1u z4;INyJLWcjXHlM00)~4i)3FL}NEP3WfcBLKHCBK zxvqWPW`WLR$vy=m>)*HhnR5WHa>N-GSwVr^C3%9Wc5 z6)J-$!&RXoY-PrxIQR86LW zEG3yzPLiG#MsTG}o`klj?<@K@Su-Irrke#S1YjQyy&@kmU;!IWFO^CXM08I*KjId?}LT#^`%AL{60<##93eJWa^UpV zj4L`9zt5M$G?G(i2Lh{8^~dy3EUQDGVIA8@5G-|cVu(8J+Ef7lw-fA(c&3Rtf&nXY zEwt&L=WE~4#+Sap+YgTDTwQ#X^<9xg8u%mHCJcT%CjV%Ft*pLLb3#7T0gNhY^Z7Z; zRqdI;DtNZN3Vmjgv`*P<$dv;UKDqY#;@&K8^WYmAT?C%o=(Y>9P6T?YmO^<2ZriSD zT_~0VOwX2*+s~VWHWLcOmCYM*@CNPGs1N=>#6GOp=W5Pr*f$4^o;2y(fr`QtN4CXb#YT^Pl|m?RW1}&pKN3)psNlSM(t!ZyLpF6li+~oMfj-4wgR!_5(msh^uHR z?HfdXYq#~-NIKh1QF5bd3)@hf{6@s3ub|P2Y^P&U``v!SpH=G{=}GJjK@YlTx>az- z`U7GwSGV09)%{RmO#oQft^#j+fWP|y$4KUvF<C@i+KAf}Dto?p$$wTTu0G+3zpS zfeCM`?>M%zo7!(Ht@LQMD+W1F?7Mg`_?H8bPOIKzyyRN~k)=vk`Ub)GF zr|ay-1FuE8nL%pi>^UXYlGTms54sihI;Z9#0Efdgf21+o{rqv~tt+)+3TP4i`b~OR zW1L-Ol3tHx$g)wTO63Z>{ccxBa9PMK!xyI10(@nqt}iX|qGD3`^>jmg?A^d2NW(>% zV$ILzshP@~EIFQgaY5 z&@*yx1MleH2n0;ovNd;$5mdVmFwGi2EV7Txe}Hr%K2 zel)ICYhA4I!4+?#xM9?$tF?ZX*LF=d;N>(GMGG&iLI&k-J~`3cG+af)1m2}2%%~*! zN9$dcC@8Q_-)7l^QfbaId9)Ev=RgqY(g>Y;u+ z4<|D44m&vyCt`z#S3WWOn-A}c#iNf&*U|*2ICj)_;LwyxD?LrH9nLt|1;)czF{j`G z9Z|E{a4&6?9j+7;S^>~7jA14%K>E+Nn(@nHYEK<_Cl7}UK(xbmJD@Fn89rky+H5x36}?PM6_oqC*og;apJC5!xUleH-^6^|Zxz4eCmIwxT*>i&CA+fbpUm;=+7! z5|UrmU#O|n3MPjlN42fj{U}Gqp=Q$T#oN#z2YeEt79}3=4kuDr;}GPFru!ZQnXiAK zz8YQ6TXBABTL-b6^)8eP_q2?z;n06jv0cW2G`Qp{(91%ruZ%lyNVsFEwjEU-kN#{a z4a~` z%4>i8XWx9#RUh?<0~PJl2iwNCQ@f<=iMyXB4X=h$^KWzNxbxG*2dH%y9uyT2J2^U^w6!7!!yxvKuud?1Ky9 z{b+T%k9cWyhcs|`QGYf4CX6S;VJ!FQJ7sjn1LFzuo0{N%6BkHu@Ng5LknzPdPB_}}{4AOkBJa{HBlJA3_WR-#$rQHVRh~Nuaj( zyFddr7OX|Wg~R9%lU0c`T~W$lY-eBTFZKl-ca{bIhX*Z;KJKBuyFN-(5tDFNrb8sC zcJQoSLDH*4K*Bk;wPsw#5D(nB&kyxSb@f*B6gt?`qKIW>dld2Ghpiz*MTyzOIXP!Q zVZpw}o<`RlGhnmynp5d@{Re-!@p+gK`wQ`rFpZPBmcCD`cNIDzd8T(fR2=mzDukrU zFb*E~vT6mETl<9Aq(d*YDsvhLPO}d@4T7nVK3G&)y7L}xXZSg^8!vsw$!f9iIs2zp zkQx?CW(JuYb)L?$8&7qNTzsZlce8oku?Eks>7*sx6kx%3V9$RO7fuG!>o~AFDjM6& zq*f$02ZOs=vBK$-M=yJK8gsTyy;f5e5{WvJ%^!_{7N2RafR*C2;0sHxO?aP~%2K|b z?^l9aR4i8nS|J~YJxwjPU#^BV|9Cj-Ixp|Imgg-U|4n|M6!24^hI}sm)fjJOo%+3Dm#n1vL_AcYjij1%1XE!U^bRG9) zlhlIqWfHN^ds#cv z(oPcl-amm1hU_s_nTXtGOjCLG0CLMXtm)nGQNy{_$ysyJE~Kp*kJ*@uT7{P8haEC( zrwC9@?P6HlP_~x~%`!{})u~KqOMw+1DnlQGml;{t8pLu+oOE_HBVkhWov!ce7arvQ zWcA+!{?|zR?+gE*EG0@Z;seM1zq7gBo55D`pQOJ^^5^6GR|b-L`EcN=&?DmC##pA| zowHVRlTP@^0a&`NM?t2Bd9K&@d?(qywWP=lD8O@6G>Q4B%=B>OXC_>g)^0By!-NP6 zoX+aB=YO1*!3SSm{7k z31yc;(A(nE$n{giUR6Si)%6$M9(fWb>nacpAC7NQ0r0A6VK5ZZqQcUs_>*)24C?H1 zQWe;)VvEoZ<0#5-D1pL-xD6FTx?DIA0@6_7DE)I{B~-KnY`GMf+NW0$lr?0iB3VfA zS*>zP?qJpE)G<}oHuX|wW@co3Vw441Bw?4-ys@?ktl^ZPIYDWv<&`3aiYyFmo}dxa z*EL_)0NehfO3ii*wgmJ)m>O(YOcQL34+T?3CPYxx)k=WCDE!%Ff*6Q)j9EA2BM9{b zs1=c9HXhREg*R9I&(E>s_L}VXirXaD&1sz+5ru?%p zWYk6qDH@dm&&g!fK|W?S<$k)~EllUQGN?%yn^YqiV5CGaZAKXEBJ}x5sjom9-t##; zV2_+X!Bz3b6KX^#L?6gre+emx?YvJECQc)Nl29Ir4fy+%LRCO8OYmc$){mMnOD`=2 z0wNM!i?TJa#>Z5mVPEiHM45E@Zg+`P(UR&ThhTha&~H)pK>|qcn)~D5?SgGyh$g;* zPEmq7DVb-!PK}@-`6;*GYvFxs41V)6uZb9b8;OK_QmA%f3XZN&2-PaPRmme;(1u64 z+@Z1jFt#uUbtS|)XzP_%R{-r^5LaD#1rW`6`BY$wgQ}uOA?s_p%X#2g@(FpVoXJzLcJ+Z?a@WBQ;daEx-bQnAJ8K@v zd^!Z>5Bmy7I~d#>1d!{+_>`=ytVW~StdB4Hi8Pa_e#MiH*JT_93FmPDt3fi70W9M| z%^)-KY1o)7{j`)Ugf%;{2t-MQB}Yo}^px)ur)FyeG0+})7clr>2J5x=gGLJ9ORLIu z(sfzfq?eDfR=ZdE;6GIk0u)BrB>07`R4!t8g6}t1U%zdB-g3T$gnEqxm-|Bg*@q{| zwyEC*8L7gMRCJlwVIKEB0?P}@{l~AZ7SYDgK67qt zSv)whbv|6f|2@bs#T~aZuSM0y zdJmR`R{M0As-L-P=%ul>3I+V$I!-%%1rPC^4_u8XXzJ$aV}%GxQi5zrV4{QuB~NSH z7>-zeLq|k#crdy3G!A)52sp8M6$VQQNqa){o&F;$A%W`7c1Krz-1=HMsp&| zkD$3h+u&YE@VDa?y>BFGnkbEk`$r(muH@Eudk!Pyk4;p!i|2ma2dN3ScsDTo_#z2R0hU$zPTOt8hv z@TM)-WUdWtacv;+!~~70^UFfm%zpb5Tj}Sq68<%&=fgg?rK&N_jm)p5oU!-CQ-wiaZ3hI_Z-56*%l3##3=Qwr&JHgY$@Fu*>!0Vv zy#J{-e_ixPL`zspNFbmxEFd7Nf2)mxC=%m;s?C+w{}_!hEq!=n9v_Ja14fj<^K4qI zP14GcS79|sW)UszG|5EDNim|>fcGiCJo$FG{rG1L>A<+}s;^yS&FOu!jL26JW=f~E zJ)_&g355k+`^;CjQ(ENDMCbT<{rvek?d$F5?eTcN>HB%D?~1q_a_Fw>6@7L!d$+AH-HCW| zqrYrZ|0f~`uaVem)&9Dk4Di@TPnQbpcSIBpGNu_E`_N!|sq8Z~< z+&9AR+HzczTD_AIDvS?Pl!;zx*&L_T!K_)-XuHAir8v~&o~3s2LW3BbALHhv<4EEq!{gVVK$+N%aIqfRiCDxd)ssQGEfNG3HTEGgv-k{?OKImMd zsUBXVf+UhWu9zo}Qw#m@ZMI8FX(E=m-t2TZYpFjXY->5x{?+SX{}_V-TVYKap+n3+WlR&3h7I z7nbm5PjK|z&B?!CU|{--Fz9F295a*08cqxaaa^plyhmZPRl>-eWRNp8;DG5O9y9z~ z(T>YWcIqwvI9~})U8n|kAMuG^ae&}o*Dg~ zyDx`vPt=T*$k*GQz5R(|rE~?;a{J88J{P)COQVQ=sDew7T~ zt9BGSvM47t9uQU6nwp)Q8aBY-9Rji}!2`pN2KvDO8cQAk4s0v7de$5G3hom1k_mL4 z5=P>QD_S~NP}Etz$aiMnZw3ZQRe+>3@*;v_2n#O+EBN42E_S%<06Teug0Inm4BFF+ zYshs8q$WW>ys#)$)1V>_4jlmwb|SOWi#)4T!c7^b2KXUl(5@RE&RPmD$-ZcnKn@D0 z2RSE!6PHPdyU+IeyO%wJ>`$MOn!ZEdu)whILWj{%c4>Sdc}DtFN=%FgY3B)C?SQb#3x zqsBDtM*#Mi$ViNAW8rr7l(ihCzWzOaI*U{O;ltjUHgJtx5i={TAz_fGp>E!mhLT8M zoLirvqDpB_uUncpQJ-{?+n(qZv^ipq-+W~AWHGu=!}Nuc?&nzpwpBF216Mo}OtKF5 z8fJsa)9R;v&&@#~H+uqDCci>VSg2C14Yc5)LjZnR*1|ANLx^ESXuwaHg8B}uELF_& z0?k`$#SL=gLDB6Nwo`ig!AcUvU=PD3SHYQ+NRX7Q3H`nLQ&CqD_57?b8lg36AnO{_ zc}TEadCpFvTIg(g0VA=>f!93Y8@uGXva|%PwrB7L=ap$vz5R+ zhkytjv{_IlnHe`Eg2&r}r5p&lJ5W3)jcXhbKBH{i zINNURTO&b0b!eObsi!bm$71$)Y$W33IYElw((-WHouTxRPDQ9IOrWW03&qNTfX54& zgsG8M!*$r@!O&5ZXm(j1I&JRr)Bc~?dPI4@Q6+D~h#8(OhaqOi;ixZvR7D zvF$b*D!lXy4yAe}a|D<*3mei2*)RFr*Ih_0njy#JVq^7kncqD%@Q4(NZGx(FAK~L{ z{mo44akRBFs{O!mH;u#Nt4KJRjG#opRFgV zWNKcup>nuuG#agamYE@nMUruP&e{|iH**#vbg81QjdqumP0lq(EM~eXN-u{|mb6!} z5tE&r2umM_GzS*$0b%2L>WB4L|F&*zjYG2?B{4B~;_vh2E_cVR-?bGU06;}g9-94o zvbjx)1ZdtD$#)+r2Ogji7d4h$=T7QZI(Zl*gdyp-1DayOBw){S>}mAHDh7)HyBb>~ zg#+zMCpGS?>&PdTo#i-#oJE5%1L2N_;x)&rQyO% z33pb?VwEjI8O#j6NWgeW64`LzmgcZp5TEz!>DKwD65(uT93Q}hSEzwGAgRpDfOKa^ zP(Yw2h6s7eL*m`^*3F?jNCW#=mBO+6djyqodnvB#ej4y`*7h~xxg(DsY*Fbz@vuwO z?<0%-IWsWw@Eq5ZM&8vWCXi4hYIb|uE5zX*&xQvYEOO~HCx_2=L5>AScj?K8REb$> zN}h!0+@-RFGY6oNg#H4>GdEhhy{y0hb`g@2Oi5j^m}|su9x97nk3CYiu_-#rh(!i1 z?!REf&Mo)Vh_R8hY#m&lv7!`>(RxI=fbN(dw$>~EN<0ggf5>u}vr6{~C*MMEGUj5i zlE%z$P-oZHtZ-PAYc)m_4znWUPLe^d483p(@r0$WGyn{_AI}UrFmXSaM|x~Miup2@ zYi#00G;^bK>Pi*JwA2XNI7~Kc5H!{3n`~7xGQ7|}>$uwDJhf`(K`075Sz2t+GV18k z!jVbp$l^|6YJP+fa<0@KQt#rD9+#<89!pA8E3?;!RIo-4vDp+S*4q(9Ol3+yK7?m9 z-UQC4N&^}l@rRhwrxVsiLA6PH5Vthc+^pA`! zjT=61fB2gFo-D&4z+hN>P9T14#I0|veDXdEX+)sBYJ(6f2gDPjWKlt$#JzSZ{WJll z;|xwN^B;^!r51VyUPJs4W~_gEYd|}M`y>P7um%ViHjVJP9FBg=E9le`h}ZXnN}nve zfYX=8oMYJ+_WGBPk7i%Q>xrqWTB^j}bDwvH+EU{ag#}F`F4gXqKmNP%r#Ih;TlDxXoR#jTwLQ&G}>*k$c|n z7OL49|0~blQ4t(ADm-|-@kh6D$Fk%iT|dC_BT(E{3qc1hR84Bd5Qw~|i`AX|7*xsgD7B@0ckqH$YR+Lu&URC$7irVK3t|jJ|1XgBn2jJ5tOdc-g1zz zJYK!~j$79rxO8!anfIcq+ZV$Qc+`F$1C4R*ZVM2_@{GQDddhhUs_fe={Tk*I@di+o zk+k`fmg%Zx#1*i5OctpX>djb139uBnQs++>#LkWR-*IL`ckyX3`s}X7L5WW$++zL- z!ctcDO}usXos4)^$yBq19!tuMjl*7(s8^aY4@A-6Pl`!*-;%AnSPc)=-#>GfbDS)P zC1DaeXdEZb_Zr3EQttm|$Gc#IVgSTV{aD9?6v-``XbE$JpP`|Uc@76zUL#CFhYk^c z-MhSuOpQpKM*Za-O9g>;On-@lLjs3zA%|!Oi3Z^$oJZb8rh{uEhV=0K3*83E&fKeD8GizS~JDs2o6w2Ms9v zBNf`#NMadYSgzJI9~a;Xy;puO6L@R@zd}O6DjZ0?Ob~2hirrpAie6Z1Unz!T>L5-S z&>3j!JnF{yH5?HZBx-bNq9rtwx#9UalIKbkt{+&bx=T8TvYl6PFL~@qk_p-*<2*AT;d>>X`VN z2Zxe!t%qh?q1;&5dAqM<%AO(ou`@{)HN)kRZfGW9M`b!;nEB7BQ!*gzhVqIq)tI2~ zi1!QaWo+#DjdN4@H!1@b=UsJHtSRr;ecb1xdkkZfZFZ=8vpX8Oq3w|9vkWrqJ>FTg z3s`_I&y;&KI4@e;WY8cBPD2BPL4Gc>Rx?Rxe1=`@Ub9^|7_mbU2ck>UWI%&OI}d(h z$}d*{*L0|&(bc*5F*YDE-USjB6*~pJjO&oiA^}c0J~z{Od~qOG?j+qrz_8Wbvr4Og zWC^$d%mQD294sr4=ujQc7q7~1&Msdx_CO_#&J?4uztK4@62|GQ1>oFnv3z;_6tw$M zF&v@+kxFg9^5&=-Ni7>1I_i&Bh!aW-Gj04vboQHEu&NXsP7!c@7FvZx__Mg(0x-t# z`*ZcKq7D|lRzn>kr%a1siIT;k&1|u%$eKmg%q&nyA*Kx>{(#&`CsdN+k~wVkzTIf%)7{hh<6I}G75_rHq@)}M;BPA*R7m_d}PZO)0rTwp_&G3yH+4nu&MjKL7i%<~tt3u!}(w}rw z*dcy$HT-YA!6Bk$S_Xk_Wm}3`-(`YIxX&S}65P^W+LCz8wpW4JbQlBjA=Dy;Q``jE zdfhwQ>xqDJ^VWC?cncy-1N~z~wlhQl!!6C12bO`53j5@T2Gf-%IIM;qBCxu1OMnPp z9pcC*%f}O=(?)^dJ^@f=&MLEkuxGekhKIIsM1O21LBIJpH_VJhfcfNAxsfY%dY1Li zt~o!arSAtCy36TB^Ox#!RQD zijBkuK;R7EUh=t=*4Jg5nN9uN023w|0gGK$DjG+_x1OG$A6=i#WM0=K@lym+dUtwq z++#+-eA#*$;R!mmXPOJeW8UPE{teCpqVkS70?|N_nk_m;rL(DOc^Dtt2pSnKTMhWM zJ`Aw_lWTtJGX&;#T^fzy8E;oAn;8`ks`{#&G{jty?b2<;*;St2S5j`yoJh-irJsd@ z@r)A3cSu3P;tLUZS!+n`>U$(<-UY(b56Ynie1S9QRgstq-qwO&+PbhxrLrZV!03s} z1naCbogc39ZN);@u-X}jqp{BMPkSl~`YT|2x78n9#Q~U9i^kbTtR2BC_9gT*{sz&f;7;`VJ)v`$RguM zI+LAGElb>BcEb0I#>Gb1)Z@*e@W7WQbhkPn5ow9m7n>fRKYRbD$m5=Dn*({qAQk{1 z*jy8A3eA?ZHBDNKFQ52Gt3j6~o9g9zT`mYf)#nv#*Le%b+4Bbz4+NITvxcNMKn;if zuq8T#@6X-Xcs43&193i}5RI}r6Q$o)+_88}*gc~Vqv@M8t796-Um7x1hFuknK+a3N zD^EwF2@SJ`=f^ke)Q~GO(xaMNNd=1XFtqAADY=0wLm0 zzStS}M(YmC32BqxLA-|)9wy6jdcCy+gQQXmhv5B+fz(B*bFy(Py;PWUy@yn|j+{RY z%U0zqwNe?}xq2g9Rt?@z2HKeoi8)5JzQ38{bPrpl1IJ79F(wvKZvcR)akfOk=8Xe2 z;3o`_Q9`NXz3J+swuR%NU3t^c52KNex3(j77L#9d=qMmi!9Jp#h7zrZWUOyqjVapkfd&A3Mn!$nk)7_i&yk?N@7T;~ zt&d)Y-lkLq3Dz@UxYQxw0C%ccyBR(qWPB`7eA!M=b|UvPPE+As7@g`9Dc(`~*8m2TnC1qrorW0uxRYZ|}5s4cc+j z7L<8oRp0VhObO7doH(GPvSXis5-p!8h3NgbVtzkoQ1*~3uef^?&t`}@C~TzDkRKRx zOJ?4`a8DtM zI+a}~_>5eFsp;nsb*+sx*kdQCWY39q7pLqRClf6=<1iN8gfnSzp%r0CM-&Ao9W6S8 zm0#0I#9%~V-_S`}mJ9Ug(Il$>N-wHW$EnzGZzPKC4-Fk5g5m%1vSi$NN7HpF@Z$4z zD|loGhyi?T}^@<>s$#$uMSQi0m` zWi_9ZB~}U7&YFe+{pjVXKPeLr{b?Y56vJLrKmec=lVOzf&3bZ+>0mSKY#@L`Ll`&QCqD(kX;;$AXPCk)YfC1 zg)!)ZWQr|fl&xqC2qb(#w=P|ZQ#G0b08~@>7rZ}F2PKSS+_~$|1gQbAnwLLAK z_o2a-VEWgS@te}MY)+he)IQX75NVWL)-rb4IxRay#@YwkdrPJJdq#`B=S1ia=|Sh?)l6bfd~yKV z_;&ZBu_jH0>QQ|OAGRPR>R6X(;HtF#hd-%bL;W*}aHw_*-ioQoQN4){H-d4BvvW!0 zupb*i9}KbJblpWsHcI-asAo-AkMBv&9_m}xz`)23ZvytH$}4dPxvN?9R!x!QcyB5! z*85v>mUc&_sM|H2lX_{5oHYG%BQ_umIm|9mQ$h)Mzu=p}e2gk2I9u4^F|Cgh;#|KC zF3wSnz>~D1iZ$+HF{`z~>avzENpgF=_E+^><*!6q2lEg#n0g0ew<5iJHXgt0THo<3 z3KL2fUgYwOQQyz{s?Lk{PB{Q<4s>l#8`cCrZwiGC)QV(Gs#Z zqdY-?gpH2HQdNd~?E$~a!>-VrTSGZ(VfeC6TfYL@AQeb^5Wt?N?N8I^z}7!4q!Zfq zlH>PH$nKYG?(sZmMUP<5`ex^uqn=|e!-4g{No92{ClE{LTYS8LGGJ)VripE&e1Uw% zMfjSp^UN?C0_1C)(jO;v5Mbz)Ov+0LIIHEi4tUMcO_fN`=_f0gWHF`tT{dh^+U{2d zu13}R1*up@RewB8PBa7c#^_Lwxw%?8jQPIjO-%!EKow_ujQM^To2JxNLGuqJSdiz) zlV=4UmcTc<$7DHml2q>LQ%mlq8$}rXXdl|WX4x)QqxvJ=*vg2e1JKh*O>=TVN(eJU zTogqyl9Zcm^XY1LCls5ZYHk&TWXeXZlaH`gPCdLszSL06rEuSyGTb%^e8%Jq1XpU9 zps`4YfLh5j=!ePk2UEAIG3?V+Ue4{6Q!@hc9~0B!O>1kv{kSl9U{d%aG_tK8=IX^$ z>KbhLp-vC{^9FaP51?&mQv)E~;j!?*=BW6-l)S?1(T`nFXK*^aeJmfP81(cO@SE+v z)l>^CYKw>9vDi252hq4CvqSXx zet%Dv{zY4HK95;9@!`Je>?s7Bsk>2q5hqn&>*$1Zg;|c%3`j@}C_TNxWc)a}FI%Ba z`dZ4mywYAwn_|>`o*_ii*zo9#-tTrP*yztxN%SKU#jllVc&|Zn0|k}*-L>h9)>2?} zdF82qH-oAKNGHCg9}Z7WL+FUIcT4wj`YzwR2s}uiM}8W|Xw;t!w9^Oaq{;-mT9O#z z#VU;=e@}nz0`5=-pmC|IavHG@p%M<~X!N?PI@xNFo@+m=|CyD{D`n)`(I1BQJuvY_ znIg%zbcBOdk4!wJcqi)uDk+KTABqCNiCAbz`|?RX2zwj%F;AcYt54J=ce=2rcS{%o z456x_w(xUsQ$O#*lK(t&@_bi~eEb)@4*PSI^e(G;`jJ36z(An{IB#2;*OixI|M|b%P7dFBULly^4}GtLLvGC1OEs z-nwPaD|hx#V%`;5G*}pWRgVU;F~8G&BGsYml=?Ib{$Q|ZRw(s9+i(Q7{FLLj3a z?zSFzpB*l!0gxhllTO`1Gr^&~Edui3$r0s>fF)K>9qIJ+JO5)0rix0p6_*1{= zBn)Q+Qe}Z7TAyF{6VkoGe3A1cWc&OUv~pp z&plzaGt-^$dg#=KGeR`IOfjFgTd&eDXAh!4Sy@IqMqXh0o1eWK{+&i`;_)TO&m3Mn z62@?+^?$7BViI4|2mHwws*q@M;qgt-%CoW=m5XsGO%4;~uIZHH2eEAcE>=DV>s8?< z&O;j_cY)ldhtfmI;Y{8tawAk0;DaALWJH37 zy~vBaTRB@@C-0012y0Y;{-TO!e#K(w5^$az|M<)eOzLsSZO&Q^Cw4}a@Y6#cw^U@f zQ#iwit_|M?Q)cw>mCzemP9AvL9WFaQGQ#r1Zfn5MlLM#!%?>hQ^`q!mwq#)Y_@PJ{ z)vwHFn-`qDHBnF;ex_5$sBUdH+c`swpNeAw@D6R9LpSVwTMinwcewf$0mPyawMBmD6N!_8^pWU#ZG^htO7D;%A z?-=23xTnD=vHlo<7NRWLE>IqWG)&SyC~+8hlN(eVBxT67)H(YCuSRIWXD)Y;A65Ri zq+|JF2eK!9c++=Y%gepj3K_$Q7B%CEc70Jwap8fuR$uDjx%%L|P0Q z#UU~`;$crlK&f-p;}zTy4~=d4L=jdv)2dre564h&-f29$Im|jF+d5Me^yrJ|vd4NG zi?+`n?Zqkp5&JEH{(#Vq!YrW+ zbUbyZbtsh?UYTgzzd>e3-FozJ_oP18Js(*sjm?zJ=2l4@<_;-SwSqV*8n-v=)$ivE zQKJmB-E8I@1(`iNx3gI-Pg_}RPd#nFsI(c%DNk7e2&s1POn@i2j=f(F%f(N^nqf%z zYM>Rp1+}lB12p00lBV=SbHASRQJ0NT&slNZtdu7TDKS3ltYjTy`wVeXFLlwh78_4B zqd4&INM-GH9-_oIFq-Mlvy!Nv#nKL3)UL5lLrW%Pq*9CT*UnFwj_~+8l`rf!e-|xo zGS>wGs0Aiaf8BzenaH&Ye(a`WB5x<8z4_vpn-XMp*spEE87^&}B)(kN#J#nwU!<(4 z!~ObQTgYe@DL|tkw{82Rk~CmmK??Y;;O`aEteF$5;4ibz(s+8j2O<=$<)~7l@#|vA zn(2CT$53RI2yH!gobyyobkB(KT$joh4;iXXigkt>TNg6lGWBKrTf4yOMmA2FK ze_S2PMQZ#l0>2{P|GRWp67%2D@Y9%lP~`tC#(1uY_dUV^0Z|JA0WtnN=|kiOnbezr z^lxFf!nJnY7=C1BPWrA(C529=R!PJ!C8l@BTdH1I$Brv8qu_@C4U|PehRW}qZz?Q1 zXlh@_Qz(_3{w0k|`5MnHWfbXfYkUSe_N4lsDx%p0-M%DKvT~7fK~;R|RV@Q!c+Meu{j*Ft<~0G*~G)C$?tP{61?HVI8PlmMX@?ZMoGxu_1i~**YnTEc=+STQF!_z6C{9c@eUA!MzTZil(sl3o7y)75vnk?2{>4>QrR|pO! zP8PA>Zs44QihFKut7KKFRVUW6!GjWk4X)*S9&FGOexhnb7)zofMaaYgvdjeO`c6jF zQf+|y;dFl1txQC`4owSrJ=hO8Nb8Q;lxgaKg_&I7i z24(M6wK|i7*H6xLu8N6C-j+LbIzK(wPnt)Ailv^;YqBOV82TDe*e2IN^#G!2JUS-D zVcA9_Eg`~hgkB7NqQ${vNlZnmodh? zPhheLO6MrO7cp{?9|{YhwxGST!cGNC4PwIb>b&f%rL|wKn+qT(d+cvvw+tyn~mu*{Jwr$(C?W)@|-^9d? zdo%x?I1%|PBlcQ*?Pt$3k^QDeO~*XXJJO;{BsDO*)0x_DV`QHRVe)J@c5-QW&Bi?* zVR4Yn!Q+UuH%+sr4I4QmDBNYP-AwCVX4Iw#>P8TmG}fUaqpF=G8)m6Zj3uk&H+7!+6aH=ka16_I{y{MvlETHB!gg8(~@` zRPPI3P5RUGsLVYcZ6(PUqzQe50wVG|xT=2RX+sMi5Th)ZkROlMpA4;~QXa=QMV(hS z*MSjfJgSE=&`@5Km)T+C6Nq4=y5Q`cu~uzYSRnaM*~W^nw+=*p zJAF6?ppeHk~SnvDDj6fQ-ilj%hF*!RX*5PPj^V%`A zzt%T;`s}hL;R!AmAA~Q+_x5PW^KJ*OZ0jrq@L7;f&}(W4@4$JI>=-;sjqh8v%Zyic zwoq?46{K6q-Y4PAl^kC5bRZpaa_h_cLDesA-z<|$Y~gdKF5bawWAgSCU)X>5(P^$d zx8Vkk_t}TNPFXaaw`wpQmO^xxLXv&#ljt^!G<6h3{vvP8Nl-6`oLUlccAeD$k0dq& zP|XC!bc?g8bD&m5Lc*_Yp#=m{T<1k>7^9{}xd00<{k$vqc-^jb1hx3>^gJ$2apVwm zzVCb&ugDx8XXYa6b=UhIOntMcHw(Pg1Kw)zngCBjeGfI8?T<΅yQZH28&h#pSuQHD;QW`tVE9JAv*FOnu^`tdEalS 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

dke)I*$GB2Mz1BcF3*cRu`IsbTX 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 ibMWzTbFp)qnQ%R1XE)+DF*h;i Date: Wed, 12 Nov 2014 19:38:18 -0500 Subject: [PATCH 8/8] Fix previous version of patches/wxwidgets-3.0.2_macosx_yosemite.patch. --- patches/wxwidgets-3.0.2_macosx_yosemite.patch | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/patches/wxwidgets-3.0.2_macosx_yosemite.patch b/patches/wxwidgets-3.0.2_macosx_yosemite.patch index 9f1f47593a..1746d228bb 100644 --- a/patches/wxwidgets-3.0.2_macosx_yosemite.patch +++ b/patches/wxwidgets-3.0.2_macosx_yosemite.patch @@ -1,7 +1,22 @@ -=== added file 'patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch' ---- patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch 1970-01-01 00:00:00 +0000 -+++ patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch 2014-10-29 18:17:55 +0000 -@@ -0,0 +1,11 @@ +=== modified file 'patches/wxwidgets-3.0.2_macosx_yosemite.patch' +--- patches/wxwidgets-3.0.2_macosx_yosemite.patch 2014-11-04 19:24:22 +0000 ++++ patches/wxwidgets-3.0.2_macosx_yosemite.patch 2014-11-12 01:54:50 +0000 +@@ -1,15 +1,11 @@ +-=== added file 'patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch' +---- patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch 1970-01-01 00:00:00 +0000 +-+++ patches/wxwidgets-3.0.2_macosx_yosemite_webview_webkit.mm.patch 2014-10-29 18:17:55 +0000 +-@@ -0,0 +1,11 @@ +-+--- src/osx/webview_webkit.mm.orig 2014-09-16 07:27:52.000000000 -0600 +-++++ src/osx/webview_webkit.mm 2014-09-16 07:28:12.000000000 -0600 +-+@@ -28,7 +28,7 @@ +-+ #include "wx/hashmap.h" +-+ #include "wx/filesys.h" +-+ +-+-#include +-++#include +-+ #include +-+ #include +-+ +--- src/osx/webview_webkit.mm.orig 2014-09-16 07:27:52.000000000 -0600 ++++ src/osx/webview_webkit.mm 2014-09-16 07:28:12.000000000 -0600 +@@ -28,7 +28,7 @@ @@ -13,3 +28,4 @@ + #include + #include + +