home *** CD-ROM | disk | FTP | other *** search
- {************************************************}
- {* PLOTTER.PAS *}
- {* Plottertreiber des Grafiksystems für den *}
- {* Plotter Sharp CE *}
- {* (C) 1989 S.Szkaradnik & TOOLBOX *}
- {************************************************}
- (* Overlay *) (* Bei Speichermangel in Turbo 3.0*)
- (* als Overlay deklarieren ! *)
-
- PROCEDURE PlotterDriver ( VAR Par : Parameters );
-
- TYPE
- Blocks = ARRAY [ 0..1023 ] OF BYTE ;
- Buffer = RECORD
- Upd : BOOLEAN ;
- Ind : BYTE ;
- Blk : Blocks ;
- END ;
-
- VAR
- Buffers : ARRAY [ 0..1 ] OF Buffer ;
- Prev : BYTE ;
-
- FUNCTION Block ( N : BYTE ) : BYTE ;
- BEGIN
- IF ( Buffers [0].Ind <> N )
- AND ( Buffers [1].Ind <> N ) THEN BEGIN
- WITH Buffers [ Prev ] DO BEGIN
- IF Upd THEN BEGIN
- Seek ( BitMap, Ind SHL 3 ) ;
- BlockWrite ( BitMap, Blk, 8 ) ;
- END ;
- Upd := FALSE ; Ind := N ;
- Seek ( BitMap, Ind SHL 3 ) ;
- BlockRead ( BitMap, Blk, 8 ) ;
- END ;
- Block := Prev ;
- IF Prev = 0 THEN Prev := 1 ELSE Prev := 0 ;
- END
- ELSE
- IF Buffers [0].Ind = N THEN
- Block := 0
- ELSE
- Block := 1 ;
- END ;
-
-
- PROCEDURE PlotterStep ( X, Y : INTEGER;
- Mode : Tools ) ;
- BEGIN
- IF Tool = Pen THEN
- Write ( Aux, 'D' )
- ELSE
- Write ( Aux, 'M' ) ;
- WriteLn ( Aux, X, ',', Y - 719 ) ;
- END ;
-
- FUNCTION Open : BOOLEAN ;
- VAR I : INTEGER ;
- BEGIN
- Assign ( BitMap, 'BITMAP.PIC' ) ;
- (*$I-*) ReSet ( BitMap ) (*$I+*) ;
- IF IOResult = 0 THEN BEGIN
- Write ( Aux, #10, #27, 'b' ) ;
- Device := Plotter ;
- Xmin := 0 ; Xmax := 959 ;
- Ymin := 0 ; Ymax := 719 ;
- FOR I := 0 TO 1 DO WITH Buffers [I] DO BEGIN
- Upd := FALSE ;
- Ind := 255
- END ;
- Prev := 0 ;
- Open := TRUE ;
- END
- ELSE
- Open := FALSE ;
- END ;
-
- PROCEDURE Calculate ( X, Y : INTEGER ;
- VAR Bit : BYTE ;
- VAR Adr, Blk : INTEGER ) ;
- BEGIN
- Bit := X AND 7 ;
- Adr := X SHR 3 + Y AND 7 SHL 7 ;
- Blk := Y SHR 3 ;
- END ;
-
- FUNCTION Point ( X, Y : INTEGER ) : BOOLEAN ;
- VAR
- Bit : BYTE ;
- Adr, Bl : INTEGER ;
- BEGIN
- IF ( X >= Xmin ) AND ( X <= Xmax )
- AND ( Y >= Ymin ) AND ( Y <= Ymax ) THEN BEGIN
- Calculate ( X, Y, Bit, Adr, Bl ) ;
- IF Buffers [ Block ( Bl ) ].Blk [ Adr ]
- AND Pat [ Bit ] <> 0 THEN
- Point := TRUE
- ELSE
- Point := FALSE ;
- END
- ELSE Fence ;
- END ;
-
- VAR
- Xprev, Yprev : INTEGER ;
-
- FUNCTION Near ( X, Y : INTEGER ) : BOOLEAN ;
- BEGIN
- IF ( Abs ( X - Xprev ) < 2 )
- AND ( Abs ( Y - Yprev ) < 2 ) THEN
- Near := TRUE
- ELSE
- Near := FALSE
- END ;
-
- PROCEDURE Dot ( X, Y : INTEGER ) ;
- VAR
- Bit : BYTE ;
- Adr, Bl : INTEGER ;
- BEGIN
- Control ( X, Y ) ;
- Calculate ( X, Y, Bit, Adr, Bl ) ;
- WITH Buffers [ Block ( Bl ) ] DO
- IF Tool = Pen THEN BEGIN
- Blk [ Adr ] := Blk [ Adr ] OR Pat [ Bit ] ;
- Upd := TRUE ;
- END ;
- IF Near ( X, Y ) THEN
- PlotterStep ( X, Y, Tool )
- ELSE BEGIN
- PlotterStep ( X, Y, None ) ;
- PlotterStep ( X + 1, Y, Tool ) ;
- PlotterStep ( X, Y, Tool ) ;
- END ;
- Xprev := X ;
- Yprev := Y ;
- END ;
-
- PROCEDURE Plot ( X, Y : INTEGER ) ;
- BEGIN
- Control ( X, Y ) ;
- PlotterStep ( X, Y, None ) ;
- Position.X := X ; Position.Y := Y ;
- END ;
-
- PROCEDURE Clear ;
- VAR
- I : INTEGER ;
- Bl : Blocks ;
- BEGIN
- FOR I := 0 TO 1023 DO Bl [I] := 0 ;
- ReSet ( BitMap ) ;
- FOR I := 0 TO 89 DO BEGIN
- Seek ( BitMap, I SHL 3 ) ;
- BlockWrite ( BitMap, Bl, 8 ) ;
- END ;
- END ;
-
- BEGIN
- WITH Par DO
- CASE Command OF
- OpenF : Result := Open ;
- PointF : Result := Point ( X, Y ) ;
- DotF : Dot ( X, Y ) ;
- PlotF : Plot ( X, Y ) ;
- ClearF : Clear ;
- CloseF : Close ( BitMap ) ;
- END ;
- END ;
-