Glimmr Drawing Commands

version 2/101030 by Erik Temple

  • Home page
  • Beginning
  • Previous
  • Next



  • Chapter - Lines


    Section - Basic line
    [The code for drawing a line between any two points was ported from the GREX module of the GWindows system by L. Ross Raszewski (http://gwindows.trenchcoatsoft.com). The code is there indicated to having been based on code by Paul Heckbert.]

    To linedraw (hue - a number) in (win - a g-window) from (x1 - a number) by/x (y1 - a number) to (x2 - a number) by/x (y2 - a number) with (wgt - a number):
        let dd be x2 - x1;
        let ax be a number;
        let ay be a number;
        let sx be a number;
        let sy be a number;
        if dd >= 0:
            let ax be 2 times dd;
            let sx be 1;
        otherwise:
            let ax be -2 times dd;
            let sx be -1;
        let dd be y2 - y1;
        if dd >= 0:
            let ay be 2 times dd;
            let sy be 1;
        otherwise:
            let ay be -2 times dd;
            let sy be -1;
        let x be x1;
        let y be y1;
        if ax > ay:
            let x1 be 1;
            let d be ay - (ax / 2);
            while x is not x2:
                if d >= 0:
                    let y be y + sy;
                    let d be d - ax;
                let x be x plus sx;
                let d be d plus ay;
                if x is x2 or y is not y1:
                    if sx > 0:
                        dimrectdraw (hue) in win at (x - x1) by y1 with size x1 by wgt;
                    otherwise:
                        dimrectdraw (hue) in win at x by y1 with size x1 by wgt;
                    let y1 be y;
                    let x1 be 1;
                otherwise:
                    increase x1 by 1;
        otherwise:
            let y1 be 1;
            let d be ax - (ay / 2);
            while y is not y2:
                if d >= 0:
                    let x be x + sx;
                    let d be d - ay;
                let y be y + sy;
                let d be d + ax;
                if x is not x1 or y is y2:
                    if sy > 0:
                        dimrectdraw (hue) in win at x1 by (y - y1) with size wgt by y1;
                    otherwise:
                        dimrectdraw (hue) in win at x1 by y with size wgt by y1;
                    let y1 be 1;
                    let x1 be x;
                otherwise:
                    increase y1 by 1;


    To draw a/-- line (hue - a number) in (win - a g-window) from (x1 - a number) by/x (y1 - a number) to (x2 - a number) by/x (y2 - a number) with (wgt - a number) pixel/pixels/px/-- line-weight/stroke:
        #if utilizing Glimmr debugging;
        say "[>console][DC]Drawing a line of color [hue] in [i][win][/i] from ([x1], [y1]) to ([x2], [y2]), line-weight [wgt] pixels.[<]";
        #end if;
        linedraw (hue) in (win) from (x1) by (y1) to (x2) by (y2) with (wgt).
            

    To draw a/-- line (hue - a number) in (win - a g-window) from (coord1 - a list of numbers) to (coord2 - a list of numbers) with (wgt - a number) pixel/pixels/px/-- line-weight/stroke:
        let x1 be entry 1 of coord1;
        let y1 be entry 2 of coord1;
        let x2 be entry 1 of coord2;
        let y2 be entry 2 of coord2;
        Draw a line (hue) in win from x1 by y1 to x2 by y2 with wgt pixel line-weight.

    To line (coord1 - a list of numbers) to (coord2 - a list of numbers) at (wgt - a number) px/pixel/pixels:
        if the type of the current graphics window is not g-graphics:
            say "*** Error: Short-form line-drawing directive ignored. The current graphics window global was not correctly specified.";
            rule fails;
        let x1 be entry 1 of coord1;
        let y1 be entry 2 of coord1;
        let x2 be entry 1 of coord2;
        let y2 be entry 2 of coord2;
        Draw a line (current foreground-color) in current graphics window from x1 by y1 to x2 by y2 with wgt pixel line-weight.