From ccbd520e4afa333b47acab7aa0b6dd44e4c30621 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 2 Mar 2010 15:41:08 +0100 Subject: [PATCH] Make canvas Glz decoder integration nicer We use a dynamic interface similar to e.g. SpiceImageCache instead of passing both function and opaque --- cairo_canvas.c | 5 ++--- cairo_canvas.h | 2 +- canvas_base.c | 13 ++++++------- canvas_base.h | 14 ++++++++++++-- gdi_canvas.c | 5 ++--- gdi_canvas.h | 3 +-- gl_canvas.c | 5 ++--- gl_canvas.h | 2 +- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cairo_canvas.c b/cairo_canvas.c index addb3d4..ed815d1 100644 --- a/cairo_canvas.c +++ b/cairo_canvas.c @@ -2156,7 +2156,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits, CairoCanvas *canvas_create(pixman_image_t *image, int bits #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , void *get_virt_opaque, get_virt_fn_t get_virt, @@ -2183,8 +2183,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits #endif #ifdef USE_GLZ , - glz_decoder_opaque, - glz_decode + glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , diff --git a/cairo_canvas.h b/cairo_canvas.h index 205c62c..390c61c 100644 --- a/cairo_canvas.h +++ b/cairo_canvas.h @@ -70,7 +70,7 @@ CairoCanvas *canvas_create(pixman_image_t *image, int bits, CairoCanvas *canvas_create(pixman_image_t *image, int bits #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , void *get_virt_opaque, get_virt_fn_t get_virt, diff --git a/canvas_base.c b/canvas_base.c index 23039eb..8bac592 100644 --- a/canvas_base.c +++ b/canvas_base.c @@ -154,8 +154,7 @@ typedef struct LzData { } LzData; typedef struct GlzData { - void *decoder_opaque; - glz_decode_fn_t decode; + SpiceGlzDecoder *decoder; LzDecodeUsrData decode_data; } GlzData; @@ -623,8 +622,9 @@ static pixman_image_t *canvas_get_glz(CanvasBase *canvas, LZImage *image) #ifdef WIN32 canvas->glz_data.decode_data.dc = canvas->dc; #endif - canvas->glz_data.decode(canvas->glz_data.decoder_opaque, image->lz_rgb.data, NULL, - &canvas->glz_data.decode_data); + canvas->glz_data.decoder->ops->decode(canvas->glz_data.decoder, + image->lz_rgb.data, NULL, + &canvas->glz_data.decode_data); /* global_decode calls alloc_lz_image, which sets canvas->glz_data.surface */ return (canvas->glz_data.decode_data.out_surface); } @@ -1547,7 +1547,7 @@ static int canvas_base_init(CanvasBase *canvas, int depth, static int canvas_base_init(CanvasBase *canvas, int depth #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , void *get_virt_opaque, get_virt_fn_t get_virt, @@ -1584,8 +1584,7 @@ static int canvas_base_init(CanvasBase *canvas, int depth } #endif #ifdef USE_GLZ - canvas->glz_data.decoder_opaque = glz_decoder_opaque; - canvas->glz_data.decode = glz_decode; + canvas->glz_data.decoder = glz_decoder; #endif if (depth == 16) { diff --git a/canvas_base.h b/canvas_base.h index 78ece62..7796245 100644 --- a/canvas_base.h +++ b/canvas_base.h @@ -26,6 +26,7 @@ typedef struct _SpiceImageCache SpiceImageCache; typedef struct _SpicePaletteCache SpicePaletteCache; +typedef struct _SpiceGlzDecoder SpiceGlzDecoder; typedef struct { void (*put)(SpiceImageCache *cache, @@ -52,8 +53,17 @@ struct _SpicePaletteCache { SpicePaletteCacheOps *ops; }; -typedef void (*glz_decode_fn_t)(void *glz_decoder_opaque, uint8_t *data, - SpicePalette *plt, void *usr_data); +typedef struct { + void (*decode)(SpiceGlzDecoder *decoder, + uint8_t *data, + SpicePalette *plt, + void *usr_data); +} SpiceGlzDecoderOps; + +struct _SpiceGlzDecoder { + SpiceGlzDecoderOps *ops; +}; + #ifndef CAIRO_CANVAS_NO_CHUNKS typedef void *(*get_virt_fn_t)(void *get_virt_opaque, unsigned long addr, uint32_t add_size); typedef void (*validate_virt_fn_t)(void *validate_virt_opaque, unsigned long virt, diff --git a/gdi_canvas.c b/gdi_canvas.c index ae477db..c4750a8 100644 --- a/gdi_canvas.c +++ b/gdi_canvas.c @@ -1708,7 +1708,7 @@ GdiCanvas *gdi_canvas_create(HDC dc, int bits, GdiCanvas *gdi_canvas_create(HDC dc, int bits #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif ) { @@ -1731,8 +1731,7 @@ GdiCanvas *gdi_canvas_create(HDC dc, int bits #endif #ifdef USE_GLZ , - glz_decoder_opaque, - glz_decode + glz_decoder #endif ); canvas->dc = dc; diff --git a/gdi_canvas.h b/gdi_canvas.h index d9b8d21..12082d8 100644 --- a/gdi_canvas.h +++ b/gdi_canvas.h @@ -62,8 +62,7 @@ void gdi_canvas_set_access_params(GdiCanvas *canvas, unsigned long base, unsigne GdiCanvas *gdi_canvas_create(HDC dc, class Mutex *lock, int bits, SpiceImageCache *bits_cache, SpicePaletteCache *palette_cache, - void *glz_decoder_opaque, - glz_decode_fn_t glz_decode); + SpiceGlzDecoder *glz_decoder); void gdi_canvas_destroy(GdiCanvas *canvas); diff --git a/gl_canvas.c b/gl_canvas.c index 076090e..6b5eda9 100644 --- a/gl_canvas.c +++ b/gl_canvas.c @@ -812,7 +812,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth, GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , void *get_virt_opaque, get_virt_fn_t get_virt, @@ -845,8 +845,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth #endif #ifdef USE_GLZ , - glz_decoder_opaque, - glz_decode + glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , diff --git a/gl_canvas.h b/gl_canvas.h index 39b2792..1c57340 100644 --- a/gl_canvas.h +++ b/gl_canvas.h @@ -65,7 +65,7 @@ GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth, GLCanvas *gl_canvas_create(void *usr_data, int width, int height, int depth #endif #ifdef USE_GLZ - , void *glz_decoder_opaque, glz_decode_fn_t glz_decode + , SpiceGlzDecoder *glz_decoder #endif #ifndef CAIRO_CANVAS_NO_CHUNKS , void *get_virt_opaque, get_virt_fn_t get_virt,