diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-25 12:59:10 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-11-25 12:59:10 +0000 |
commit | 7213a84fc9547bc46f9fd449a744f2ef04f60c79 (patch) | |
tree | ebb2e0b1fa6fe3f2fdf56ab3b88120bfeb693a14 | |
parent | c2b829c7181c7f25876f6df948f181529de5f5d5 (diff) |
gears: Demonstrate sprite caching
-rw-r--r-- | gears-demo.c | 117 |
1 files changed, 100 insertions, 17 deletions
diff --git a/gears-demo.c b/gears-demo.c index a3cb903..1e5628f 100644 --- a/gears-demo.c +++ b/gears-demo.c @@ -78,6 +78,10 @@ static double gear1_rotation = 0.35; static double gear2_rotation = 0.33; static double gear3_rotation = 0.50; +static cairo_pattern_t *gear1_sprite; +static cairo_pattern_t *gear2_sprite; +static cairo_pattern_t *gear3_sprite; + static void gears_render (cairo_t *cr, int w, int h) { @@ -90,6 +94,75 @@ gears_render (cairo_t *cr, int w, int h) cairo_save (cr); cairo_translate (cr, 170.0, 330.0); cairo_rotate (cr, gear1_rotation); + if (gear1_sprite) { + cairo_translate (cr, -140, -140); + cairo_set_source (cr, gear1_sprite); + cairo_paint (cr); + } else { + gear (cr, 30.0, 120.0, 20, 20.0); + cairo_set_source_rgb (cr, 0.75, 0.45, 0.45); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0.25, 0.15, 0.15); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, 369.0, 330.0); + cairo_rotate (cr, gear2_rotation); + if (gear2_sprite) { + cairo_translate (cr, -95, -95); + cairo_set_source (cr, gear2_sprite); + cairo_paint (cr); + } else { + gear (cr, 15.0, 75.0, 12, 20.0); + cairo_set_source_rgb (cr, 0.45, 0.75, 0.45); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0.15, 0.25, 0.15); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_save (cr); + cairo_translate (cr, 170.0, 116.0); + cairo_rotate (cr, gear3_rotation); + if (gear3_sprite) { + cairo_translate (cr, -100, -100); + cairo_set_source (cr, gear3_sprite); + cairo_paint (cr); + } else { + gear (cr, 20.0, 90.0, 14, 20.0); + cairo_set_source_rgb (cr, 0.45, 0.45, 0.75); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); + cairo_fill_preserve (cr); + cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); + cairo_set_source_rgb (cr, 0.15, 0.15, 0.25); + cairo_stroke (cr); + } + cairo_restore (cr); + + cairo_restore (cr); + + gear1_rotation += 0.01; + gear2_rotation -= (0.01 * (20.0 / 12.0)); + gear3_rotation -= (0.01 * (20.0 / 14.0)); +} + +static void create_sprites (struct device *device) +{ + struct framebuffer *fb = device->get_framebuffer (device); + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_surface_create_similar (fb->surface, + CAIRO_CONTENT_COLOR_ALPHA, + 280, 280); + cr = cairo_create (surface); + cairo_translate (cr, 140, 140); gear (cr, 30.0, 120.0, 20, 20.0); cairo_set_source_rgb (cr, 0.75, 0.45, 0.45); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); @@ -97,11 +170,15 @@ gears_render (cairo_t *cr, int w, int h) cairo_set_source_rgb (cr, 0.25, 0.15, 0.15); cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); cairo_stroke (cr); - cairo_restore (cr); - - cairo_save (cr); - cairo_translate (cr, 369.0, 330.0); - cairo_rotate (cr, gear2_rotation); + cairo_destroy (cr); + gear1_sprite = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); + + surface = cairo_surface_create_similar (fb->surface, + CAIRO_CONTENT_COLOR_ALPHA, + 190, 190); + cr = cairo_create (surface); + cairo_translate (cr, 95, 95); gear (cr, 15.0, 75.0, 12, 20.0); cairo_set_source_rgb (cr, 0.45, 0.75, 0.45); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); @@ -109,11 +186,15 @@ gears_render (cairo_t *cr, int w, int h) cairo_set_source_rgb (cr, 0.15, 0.25, 0.15); cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); cairo_stroke (cr); - cairo_restore (cr); - - cairo_save (cr); - cairo_translate (cr, 170.0, 116.0); - cairo_rotate (cr, gear3_rotation); + cairo_destroy (cr); + gear2_sprite = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); + + surface = cairo_surface_create_similar (fb->surface, + CAIRO_CONTENT_COLOR_ALPHA, + 200, 200); + cr = cairo_create (surface); + cairo_translate (cr, 100, 100); gear (cr, 20.0, 90.0, 14, 20.0); cairo_set_source_rgb (cr, 0.45, 0.45, 0.75); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); @@ -121,13 +202,9 @@ gears_render (cairo_t *cr, int w, int h) cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); cairo_set_source_rgb (cr, 0.15, 0.15, 0.25); cairo_stroke (cr); - cairo_restore (cr); - - cairo_restore (cr); - - gear1_rotation += 0.01; - gear2_rotation -= (0.01 * (20.0 / 12.0)); - gear3_rotation -= (0.01 * (20.0 / 14.0)); + cairo_destroy (cr); + gear3_sprite = cairo_pattern_create_for_surface (surface); + cairo_surface_destroy (surface); } int main (int argc, char **argv) @@ -140,6 +217,7 @@ int main (int argc, char **argv) int frames = 0; int benchmark; int show_fps = 1; + int use_sprites = 0; int n; device = device_open(argc, argv); @@ -152,8 +230,13 @@ int main (int argc, char **argv) for (n = 1; n < argc; n++) { if (strcmp (argv[n], "--hide-fps") == 0) show_fps = 0; + if (strcmp (argv[n], "--use-sprites") == 0) + use_sprites = 1; } + if (use_sprites) + create_sprites (device); + gettimeofday(&start, 0); now = last_tty = last_fps = start; do { struct framebuffer *fb = device->get_framebuffer (device); |