#include #include #include /* fuer die Berechnung der Ballhoehe */ #ifndef PI #define PI 3.14159265358979323846 #endif int main(int argc, char *argv[]) { /* Variablen fuer X11 */ Display *display; int screen; Window win; GC gc; int width, height; float x,y,t; width = 400; height = 200; /* Variablen fuer Cairo */ cairo_surface_t *surface; cairo_surface_t *imagesurface; /* Puffer */ cairo_t *cr; cairo_t *crimage; /* Drawing context fuer Puffer */ /* X11-Fenster oeffnen */ display = XOpenDisplay(0); screen = DefaultScreen(display); win = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, width, height, 0, WhitePixel(display, screen), WhitePixel(display, screen)); XMapWindow(display, win); /* Cairo Surface in X11 oeffnen: */ XClearWindow(display, win); surface = cairo_xlib_surface_create(display, win, DefaultVisual(display, DefaultScreen(display)), width, height); /* Jetzt den Hintergrund-Puffer einrichten: */ imagesurface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); /* Drawing Context holen */ cr = cairo_create(surface); crimage = cairo_create(imagesurface); /* Zeichnen */ for (t=0; t<6*PI; t=t+(0.01)) { x = 50; /* hier wird die aktuelle Hoehe berechnet */ y = 100-(100*exp((-t)*0.3)*fabs(cos(t))); /* Schwarze Farbe waehlen */ cairo_set_source_rgb(crimage, 0, 0, 0); /* Grundlinie malen */ cairo_move_to(crimage, 0,120); cairo_line_to(crimage, 400,120); cairo_stroke(crimage); /* kopiere Ball an seine Position */ cairo_arc(crimage, x, y, 20, 0, 2*M_PI ); cairo_fill(crimage); /* Und das vorbereitete Image in das Fenster kopieren */ cairo_set_source_surface(cr, imagesurface, 0, 0); cairo_paint(cr); /* Hintergrund-Puffer loeschen */ cairo_set_source_rgb(crimage, 1, 1, 1); cairo_rectangle(crimage, 0,0,width,height); cairo_fill(crimage); cairo_set_source_rgb(crimage, 0, 0, 0); } /*for*/ /* Cairo aufraeumen */ cairo_destroy(crimage); cairo_destroy(cr); cairo_surface_destroy(imagesurface); cairo_surface_destroy(surface); /* X11 aufraeumen */ XDestroyWindow(display, win); XCloseDisplay(display); return 0; }