aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/gtext.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/gio/gtext.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/gio/gtext.x')
-rw-r--r--sys/gio/gtext.x77
1 files changed, 77 insertions, 0 deletions
diff --git a/sys/gio/gtext.x b/sys/gio/gtext.x
new file mode 100644
index 00000000..abb26ef4
--- /dev/null
+++ b/sys/gio/gtext.x
@@ -0,0 +1,77 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <gio.h>
+
+# GTEXT -- Draw text. All textual output via GIO is via this primitive. Unlike
+# polyline, polymarker, fill area, and cell array output, textual output is not
+# subjected to clipping by GIO. Clipping may be performed at the kernel level
+# if a workstation viewport is defined. Our task here is principally to parse
+# the format string and set up the text attributes, then insert the text drawing
+# instruction into the GKI instruction stream. The real work of text generation
+# is very device dependent and is therefore left to the kernel.
+
+procedure gtext (gp, x, y, text, format)
+
+pointer gp # graphics descriptor
+real x, y # position at which text is to be drawn
+char text[ARB] # text to be drawn
+char format[ARB] # text drawing parameters
+
+int ip, i
+real mx, my
+pointer sp, ap, tx
+bool text_attributes_modified
+
+begin
+ call smark (sp)
+ call salloc (ap, LEN_TX, TY_STRUCT)
+
+ # Set up pointers to text attribute packets and initialize the
+ # new packet to the default values. Two text attribute packets
+ # are maintained in GP: TXAP, the default packet, and TXAPCUR,
+ # the packet last sent to the device. In what follows, AP is
+ # the new packet and TX is the packet last sent to the device.
+ # We start by initializing the new packet at AP to the default
+ # text drawing parameters.
+
+ call amovi (Memi[GP_TXAP(gp)], Memi[ap], LEN_TX)
+ tx = GP_TXAPCUR(gp)
+
+ # Parse the format string and set the text attributes. The code is
+ # more general than need be, i.e., the entire attribute name string
+ # is extracted but only the first character is used. Whitespace is
+ # permitted and ignored.
+
+ ip = 1
+ call gtxset (ap, format, ip)
+
+ # If the old text attribute packet was never fixed always fix the
+ # new packet, otherwise determine whether or not any text attributes
+ # were actually modified and only fix the new packet if it is
+ # different.
+
+ text_attributes_modified = false
+ for (i=2; i <= LEN_TX; i=i+1)
+ if (Memi[ap+i-1] != Memi[tx+i-1]) {
+ text_attributes_modified = true
+ break
+ }
+
+ # Flush any buffered polyline output, and transform the text coordinates
+ # to GKI device coordinates.
+
+ call gpl_flush()
+ call gpl_wcstogki (gp, x, y, mx, my)
+
+ # Update text attributes if necessary.
+ if (text_attributes_modified || TX_STATE(tx) != FIXED) {
+ call amovi (Memi[ap], Memi[tx], LEN_TX)
+ call gki_txset (GP_FD(gp), tx)
+ TX_STATE(tx) = FIXED
+ }
+
+ # Output text drawing instruction.
+ call gki_text (GP_FD(gp), nint(mx), nint(my), text)
+
+ call sfree (sp)
+end