summaryrefslogtreecommitdiff
path: root/doc/tutorial
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2006-01-25 10:22:32 +0000
committerCarl Worth <cworth@cworth.org>2006-01-25 10:22:32 +0000
commitdc64fcc68ccbe92392a88167e83cc5994f69cf66 (patch)
tree3c43177b66d2ba8e85f0a23d347799a5d7cca394 /doc/tutorial
parent9abe21ac70e0d1ae75397f40455f1d55fc5b5018 (diff)
Move the magic header files to be down in an include directory and more out of the way.
Look for the headers in -I./include. Make the circle track the width and height of the window dynamically. Remove boring expander example. Add more interesting LCA exmaple. Add some notes about how to use this stuff.
Diffstat (limited to 'doc/tutorial')
-rw-r--r--doc/tutorial/src/Makefile12
-rw-r--r--doc/tutorial/src/README66
-rw-r--r--doc/tutorial/src/circle.c13
-rw-r--r--doc/tutorial/src/expander.c13
-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.c32
10 files changed, 150 insertions, 30 deletions
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);
+}