From 0a850b63ae3e397a2b4272001d1b6e8eabdde861 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Tue, 12 Aug 2008 08:09:44 -0300 Subject: [PATCH] Use cairo to scale picture 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 | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/movie.c b/movie.c index 9a0d883..88dc03f 100644 --- a/movie.c +++ b/movie.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -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, ¢er, slice, NULL); SDL_UpdateRect (slice, 0, 0, 0, 0); - return slice; + scale = CairoTarget (slice); + SDL_FreeSurface (slice); + return scale; } Uint32 -- 2.20.1