42
#define rasterizeEdges fbRasterizeEdges4
71
#define RASTERIZE_EDGES rasterize_edges_4
44
#if BITMAP_BIT_ORDER == LSBFirst
45
#define Shift4(o) ((o) << 2)
73
#ifndef WORDS_BIG_ENDIAN
74
#define SHIFT_4(o) ((o) << 2)
47
#define Shift4(o) ((1-(o)) << 2)
76
#define SHIFT_4(o) ((1 - (o)) << 2)
50
#define Get4(x,o) (((x) >> Shift4(o)) & 0xf)
51
#define Put4(x,o,v) (((x) & ~(0xf << Shift4(o))) | (((v) & 0xf) << Shift4(o)))
53
#define DefineAlpha(line,x) \
54
uint8_t *__ap = (uint8_t *) line + ((x) >> 1); \
57
#define StepAlpha ((__ap += __ao), (__ao ^= 1))
59
#define AddAlpha(a) { \
60
uint8_t __o = READ(image, __ap); \
61
uint8_t __a = (a) + Get4(__o, __ao); \
62
WRITE(image, __ap, Put4 (__o, __ao, __a | (0 - ((__a) >> 4)))); \
79
#define GET_4(x, o) (((x) >> SHIFT_4 (o)) & 0xf)
80
#define PUT_4(x, o, v) \
81
(((x) & ~(0xf << SHIFT_4 (o))) | (((v) & 0xf) << SHIFT_4 (o)))
83
#define DEFINE_ALPHA(line, x) \
84
uint8_t *__ap = (uint8_t *) line + ((x) >> 1); \
87
#define STEP_ALPHA ((__ap += __ao), (__ao ^= 1))
89
#define ADD_ALPHA(a) \
91
uint8_t __o = READ (image, __ap); \
92
uint8_t __a = (a) + GET_4 (__o, __ao); \
93
WRITE (image, __ap, PUT_4 (__o, __ao, __a | (0 - ((__a) >> 4)))); \
65
96
#include "pixman-edge-imp.h"
101
#undef RASTERIZE_EDGES
140
174
uint8_t *ap = (uint8_t *) line;
141
pixman_fixed_t lx, rx;
175
pixman_fixed_t lx, rx;
149
if (pixman_fixed_to_int (rx) >= width)
185
if (pixman_fixed_to_int (rx) >= width)
150
187
/* Use the last pixel of the scanline, covered 100%.
151
188
* We can't use the first pixel following the scanline,
152
189
* because accessing it could result in a buffer overrun.
154
191
rx = pixman_int_to_fixed (width) - 1;
156
/* Skip empty (or backwards) sections */
194
/* Skip empty (or backwards) sections */
161
/* Find pixel bounds for span. */
162
lxi = pixman_fixed_to_int (lx);
163
rxi = pixman_fixed_to_int (rx);
199
/* Find pixel bounds for span. */
200
lxi = pixman_fixed_to_int (lx);
201
rxi = pixman_fixed_to_int (rx);
165
203
/* Sample coverage for edge pixels */
166
lxs = RenderSamplesX (lx, 8);
167
rxs = RenderSamplesX (rx, 8);
204
lxs = RENDER_SAMPLES_X (lx, 8);
205
rxs = RENDER_SAMPLES_X (rx, 8);
169
207
/* Add coverage across row */
172
WRITE(image, ap +lxi, clip255 (READ(image, ap + lxi) + rxs - lxs));
210
WRITE (image, ap + lxi,
211
clip255 (READ (image, ap + lxi) + rxs - lxs));
176
WRITE(image, ap + lxi, clip255 (READ(image, ap + lxi) + N_X_FRAC(8) - lxs));
178
/* Move forward so that lxi/rxi is the pixel span */
181
/* Don't bother trying to optimize the fill unless
215
WRITE (image, ap + lxi,
216
clip255 (READ (image, ap + lxi) + N_X_FRAC (8) - lxs));
218
/* Move forward so that lxi/rxi is the pixel span */
221
/* Don't bother trying to optimize the fill unless
182
222
* the span is longer than 4 pixels. */
193
if (lxi >= fill_end || rxi < fill_start)
195
/* We're beyond what we saved, just fill it */
196
add_saturate_8 (ap + fill_start,
197
fill_size * N_X_FRAC(8),
198
fill_end - fill_start);
205
/* Update fill_start */
206
if (lxi > fill_start)
208
add_saturate_8 (ap + fill_start,
209
fill_size * N_X_FRAC(8),
213
else if (lxi < fill_start)
215
add_saturate_8 (ap + lxi, N_X_FRAC(8),
219
/* Update fill_end */
222
add_saturate_8 (ap + rxi,
223
fill_size * N_X_FRAC(8),
227
else if (fill_end < rxi)
229
add_saturate_8 (ap + fill_end,
239
add_saturate_8 (ap + lxi, N_X_FRAC(8), rxi - lxi);
242
WRITE(image, ap + rxi, clip255 (READ(image, ap + rxi) + rxs));
233
if (lxi >= fill_end || rxi < fill_start)
235
/* We're beyond what we saved, just fill it */
236
ADD_SATURATE_8 (ap + fill_start,
237
fill_size * N_X_FRAC (8),
238
fill_end - fill_start);
245
/* Update fill_start */
246
if (lxi > fill_start)
248
ADD_SATURATE_8 (ap + fill_start,
249
fill_size * N_X_FRAC (8),
253
else if (lxi < fill_start)
255
ADD_SATURATE_8 (ap + lxi, N_X_FRAC (8),
259
/* Update fill_end */
262
ADD_SATURATE_8 (ap + rxi,
263
fill_size * N_X_FRAC (8),
267
else if (fill_end < rxi)
269
ADD_SATURATE_8 (ap + fill_end,
279
ADD_SATURATE_8 (ap + lxi, N_X_FRAC (8), rxi - lxi);
282
WRITE (image, ap + rxi, clip255 (READ (image, ap + rxi) + rxs));
247
288
/* We're done, make sure we clean up any remaining fill. */
248
if (fill_start != fill_end) {
249
if (fill_size == N_Y_FRAC(8))
251
MEMSET_WRAPPED (image, ap + fill_start, 0xff, fill_end - fill_start);
255
add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8),
256
fill_end - fill_start);
289
if (fill_start != fill_end)
291
if (fill_size == N_Y_FRAC (8))
293
MEMSET_WRAPPED (image, ap + fill_start,
294
0xff, fill_end - fill_start);
298
ADD_SATURATE_8 (ap + fill_start, fill_size * N_X_FRAC (8),
299
fill_end - fill_start);
262
if (pixman_fixed_frac (y) != Y_FRAC_LAST(8))
264
RenderEdgeStepSmall (l);
265
RenderEdgeStepSmall (r);
266
y += STEP_Y_SMALL(8);
305
if (pixman_fixed_frac (y) != Y_FRAC_LAST (8))
307
RENDER_EDGE_STEP_SMALL (l);
308
RENDER_EDGE_STEP_SMALL (r);
309
y += STEP_Y_SMALL (8);
270
RenderEdgeStepBig (l);
271
RenderEdgeStepBig (r);
313
RENDER_EDGE_STEP_BIG (l);
314
RENDER_EDGE_STEP_BIG (r);
273
316
if (fill_start != fill_end)
275
if (fill_size == N_Y_FRAC(8))
277
MEMSET_WRAPPED (image, ap + fill_start, 0xff, fill_end - fill_start);
281
add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8),
282
fill_end - fill_start);
318
if (fill_size == N_Y_FRAC (8))
320
MEMSET_WRAPPED (image, ap + fill_start,
321
0xff, fill_end - fill_start);
325
ADD_SATURATE_8 (ap + fill_start, fill_size * N_X_FRAC (8),
326
fill_end - fill_start);
284
329
fill_start = fill_end = -1;
296
342
PIXMAN_RASTERIZE_EDGES (pixman_image_t *image,
302
348
switch (PIXMAN_FORMAT_BPP (image->bits.format))
305
fbRasterizeEdges1 (image, l, r, t, b);
351
rasterize_edges_1 (image, l, r, t, b);
308
fbRasterizeEdges4 (image, l, r, t, b);
355
rasterize_edges_4 (image, l, r, t, b);
311
fbRasterizeEdges8 (image, l, r, t, b);
359
rasterize_edges_8 (image, l, r, t, b);