aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/cursor/gtrundo.x
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