diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | doc/tutorial/src/Makefile | 12 | ||||
-rw-r--r-- | doc/tutorial/src/README | 66 | ||||
-rw-r--r-- | doc/tutorial/src/circle.c | 13 | ||||
-rw-r--r-- | doc/tutorial/src/expander.c | 13 | ||||
-rw-r--r-- | doc/tutorial/src/include/cairo-tutorial-gtk.h (renamed from doc/tutorial/src/cairo-tutorial-gtk.h) | 0 | ||||
-rw-r--r-- | doc/tutorial/src/include/cairo-tutorial-pdf.h (renamed from doc/tutorial/src/cairo-tutorial-pdf.h) | 0 | ||||
-rw-r--r-- | doc/tutorial/src/include/cairo-tutorial-png.h (renamed from doc/tutorial/src/cairo-tutorial-png.h) | 0 | ||||
-rw-r--r-- | doc/tutorial/src/include/cairo-tutorial-xlib.h (renamed from doc/tutorial/src/cairo-tutorial-xlib.h) | 44 | ||||
-rw-r--r-- | doc/tutorial/src/include/cairo-tutorial.h (renamed from doc/tutorial/src/cairo-tutorial.h) | 0 | ||||
-rw-r--r-- | doc/tutorial/src/lca.c | 32 |
11 files changed, 178 insertions, 30 deletions
@@ -1,5 +1,33 @@ 2006-01-26 Carl Worth <cworth@cworth.org> + * doc/tutorial/src/cairo-tutorial.h: + * doc/tutorial/src/cairo-tutorial-gtk.h: + * doc/tutorial/src/cairo-tutorial-pdf.h: + * doc/tutorial/src/cairo-tutorial-png.h: + * doc/tutorial/src/cairo-tutorial-xlib.h: + * doc/tutorial/src/include/cairo-tutorial.h: + * doc/tutorial/src/include/cairo-tutorial-gtk.h: + * doc/tutorial/src/include/cairo-tutorial-pdf.h: + * doc/tutorial/src/include/cairo-tutorial-png.h: + * doc/tutorial/src/include/cairo-tutorial-xlib.h: + Move the magic header files to be down in an include directory and + more out of the way. + + * doc/tutorial/src/Makefile: Look for the headers in -I./include. + + * doc/tutorial/src/circle.c: (draw): Make the circle track the + width and height of the window dynamically. + + * doc/tutorial/src/expander.c: Remove boring expander example. + + * doc/tutorial/src/lca.c: (draw): Add more interesting LCA + exmaple. + + * doc/tutorial/src/README: Add some notes about how to use this + stuff. + +2006-01-26 Carl Worth <cworth@cworth.org> + * doc/tutorial/slides/cairo-large-content.svg: Here's the actual template I was referring to in my previous commit. diff --git a/doc/tutorial/src/Makefile b/doc/tutorial/src/Makefile index 2aeef4f02..b48a96f0a 100644 --- a/doc/tutorial/src/Makefile +++ b/doc/tutorial/src/Makefile @@ -1,4 +1,4 @@ -MYCFLAGS=$(shell pkg-config --cflags --libs cairo gtk+-2.0) -Wall -g -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing +MYCFLAGS=-I./include $(shell pkg-config --cflags --libs cairo gtk+-2.0) -Wall -g -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -fno-strict-aliasing # If you don't want to/can't compile all of these targets, then trim # this list. @@ -7,25 +7,25 @@ all: gtk xlib png GTK_EXAMPLES=$(patsubst %.c,%-gtk,$(wildcard *.c)) gtk: $(GTK_EXAMPLES) -%-gtk:%.c cairo-tutorial-gtk.h +%-gtk:%.c ./include/cairo-tutorial-gtk.h $(CC) -DCAIRO_TUTORIAL_GTK $(CFLAGS) $(MYCFLAGS) -o $@ $< XLIB_EXAMPLES=$(patsubst %.c,%-xlib,$(wildcard *.c)) xlib: $(XLIB_EXAMPLES) -%-xlib:%.c cairo-tutorial-xlib.h +%-xlib:%.c ./include/cairo-tutorial-xlib.h $(CC) -DCAIRO_TUTORIAL_XLIB $(CFLAGS) $(MYCFLAGS) -o $@ $< PDF_EXAMPLES=$(patsubst %.c,%-pdf,$(wildcard *.c)) pdf: $(PDF_EXAMPLES) -%-pdf:%.c cairo-tutorial-pdf.h +%-pdf:%.c ./include/cairo-tutorial-pdf.h $(CC) -DCAIRO_TUTORIAL_PDF $(CFLAGS) $(MYCFLAGS) -o $@ $< PNG_EXAMPLES=$(patsubst %.c,%-png,$(wildcard *.c)) png: $(PNG_EXAMPLES) -%-png:%.c cairo-tutorial-png.h +%-png:%.c ./include/cairo-tutorial-png.h $(CC) -DCAIRO_TUTORIAL_PNG $(CFLAGS) $(MYCFLAGS) -o $@ $< clean: - rm -f $(GTK_EXAMPLES) $(XLIB_EXAMPLES) $(PDF_EXAMPLES) $(PNG_EXAMPLES) + rm -f $(GTK_EXAMPLES) $(XLIB_EXAMPLES) $(PDF_EXAMPLES) $(PNG_EXAMPLES) *.png .PHONY: all gtk xlib pdf png clean diff --git a/doc/tutorial/src/README b/doc/tutorial/src/README new file mode 100644 index 000000000..5e19e39c2 --- /dev/null +++ b/doc/tutorial/src/README @@ -0,0 +1,66 @@ +Welcome to the cairo tutorial: + ++--------------------------------+ +| How to Recognize Ugly Graphics | +|(and what you can do about them)| ++--------------------------------+ + +This directory is your personal playground for following along with +the examples. In order for you to make use of these files you will +need to have cairo and its header files installed. You can find +instructions for doing this at: + + http://cairographics.org/tutorial + +Notice that there are a few .c files in this directory. + +You should start out by just typing "make" which will turn each .c +file into several different programs. Go ahead and run each of the +programs and see what they do. Some of them will open up new X windows +while others will simply write their output to files (such .png or +.pdf). + +After you play with those a bit, go ahead and take a look at the +contents of the .c files. You'll see that each file contains a draw() +function that does all of the drawing. + +You might be surprised to notice that there is no main() function in +any of the files. Instead, main is hidden away by means of +cairo-tutorial.h. This rather non-conventional style is used to allow +you to focus on the actual drawing code involved in using cairo, while +not having to worry about the setup semantics. We don't recommend that +you follow this style for real projects. + +As you follow along during the tutorial and get some ideas for things +to draw, you'll want to start making your own .c files. You can copy +an existing file or make your own by following this simple minimal +template: + + #include "cairo-tutorial.h" + + static void + draw (cairo_t *cr, int width, int height) + { + /* Put your drawing code here. */ + } + +Any new file you create will automatically get picked up by the +Makefile so that "make" will compile your file into several different +programs, just like the existing examples. + +If you'd like to control the initial size of the output, you may +define WIDTH and HEIGHT before including cairo-tutorial.h like so: + + #define WIDTH 100 + #define HEIGHT 100 + + #include "cairo-tutorial.h" + +If you would like to change the set of cairo-backend target programs +that are compiled, you may edit the "all" target in the Makefile. + +Have fun! + + + + diff --git a/doc/tutorial/src/circle.c b/doc/tutorial/src/circle.c index 655d94c50..6bd02e8ba 100644 --- a/doc/tutorial/src/circle.c +++ b/doc/tutorial/src/circle.c @@ -3,17 +3,20 @@ static void draw (cairo_t *cr, int width, int height) { - cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); - cairo_paint (cr); + int radius; - cairo_move_to (cr, 47.5, 25); - cairo_arc (cr, 25, 25, 22.5, + if (width < height) + radius = width/2 - 4; + else + radius = height/2 - 4; + + cairo_move_to (cr, width/2 + radius, height/2); + cairo_arc (cr, width/2, height/2, radius, 0.0, 2 * M_PI); cairo_set_source_rgb (cr, 0.6, 0.8, 1.0); cairo_fill_preserve (cr); cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); - cairo_set_line_width (cr, 1.0); cairo_stroke (cr); } diff --git a/doc/tutorial/src/expander.c b/doc/tutorial/src/expander.c deleted file mode 100644 index ce1afdaad..000000000 --- a/doc/tutorial/src/expander.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "cairo-tutorial.h" - -static void -draw (cairo_t *cr, int width, int height) -{ - cairo_translate (cr, 24.5, 25); - cairo_move_to (cr, 5, -2.5); - cairo_line_to (cr, 0, 2.5); - cairo_line_to (cr, -5, -2.5); - cairo_close_path (cr); - cairo_set_line_width (cr, 1); - cairo_stroke (cr); -} diff --git a/doc/tutorial/src/cairo-tutorial-gtk.h b/doc/tutorial/src/include/cairo-tutorial-gtk.h index 7be74e21d..7be74e21d 100644 --- a/doc/tutorial/src/cairo-tutorial-gtk.h +++ b/doc/tutorial/src/include/cairo-tutorial-gtk.h diff --git a/doc/tutorial/src/cairo-tutorial-pdf.h b/doc/tutorial/src/include/cairo-tutorial-pdf.h index ac2341dcd..ac2341dcd 100644 --- a/doc/tutorial/src/cairo-tutorial-pdf.h +++ b/doc/tutorial/src/include/cairo-tutorial-pdf.h diff --git a/doc/tutorial/src/cairo-tutorial-png.h b/doc/tutorial/src/include/cairo-tutorial-png.h index a78551d5e..a78551d5e 100644 --- a/doc/tutorial/src/cairo-tutorial-png.h +++ b/doc/tutorial/src/include/cairo-tutorial-png.h diff --git a/doc/tutorial/src/cairo-tutorial-xlib.h b/doc/tutorial/src/include/cairo-tutorial-xlib.h index a31f526fd..f50042014 100644 --- a/doc/tutorial/src/cairo-tutorial-xlib.h +++ b/doc/tutorial/src/include/cairo-tutorial-xlib.h @@ -54,17 +54,20 @@ Colormap colormap; Visual *visual; int depth; unsigned int width = WIDTH, height = HEIGHT; +Window win; +Pixmap pix; +GC gc; static void draw (cairo_t *cr, int width, int height); static void -handle_expose (Display *dpy, Drawable d) +draw_to_pixmap (Display *dpy, Pixmap pix) { cairo_surface_t *surface; cairo_t *cr; - surface = cairo_xlib_surface_create (dpy, d, visual, + surface = cairo_xlib_surface_create (dpy, pix, visual, width, height); cr = cairo_create (surface); @@ -74,13 +77,33 @@ handle_expose (Display *dpy, Drawable d) cairo_surface_destroy (surface); } +static void +handle_configure (Display *dpy, XConfigureEvent *cev) +{ + width = cev->width; + height = cev->height; + + XFreePixmap(dpy, pix); + pix = XCreatePixmap(dpy, win, width, height, depth); + XFillRectangle(dpy, pix, gc, 0, 0, width, height); + draw_to_pixmap (dpy, pix); +} + +static void +handle_expose (Display *dpy, XExposeEvent *eev) +{ + XCopyArea (dpy, pix, win, gc, + eev->x, eev->y, + eev->width, eev->height, + eev->x, eev->y); +} + int main (argc, argv) int argc; char **argv; { Display *dpy; - Window win; Window root = 0; char **init_argv = argv; XSetWindowAttributes attr; @@ -98,6 +121,7 @@ main (argc, argv) XTextProperty wm_name, icon_name; Atom wm_delete_window; unsigned long gc_mask; + XGCValues gcv; char quit_string[10]; unsigned long window_mask; int has_colormap = 0; @@ -173,13 +197,18 @@ main (argc, argv) } attr.background_pixel = WhitePixel (dpy, scr); attr.border_pixel = 0; - attr.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask; + attr.event_mask = ExposureMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask; wm_delete_window = XInternAtom(dpy, "WM_DELETE_WINDOW", False); win = XCreateWindow (dpy, root, x, y, width, height, border_width, depth, InputOutput, visual, window_mask, &attr); + pix = XCreatePixmap (dpy, win, width, height, depth); + gcv.foreground = WhitePixel (dpy, scr); + gc = XCreateGC (dpy, pix, GCForeground, &gcv); + XFillRectangle(dpy, pix, gc, 0, 0, width, height); + draw_to_pixmap (dpy, pix); XSetWMProperties (dpy, win, &wm_name, &icon_name, init_argv, argc, @@ -190,15 +219,18 @@ main (argc, argv) XNextEvent (dpy, &ev); if (HasExpose && ev.type != Expose) { HasExpose = 0; - handle_expose (dpy, eev.xexpose.window); + handle_expose (dpy, &eev.xexpose); } switch (ev.type) { + case ConfigureNotify: + handle_configure (dpy, &ev.xconfigure); + break; case Expose: if (QLength(dpy)) { eev = ev; HasExpose = 1; } else if (ev.xexpose.count == 0) { - handle_expose (dpy, ev.xexpose.window); + handle_expose (dpy, &ev.xexpose); } break; case KeyPress: diff --git a/doc/tutorial/src/cairo-tutorial.h b/doc/tutorial/src/include/cairo-tutorial.h index 65a431afe..65a431afe 100644 --- a/doc/tutorial/src/cairo-tutorial.h +++ b/doc/tutorial/src/include/cairo-tutorial.h diff --git a/doc/tutorial/src/lca.c b/doc/tutorial/src/lca.c new file mode 100644 index 000000000..9aa2c1303 --- /dev/null +++ b/doc/tutorial/src/lca.c @@ -0,0 +1,32 @@ +#define WIDTH 750 +#define HEIGHT 360 + +#include "cairo-tutorial.h" + +static void +draw (cairo_t *cr, int width, int height) +{ + cairo_save (cr); + + cairo_translate (cr, 60, 60); + cairo_scale (cr, 3, 3); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); + cairo_set_line_width (cr, 20); + + /* L */ + cairo_move_to (cr, 0, 0); + cairo_line_to (cr, 0, 80); + cairo_line_to (cr, 50, 80); + + /* C */ + cairo_move_to (cr, 110 + 40 * cos (M_PI / 3), 40 + 40 * sin(M_PI / 3)); + cairo_arc (cr, 110, 40, 40, M_PI / 3, -M_PI / 3); + + /* A */ + cairo_move_to (cr, 160, 80); + cairo_curve_to (cr, 160, -30, 210, -30, 210, 80); + + cairo_stroke (cr); +} |