DEFINITION MODULE BitmapOperations;

(* Bitmap operations using dynamic memory *)

(* V1.1, J. Andrea, Jun.22/93 -add Duplicate *)
(* V1.0, J. Andrea, Mar.18/92 *)
(* This code may be freely used and distributed, it may not be sold. *)

(*
* For those operations which return a status in the boolean 'ok',
* the value of 'ok' should be checked before attempting to use the
* resultant bitmap.
* If 'ok' is FALSE, then the resultant bitmap will not exist.
*)

EXPORT QUALIFIED Bitmap,                           (* the type *)
                 Build, Destroy,                   (* matrix creation/deletion*)
                 Put, Get,                         (* element access *)
                 Size, Compare,                    (* status *)
                 Clear, Copy, Duplicate,           (* new copy *)
                 Not, And, Or, Xor,                (* advanced operations *)
                 Line,                             (* advanced operations *)
                 PrintText, PrintSixel, PrintPS;   (* output to a file *)

TYPE Bitmap;   (* opaque *)

PROCEDURE Build( VAR a :Bitmap; rows, columns :CARDINAL );
(* create a bitmap of the specified size *)

PROCEDURE Destroy( VAR a :Bitmap );
(* get rid of the specified bitmap *)

PROCEDURE Put( a :Bitmap; row, col :CARDINAL; set :CARDINAL );
(* 'set'=0 means turn off, =1 is turn on, =2 is flip, bit at 'row,col' *)

PROCEDURE Get( a :Bitmap; row, col :CARDINAL ) :BOOLEAN;
(* return the value at 'row,col' *)

PROCEDURE Size( a :Bitmap; VAR rows, cols :CARDINAL );
(* return the size of a bitmap *)

PROCEDURE Compare( a, b :Bitmap ) :BOOLEAN;
(* compare two bitmaps, return TRUE if they are the same *)

PROCEDURE Clear( a :Bitmap );
(* set the whole bitmap to off *)

PROCEDURE Copy( a, b :Bitmap );
(* copy 'a' into a 'b', iff sizes are the same *)

PROCEDURE Duplicate( a :Bitmap; VAR b :Bitmap );
(* copy bitmap 'a' into a new bitmap 'b' *)

PROCEDURE Not( a :Bitmap; VAR b :Bitmap );
(* invert every dot in 'a' into new bitmap 'b' *)

PROCEDURE And( a, b :Bitmap; VAR c :Bitmap; VAR ok :BOOLEAN );
(* perform AND on all elements in 'a' with 'b', giving 'c' *)

PROCEDURE Or( a, b :Bitmap; VAR c :Bitmap; VAR ok :BOOLEAN );
(* perform OR on all elements in 'a' with 'b', giving 'c' *)

PROCEDURE Xor( a, b :Bitmap; VAR c :Bitmap; VAR ok :BOOLEAN );
(* perform XOR on all elements in 'a' with 'b', giving 'c' *)

PROCEDURE Line( a :Bitmap; row1, col1, row2, col2 :CARDINAL; set :CARDINAL );
(* draw a line from position 1 to position 2, same option as Put *)

PROCEDURE PrintText( a :Bitmap; file_name :ARRAY OF CHAR; VAR ok :BOOLEAN );
(* print the bitmap into a simple text file using simple characters *)

PROCEDURE PrintSixel( a :Bitmap; file_name :ARRAY OF CHAR; VAR ok :BOOLEAN );
(* print the bitmap into Sixel graphics file, for DEC line printers *)

PROCEDURE PrintPS( a :Bitmap; file_name :ARRAY OF CHAR; size :CARDINAL;
                   VAR ok :BOOLEAN );
(* print the bitmap into graphic PostScript file, each dot being 'size' points *)

END BitmapOperations.
