blob: 9ab13c0b5998e393621473a7575b7b79cd48018a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <gset.h>
include <gio.h>
include <gki.h>
include "gtr.h"
# GTR_BACKUP -- Backup one drawing instruction in the frame buffer. Erase
# the graphics if possible. The effects of this function may be undone by
# the UNDO operator.
procedure gtr_backup (stream)
int stream # graphics stream
int opcode
pointer tr, op, bp, sp, ap
pointer gtr_init()
errchk gtr_init
include "gtr.com"
begin
call smark (sp)
call salloc (ap, LEN_PL, TY_STRUCT)
tr = gtr_init (stream)
# Scan backward to the beginning of the last drawing instruction in the
# frame buffer.
op = TR_OP(tr)
bp = TR_FRAMEBUF(tr)
if (op <= bp) {
call sfree (sp)
return
}
repeat {
op = op - 1
while (Mems[op] != BOI)
if (op <= bp) {
TR_OP(tr) = bp
TR_IP(tr) = bp
call sfree (sp)
return
} else
op = op - 1
opcode = Mems[op+GKI_HDR_OPCODE-1]
} until (opcode >= GKI_POLYLINE && opcode <= GKI_PUTCELLARRAY)
# Redraw the last instruction to erase it (device permitting).
if (opcode == GKI_POLYLINE) {
PL_LTYPE(ap) = GL_CLEAR
PL_WIDTH(ap) = 1.0
PL_COLOR(ap) = 1
call gki_plset (stream, ap)
if (wstranset == YES)
call gtr_wstran (Mems[op])
else
call gki_write (stream, Mems[op])
PL_LTYPE(ap) = GL_SOLID
call gki_plset (stream, ap)
call gki_fflush (stream)
}
# Return the space in the buffer.
TR_LASTOP(tr) = TR_OP(tr)
TR_OP(tr) = op
TR_IP(tr) = min (op, TR_IP(tr))
call sfree (sp)
end
|