pixman-implementation.c revision 952204ab
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
114317c648bSmrgpixman_implementation_t *
115952204abSmrg_pixman_implementation_create (pixman_implementation_t *delegate,
116952204abSmrg			       const pixman_fast_path_t *fast_paths)
117317c648bSmrg{
118317c648bSmrg    pixman_implementation_t *imp = malloc (sizeof (pixman_implementation_t));
119317c648bSmrg    pixman_implementation_t *d;
120317c648bSmrg    int i;
121d0321353Smrg
122317c648bSmrg    if (!imp)
123317c648bSmrg	return NULL;
124317c648bSmrg
125952204abSmrg    assert (fast_paths);
126952204abSmrg
127317c648bSmrg    /* Make sure the whole delegate chain has the right toplevel */
128317c648bSmrg    imp->delegate = delegate;
129317c648bSmrg    for (d = imp; d != NULL; d = d->delegate)
130317c648bSmrg	d->toplevel = imp;
131317c648bSmrg
132317c648bSmrg    /* Fill out function pointers with ones that just delegate
133317c648bSmrg     */
134317c648bSmrg    imp->blt = delegate_blt;
135317c648bSmrg    imp->fill = delegate_fill;
136d0321353Smrg
137952204abSmrg    for (i = 0; i < PIXMAN_N_OPERATORS; ++i)
138317c648bSmrg    {
139317c648bSmrg	imp->combine_32[i] = delegate_combine_32;
140317c648bSmrg	imp->combine_64[i] = delegate_combine_64;
141317c648bSmrg	imp->combine_32_ca[i] = delegate_combine_32_ca;
142317c648bSmrg	imp->combine_64_ca[i] = delegate_combine_64_ca;
143317c648bSmrg    }
144d0321353Smrg
145952204abSmrg    imp->fast_paths = fast_paths;
146952204abSmrg
147317c648bSmrg    return imp;
148317c648bSmrg}
149317c648bSmrg
150317c648bSmrgvoid
151d0321353Smrg_pixman_implementation_combine_32 (pixman_implementation_t * imp,
152d0321353Smrg                                   pixman_op_t               op,
153d0321353Smrg                                   uint32_t *                dest,
154d0321353Smrg                                   const uint32_t *          src,
155d0321353Smrg                                   const uint32_t *          mask,
156d0321353Smrg                                   int                       width)
157317c648bSmrg{
158d0321353Smrg    (*imp->combine_32[op]) (imp, op, dest, src, mask, width);
159317c648bSmrg}
160317c648bSmrg
161317c648bSmrgvoid
162d0321353Smrg_pixman_implementation_combine_64 (pixman_implementation_t * imp,
163d0321353Smrg                                   pixman_op_t               op,
164d0321353Smrg                                   uint64_t *                dest,
165d0321353Smrg                                   const uint64_t *          src,
166d0321353Smrg                                   const uint64_t *          mask,
167d0321353Smrg                                   int                       width)
168317c648bSmrg{
169d0321353Smrg    (*imp->combine_64[op]) (imp, op, dest, src, mask, width);
170317c648bSmrg}
171317c648bSmrg
172317c648bSmrgvoid
173d0321353Smrg_pixman_implementation_combine_32_ca (pixman_implementation_t * imp,
174d0321353Smrg                                      pixman_op_t               op,
175d0321353Smrg                                      uint32_t *                dest,
176d0321353Smrg                                      const uint32_t *          src,
177d0321353Smrg                                      const uint32_t *          mask,
178d0321353Smrg                                      int                       width)
179317c648bSmrg{
180d0321353Smrg    (*imp->combine_32_ca[op]) (imp, op, dest, src, mask, width);
181317c648bSmrg}
182317c648bSmrg
183317c648bSmrgvoid
184d0321353Smrg_pixman_implementation_combine_64_ca (pixman_implementation_t * imp,
185d0321353Smrg                                      pixman_op_t               op,
186d0321353Smrg                                      uint64_t *                dest,
187d0321353Smrg                                      const uint64_t *          src,
188d0321353Smrg                                      const uint64_t *          mask,
189d0321353Smrg                                      int                       width)
190317c648bSmrg{
191d0321353Smrg    (*imp->combine_64_ca[op]) (imp, op, dest, src, mask, width);
192317c648bSmrg}
193317c648bSmrg
194317c648bSmrgpixman_bool_t
195d0321353Smrg_pixman_implementation_blt (pixman_implementation_t * imp,
196d0321353Smrg                            uint32_t *                src_bits,
197d0321353Smrg                            uint32_t *                dst_bits,
198d0321353Smrg                            int                       src_stride,
199d0321353Smrg                            int                       dst_stride,
200d0321353Smrg                            int                       src_bpp,
201d0321353Smrg                            int                       dst_bpp,
202d0321353Smrg                            int                       src_x,
203d0321353Smrg                            int                       src_y,
204d0321353Smrg                            int                       dst_x,
205d0321353Smrg                            int                       dst_y,
206d0321353Smrg                            int                       width,
207d0321353Smrg                            int                       height)
208317c648bSmrg{
209d0321353Smrg    return (*imp->blt) (imp, src_bits, dst_bits, src_stride, dst_stride,
210d0321353Smrg			src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y,
211d0321353Smrg			width, height);
212317c648bSmrg}
213317c648bSmrg
214317c648bSmrgpixman_bool_t
215317c648bSmrg_pixman_implementation_fill (pixman_implementation_t *imp,
216d0321353Smrg                             uint32_t *               bits,
217d0321353Smrg                             int                      stride,
218d0321353Smrg                             int                      bpp,
219d0321353Smrg                             int                      x,
220d0321353Smrg                             int                      y,
221d0321353Smrg                             int                      width,
222d0321353Smrg                             int                      height,
223d0321353Smrg                             uint32_t                 xor)
224317c648bSmrg{
225d0321353Smrg    return (*imp->fill) (imp, bits, stride, bpp, x, y, width, height, xor);
226317c648bSmrg}
227d0321353Smrg
228