(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* by Steve Glassman and Stephen Harrison *) (* Last modified on Fri Jul 17 19:14:48 PDT 1992 by harrison *) (* modified on Sat Jul 11 02:07:17 1992 by steveg *) MODULE Appearances; <* PRAGMA LL *> IMPORT Axis, MG, MGPublic, Point, Rect, Pts, R2, R2Box, Region; TYPE T = MG.T; V = MG.V; REVEAL DropShadow = DSPublic BRANDED OBJECT OVERRIDES paint := DSPaint; boundingBox := DSBB; region := DSRegion; END; PROCEDURE DSPaint (app: DropShadow; t: T; v: V; VAR clip: Rect.T) = VAR color := t.color; pos := MGPublic.Pos(t, v); BEGIN MG.SetPosLocked(t, R2.Add(pos, app.delta), v); t.color := app.color; t.render(v, clip); MG.SetPosLocked(t, pos, v); t.color := color; Appearance.paint(app, t, v, clip); END DSPaint; PROCEDURE DSBB(app: DropShadow; t: T; v: V): R2Box.T = VAR bounds := Appearance.boundingBox(app, t, v); BEGIN IF app.delta[0] > 0.0 THEN bounds[0].hi := bounds[0].hi + app.delta[0]; ELSE bounds[0].lo := bounds[0].lo + app.delta[0]; END; IF app.delta[1] > 0.0 THEN bounds[1].hi := bounds[1].hi + app.delta[1]; ELSE bounds[1].lo := bounds[1].lo + app.delta[1]; END; RETURN bounds; END DSBB; PROCEDURE DSRegion(app: DropShadow; t: T; v: V): Region.T = VAR rgn := Appearance.region(app, t, v); delta := MG.MGCToScreenPoint(v, app.delta); BEGIN RETURN Region.Join(rgn, Region.AddHV(rgn, delta.h, delta.v)) END DSRegion; REVEAL DropShadowHighlight = DSHPublic BRANDED OBJECT OVERRIDES paint := DSHPaint; boundingBox := DSHBB; region := DSHRegion; END; PROCEDURE DSHPaint (app: DropShadowHighlight; t: T; v: V; VAR clip: Rect.T) = VAR color := t.color; pos := MGPublic.Pos(t, v); BEGIN IF t.highlight > 0.0 THEN MG.SetPosLocked(t, R2.Add(pos, R2.Scale(t.highlight, app.delta)), v); t.color := app.color; t.render(v, clip); MG.SetPosLocked(t, pos, v); t.color := color; END; Appearance.paint(app, t, v, clip); END DSHPaint; PROCEDURE DSHBB ( app : DropShadowHighlight; t : T; v : V): R2Box.T = VAR bounds := Appearance.boundingBox(app, t, v); BEGIN IF t.highlight > 0.0 THEN IF app.delta[0] > 0.0 THEN bounds[0].hi := bounds[0].hi + t.highlight * app.delta[0]; ELSE bounds[0].lo := bounds[0].lo + t.highlight * app.delta[0]; END; IF app.delta[1] > 0.0 THEN bounds[1].hi := bounds[1].hi + t.highlight * app.delta[1]; ELSE bounds[1].lo := bounds[1].lo + t.highlight * app.delta[1]; END; END; RETURN bounds; END DSHBB; PROCEDURE DSHRegion (app: DropShadowHighlight; t: T; v: V): Region.T = VAR rgn := Appearance.region(app, t, v); delta: Point.T; BEGIN IF t.highlight > 0.0 THEN delta := MG.MGCToScreenPoint(v, R2.Scale(t.highlight, app.delta)); RETURN Region.Join(rgn, Region.AddHV(rgn, delta.h, delta.v)) ELSE RETURN rgn END; END DSHRegion; REVEAL WeightUnderlay = WUPublic BRANDED OBJECT OVERRIDES paint := WUPaint; boundingBox := WUBB; region := WURegion; END; PROCEDURE WUPaint (app: WeightUnderlay; t: T; v: V; VAR clip: Rect.T) = VAR color := t.color; weight := t.weight; BEGIN t.weight := app.weight; t.color := app.color; t.render(v, clip); t.weight := weight; t.color := color; Appearance.paint(app, t, v, clip); END WUPaint; PROCEDURE WUBB ( app : WeightUnderlay; t : T; v : V): R2Box.T = VAR dw := app.weight - t.weight; bounds := Appearance.boundingBox(app, t, v); BEGIN IF dw > 0.0 THEN bounds := R2Box.Inset(bounds, -dw); END; RETURN bounds; END WUBB; PROCEDURE WURegion (app: WeightUnderlay; t: T; v: V): Region.T = VAR rgn := Appearance.region(app, t, v); dw := app.weight - t.weight; BEGIN IF dw <= 0.0 THEN RETURN rgn ELSE RETURN Region.Inset(rgn, MAX(Pts.ToScreenPixels(v, dw, Axis.T.Hor), Pts.ToScreenPixels(v, dw, Axis.T.Ver))) END; END WURegion; REVEAL WeightUnderlayHighlight = WUHPublic BRANDED OBJECT OVERRIDES paint := WUHPaint; boundingBox := WUHBB; region := WUHRegion; END; PROCEDURE WUHPaint ( app : WeightUnderlayHighlight; t : T; v : V; VAR clip: Rect.T ) = VAR color := t.color; weight := t.weight; BEGIN IF t.highlight > 0.0 THEN t.weight := t.weight + t.highlight * (app.weight - t.weight); t.color := app.color; t.render(v, clip); t.weight := weight; t.color := color; END; Appearance.paint(app, t, v, clip); END WUHPaint; PROCEDURE WUHBB ( app : WeightUnderlayHighlight; t : T; v : V): R2Box.T = VAR dw := t.highlight * (app.weight - t.weight); bounds := Appearance.boundingBox(app, t, v); BEGIN IF dw > 0.0 THEN bounds := R2Box.Inset(bounds, -dw); END; RETURN bounds; END WUHBB; PROCEDURE WUHRegion (app: WeightUnderlayHighlight; t: T; v: V): Region.T = VAR rgn := Appearance.region(app, t, v); dw := t.highlight * (app.weight - t.weight); BEGIN IF dw <= 0.0 THEN RETURN rgn ELSE RETURN Region.Inset(rgn, MAX(Pts.ToScreenPixels(v, dw, Axis.T.Hor), Pts.ToScreenPixels(v, dw, Axis.T.Ver))) END; END WUHRegion; REVEAL ColorLineHighlight = CLHPublic BRANDED OBJECT OVERRIDES paint := CLHPaint; END; PROCEDURE CLHPaint (app: ColorLineHighlight; t: T; v: V; VAR clip: Rect.T) = VAR pos := MGPublic.Pos(t, v); delta := R2.Sub(MGPublic.LineTo(t, v), pos); scale : REAL; clipTo, clipFrom: Rect.T; split : Point.T; color := t.color; BEGIN IF t.highlight > 0.0 THEN IF app.fromFrom THEN scale := t.highlight ELSE scale := 1.0 - t.highlight END; split := MG.MGCToScreenPoint(v, R2.Add(pos, R2.Scale(scale, delta))); IF delta[0] > delta[1] THEN IF (app.fromFrom AND delta[0] < 0.0) OR (NOT app.fromFrom AND delta[0] > 0.0) THEN Rect.Chop(Axis.T.Hor, clip, split.h, clipFrom, clipTo) ELSE Rect.Chop(Axis.T.Hor, clip, split.h, clipTo, clipFrom); END; ELSE IF (app.fromFrom AND delta[1] < 0.0) OR (NOT app.fromFrom AND delta[1] > 0.0) THEN Rect.Chop(Axis.T.Ver, clip, split.v, clipTo, clipFrom); ELSE Rect.Chop(Axis.T.Ver, clip, split.v, clipFrom, clipTo) END; END; t.color := app.highlightColor; Appearance.paint(app, t, v, clipFrom); t.color := color; END; Appearance.paint(app, t, v, clip); END CLHPaint; REVEAL Clipped = ClippedPublic BRANDED OBJECT OVERRIDES paint := ClippedPaint; END; CONST LeftRight = Sides{Side.Left,Side.Right}; TopBottom = Sides{Side.Top,Side.Bottom}; PROCEDURE ClippedPaint ( self: Clipped; t : MG.T; v : MG.V; VAR clip: Rect.T ) = VAR rect := t.rgn(v).r; wd := FLOAT(Rect.HorSize(rect)); ht := FLOAT(Rect.VerSize(rect)); hscale, vscale := 1.0; BEGIN IF LeftRight = LeftRight * self.sides THEN hscale := 0.5 END; IF TopBottom = TopBottom * self.sides THEN vscale := 0.5 END; IF Side.Top IN self.sides THEN rect.north := rect.north + ROUND(vscale * t.highlight * ht); END; IF Side.Bottom IN self.sides THEN rect.south := rect.south - ROUND(vscale * t.highlight * ht); END; IF Side.Left IN self.sides THEN rect.west := rect.west + ROUND(hscale * t.highlight * wd); END; IF Side.Right IN self.sides THEN rect.east := rect.east - ROUND(hscale * t.highlight * wd); END; rect := Rect.Meet(clip, rect); Appearance.paint(self, t, v, rect); END ClippedPaint; BEGIN END Appearances.