pixman-implementation.c revision d0321353
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 29d0321353Smrgdelegate_composite (pixman_implementation_t * imp, 30d0321353Smrg pixman_op_t op, 31d0321353Smrg pixman_image_t * src, 32d0321353Smrg pixman_image_t * mask, 33d0321353Smrg pixman_image_t * dest, 34d0321353Smrg int32_t src_x, 35d0321353Smrg int32_t src_y, 36d0321353Smrg int32_t mask_x, 37d0321353Smrg int32_t mask_y, 38d0321353Smrg int32_t dest_x, 39d0321353Smrg int32_t dest_y, 40d0321353Smrg int32_t width, 41d0321353Smrg int32_t height) 42317c648bSmrg{ 43317c648bSmrg _pixman_implementation_composite (imp->delegate, 44d0321353Smrg op, 45d0321353Smrg src, mask, dest, 46d0321353Smrg src_x, src_y, 47d0321353Smrg mask_x, mask_y, 48d0321353Smrg dest_x, dest_y, 49d0321353Smrg width, height); 50317c648bSmrg} 51317c648bSmrg 52317c648bSmrgstatic void 53d0321353Smrgdelegate_combine_32 (pixman_implementation_t * imp, 54d0321353Smrg pixman_op_t op, 55d0321353Smrg uint32_t * dest, 56d0321353Smrg const uint32_t * src, 57d0321353Smrg const uint32_t * mask, 58d0321353Smrg int width) 59317c648bSmrg{ 60317c648bSmrg _pixman_implementation_combine_32 (imp->delegate, 61d0321353Smrg op, dest, src, mask, width); 62317c648bSmrg} 63317c648bSmrg 64317c648bSmrgstatic void 65d0321353Smrgdelegate_combine_64 (pixman_implementation_t * imp, 66d0321353Smrg pixman_op_t op, 67d0321353Smrg uint64_t * dest, 68d0321353Smrg const uint64_t * src, 69d0321353Smrg const uint64_t * mask, 70d0321353Smrg int width) 71317c648bSmrg{ 72317c648bSmrg _pixman_implementation_combine_64 (imp->delegate, 73d0321353Smrg op, dest, src, mask, width); 74317c648bSmrg} 75317c648bSmrg 76317c648bSmrgstatic void 77d0321353Smrgdelegate_combine_32_ca (pixman_implementation_t * imp, 78d0321353Smrg pixman_op_t op, 79d0321353Smrg uint32_t * dest, 80d0321353Smrg const uint32_t * src, 81d0321353Smrg const uint32_t * mask, 82d0321353Smrg int width) 83317c648bSmrg{ 84317c648bSmrg _pixman_implementation_combine_32_ca (imp->delegate, 85d0321353Smrg op, dest, src, mask, width); 86317c648bSmrg} 87317c648bSmrg 88317c648bSmrgstatic void 89d0321353Smrgdelegate_combine_64_ca (pixman_implementation_t * imp, 90d0321353Smrg pixman_op_t op, 91d0321353Smrg uint64_t * dest, 92d0321353Smrg const uint64_t * src, 93d0321353Smrg const uint64_t * mask, 94d0321353Smrg int width) 95317c648bSmrg{ 96317c648bSmrg _pixman_implementation_combine_64_ca (imp->delegate, 97d0321353Smrg op, dest, src, mask, width); 98317c648bSmrg} 99317c648bSmrg 100317c648bSmrgstatic pixman_bool_t 101d0321353Smrgdelegate_blt (pixman_implementation_t * imp, 102d0321353Smrg uint32_t * src_bits, 103d0321353Smrg uint32_t * dst_bits, 104d0321353Smrg int src_stride, 105d0321353Smrg int dst_stride, 106d0321353Smrg int src_bpp, 107d0321353Smrg int dst_bpp, 108d0321353Smrg int src_x, 109d0321353Smrg int src_y, 110d0321353Smrg int dst_x, 111d0321353Smrg int dst_y, 112d0321353Smrg int width, 113d0321353Smrg int height) 114317c648bSmrg{ 115d0321353Smrg return _pixman_implementation_blt ( 116d0321353Smrg imp->delegate, src_bits, dst_bits, src_stride, dst_stride, 117d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 118d0321353Smrg width, height); 119317c648bSmrg} 120317c648bSmrg 121317c648bSmrgstatic pixman_bool_t 122317c648bSmrgdelegate_fill (pixman_implementation_t *imp, 123d0321353Smrg uint32_t * bits, 124d0321353Smrg int stride, 125d0321353Smrg int bpp, 126d0321353Smrg int x, 127d0321353Smrg int y, 128d0321353Smrg int width, 129d0321353Smrg int height, 130d0321353Smrg uint32_t xor) 131317c648bSmrg{ 132d0321353Smrg return _pixman_implementation_fill ( 133d0321353Smrg imp->delegate, bits, stride, bpp, x, y, width, height, xor); 134317c648bSmrg} 135317c648bSmrg 136317c648bSmrgpixman_implementation_t * 137317c648bSmrg_pixman_implementation_create (pixman_implementation_t *delegate) 138317c648bSmrg{ 139317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 140317c648bSmrg pixman_implementation_t *d; 141317c648bSmrg int i; 142d0321353Smrg 143317c648bSmrg if (!imp) 144317c648bSmrg return NULL; 145317c648bSmrg 146317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 147317c648bSmrg imp->delegate = delegate; 148317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 149317c648bSmrg d->toplevel = imp; 150317c648bSmrg 151317c648bSmrg /* Fill out function pointers with ones that just delegate 152317c648bSmrg */ 153317c648bSmrg imp->composite = delegate_composite; 154317c648bSmrg imp->blt = delegate_blt; 155317c648bSmrg imp->fill = delegate_fill; 156d0321353Smrg 157317c648bSmrg for (i = 0; i < PIXMAN_OP_LAST; ++i) 158317c648bSmrg { 159317c648bSmrg imp->combine_32[i] = delegate_combine_32; 160317c648bSmrg imp->combine_64[i] = delegate_combine_64; 161317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 162317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 163317c648bSmrg } 164d0321353Smrg 165317c648bSmrg return imp; 166317c648bSmrg} 167317c648bSmrg 168317c648bSmrgvoid 169d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 170d0321353Smrg pixman_op_t op, 171d0321353Smrg uint32_t * dest, 172d0321353Smrg const uint32_t * src, 173d0321353Smrg const uint32_t * mask, 174d0321353Smrg int width) 175317c648bSmrg{ 176d0321353Smrg (*imp->combine_32[op]) (imp, op, dest, src, mask, width); 177317c648bSmrg} 178317c648bSmrg 179317c648bSmrgvoid 180d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 181d0321353Smrg pixman_op_t op, 182d0321353Smrg uint64_t * dest, 183d0321353Smrg const uint64_t * src, 184d0321353Smrg const uint64_t * mask, 185d0321353Smrg int width) 186317c648bSmrg{ 187d0321353Smrg (*imp->combine_64[op]) (imp, op, dest, src, mask, width); 188317c648bSmrg} 189317c648bSmrg 190317c648bSmrgvoid 191d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 192d0321353Smrg pixman_op_t op, 193d0321353Smrg uint32_t * dest, 194d0321353Smrg const uint32_t * src, 195d0321353Smrg const uint32_t * mask, 196d0321353Smrg int width) 197317c648bSmrg{ 198d0321353Smrg (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 199317c648bSmrg} 200317c648bSmrg 201317c648bSmrgvoid 202d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 203d0321353Smrg pixman_op_t op, 204d0321353Smrg uint64_t * dest, 205d0321353Smrg const uint64_t * src, 206d0321353Smrg const uint64_t * mask, 207d0321353Smrg int width) 208317c648bSmrg{ 209d0321353Smrg (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 210317c648bSmrg} 211317c648bSmrg 212317c648bSmrgvoid 213d0321353Smrg_pixman_implementation_composite (pixman_implementation_t * imp, 214d0321353Smrg pixman_op_t op, 215d0321353Smrg pixman_image_t * src, 216d0321353Smrg pixman_image_t * mask, 217d0321353Smrg pixman_image_t * dest, 218d0321353Smrg int32_t src_x, 219d0321353Smrg int32_t src_y, 220d0321353Smrg int32_t mask_x, 221d0321353Smrg int32_t mask_y, 222d0321353Smrg int32_t dest_x, 223d0321353Smrg int32_t dest_y, 224d0321353Smrg int32_t width, 225d0321353Smrg int32_t height) 226317c648bSmrg{ 227d0321353Smrg (*imp->composite) (imp, op, 228d0321353Smrg src, mask, dest, 229d0321353Smrg src_x, src_y, mask_x, mask_y, dest_x, dest_y, 230d0321353Smrg width, height); 231317c648bSmrg} 232317c648bSmrg 233317c648bSmrgpixman_bool_t 234d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp, 235d0321353Smrg uint32_t * src_bits, 236d0321353Smrg uint32_t * dst_bits, 237d0321353Smrg int src_stride, 238d0321353Smrg int dst_stride, 239d0321353Smrg int src_bpp, 240d0321353Smrg int dst_bpp, 241d0321353Smrg int src_x, 242d0321353Smrg int src_y, 243d0321353Smrg int dst_x, 244d0321353Smrg int dst_y, 245d0321353Smrg int width, 246d0321353Smrg int height) 247317c648bSmrg{ 248d0321353Smrg return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 249d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 250d0321353Smrg width, height); 251317c648bSmrg} 252317c648bSmrg 253317c648bSmrgpixman_bool_t 254317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 255d0321353Smrg uint32_t * bits, 256d0321353Smrg int stride, 257d0321353Smrg int bpp, 258d0321353Smrg int x, 259d0321353Smrg int y, 260d0321353Smrg int width, 261d0321353Smrg int height, 262d0321353Smrg uint32_t xor) 263317c648bSmrg{ 264d0321353Smrg return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 265317c648bSmrg} 266d0321353Smrg 267