summaryrefslogtreecommitdiff
path: root/ipl/gprocs/xformimg.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gprocs/xformimg.icn')
-rw-r--r--ipl/gprocs/xformimg.icn168
1 files changed, 168 insertions, 0 deletions
diff --git a/ipl/gprocs/xformimg.icn b/ipl/gprocs/xformimg.icn
new file mode 100644
index 0000000..ce2b2f2
--- /dev/null
+++ b/ipl/gprocs/xformimg.icn
@@ -0,0 +1,168 @@
+############################################################################
+#
+# File: xformimg.icn
+#
+# Subject: Procedures to transform image
+#
+# Author: Ralph E. Griswold
+#
+# Date: February 4, 1995
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# These procedures perform reflections, rotations, and concatenations
+# of images.
+#
+# Warning: Some of these operations are slow.
+#
+############################################################################
+#
+# Requires: Version 9 graphics
+#
+############################################################################
+#
+# Links: numbers, wattrib, wopen
+#
+############################################################################
+
+link numbers
+link wattrib
+link wopen
+
+procedure wreflect(win1, dir)
+ local win2, x1, x2, y1, y2, width, height
+
+ /dir := "v" # vertical reflection is the default
+
+ height := Height(win1)
+ width := Width(win1)
+
+ win2 := WOpen("canvas=hidden", "width=" || width, "height=" || height) |
+ stop("*** cannot window for reflection")
+
+ case dir of {
+ "h": {
+ x2 := 0
+ y2 := height - 1
+ every Fg(win2, Pixel(win1)) do {
+ DrawPoint(win2, x2, y2)
+ if x2 = width - 1 then {
+ x2 := 0
+ y2 -:= 1
+ }
+ else x2 +:= 1
+ }
+ }
+ "v": {
+ x2 := width - 1
+ y2 := 0
+ every Fg(win2, Pixel(win1)) do {
+ DrawPoint(win2, x2, y2)
+ if x2 = 0 then {
+ x2 := width - 1
+ y2 +:= 1
+ }
+ else x2 -:= 1
+ }
+ }
+ default: stop("*** invalid specification for reflect()")
+ }
+
+ return win2
+
+end
+
+procedure wrotate(win1, dir)
+ local win2, x1, x2, y1, y2, width, height
+
+ /dir := "90" # 90-degree rotation is the default
+
+ height := Height(win1)
+ width := Width(win1)
+
+
+ case integer(dir) of {
+ 90: {
+ x2 := height - 1
+ y2 := 0
+ win2 := WOpen("canvas=hidden", "width=" || height,
+ "height=" || width) | stop("*** cannot open target window")
+ every Fg(win2, Pixel(win1)) do {
+ DrawPoint(win2, x2, y2)
+ if y2 = width - 1 then {
+ y2 := 0
+ x2 -:= 1
+ }
+ else y2 +:= 1
+ }
+ }
+ -90: {
+ win2 := WOpen("canvas=hidden", "width=" || height,
+ "height=" || width) | stop("*** cannot open target window")
+ x2 := 0
+ y2 := width - 1
+ every Fg(win2, Pixel(win1)) do {
+ DrawPoint(win2, x2, y2)
+ if y2 = 0 then {
+ y2 := width - 1
+ x2 +:= 1
+ }
+ else y2 -:= 1
+ }
+ }
+ 180: {
+ win2 := WOpen("canvas=hidden", "width=" || width,
+ "height=" || height) | stop("*** cannot open target window")
+ x2 := width - 1
+ y2 := height - 1
+ every Fg(win2, Pixel(win1)) do {
+ DrawPoint(win2, x2, y2)
+ if x2 = 0 then {
+ x2 := width - 1
+ y2 -:= 1
+ }
+ else x2 -:= 1
+ }
+ }
+ default: stop("*** invalid specification for rotate()")
+ } | stop("*** invalid specification for rotate()")
+
+ return win2
+
+end
+
+procedure wcatenate(win1, win2, dir)
+ local width1, width2, height1, height2, win3
+
+ /dir := "h" # horizontal concatenation is the default
+
+ width1 := Width(win1)
+ width2 := Width(win2)
+ height1 := Height(win1)
+ height2 := Height(win2)
+
+ case dir of {
+ "h": {
+ win3 := WOpen("canvas=hidden", "width=" || (width1 + width2),
+ "height=" || max(height1, height2)) |
+ stop("*** cannot open window for concatenation")
+ CopyArea(win1, win3)
+ CopyArea(win2, win3, 0, 0, width2, height2, width1, 0)
+ }
+ "v": {
+ win3 := WOpen("canvas=hidden", "width=" || max(width1, width2),
+ "height=" || (height1 + height2)) |
+ stop("*** cannot open window for concatenation")
+ CopyArea(win1, win3)
+ CopyArea(win2, win3, 0, 0, width2, height2, 0, height1)
+ }
+ default: stop("*** invalid specification for catenate()")
+ }
+
+ return win3
+
+end