eumandy/eugtk/examples/test61.ex
2016-11-25 00:33:18 -07:00

94 lines
2.3 KiB
Elixir

------------------------------------------------------------------------------
--# Simple Cairo graphics
------------------------------------------------------------------------------
include GtkEngine.e
include GtkCairo.e
include std/mathcons.e
atom surf = create(CairoImageSurface,"./thumbnails/MorningRain.png")
constant win = create(GtkWindow,
"icon=applications-graphics,resizable=FALSE,position=1,$destroy=Quit")
constant box = create(GtkBox,HORIZONTAL)
-- redraw whenever necessary. if you don't do this, other windows will destroy
-- contents of this window when they overlay it:
connect(box,"draw","Paint")
constant screen = create(GtkDrawingArea,"size request=400x300")
add(box,screen)
add(win,box)
show_all(win)
constant dwin = get(screen,"window")
main()
---------------------------------------------------------
global function Paint(atom ctl, atom event)
---------------------------------------------------------
atom cr = create(GdkCairo_t,dwin) -- new cairo_t
---- background image;
set(cr,{
{"source surface",surf,1,1},
{"paint"},
---- text;
{"color","black"},
{"move to",10,30},
{"font size",30},
{"show text","Drawing Primitives"},
---- text;
{"color","red"},
{"move to",200,200},
{"font size",20},
{"show text","Hello World!"},
---- triangle;
{"color","yellow"},
{"line width",2},
{"move to",100,100},
{"line to",200,200},
{"line to",200,100},
{"line to",100,100},
{"stroke"},
---- rectangle blue;
{"source rgba",0,0,#FF,0.4}, -- alternate way to set color and alpha;
{"rectangle",80,80,40,50},
{"fill preserve"},
---- add white outline;
{"source rgb",#FF,#FF,#FF}, -- alternate way to set color;
{"line width",2},
{"stroke"}})
---- the arc or circle 0 or starting point is at 90 degrees or 3 o'clock;
---- I find it easier to think in terms of N,S,E,W, with north at 0/360
---- therefore this simple conversion code;
atom degree = math:TWOPI/360
atom north = -degree*90
atom east = north + (degree*90)
atom south = east + (degree*90)
atom west = south + (degree*90)
set(cr,{
{"source rgba",0,#FF,0,0.4}, -- semi-transparent green circle;
{"line width",2},
{"arc",200,200,55,north,degree*360}, -- 'from due north to north + 360 degrees'
{"fill"},
{"destroy"}}) -- important!
return 1
end function