--------------------------------------
-- Drawing Primitives
--------------------------------------
include GtkEngine.e
include GtkEnums.e
include GtkRoutines.e
include std/filesys.e
enum CLEAR, BKGND, LINES, DOTS, RECTS, ARCS, PIX
object drawable, canvas, gc
constant img = create(GdkPixbuf,"from_file::"
& canonical_path("~/demos/MorningRain.jpg"))
sequence dim = {512,348}
----------------------------------
function random(integer x)
----------------------------------
if x < 1 then x = 1 end if
return rand(x)
end function
----------------------------------
function Draw(atom ctl, atom what)
----------------------------------
-- generate random coordinates;
sequence size = get_size(canvas)
integer x1 = random(size[1])
integer x2 = random(size[1])
integer y1 = random(size[2])
integer y2 = random(size[2])
integer w = random(size[1]-x1)
integer h = random(size[2]-y1)
integer a1 = random(360*64)
integer a2 = random(360*64)
-- generate a random background color;
sequence rcolor = sprintf("#%02x%02x%02x", {rand(#FF),rand(#FF),rand(#FF)})
-- generate a random drawing color;
set_foreground(gc,rand(#FFFFFF))
switch what do
case CLEAR then set(drawable,"modify bg",0,"white") clear(canvas)
case BKGND then set(drawable,"modify bg",0,rcolor)
case LINES then draw_line(canvas,gc,x1,y1,x2,y2)
case DOTS then
for i = 1 to 1000 do
set_foreground(gc,rand(#FFFFFFF))
raw_point(canvas,gc,rand(size[1]),rand(size[2]))
end for
case RECTS then draw_rectangle(canvas,gc,TRUE,x1,y1,w,h)
case ARCS then draw_arc(canvas,gc,TRUE,x1,y1,w,h,a1,a2)
case PIX then draw_pixbuf(canvas,gc,img,0,0,0,0,dim[1],dim[2])
end switch
return 1
end function
constant draw = call_back(routine_id("Draw"))
constant win = create(GtkWindow)
connect(win,"destroy",quit)
set(win,"position",GTK_WIN_POS_CENTER)
set(win,"default size",dim[1],dim[2])
constant panel = create(GtkVBox)
add(win,panel)
drawable = create(GtkDrawingArea)
add(panel,drawable)
constant btnbox = create(GtkHButtonBox)
pack(panel,-btnbox)
constant btn1 = create(GtkButton,"gtk-quit")
set(btn1,"tooltip text","Click to quit")
connect(btn1,"clicked",quit)
constant btn2 = create(GtkButton,"_Lines")
set(btn2,"tooltip text","Draw a line in random color")
connect(btn2,"clicked",draw,LINES)
constant btn3 = create(GtkButton,"_Dots")
set(btn3,"tooltip text","Draw 1000 random dots")
connect(btn3,"clicked",draw,DOTS)
constant btn4 = create(GtkButton,"_Rects")
set(btn4,"tooltip text","Draw a random rectangle")
connect(btn4,"clicked",draw,RECTS)
constant btn5 = create(GtkButton,"_Arcs")
set(btn5,"tooltip text","Draw random arcs")
connect(btn5,"clicked",draw,ARCS)
constant btn6 = create(GtkButton,"_Img")
set(btn6,"tooltip text","Insert an image")
connect(btn6,"clicked",draw,PIX)
constant btn7 = create(GtkButton,"_Bkgnd")
set(btn7,"tooltip text","Change to a random background color")
connect(btn7,"clicked",draw,BKGND)
constant btn8 = create(GtkButton,"_Clear")
set(btn8,"tooltip text","Clear the canvas")
connect(btn8,"clicked",draw,CLEAR)
add(btnbox,{btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8})
show_all(win)
-- following must be done after drawing surface is shown:
constant style = get(drawable,"style")
canvas = peek4u(drawable + 52)
gc = peek4u(style + 540)
main()