pixman-implementation.c revision 6ba797d6
1317c648bSmrg/* 2317c648bSmrg * Copyright © 2009 Red Hat, Inc. 3317c648bSmrg * 4317c648bSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5317c648bSmrg * documentation for any purpose is hereby granted without fee, provided that 6317c648bSmrg * the above copyright notice appear in all copies and that both that 7317c648bSmrg * copyright notice and this permission notice appear in supporting 8317c648bSmrg * documentation, and that the name of Red Hat not be used in advertising or 9317c648bSmrg * publicity pertaining to distribution of the software without specific, 10317c648bSmrg * written prior permission. Red Hat makes no representations about the 11317c648bSmrg * suitability of this software for any purpose. It is provided "as is" 12317c648bSmrg * without express or implied warranty. 13317c648bSmrg * 14317c648bSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 15317c648bSmrg * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 16317c648bSmrg * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY 17317c648bSmrg * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 18317c648bSmrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 19317c648bSmrg * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 20317c648bSmrg * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 21317c648bSmrg * SOFTWARE. 22317c648bSmrg */ 23317c648bSmrg 24a450e446Smrg#ifdef HAVE_CONFIG_H 25317c648bSmrg#include <config.h> 26a450e446Smrg#endif 27317c648bSmrg#include <stdlib.h> 28317c648bSmrg#include "pixman-private.h" 29317c648bSmrg 30317c648bSmrgstatic void 31d0321353Smrgdelegate_combine_32 (pixman_implementation_t * imp, 32d0321353Smrg pixman_op_t op, 33d0321353Smrg uint32_t * dest, 34d0321353Smrg const uint32_t * src, 35d0321353Smrg const uint32_t * mask, 36d0321353Smrg int width) 37317c648bSmrg{ 38317c648bSmrg _pixman_implementation_combine_32 (imp->delegate, 39d0321353Smrg op, dest, src, mask, width); 40317c648bSmrg} 41317c648bSmrg 42317c648bSmrgstatic void 43d0321353Smrgdelegate_combine_64 (pixman_implementation_t * imp, 44d0321353Smrg pixman_op_t op, 45d0321353Smrg uint64_t * dest, 46d0321353Smrg const uint64_t * src, 47d0321353Smrg const uint64_t * mask, 48d0321353Smrg int width) 49317c648bSmrg{ 50317c648bSmrg _pixman_implementation_combine_64 (imp->delegate, 51d0321353Smrg op, dest, src, mask, width); 52317c648bSmrg} 53317c648bSmrg 54317c648bSmrgstatic void 55d0321353Smrgdelegate_combine_32_ca (pixman_implementation_t * imp, 56d0321353Smrg pixman_op_t op, 57d0321353Smrg uint32_t * dest, 58d0321353Smrg const uint32_t * src, 59d0321353Smrg const uint32_t * mask, 60d0321353Smrg int width) 61317c648bSmrg{ 62317c648bSmrg _pixman_implementation_combine_32_ca (imp->delegate, 63d0321353Smrg op, dest, src, mask, width); 64317c648bSmrg} 65317c648bSmrg 66317c648bSmrgstatic void 67d0321353Smrgdelegate_combine_64_ca (pixman_implementation_t * imp, 68d0321353Smrg pixman_op_t op, 69d0321353Smrg uint64_t * dest, 70d0321353Smrg const uint64_t * src, 71d0321353Smrg const uint64_t * mask, 72d0321353Smrg int width) 73317c648bSmrg{ 74317c648bSmrg _pixman_implementation_combine_64_ca (imp->delegate, 75d0321353Smrg op, dest, src, mask, width); 76317c648bSmrg} 77317c648bSmrg 78317c648bSmrgstatic pixman_bool_t 79d0321353Smrgdelegate_blt (pixman_implementation_t * imp, 80d0321353Smrg uint32_t * src_bits, 81d0321353Smrg uint32_t * dst_bits, 82d0321353Smrg int src_stride, 83d0321353Smrg int dst_stride, 84d0321353Smrg int src_bpp, 85d0321353Smrg int dst_bpp, 86d0321353Smrg int src_x, 87d0321353Smrg int src_y, 886ba797d6Smrg int dest_x, 896ba797d6Smrg int dest_y, 90d0321353Smrg int width, 91d0321353Smrg int height) 92317c648bSmrg{ 93d0321353Smrg return _pixman_implementation_blt ( 94d0321353Smrg imp->delegate, src_bits, dst_bits, src_stride, dst_stride, 956ba797d6Smrg src_bpp, dst_bpp, src_x, src_y, dest_x, dest_y, 96d0321353Smrg width, height); 97317c648bSmrg} 98317c648bSmrg 99317c648bSmrgstatic pixman_bool_t 100317c648bSmrgdelegate_fill (pixman_implementation_t *imp, 101d0321353Smrg uint32_t * bits, 102d0321353Smrg int stride, 103d0321353Smrg int bpp, 104d0321353Smrg int x, 105d0321353Smrg int y, 106d0321353Smrg int width, 107d0321353Smrg int height, 108d0321353Smrg uint32_t xor) 109317c648bSmrg{ 110d0321353Smrg return _pixman_implementation_fill ( 111d0321353Smrg imp->delegate, bits, stride, bpp, x, y, width, height, xor); 112317c648bSmrg} 113317c648bSmrg 114953d7d37Smrgstatic void 115953d7d37Smrgdelegate_src_iter_init (pixman_implementation_t *imp, 1166ba797d6Smrg pixman_iter_t * iter) 117953d7d37Smrg{ 1186ba797d6Smrg imp->delegate->src_iter_init (imp->delegate, iter); 119953d7d37Smrg} 120953d7d37Smrg 121953d7d37Smrgstatic void 122953d7d37Smrgdelegate_dest_iter_init (pixman_implementation_t *imp, 1236ba797d6Smrg pixman_iter_t * iter) 124953d7d37Smrg{ 1256ba797d6Smrg imp->delegate->dest_iter_init (imp->delegate, iter); 126953d7d37Smrg} 127953d7d37Smrg 128317c648bSmrgpixman_implementation_t * 129952204abSmrg_pixman_implementation_create (pixman_implementation_t *delegate, 130952204abSmrg const pixman_fast_path_t *fast_paths) 131317c648bSmrg{ 132317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 133317c648bSmrg pixman_implementation_t *d; 134317c648bSmrg int i; 135d0321353Smrg 136317c648bSmrg if (!imp) 137317c648bSmrg return NULL; 138317c648bSmrg 139952204abSmrg assert (fast_paths); 140952204abSmrg 141317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 142317c648bSmrg imp->delegate = delegate; 143317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 144317c648bSmrg d->toplevel = imp; 145317c648bSmrg 146317c648bSmrg /* Fill out function pointers with ones that just delegate 147317c648bSmrg */ 148317c648bSmrg imp->blt = delegate_blt; 149317c648bSmrg imp->fill = delegate_fill; 150953d7d37Smrg imp->src_iter_init = delegate_src_iter_init; 151953d7d37Smrg imp->dest_iter_init = delegate_dest_iter_init; 152d0321353Smrg 153952204abSmrg for (i = 0; i < PIXMAN_N_OPERATORS; ++i) 154317c648bSmrg { 155317c648bSmrg imp->combine_32[i] = delegate_combine_32; 156317c648bSmrg imp->combine_64[i] = delegate_combine_64; 157317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 158317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 159317c648bSmrg } 160d0321353Smrg 161952204abSmrg imp->fast_paths = fast_paths; 162953d7d37Smrg 163317c648bSmrg return imp; 164317c648bSmrg} 165317c648bSmrg 166317c648bSmrgvoid 167d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 168d0321353Smrg pixman_op_t op, 169d0321353Smrg uint32_t * dest, 170d0321353Smrg const uint32_t * src, 171d0321353Smrg const uint32_t * mask, 172d0321353Smrg int width) 173317c648bSmrg{ 174d0321353Smrg (*imp->combine_32[op]) (imp, op, dest, src, mask, width); 175317c648bSmrg} 176317c648bSmrg 177317c648bSmrgvoid 178d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 179d0321353Smrg pixman_op_t op, 180d0321353Smrg uint64_t * dest, 181d0321353Smrg const uint64_t * src, 182d0321353Smrg const uint64_t * mask, 183d0321353Smrg int width) 184317c648bSmrg{ 185d0321353Smrg (*imp->combine_64[op]) (imp, op, dest, src, mask, width); 186317c648bSmrg} 187317c648bSmrg 188317c648bSmrgvoid 189d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 190d0321353Smrg pixman_op_t op, 191d0321353Smrg uint32_t * dest, 192d0321353Smrg const uint32_t * src, 193d0321353Smrg const uint32_t * mask, 194d0321353Smrg int width) 195317c648bSmrg{ 196d0321353Smrg (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 197317c648bSmrg} 198317c648bSmrg 199317c648bSmrgvoid 200d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 201d0321353Smrg pixman_op_t op, 202d0321353Smrg uint64_t * dest, 203d0321353Smrg const uint64_t * src, 204d0321353Smrg const uint64_t * mask, 205d0321353Smrg int width) 206317c648bSmrg{ 207d0321353Smrg (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 208317c648bSmrg} 209317c648bSmrg 210317c648bSmrgpixman_bool_t 211d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp, 212d0321353Smrg uint32_t * src_bits, 213d0321353Smrg uint32_t * dst_bits, 214d0321353Smrg int src_stride, 215d0321353Smrg int dst_stride, 216d0321353Smrg int src_bpp, 217d0321353Smrg int dst_bpp, 218d0321353Smrg int src_x, 219d0321353Smrg int src_y, 2206ba797d6Smrg int dest_x, 2216ba797d6Smrg int dest_y, 222d0321353Smrg int width, 223d0321353Smrg int height) 224317c648bSmrg{ 225d0321353Smrg return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 2266ba797d6Smrg src_bpp, dst_bpp, src_x, src_y, dest_x, dest_y, 227d0321353Smrg width, height); 228317c648bSmrg} 229317c648bSmrg 230317c648bSmrgpixman_bool_t 231317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 232d0321353Smrg uint32_t * bits, 233d0321353Smrg int stride, 234d0321353Smrg int bpp, 235d0321353Smrg int x, 236d0321353Smrg int y, 237d0321353Smrg int width, 238d0321353Smrg int height, 239d0321353Smrg uint32_t xor) 240317c648bSmrg{ 241d0321353Smrg return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 242317c648bSmrg} 243d0321353Smrg 244953d7d37Smrgvoid 245953d7d37Smrg_pixman_implementation_src_iter_init (pixman_implementation_t *imp, 246953d7d37Smrg pixman_iter_t *iter, 247953d7d37Smrg pixman_image_t *image, 248953d7d37Smrg int x, 249953d7d37Smrg int y, 250953d7d37Smrg int width, 251953d7d37Smrg int height, 252953d7d37Smrg uint8_t *buffer, 253953d7d37Smrg iter_flags_t flags) 254953d7d37Smrg{ 2556ba797d6Smrg iter->image = image; 2566ba797d6Smrg iter->buffer = (uint32_t *)buffer; 2576ba797d6Smrg iter->x = x; 2586ba797d6Smrg iter->y = y; 2596ba797d6Smrg iter->width = width; 2606ba797d6Smrg iter->height = height; 2616ba797d6Smrg iter->flags = flags; 2626ba797d6Smrg 2636ba797d6Smrg (*imp->src_iter_init) (imp, iter); 264953d7d37Smrg} 265953d7d37Smrg 266953d7d37Smrgvoid 267953d7d37Smrg_pixman_implementation_dest_iter_init (pixman_implementation_t *imp, 268953d7d37Smrg pixman_iter_t *iter, 269953d7d37Smrg pixman_image_t *image, 270953d7d37Smrg int x, 271953d7d37Smrg int y, 272953d7d37Smrg int width, 273953d7d37Smrg int height, 274953d7d37Smrg uint8_t *buffer, 275953d7d37Smrg iter_flags_t flags) 276953d7d37Smrg{ 2776ba797d6Smrg iter->image = image; 2786ba797d6Smrg iter->buffer = (uint32_t *)buffer; 2796ba797d6Smrg iter->x = x; 2806ba797d6Smrg iter->y = y; 2816ba797d6Smrg iter->width = width; 2826ba797d6Smrg iter->height = height; 2836ba797d6Smrg iter->flags = flags; 2846ba797d6Smrg 2856ba797d6Smrg (*imp->dest_iter_init) (imp, iter); 286953d7d37Smrg} 287