pixman-implementation.c revision 952204ab
1/*
2 * Copyright © 2009 Red Hat, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Red Hat not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission.  Red Hat makes no representations about the
11 * suitability of this software for any purpose.  It is provided "as is"
12 * without express or implied warranty.
13 *
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
15 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
16 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
17 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
19 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
20 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21 * SOFTWARE.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27#include <stdlib.h>
28#include "pixman-private.h"
29
30static void
31delegate_combine_32 (pixman_implementation_t * imp,
32                     pixman_op_t               op,
33                     uint32_t *                dest,
34                     const uint32_t *          src,
35                     const uint32_t *          mask,
36                     int                       width)
37{
38    _pixman_implementation_combine_32 (imp->delegate,
39                                       op, dest, src, mask, width);
40}
41
42static void
43delegate_combine_64 (pixman_implementation_t * imp,
44                     pixman_op_t               op,
45                     uint64_t *                dest,
46                     const uint64_t *          src,
47                     const uint64_t *          mask,
48                     int                       width)
49{
50    _pixman_implementation_combine_64 (imp->delegate,
51                                       op, dest, src, mask, width);
52}
53
54static void
55delegate_combine_32_ca (pixman_implementation_t * imp,
56                        pixman_op_t               op,
57                        uint32_t *                dest,
58                        const uint32_t *          src,
59                        const uint32_t *          mask,
60                        int                       width)
61{
62    _pixman_implementation_combine_32_ca (imp->delegate,
63                                          op, dest, src, mask, width);
64}
65
66static void
67delegate_combine_64_ca (pixman_implementation_t * imp,
68                        pixman_op_t               op,
69                        uint64_t *                dest,
70                        const uint64_t *          src,
71                        const uint64_t *          mask,
72                        int                       width)
73{
74    _pixman_implementation_combine_64_ca (imp->delegate,
75                                          op, dest, src, mask, width);
76}
77
78static pixman_bool_t
79delegate_blt (pixman_implementation_t * imp,
80              uint32_t *                src_bits,
81              uint32_t *                dst_bits,
82              int                       src_stride,
83              int                       dst_stride,
84              int                       src_bpp,
85              int                       dst_bpp,
86              int                       src_x,
87              int                       src_y,
88              int                       dst_x,
89              int                       dst_y,
90              int                       width,
91              int                       height)
92{
93    return _pixman_implementation_blt (
94	imp->delegate, src_bits, dst_bits, src_stride, dst_stride,
95	src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
96	width, height);
97}
98
99static pixman_bool_t
100delegate_fill (pixman_implementation_t *imp,
101               uint32_t *               bits,
102               int                      stride,
103               int                      bpp,
104               int                      x,
105               int                      y,
106               int                      width,
107               int                      height,
108               uint32_t                 xor)
109{
110    return _pixman_implementation_fill (
111	imp->delegate, bits, stride, bpp, x, y, width, height, xor);
112}
113
114pixman_implementation_t *
115_pixman_implementation_create (pixman_implementation_t *delegate,
116			       const pixman_fast_path_t *fast_paths)
117{
118    pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t));
119    pixman_implementation_t *d;
120    int i;
121
122    if (!imp)
123	return NULL;
124
125    assert (fast_paths);
126
127    /* Make sure the whole delegate chain has the right toplevel */
128    imp->delegate = delegate;
129    for (d = imp; d != NULL; d = d->delegate)
130	d->toplevel = imp;
131
132    /* Fill out function pointers with ones that just delegate
133     */
134    imp->blt = delegate_blt;
135    imp->fill = delegate_fill;
136
137    for (i = 0; i < PIXMAN_N_OPERATORS; ++i)
138    {
139	imp->combine_32[i] = delegate_combine_32;
140	imp->combine_64[i] = delegate_combine_64;
141	imp->combine_32_ca[i] = delegate_combine_32_ca;
142	imp->combine_64_ca[i] = delegate_combine_64_ca;
143    }
144
145    imp->fast_paths = fast_paths;
146
147    return imp;
148}
149
150void
151_pixman_implementation_combine_32 (pixman_implementation_t * imp,
152                                   pixman_op_t               op,
153                                   uint32_t *                dest,
154                                   const uint32_t *          src,
155                                   const uint32_t *          mask,
156                                   int                       width)
157{
158    (*imp->combine_32[op]) (imp, op, dest, src, mask, width);
159}
160
161void
162_pixman_implementation_combine_64 (pixman_implementation_t * imp,
163                                   pixman_op_t               op,
164                                   uint64_t *                dest,
165                                   const uint64_t *          src,
166                                   const uint64_t *          mask,
167                                   int                       width)
168{
169    (*imp->combine_64[op]) (imp, op, dest, src, mask, width);
170}
171
172void
173_pixman_implementation_combine_32_ca (pixman_implementation_t * imp,
174                                      pixman_op_t               op,
175                                      uint32_t *                dest,
176                                      const uint32_t *          src,
177                                      const uint32_t *          mask,
178                                      int                       width)
179{
180    (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width);
181}
182
183void
184_pixman_implementation_combine_64_ca (pixman_implementation_t * imp,
185                                      pixman_op_t               op,
186                                      uint64_t *                dest,
187                                      const uint64_t *          src,
188                                      const uint64_t *          mask,
189                                      int                       width)
190{
191    (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width);
192}
193
194pixman_bool_t
195_pixman_implementation_blt (pixman_implementation_t * imp,
196                            uint32_t *                src_bits,
197                            uint32_t *                dst_bits,
198                            int                       src_stride,
199                            int                       dst_stride,
200                            int                       src_bpp,
201                            int                       dst_bpp,
202                            int                       src_x,
203                            int                       src_y,
204                            int                       dst_x,
205                            int                       dst_y,
206                            int                       width,
207                            int                       height)
208{
209    return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride,
210			src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
211			width, height);
212}
213
214pixman_bool_t
215_pixman_implementation_fill (pixman_implementation_t *imp,
216                             uint32_t *               bits,
217                             int                      stride,
218                             int                      bpp,
219                             int                      x,
220                             int                      y,
221                             int                      width,
222                             int                      height,
223                             uint32_t                 xor)
224{
225    return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor);
226}
227
228