pixman-implementation.c revision a450e446
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_composite (pixman_implementation_t * imp, 32d0321353Smrg pixman_op_t op, 33d0321353Smrg pixman_image_t * src, 34d0321353Smrg pixman_image_t * mask, 35d0321353Smrg pixman_image_t * dest, 36d0321353Smrg int32_t src_x, 37d0321353Smrg int32_t src_y, 38d0321353Smrg int32_t mask_x, 39d0321353Smrg int32_t mask_y, 40d0321353Smrg int32_t dest_x, 41d0321353Smrg int32_t dest_y, 42d0321353Smrg int32_t width, 43d0321353Smrg int32_t height) 44317c648bSmrg{ 45317c648bSmrg _pixman_implementation_composite (imp->delegate, 46d0321353Smrg op, 47d0321353Smrg src, mask, dest, 48d0321353Smrg src_x, src_y, 49d0321353Smrg mask_x, mask_y, 50d0321353Smrg dest_x, dest_y, 51d0321353Smrg width, height); 52317c648bSmrg} 53317c648bSmrg 54317c648bSmrgstatic void 55d0321353Smrgdelegate_combine_32 (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 (imp->delegate, 63d0321353Smrg op, dest, src, mask, width); 64317c648bSmrg} 65317c648bSmrg 66317c648bSmrgstatic void 67d0321353Smrgdelegate_combine_64 (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 (imp->delegate, 75d0321353Smrg op, dest, src, mask, width); 76317c648bSmrg} 77317c648bSmrg 78317c648bSmrgstatic void 79d0321353Smrgdelegate_combine_32_ca (pixman_implementation_t * imp, 80d0321353Smrg pixman_op_t op, 81d0321353Smrg uint32_t * dest, 82d0321353Smrg const uint32_t * src, 83d0321353Smrg const uint32_t * mask, 84d0321353Smrg int width) 85317c648bSmrg{ 86317c648bSmrg _pixman_implementation_combine_32_ca (imp->delegate, 87d0321353Smrg op, dest, src, mask, width); 88317c648bSmrg} 89317c648bSmrg 90317c648bSmrgstatic void 91d0321353Smrgdelegate_combine_64_ca (pixman_implementation_t * imp, 92d0321353Smrg pixman_op_t op, 93d0321353Smrg uint64_t * dest, 94d0321353Smrg const uint64_t * src, 95d0321353Smrg const uint64_t * mask, 96d0321353Smrg int width) 97317c648bSmrg{ 98317c648bSmrg _pixman_implementation_combine_64_ca (imp->delegate, 99d0321353Smrg op, dest, src, mask, width); 100317c648bSmrg} 101317c648bSmrg 102317c648bSmrgstatic pixman_bool_t 103d0321353Smrgdelegate_blt (pixman_implementation_t * imp, 104d0321353Smrg uint32_t * src_bits, 105d0321353Smrg uint32_t * dst_bits, 106d0321353Smrg int src_stride, 107d0321353Smrg int dst_stride, 108d0321353Smrg int src_bpp, 109d0321353Smrg int dst_bpp, 110d0321353Smrg int src_x, 111d0321353Smrg int src_y, 112d0321353Smrg int dst_x, 113d0321353Smrg int dst_y, 114d0321353Smrg int width, 115d0321353Smrg int height) 116317c648bSmrg{ 117d0321353Smrg return _pixman_implementation_blt ( 118d0321353Smrg imp->delegate, src_bits, dst_bits, src_stride, dst_stride, 119d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 120d0321353Smrg width, height); 121317c648bSmrg} 122317c648bSmrg 123317c648bSmrgstatic pixman_bool_t 124317c648bSmrgdelegate_fill (pixman_implementation_t *imp, 125d0321353Smrg uint32_t * bits, 126d0321353Smrg int stride, 127d0321353Smrg int bpp, 128d0321353Smrg int x, 129d0321353Smrg int y, 130d0321353Smrg int width, 131d0321353Smrg int height, 132d0321353Smrg uint32_t xor) 133317c648bSmrg{ 134d0321353Smrg return _pixman_implementation_fill ( 135d0321353Smrg imp->delegate, bits, stride, bpp, x, y, width, height, xor); 136317c648bSmrg} 137317c648bSmrg 138317c648bSmrgpixman_implementation_t * 139317c648bSmrg_pixman_implementation_create (pixman_implementation_t *delegate) 140317c648bSmrg{ 141317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 142317c648bSmrg pixman_implementation_t *d; 143317c648bSmrg int i; 144d0321353Smrg 145317c648bSmrg if (!imp) 146317c648bSmrg return NULL; 147317c648bSmrg 148317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 149317c648bSmrg imp->delegate = delegate; 150317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 151317c648bSmrg d->toplevel = imp; 152317c648bSmrg 153317c648bSmrg /* Fill out function pointers with ones that just delegate 154317c648bSmrg */ 155317c648bSmrg imp->composite = delegate_composite; 156317c648bSmrg imp->blt = delegate_blt; 157317c648bSmrg imp->fill = delegate_fill; 158d0321353Smrg 159317c648bSmrg for (i = 0; i < PIXMAN_OP_LAST; ++i) 160317c648bSmrg { 161317c648bSmrg imp->combine_32[i] = delegate_combine_32; 162317c648bSmrg imp->combine_64[i] = delegate_combine_64; 163317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 164317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 165317c648bSmrg } 166d0321353Smrg 167317c648bSmrg return imp; 168317c648bSmrg} 169317c648bSmrg 170317c648bSmrgvoid 171d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 172d0321353Smrg pixman_op_t op, 173d0321353Smrg uint32_t * dest, 174d0321353Smrg const uint32_t * src, 175d0321353Smrg const uint32_t * mask, 176d0321353Smrg int width) 177317c648bSmrg{ 178d0321353Smrg (*imp->combine_32[op]) (imp, op, dest, src, mask, width); 179317c648bSmrg} 180317c648bSmrg 181317c648bSmrgvoid 182d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 183d0321353Smrg pixman_op_t op, 184d0321353Smrg uint64_t * dest, 185d0321353Smrg const uint64_t * src, 186d0321353Smrg const uint64_t * mask, 187d0321353Smrg int width) 188317c648bSmrg{ 189d0321353Smrg (*imp->combine_64[op]) (imp, op, dest, src, mask, width); 190317c648bSmrg} 191317c648bSmrg 192317c648bSmrgvoid 193d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 194d0321353Smrg pixman_op_t op, 195d0321353Smrg uint32_t * dest, 196d0321353Smrg const uint32_t * src, 197d0321353Smrg const uint32_t * mask, 198d0321353Smrg int width) 199317c648bSmrg{ 200d0321353Smrg (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 201317c648bSmrg} 202317c648bSmrg 203317c648bSmrgvoid 204d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 205d0321353Smrg pixman_op_t op, 206d0321353Smrg uint64_t * dest, 207d0321353Smrg const uint64_t * src, 208d0321353Smrg const uint64_t * mask, 209d0321353Smrg int width) 210317c648bSmrg{ 211d0321353Smrg (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 212317c648bSmrg} 213317c648bSmrg 214317c648bSmrgvoid 215d0321353Smrg_pixman_implementation_composite (pixman_implementation_t * imp, 216d0321353Smrg pixman_op_t op, 217d0321353Smrg pixman_image_t * src, 218d0321353Smrg pixman_image_t * mask, 219d0321353Smrg pixman_image_t * dest, 220d0321353Smrg int32_t src_x, 221d0321353Smrg int32_t src_y, 222d0321353Smrg int32_t mask_x, 223d0321353Smrg int32_t mask_y, 224d0321353Smrg int32_t dest_x, 225d0321353Smrg int32_t dest_y, 226d0321353Smrg int32_t width, 227d0321353Smrg int32_t height) 228317c648bSmrg{ 229d0321353Smrg (*imp->composite) (imp, op, 230d0321353Smrg src, mask, dest, 231d0321353Smrg src_x, src_y, mask_x, mask_y, dest_x, dest_y, 232d0321353Smrg width, height); 233317c648bSmrg} 234317c648bSmrg 235317c648bSmrgpixman_bool_t 236d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp, 237d0321353Smrg uint32_t * src_bits, 238d0321353Smrg uint32_t * dst_bits, 239d0321353Smrg int src_stride, 240d0321353Smrg int dst_stride, 241d0321353Smrg int src_bpp, 242d0321353Smrg int dst_bpp, 243d0321353Smrg int src_x, 244d0321353Smrg int src_y, 245d0321353Smrg int dst_x, 246d0321353Smrg int dst_y, 247d0321353Smrg int width, 248d0321353Smrg int height) 249317c648bSmrg{ 250d0321353Smrg return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 251d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 252d0321353Smrg width, height); 253317c648bSmrg} 254317c648bSmrg 255317c648bSmrgpixman_bool_t 256317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 257d0321353Smrg uint32_t * bits, 258d0321353Smrg int stride, 259d0321353Smrg int bpp, 260d0321353Smrg int x, 261d0321353Smrg int y, 262d0321353Smrg int width, 263d0321353Smrg int height, 264d0321353Smrg uint32_t xor) 265317c648bSmrg{ 266d0321353Smrg return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 267317c648bSmrg} 268d0321353Smrg 269