pixman-implementation.c revision d0321353
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
29d0321353Smrgdelegate_composite (pixman_implementation_t * imp,
30d0321353Smrg                    pixman_op_t               op,
31d0321353Smrg                    pixman_image_t *          src,
32d0321353Smrg                    pixman_image_t *          mask,
33d0321353Smrg                    pixman_image_t *          dest,
34d0321353Smrg                    int32_t                   src_x,
35d0321353Smrg                    int32_t                   src_y,
36d0321353Smrg                    int32_t                   mask_x,
37d0321353Smrg                    int32_t                   mask_y,
38d0321353Smrg                    int32_t                   dest_x,
39d0321353Smrg                    int32_t                   dest_y,
40d0321353Smrg                    int32_t                   width,
41d0321353Smrg                    int32_t                   height)
42317c648bSmrg{
43317c648bSmrg    _pixman_implementation_composite (imp->delegate,
44d0321353Smrg                                      op,
45d0321353Smrg                                      src, mask, dest,
46d0321353Smrg                                      src_x, src_y,
47d0321353Smrg                                      mask_x, mask_y,
48d0321353Smrg                                      dest_x, dest_y,
49d0321353Smrg                                      width, height);
50317c648bSmrg}
51317c648bSmrg
52317c648bSmrgstatic void
53d0321353Smrgdelegate_combine_32 (pixman_implementation_t * imp,
54d0321353Smrg                     pixman_op_t               op,
55d0321353Smrg                     uint32_t *                dest,
56d0321353Smrg                     const uint32_t *          src,
57d0321353Smrg                     const uint32_t *          mask,
58d0321353Smrg                     int                       width)
59317c648bSmrg{
60317c648bSmrg    _pixman_implementation_combine_32 (imp->delegate,
61d0321353Smrg                                       op, dest, src, mask, width);
62317c648bSmrg}
63317c648bSmrg
64317c648bSmrgstatic void
65d0321353Smrgdelegate_combine_64 (pixman_implementation_t * imp,
66d0321353Smrg                     pixman_op_t               op,
67d0321353Smrg                     uint64_t *                dest,
68d0321353Smrg                     const uint64_t *          src,
69d0321353Smrg                     const uint64_t *          mask,
70d0321353Smrg                     int                       width)
71317c648bSmrg{
72317c648bSmrg    _pixman_implementation_combine_64 (imp->delegate,
73d0321353Smrg                                       op, dest, src, mask, width);
74317c648bSmrg}
75317c648bSmrg
76317c648bSmrgstatic void
77d0321353Smrgdelegate_combine_32_ca (pixman_implementation_t * imp,
78d0321353Smrg                        pixman_op_t               op,
79d0321353Smrg                        uint32_t *                dest,
80d0321353Smrg                        const uint32_t *          src,
81d0321353Smrg                        const uint32_t *          mask,
82d0321353Smrg                        int                       width)
83317c648bSmrg{
84317c648bSmrg    _pixman_implementation_combine_32_ca (imp->delegate,
85d0321353Smrg                                          op, dest, src, mask, width);
86317c648bSmrg}
87317c648bSmrg
88317c648bSmrgstatic void
89d0321353Smrgdelegate_combine_64_ca (pixman_implementation_t * imp,
90d0321353Smrg                        pixman_op_t               op,
91d0321353Smrg                        uint64_t *                dest,
92d0321353Smrg                        const uint64_t *          src,
93d0321353Smrg                        const uint64_t *          mask,
94d0321353Smrg                        int                       width)
95317c648bSmrg{
96317c648bSmrg    _pixman_implementation_combine_64_ca (imp->delegate,
97d0321353Smrg                                          op, dest, src, mask, width);
98317c648bSmrg}
99317c648bSmrg
100317c648bSmrgstatic pixman_bool_t
101d0321353Smrgdelegate_blt (pixman_implementation_t * imp,
102d0321353Smrg              uint32_t *                src_bits,
103d0321353Smrg              uint32_t *                dst_bits,
104d0321353Smrg              int                       src_stride,
105d0321353Smrg              int                       dst_stride,
106d0321353Smrg              int                       src_bpp,
107d0321353Smrg              int                       dst_bpp,
108d0321353Smrg              int                       src_x,
109d0321353Smrg              int                       src_y,
110d0321353Smrg              int                       dst_x,
111d0321353Smrg              int                       dst_y,
112d0321353Smrg              int                       width,
113d0321353Smrg              int                       height)
114317c648bSmrg{
115d0321353Smrg    return _pixman_implementation_blt (
116d0321353Smrg	imp->delegate, src_bits, dst_bits, src_stride, dst_stride,
117d0321353Smrg	src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
118d0321353Smrg	width, height);
119317c648bSmrg}
120317c648bSmrg
121317c648bSmrgstatic pixman_bool_t
122317c648bSmrgdelegate_fill (pixman_implementation_t *imp,
123d0321353Smrg               uint32_t *               bits,
124d0321353Smrg               int                      stride,
125d0321353Smrg               int                      bpp,
126d0321353Smrg               int                      x,
127d0321353Smrg               int                      y,
128d0321353Smrg               int                      width,
129d0321353Smrg               int                      height,
130d0321353Smrg               uint32_t                 xor)
131317c648bSmrg{
132d0321353Smrg    return _pixman_implementation_fill (
133d0321353Smrg	imp->delegate, bits, stride, bpp, x, y, width, height, xor);
134317c648bSmrg}
135317c648bSmrg
136317c648bSmrgpixman_implementation_t *
137317c648bSmrg_pixman_implementation_create (pixman_implementation_t *delegate)
138317c648bSmrg{
139317c648bSmrg    pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t));
140317c648bSmrg    pixman_implementation_t *d;
141317c648bSmrg    int i;
142d0321353Smrg
143317c648bSmrg    if (!imp)
144317c648bSmrg	return NULL;
145317c648bSmrg
146317c648bSmrg    /* Make sure the whole delegate chain has the right toplevel */
147317c648bSmrg    imp->delegate = delegate;
148317c648bSmrg    for (d = imp; d != NULL; d = d->delegate)
149317c648bSmrg	d->toplevel = imp;
150317c648bSmrg
151317c648bSmrg    /* Fill out function pointers with ones that just delegate
152317c648bSmrg     */
153317c648bSmrg    imp->composite = delegate_composite;
154317c648bSmrg    imp->blt = delegate_blt;
155317c648bSmrg    imp->fill = delegate_fill;
156d0321353Smrg
157317c648bSmrg    for (i = 0; i < PIXMAN_OP_LAST; ++i)
158317c648bSmrg    {
159317c648bSmrg	imp->combine_32[i] = delegate_combine_32;
160317c648bSmrg	imp->combine_64[i] = delegate_combine_64;
161317c648bSmrg	imp->combine_32_ca[i] = delegate_combine_32_ca;
162317c648bSmrg	imp->combine_64_ca[i] = delegate_combine_64_ca;
163317c648bSmrg    }
164d0321353Smrg
165317c648bSmrg    return imp;
166317c648bSmrg}
167317c648bSmrg
168317c648bSmrgvoid
169d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp,
170d0321353Smrg                                   pixman_op_t               op,
171d0321353Smrg                                   uint32_t *                dest,
172d0321353Smrg                                   const uint32_t *          src,
173d0321353Smrg                                   const uint32_t *          mask,
174d0321353Smrg                                   int                       width)
175317c648bSmrg{
176d0321353Smrg    (*imp->combine_32[op]) (imp, op, dest, src, mask, width);
177317c648bSmrg}
178317c648bSmrg
179317c648bSmrgvoid
180d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp,
181d0321353Smrg                                   pixman_op_t               op,
182d0321353Smrg                                   uint64_t *                dest,
183d0321353Smrg                                   const uint64_t *          src,
184d0321353Smrg                                   const uint64_t *          mask,
185d0321353Smrg                                   int                       width)
186317c648bSmrg{
187d0321353Smrg    (*imp->combine_64[op]) (imp, op, dest, src, mask, width);
188317c648bSmrg}
189317c648bSmrg
190317c648bSmrgvoid
191d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp,
192d0321353Smrg                                      pixman_op_t               op,
193d0321353Smrg                                      uint32_t *                dest,
194d0321353Smrg                                      const uint32_t *          src,
195d0321353Smrg                                      const uint32_t *          mask,
196d0321353Smrg                                      int                       width)
197317c648bSmrg{
198d0321353Smrg    (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width);
199317c648bSmrg}
200317c648bSmrg
201317c648bSmrgvoid
202d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp,
203d0321353Smrg                                      pixman_op_t               op,
204d0321353Smrg                                      uint64_t *                dest,
205d0321353Smrg                                      const uint64_t *          src,
206d0321353Smrg                                      const uint64_t *          mask,
207d0321353Smrg                                      int                       width)
208317c648bSmrg{
209d0321353Smrg    (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width);
210317c648bSmrg}
211317c648bSmrg
212317c648bSmrgvoid
213d0321353Smrg_pixman_implementation_composite (pixman_implementation_t * imp,
214d0321353Smrg                                  pixman_op_t               op,
215d0321353Smrg                                  pixman_image_t *          src,
216d0321353Smrg                                  pixman_image_t *          mask,
217d0321353Smrg                                  pixman_image_t *          dest,
218d0321353Smrg                                  int32_t                   src_x,
219d0321353Smrg                                  int32_t                   src_y,
220d0321353Smrg                                  int32_t                   mask_x,
221d0321353Smrg                                  int32_t                   mask_y,
222d0321353Smrg                                  int32_t                   dest_x,
223d0321353Smrg                                  int32_t                   dest_y,
224d0321353Smrg                                  int32_t                   width,
225d0321353Smrg                                  int32_t                   height)
226317c648bSmrg{
227d0321353Smrg    (*imp->composite) (imp, op,
228d0321353Smrg		       src, mask, dest,
229d0321353Smrg		       src_x, src_y, mask_x, mask_y, dest_x, dest_y,
230d0321353Smrg		       width, height);
231317c648bSmrg}
232317c648bSmrg
233317c648bSmrgpixman_bool_t
234d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp,
235d0321353Smrg                            uint32_t *                src_bits,
236d0321353Smrg                            uint32_t *                dst_bits,
237d0321353Smrg                            int                       src_stride,
238d0321353Smrg                            int                       dst_stride,
239d0321353Smrg                            int                       src_bpp,
240d0321353Smrg                            int                       dst_bpp,
241d0321353Smrg                            int                       src_x,
242d0321353Smrg                            int                       src_y,
243d0321353Smrg                            int                       dst_x,
244d0321353Smrg                            int                       dst_y,
245d0321353Smrg                            int                       width,
246d0321353Smrg                            int                       height)
247317c648bSmrg{
248d0321353Smrg    return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride,
249d0321353Smrg			src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
250d0321353Smrg			width, height);
251317c648bSmrg}
252317c648bSmrg
253317c648bSmrgpixman_bool_t
254317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp,
255d0321353Smrg                             uint32_t *               bits,
256d0321353Smrg                             int                      stride,
257d0321353Smrg                             int                      bpp,
258d0321353Smrg                             int                      x,
259d0321353Smrg                             int                      y,
260d0321353Smrg                             int                      width,
261d0321353Smrg                             int                      height,
262d0321353Smrg                             uint32_t                 xor)
263317c648bSmrg{
264d0321353Smrg    return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor);
265317c648bSmrg}
266d0321353Smrg
267