| @@ -26,132 +26,249 @@ | | | @@ -26,132 +26,249 @@ |
26 | * SOFTWARE. | | 26 | * SOFTWARE. |
27 | */ | | 27 | */ |
28 | | | 28 | |
29 | #ifdef HAVE_CONFIG_H | | 29 | #ifdef HAVE_CONFIG_H |
30 | #include <config.h> | | 30 | #include <config.h> |
31 | #endif | | 31 | #endif |
32 | #include <stdio.h> | | 32 | #include <stdio.h> |
33 | #include <stdlib.h> | | 33 | #include <stdlib.h> |
34 | #include <string.h> | | 34 | #include <string.h> |
35 | #include "pixman-private.h" | | 35 | #include "pixman-private.h" |
36 | #include "pixman-combine32.h" | | 36 | #include "pixman-combine32.h" |
37 | #include "pixman-inlines.h" | | 37 | #include "pixman-inlines.h" |
38 | | | 38 | |
39 | static uint32_t * | | 39 | /* Fetch functions */ |
40 | _pixman_image_get_scanline_generic_float (pixman_iter_t * iter, | | | |
41 | const uint32_t *mask) | | | |
42 | { | | | |
43 | pixman_iter_get_scanline_t fetch_32 = iter->data; | | | |
44 | uint32_t *buffer = iter->buffer; | | | |
45 | | | | |
46 | fetch_32 (iter, NULL); | | | |
47 | | | 40 | |
48 | pixman_expand_to_float ((argb_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width); | | 41 | static force_inline void |
| | | 42 | fetch_pixel_no_alpha_32 (bits_image_t *image, |
| | | 43 | int x, int y, pixman_bool_t check_bounds, |
| | | 44 | void *out) |
| | | 45 | { |
| | | 46 | uint32_t *ret = out; |
49 | | | 47 | |
50 | return iter->buffer; | | 48 | if (check_bounds && |
| | | 49 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) |
| | | 50 | *ret = 0; |
| | | 51 | else |
| | | 52 | *ret = image->fetch_pixel_32 (image, x, y); |
51 | } | | 53 | } |
52 | | | 54 | |
53 | /* Fetch functions */ | | 55 | static force_inline void |
54 | | | 56 | fetch_pixel_no_alpha_float (bits_image_t *image, |
55 | static force_inline uint32_t | | 57 | int x, int y, pixman_bool_t check_bounds, |
56 | fetch_pixel_no_alpha (bits_image_t *image, | | 58 | void *out) |
57 | int x, int y, pixman_bool_t check_bounds) | | | |
58 | { | | 59 | { |
| | | 60 | argb_t *ret = out; |
| | | 61 | |
59 | if (check_bounds && | | 62 | if (check_bounds && |
60 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) | | 63 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) |
61 | { | | 64 | ret->a = ret->r = ret->g = ret->b = 0.f; |
62 | return 0; | | 65 | else |
63 | } | | 66 | *ret = image->fetch_pixel_float (image, x, y); |
64 | | | | |
65 | return image->fetch_pixel_32 (image, x, y); | | | |
66 | } | | 67 | } |
67 | | | 68 | |
68 | typedef uint32_t (* get_pixel_t) (bits_image_t *image, | | 69 | typedef void (* get_pixel_t) (bits_image_t *image, |
69 | int x, int y, pixman_bool_t check_bounds); | | 70 | int x, int y, pixman_bool_t check_bounds, void *out); |
70 | | | 71 | |
71 | static force_inline uint32_t | | 72 | static force_inline void |
72 | bits_image_fetch_pixel_nearest (bits_image_t *image, | | 73 | bits_image_fetch_pixel_nearest (bits_image_t *image, |
73 | pixman_fixed_t x, | | 74 | pixman_fixed_t x, |
74 | pixman_fixed_t y, | | 75 | pixman_fixed_t y, |
75 | get_pixel_t get_pixel) | | 76 | get_pixel_t get_pixel, |
| | | 77 | void *out) |
76 | { | | 78 | { |
77 | int x0 = pixman_fixed_to_int (x - pixman_fixed_e); | | 79 | int x0 = pixman_fixed_to_int (x - pixman_fixed_e); |
78 | int y0 = pixman_fixed_to_int (y - pixman_fixed_e); | | 80 | int y0 = pixman_fixed_to_int (y - pixman_fixed_e); |
79 | | | 81 | |
80 | if (image->common.repeat != PIXMAN_REPEAT_NONE) | | 82 | if (image->common.repeat != PIXMAN_REPEAT_NONE) |
81 | { | | 83 | { |
82 | repeat (image->common.repeat, &x0, image->width); | | 84 | repeat (image->common.repeat, &x0, image->width); |
83 | repeat (image->common.repeat, &y0, image->height); | | 85 | repeat (image->common.repeat, &y0, image->height); |
84 | | | 86 | |
85 | return get_pixel (image, x0, y0, FALSE); | | 87 | get_pixel (image, x0, y0, FALSE, out); |
86 | } | | 88 | } |
87 | else | | 89 | else |
88 | { | | 90 | { |
89 | return get_pixel (image, x0, y0, TRUE); | | 91 | get_pixel (image, x0, y0, TRUE, out); |
90 | } | | 92 | } |
91 | } | | 93 | } |
92 | | | 94 | |
93 | static force_inline uint32_t | | 95 | static force_inline void |
94 | bits_image_fetch_pixel_bilinear (bits_image_t *image, | | 96 | bits_image_fetch_pixel_bilinear_32 (bits_image_t *image, |
95 | pixman_fixed_t x, | | 97 | pixman_fixed_t x, |
96 | pixman_fixed_t y, | | 98 | pixman_fixed_t y, |
97 | get_pixel_t get_pixel) | | 99 | get_pixel_t get_pixel, |
| | | 100 | void *out) |
98 | { | | 101 | { |
99 | pixman_repeat_t repeat_mode = image->common.repeat; | | 102 | pixman_repeat_t repeat_mode = image->common.repeat; |
100 | int width = image->width; | | 103 | int width = image->width; |
101 | int height = image->height; | | 104 | int height = image->height; |
102 | int x1, y1, x2, y2; | | 105 | int x1, y1, x2, y2; |
103 | uint32_t tl, tr, bl, br; | | 106 | uint32_t tl, tr, bl, br; |
104 | int32_t distx, disty; | | 107 | int32_t distx, disty; |
| | | 108 | uint32_t *ret = out; |
105 | | | 109 | |
106 | x1 = x - pixman_fixed_1 / 2; | | 110 | x1 = x - pixman_fixed_1 / 2; |
107 | y1 = y - pixman_fixed_1 / 2; | | 111 | y1 = y - pixman_fixed_1 / 2; |
108 | | | 112 | |
109 | distx = pixman_fixed_to_bilinear_weight (x1); | | 113 | distx = pixman_fixed_to_bilinear_weight (x1); |
110 | disty = pixman_fixed_to_bilinear_weight (y1); | | 114 | disty = pixman_fixed_to_bilinear_weight (y1); |
111 | | | 115 | |
112 | x1 = pixman_fixed_to_int (x1); | | 116 | x1 = pixman_fixed_to_int (x1); |
113 | y1 = pixman_fixed_to_int (y1); | | 117 | y1 = pixman_fixed_to_int (y1); |
114 | x2 = x1 + 1; | | 118 | x2 = x1 + 1; |
115 | y2 = y1 + 1; | | 119 | y2 = y1 + 1; |
116 | | | 120 | |
117 | if (repeat_mode != PIXMAN_REPEAT_NONE) | | 121 | if (repeat_mode != PIXMAN_REPEAT_NONE) |
118 | { | | 122 | { |
119 | repeat (repeat_mode, &x1, width); | | 123 | repeat (repeat_mode, &x1, width); |
120 | repeat (repeat_mode, &y1, height); | | 124 | repeat (repeat_mode, &y1, height); |
121 | repeat (repeat_mode, &x2, width); | | 125 | repeat (repeat_mode, &x2, width); |
122 | repeat (repeat_mode, &y2, height); | | 126 | repeat (repeat_mode, &y2, height); |
123 | | | 127 | |
124 | tl = get_pixel (image, x1, y1, FALSE); | | 128 | get_pixel (image, x1, y1, FALSE, &tl); |
125 | bl = get_pixel (image, x1, y2, FALSE); | | 129 | get_pixel (image, x2, y1, FALSE, &tr); |
126 | tr = get_pixel (image, x2, y1, FALSE); | | 130 | get_pixel (image, x1, y2, FALSE, &bl); |
127 | br = get_pixel (image, x2, y2, FALSE); | | 131 | get_pixel (image, x2, y2, FALSE, &br); |
128 | } | | 132 | } |
129 | else | | 133 | else |
130 | { | | 134 | { |
131 | tl = get_pixel (image, x1, y1, TRUE); | | 135 | get_pixel (image, x1, y1, TRUE, &tl); |
132 | tr = get_pixel (image, x2, y1, TRUE); | | 136 | get_pixel (image, x2, y1, TRUE, &tr); |
133 | bl = get_pixel (image, x1, y2, TRUE); | | 137 | get_pixel (image, x1, y2, TRUE, &bl); |
134 | br = get_pixel (image, x2, y2, TRUE); | | 138 | get_pixel (image, x2, y2, TRUE, &br); |
135 | } | | 139 | } |
136 | | | 140 | |
137 | return bilinear_interpolation (tl, tr, bl, br, distx, disty); | | 141 | *ret = bilinear_interpolation (tl, tr, bl, br, distx, disty); |
138 | } | | 142 | } |
139 | | | 143 | |
140 | static force_inline uint32_t | | 144 | static force_inline void |
| | | 145 | bits_image_fetch_pixel_bilinear_float (bits_image_t *image, |
| | | 146 | pixman_fixed_t x, |
| | | 147 | pixman_fixed_t y, |
| | | 148 | get_pixel_t get_pixel, |
| | | 149 | void *out) |
| | | 150 | { |
| | | 151 | pixman_repeat_t repeat_mode = image->common.repeat; |
| | | 152 | int width = image->width; |
| | | 153 | int height = image->height; |
| | | 154 | int x1, y1, x2, y2; |
| | | 155 | argb_t tl, tr, bl, br; |
| | | 156 | float distx, disty; |
| | | 157 | argb_t *ret = out; |
| | | 158 | |
| | | 159 | x1 = x - pixman_fixed_1 / 2; |
| | | 160 | y1 = y - pixman_fixed_1 / 2; |
| | | 161 | |
| | | 162 | distx = ((float)pixman_fixed_fraction(x1)) / 65536.f; |
| | | 163 | disty = ((float)pixman_fixed_fraction(y1)) / 65536.f; |
| | | 164 | |
| | | 165 | x1 = pixman_fixed_to_int (x1); |
| | | 166 | y1 = pixman_fixed_to_int (y1); |
| | | 167 | x2 = x1 + 1; |
| | | 168 | y2 = y1 + 1; |
| | | 169 | |
| | | 170 | if (repeat_mode != PIXMAN_REPEAT_NONE) |
| | | 171 | { |
| | | 172 | repeat (repeat_mode, &x1, width); |
| | | 173 | repeat (repeat_mode, &y1, height); |
| | | 174 | repeat (repeat_mode, &x2, width); |
| | | 175 | repeat (repeat_mode, &y2, height); |
| | | 176 | |
| | | 177 | get_pixel (image, x1, y1, FALSE, &tl); |
| | | 178 | get_pixel (image, x2, y1, FALSE, &tr); |
| | | 179 | get_pixel (image, x1, y2, FALSE, &bl); |
| | | 180 | get_pixel (image, x2, y2, FALSE, &br); |
| | | 181 | } |
| | | 182 | else |
| | | 183 | { |
| | | 184 | get_pixel (image, x1, y1, TRUE, &tl); |
| | | 185 | get_pixel (image, x2, y1, TRUE, &tr); |
| | | 186 | get_pixel (image, x1, y2, TRUE, &bl); |
| | | 187 | get_pixel (image, x2, y2, TRUE, &br); |
| | | 188 | } |
| | | 189 | |
| | | 190 | *ret = bilinear_interpolation_float (tl, tr, bl, br, distx, disty); |
| | | 191 | } |
| | | 192 | |
| | | 193 | static force_inline void accum_32(int *satot, int *srtot, |
| | | 194 | int *sgtot, int *sbtot, |
| | | 195 | const void *p, pixman_fixed_t f) |
| | | 196 | { |
| | | 197 | uint32_t pixel = *(uint32_t *)p; |
| | | 198 | |
| | | 199 | *srtot += (int)RED_8 (pixel) * f; |
| | | 200 | *sgtot += (int)GREEN_8 (pixel) * f; |
| | | 201 | *sbtot += (int)BLUE_8 (pixel) * f; |
| | | 202 | *satot += (int)ALPHA_8 (pixel) * f; |
| | | 203 | } |
| | | 204 | |
| | | 205 | static force_inline void reduce_32(int satot, int srtot, |
| | | 206 | int sgtot, int sbtot, void *p) |
| | | 207 | { |
| | | 208 | uint32_t *ret = p; |
| | | 209 | |
| | | 210 | satot = (satot + 0x8000) >> 16; |
| | | 211 | srtot = (srtot + 0x8000) >> 16; |
| | | 212 | sgtot = (sgtot + 0x8000) >> 16; |
| | | 213 | sbtot = (sbtot + 0x8000) >> 16; |
| | | 214 | |
| | | 215 | satot = CLIP (satot, 0, 0xff); |
| | | 216 | srtot = CLIP (srtot, 0, 0xff); |
| | | 217 | sgtot = CLIP (sgtot, 0, 0xff); |
| | | 218 | sbtot = CLIP (sbtot, 0, 0xff); |
| | | 219 | |
| | | 220 | *ret = ((satot << 24) | (srtot << 16) | (sgtot << 8) | (sbtot)); |
| | | 221 | } |
| | | 222 | |
| | | 223 | static force_inline void accum_float(int *satot, int *srtot, |
| | | 224 | int *sgtot, int *sbtot, |
| | | 225 | const void *p, pixman_fixed_t f) |
| | | 226 | { |
| | | 227 | const argb_t *pixel = p; |
| | | 228 | |
| | | 229 | *satot += pixel->a * f; |
| | | 230 | *srtot += pixel->r * f; |
| | | 231 | *sgtot += pixel->g * f; |
| | | 232 | *sbtot += pixel->b * f; |
| | | 233 | } |
| | | 234 | |
| | | 235 | static force_inline void reduce_float(int satot, int srtot, |
| | | 236 | int sgtot, int sbtot, |
| | | 237 | void *p) |
| | | 238 | { |
| | | 239 | argb_t *ret = p; |
| | | 240 | |
| | | 241 | ret->a = CLIP (satot / 65536.f, 0.f, 1.f); |
| | | 242 | ret->r = CLIP (srtot / 65536.f, 0.f, 1.f); |
| | | 243 | ret->g = CLIP (sgtot / 65536.f, 0.f, 1.f); |
| | | 244 | ret->b = CLIP (sbtot / 65536.f, 0.f, 1.f); |
| | | 245 | } |
| | | 246 | |
| | | 247 | typedef void (* accumulate_pixel_t) (int *satot, int *srtot, |
| | | 248 | int *sgtot, int *sbtot, |
| | | 249 | const void *pixel, pixman_fixed_t f); |
| | | 250 | |
| | | 251 | typedef void (* reduce_pixel_t) (int satot, int srtot, |
| | | 252 | int sgtot, int sbtot, void *out); |
| | | 253 | |
| | | 254 | static force_inline void |
141 | bits_image_fetch_pixel_convolution (bits_image_t *image, | | 255 | bits_image_fetch_pixel_convolution (bits_image_t *image, |
142 | pixman_fixed_t x, | | 256 | pixman_fixed_t x, |
143 | pixman_fixed_t y, | | 257 | pixman_fixed_t y, |
144 | get_pixel_t get_pixel) | | 258 | get_pixel_t get_pixel, |
| | | 259 | void *out, |
| | | 260 | accumulate_pixel_t accum, |
| | | 261 | reduce_pixel_t reduce) |
145 | { | | 262 | { |
146 | pixman_fixed_t *params = image->common.filter_params; | | 263 | pixman_fixed_t *params = image->common.filter_params; |
147 | int x_off = (params[0] - pixman_fixed_1) >> 1; | | 264 | int x_off = (params[0] - pixman_fixed_1) >> 1; |
148 | int y_off = (params[1] - pixman_fixed_1) >> 1; | | 265 | int y_off = (params[1] - pixman_fixed_1) >> 1; |
149 | int32_t cwidth = pixman_fixed_to_int (params[0]); | | 266 | int32_t cwidth = pixman_fixed_to_int (params[0]); |
150 | int32_t cheight = pixman_fixed_to_int (params[1]); | | 267 | int32_t cheight = pixman_fixed_to_int (params[1]); |
151 | int32_t i, j, x1, x2, y1, y2; | | 268 | int32_t i, j, x1, x2, y1, y2; |
152 | pixman_repeat_t repeat_mode = image->common.repeat; | | 269 | pixman_repeat_t repeat_mode = image->common.repeat; |
153 | int width = image->width; | | 270 | int width = image->width; |
154 | int height = image->height; | | 271 | int height = image->height; |
155 | int srtot, sgtot, sbtot, satot; | | 272 | int srtot, sgtot, sbtot, satot; |
156 | | | 273 | |
157 | params += 2; | | 274 | params += 2; |
| @@ -164,68 +281,59 @@ bits_image_fetch_pixel_convolution (bits | | | @@ -164,68 +281,59 @@ bits_image_fetch_pixel_convolution (bits |
164 | srtot = sgtot = sbtot = satot = 0; | | 281 | srtot = sgtot = sbtot = satot = 0; |
165 | | | 282 | |
166 | for (i = y1; i < y2; ++i) | | 283 | for (i = y1; i < y2; ++i) |
167 | { | | 284 | { |
168 | for (j = x1; j < x2; ++j) | | 285 | for (j = x1; j < x2; ++j) |
169 | { | | 286 | { |
170 | int rx = j; | | 287 | int rx = j; |
171 | int ry = i; | | 288 | int ry = i; |
172 | | | 289 | |
173 | pixman_fixed_t f = *params; | | 290 | pixman_fixed_t f = *params; |
174 | | | 291 | |
175 | if (f) | | 292 | if (f) |
176 | { | | 293 | { |
177 | uint32_t pixel; | | 294 | /* Must be big enough to hold a argb_t */ |
| | | 295 | argb_t pixel; |
178 | | | 296 | |
179 | if (repeat_mode != PIXMAN_REPEAT_NONE) | | 297 | if (repeat_mode != PIXMAN_REPEAT_NONE) |
180 | { | | 298 | { |
181 | repeat (repeat_mode, &rx, width); | | 299 | repeat (repeat_mode, &rx, width); |
182 | repeat (repeat_mode, &ry, height); | | 300 | repeat (repeat_mode, &ry, height); |
183 | | | 301 | |
184 | pixel = get_pixel (image, rx, ry, FALSE); | | 302 | get_pixel (image, rx, ry, FALSE, &pixel); |
185 | } | | 303 | } |
186 | else | | 304 | else |
187 | { | | 305 | { |
188 | pixel = get_pixel (image, rx, ry, TRUE); | | 306 | get_pixel (image, rx, ry, TRUE, &pixel); |
189 | } | | 307 | } |
190 | | | 308 | |
191 | srtot += (int)RED_8 (pixel) * f; | | 309 | accum (&satot, &srtot, &sgtot, &sbtot, &pixel, f); |
192 | sgtot += (int)GREEN_8 (pixel) * f; | | | |
193 | sbtot += (int)BLUE_8 (pixel) * f; | | | |
194 | satot += (int)ALPHA_8 (pixel) * f; | | | |
195 | } | | 310 | } |
196 | | | 311 | |
197 | params++; | | 312 | params++; |
198 | } | | 313 | } |
199 | } | | 314 | } |
200 | | | 315 | |
201 | satot = (satot + 0x8000) >> 16; | | 316 | reduce (satot, srtot, sgtot, sbtot, out); |
202 | srtot = (srtot + 0x8000) >> 16; | | | |
203 | sgtot = (sgtot + 0x8000) >> 16; | | | |
204 | sbtot = (sbtot + 0x8000) >> 16; | | | |
205 | | | | |
206 | satot = CLIP (satot, 0, 0xff); | | | |
207 | srtot = CLIP (srtot, 0, 0xff); | | | |
208 | sgtot = CLIP (sgtot, 0, 0xff); | | | |
209 | sbtot = CLIP (sbtot, 0, 0xff); | | | |
210 | | | | |
211 | return ((satot << 24) | (srtot << 16) | (sgtot << 8) | (sbtot)); | | | |
212 | } | | 317 | } |
213 | | | 318 | |
214 | static uint32_t | | 319 | static void |
215 | bits_image_fetch_pixel_separable_convolution (bits_image_t *image, | | 320 | bits_image_fetch_pixel_separable_convolution (bits_image_t *image, |
216 | pixman_fixed_t x, | | 321 | pixman_fixed_t x, |
217 | pixman_fixed_t y, | | 322 | pixman_fixed_t y, |
218 | get_pixel_t get_pixel) | | 323 | get_pixel_t get_pixel, |
| | | 324 | void *out, |
| | | 325 | accumulate_pixel_t accum, |
| | | 326 | reduce_pixel_t reduce) |
219 | { | | 327 | { |
220 | pixman_fixed_t *params = image->common.filter_params; | | 328 | pixman_fixed_t *params = image->common.filter_params; |
221 | pixman_repeat_t repeat_mode = image->common.repeat; | | 329 | pixman_repeat_t repeat_mode = image->common.repeat; |
222 | int width = image->width; | | 330 | int width = image->width; |
223 | int height = image->height; | | 331 | int height = image->height; |
224 | int cwidth = pixman_fixed_to_int (params[0]); | | 332 | int cwidth = pixman_fixed_to_int (params[0]); |
225 | int cheight = pixman_fixed_to_int (params[1]); | | 333 | int cheight = pixman_fixed_to_int (params[1]); |
226 | int x_phase_bits = pixman_fixed_to_int (params[2]); | | 334 | int x_phase_bits = pixman_fixed_to_int (params[2]); |
227 | int y_phase_bits = pixman_fixed_to_int (params[3]); | | 335 | int y_phase_bits = pixman_fixed_to_int (params[3]); |
228 | int x_phase_shift = 16 - x_phase_bits; | | 336 | int x_phase_shift = 16 - x_phase_bits; |
229 | int y_phase_shift = 16 - y_phase_bits; | | 337 | int y_phase_shift = 16 - y_phase_bits; |
230 | int x_off = ((cwidth << 16) - pixman_fixed_1) >> 1; | | 338 | int x_off = ((cwidth << 16) - pixman_fixed_1) >> 1; |
231 | int y_off = ((cheight << 16) - pixman_fixed_1) >> 1; | | 339 | int y_off = ((cheight << 16) - pixman_fixed_1) >> 1; |
| @@ -260,113 +368,124 @@ bits_image_fetch_pixel_separable_convolu | | | @@ -260,113 +368,124 @@ bits_image_fetch_pixel_separable_convolu |
260 | pixman_fixed_48_16_t fy = *y_params++; | | 368 | pixman_fixed_48_16_t fy = *y_params++; |
261 | pixman_fixed_t *x_params = params + 4 + px * cwidth; | | 369 | pixman_fixed_t *x_params = params + 4 + px * cwidth; |
262 | | | 370 | |
263 | if (fy) | | 371 | if (fy) |
264 | { | | 372 | { |
265 | for (j = x1; j < x2; ++j) | | 373 | for (j = x1; j < x2; ++j) |
266 | { | | 374 | { |
267 | pixman_fixed_t fx = *x_params++; | | 375 | pixman_fixed_t fx = *x_params++; |
268 | int rx = j; | | 376 | int rx = j; |
269 | int ry = i; | | 377 | int ry = i; |
270 | | | 378 | |
271 | if (fx) | | 379 | if (fx) |
272 | { | | 380 | { |
| | | 381 | /* Must be big enough to hold a argb_t */ |
| | | 382 | argb_t pixel; |
273 | pixman_fixed_t f; | | 383 | pixman_fixed_t f; |
274 | uint32_t pixel; | | | |
275 | | | 384 | |
276 | if (repeat_mode != PIXMAN_REPEAT_NONE) | | 385 | if (repeat_mode != PIXMAN_REPEAT_NONE) |
277 | { | | 386 | { |
278 | repeat (repeat_mode, &rx, width); | | 387 | repeat (repeat_mode, &rx, width); |
279 | repeat (repeat_mode, &ry, height); | | 388 | repeat (repeat_mode, &ry, height); |
280 | | | 389 | |
281 | pixel = get_pixel (image, rx, ry, FALSE); | | 390 | get_pixel (image, rx, ry, FALSE, &pixel); |
282 | } | | 391 | } |
283 | else | | 392 | else |
284 | { | | 393 | { |
285 | pixel = get_pixel (image, rx, ry, TRUE); | | 394 | get_pixel (image, rx, ry, TRUE, &pixel); |
286 | } | | 395 | } |
287 | | | 396 | |
288 | f = (fy * fx + 0x8000) >> 16; | | 397 | f = (fy * fx + 0x8000) >> 16; |
289 | | | 398 | |
290 | srtot += (int)RED_8 (pixel) * f; | | 399 | accum(&satot, &srtot, &sgtot, &sbtot, &pixel, f); |
291 | sgtot += (int)GREEN_8 (pixel) * f; | | | |
292 | sbtot += (int)BLUE_8 (pixel) * f; | | | |
293 | satot += (int)ALPHA_8 (pixel) * f; | | | |
294 | } | | 400 | } |
295 | } | | 401 | } |
296 | } | | 402 | } |
297 | } | | 403 | } |
298 | | | 404 | |
299 | satot = (satot + 0x8000) >> 16; | | | |
300 | srtot = (srtot + 0x8000) >> 16; | | | |
301 | sgtot = (sgtot + 0x8000) >> 16; | | | |
302 | sbtot = (sbtot + 0x8000) >> 16; | | | |
303 | | | 405 | |
304 | satot = CLIP (satot, 0, 0xff); | | 406 | reduce(satot, srtot, sgtot, sbtot, out); |
305 | srtot = CLIP (srtot, 0, 0xff); | | | |
306 | sgtot = CLIP (sgtot, 0, 0xff); | | | |
307 | sbtot = CLIP (sbtot, 0, 0xff); | | | |
308 | | | | |
309 | return ((satot << 24) | (srtot << 16) | (sgtot << 8) | (sbtot)); | | | |
310 | } | | 407 | } |
311 | | | 408 | |
312 | static force_inline uint32_t | | 409 | static force_inline void |
313 | bits_image_fetch_pixel_filtered (bits_image_t *image, | | 410 | bits_image_fetch_pixel_filtered (bits_image_t *image, |
| | | 411 | pixman_bool_t wide, |
314 | pixman_fixed_t x, | | 412 | pixman_fixed_t x, |
315 | pixman_fixed_t y, | | 413 | pixman_fixed_t y, |
316 | get_pixel_t get_pixel) | | 414 | get_pixel_t get_pixel, |
| | | 415 | void *out) |
317 | { | | 416 | { |
318 | switch (image->common.filter) | | 417 | switch (image->common.filter) |
319 | { | | 418 | { |
320 | case PIXMAN_FILTER_NEAREST: | | 419 | case PIXMAN_FILTER_NEAREST: |
321 | case PIXMAN_FILTER_FAST: | | 420 | case PIXMAN_FILTER_FAST: |
322 | return bits_image_fetch_pixel_nearest (image, x, y, get_pixel); | | 421 | bits_image_fetch_pixel_nearest (image, x, y, get_pixel, out); |
323 | break; | | 422 | break; |
324 | | | 423 | |
325 | case PIXMAN_FILTER_BILINEAR: | | 424 | case PIXMAN_FILTER_BILINEAR: |
326 | case PIXMAN_FILTER_GOOD: | | 425 | case PIXMAN_FILTER_GOOD: |
327 | case PIXMAN_FILTER_BEST: | | 426 | case PIXMAN_FILTER_BEST: |
328 | return bits_image_fetch_pixel_bilinear (image, x, y, get_pixel); | | 427 | if (wide) |
| | | 428 | bits_image_fetch_pixel_bilinear_float (image, x, y, get_pixel, out); |
| | | 429 | else |
| | | 430 | bits_image_fetch_pixel_bilinear_32 (image, x, y, get_pixel, out); |
329 | break; | | 431 | break; |
330 | | | 432 | |
331 | case PIXMAN_FILTER_CONVOLUTION: | | 433 | case PIXMAN_FILTER_CONVOLUTION: |
332 | return bits_image_fetch_pixel_convolution (image, x, y, get_pixel); | | 434 | if (wide) |
| | | 435 | bits_image_fetch_pixel_convolution (image, x, y, |
| | | 436 | get_pixel, out, |
| | | 437 | accum_float, |
| | | 438 | reduce_float); |
| | | 439 | else |
| | | 440 | bits_image_fetch_pixel_convolution (image, x, y, |
| | | 441 | get_pixel, out, |
| | | 442 | accum_32, reduce_32); |
333 | break; | | 443 | break; |
334 | | | 444 | |
335 | case PIXMAN_FILTER_SEPARABLE_CONVOLUTION: | | 445 | case PIXMAN_FILTER_SEPARABLE_CONVOLUTION: |
336 | return bits_image_fetch_pixel_separable_convolution (image, x, y, get_pixel); | | 446 | if (wide) |
| | | 447 | bits_image_fetch_pixel_separable_convolution (image, x, y, |
| | | 448 | get_pixel, out, |
| | | 449 | accum_float, |
| | | 450 | reduce_float); |
| | | 451 | else |
| | | 452 | bits_image_fetch_pixel_separable_convolution (image, x, y, |
| | | 453 | get_pixel, out, |
| | | 454 | accum_32, reduce_32); |
337 | break; | | 455 | break; |
338 | | | 456 | |
339 | default: | | 457 | default: |
340 | break; | | 458 | break; |
341 | } | | 459 | } |
342 | | | | |
343 | return 0; | | | |
344 | } | | 460 | } |
345 | | | 461 | |
346 | static uint32_t * | | 462 | static uint32_t * |
347 | bits_image_fetch_affine_no_alpha (pixman_iter_t * iter, | | 463 | __bits_image_fetch_affine_no_alpha (pixman_iter_t * iter, |
348 | const uint32_t * mask) | | 464 | pixman_bool_t wide, |
| | | 465 | const uint32_t * mask) |
349 | { | | 466 | { |
350 | pixman_image_t *image = iter->image; | | 467 | pixman_image_t *image = iter->image; |
351 | int offset = iter->x; | | 468 | int offset = iter->x; |
352 | int line = iter->y++; | | 469 | int line = iter->y++; |
353 | int width = iter->width; | | 470 | int width = iter->width; |
354 | uint32_t * buffer = iter->buffer; | | 471 | uint32_t * buffer = iter->buffer; |
355 | | | 472 | |
356 | pixman_fixed_t x, y; | | 473 | pixman_fixed_t x, y; |
357 | pixman_fixed_t ux, uy; | | 474 | pixman_fixed_t ux, uy; |
358 | pixman_vector_t v; | | 475 | pixman_vector_t v; |
359 | int i; | | 476 | int i; |
| | | 477 | get_pixel_t get_pixel = |
| | | 478 | wide ? fetch_pixel_no_alpha_float : fetch_pixel_no_alpha_32; |
360 | | | 479 | |
361 | /* reference point is the center of the pixel */ | | 480 | /* reference point is the center of the pixel */ |
362 | v.vector[0] = pixman_int_to_fixed (offset) + pixman_fixed_1 / 2; | | 481 | v.vector[0] = pixman_int_to_fixed (offset) + pixman_fixed_1 / 2; |
363 | v.vector[1] = pixman_int_to_fixed (line) + pixman_fixed_1 / 2; | | 482 | v.vector[1] = pixman_int_to_fixed (line) + pixman_fixed_1 / 2; |
364 | v.vector[2] = pixman_fixed_1; | | 483 | v.vector[2] = pixman_fixed_1; |
365 | | | 484 | |
366 | if (image->common.transform) | | 485 | if (image->common.transform) |
367 | { | | 486 | { |
368 | if (!pixman_transform_point_3d (image->common.transform, &v)) | | 487 | if (!pixman_transform_point_3d (image->common.transform, &v)) |
369 | return iter->buffer; | | 488 | return iter->buffer; |
370 | | | 489 | |
371 | ux = image->common.transform->matrix[0][0]; | | 490 | ux = image->common.transform->matrix[0][0]; |
372 | uy = image->common.transform->matrix[1][0]; | | 491 | uy = image->common.transform->matrix[1][0]; |
| @@ -374,47 +493,65 @@ bits_image_fetch_affine_no_alpha (pixman | | | @@ -374,47 +493,65 @@ bits_image_fetch_affine_no_alpha (pixman |
374 | else | | 493 | else |
375 | { | | 494 | { |
376 | ux = pixman_fixed_1; | | 495 | ux = pixman_fixed_1; |
377 | uy = 0; | | 496 | uy = 0; |
378 | } | | 497 | } |
379 | | | 498 | |
380 | x = v.vector[0]; | | 499 | x = v.vector[0]; |
381 | y = v.vector[1]; | | 500 | y = v.vector[1]; |
382 | | | 501 | |
383 | for (i = 0; i < width; ++i) | | 502 | for (i = 0; i < width; ++i) |
384 | { | | 503 | { |
385 | if (!mask || mask[i]) | | 504 | if (!mask || mask[i]) |
386 | { | | 505 | { |
387 | buffer[i] = bits_image_fetch_pixel_filtered ( | | 506 | bits_image_fetch_pixel_filtered ( |
388 | &image->bits, x, y, fetch_pixel_no_alpha); | | 507 | &image->bits, wide, x, y, get_pixel, buffer); |
389 | } | | 508 | } |
390 | | | 509 | |
391 | x += ux; | | 510 | x += ux; |
392 | y += uy; | | 511 | y += uy; |
| | | 512 | buffer += wide ? 4 : 1; |
393 | } | | 513 | } |
394 | | | 514 | |
395 | return buffer; | | 515 | return iter->buffer; |
| | | 516 | } |
| | | 517 | |
| | | 518 | static uint32_t * |
| | | 519 | bits_image_fetch_affine_no_alpha_32 (pixman_iter_t *iter, |
| | | 520 | const uint32_t *mask) |
| | | 521 | { |
| | | 522 | return __bits_image_fetch_affine_no_alpha(iter, FALSE, mask); |
| | | 523 | } |
| | | 524 | |
| | | 525 | static uint32_t * |
| | | 526 | bits_image_fetch_affine_no_alpha_float (pixman_iter_t *iter, |
| | | 527 | const uint32_t *mask) |
| | | 528 | { |
| | | 529 | return __bits_image_fetch_affine_no_alpha(iter, TRUE, mask); |
396 | } | | 530 | } |
397 | | | 531 | |
398 | /* General fetcher */ | | 532 | /* General fetcher */ |
399 | static force_inline uint32_t | | 533 | static force_inline void |
400 | fetch_pixel_general (bits_image_t *image, int x, int y, pixman_bool_t check_bounds) | | 534 | fetch_pixel_general_32 (bits_image_t *image, |
| | | 535 | int x, int y, pixman_bool_t check_bounds, |
| | | 536 | void *out) |
401 | { | | 537 | { |
402 | uint32_t pixel; | | 538 | uint32_t pixel, *ret = out; |
403 | | | 539 | |
404 | if (check_bounds && | | 540 | if (check_bounds && |
405 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) | | 541 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) |
406 | { | | 542 | { |
407 | return 0; | | 543 | *ret = 0; |
| | | 544 | return; |
408 | } | | 545 | } |
409 | | | 546 | |
410 | pixel = image->fetch_pixel_32 (image, x, y); | | 547 | pixel = image->fetch_pixel_32 (image, x, y); |
411 | | | 548 | |
412 | if (image->common.alpha_map) | | 549 | if (image->common.alpha_map) |
413 | { | | 550 | { |
414 | uint32_t pixel_a; | | 551 | uint32_t pixel_a; |
415 | | | 552 | |
416 | x -= image->common.alpha_origin_x; | | 553 | x -= image->common.alpha_origin_x; |
417 | y -= image->common.alpha_origin_y; | | 554 | y -= image->common.alpha_origin_y; |
418 | | | 555 | |
419 | if (x < 0 || x >= image->common.alpha_map->width || | | 556 | if (x < 0 || x >= image->common.alpha_map->width || |
420 | y < 0 || y >= image->common.alpha_map->height) | | 557 | y < 0 || y >= image->common.alpha_map->height) |
| @@ -423,38 +560,79 @@ fetch_pixel_general (bits_image_t *image | | | @@ -423,38 +560,79 @@ fetch_pixel_general (bits_image_t *image |
423 | } | | 560 | } |
424 | else | | 561 | else |
425 | { | | 562 | { |
426 | pixel_a = image->common.alpha_map->fetch_pixel_32 ( | | 563 | pixel_a = image->common.alpha_map->fetch_pixel_32 ( |
427 | image->common.alpha_map, x, y); | | 564 | image->common.alpha_map, x, y); |
428 | | | 565 | |
429 | pixel_a = ALPHA_8 (pixel_a); | | 566 | pixel_a = ALPHA_8 (pixel_a); |
430 | } | | 567 | } |
431 | | | 568 | |
432 | pixel &= 0x00ffffff; | | 569 | pixel &= 0x00ffffff; |
433 | pixel |= (pixel_a << 24); | | 570 | pixel |= (pixel_a << 24); |
434 | } | | 571 | } |
435 | | | 572 | |
436 | return pixel; | | 573 | *ret = pixel; |
| | | 574 | } |
| | | 575 | |
| | | 576 | static force_inline void |
| | | 577 | fetch_pixel_general_float (bits_image_t *image, |
| | | 578 | int x, int y, pixman_bool_t check_bounds, |
| | | 579 | void *out) |
| | | 580 | { |
| | | 581 | argb_t *ret = out; |
| | | 582 | |
| | | 583 | if (check_bounds && |
| | | 584 | (x < 0 || x >= image->width || y < 0 || y >= image->height)) |
| | | 585 | { |
| | | 586 | ret->a = ret->r = ret->g = ret->b = 0; |
| | | 587 | return; |
| | | 588 | } |
| | | 589 | |
| | | 590 | *ret = image->fetch_pixel_float (image, x, y); |
| | | 591 | |
| | | 592 | if (image->common.alpha_map) |
| | | 593 | { |
| | | 594 | x -= image->common.alpha_origin_x; |
| | | 595 | y -= image->common.alpha_origin_y; |
| | | 596 | |
| | | 597 | if (x < 0 || x >= image->common.alpha_map->width || |
| | | 598 | y < 0 || y >= image->common.alpha_map->height) |
| | | 599 | { |
| | | 600 | ret->a = 0.f; |
| | | 601 | } |
| | | 602 | else |
| | | 603 | { |
| | | 604 | argb_t alpha; |
| | | 605 | |
| | | 606 | alpha = image->common.alpha_map->fetch_pixel_float ( |
| | | 607 | image->common.alpha_map, x, y); |
| | | 608 | |
| | | 609 | ret->a = alpha.a; |
| | | 610 | } |
| | | 611 | } |
437 | } | | 612 | } |
438 | | | 613 | |
439 | static uint32_t * | | 614 | static uint32_t * |
440 | bits_image_fetch_general (pixman_iter_t *iter, | | 615 | __bits_image_fetch_general (pixman_iter_t *iter, |
441 | const uint32_t *mask) | | 616 | pixman_bool_t wide, |
| | | 617 | const uint32_t *mask) |
442 | { | | 618 | { |
443 | pixman_image_t *image = iter->image; | | 619 | pixman_image_t *image = iter->image; |
444 | int offset = iter->x; | | 620 | int offset = iter->x; |
445 | int line = iter->y++; | | 621 | int line = iter->y++; |
446 | int width = iter->width; | | 622 | int width = iter->width; |
447 | uint32_t * buffer = iter->buffer; | | 623 | uint32_t * buffer = iter->buffer; |
| | | 624 | get_pixel_t get_pixel = |
| | | 625 | wide ? fetch_pixel_general_float : fetch_pixel_general_32; |
448 | | | 626 | |
449 | pixman_fixed_t x, y, w; | | 627 | pixman_fixed_t x, y, w; |
450 | pixman_fixed_t ux, uy, uw; | | 628 | pixman_fixed_t ux, uy, uw; |
451 | pixman_vector_t v; | | 629 | pixman_vector_t v; |
452 | int i; | | 630 | int i; |
453 | | | 631 | |
454 | /* reference point is the center of the pixel */ | | 632 | /* reference point is the center of the pixel */ |
455 | v.vector[0] = pixman_int_to_fixed (offset) + pixman_fixed_1 / 2; | | 633 | v.vector[0] = pixman_int_to_fixed (offset) + pixman_fixed_1 / 2; |
456 | v.vector[1] = pixman_int_to_fixed (line) + pixman_fixed_1 / 2; | | 634 | v.vector[1] = pixman_int_to_fixed (line) + pixman_fixed_1 / 2; |
457 | v.vector[2] = pixman_fixed_1; | | 635 | v.vector[2] = pixman_fixed_1; |
458 | | | 636 | |
459 | if (image->common.transform) | | 637 | if (image->common.transform) |
460 | { | | 638 | { |
| @@ -483,36 +661,51 @@ bits_image_fetch_general (pixman_iter_t | | | @@ -483,36 +661,51 @@ bits_image_fetch_general (pixman_iter_t |
483 | if (!mask || mask[i]) | | 661 | if (!mask || mask[i]) |
484 | { | | 662 | { |
485 | if (w != 0) | | 663 | if (w != 0) |
486 | { | | 664 | { |
487 | x0 = ((pixman_fixed_48_16_t)x << 16) / w; | | 665 | x0 = ((pixman_fixed_48_16_t)x << 16) / w; |
488 | y0 = ((pixman_fixed_48_16_t)y << 16) / w; | | 666 | y0 = ((pixman_fixed_48_16_t)y << 16) / w; |
489 | } | | 667 | } |
490 | else | | 668 | else |
491 | { | | 669 | { |
492 | x0 = 0; | | 670 | x0 = 0; |
493 | y0 = 0; | | 671 | y0 = 0; |
494 | } | | 672 | } |
495 | | | 673 | |
496 | buffer[i] = bits_image_fetch_pixel_filtered ( | | 674 | bits_image_fetch_pixel_filtered ( |
497 | &image->bits, x0, y0, fetch_pixel_general); | | 675 | &image->bits, wide, x0, y0, get_pixel, buffer); |
498 | } | | 676 | } |
499 | | | 677 | |
500 | x += ux; | | 678 | x += ux; |
501 | y += uy; | | 679 | y += uy; |
502 | w += uw; | | 680 | w += uw; |
| | | 681 | buffer += wide ? 4 : 1; |
503 | } | | 682 | } |
504 | | | 683 | |
505 | return buffer; | | 684 | return iter->buffer; |
| | | 685 | } |
| | | 686 | |
| | | 687 | static uint32_t * |
| | | 688 | bits_image_fetch_general_32 (pixman_iter_t *iter, |
| | | 689 | const uint32_t *mask) |
| | | 690 | { |
| | | 691 | return __bits_image_fetch_general(iter, FALSE, mask); |
| | | 692 | } |
| | | 693 | |
| | | 694 | static uint32_t * |
| | | 695 | bits_image_fetch_general_float (pixman_iter_t *iter, |
| | | 696 | const uint32_t *mask) |
| | | 697 | { |
| | | 698 | return __bits_image_fetch_general(iter, TRUE, mask); |
506 | } | | 699 | } |
507 | | | 700 | |
508 | static void | | 701 | static void |
509 | replicate_pixel_32 (bits_image_t * bits, | | 702 | replicate_pixel_32 (bits_image_t * bits, |
510 | int x, | | 703 | int x, |
511 | int y, | | 704 | int y, |
512 | int width, | | 705 | int width, |
513 | uint32_t * buffer) | | 706 | uint32_t * buffer) |
514 | { | | 707 | { |
515 | uint32_t color; | | 708 | uint32_t color; |
516 | uint32_t *end; | | 709 | uint32_t *end; |
517 | | | 710 | |
518 | color = bits->fetch_pixel_32 (bits, x, y); | | 711 | color = bits->fetch_pixel_32 (bits, x, y); |
| @@ -693,35 +886,35 @@ static const fetcher_info_t fetcher_info | | | @@ -693,35 +886,35 @@ static const fetcher_info_t fetcher_info |
693 | { PIXMAN_any, | | 886 | { PIXMAN_any, |
694 | (FAST_PATH_NO_ALPHA_MAP | | | 887 | (FAST_PATH_NO_ALPHA_MAP | |
695 | FAST_PATH_ID_TRANSFORM | | | 888 | FAST_PATH_ID_TRANSFORM | |
696 | FAST_PATH_NO_CONVOLUTION_FILTER | | | 889 | FAST_PATH_NO_CONVOLUTION_FILTER | |
697 | FAST_PATH_NO_PAD_REPEAT | | | 890 | FAST_PATH_NO_PAD_REPEAT | |
698 | FAST_PATH_NO_REFLECT_REPEAT), | | 891 | FAST_PATH_NO_REFLECT_REPEAT), |
699 | bits_image_fetch_untransformed_32, | | 892 | bits_image_fetch_untransformed_32, |
700 | bits_image_fetch_untransformed_float | | 893 | bits_image_fetch_untransformed_float |
701 | }, | | 894 | }, |
702 | | | 895 | |
703 | /* Affine, no alpha */ | | 896 | /* Affine, no alpha */ |
704 | { PIXMAN_any, | | 897 | { PIXMAN_any, |
705 | (FAST_PATH_NO_ALPHA_MAP | FAST_PATH_HAS_TRANSFORM | FAST_PATH_AFFINE_TRANSFORM), | | 898 | (FAST_PATH_NO_ALPHA_MAP | FAST_PATH_HAS_TRANSFORM | FAST_PATH_AFFINE_TRANSFORM), |
706 | bits_image_fetch_affine_no_alpha, | | 899 | bits_image_fetch_affine_no_alpha_32, |
707 | _pixman_image_get_scanline_generic_float | | 900 | bits_image_fetch_affine_no_alpha_float, |
708 | }, | | 901 | }, |
709 | | | 902 | |
710 | /* General */ | | 903 | /* General */ |
711 | { PIXMAN_any, | | 904 | { PIXMAN_any, |
712 | 0, | | 905 | 0, |
713 | bits_image_fetch_general, | | 906 | bits_image_fetch_general_32, |
714 | _pixman_image_get_scanline_generic_float | | 907 | bits_image_fetch_general_float, |
715 | }, | | 908 | }, |
716 | | | 909 | |
717 | { PIXMAN_null }, | | 910 | { PIXMAN_null }, |
718 | }; | | 911 | }; |
719 | | | 912 | |
720 | static void | | 913 | static void |
721 | bits_image_property_changed (pixman_image_t *image) | | 914 | bits_image_property_changed (pixman_image_t *image) |
722 | { | | 915 | { |
723 | _pixman_bits_image_setup_accessors (&image->bits); | | 916 | _pixman_bits_image_setup_accessors (&image->bits); |
724 | } | | 917 | } |
725 | | | 918 | |
726 | void | | 919 | void |
727 | _pixman_bits_image_src_iter_init (pixman_image_t *image, pixman_iter_t *iter) | | 920 | _pixman_bits_image_src_iter_init (pixman_image_t *image, pixman_iter_t *iter) |
| @@ -731,27 +924,26 @@ _pixman_bits_image_src_iter_init (pixman | | | @@ -731,27 +924,26 @@ _pixman_bits_image_src_iter_init (pixman |
731 | const fetcher_info_t *info; | | 924 | const fetcher_info_t *info; |
732 | | | 925 | |
733 | for (info = fetcher_info; info->format != PIXMAN_null; ++info) | | 926 | for (info = fetcher_info; info->format != PIXMAN_null; ++info) |
734 | { | | 927 | { |
735 | if ((info->format == format || info->format == PIXMAN_any) && | | 928 | if ((info->format == format || info->format == PIXMAN_any) && |
736 | (info->flags & flags) == info->flags) | | 929 | (info->flags & flags) == info->flags) |
737 | { | | 930 | { |
738 | if (iter->iter_flags & ITER_NARROW) | | 931 | if (iter->iter_flags & ITER_NARROW) |
739 | { | | 932 | { |
740 | iter->get_scanline = info->get_scanline_32; | | 933 | iter->get_scanline = info->get_scanline_32; |
741 | } | | 934 | } |
742 | else | | 935 | else |
743 | { | | 936 | { |
744 | iter->data = info->get_scanline_32; | | | |
745 | iter->get_scanline = info->get_scanline_float; | | 937 | iter->get_scanline = info->get_scanline_float; |
746 | } | | 938 | } |
747 | return; | | 939 | return; |
748 | } | | 940 | } |
749 | } | | 941 | } |
750 | | | 942 | |
751 | /* Just in case we somehow didn't find a scanline function */ | | 943 | /* Just in case we somehow didn't find a scanline function */ |
752 | iter->get_scanline = _pixman_iter_get_scanline_noop; | | 944 | iter->get_scanline = _pixman_iter_get_scanline_noop; |
753 | } | | 945 | } |
754 | | | 946 | |
755 | static uint32_t * | | 947 | static uint32_t * |
756 | dest_get_scanline_narrow (pixman_iter_t *iter, const uint32_t *mask) | | 948 | dest_get_scanline_narrow (pixman_iter_t *iter, const uint32_t *mask) |
757 | { | | 949 | { |