2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
7 #include "evas_common.h"
8 #include "evas_gradient_private.h"
10 #define GRAD_LINEAR_DIAG 1
11 #define GRAD_LINEAR_CODIAG 2
13 typedef struct _Linear_Data Linear_Data;
23 unsigned char at_angle : 1;
30 linear_shutdown(void);
33 linear_init_geom(RGBA_Gradient *gr);
36 linear_setup_geom(RGBA_Gradient *gr);
39 linear_free_geom(void *gdata);
42 linear_has_alpha(RGBA_Gradient *gr, int op);
45 linear_has_mask(RGBA_Gradient *gr, int op);
48 linear_get_map_len(RGBA_Gradient *gr);
50 static Gfx_Func_Gradient_Fill
51 linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
53 static RGBA_Gradient_Type linear = {"linear", linear_init, linear_shutdown,
54 linear_init_geom, linear_setup_geom, linear_free_geom,
55 linear_has_alpha, linear_has_mask,
56 linear_get_map_len, linear_get_fill_func};
60 /** internal functions **/
62 linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
63 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
66 linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
67 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
70 linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
71 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
74 linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
75 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
78 linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
79 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
82 linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
83 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
86 linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
87 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
90 linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
91 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
94 linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
95 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
98 linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
99 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
102 linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
103 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
106 linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
107 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
110 linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
111 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
114 linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
115 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
118 linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
119 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
122 linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
123 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
126 linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
127 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
130 linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
131 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
136 evas_common_gradient_linear_get(void)
147 linear_shutdown(void)
152 linear_free_geom(void *gdata)
154 Linear_Data *data = (Linear_Data *)gdata;
155 if (data) free(data);
159 linear_init_geom(RGBA_Gradient *gr)
161 Linear_Data *linear_data;
163 if (!gr || (gr->type.geometer != &linear)) return;
164 linear_data = (Linear_Data *)gr->type.gdata;
167 linear_data = calloc(1, sizeof(Linear_Data));
168 if (!linear_data) return;
169 linear_data->type = 0;
170 linear_data->yy0 = 0;
171 linear_data->ca = 1.0;
172 linear_data->sa = 0.0;
173 linear_data->off = 0.0;
174 linear_data->len = 32;
175 linear_data->at_angle = 0;
176 gr->type.gdata = linear_data;
179 linear_data->type = 0;
180 if (gr->type.name && !strcmp(gr->type.name, "linear.diag"))
181 linear_data->type = GRAD_LINEAR_DIAG;
182 else if (gr->type.name && !strcmp(gr->type.name, "linear.codiag"))
183 linear_data->type = GRAD_LINEAR_CODIAG;
187 linear_setup_geom(RGBA_Gradient *gr)
189 Linear_Data *linear_data;
190 float angle, a, ca, sa;
191 int xoff = 0, yoff = 0;
193 if (!gr || (gr->type.geometer != &linear)) return;
194 linear_data = (Linear_Data *)gr->type.gdata;
195 if (!linear_data) return;
197 angle = gr->map.angle;
198 if (linear_data->type == GRAD_LINEAR_DIAG)
199 angle += ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0;
200 else if (linear_data->type == GRAD_LINEAR_CODIAG)
201 angle -= ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0;
202 a = ((angle + 90.0) * M_PI) / 180.0;
205 if ((sa >= 0) && (ca <= 0))
208 xoff = -(gr->fill.w - 1);
210 else if ((sa <= 0) && (ca <= 0))
213 xoff = -(gr->fill.w - 1);
214 yoff = -(gr->fill.h - 1);
216 else if ((sa <= 0) && (ca >= 0))
219 yoff = -(gr->fill.h - 1);
221 linear_data->len = 0.9961 + (ca * gr->fill.w) + (sa * gr->fill.h);
223 a = (angle * M_PI) / 180.0;
224 linear_data->ca = cos(a);
225 linear_data->sa = sin(a);
227 linear_data->yy0 = (linear_data->ca * (yoff << 16)) - (linear_data->sa * (xoff << 16));
228 linear_data->off = gr->map.offset;
230 if ((linear_data->ca != 1.0) || (linear_data->sa != 0.0))
231 linear_data->at_angle = 1;
235 linear_has_alpha(RGBA_Gradient *gr, int op)
237 if (!gr || (gr->type.geometer != &linear)) return 0;
238 if (gr->has_alpha | gr->map.has_alpha)
240 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
241 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
243 if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
244 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
245 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
251 linear_has_mask(RGBA_Gradient *gr, int op)
253 if (!gr || (gr->type.geometer != &linear)) return 0;
254 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
255 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
257 if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
258 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
259 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
266 linear_get_map_len(RGBA_Gradient *gr)
268 Linear_Data *linear_data;
270 if (!gr || (gr->type.geometer != &linear)) return 0;
271 linear_data = (Linear_Data *)gr->type.gdata;
272 if (!linear_data) return 0;
273 return linear_data->len;
276 static Gfx_Func_Gradient_Fill
277 linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
279 Linear_Data *linear_data;
280 Gfx_Func_Gradient_Fill sfunc = NULL;
283 if (!gr || (gr->type.geometer != &linear))
285 linear_data = (Linear_Data *)gr->type.gdata;
286 if (!linear_data) return sfunc;
288 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
289 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
292 switch (gr->fill.spread)
294 case _EVAS_TEXTURE_REFLECT:
297 sfunc = linear_reflect_aa;
299 sfunc = linear_reflect;
302 case _EVAS_TEXTURE_REPEAT:
305 sfunc = linear_repeat_aa;
307 sfunc = linear_repeat;
310 case _EVAS_TEXTURE_RESTRICT:
315 sfunc = linear_restrict_aa_masked;
317 sfunc = linear_restrict_aa;
322 sfunc = linear_restrict_masked;
324 sfunc = linear_restrict;
328 case _EVAS_TEXTURE_RESTRICT_REFLECT:
333 sfunc = linear_restrict_reflect_aa_masked;
335 sfunc = linear_restrict_reflect_aa;
340 sfunc = linear_restrict_reflect_masked;
342 sfunc = linear_restrict_reflect;
346 case _EVAS_TEXTURE_RESTRICT_REPEAT:
351 sfunc = linear_restrict_repeat_aa_masked;
353 sfunc = linear_restrict_repeat_aa;
358 sfunc = linear_restrict_repeat_masked;
360 sfunc = linear_restrict_repeat;
364 case _EVAS_TEXTURE_PAD:
367 sfunc = linear_pad_aa;
373 sfunc = linear_reflect_aa;
379 /* the fill functions */
382 #define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \
384 MOV_P2R(s, mms, mmz) \
385 INTERP_256_R2R(mma, mms, mmd, mm5)
387 #define MUL_256_A2R(a, mma, mmd, mmz) \
389 MUL4_256_R2R(mma, mmd)
392 #define AXIS_ALIGNED \
393 ( ((ayy == 0) || (ayx == 0)) && ((gdata->ca == 0.0) || (gdata->sa == 0.0)) )
395 #define SETUP_LINEAR_FILL \
396 if (gdata->at_angle) \
398 ayx = (-gdata->sa * axx) + (gdata->ca * ayx); \
399 ayy = (-gdata->sa * axy) + (gdata->ca * ayy); \
401 yy = (ayx * x) + (ayy * y) + gdata->yy0;
405 linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
406 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
408 DATA32 *dst_end = dst + dst_len;
409 Linear_Data *gdata = (Linear_Data *)params_data;
410 int off = gdata->off * (src_len - 1);
419 y = (yy >> 16) + off;
423 int m = (y % (2 * src_len));
430 while (dst < dst_end)
435 while (dst < dst_end)
439 l += ((yy - (l << 16)) >> 15) + off;
443 int m = (l % (2 * src_len));
449 *dst++ = src[l]; yy += ayx;
454 linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
455 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
457 DATA32 *dst_end = dst + dst_len;
458 Linear_Data *gdata = (Linear_Data *)params_data;
459 int off = gdata->off * (src_len - 1);
464 linear_reflect(src, src_len, dst, mask, dst_len, x, y,
465 axx, axy, ayx, ayy, params_data);
473 MOV_A2R(ALPHA_255, mm5)
475 while (dst < dst_end)
478 int a = 1 + ((yy - (l << 16)) >> 8);
481 if (l < 0) { l = -l; a = 257 - a; }
484 int m = (l % (2 * src_len));
488 { l = src_len - l - 1; a = 257 - a; }
491 MOV_P2R(src[l], mm1, mm0)
498 INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
500 *dst = INTERP_256(a, src[l + 1], *dst);
504 MOV_R2P(mm1, *dst, mm0)
511 linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
512 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
514 DATA32 *dst_end = dst + dst_len;
515 Linear_Data *gdata = (Linear_Data *)params_data;
516 int off = gdata->off * (src_len - 1);
525 y = (yy >> 16) + off;
530 while (dst < dst_end)
540 x = (yy >> 16) + off;
550 if (l > dst_len) l = dst_len;
551 func = evas_common_draw_func_copy_get(1, (ayx < 0 ? -1 : 0));
552 func(src + x, dst, l);
553 if (l == dst_len) return;
554 dst += l; dst_len -= l;
555 l = dst_len / src_len;
558 func(src, dst, src_len);
561 l = dst_len % src_len;
568 while (dst < dst_end)
572 l += ((yy - (l << 16)) >> 15) + off;
576 *dst++ = src[l]; yy += ayx;
581 linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
582 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
584 DATA32 *dst_end = dst + dst_len;
585 Linear_Data *gdata = (Linear_Data *)params_data;
586 int off = gdata->off * (src_len - 1);
591 linear_repeat(src, src_len, dst, mask, dst_len, x, y,
592 axx, axy, ayx, ayy, params_data);
600 MOV_A2R(ALPHA_255, mm5)
602 while (dst < dst_end)
605 int a = 1 + ((yy - (l << 16)) >> 8);
612 MOV_P2R(src[l], mm1, mm0)
619 INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
621 *dst = INTERP_256(a, src[l + 1], *dst);
624 if (l == (src_len - 1))
627 INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
629 *dst = INTERP_256(a, src[0], *dst);
633 MOV_R2P(mm1, *dst, mm0)
640 linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
641 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
643 DATA32 *dst_end = dst + dst_len;
644 Linear_Data *gdata = (Linear_Data *)params_data;
654 if ((y < 0) || (y >= src_len))
656 memset(dst, 0, sizeof(DATA32) * dst_len);
660 while (dst < dst_end)
670 ayx = (ayx < 0 ? -1 : 1);
671 if ((unsigned)x < src_len)
673 if ((ayx > 0) && ((src_len - x) >= dst_len))
675 func = evas_common_draw_func_copy_get(dst_len, 0);
676 func(src + x, dst, dst_len);
679 if ((ayx < 0) && (x >= (dst_len - 1)))
681 func = evas_common_draw_func_copy_get(dst_len, -1);
682 func(src + x - (dst_len - 1), dst, dst_len);
686 while (dst < dst_end)
689 if ((unsigned)x < src_len)
696 while (dst < dst_end)
700 l += (yy - (l << 16)) >> 15;
702 if ((unsigned)l < src_len)
709 linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
710 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
712 DATA32 *dst_end = dst + dst_len;
713 Linear_Data *gdata = (Linear_Data *)params_data;
718 linear_restrict(src, src_len, dst, mask, dst_len, x, y,
719 axx, axy, ayx, ayy, params_data);
727 MOV_A2R(ALPHA_255, mm5)
729 while (dst < dst_end)
734 if ((unsigned)(l + 1) < (src_len + 1))
736 DATA32 a = 1 + ((yy - (l << 16)) >> 8);
741 MOV_P2R(src[lp], mm1, mm0)
745 if (lp + 1 < src_len)
748 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
750 *dst = INTERP_256(a, src[lp + 1], *dst);
756 MUL_256_A2R(a, mm3, mm1, mm0)
758 *dst = MUL_256(a, *dst);
761 if (l == (src_len - 1))
765 MUL_256_A2R(a, mm3, mm1, mm0)
767 *dst = MUL_256(257 - a, *dst);
771 MOV_R2P(mm1, *dst, mm0)
779 linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
780 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
782 DATA32 *dst_end = dst + dst_len;
783 Linear_Data *gdata = (Linear_Data *)params_data;
793 if ((y < 0) || (y >= src_len))
795 memset(dst, 0, sizeof(DATA32) * dst_len);
796 memset(mask, 0, sizeof(DATA8) * dst_len);
800 while (dst < dst_end)
802 *dst++ = c; *mask++ = 255;
812 ayx = (ayx < 0 ? -1 : 1);
813 if ((unsigned)x < src_len)
815 if ((ayx > 0) && ((src_len - x) >= dst_len))
817 func = evas_common_draw_func_copy_get(dst_len, 0);
818 func(src + x, dst, dst_len);
819 memset(mask, 255, sizeof(DATA8) * dst_len);
822 if ((ayx < 0) && (x >= (dst_len - 1)))
824 func = evas_common_draw_func_copy_get(dst_len, -1);
825 func(src + x - (dst_len - 1), dst, dst_len);
826 memset(mask, 255, sizeof(DATA8) * dst_len);
830 while (dst < dst_end)
833 if ((unsigned)x < src_len)
835 *dst = src[x]; *mask = 255;
837 dst++; mask++; x += ayx;
842 while (dst < dst_end)
846 l += (yy - (l << 16)) >> 15;
848 if ((unsigned)l < src_len)
850 *dst = src[l]; *mask = 255;
852 dst++; mask++; yy += ayx;
857 linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
858 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
860 DATA32 *dst_end = dst + dst_len;
861 Linear_Data *gdata = (Linear_Data *)params_data;
866 linear_restrict_masked(src, src_len, dst, mask, dst_len, x, y,
867 axx, axy, ayx, ayy, params_data);
875 MOV_A2R(ALPHA_255, mm5)
877 while (dst < dst_end)
882 if ((unsigned)(l + 1) < (src_len + 1))
884 DATA32 a = 1 + ((yy - (l << 16)) >> 8);
890 MOV_P2R(src[lp], mm1, mm0)
892 *dst = src[lp]; *mask = 255;
894 if (lp + 1 < src_len)
897 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
899 *dst = INTERP_256(a, src[lp + 1], *dst);
904 if (l == (src_len - 1))
907 MOV_R2P(mm1, *dst, mm0)
910 dst++; mask++; yy += ayx;
915 linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
916 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
918 DATA32 *dst_end = dst + dst_len;
919 Linear_Data *gdata = (Linear_Data *)params_data;
920 int off = gdata->off * (src_len - 1);
930 if ((y < 0) || (y >= src_len))
932 memset(dst, 0, sizeof(DATA32) * dst_len);
939 int m = (y % (2 * src_len));
946 while (dst < dst_end)
951 while (dst < dst_end)
955 l += (yy - (l << 16)) >> 15;
957 if ((unsigned)l < src_len)
963 int m = (l % (2 * src_len));
976 linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
977 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
979 DATA32 *dst_end = dst + dst_len;
980 Linear_Data *gdata = (Linear_Data *)params_data;
981 int off = gdata->off * (src_len - 1);
986 linear_restrict_reflect(src, src_len, dst, mask, dst_len, x, y,
987 axx, axy, ayx, ayy, params_data);
995 MOV_A2R(ALPHA_255, mm5)
997 while (dst < dst_end)
1002 if ((unsigned)(l + 1) < (src_len + 1))
1004 DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a;
1007 if (l == -1) lp = off;
1008 if (lp < 0) { lp = -lp; a = 257 - a; }
1011 int m = (lp % (2 * src_len));
1013 lp = (lp % src_len);
1015 { lp = src_len - lp - 1; a = 257 - a; }
1018 MOV_P2R(src[lp], mm1, mm0)
1022 if (lp + 1 < src_len)
1025 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
1027 *dst = INTERP_256(a, src[lp + 1], *dst);
1033 MUL_256_A2R(a0, mm3, mm1, mm0)
1035 *dst = MUL_256(a0, *dst);
1038 if (l == (src_len - 1))
1042 MUL_256_A2R(a0, mm3, mm1, mm0)
1044 *dst = MUL_256(257 - a0, *dst);
1048 MOV_R2P(mm1, *dst, mm0)
1056 linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1057 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1059 DATA32 *dst_end = dst + dst_len;
1060 Linear_Data *gdata = (Linear_Data *)params_data;
1061 int off = gdata->off * (src_len - 1);
1071 if ((y < 0) || (y >= src_len))
1073 memset(dst, 0, sizeof(DATA32) * dst_len);
1074 memset(mask, 0, sizeof(DATA8) * dst_len);
1081 int m = (y % (2 * src_len));
1085 y = src_len - y - 1;
1088 while (dst < dst_end)
1089 { *dst++ = c; *mask++ = 255; }
1093 while (dst < dst_end)
1097 l += ((yy - (l << 16)) >> 15);
1098 *dst = 0; *mask = 0;
1099 if ((unsigned)l < src_len)
1105 int m = (l % (2 * src_len));
1109 l = src_len - l - 1;
1111 *dst = src[l]; *mask = 255;
1113 dst++; mask++; yy += ayx;
1118 linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1119 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1121 DATA32 *dst_end = dst + dst_len;
1122 Linear_Data *gdata = (Linear_Data *)params_data;
1123 int off = gdata->off * (src_len - 1);
1128 linear_restrict_reflect_masked(src, src_len, dst, mask, dst_len, x, y,
1129 axx, axy, ayx, ayy, params_data);
1137 MOV_A2R(ALPHA_255, mm5)
1139 while (dst < dst_end)
1143 *dst = 0; *mask = 0;
1144 if ((unsigned)(l + 1) < (src_len + 1))
1146 DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a - 1;
1149 if (l == -1) lp = off;
1150 if (lp < 0) { lp = -lp; a = 257 - a; }
1153 int m = (lp % (2 * src_len));
1155 lp = (lp % src_len);
1157 { lp = src_len - lp - 1; a = 257 - a; }
1160 MOV_P2R(src[lp], mm1, mm0)
1166 if (lp + 1 < src_len)
1169 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
1171 *dst = INTERP_256(a, src[lp + 1], *dst);
1175 MOV_R2P(mm1, *dst, mm0)
1179 if (l == (src_len - 1))
1182 dst++; mask++; yy += ayx;
1187 linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1188 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1190 DATA32 *dst_end = dst + dst_len;
1191 Linear_Data *gdata = (Linear_Data *)params_data;
1192 int off = gdata->off * (src_len - 1);
1202 if ((y < 0) || (y >= src_len))
1204 memset(dst, 0, sizeof(DATA32) * dst_len);
1212 while (dst < dst_end)
1217 while (dst < dst_end)
1221 l += (yy - (l << 16)) >> 15;
1223 if ((unsigned)l < src_len)
1236 linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1237 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1239 DATA32 *dst_end = dst + dst_len;
1240 Linear_Data *gdata = (Linear_Data *)params_data;
1241 int off = gdata->off * (src_len - 1);
1246 linear_restrict_repeat(src, src_len, dst, mask, dst_len, x, y,
1247 axx, axy, ayx, ayy, params_data);
1255 MOV_A2R(ALPHA_255, mm5)
1257 while (dst < dst_end)
1262 if ((unsigned)(l + 1) < (src_len + 1))
1264 DATA32 a = 1 + ((yy - (l << 16)) >> 8);
1267 if (l == -1) lp = off;
1272 MOV_P2R(src[lp], mm1, mm0)
1276 if (lp + 1 < src_len)
1279 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
1281 *dst = INTERP_256(a, src[lp + 1], *dst);
1284 if (lp == (src_len - 1))
1287 INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
1289 *dst = INTERP_256(a, src[0], *dst);
1295 MUL_256_A2R(a, mm3, mm1, mm0)
1297 *dst = MUL_256(a, *dst);
1300 if (l == (src_len - 1))
1304 MUL_256_A2R(a, mm3, mm1, mm0)
1306 *dst = MUL_256(257 - a, *dst);
1310 MOV_R2P(mm1, *dst, mm0)
1318 linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1319 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1321 DATA32 *dst_end = dst + dst_len;
1322 Linear_Data *gdata = (Linear_Data *)params_data;
1323 int off = gdata->off * (src_len - 1);
1333 if ((y < 0) || (y >= src_len))
1335 memset(dst, 0, sizeof(DATA32) * dst_len);
1336 memset(mask, 0, sizeof(DATA8) * dst_len);
1344 while (dst < dst_end)
1345 { *dst++ = c; *mask++ = 255; }
1349 while (dst < dst_end)
1353 l += ((yy - (l << 16)) >> 15);
1354 *dst = 0; *mask = 0;
1355 if ((unsigned)l < src_len)
1361 *dst = src[l]; *mask = 255;
1363 dst++; mask++; yy += ayx;
1368 linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1369 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1371 DATA32 *dst_end = dst + dst_len;
1372 Linear_Data *gdata = (Linear_Data *)params_data;
1373 int off = gdata->off * (src_len - 1);
1378 linear_restrict_repeat_masked(src, src_len, dst, mask, dst_len, x, y,
1379 axx, axy, ayx, ayy, params_data);
1387 MOV_A2R(ALPHA_255, mm5)
1389 while (dst < dst_end)
1393 *dst = 0; *mask = 0;
1394 if ((unsigned)(l + 1) < (src_len + 1))
1396 DATA32 a = 1 + ((yy - (l << 16)) >> 8);
1399 if (l == -1) lp = off;
1404 MOV_P2R(src[lp], mm1, mm0)
1410 if (lp + 1 < src_len)
1413 INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0)
1415 *dst = INTERP_256(a, src[lp + 1], *dst);
1418 if (lp == (src_len - 1))
1421 INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0)
1423 *dst = INTERP_256(a, src[0], *dst);
1427 MOV_R2P(mm1, *dst, mm0)
1431 if (l == (src_len - 1))
1434 dst++; mask++; yy += ayx;
1439 linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1440 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1442 DATA32 *dst_end = dst + dst_len;
1443 Linear_Data *gdata = (Linear_Data *)params_data;
1448 while (dst < dst_end)
1452 l += (yy - (l << 16)) >> 15;
1454 if (l >= src_len) l = src_len - 1;
1461 linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
1462 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
1464 DATA32 *dst_end = dst + dst_len;
1465 Linear_Data *gdata = (Linear_Data *)params_data;
1470 linear_pad(src, src_len, dst, mask, dst_len, x, y,
1471 axx, axy, ayx, ayy, params_data);
1479 MOV_A2R(ALPHA_255, mm5)
1481 while (dst < dst_end)
1485 if (l < 0) *dst = src[0];
1486 if (l >= src_len) *dst = src[src_len - 1];
1487 if ((unsigned)l < src_len)
1489 DATA32 a = 1 + ((yy - (l << 16)) >> 8);
1492 MOV_P2R(src[l], mm1, mm0)
1496 if (l && (l + 1 < src_len))
1499 INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0)
1501 *dst = INTERP_256(a, src[l + 1], *dst);
1505 MOV_R2P(mm1, *dst, mm0)