diff options
Diffstat (limited to 'man/2/draw-example')
| -rw-r--r-- | man/2/draw-example | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/man/2/draw-example b/man/2/draw-example new file mode 100644 index 00000000..e006e724 --- /dev/null +++ b/man/2/draw-example @@ -0,0 +1,116 @@ +.TH DRAW-EXAMPLE 2 +.SH NAME +draw: example \- +simple program illustrating image primitives +.SH DESCRIPTION +This manual page presents a self-contained simple program that illustrates most +of the feature of the basic draw library. +It must be run at the top-level Inferno shell prompt, not within a window system, +as it establishes its own connection to the display and writes directly +on the display, not in a private window. +.PP +The program exercises the drawing primitives, taking particular care +to maintain a consistent coordinate system for the combinations of +images on the display. Comments in the code introduce each step. +.PP +.EX +implement Test; + +include "sys.m"; + +include "draw.m"; + +Test: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +init(nil: ref Draw->Context, nil: list of string) +{ + sys := load Sys Sys->PATH; + draw := load Draw Draw->PATH; + Display, Font, Rect, Point, Image, Screen: import draw; + + # + # Set up connection to display and initialize colours. + # + display := draw->Display.allocate(nil); + disp := display.image; + red := display.color(Draw->Red); + blue := display.color(Draw->Blue); + white := display.color(Draw->White); + yellow := display.color(Draw->Yellow); + + # + # Paint the screen red. + # + disp.draw(disp.r, red, nil, disp.r.min); + sys->sleep(5000); + + # + # Texture a region with rectangular tiles. + # + texture := display.newimage(((0,0),(2,3)), + disp.chans, 1, Draw->Black); + texture.clipr = ((-10000,-10000),(10000,10000)); + # put something in the texture + texture.draw(((0,0),(1,3)), white, nil, (0,0)); + texture.draw(((0,0),(2, 1)), white, nil, (0,0)); + # use texture as both source and mask to let + # destination colour show through + disp.draw(((100,100),(200,300)), texture, + texture, (0,0)); + sys->sleep(5000); + + # + # White-out a quarter of the pixels in a region, + # to make the region appear shaded. + # + stipple := display.newimage(((0,0),(2,2)), + disp.chans, 1, Draw->Transparent); + stipple.draw(((0,0),(1,1)), display.opaque, + nil, (0,0)); + disp.draw(((100,100),(300,250)), white, + stipple, (0,0)); + sys->sleep(5000); + + # + # Draw textured characters. + # + font := Font.open(display, "*default*"); + disp.text((100,310), texture, (0,0), font, + "Hello world"); + sys->sleep(5000); + + # + # Draw picture in elliptical frame. + # + delight := display.open("/icons/delight.bit"); + piccenter := delight.r.min.add(delight.r.max).div(2); + disp.fillellipse((250,250), 150, 50, + delight, piccenter); + disp.ellipse((250,250), 150, 50, 3, yellow, (0,0)); + sys->sleep(5000); + + # + # Draw a parabolic brush stroke using an elliptical brush + # to reveal more of the picture, consistent with what's + # already visible. + # + dx : con 15; + dy : con 3; + brush := display.newimage(((0,0),(2*dx+1,2*dy+1)), disp.chans, + 0, Draw->Black); + brush.fillellipse((dx,dy), dx, dy, display.white, + (0,0)); + for(x:=delight.r.min.x; x<delight.r.max.x; x++){ + y := (x-piccenter.x)*(x-piccenter.x)/80; + y += 2*dy+1; # so whole brush is visible at top + xx := x+(250-piccenter.x)-dx; + yy := y+(250-piccenter.y)-dy; + disp.gendraw(((xx,yy),(xx+2*dx+1,yy+2*dy+1)), + delight, (x-dx, y-dy), brush, + (0,0)); + } +} +.EE |
