S9 LIB  (canvas-draw canvas integer1 integer2 char)         ==>  unspecific
        (canvas-draw-string canvas int1 int2 string)        ==>  unspecific
        (canvas-dump canvas)                                ==>  vector
        (canvas-plot canvas integer1 integer2 char)         ==>  unspecific
        (canvas-plot-line canvas int1 int2 int3 int4 char)  ==>  unspecific
        (make-canvas integer1 integer2 integer3 integer4)   ==>  canvas

        (load-from-library "char-canvas.scm")

This is a set of routines for drawing characters and lines on
a scaled, character-based (a.k.a. "ASCII Art") canvas.

MAKE-CANVAS creates a char canvas with a physical size of
x=INTEGER1 times y=INTEGER2 characters. The virtual size of
the canvas is x=INTEGER3 times y=INTEGER4 "pixels". "Real
coordinates" relate to the physical size of the canvas.
"Virtual coordinates" are translated to real coordinates by
scaling. Both types of coordinates are specified in X/Y
notation. The origin 0/0 is at the lower left corner of the
canvas. The new canvas will be filled with blanks initially.

CANVAS-DRAW draws character CHAR at position INTEGER1/INTEGER2.
It uses real coordinates. CANVAS-DRAWSTRING draws a string
instead of a single character. When the X or Y coordinate is
outside of the canvas, C will not be drawn. When STRING extends
beyond the the limits of the canvas, it will be clipped.

CANVAS-PLOT draws the character CHAR at the virtual position
INTEGER1/INTEGER2. CANVAS-PLOT-LINE draws a line from the
virtual position INT1/INT2 to INT3/INT4 using the character
CHAR. Lines originating or extending outside of the canvas
will be clipped.

CANVAS-DUMP returns a vector of strings that contain the
characters written to the canvas. The vector indexes are the
Y-coordinates, the string offsets the X-coordinates.

(let ((c (make-canvas 10 5 10 10)))
  (canvas-plot-line c 0 9 9 0 #\#)
  (canvas-plot-line c 0 0 9 9 #\*)
  (canvas-dump c))                   ==>  #("##      **"
                                            "  ##  **  "
                                            "    **    "
                                            "  **  ##  "
                                            "**      ##")
