diff --git a/.gitignore b/.gitignore index dc439eb..26e490a 100644 --- a/.gitignore +++ b/.gitignore @@ -181,6 +181,7 @@ synfig-studio/po/synfigstudio.pot synfig-studio/po/stamp-it synfig-studio/src/gui/synfigstudio synfig-studio/synfigstudio-thumbnailer.schemas +synfig-studio/tmpwrk* synfig-studio/org.synfig.SynfigStudio.desktop # ------------------------------------------------------------------------ diff --git a/synfig-studio/src/gui/canvasview.cpp b/synfig-studio/src/gui/canvasview.cpp index a8de873..951db71 100644 --- a/synfig-studio/src/gui/canvasview.cpp +++ b/synfig-studio/src/gui/canvasview.cpp @@ -189,12 +189,16 @@ using namespace studio; class studio::CanvasViewUIInterface : public UIInterface { CanvasView *view; - +private: + float cur_progress = 0.0; public: CanvasViewUIInterface(CanvasView *view): view(view) - { view->statusbar->push(_("Idle")); } + { + view->statusbar->push(_("Idle")); + view->progressbar->hide(); + } ~CanvasViewUIInterface() { } virtual Response confirmation( @@ -298,6 +302,26 @@ public: virtual bool amount_complete(int current, int total) { + float temp = (float)current/(float)total; + + if(temp >= 1.0) + { + view->statusbar->show(); + view->progressbar->hide(); + } + + else if(fabs(temp-cur_progress) >= 0.01) + { + cur_progress = temp; + view->statusbar->hide(); + view->progressbar->show(); + view->progressbar->set_fraction(cur_progress); + studio::App::process_all_events(); + return true; + } + + + if(!view->is_playing()) { if(!view->working_depth) @@ -528,6 +552,7 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlepack_start(*separator, false, true); controls->pack_start(*jackdial, false, true); controls->pack_start(*statusbar, true, true); - //controls->pack_start(*progressbar, true, true); + controls->pack_start(*progressbar, true, true); controls->pack_start(*widget_interpolation, false, true); controls->pack_start(*keyframedial, false, true); controls->pack_start(*space, false, true); diff --git a/synfig-studio/src/gui/canvasview.h b/synfig-studio/src/gui/canvasview.h index 4196908..d0e8d7f 100644 --- a/synfig-studio/src/gui/canvasview.h +++ b/synfig-studio/src/gui/canvasview.h @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -299,6 +300,8 @@ private: Gtk::TreeRow children_valuenode_row; Gtk::Statusbar *statusbar; + Gtk::ProgressBar *progressbar; + Gtk::Button *closebutton; Gtk::Button *stopbutton; Gtk::ToggleToolButton *background_rendering_button; diff --git a/synfig-studio/src/gui/dialogs/vectorizersettings.cpp b/synfig-studio/src/gui/dialogs/vectorizersettings.cpp index ff68329..f29579b 100644 --- a/synfig-studio/src/gui/dialogs/vectorizersettings.cpp +++ b/synfig-studio/src/gui/dialogs/vectorizersettings.cpp @@ -35,7 +35,7 @@ #include #include #include -#include "onemoment.h" +#include /* === U S I N G =========================================================== */ @@ -209,13 +209,7 @@ VectorizerSettings::VectorizerSettings(Gtk::Window& parent,etl::handleadd(*Outline_setting_grid); //---------------------------------------------------------------------------------// - get_vbox()->pack_start(Separator, Gtk::PACK_SHRINK); - get_vbox()->pack_start(ProgressBar, Gtk::PACK_SHRINK, 5); - ProgressBar.set_margin_right(10); - ProgressBar.set_margin_left(10); - ProgressBar.set_text("Not started"); - ProgressBar.set_show_text(true); - + Gtk::Button *convert_button(manage(new class Gtk::Button("_Convert",true))); convert_button->set_tooltip_text("Perform vectorization"); convert_button->show(); @@ -261,18 +255,6 @@ VectorizerSettings::on_comboboxtext_mode_changed() } } -void -VectorizerSettings::on_finished() -{ -} - -void -VectorizerSettings::set_progress(float value) -{ - float r = value/100.0; - ProgressBar.set_text( strprintf( "%.1f%%", value )); - ProgressBar.set_fraction(r); -} void VectorizerSettings::savecurrconfig() @@ -288,15 +270,13 @@ void VectorizerSettings::on_convert_pressed() { hide(); - OneMoment one_moment; - one_moment.show(); synfigapp::Action::Handle action(synfigapp::Action::create("Vectorization")); - std::cout<<"Action Created \n"; + synfig::debug::Log::info("","Action Created "); assert(action); if(!action) return; savecurrconfig(); - std::cout<<"Action Asserted \n"; + synfig::debug::Log::info("","Action Asserted "); // Add an if else to pass param according to outline /centerline action->set_param("image",synfig::Layer::Handle::cast_dynamic(layer_bitmap_)); action->set_param("mode","centerline"); @@ -313,13 +293,11 @@ VectorizerSettings::on_convert_pressed() if(etl::handle paste = etl::handle::cast_dynamic(reference_layer_)) { - std::cout<<"image inside group layer clicked\n"; canvas = layer_bitmap_->get_canvas()->parent(); action->set_param("reference_layer",reference_layer_); } else { - std::cout<<"image switch layer clicked\n"; canvas = layer_bitmap_->get_canvas(); } @@ -327,18 +305,17 @@ VectorizerSettings::on_convert_pressed() action->set_param("canvas", canvas); action->set_param("canvas_interface", canvas_interface); - std::cout<<"Action param passed \n"; + synfig::debug::Log::info("","Action param passed "); if(!action->is_ready()) { return; } - std::cout<<"Action is ready \n"; + synfig::debug::Log::info("","Action is ready "); if(!instance->perform_action(action)) { return; } - std::cout<<"Convert Pressed...."; - one_moment.hide(); + synfig::debug::Log::info("","Convert Pressed...."); } void diff --git a/synfig-studio/src/gui/dialogs/vectorizersettings.h b/synfig-studio/src/gui/dialogs/vectorizersettings.h index 04f0082..8cbbeb0 100644 --- a/synfig-studio/src/gui/dialogs/vectorizersettings.h +++ b/synfig-studio/src/gui/dialogs/vectorizersettings.h @@ -82,7 +82,6 @@ class VectorizerSettings : public Gtk::Dialog Gtk::Grid *Outline_setting_grid = manage(new Gtk::Grid()); Gtk::Grid *Centerline_setting_grid = manage(new Gtk::Grid()); - Gtk::ProgressBar ProgressBar; Gtk::Separator Separator; Gtk::ComboBoxText comboboxtext_mode; @@ -97,7 +96,6 @@ public: VectorizerSettings(Gtk::Window& parent, etl::handle my_layer_bitmap, etl::handle selected_instance,std::unordered_map & configmap,etl::handle reference_layer); ~VectorizerSettings(); - void set_progress(float value); // CenterlineConfiguration getCenterlineConfiguration() const; // NewOutlineConfiguration getOutlineConfiguration(double weight) const; @@ -124,7 +122,6 @@ private: void on_convert_pressed(); void on_cancel_pressed(); void savecurrconfig(); - void on_finished(); }; // END of class VectorizerSettings }; // END of namespace studio diff --git a/synfig-studio/src/synfigapp/actions/vectorization.cpp b/synfig-studio/src/synfigapp/actions/vectorization.cpp index 04f0a39..4c83d90 100644 --- a/synfig-studio/src/synfigapp/actions/vectorization.cpp +++ b/synfig-studio/src/synfigapp/actions/vectorization.cpp @@ -197,7 +197,6 @@ Action::Vectorization::set_param(const synfig::String& name, const Action::Param if(name=="maxthickness" && param.get_type() == Param::TYPE_INTEGER) { maxthickness = param.get_integer(); - std::cout<<"vectorization action maxthickness :"<get_canvas()->get_root()->rend_desc().get_gamma(); + // result of vectorization (vector of outline layers) + Gamma gamma = layer->get_canvas()->get_root()->rend_desc().get_gamma(); gamma.invert(); - // result of vectorization (vector of outline layers) - std::vector< etl::handle > Result = vCore.vectorize(image_layer, configuration, gamma); + const etl::handle ui_interface = get_canvas_interface()->get_ui_interface(); + std::vector< etl::handle > Result = vCore.vectorize(image_layer,ui_interface, configuration, gamma); synfig::Canvas::Handle child_canvas; child_canvas=synfig::Canvas::create_inline(layer->get_canvas()); - new_layer->set_description("Vectorized "+layer->get_description()); new_layer->set_param("canvas",child_canvas); int move_depth = 0; @@ -280,7 +279,7 @@ Action::Vectorization::perform() get_canvas_interface()->signal_layer_inserted()(new_layer,0); get_canvas_interface()->signal_layer_moved()(new_layer,move_depth-1,get_canvas()); } - + //ui_interface->amount_complete(2,1);//just to hide the progress bar } void diff --git a/synfig-studio/src/synfigapp/actions/vectorization.h b/synfig-studio/src/synfigapp/actions/vectorization.h index 93d9085..84bc045 100644 --- a/synfig-studio/src/synfigapp/actions/vectorization.h +++ b/synfig-studio/src/synfigapp/actions/vectorization.h @@ -26,7 +26,6 @@ #define __SYNFIG_APP_ACTION_VECTORIZATION_H /* === H E A D E R S ======================================================= */ - #include #include #include "vectorizer/centerlinevectorizer.h" diff --git a/synfig-studio/src/synfigapp/vectorizer/centerlinepolygonizer.cpp b/synfig-studio/src/synfigapp/vectorizer/centerlinepolygonizer.cpp index e8244ac..299b12a 100644 --- a/synfig-studio/src/synfigapp/vectorizer/centerlinepolygonizer.cpp +++ b/synfig-studio/src/synfigapp/vectorizer/centerlinepolygonizer.cpp @@ -870,7 +870,6 @@ inline void reduceBorders(BorderList &borders, Contours &result,bool ambiguities void studio::polygonize(const etl::handle &ras, Contours &polygons, VectorizerCoreGlobals &g) { - std::cout<<"Welcome to polygonize\n"; BorderList *borders; diff --git a/synfig-studio/src/synfigapp/vectorizer/centerlineskeletonizer.cpp b/synfig-studio/src/synfigapp/vectorizer/centerlineskeletonizer.cpp index 174d0bf..18f4b38 100644 --- a/synfig-studio/src/synfigapp/vectorizer/centerlineskeletonizer.cpp +++ b/synfig-studio/src/synfigapp/vectorizer/centerlineskeletonizer.cpp @@ -175,10 +175,7 @@ public: // NOTE: Timeline construction contains the most complex part of // vectorization; - // progress bar partial notification happens there, so thisVectorizer's signal - // emission methods must be passed and used. - void build(ContourFamily &polygons, VectorizationContext &context, - VectorizerCore *thisVectorizer); + void build(ContourFamily &polygons, VectorizationContext &context); }; //========================================================================== @@ -612,8 +609,7 @@ public: //-------------------------------------------------------------------------- -void Timeline::build(ContourFamily &polygons, VectorizationContext &context, - VectorizerCore *thisVectorizer) { +void Timeline::build(ContourFamily &polygons, VectorizationContext &context) { unsigned int i, j, current; std::vector nodesToBeTreated(context.m_totalNodes); synfig::Point3 momentum, ray; @@ -634,13 +630,12 @@ void Timeline::build(ContourFamily &polygons, VectorizationContext &context, for (i = 0; i < nodesToBeTreated.size(); ++i) { // Break calculation at user cancel press + /* To be uncommented if isCanceled is needed in future if (thisVectorizer->isCanceled()) break; - + */ Event currentEvent(nodesToBeTreated[i].m_node, &context); // Notify event calculation - // if (!nodesToBeTreated[i].m_node->hasAttribute(ContourNode::LINEAR_ADDED)) - // thisVectorizer->emitPartialDone(); if (currentEvent.m_type != Event::failure && currentEvent.m_height < maxThickness) @@ -1592,8 +1587,7 @@ inline void Event::processSpecialEvent() //------------------------------- static SkeletonGraph *skeletonize(ContourFamily ®ionContours, - VectorizationContext &context, - VectorizerCore *thisVectorizer) { + VectorizationContext &context) { SkeletonGraph *output = context.m_output = new SkeletonGraph; context.prepareContours(regionContours); @@ -1607,8 +1601,10 @@ static SkeletonGraph *skeletonize(ContourFamily ®ionContours, if (maxThickness > 0.0) // if(!currConfig->m_outline) { Timeline &timeline = context.m_timeline; - timeline.build(regionContours, context, thisVectorizer); + + /* To be uncommented in case isCanceled is needed in future + timeline.build(regionContours, context, thisVectorizer); if (thisVectorizer->isCanceled()) { // Bailing out while (!timeline.empty()) timeline.pop(); @@ -1620,7 +1616,8 @@ static SkeletonGraph *skeletonize(ContourFamily ®ionContours, context.m_linearEdgesHeap.clear(); return output; - } + }*/ + timeline.build(regionContours, context); // Process timeline while (!timeline.empty()) { @@ -1685,12 +1682,11 @@ static SkeletonGraph *skeletonize(ContourFamily ®ionContours, //-------------------------------------------------------------------------- -SkeletonList* studio::skeletonize(Contours &contours, VectorizerCore *thisVectorizer, - VectorizerCoreGlobals &g) { +SkeletonList* studio::skeletonize(Contours &contours, const etl::handle &ui_interface, VectorizerCoreGlobals &g) { VectorizationContext context(&g); SkeletonList *res = new SkeletonList; - unsigned int i, j; + unsigned int i, j,contours_size = contours.size(); // Find overall number of nodes unsigned int overallNodes = 0; @@ -1698,12 +1694,14 @@ SkeletonList* studio::skeletonize(Contours &contours, VectorizerCore *thisVector for (j = 0; j < contours[i].size(); ++j) overallNodes += contours[i][j].size(); - //thisVectorizer->setOverallPartials(overallNodes); - - for (i = 0; i < contours.size(); ++i) { - res->push_back(skeletonize(contours[i], context, thisVectorizer)); - if (thisVectorizer->isCanceled()) break; + for (i = 0; i isCanceled()) break; + */ + res->push_back(skeletonize(contours[i], context)); + float partial = 30.0 + ((i/(float)contours_size)*30.0); + ui_interface->amount_complete(partial,100); } return res; diff --git a/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.cpp b/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.cpp index bcb753c..ca8e760 100644 --- a/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.cpp +++ b/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.cpp @@ -32,6 +32,7 @@ #include "centerlinevectorizer.h" #include "polygonizerclasses.h" #include +#include #endif /* === U S I N G =========================================================== */ @@ -64,9 +65,12 @@ inline void deleteSkeletonList(SkeletonList *skeleton) { //************************ // takes two arguments ( image layer handle, config ) -std::vector< etl::handle > VectorizerCore::centerlineVectorize(etl::handle &image, const CenterlineConfiguration &configuration, const Gamma &gamma) + +std::vector< etl::handle > +VectorizerCore::centerlineVectorize(etl::handle &image,const etl::handle &ui_interface, +const CenterlineConfiguration &configuration,const Gamma &gamma) { - std::cout<<"Inside CenterlineVectorize\n"; + synfig::debug::Log::info("","Inside CenterlineVectorize"); VectorizerCoreGlobals globals; globals.currConfig = &configuration; @@ -74,92 +78,59 @@ std::vector< etl::handle > VectorizerCore::centerlineVectorize(et // Extracts a polygonal, minimal yet faithful representation of image contours Contours polygons; studio::polygonize(image, polygons, globals); -// for (int i = 0; i < polygons.size(); ++i) -// { -// for (int j = 0; j < polygons[i].size(); ++j) -// { -// for (int k = 0; k < polygons[i][j].size(); ++k) -// { -// std::cout<<"i= "<amount_complete(3,10); + // step 3 // The process of skeletonization reduces all objects in an image to lines, // without changing the essential structure of the image. - - // Most time-consuming part of vectorization, 'this' is passed to inform of - // partial progresses - SkeletonList *skeletons = studio::skeletonize(polygons, this, globals); - - // for (SkeletonList::iterator currGraphPtr = skeletons->begin(); currGraphPtr != skeletons->end(); ++currGraphPtr) - // { - // std::cout<<"Skeleton data\n"; - // SkeletonGraph &currGraph = **currGraphPtr; - // std::cout<<"Link Count :"<operator[](0) <<", "<operator[](1)<<", " - // <operator[](2)<<"\n"; - - // } - // } - + SkeletonList *skeletons = studio::skeletonize(polygons,ui_interface, globals); + ui_interface->amount_complete(6,10); + /* To be uncommented if isCanceled is needed in future if (isCanceled()) { // Clean and return 0 at cancel command deleteSkeletonList(skeletons); std::cout<<"CenterlineVectorize cancelled\n"; } - + */ // step 4 // The raw skeleton data obtained from StraightSkeletonizer // class need to be grouped in joints and sequences before proceeding further studio::organizeGraphs(skeletons, globals); + ui_interface->amount_complete(8,10); -// // junctionRecovery(polygons); //Da' problemi per maxThickness > sortibleResult; -// TVectorImageP result; // step 5 // Take samples of image colors to associate each sequence to its corresponding // palette color //studio::calculateSequenceColors(image, globals); // Extract stroke colors here -// // step 6 -// // Converts each forward or single Sequence of the image in its corresponding Stroke. + // step 6 + // Converts each forward or single Sequence of the image in its corresponding Stroke. studio::conversionToStrokes(sortibleResult, globals, image); + ui_interface->amount_complete(9,10); + deleteSkeletonList(skeletons); return sortibleResult; } -std::vector< etl::handle > VectorizerCore::vectorize(const etl::handle &img, const VectorizerConfiguration &c, const Gamma &gamma) +std::vector< etl::handle > +VectorizerCore::vectorize(const etl::handle &img,const etl::handle &ui_interface, const VectorizerConfiguration &c, const Gamma &gamma) { std::vector< etl::handle > result; if (c.m_outline) { - std::cout<<"newOutlineVectorize called/n"; - // vi = newOutlineVectorize(img, static_cast(c), plt); return result; } else { Handle img2(img); - result = centerlineVectorize(img2, static_cast(c), gamma); - std::cout<<"After centerlineVectorize result.size(): "<(c), gamma); + ui_interface->amount_complete(10,10); + return result; } diff --git a/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.h b/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.h index 2c834f8..50577af 100644 --- a/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.h +++ b/synfig-studio/src/synfigapp/vectorizer/centerlinevectorizer.h @@ -29,6 +29,7 @@ #include #include #include +#include /* === M A C R O S ========================================================= */ /* === T Y P E D E F S ===================================================== */ @@ -69,10 +70,10 @@ public: /*!Calls the appropriate technique to convert \b image to vectors depending on c.*/ - std::vector< etl::handle > vectorize(const etl::handle &image, const VectorizerConfiguration &c, const synfig::Gamma &gamma); + std::vector< etl::handle > vectorize(const etl::handle &image, const etl::handle &ui_interface,const VectorizerConfiguration &c,const synfig::Gamma &gamma); private: - std::vector< etl::handle > centerlineVectorize(Handle &image, const CenterlineConfiguration &configuration, const synfig::Gamma &gamma); + std::vector< etl::handle > centerlineVectorize(Handle &image,const etl::handle &ui_interface, const CenterlineConfiguration &configuration, const synfig::Gamma &gamma); }; diff --git a/synfig-studio/src/synfigapp/vectorizer/polygonizerclasses.h b/synfig-studio/src/synfigapp/vectorizer/polygonizerclasses.h index a66169e..0dbc63f 100644 --- a/synfig-studio/src/synfigapp/vectorizer/polygonizerclasses.h +++ b/synfig-studio/src/synfigapp/vectorizer/polygonizerclasses.h @@ -435,7 +435,7 @@ const int infinity = 1000000; // just a great enough number void polygonize(const etl::handle &ras, Contours &polygons,VectorizerCoreGlobals &g); -SkeletonList *skeletonize(Contours &contours, VectorizerCore *thisVectorizer, VectorizerCoreGlobals &g); +SkeletonList *skeletonize(Contours &contours,const etl::handle &ui_interface, VectorizerCoreGlobals &g); void organizeGraphs(SkeletonList *skeleton, VectorizerCoreGlobals &g);