blob: 5b8d3e0297f6cfa81e65797e093dd4eeeb97b5a5 (
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
75
76
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <gset.h>
include <gio.h>
include <gki.h>
include "gtr.h"
# GTR_UNDO -- Undo the last frame buffer edit. Successive pairs of undos leave
# the frame buffer unchanged.
procedure gtr_undo (stream)
int stream # graphics stream
int opcode
pointer tr, op, new_op, old_op, 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)
old_op = TR_OP(tr)
new_op = TR_LASTOP(tr)
if (new_op == old_op || new_op <= TR_FRAMEBUF(tr)) {
call sfree (sp)
return
}
# Edit the frame buffer.
TR_LASTOP(tr) = old_op
TR_OP(tr) = new_op
TR_IP(tr) = min (new_op, TR_IP(tr))
# Redraw the last drawing instruction to erase it (device permitting),
# if we are backing up one instruction. Note that it may be necessary
# to skip one or more control instructions. We assume that the undo
# only has to undo one drawing instruction.
if (new_op < old_op) {
op = new_op
repeat {
opcode = Mems[op+GKI_HDR_OPCODE-1]
if (opcode == GKI_POLYLINE)
break
else
op = op + Mems[op+GKI_HDR_LENGTH-1]
} until (op >= old_op)
if (opcode == GKI_POLYLINE && op < old_op) {
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)
}
} else if (new_op > old_op) {
# Call giotr to redraw the recovered instructions.
call giotr (stream)
}
call gki_flush (stream)
call sfree (sp)
end
|