A special manager feature minimizes the cost of drawing
tasks to be done after geometric operations have been performed. This
is useful in situations where you want to see the results of your
work. This feature uses a region of invalidated parts of the display
called the update region.
The update region stores the appropriate regions before any modifications
are carried out on objects, as well as those regions that are relevant
after these modifications have been carried out for each view.
To successfully apply an applicable function, you must
mark the regions where the objects are located as invalid, apply the
function, and then invalidate the regions where the objects involved
are now located (applying the function may change the location of
the objects). This mechanism is greatly simplified by a set of methods
of the
IlvManager class. Regions to be updated are only refreshed
when the method
reDrawViews
is called.
This means that refreshing the views of a manager is done by marking
regions to be redrawn in a cycle of
initReDraws
and
reDrawViews
.
These cycles can be nested so that only the last call
to the method reDrawViews
actually updates
the display. The IlvManager
methods that
help you optimize drawing tasks are:
Marks the beginning
of the drawing optimization operation by emptying the region to update
for each view being managed. Once this step is taken, direct or indirect
calls to a draw instruction are deferred. For every initReDraws
,
there should be one call to reDrawViews
,
otherwise, a warning is issued. Calls to initReDraws
can
be embedded so that the actual refresh only takes place when the last
call to reDrawViews
is reached.
Defines a new region
as invalid, that is, this region will be redrawn later. Each call
to invalidateRegion
adds the region to
the update region in every view.
Sends the drawing
commands for the whole update region. All the objects involved in
previous calls to invalidateRegion
are
then updated.
Aborts the mechanism
of deferred redraws (for example, if you need to refresh the whole
screen). This function resets the update region to empty. If needed,
you should start again with an initReDraws
call.
Returns true
when
the manager is in an initReDraws
/reDrawViews
state.
This mechanism is used in the applyToObject
method.
In fact the call:
manager.applyToObject(obj, func, userArg, true);
is equivalent to:
manager.initReDraws();
manager.invalidateRegion(obj);
manager.applyToObject(obj, func, userArg, false);
manager.invalidateRegion(obj);
manager.reDrawViews();
The invalidateRegion
method
works with the bounding box of the object given as a parameter. When
an operation applied to the object modifies its bounding box, invalidateRegion
must
be called twice: once before and once after the operation. For example,
for a move operation, you must invalidate the initial region where
the object was before being moved and invalidate the final region
so that the object can be redrawn. In other situations, such as changing
the background, only the call after the operation is necessary.