Use cairo to scale picture cairo
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Tue, 12 Aug 2008 11:09:44 +0000 (08:09 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Tue, 12 Aug 2008 11:09:44 +0000 (08:09 -0300)
Cairo is now used to scale the picture. For now, it simply scales for
twice the real size. This will be used later for a feature of zooming in
and out of the picture.

movie.c

diff --git a/movie.c b/movie.c
index 9a0d883..88dc03f 100644 (file)
--- a/movie.c
+++ b/movie.c
@@ -21,6 +21,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <cairo.h>
 #include <SDL.h>
 #include <SDL_image.h>
 
@@ -111,23 +112,68 @@ ShowPoint (SDL_Surface *screen, SDL_Surface *image)
   SDL_UpdateRect (screen, 0, 0, 0, 0);
 }
 
+cairo_surface_t *
+CairoFromSDL (SDL_Surface *surface)
+{
+  return cairo_image_surface_create_for_data (surface->pixels,
+                                             CAIRO_FORMAT_ARGB32,
+                                             surface->w, surface->h,
+                                             surface->pitch);
+}
+
+SDL_Surface *
+CairoToSDL (cairo_surface_t *surface)
+{
+  return SDL_CreateRGBSurfaceFrom (cairo_image_surface_get_data (surface),
+                                   cairo_image_surface_get_width (surface),
+                                  cairo_image_surface_get_height (surface),
+                                  32,
+                                  cairo_image_surface_get_stride (surface),
+                                  0x00ff0000, 0x0000ff00, 0x000000ff,
+                                  0xff000000);
+}
+
+SDL_Surface *
+CairoTarget (SDL_Surface *image)
+{
+  static unsigned char *data = NULL;
+  static cairo_surface_t *surface = NULL;
+  static cairo_t *ctx = NULL;
+  cairo_surface_t *source;
+  if (data == NULL && surface == NULL && ctx == NULL)
+  {
+    data = malloc (WIDTH * HEIGHT * 4);
+    surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32,
+                                                  WIDTH, HEIGHT, WIDTH * 4);
+    ctx = cairo_create (surface);
+    cairo_scale (ctx, 2, 2);
+  }
+  source = CairoFromSDL (image);
+  cairo_set_source_surface (ctx, source, 0, 0);
+  cairo_paint (ctx);
+  cairo_surface_destroy (source);
+  return CairoToSDL (surface);
+}
+
 SDL_Surface *
 GetNextImage (SDL_Surface *image)
 {
   SDL_Surface *slice;
   SDL_Rect center;
+  SDL_Surface *scale;
   center = GetNextPoint (), GetNextPoint (), GetNextPoint ();
-  slice = SDL_CreateRGBSurface (SDL_SWSURFACE, WIDTH, HEIGHT,
-                                image->format->BitsPerPixel,
-                               image->format->Rmask,
-                               image->format->Gmask,
-                               image->format->Bmask,
-                               image->format->Amask);
-  center.x -= WIDTH/2;
-  center.y -= HEIGHT/2;
+  slice = SDL_CreateRGBSurface (SDL_SWSURFACE, WIDTH/2, HEIGHT/2,
+                                32,
+                               0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
+  center.x -= (WIDTH/2) / 2;
+  center.y -= (HEIGHT/2) / 2;
+  center.w /= 2;
+  center.h /= 2;
   SDL_BlitSurface (image, &center, slice, NULL);
   SDL_UpdateRect (slice, 0, 0, 0, 0);
-  return slice;
+  scale = CairoTarget (slice);
+  SDL_FreeSurface (slice);
+  return scale;
 }
 
 Uint32