Copyright (C) 1994, Digital Equipment Corp.
<* PRAGMA LL *> <* PRAGMA SUBTYPE *>A
ScaleFilter is a multi-filter whose child's screentype is
the same as the parent's except that the resolution is scaled.
INTERFACEThe callScaleFilter ; IMPORT VBT; TYPE <* SUBTYPE T <: MultiFilter.T *> T <: Public; Private <: VBT.T; Public = Private OBJECT METHODS <* LL.sup <= VBT.mu *> init (ch: VBT.T): T END;
v.init(ch) initializes v as a ScaleFilter with
multi-child ch and with horizontal and vertical scale factors
both equal to 1.0.
There are two ways you can use a ScaleFilter: Procedure Scale allows
you to explicitly set a horizontal and vertical scale factor.
Procedure AutoScale looks at the preferred size of the child and
dynamically sets the scale factors such that the child's preferred
size always fills its domain.
PROCEDURE Scale (v: T; hscale, vscale: REAL); <* LL.sup = VBT.mu.v *>
Setv's horizontal and vertical scale factors to behscaleandvscalerespectively, and markvfor redisplay.
Thus, if the
v has resolution of px and py horizontally
and vertically, then the resolution of v's multi-child will
be hscale*px and vscale*py.
Note that the locking level of Scale does not
require the full share of VBT.mu. Therefore, it can be
called from v's reshape or rescreen method, for
example, since those methods are called with only v's share
of VBT.mu locked. This fact is useful for the implementation
of procedure AutoScale:
PROCEDURE AutoScale (v: T; keepAspectRatio := FALSE); <* LL.sup = VBT.mu *>
Setv's scale factor such that the preferred size ofv's childchis scaled to fit intoVBT.Domain(ch). IfkeepAspectRatioisTRUE, thenchis scaled by the same amountfboth horizontally and vertically. The amountfis chosen so that the preferred size ofchjust fits in the larger direction ofvand fits fine in the other direction. In any event,vis marked for redisplay.
The call to
AutoScale has the effect of causing Scale to be
called each time that v is reshaped. Thus, it is important that
Scale have a locking level of VBT.mu.v rather than simply
VBT.mu.
PROCEDURE Get(v: T; VAR (* OUT *) hscale, vscale: REAL); <* LL.sup = VBT.mu *>
Return v's current horizontal and vertical scale factors. If
Scale was called more recently than AutoScale, then
Get returns the values passed to Scale. On the other hand, if
AutoScale was called more recently, then Get will return
values that reflect scaling for v's current domain.
END ScaleFilter.