pixman-implementation.c revision 317c648b
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 24317c648bSmrg#include <config.h> 25317c648bSmrg#include <stdlib.h> 26317c648bSmrg#include "pixman-private.h" 27317c648bSmrg 28317c648bSmrgstatic void 29317c648bSmrgdelegate_composite (pixman_implementation_t * imp, 30317c648bSmrg pixman_op_t op, 31317c648bSmrg pixman_image_t * src, 32317c648bSmrg pixman_image_t * mask, 33317c648bSmrg pixman_image_t * dest, 34317c648bSmrg int32_t src_x, 35317c648bSmrg int32_t src_y, 36317c648bSmrg int32_t mask_x, 37317c648bSmrg int32_t mask_y, 38317c648bSmrg int32_t dest_x, 39317c648bSmrg int32_t dest_y, 40317c648bSmrg int32_t width, 41317c648bSmrg int32_t height) 42317c648bSmrg{ 43317c648bSmrg _pixman_implementation_composite (imp->delegate, 44317c648bSmrg op, 45317c648bSmrg src, mask, dest, 46317c648bSmrg src_x, src_y, 47317c648bSmrg mask_x, mask_y, 48317c648bSmrg dest_x, dest_y, 49317c648bSmrg width, height); 50317c648bSmrg} 51317c648bSmrg 52317c648bSmrgstatic void 53317c648bSmrgdelegate_combine_32 (pixman_implementation_t * imp, 54317c648bSmrg pixman_op_t op, 55317c648bSmrg uint32_t * dest, 56317c648bSmrg const uint32_t * src, 57317c648bSmrg const uint32_t * mask, 58317c648bSmrg int width) 59317c648bSmrg{ 60317c648bSmrg _pixman_implementation_combine_32 (imp->delegate, 61317c648bSmrg op, dest, src, mask, width); 62317c648bSmrg} 63317c648bSmrg 64317c648bSmrgstatic void 65317c648bSmrgdelegate_combine_64 (pixman_implementation_t * imp, 66317c648bSmrg pixman_op_t op, 67317c648bSmrg uint64_t * dest, 68317c648bSmrg const uint64_t * src, 69317c648bSmrg const uint64_t * mask, 70317c648bSmrg int width) 71317c648bSmrg{ 72317c648bSmrg _pixman_implementation_combine_64 (imp->delegate, 73317c648bSmrg op, dest, src, mask, width); 74317c648bSmrg} 75317c648bSmrg 76317c648bSmrgstatic void 77317c648bSmrgdelegate_combine_32_ca (pixman_implementation_t * imp, 78317c648bSmrg pixman_op_t op, 79317c648bSmrg uint32_t * dest, 80317c648bSmrg const uint32_t * src, 81317c648bSmrg const uint32_t * mask, 82317c648bSmrg int width) 83317c648bSmrg{ 84317c648bSmrg _pixman_implementation_combine_32_ca (imp->delegate, 85317c648bSmrg op, dest, src, mask, width); 86317c648bSmrg} 87317c648bSmrg 88317c648bSmrgstatic void 89317c648bSmrgdelegate_combine_64_ca (pixman_implementation_t * imp, 90317c648bSmrg pixman_op_t op, 91317c648bSmrg uint64_t * dest, 92317c648bSmrg const uint64_t * src, 93317c648bSmrg const uint64_t * mask, 94317c648bSmrg int width) 95317c648bSmrg{ 96317c648bSmrg _pixman_implementation_combine_64_ca (imp->delegate, 97317c648bSmrg op, dest, src, mask, width); 98317c648bSmrg} 99317c648bSmrg 100317c648bSmrgstatic pixman_bool_t 101317c648bSmrgdelegate_blt (pixman_implementation_t * imp, 102317c648bSmrg uint32_t * src_bits, 103317c648bSmrg uint32_t * dst_bits, 104317c648bSmrg int src_stride, 105317c648bSmrg int dst_stride, 106317c648bSmrg int src_bpp, 107317c648bSmrg int dst_bpp, 108317c648bSmrg int src_x, 109317c648bSmrg int src_y, 110317c648bSmrg int dst_x, 111317c648bSmrg int dst_y, 112317c648bSmrg int width, 113317c648bSmrg int height) 114317c648bSmrg{ 115317c648bSmrg return _pixman_implementation_blt (imp->delegate, src_bits, dst_bits, src_stride, dst_stride, 116317c648bSmrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 117317c648bSmrg width, height); 118317c648bSmrg} 119317c648bSmrg 120317c648bSmrgstatic pixman_bool_t 121317c648bSmrgdelegate_fill (pixman_implementation_t *imp, 122317c648bSmrg uint32_t *bits, 123317c648bSmrg int stride, 124317c648bSmrg int bpp, 125317c648bSmrg int x, 126317c648bSmrg int y, 127317c648bSmrg int width, 128317c648bSmrg int height, 129317c648bSmrg uint32_t xor) 130317c648bSmrg{ 131317c648bSmrg return _pixman_implementation_fill (imp->delegate, bits, stride, bpp, x, y, width, height, xor); 132317c648bSmrg} 133317c648bSmrg 134317c648bSmrgpixman_implementation_t * 135317c648bSmrg_pixman_implementation_create (pixman_implementation_t *delegate) 136317c648bSmrg{ 137317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 138317c648bSmrg pixman_implementation_t *d; 139317c648bSmrg int i; 140317c648bSmrg 141317c648bSmrg if (!imp) 142317c648bSmrg return NULL; 143317c648bSmrg 144317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 145317c648bSmrg imp->delegate = delegate; 146317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 147317c648bSmrg d->toplevel = imp; 148317c648bSmrg 149317c648bSmrg /* Fill out function pointers with ones that just delegate 150317c648bSmrg */ 151317c648bSmrg imp->composite = delegate_composite; 152317c648bSmrg imp->blt = delegate_blt; 153317c648bSmrg imp->fill = delegate_fill; 154317c648bSmrg 155317c648bSmrg for (i = 0; i < PIXMAN_OP_LAST; ++i) 156317c648bSmrg { 157317c648bSmrg imp->combine_32[i] = delegate_combine_32; 158317c648bSmrg imp->combine_64[i] = delegate_combine_64; 159317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 160317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 161317c648bSmrg } 162317c648bSmrg 163317c648bSmrg return imp; 164317c648bSmrg} 165317c648bSmrg 166317c648bSmrgvoid 167317c648bSmrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 168317c648bSmrg pixman_op_t op, 169317c648bSmrg uint32_t * dest, 170317c648bSmrg const uint32_t * src, 171317c648bSmrg const uint32_t * mask, 172317c648bSmrg int width) 173317c648bSmrg{ 174317c648bSmrg (* imp->combine_32[op]) (imp, op, dest, src, mask, width); 175317c648bSmrg} 176317c648bSmrg 177317c648bSmrgvoid 178317c648bSmrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 179317c648bSmrg pixman_op_t op, 180317c648bSmrg uint64_t * dest, 181317c648bSmrg const uint64_t * src, 182317c648bSmrg const uint64_t * mask, 183317c648bSmrg int width) 184317c648bSmrg{ 185317c648bSmrg (* imp->combine_64[op]) (imp, op, dest, src, mask, width); 186317c648bSmrg} 187317c648bSmrg 188317c648bSmrgvoid 189317c648bSmrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 190317c648bSmrg pixman_op_t op, 191317c648bSmrg uint32_t * dest, 192317c648bSmrg const uint32_t * src, 193317c648bSmrg const uint32_t * mask, 194317c648bSmrg int width) 195317c648bSmrg{ 196317c648bSmrg (* imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 197317c648bSmrg} 198317c648bSmrg 199317c648bSmrgvoid 200317c648bSmrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 201317c648bSmrg pixman_op_t op, 202317c648bSmrg uint64_t * dest, 203317c648bSmrg const uint64_t * src, 204317c648bSmrg const uint64_t * mask, 205317c648bSmrg int width) 206317c648bSmrg{ 207317c648bSmrg (* imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 208317c648bSmrg} 209317c648bSmrg 210317c648bSmrgvoid 211317c648bSmrg_pixman_implementation_composite (pixman_implementation_t * imp, 212317c648bSmrg pixman_op_t op, 213317c648bSmrg pixman_image_t * src, 214317c648bSmrg pixman_image_t * mask, 215317c648bSmrg pixman_image_t * dest, 216317c648bSmrg int32_t src_x, 217317c648bSmrg int32_t src_y, 218317c648bSmrg int32_t mask_x, 219317c648bSmrg int32_t mask_y, 220317c648bSmrg int32_t dest_x, 221317c648bSmrg int32_t dest_y, 222317c648bSmrg int32_t width, 223317c648bSmrg int32_t height) 224317c648bSmrg{ 225317c648bSmrg (* imp->composite) (imp, op, 226317c648bSmrg src, mask, dest, 227317c648bSmrg src_x, src_y, mask_x, mask_y, dest_x, dest_y, 228317c648bSmrg width, height); 229317c648bSmrg} 230317c648bSmrg 231317c648bSmrgpixman_bool_t 232317c648bSmrg_pixman_implementation_blt (pixman_implementation_t * imp, 233317c648bSmrg uint32_t * src_bits, 234317c648bSmrg uint32_t * dst_bits, 235317c648bSmrg int src_stride, 236317c648bSmrg int dst_stride, 237317c648bSmrg int src_bpp, 238317c648bSmrg int dst_bpp, 239317c648bSmrg int src_x, 240317c648bSmrg int src_y, 241317c648bSmrg int dst_x, 242317c648bSmrg int dst_y, 243317c648bSmrg int width, 244317c648bSmrg int height) 245317c648bSmrg{ 246317c648bSmrg return (* imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 247317c648bSmrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 248317c648bSmrg width, height); 249317c648bSmrg} 250317c648bSmrg 251317c648bSmrgpixman_bool_t 252317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 253317c648bSmrg uint32_t *bits, 254317c648bSmrg int stride, 255317c648bSmrg int bpp, 256317c648bSmrg int x, 257317c648bSmrg int y, 258317c648bSmrg int width, 259317c648bSmrg int height, 260317c648bSmrg uint32_t xor) 261317c648bSmrg{ 262317c648bSmrg return (* imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 263317c648bSmrg} 264