/* */ /* Copyright (C) 2014 Ferrero Andrea This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* These files are distributed with PhotoFlow - http://aferrero2707.github.io/PhotoFlow/ */ #include #include #include #include "convert_colorspace.hh" #include "icc_transform.hh" #include "gaussblur.hh" #include "guided_filter.hh" #include "shadows_highlights.hh" PF::ShadowsHighlightsPar::ShadowsHighlightsPar(): OpParBase(), method("method",this,PF::SHAHI_GAUSSIAN,"SHAHI_GAUSSIAN","gaussian"), shadows("shadows",this,50), highlights("highlights",this,-50), wp_adjustment("wp_adjustment",this,0), radius("radius",this,100), threshold("threshold",this,0.075), compress("compress",this,50), sh_color_adjustment("sh_color_adjustment",this,100), hi_color_adjustment("hi_color_adjustment",this,50), in_profile( NULL ) { method.add_enum_value(PF::SHAHI_GUIDED,"SHAHI_GUIDED","guided"); gauss = new_gaussblur(); guided = new_guided_filter(); convert2lab = PF::new_convert_colorspace(); PF::ConvertColorspacePar* csconvpar = dynamic_cast(convert2lab->get_par()); if(csconvpar) { csconvpar->set_out_profile_mode( PF::PROF_MODE_DEFAULT ); csconvpar->set_out_profile_type( PF::PROF_TYPE_LAB ); } convert2input = new_icc_transform(); set_type("shadows_highlights" ); set_default_name( _("shadows/highlights") ); } bool PF::ShadowsHighlightsPar::needs_caching() { return true; } void PF::ShadowsHighlightsPar::propagate_settings() { GaussBlurPar* gausspar = dynamic_cast( gauss->get_par() ); if( gausspar ) { gausspar->set_radius( radius.get() ); gausspar->propagate_settings(); } PF::GuidedFilterPar* guidedpar = dynamic_cast( guided->get_par() ); if( guidedpar ) { //float ss = 0.01 * guided_radius.get() * MIN(full_res->Xsize, full_res->Ysize); //guidedpar->set_radius(ss); //guidedpar->set_threshold(guided_threshold.get()); guidedpar->propagate_settings(); } } void PF::ShadowsHighlightsPar::compute_padding( VipsImage* full_res, unsigned int id, unsigned int level ) { std::cout<<"ShadowsHighlightsPar::compute_padding(): method.get_enum_value().first="<( gauss->get_par() ); if( gausspar ) { gausspar->set_radius( radius.get() ); gausspar->propagate_settings(); gausspar->compute_padding(full_res, id, level); set_padding( gausspar->get_padding(id), id ); } break; } case PF::SHAHI_GUIDED: { PF::GuidedFilterPar* guidedpar = dynamic_cast( guided->get_par() ); if( guidedpar ) { guidedpar->set_radius( radius.get() ); //guidedpar->set_threshold(threshold.get()); guidedpar->propagate_settings(); guidedpar->compute_padding(full_res, id, level); set_padding( guidedpar->get_padding(id), id ); } } default: break; } } VipsImage* PF::ShadowsHighlightsPar::build(std::vector& in, int first, VipsImage* imap, VipsImage* omap, unsigned int& level) { if( (in.size()<1) || (in[0]==NULL) ) return NULL; std::vector in2; in_profile = PF::get_icc_profile( in[0] ); convert2lab->get_par()->set_image_hints( in[0] ); convert2lab->get_par()->set_format( get_format() ); in2.clear(); in2.push_back( in[0] ); VipsImage* labimg = convert2lab->get_par()->build( in2, 0, NULL, NULL, level ); if( !labimg ) { std::cout<<"ShadowsHighlightsPar::build(): null Lab image"<Xsize="<Xsize<<" extended->Xsize="<Xsize<( gauss->get_par() ); if( gausspar ) { gausspar->set_radius( radius.get() ); gausspar->set_image_hints( labimg ); gausspar->set_format( get_format() ); in2.clear(); in2.push_back( labimg ); blurred = gausspar->build( in2, 0, NULL, NULL, level ); PF_UNREF( labimg, "ShadowsHighlightsPar::build(): extended unref after convert2lab" ); } break; } case PF::SHAHI_GUIDED: { PF::GuidedFilterPar* guidedpar = dynamic_cast( guided->get_par() ); if( guidedpar ) { guidedpar->set_radius( radius.get() ); //guidedpar->set_threshold(threshold.get()); guidedpar->set_image_hints( labimg ); guidedpar->set_format( get_format() ); in2.clear(); in2.push_back( labimg ); blurred = guidedpar->build( in2, 0, NULL, NULL, level ); PF_UNREF( labimg, "ShadowsHighlightsPar::build(): extended unref after convert2lab" ); } break; } default: break; } if( !blurred ) { std::cout<<"ShadowsHighlightsPar::build(): null Lab image"<( convert2input->get_par() ); //std::cout<<"ImageArea::update(): icc_par="<set_out_profile( in_profile ); } convert2input->get_par()->set_image_hints( in[0] ); convert2input->get_par()->set_format( get_format() ); in2.clear(); in2.push_back( shahi ); #ifndef NDEBUG std::cout<<"ShadowsHighlightsPar::build(): calling convert2input->get_par()->build()"<get_par()->build(in2, 0, NULL, NULL, level ); PF_UNREF( shahi, "ShadowsHighlightsPar::build() cropped unref" ); set_image_hints( in[0] ); return out; }