diff options
Diffstat (limited to 'ipl/gprocs/xformimg.icn')
-rw-r--r-- | ipl/gprocs/xformimg.icn | 168 |
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 |