#!../gtkscript REM REM Draw a fractal with GtkScript. REM REM Codesample ported from KSH. Feb 20, 2006 - PvE. REM Adjusted for GtkScript 0.72 at june 18, 2006 - PvE. REM------------------------------------------------------- Draw a pixel SUB Draw_Pixel IF SUM < 1.0 THEN INDEX=INT(SUM*16)+1 ELSE INDEX=16 ENDIF gdk_color_parse(PICOL$(INT(INDEX)), COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_point(PIX$, GC$, X, Y) gtk_widget_queue_draw(IMAGE$) EVENT$ = gtk_server_callback("update") IF EVENT$ = EXIT_BUTTON$ OR EVENT$ = WIN$ THEN gtk_exit(0) ENDIF ENDSUB REM------------------------------------------------------- Calc stuff REM The core calculation routine was taken from REM http://www.cygnus-software.com/theory/theory.htm REM and translated to KornShell by me. REM With friendly permission of Cygnus-Software. SUB Draw_Fractal MaxIters=100 SIZE=240 BLACK=-1 LEFT=-2.0 RIGHT=1.0 TOP=1.0 BOTTOM=-1.0 REM Tell drawing is starting gdk_color_parse("#000000", COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_layout(PIX$, GC$, 4, 240, START$) gtk_widget_queue_draw(IMAGE$) gtk_server_callback("update") REM The calculation Y=0 WHILE Y < SIZE X=0 WHILE X < SIZE ZR=0.0 ZI=0.0 CR=(X*(RIGHT-LEFT))/SIZE + LEFT CI=(Y*(BOTTOM-TOP))/SIZE + TOP RSQUARED=ZR*ZR ISQUARED=ZI*ZI COUNT=0 WHILE (RSQUARED+ISQUARED < 2.0) AND (COUNT < MaxIters) ZI=ZR*ZI*2.0 ZI=ZI+CI ZR=RSQUARED-ISQUARED ZR=ZR+CR RSQUARED=ZR*ZR ISQUARED=ZI*ZI COUNT = COUNT + 1 WEND SUM=RSQUARED+ISQUARED IF SUM < 2.0 THEN CALL Draw_Pixel ENDIF X=X+1 WEND gtk_widget_queue_draw(IMAGE$) gtk_server_callback("update") Y=Y+1 WEND REM Wipe wait text gdk_color_parse("#ffffff", COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_rectangle(PIX$, GC$, 1, 4, 240, 100, 25) REM Tell drawing is ready gdk_color_parse("#000000", COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_layout(PIX$, GC$, 4, 240, READY$) gtk_widget_queue_draw(IMAGE$) gtk_server_callback("update") ENDSUB REM ------------------------------------------------------- SUB Clear_Canvas REM Put color to WHITE gdk_color_parse("#ffffff", COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_rectangle(PIX$, GC$, 1, 0, 0, 450, 265) REM Put color to BLACK gdk_color_parse("#000000", COL$) gdk_gc_set_rgb_fg_color(GC$, COL$) gdk_draw_layout(PIX$, GC$, 120, 240, LAYOUT$) gtk_widget_queue_draw(IMAGE$) ENDSUB REM ------------------------------------------------------- REM Define array with colors - taken from the newLisp HTML fractal example DIM PICOL$(16) PICOL$(1)="#800000" PICOL$(2)="#800080" PICOL$(3)="#8000FF" PICOL$(4)="#808000" PICOL$(5)="#808080" PICOL$(6)="#8080FF" PICOL$(7)="#80FF00" PICOL$(8)="#80FF80" PICOL$(9)="#80FFFF" PICOL$(10)="#FF0000" PICOL$(11)="#FF0080" PICOL$(12)="#FF00FF" PICOL$(13)="#FF8000" PICOL$(14)="#FF8080" PICOL$(15)="#FF80FF" PICOL$(16)="#FFFF00" REM Check GTK version version$ = gtk_check_version(2, 4, 0) IF LEN(version$) > 0 THEN PRINT "Your GTK installation is too old!" PRINT "GTK version 2.4.0 or higher is required. Exiting..." gtk_exit(0) END ENDIF REM Window gtk_init(NULL, NULL) WIN$ = gtk_window_new(0) gtk_window_set_title(WIN$, CHR$(34) + "GtkScript: Julia Fractal" + CHR$(34)) gtk_widget_set_size_request(WIN$, 300, 300) gtk_window_set_position(WIN$, 1) gtk_window_set_resizable(WIN$, 0) REM Create widget to display image IMAGE$ = gtk_image_new() REM Create eventbox to catch mouseclick EBOX$ = gtk_event_box_new() gtk_container_add(EBOX$, IMAGE$) REM Separator SEP$ = gtk_hseparator_new() REM Action button ACTION_BUTTON$ = gtk_button_new_with_label("Draw!") gtk_widget_set_size_request(ACTION_BUTTON$, 75, 30) REM Clear button CLEAR_BUTTON$ = gtk_button_new_with_label("Clear") gtk_widget_set_size_request(CLEAR_BUTTON$, 75, 30) REM Exit button EXIT_BUTTON$ = gtk_button_new_with_label("Exit") gtk_widget_set_size_request(EXIT_BUTTON$, 75, 30) REM Now arrange widgets on window using boxes HBOX$ = gtk_hbox_new(0, 0) gtk_box_pack_start(HBOX$, CLEAR_BUTTON$, 0, 0, 1) gtk_box_pack_start(HBOX$, ACTION_BUTTON$, 0, 0, 1) gtk_box_pack_end(HBOX$, EXIT_BUTTON$, 0, 0, 1) VBOX$ = gtk_vbox_new(0, 0) gtk_box_pack_start(VBOX$, EBOX$, 0, 0, 1) gtk_box_pack_start(VBOX$, SEP$, 0, 0, 1) gtk_box_pack_end(VBOX$, HBOX$, 0, 0, 1) gtk_container_add(WIN$, VBOX$) REM Show all widgets gtk_widget_show_all(WIN$) REM Create the pixmap GDKWIN$ = gtk_widget_get_parent_window(IMAGE$) PIX$ = gdk_pixmap_new(GDKWIN$, 300, 265, -1) GC$ = gdk_gc_new(PIX$) gtk_image_set_from_pixmap(IMAGE$, PIX$, NULL) REM Allocate memory with some random widget for GdkColor COL$ = gtk_frame_new(NULL) REM Now set backgroundcolor to WHITE gdk_color_parse("#ffffff", COL$) gdk_gc_set_rgb_bg_color(GC$, COL$) LAYOUT$ = gtk_widget_create_pango_layout(IMAGE$, CHR$(34) + "Draw a fractal with GtkScript!" + CHR$(34)) CALL Clear_Canvas REM Define start and finishing text START$ = gtk_widget_create_pango_layout(IMAGE$, CHR$(34) + "Please wait..." + CHR$(34) ) READY$ = gtk_widget_create_pango_layout(IMAGE$, CHR$(34) + "Drawing ready." + CHR$(34) ) REM Update the IMAGE widget with the pixmap gtk_widget_queue_draw(IMAGE$) REM Mainloop DO REM Get event EVENT$ = gtk_server_callback("wait") REM If action button is pressed IF EVENT$ = ACTION_BUTTON$ THEN CALL Draw_Fractal ENDIF REM If clear button is pressed IF EVENT$ = CLEAR_BUTTON$ THEN CALL Clear_Canvas ENDIF UNTIL EVENT$ = WIN$ OR EVENT$ = EXIT_BUTTON$ REM Exit GTK gtk_exit(0)