94 lines
2.3 KiB
Elixir
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
|
|
|
|
|
|
|