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);