To support our requirements, change signals are actually implemented as follows:
sigc::signal<void, k3d::ihint*> bitmap_changed_signal;
With corresponding signal handlers:
void on_bitmap_changed(k3d::ihint* Hint) { if(dynamic_cast<k3d::hint::bitmap_pixels_changed*>(Hint)) { // We know that only pixel values changed, // so we can perform efficient computation here. } else { // We didn't get a hint, or we got a hint that we don't // recognize, so we don't know what changed and have to // start-over from scratch, "assuming the worst". } }
Now, whenever emitting a change signal, the emitter can provide a hint object:
m_output_property.changed_signal().emit(k3d::hint::bitmap_pixels_changed::instance());
or not:
m_output_property.changed_signal().emit(0);