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