diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index ed82e7d..52b11d2 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -824,7 +824,7 @@ void ImGuiVisitor::visit (SharpenFilter& f) oss << "Blur "; // Method selection - if (ImGuiToolkit::IconButton(7, 16)) { + if (ImGuiToolkit::IconButton(2, 1)) { f.setMethod( 0 ); oss << SharpenFilter::method_label[0]; Action::manager().store(oss.str()); diff --git a/ImageFilter.cpp b/ImageFilter.cpp index 3fc2623..0660f4a 100644 --- a/ImageFilter.cpp +++ b/ImageFilter.cpp @@ -614,6 +614,15 @@ void SharpenFilter::setMethod(int method) setProgram( programs_[ (int) method_] ); } +void SharpenFilter::draw (FrameBuffer *input) +{ + // Default + if (method_ == SHARPEN_INVALID) + setMethod( SHARPEN_MASK ); + + ImageFilter::draw( input ); +} + void SharpenFilter::accept (Visitor& v) { FrameBufferFilter::accept(v); diff --git a/ImageFilter.h b/ImageFilter.h index 862d9b8..4fab3dc 100644 --- a/ImageFilter.h +++ b/ImageFilter.h @@ -157,6 +157,7 @@ public: // implementation of FrameBufferFilter Type type() const override { return FrameBufferFilter::FILTER_SHARPEN; } + void draw (FrameBuffer *input) override; void accept (Visitor& v) override; private: diff --git a/SessionCreator.cpp b/SessionCreator.cpp index 0be6ff4..7409ff3 100644 --- a/SessionCreator.cpp +++ b/SessionCreator.cpp @@ -1249,6 +1249,30 @@ void SessionLoader::visit (BlurFilter& f) f.setProgramParameters(filter_params); } +void SessionLoader::visit (SharpenFilter& f) +{ + int m = 0; + xmlCurrent_->QueryIntAttribute("method", &m); + f.setMethod(m); + + std::map< std::string, float > filter_params; + XMLElement* parameters = xmlCurrent_->FirstChildElement("parameters"); + if (parameters) { + XMLElement* param = parameters->FirstChildElement("uniform"); + for( ; param ; param = param->NextSiblingElement()) + { + float val = 0.f; + param->QueryFloatAttribute("value", &val); + const char * name; + param->QueryStringAttribute("name", &name); + if (name) + filter_params[name] = val; + } + } + + f.setProgramParameters(filter_params); +} + void SessionLoader::visit (ImageFilter& f) { const char * filter_name; diff --git a/SessionCreator.h b/SessionCreator.h index dd4475b..16fbe0b 100644 --- a/SessionCreator.h +++ b/SessionCreator.h @@ -65,6 +65,7 @@ public: void visit (FrameBufferFilter&) override; void visit (DelayFilter&) override; void visit (BlurFilter&) override; + void visit (SharpenFilter&) override; void visit (ImageFilter&) override; // callbacks diff --git a/SessionVisitor.cpp b/SessionVisitor.cpp index 232feb1..8ea35ff 100644 --- a/SessionVisitor.cpp +++ b/SessionVisitor.cpp @@ -710,6 +710,22 @@ void SessionVisitor::visit (BlurFilter& f) } } +void SessionVisitor::visit (SharpenFilter& f) +{ + xmlCurrent_->SetAttribute("method", (int) f.method()); + + std::map< std::string, float > filter_params = f.program().parameters(); + XMLElement *parameters = xmlDoc_->NewElement( "parameters" ); + xmlCurrent_->InsertEndChild(parameters); + for (auto p = filter_params.begin(); p != filter_params.end(); ++p) + { + XMLElement *param = xmlDoc_->NewElement( "uniform" ); + param->SetAttribute("name", p->first.c_str() ); + param->SetAttribute("value", p->second ); + parameters->InsertEndChild(param); + } +} + void SessionVisitor::visit (ImageFilter& f) { xmlCurrent_->SetAttribute("name", f.program().name().c_str() ); diff --git a/SessionVisitor.h b/SessionVisitor.h index 1fb974f..050dfc4 100644 --- a/SessionVisitor.h +++ b/SessionVisitor.h @@ -73,6 +73,7 @@ public: void visit (FrameBufferFilter&) override; void visit (DelayFilter&) override; void visit (BlurFilter&) override; + void visit (SharpenFilter&) override; void visit (ImageFilter&) override; // callbacks