pixman-implementation.c revision 952204ab
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, 88d0321353Smrg int dst_x, 89d0321353Smrg int dst_y, 90d0321353Smrg int width, 91d0321353Smrg int height) 92317c648bSmrg{ 93d0321353Smrg return _pixman_implementation_blt ( 94d0321353Smrg imp->delegate, src_bits, dst_bits, src_stride, dst_stride, 95d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_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 114317c648bSmrgpixman_implementation_t * 115952204abSmrg_pixman_implementation_create (pixman_implementation_t *delegate, 116952204abSmrg const pixman_fast_path_t *fast_paths) 117317c648bSmrg{ 118317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 119317c648bSmrg pixman_implementation_t *d; 120317c648bSmrg int i; 121d0321353Smrg 122317c648bSmrg if (!imp) 123317c648bSmrg return NULL; 124317c648bSmrg 125952204abSmrg assert (fast_paths); 126952204abSmrg 127317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 128317c648bSmrg imp->delegate = delegate; 129317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 130317c648bSmrg d->toplevel = imp; 131317c648bSmrg 132317c648bSmrg /* Fill out function pointers with ones that just delegate 133317c648bSmrg */ 134317c648bSmrg imp->blt = delegate_blt; 135317c648bSmrg imp->fill = delegate_fill; 136d0321353Smrg 137952204abSmrg for (i = 0; i < PIXMAN_N_OPERATORS; ++i) 138317c648bSmrg { 139317c648bSmrg imp->combine_32[i] = delegate_combine_32; 140317c648bSmrg imp->combine_64[i] = delegate_combine_64; 141317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 142317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 143317c648bSmrg } 144d0321353Smrg 145952204abSmrg imp->fast_paths = fast_paths; 146952204abSmrg 147317c648bSmrg return imp; 148317c648bSmrg} 149317c648bSmrg 150317c648bSmrgvoid 151d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 152d0321353Smrg pixman_op_t op, 153d0321353Smrg uint32_t * dest, 154d0321353Smrg const uint32_t * src, 155d0321353Smrg const uint32_t * mask, 156d0321353Smrg int width) 157317c648bSmrg{ 158d0321353Smrg (*imp->combine_32[op]) (imp, op, dest, src, mask, width); 159317c648bSmrg} 160317c648bSmrg 161317c648bSmrgvoid 162d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 163d0321353Smrg pixman_op_t op, 164d0321353Smrg uint64_t * dest, 165d0321353Smrg const uint64_t * src, 166d0321353Smrg const uint64_t * mask, 167d0321353Smrg int width) 168317c648bSmrg{ 169d0321353Smrg (*imp->combine_64[op]) (imp, op, dest, src, mask, width); 170317c648bSmrg} 171317c648bSmrg 172317c648bSmrgvoid 173d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 174d0321353Smrg pixman_op_t op, 175d0321353Smrg uint32_t * dest, 176d0321353Smrg const uint32_t * src, 177d0321353Smrg const uint32_t * mask, 178d0321353Smrg int width) 179317c648bSmrg{ 180d0321353Smrg (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 181317c648bSmrg} 182317c648bSmrg 183317c648bSmrgvoid 184d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 185d0321353Smrg pixman_op_t op, 186d0321353Smrg uint64_t * dest, 187d0321353Smrg const uint64_t * src, 188d0321353Smrg const uint64_t * mask, 189d0321353Smrg int width) 190317c648bSmrg{ 191d0321353Smrg (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 192317c648bSmrg} 193317c648bSmrg 194317c648bSmrgpixman_bool_t 195d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp, 196d0321353Smrg uint32_t * src_bits, 197d0321353Smrg uint32_t * dst_bits, 198d0321353Smrg int src_stride, 199d0321353Smrg int dst_stride, 200d0321353Smrg int src_bpp, 201d0321353Smrg int dst_bpp, 202d0321353Smrg int src_x, 203d0321353Smrg int src_y, 204d0321353Smrg int dst_x, 205d0321353Smrg int dst_y, 206d0321353Smrg int width, 207d0321353Smrg int height) 208317c648bSmrg{ 209d0321353Smrg return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 210d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 211d0321353Smrg width, height); 212317c648bSmrg} 213317c648bSmrg 214317c648bSmrgpixman_bool_t 215317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 216d0321353Smrg uint32_t * bits, 217d0321353Smrg int stride, 218d0321353Smrg int bpp, 219d0321353Smrg int x, 220d0321353Smrg int y, 221d0321353Smrg int width, 222d0321353Smrg int height, 223d0321353Smrg uint32_t xor) 224317c648bSmrg{ 225d0321353Smrg return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 226317c648bSmrg} 227d0321353Smrg 228