pixman-implementation.c revision a450e446
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_composite (pixman_implementation_t * imp,
32d0321353Smrg                    pixman_op_t               op,
33d0321353Smrg                    pixman_image_t *          src,
34d0321353Smrg                    pixman_image_t *          mask,
35d0321353Smrg                    pixman_image_t *          dest,
36d0321353Smrg                    int32_t                   src_x,
37d0321353Smrg                    int32_t                   src_y,
38d0321353Smrg                    int32_t                   mask_x,
39d0321353Smrg                    int32_t                   mask_y,
40d0321353Smrg                    int32_t                   dest_x,
41d0321353Smrg                    int32_t                   dest_y,
42d0321353Smrg                    int32_t                   width,
43d0321353Smrg                    int32_t                   height)
44317c648bSmrg{
45317c648bSmrg    _pixman_implementation_composite (imp->delegate,
46d0321353Smrg                                      op,
47d0321353Smrg                                      src, mask, dest,
48d0321353Smrg                                      src_x, src_y,
49d0321353Smrg                                      mask_x, mask_y,
50d0321353Smrg                                      dest_x, dest_y,
51d0321353Smrg                                      width, height);
52317c648bSmrg}
53317c648bSmrg
54317c648bSmrgstatic void
55d0321353Smrgdelegate_combine_32 (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 (imp->delegate,
63d0321353Smrg                                       op, dest, src, mask, width);
64317c648bSmrg}
65317c648bSmrg
66317c648bSmrgstatic void
67d0321353Smrgdelegate_combine_64 (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 (imp->delegate,
75d0321353Smrg                                       op, dest, src, mask, width);
76317c648bSmrg}
77317c648bSmrg
78317c648bSmrgstatic void
79d0321353Smrgdelegate_combine_32_ca (pixman_implementation_t * imp,
80d0321353Smrg                        pixman_op_t               op,
81d0321353Smrg                        uint32_t *                dest,
82d0321353Smrg                        const uint32_t *          src,
83d0321353Smrg                        const uint32_t *          mask,
84d0321353Smrg                        int                       width)
85317c648bSmrg{
86317c648bSmrg    _pixman_implementation_combine_32_ca (imp->delegate,
87d0321353Smrg                                          op, dest, src, mask, width);
88317c648bSmrg}
89317c648bSmrg
90317c648bSmrgstatic void
91d0321353Smrgdelegate_combine_64_ca (pixman_implementation_t * imp,
92d0321353Smrg                        pixman_op_t               op,
93d0321353Smrg                        uint64_t *                dest,
94d0321353Smrg                        const uint64_t *          src,
95d0321353Smrg                        const uint64_t *          mask,
96d0321353Smrg                        int                       width)
97317c648bSmrg{
98317c648bSmrg    _pixman_implementation_combine_64_ca (imp->delegate,
99d0321353Smrg                                          op, dest, src, mask, width);
100317c648bSmrg}
101317c648bSmrg
102317c648bSmrgstatic pixman_bool_t
103d0321353Smrgdelegate_blt (pixman_implementation_t * imp,
104d0321353Smrg              uint32_t *                src_bits,
105d0321353Smrg              uint32_t *                dst_bits,
106d0321353Smrg              int                       src_stride,
107d0321353Smrg              int                       dst_stride,
108d0321353Smrg              int                       src_bpp,
109d0321353Smrg              int                       dst_bpp,
110d0321353Smrg              int                       src_x,
111d0321353Smrg              int                       src_y,
112d0321353Smrg              int                       dst_x,
113d0321353Smrg              int                       dst_y,
114d0321353Smrg              int                       width,
115d0321353Smrg              int                       height)
116317c648bSmrg{
117d0321353Smrg    return _pixman_implementation_blt (
118d0321353Smrg	imp->delegate, src_bits, dst_bits, src_stride, dst_stride,
119d0321353Smrg	src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
120d0321353Smrg	width, height);
121317c648bSmrg}
122317c648bSmrg
123317c648bSmrgstatic pixman_bool_t
124317c648bSmrgdelegate_fill (pixman_implementation_t *imp,
125d0321353Smrg               uint32_t *               bits,
126d0321353Smrg               int                      stride,
127d0321353Smrg               int                      bpp,
128d0321353Smrg               int                      x,
129d0321353Smrg               int                      y,
130d0321353Smrg               int                      width,
131d0321353Smrg               int                      height,
132d0321353Smrg               uint32_t                 xor)
133317c648bSmrg{
134d0321353Smrg    return _pixman_implementation_fill (
135d0321353Smrg	imp->delegate, bits, stride, bpp, x, y, width, height, xor);
136317c648bSmrg}
137317c648bSmrg
138317c648bSmrgpixman_implementation_t *
139317c648bSmrg_pixman_implementation_create (pixman_implementation_t *delegate)
140317c648bSmrg{
141317c648bSmrg    pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t));
142317c648bSmrg    pixman_implementation_t *d;
143317c648bSmrg    int i;
144d0321353Smrg
145317c648bSmrg    if (!imp)
146317c648bSmrg	return NULL;
147317c648bSmrg
148317c648bSmrg    /* Make sure the whole delegate chain has the right toplevel */
149317c648bSmrg    imp->delegate = delegate;
150317c648bSmrg    for (d = imp; d != NULL; d = d->delegate)
151317c648bSmrg	d->toplevel = imp;
152317c648bSmrg
153317c648bSmrg    /* Fill out function pointers with ones that just delegate
154317c648bSmrg     */
155317c648bSmrg    imp->composite = delegate_composite;
156317c648bSmrg    imp->blt = delegate_blt;
157317c648bSmrg    imp->fill = delegate_fill;
158d0321353Smrg
159317c648bSmrg    for (i = 0; i < PIXMAN_OP_LAST; ++i)
160317c648bSmrg    {
161317c648bSmrg	imp->combine_32[i] = delegate_combine_32;
162317c648bSmrg	imp->combine_64[i] = delegate_combine_64;
163317c648bSmrg	imp->combine_32_ca[i] = delegate_combine_32_ca;
164317c648bSmrg	imp->combine_64_ca[i] = delegate_combine_64_ca;
165317c648bSmrg    }
166d0321353Smrg
167317c648bSmrg    return imp;
168317c648bSmrg}
169317c648bSmrg
170317c648bSmrgvoid
171d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp,
172d0321353Smrg                                   pixman_op_t               op,
173d0321353Smrg                                   uint32_t *                dest,
174d0321353Smrg                                   const uint32_t *          src,
175d0321353Smrg                                   const uint32_t *          mask,
176d0321353Smrg                                   int                       width)
177317c648bSmrg{
178d0321353Smrg    (*imp->combine_32[op]) (imp, op, dest, src, mask, width);
179317c648bSmrg}
180317c648bSmrg
181317c648bSmrgvoid
182d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp,
183d0321353Smrg                                   pixman_op_t               op,
184d0321353Smrg                                   uint64_t *                dest,
185d0321353Smrg                                   const uint64_t *          src,
186d0321353Smrg                                   const uint64_t *          mask,
187d0321353Smrg                                   int                       width)
188317c648bSmrg{
189d0321353Smrg    (*imp->combine_64[op]) (imp, op, dest, src, mask, width);
190317c648bSmrg}
191317c648bSmrg
192317c648bSmrgvoid
193d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp,
194d0321353Smrg                                      pixman_op_t               op,
195d0321353Smrg                                      uint32_t *                dest,
196d0321353Smrg                                      const uint32_t *          src,
197d0321353Smrg                                      const uint32_t *          mask,
198d0321353Smrg                                      int                       width)
199317c648bSmrg{
200d0321353Smrg    (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width);
201317c648bSmrg}
202317c648bSmrg
203317c648bSmrgvoid
204d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp,
205d0321353Smrg                                      pixman_op_t               op,
206d0321353Smrg                                      uint64_t *                dest,
207d0321353Smrg                                      const uint64_t *          src,
208d0321353Smrg                                      const uint64_t *          mask,
209d0321353Smrg                                      int                       width)
210317c648bSmrg{
211d0321353Smrg    (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width);
212317c648bSmrg}
213317c648bSmrg
214317c648bSmrgvoid
215d0321353Smrg_pixman_implementation_composite (pixman_implementation_t * imp,
216d0321353Smrg                                  pixman_op_t               op,
217d0321353Smrg                                  pixman_image_t *          src,
218d0321353Smrg                                  pixman_image_t *          mask,
219d0321353Smrg                                  pixman_image_t *          dest,
220d0321353Smrg                                  int32_t                   src_x,
221d0321353Smrg                                  int32_t                   src_y,
222d0321353Smrg                                  int32_t                   mask_x,
223d0321353Smrg                                  int32_t                   mask_y,
224d0321353Smrg                                  int32_t                   dest_x,
225d0321353Smrg                                  int32_t                   dest_y,
226d0321353Smrg                                  int32_t                   width,
227d0321353Smrg                                  int32_t                   height)
228317c648bSmrg{
229d0321353Smrg    (*imp->composite) (imp, op,
230d0321353Smrg		       src, mask, dest,
231d0321353Smrg		       src_x, src_y, mask_x, mask_y, dest_x, dest_y,
232d0321353Smrg		       width, height);
233317c648bSmrg}
234317c648bSmrg
235317c648bSmrgpixman_bool_t
236d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp,
237d0321353Smrg                            uint32_t *                src_bits,
238d0321353Smrg                            uint32_t *                dst_bits,
239d0321353Smrg                            int                       src_stride,
240d0321353Smrg                            int                       dst_stride,
241d0321353Smrg                            int                       src_bpp,
242d0321353Smrg                            int                       dst_bpp,
243d0321353Smrg                            int                       src_x,
244d0321353Smrg                            int                       src_y,
245d0321353Smrg                            int                       dst_x,
246d0321353Smrg                            int                       dst_y,
247d0321353Smrg                            int                       width,
248d0321353Smrg                            int                       height)
249317c648bSmrg{
250d0321353Smrg    return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride,
251d0321353Smrg			src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
252d0321353Smrg			width, height);
253317c648bSmrg}
254317c648bSmrg
255317c648bSmrgpixman_bool_t
256317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp,
257d0321353Smrg                             uint32_t *               bits,
258d0321353Smrg                             int                      stride,
259d0321353Smrg                             int                      bpp,
260d0321353Smrg                             int                      x,
261d0321353Smrg                             int                      y,
262d0321353Smrg                             int                      width,
263d0321353Smrg                             int                      height,
264d0321353Smrg                             uint32_t                 xor)
265317c648bSmrg{
266d0321353Smrg    return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor);
267317c648bSmrg}
268d0321353Smrg
269