From: Søren Sandmann Pedersen <s...@redhat.com> Make iter_init() a virtual method in the implementation struct. This allows individual implementations to plug in their own CPU specific scanline fetchers. --- pixman/pixman-general.c | 42 ++++++++++++++---------------------- pixman/pixman-implementation.c | 46 +++++++++++++++++++++++++++++++++++++++- pixman/pixman-private.h | 21 ++++++++++++++++++ 3 files changed, 82 insertions(+), 27 deletions(-)
diff --git a/pixman/pixman-general.c b/pixman/pixman-general.c index f75e7b3..4f73331 100644 --- a/pixman/pixman-general.c +++ b/pixman/pixman-general.c @@ -39,18 +39,12 @@ #include "pixman-combine32.h" #include "pixman-private.h" -static uint32_t * -get_scanline_null (pixman_iter_t *iter, const uint32_t *mask) -{ - return NULL; -} - static void -iter_init (pixman_implementation_t *imp, - pixman_iter_t *iter, - pixman_image_t *image, - int x, int y, int width, int height, - uint8_t *buffer, iter_flags_t flags) +general_iter_init (pixman_implementation_t *imp, + pixman_iter_t *iter, + pixman_image_t *image, + int x, int y, int width, int height, + uint8_t *buffer, iter_flags_t flags) { iter->image = image; iter->x = x; @@ -58,12 +52,7 @@ iter_init (pixman_implementation_t *imp, iter->width = width; iter->buffer = (uint32_t *)buffer; - if (!image) - { - iter->get_scanline = get_scanline_null; - iter->next_line = _pixman_iter_next_line_noop; - } - else if (image->type == SOLID) + if (image->type == SOLID) { _pixman_solid_fill_iter_init ( image, iter, x, y, width, height, buffer, flags); @@ -146,17 +135,17 @@ general_composite_rect (pixman_implementation_t *imp, mask_buffer = src_buffer + width * Bpp; dest_buffer = mask_buffer + width * Bpp; - iter_init (imp->toplevel, &src_iter, src, - src_x, src_y, width, height, - src_buffer, narrow); + _pixman_implementation_iter_init (imp->toplevel, &src_iter, src, + src_x, src_y, width, height, + src_buffer, narrow); - iter_init (imp->toplevel, &mask_iter, mask, - mask_x, mask_y, width, height, - mask_buffer, narrow); + _pixman_implementation_iter_init (imp->toplevel, &mask_iter, mask, + mask_x, mask_y, width, height, + mask_buffer, narrow); - iter_init (imp->toplevel, &dest_iter, dest, - dest_x, dest_y, width, height, - dest_buffer, narrow | ITER_WRITE); + _pixman_implementation_iter_init (imp->toplevel, &dest_iter, dest, + dest_x, dest_y, width, height, + dest_buffer, narrow | ITER_WRITE); component_alpha = mask && @@ -251,6 +240,7 @@ _pixman_implementation_create_general (void) imp->blt = general_blt; imp->fill = general_fill; + imp->iter_init = general_iter_init; return imp; } diff --git a/pixman/pixman-implementation.c b/pixman/pixman-implementation.c index bc3749e..1aa28d1 100644 --- a/pixman/pixman-implementation.c +++ b/pixman/pixman-implementation.c @@ -111,6 +111,21 @@ delegate_fill (pixman_implementation_t *imp, imp->delegate, bits, stride, bpp, x, y, width, height, xor); } +static void +delegate_iter_init (pixman_implementation_t *imp, + pixman_iter_t * iter, + pixman_image_t * image, + int x, + int y, + int width, + int height, + uint8_t * buffer, + iter_flags_t flags) +{ + _pixman_implementation_iter_init ( + imp->delegate, iter, image, x, y, width, height, buffer, flags); +} + pixman_implementation_t * _pixman_implementation_create (pixman_implementation_t *delegate, const pixman_fast_path_t *fast_paths) @@ -133,6 +148,7 @@ _pixman_implementation_create (pixman_implementation_t *delegate, */ imp->blt = delegate_blt; imp->fill = delegate_fill; + imp->iter_init = delegate_iter_init; for (i = 0; i < PIXMAN_N_OPERATORS; ++i) { @@ -143,7 +159,7 @@ _pixman_implementation_create (pixman_implementation_t *delegate, } imp->fast_paths = fast_paths; - + return imp; } @@ -225,3 +241,31 @@ _pixman_implementation_fill (pixman_implementation_t *imp, return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); } +static uint32_t * +get_scanline_null (pixman_iter_t *iter, const uint32_t *mask) +{ + return NULL; +} + +void +_pixman_implementation_iter_init (pixman_implementation_t *imp, + pixman_iter_t *iter, + pixman_image_t *image, + int x, + int y, + int width, + int height, + uint8_t *buffer, + iter_flags_t flags) +{ + if (!image) + { + iter->get_scanline = get_scanline_null; + iter->next_line = _pixman_iter_next_line_noop; + } + else + { + (*imp->iter_init) ( + imp, iter, image, x, y, width, height, buffer, flags); + } +} diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h index 6f61d32..c4194fe 100644 --- a/pixman/pixman-private.h +++ b/pixman/pixman-private.h @@ -431,6 +431,15 @@ typedef pixman_bool_t (*pixman_fill_func_t) (pixman_implementation_t *imp, int width, int height, uint32_t xor); +typedef void (*pixman_iter_init_func_t) (pixman_implementation_t *imp, + pixman_iter_t *iter, + pixman_image_t *image, + int x, + int y, + int width, + int height, + uint8_t *buffer, + iter_flags_t flags); void _pixman_setup_combiner_functions_32 (pixman_implementation_t *imp); void _pixman_setup_combiner_functions_64 (pixman_implementation_t *imp); @@ -455,6 +464,7 @@ struct pixman_implementation_t pixman_blt_func_t blt; pixman_fill_func_t fill; + pixman_iter_init_func_t iter_init; pixman_combine_32_func_t combine_32[PIXMAN_N_OPERATORS]; pixman_combine_32_func_t combine_32_ca[PIXMAN_N_OPERATORS]; @@ -521,6 +531,17 @@ _pixman_implementation_fill (pixman_implementation_t *imp, int height, uint32_t xor); +void +_pixman_implementation_iter_init (pixman_implementation_t *imp, + pixman_iter_t *iter, + pixman_image_t *image, + int x, + int y, + int width, + int height, + uint8_t *buffer, + iter_flags_t flags); + /* Specific implementations */ pixman_implementation_t * _pixman_implementation_create_general (void); -- 1.6.0.6 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman