pixman-implementation.c revision 953d7d37
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 114953d7d37Smrgstatic void 115953d7d37Smrgdelegate_src_iter_init (pixman_implementation_t *imp, 116953d7d37Smrg pixman_iter_t * iter, 117953d7d37Smrg pixman_image_t * image, 118953d7d37Smrg int x, 119953d7d37Smrg int y, 120953d7d37Smrg int width, 121953d7d37Smrg int height, 122953d7d37Smrg uint8_t * buffer, 123953d7d37Smrg iter_flags_t flags) 124953d7d37Smrg{ 125953d7d37Smrg _pixman_implementation_src_iter_init ( 126953d7d37Smrg imp->delegate, iter, image, x, y, width, height, buffer, flags); 127953d7d37Smrg} 128953d7d37Smrg 129953d7d37Smrgstatic void 130953d7d37Smrgdelegate_dest_iter_init (pixman_implementation_t *imp, 131953d7d37Smrg pixman_iter_t * iter, 132953d7d37Smrg pixman_image_t * image, 133953d7d37Smrg int x, 134953d7d37Smrg int y, 135953d7d37Smrg int width, 136953d7d37Smrg int height, 137953d7d37Smrg uint8_t * buffer, 138953d7d37Smrg iter_flags_t flags) 139953d7d37Smrg{ 140953d7d37Smrg _pixman_implementation_dest_iter_init ( 141953d7d37Smrg imp->delegate, iter, image, x, y, width, height, buffer, flags); 142953d7d37Smrg} 143953d7d37Smrg 144317c648bSmrgpixman_implementation_t * 145952204abSmrg_pixman_implementation_create (pixman_implementation_t *delegate, 146952204abSmrg const pixman_fast_path_t *fast_paths) 147317c648bSmrg{ 148317c648bSmrg pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t)); 149317c648bSmrg pixman_implementation_t *d; 150317c648bSmrg int i; 151d0321353Smrg 152317c648bSmrg if (!imp) 153317c648bSmrg return NULL; 154317c648bSmrg 155952204abSmrg assert (fast_paths); 156952204abSmrg 157317c648bSmrg /* Make sure the whole delegate chain has the right toplevel */ 158317c648bSmrg imp->delegate = delegate; 159317c648bSmrg for (d = imp; d != NULL; d = d->delegate) 160317c648bSmrg d->toplevel = imp; 161317c648bSmrg 162317c648bSmrg /* Fill out function pointers with ones that just delegate 163317c648bSmrg */ 164317c648bSmrg imp->blt = delegate_blt; 165317c648bSmrg imp->fill = delegate_fill; 166953d7d37Smrg imp->src_iter_init = delegate_src_iter_init; 167953d7d37Smrg imp->dest_iter_init = delegate_dest_iter_init; 168d0321353Smrg 169952204abSmrg for (i = 0; i < PIXMAN_N_OPERATORS; ++i) 170317c648bSmrg { 171317c648bSmrg imp->combine_32[i] = delegate_combine_32; 172317c648bSmrg imp->combine_64[i] = delegate_combine_64; 173317c648bSmrg imp->combine_32_ca[i] = delegate_combine_32_ca; 174317c648bSmrg imp->combine_64_ca[i] = delegate_combine_64_ca; 175317c648bSmrg } 176d0321353Smrg 177952204abSmrg imp->fast_paths = fast_paths; 178953d7d37Smrg 179317c648bSmrg return imp; 180317c648bSmrg} 181317c648bSmrg 182317c648bSmrgvoid 183d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp, 184d0321353Smrg pixman_op_t op, 185d0321353Smrg uint32_t * dest, 186d0321353Smrg const uint32_t * src, 187d0321353Smrg const uint32_t * mask, 188d0321353Smrg int width) 189317c648bSmrg{ 190d0321353Smrg (*imp->combine_32[op]) (imp, op, dest, src, mask, width); 191317c648bSmrg} 192317c648bSmrg 193317c648bSmrgvoid 194d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp, 195d0321353Smrg pixman_op_t op, 196d0321353Smrg uint64_t * dest, 197d0321353Smrg const uint64_t * src, 198d0321353Smrg const uint64_t * mask, 199d0321353Smrg int width) 200317c648bSmrg{ 201d0321353Smrg (*imp->combine_64[op]) (imp, op, dest, src, mask, width); 202317c648bSmrg} 203317c648bSmrg 204317c648bSmrgvoid 205d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp, 206d0321353Smrg pixman_op_t op, 207d0321353Smrg uint32_t * dest, 208d0321353Smrg const uint32_t * src, 209d0321353Smrg const uint32_t * mask, 210d0321353Smrg int width) 211317c648bSmrg{ 212d0321353Smrg (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width); 213317c648bSmrg} 214317c648bSmrg 215317c648bSmrgvoid 216d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp, 217d0321353Smrg pixman_op_t op, 218d0321353Smrg uint64_t * dest, 219d0321353Smrg const uint64_t * src, 220d0321353Smrg const uint64_t * mask, 221d0321353Smrg int width) 222317c648bSmrg{ 223d0321353Smrg (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width); 224317c648bSmrg} 225317c648bSmrg 226317c648bSmrgpixman_bool_t 227d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp, 228d0321353Smrg uint32_t * src_bits, 229d0321353Smrg uint32_t * dst_bits, 230d0321353Smrg int src_stride, 231d0321353Smrg int dst_stride, 232d0321353Smrg int src_bpp, 233d0321353Smrg int dst_bpp, 234d0321353Smrg int src_x, 235d0321353Smrg int src_y, 236d0321353Smrg int dst_x, 237d0321353Smrg int dst_y, 238d0321353Smrg int width, 239d0321353Smrg int height) 240317c648bSmrg{ 241d0321353Smrg return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride, 242d0321353Smrg src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, 243d0321353Smrg width, height); 244317c648bSmrg} 245317c648bSmrg 246317c648bSmrgpixman_bool_t 247317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp, 248d0321353Smrg uint32_t * bits, 249d0321353Smrg int stride, 250d0321353Smrg int bpp, 251d0321353Smrg int x, 252d0321353Smrg int y, 253d0321353Smrg int width, 254d0321353Smrg int height, 255d0321353Smrg uint32_t xor) 256317c648bSmrg{ 257d0321353Smrg return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor); 258317c648bSmrg} 259d0321353Smrg 260953d7d37Smrgstatic uint32_t * 261953d7d37Smrgget_scanline_null (pixman_iter_t *iter, const uint32_t *mask) 262953d7d37Smrg{ 263953d7d37Smrg return NULL; 264953d7d37Smrg} 265953d7d37Smrg 266953d7d37Smrgvoid 267953d7d37Smrg_pixman_implementation_src_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{ 277953d7d37Smrg if (!image) 278953d7d37Smrg { 279953d7d37Smrg iter->get_scanline = get_scanline_null; 280953d7d37Smrg } 281953d7d37Smrg else if ((flags & (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB)) == 282953d7d37Smrg (ITER_IGNORE_ALPHA | ITER_IGNORE_RGB)) 283953d7d37Smrg { 284953d7d37Smrg iter->get_scanline = _pixman_iter_get_scanline_noop; 285953d7d37Smrg } 286953d7d37Smrg else 287953d7d37Smrg { 288953d7d37Smrg (*imp->src_iter_init) ( 289953d7d37Smrg imp, iter, image, x, y, width, height, buffer, flags); 290953d7d37Smrg } 291953d7d37Smrg} 292953d7d37Smrg 293953d7d37Smrgvoid 294953d7d37Smrg_pixman_implementation_dest_iter_init (pixman_implementation_t *imp, 295953d7d37Smrg pixman_iter_t *iter, 296953d7d37Smrg pixman_image_t *image, 297953d7d37Smrg int x, 298953d7d37Smrg int y, 299953d7d37Smrg int width, 300953d7d37Smrg int height, 301953d7d37Smrg uint8_t *buffer, 302953d7d37Smrg iter_flags_t flags) 303953d7d37Smrg{ 304953d7d37Smrg (*imp->dest_iter_init) ( 305953d7d37Smrg imp, iter, image, x, y, width, height, buffer, flags); 306953d7d37Smrg} 307