6.3. Drawing (drawing.rsl)
object DrawSurface is
components: Drawing*;
operations: AddDrawing, RemoveDrawing;
end DrawSurface;
operation AddDrawing is
inputs: dr:Drawing, ds:DrawSurface;
outputs: ds':DrawSurface;
precondition:
(*
*
*);
postcondition:
(*
* The given Drawing is added to the end of the list of Drawings in the
* given DrawSurface. The order of other items in the list is unchanged.
*)
ds' = ds + dr;
description: (*
AddDrawing adds the given Drawing to the given DrawSurface, producing an
updated DrawSurface with the Drawing at the end of its Drawing list.
When the DrawSurface is displayed on the screen, Drawing objects are drawn
in the order they appear in the list, resulting in objects near the
end of the list being drawn over objects near the beginning.
*);
end AddDrawing;
operation RemoveDrawing is
inputs: dr:Drawing, ds:DrawSurface;
outputs: ds':DrawSurface;
precondition:
(*
* The given Drawing is in the DrawSurface
*)
dr in ds;
postcondition:
(*
* The given Drawing is removed from the list of Drawings in the given
* DrawSurface. The order of other items in the list is unchanged.
*)
ds' = ds - dr;
description: (*
RemoveDrawing removes the given drawing from the given DrawSurface,
producing an updated DrawSurface.
*);
end RemoveDrawing;
operation ClearDrawSurface is
inputs: ds:DrawSurface;
outputs: ds':DrawSurface;
precondition:
(*
*
*);
postcondition:
(*
* All Drawings are removed from the given DrawSurface.
*)
#ds' = 0;
description: (*
ClearDrawSurface removes all drawings from the given DrawSurface.
*);
end ClearDrawSurface;
object Drawing is
components: center:Point and bounds:Rect and col:Color and highlight:boolean and
thick:Thickness and (Line* or Rect or Ellipse or Text) and User;
operations: MoveDrawing, ResizeDrawing, ChangeDrawingThickness,
ChangeDrawingColor, ChangeHighlight;
description: (*
A Drawing is composed of a color, thickness, and one of several shapes.
It also contains a reference to the User who created it.
*);
end Drawing;
operation MoveDrawing is
inputs: dr:Drawing, move:Point;
outputs: dr':Drawing;
precondition:
(*
*
*);
postcondition:
(*
* The Drawing's center has been moved by the given amount
*)
dr'.center.x = dr.center.x + move.x and dr'.center.y = dr.center.y + move.y;
description: (*
MoveDrawing moves the given drawing by the given move vector, producing an
updated drawing.
*);
end MoveDrawing;
operation ResizeDrawing is
inputs: dr:Drawing, w:integer, h:integer;
outputs: dr':Drawing;
precondition:
(*
*
*);
postcondition:
(*
* The Drawing's bounding box's width and height have been changed to the
* given width and height
*)
dr'.bounds.w = w and dr'.bounds.h = h;
description: (*
MoveDrawing moves the given drawing by the given move vector, producing an
updated drawing.
*);
end ResizeDrawing;
operation ChangeDrawingThickness is
inputs: dr:Drawing, t:Thickness;
outputs: dr':Drawing;
precondition:
(*
*
*);
postcondition:
(*
* The Drawing's thickness has been changed to the given thickness
*)
dr'.thick = t;
description: (*
ChangeDrawingThickness changes the thickness of the given drawing,
producing an updated drawing
*);
end ChangeDrawingThickness;
operation ChangeDrawingColor is
inputs: dr:Drawing, c:Color;
outputs: dr':Drawing;
precondition:
(*
*
*);
postcondition:
(*
* The Drawing's color has been changed to the given color.
*)
dr'.col = c;
description: (*
ChangeDrawingColor changes the color of the given drawing, producing an
updated drawing
*);
end ChangeDrawingColor;
operation ChangeHighlight is
inputs: dr:Drawing, h:boolean;
outputs: dr':Drawing;
precondition:
(*
*
*);
postcondition:
(*
* The Drawing's Highlighter boolean will be set to the given highlighter
* boolean.
*)
dr'.highlight = h;
description: (*
ChangeIsHighlighter changes whether the drawing is a "highlighter",
meaning its color has a predefined alpha component less than 1.
*);
end ChangeHighlight;
object Color is
components: red:integer, green:integer, blue:integer, alpha:integer;
end Color;
object Thickness is integer;
object Line is
components: point1:Point, point2:Point;
end Line;
object Rect is
components: diagonal:Line, w:integer, h:integer;
end Rect;
object Ellipse;
object Text is string;
object Point is
components: x:integer, y:integer;
end Point;