An Effect represents an interstitial effect that is used to transition the display from one image to another.
An Effect must hold state so that it knows what it should be drawn at any call to paint (which is called regularly during a transition). That is, it should be able to draw any frame of the transition at any time. The same frame may need to be drawn multiple times, or the host may skip ahead and ask for a frame well ahead of the last requested one.
Frame numbers are one-based throughout this interface. This is because the initial state (the blank viewport or the starting pixbuf) is frame zero. The Effect is never called to paint this frame. The Effect is also not called to paint the final frame (a blank viewport or the ending pixbuf).
If the Effect uses background threads for its work, it should use the appropriate primitives for critical sections. All calls to this interface will be from the context of the main UI thread. None of these calls should block.
If the Details object needs to be held by the Effect, its reference to it should be dropped at the end of the cycle (or shortly thereafter).
An instance may be reused and should be prepared for restarts.