/* */ /* 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 "file_util.hh" #include "layer.hh" #include "image.hh" PF::Layer::Layer(uint32_t i, bool c): id(i), processor( NULL ), blender( NULL ), cached( c ), image( NULL ) { // A layer is always dirty when created, as it is by definition not included in the // VIPS rendering chain yet dirty = true; modified_flag = true; enabled = true; visible = true; hidden = false; sticky = false; expanded = true; normal = true; set_cached( c ); } void PF::Layer::set_processor(ProcessorBase* p) { processor = p; processor->get_par()->signal_modified.connect(sigc::mem_fun(this, &PF::Layer::modified) ); //processor->get_par()->signal_modified.connect(sigc::mem_fun(image, &PF::Image::set_modified) ); } void PF::Layer::set_blender(ProcessorBase* p) { blender = p; blender->get_par()->signal_modified.connect(sigc::mem_fun(this, &PF::Layer::modified) ); //blender->get_par()->signal_modified.connect(sigc::mem_fun(image, &PF::Image::set_modified) ); } void PF::Layer::set_image( Image* img ) { image = img; signal_modified.connect(sigc::mem_fun(image, &PF::Image::modified) ); } void PF::Layer::set_cached( bool c ) { bool changed = (cached != c); cached = c; if( cached && cache_buffers.empty() ) { //cache_buffers.insert( std::make_pair(PF::PF_RENDER_PREVIEW, new PF::CacheBuffer()) ); cache_buffers.insert( std::make_pair(PF::PF_RENDER_NORMAL, new PF::CacheBuffer()) ); } if( cached && changed ) reset_cache_buffers(); } PF::CacheBuffer* PF::Layer::get_cache_buffer() { std::map::iterator i = cache_buffers.find( /*mode*/PF_RENDER_NORMAL ); if( i != cache_buffers.end() ) return i->second; return NULL; } void PF::Layer::reset_cache_buffers() { //std::cout<<"Layer::reset_cache_buffers(\""<::iterator i; for(i = cache_buffers.begin(); i != cache_buffers.end(); i++ ) { if( i->second ) i->second->reset(); } } bool PF::Layer::insert(std::list& list, PF::Layer* l, int32_t lid) { if( lid < 0 ) { list.push_back( l ); return true; } std::list::iterator it; for( it = list.begin(); it != list.end(); ++it ) if( (int32_t)(*it)->get_id() == lid ) break; if( it == list.end() ) return false; it++; list.insert( it, l ); return true; } bool PF::Layer::insert_before(std::list& list, PF::Layer* l, int32_t lid) { std::list::iterator it; for( it = list.begin(); it != list.end(); ++it ) if( (int32_t)(*it)->get_id() == lid ) break; if( it == list.end() ) return false; list.insert( it, l ); return true; } bool PF::Layer::sublayers_insert(PF::Layer* l, int32_t lid) { return insert(sublayers,l,lid); } bool PF::Layer::sublayers_insert_before(PF::Layer* l, int32_t lid) { return insert_before(sublayers,l,lid); } bool PF::Layer::imap_insert(PF::Layer* l, int32_t lid) { return insert(imap_layers,l,lid); } bool PF::Layer::imap_insert_before(PF::Layer* l, int32_t lid) { return insert_before(imap_layers,l,lid); } bool PF::Layer::omap_insert(PF::Layer* l, int32_t lid) { return insert(omap_layers,l,lid); } bool PF::Layer::omap_insert_before(PF::Layer* l, int32_t lid) { return insert_before(omap_layers,l,lid); } void PF::Layer::remove_input(int32_t lid) { bool done = true; do { done = true; for( unsigned int i = 0; i < inputs.size(); i++) { if( inputs[i].first.first == lid ) { inputs.erase( inputs.begin()+i ); done = false; break; } } } while( !done ); } bool PF::Layer::save( std::ostream& ostr, int level ) { if( is_hidden() ) return true; for(int i = 0; i < level; i++) ostr<<" "; ostr<<"get_layer_manager().get_layer( id ); if( !l ) continue; if( n>0 ) ostr<<" "; ostr<get_id()<<" "<"<get_par() ) processor->get_par()->save( ostr, level+1 ); if( blender && blender->get_par() ) blender->get_par()->save( ostr, level+1 ); for(int i = 0; i < level+1; i++) ostr<<" "; ostr<<""<::iterator li = sublayers.begin(); li != sublayers.end(); li++ ) { (*li)->save( ostr, level+2 ); } for(int i = 0; i < level+1; i++) ostr<<" "; ostr<<""<"<::iterator li = imap_layers.begin(); li != imap_layers.end(); li++ ) { (*li)->save( ostr, level+2 ); } for(int i = 0; i < level+1; i++) ostr<<" "; ostr<<""<"<::iterator li = omap_layers.begin(); li != omap_layers.end(); li++ ) { (*li)->save( ostr, level+2 ); } for(int i = 0; i < level+1; i++) ostr<<" "; ostr<<""<"<