pixman-implementation.c revision 6ba797d6
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,
886ba797d6Smrg              int                       dest_x,
896ba797d6Smrg              int                       dest_y,
90d0321353Smrg              int                       width,
91d0321353Smrg              int                       height)
92317c648bSmrg{
93d0321353Smrg    return _pixman_implementation_blt (
94d0321353Smrg	imp->delegate, src_bits, dst_bits, src_stride, dst_stride,
956ba797d6Smrg	src_bpp, dst_bpp, src_x, src_y, dest_x, dest_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,
1166ba797d6Smrg			pixman_iter_t *	         iter)
117953d7d37Smrg{
1186ba797d6Smrg    imp->delegate->src_iter_init (imp->delegate, iter);
119953d7d37Smrg}
120953d7d37Smrg
121953d7d37Smrgstatic void
122953d7d37Smrgdelegate_dest_iter_init (pixman_implementation_t *imp,
1236ba797d6Smrg			 pixman_iter_t *	  iter)
124953d7d37Smrg{
1256ba797d6Smrg    imp->delegate->dest_iter_init (imp->delegate, iter);
126953d7d37Smrg}
127953d7d37Smrg
128317c648bSmrgpixman_implementation_t *
129952204abSmrg_pixman_implementation_create (pixman_implementation_t *delegate,
130952204abSmrg			       const pixman_fast_path_t *fast_paths)
131317c648bSmrg{
132317c648bSmrg    pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t));
133317c648bSmrg    pixman_implementation_t *d;
134317c648bSmrg    int i;
135d0321353Smrg
136317c648bSmrg    if (!imp)
137317c648bSmrg	return NULL;
138317c648bSmrg
139952204abSmrg    assert (fast_paths);
140952204abSmrg
141317c648bSmrg    /* Make sure the whole delegate chain has the right toplevel */
142317c648bSmrg    imp->delegate = delegate;
143317c648bSmrg    for (d = imp; d != NULL; d = d->delegate)
144317c648bSmrg	d->toplevel = imp;
145317c648bSmrg
146317c648bSmrg    /* Fill out function pointers with ones that just delegate
147317c648bSmrg     */
148317c648bSmrg    imp->blt = delegate_blt;
149317c648bSmrg    imp->fill = delegate_fill;
150953d7d37Smrg    imp->src_iter_init = delegate_src_iter_init;
151953d7d37Smrg    imp->dest_iter_init = delegate_dest_iter_init;
152d0321353Smrg
153952204abSmrg    for (i = 0; i < PIXMAN_N_OPERATORS; ++i)
154317c648bSmrg    {
155317c648bSmrg	imp->combine_32[i] = delegate_combine_32;
156317c648bSmrg	imp->combine_64[i] = delegate_combine_64;
157317c648bSmrg	imp->combine_32_ca[i] = delegate_combine_32_ca;
158317c648bSmrg	imp->combine_64_ca[i] = delegate_combine_64_ca;
159317c648bSmrg    }
160d0321353Smrg
161952204abSmrg    imp->fast_paths = fast_paths;
162953d7d37Smrg
163317c648bSmrg    return imp;
164317c648bSmrg}
165317c648bSmrg
166317c648bSmrgvoid
167d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp,
168d0321353Smrg                                   pixman_op_t               op,
169d0321353Smrg                                   uint32_t *                dest,
170d0321353Smrg                                   const uint32_t *          src,
171d0321353Smrg                                   const uint32_t *          mask,
172d0321353Smrg                                   int                       width)
173317c648bSmrg{
174d0321353Smrg    (*imp->combine_32[op]) (imp, op, dest, src, mask, width);
175317c648bSmrg}
176317c648bSmrg
177317c648bSmrgvoid
178d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp,
179d0321353Smrg                                   pixman_op_t               op,
180d0321353Smrg                                   uint64_t *                dest,
181d0321353Smrg                                   const uint64_t *          src,
182d0321353Smrg                                   const uint64_t *          mask,
183d0321353Smrg                                   int                       width)
184317c648bSmrg{
185d0321353Smrg    (*imp->combine_64[op]) (imp, op, dest, src, mask, width);
186317c648bSmrg}
187317c648bSmrg
188317c648bSmrgvoid
189d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp,
190d0321353Smrg                                      pixman_op_t               op,
191d0321353Smrg                                      uint32_t *                dest,
192d0321353Smrg                                      const uint32_t *          src,
193d0321353Smrg                                      const uint32_t *          mask,
194d0321353Smrg                                      int                       width)
195317c648bSmrg{
196d0321353Smrg    (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width);
197317c648bSmrg}
198317c648bSmrg
199317c648bSmrgvoid
200d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp,
201d0321353Smrg                                      pixman_op_t               op,
202d0321353Smrg                                      uint64_t *                dest,
203d0321353Smrg                                      const uint64_t *          src,
204d0321353Smrg                                      const uint64_t *          mask,
205d0321353Smrg                                      int                       width)
206317c648bSmrg{
207d0321353Smrg    (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width);
208317c648bSmrg}
209317c648bSmrg
210317c648bSmrgpixman_bool_t
211d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp,
212d0321353Smrg                            uint32_t *                src_bits,
213d0321353Smrg                            uint32_t *                dst_bits,
214d0321353Smrg                            int                       src_stride,
215d0321353Smrg                            int                       dst_stride,
216d0321353Smrg                            int                       src_bpp,
217d0321353Smrg                            int                       dst_bpp,
218d0321353Smrg                            int                       src_x,
219d0321353Smrg                            int                       src_y,
2206ba797d6Smrg                            int                       dest_x,
2216ba797d6Smrg                            int                       dest_y,
222d0321353Smrg                            int                       width,
223d0321353Smrg                            int                       height)
224317c648bSmrg{
225d0321353Smrg    return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride,
2266ba797d6Smrg			src_bpp, dst_bpp, src_x, src_y, dest_x, dest_y,
227d0321353Smrg			width, height);
228317c648bSmrg}
229317c648bSmrg
230317c648bSmrgpixman_bool_t
231317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp,
232d0321353Smrg                             uint32_t *               bits,
233d0321353Smrg                             int                      stride,
234d0321353Smrg                             int                      bpp,
235d0321353Smrg                             int                      x,
236d0321353Smrg                             int                      y,
237d0321353Smrg                             int                      width,
238d0321353Smrg                             int                      height,
239d0321353Smrg                             uint32_t                 xor)
240317c648bSmrg{
241d0321353Smrg    return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor);
242317c648bSmrg}
243d0321353Smrg
244953d7d37Smrgvoid
245953d7d37Smrg_pixman_implementation_src_iter_init (pixman_implementation_t	*imp,
246953d7d37Smrg				      pixman_iter_t             *iter,
247953d7d37Smrg				      pixman_image_t		*image,
248953d7d37Smrg				      int			 x,
249953d7d37Smrg				      int			 y,
250953d7d37Smrg				      int			 width,
251953d7d37Smrg				      int			 height,
252953d7d37Smrg				      uint8_t			*buffer,
253953d7d37Smrg				      iter_flags_t		 flags)
254953d7d37Smrg{
2556ba797d6Smrg    iter->image = image;
2566ba797d6Smrg    iter->buffer = (uint32_t *)buffer;
2576ba797d6Smrg    iter->x = x;
2586ba797d6Smrg    iter->y = y;
2596ba797d6Smrg    iter->width = width;
2606ba797d6Smrg    iter->height = height;
2616ba797d6Smrg    iter->flags = flags;
2626ba797d6Smrg
2636ba797d6Smrg    (*imp->src_iter_init) (imp, iter);
264953d7d37Smrg}
265953d7d37Smrg
266953d7d37Smrgvoid
267953d7d37Smrg_pixman_implementation_dest_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{
2776ba797d6Smrg    iter->image = image;
2786ba797d6Smrg    iter->buffer = (uint32_t *)buffer;
2796ba797d6Smrg    iter->x = x;
2806ba797d6Smrg    iter->y = y;
2816ba797d6Smrg    iter->width = width;
2826ba797d6Smrg    iter->height = height;
2836ba797d6Smrg    iter->flags = flags;
2846ba797d6Smrg
2856ba797d6Smrg    (*imp->dest_iter_init) (imp, iter);
286953d7d37Smrg}
287