Glimmr Canvas-Based Drawing

version 2/101030 by Erik Temple

  • Home page
  • Beginning
  • Previous
  • Next



  • Chapter - Calculating the scaling factors

    Scaling something is an activity.

    Last for scaling a graphics g-window (called the window) (this is the default window-scaling rule):
        #if utilizing Glimmr debugging;
        say "[>console][CBD]Window [i][window][/i] is [width of the window] by [height of the window] pixels.[<]";
        #end if;
        let panel be the associated canvas of the window;
        if panel is nothing:
            say "*** Scaling error: No canvas defined for [italic type][window][roman type].";
            rule fails;
        if the canvas-width of panel is 0 or the canvas-height of panel is 0:
            if the background image of panel is Figure of Null:
                #if utilizing Glimmr debugging;
                say "[>console][CBD]*** Scaling error: Dimensions of canvas [i][panel][/i] not specified. Either define the canvas using a background image, or assign numerical dimensions.[<]";
                #end if;
                rule fails;
            [doubling up of variables necessary due to an apparent bug in Inform]
            let canvas-x be the image-width of the background image of panel;
            let canvas-y be the image-height of the background image of panel;
            now the canvas-width of panel is canvas-x;
            now the canvas-height of panel is canvas-y;
            #if utilizing Glimmr debugging;
            say "[>console][CBD]Canvas [i][panel][/i] is [canvas-width of panel] by [canvas-height of panel] pixels.[<]";
            #end if;
        if the arbitrary scaling factor of the window is real greater than 0.0000:
            now the scaling factor of the window is the arbitrary scaling factor of the window;
            #if utilizing Glimmr debugging;
            say "[>console][CBD]Scaling factor of [i][window][/i] set to [scaling factor of the window] based on arbitrary scaling factor.[<]";
            #end if;
        otherwise:
            let x-win be the width of the window as a fixed point number;
            let y-win be the height of the window as a fixed point number;
            now the x-scaling factor of the window is x-win real divided by the canvas-width of panel;
            now the y-scaling factor of the window is y-win real divided by the canvas-height of panel;
            if the x-scaling factor of the window is real greater than the y-scaling factor of the window:
                now the scaling factor of the window is the y-scaling factor of the window;
                #if utilizing Glimmr debugging;
                say "[>console][CBD][i][window][/i] scaling factor set to the vertical scaling factor: [y-scaling factor of the window].[<]";
                #end if;
            otherwise:
                now the scaling factor of the window is the x-scaling factor of the window;
                #if utilizing Glimmr debugging;
                say "[>console][CBD][i][window][/i] scaling factor set to the horizontal scaling factor: [i][x-scaling factor of the window][/i].[<]";
                #end if;
            if the scaling factor of the window is greater than 1.0000:
                unless the oversize scaling of the window is true:
                    now the scaling factor of the window is 1.0000;
                    #if utilizing Glimmr debugging;
                    say "[>console][CBD][i][window][/i] scaling factor set to [scaling factor of the window]. To allow for a higher scaling factor, set the window's oversize scaling property to true.[<]";
                    #end if;
        now the scaled width of panel is the scaling factor of the window real times the canvas-width of panel as an integer;
        now the scaled height of panel is the scaling factor of the window real times the canvas-height of panel as an integer;
        #if utilizing Glimmr debugging;
        say "[>console][CBD]Scaled size for canvas [i][panel][/i] is [scaled width of panel] by [scaled height of panel].[<]";
        #end if;