REM
REM H.U.G. test program - PvE August 2009, GPL.
REM
REM --------------------------------------------------------------------------------------------------

INCLUDE "hug.bac"

REM --------------------------------------------------------------------------------------------------

CONST MaxIters = 100
CONST xSize =     480
CONST ySize =     330
CONST Black =    -1
CONST Left =     -2.0
CONST Right =    1.0
CONST Top =      1.0
CONST Bottom =  -1.0

SUB Draw_Fractal

    LOCAL x, y, count TYPE short
    LOCAL zr, zi, cr, ci TYPE long double
    LOCAL rsquared, isquared TYPE long double

    DISABLE(start_but)
    DISABLE(clear_but)

    REM Information to user
    OUT("Please wait...", "#0000FF", "#FFFFFF", 10, 300)

    FOR y = 0 TO ySize
        FOR x = 0 TO xSize
            zr = 0.0
            zi = 0.0
            cr = Left + x * (Right - Left) / xSize

            ci = Top + y * (Bottom - Top) / ySize
            rsquared = zr * zr
            isquared = zi * zi

            FOR count = 0 TO MaxIters
                zi = zr * zi * 2
                zi = zi + ci

                zr = rsquared - isquared
                zr = zr + cr

                rsquared = zr * zr
                isquared = zi * zi
            NEXT

            IF rsquared + isquared <= 4.0 THEN
                PIXEL(PixelCol$[ROUND((rsquared + isquared)*4)], x, y)
            END IF
        NEXT
    NEXT

    REM Tell drawing is ready
    SQUARE ("#FFFFFF", 10, 300, 100, 30, TRUE)
    OUT("Drawing ready.", "#0000FF", "#FFFFFF", 10, 300)

    ENABLE(clear_but)
    ENABLE(start_but)

END SUB

REM --------------------------------------------------------------------------------------------------

SUB Clear_Fractal

    SQUARE ("#FFFFFF", 0, 0, 480, 330, TRUE)

END SUB

REM --------------------------------------------------------------------------------------------------

SUB Quit_Prog

    QUIT

END SUB

REM --------------------------------------------------------------------------------------------------

REM Get some colors
GLOBAL PixelCol$[17] TYPE STRING

FOR i = 0 TO 16
    READ PixelCol$[i]
NEXT

DATA "#800000", "#800080", "#8000FF", "#808000", "#808080", "#8080FF", "#80FF00", "#80FF80", \
    "#80FFFF", "#FF0000", "#FF0080", "#FF00FF", "#FF8000", "#FF8080", "#FF80FF", "#FFFF00", "#000000"

REM Create the GUI
mainwin = WINDOW("Drawing a fractal", 500, 400)

frame = FRAME(490, 340)
ATTACH (mainwin, frame, 5, 5)
canvas = CANVAS(480, 330)
ATTACH (mainwin, canvas, 10, 10)

start_but = STOCK("gtk-execute", 100, 40)
ATTACH(mainwin, start_but, 5, 355)
CALLBACK (start_but, Draw_Fractal)

clear_but = STOCK("gtk-clear", 100, 40)
ATTACH(mainwin, clear_but, 120, 355)
CALLBACK (clear_but, Clear_Fractal)

labl = MARK("H.U.G. for BaCon!", 120, 40)
ATTACH(mainwin, labl, 240, 355)

quit_but = STOCK("gtk-quit", 100, 40)
ATTACH(mainwin, quit_but, 395, 355)
CALLBACK (quit_but, Quit_Prog)

DISPLAY