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