M4BASIC - allegro.m4b
Not logged in
REM Demo on how to embed an external library
REM http://alleg.sourceforge.net/
REM
REM The fractal code is based on the GWBasic Example
REM Mr. LEUNG Chi Kit
REM The Hong Kong Taoist Association Ching Chung Secondary School
REM
REM repaired/reworked by KindlyRat 16 Feb 2005
REM reworked for M4BASIC by PvE, August 2014 - GPL.
REM
REM Add the necessary include files and libraries as command line option to the compiler:
REM
REM gcc -include allegro5/allegro.h -include allegro5/allegro_primitives.h -g -o allegro allegro.c -lm -lgc -lallegro -lallegro_primitives
REM
REM --------------------------------------------------------------------------------

DECLARE *display = NULL TYPE ALLEGRO_DISPLAY
DECLARE *event_queue = NULL TYPE ALLEGRO_EVENT_QUEUE

DECLARE white, green, black, blue, red, yellow, COLOUR TYPE ALLEGRO_COLOR

IF NOT(al_init()) THEN
    PRINT "failed to initialize allegro!" NL
    END -1
ENDIF

LET display = al_create_display(640, 350)
IF NOT(display) THEN
    PRINT "failed to create display!" NL
    END -1
ENDIF
CALL al_set_window_title(display, "Drawing a fractal in Allegro!")

LET event_queue = al_create_event_queue()
IF NOT(event_queue) THEN
    PRINT "failed to create event_queue!" NL
    END -1
ENDIF

LET green = al_map_rgb(0, 255, 0)
LET black = al_map_rgb(0, 0, 0)
LET blue = al_map_rgb(0, 0, 255)
LET red = al_map_rgb(255, 0, 0)
LET white = al_map_rgb(255, 255, 255)
LET yellow = al_map_rgb(255, 255, 0)

CALL al_register_event_source(event_queue, al_get_display_event_source(display))
CALL al_clear_to_color(black)

CALL al_init_primitives_addon()

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

PRINT "Please wait, calculating and drawing...\n"

INTEGER LFT, TOP, W, RECEN, IMCEN, X, Y, J
FLOAT M, R, S, REC, IMC, RE, RE2, IM, IM2

LET LFT = 150 LET TOP = 380 LET W = 360 LET M = .833
LET R = 2.64 LET S = 2 * R / W
LET RECEN = 0 LET IMCEN = 0

FOR Y = 0 TO W
    FOR X = 0 TO W

        LET REC = S * (X - W / 2) + RECEN LET IMC = S * (Y - W / 2) + IMCEN
        LET RE = REC LET IM = IMC
        LET RE2 = RE * RE LET IM2 = IM * IM LET J = 0

        WHILE RE2 + IM2 <= 256 AND J < 15
            LET IM = 2 * RE * IM + IMC
            LET RE = RE2 - IM2 + REC
            LET RE2 = RE * RE LET IM2 = IM * IM LET J = J + 1
        WEND

        IF J < 3 THEN
            GOTO Next_Iter
        ELIF J >= 3 AND J < 6 THEN
            LET COLOUR = yellow
        ELIF J >= 6 AND J < 9 THEN
            LET COLOUR = blue
        ELIF J >= 9 AND J < 12 THEN
            LET COLOUR = green
        ELIF J >= 12 AND J < 15 THEN
            LET COLOUR = white
        ELIF J >= 15 THEN
            LET COLOUR = red
        ENDIF

        CALL al_draw_filled_circle(X + LFT, (TOP - Y)*M, 1, COLOUR)

        LABEL Next_Iter
    NEXT
NEXT

CALL al_flip_display()

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

WHILE TRUE

    DECLARE ev TYPE ALLEGRO_EVENT
    CALL al_wait_for_event(event_queue, &ev)

    IF ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE THEN
        BREAK
    ENDIF
WEND

CALL al_destroy_display(display)
CALL al_destroy_event_queue(event_queue)

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

Return to M4BASIC