2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
5 #include "evas_common.h"
6 #include "evas_convert_color.h"
7 #include "evas_scale_span.h"
10 evas_common_scale_rgba_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
12 int mul = 0, step = 1;
15 if (!src || !dst) return;
16 if ((src_len < 1) || (dst_len < 1)) return;
17 if ((src_len > 65535) || (dst_len > 65535)) return;
18 if (mul_col != 0xffffffff)
26 if ((src_len == 1) || (dst_len == 1))
30 if (mul) c = MUL4_SYM(mul_col, c);
36 if (src_len == dst_len)
42 MOV_A2R(ALPHA_255, mm5)
43 MOV_P2R(mul_col, mm7, mm0)
48 MOV_P2R(*src, mm1, mm0)
49 MUL4_SYM_R2R(mm7, mm1, mm5)
50 MOV_R2P(mm1, *pdst, mm0)
52 *pdst = MUL4_SYM(mul_col, *src);
67 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
73 MOV_A2R(ALPHA_255, mm5)
76 MOV_P2R(mul_col, mm7, mm0)
88 if ((sx + 1) < src_len)
90 a = 1 + ((sxx - (sx << 16)) >> 8);
95 INTERP_256_R2R(mm3, mm2, mm1, mm5)
98 MUL4_SYM_R2R(mm7, mm1, mm5)
100 MOV_R2P(mm1, *pdst, mm0)
102 p1 = INTERP_256(a, p2, p1);
104 p1 = MUL4_SYM(mul_col, p1);
107 pdst += step; sxx += dsxx;
114 evas_common_scale_rgba_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
116 int mul = 0, step = 1;
119 if (!src || !mask || !dst) return;
120 if ((src_len < 1) || (dst_len < 1)) return;
121 if ((src_len > 65535) || (dst_len > 65535)) return;
122 if (mul_col != 0xffffffff)
130 if ((src_len == 1) || (dst_len == 1))
132 DATA32 c = MUL_SYM(*mask, *src);
134 if (mul) c = MUL4_SYM(mul_col, c);
140 if (src_len == dst_len)
144 MOV_A2R(ALPHA_255, mm5)
149 MOV_P2R(mul_col, mm7, mm0)
154 MOV_P2R(*src, mm1, mm0)
156 MUL4_SYM_R2R(mm3, mm1, mm5)
157 MUL4_SYM_R2R(mm7, mm1, mm5)
158 MOV_R2P(mm1, *pdst, mm0)
160 DATA32 c = MUL_SYM(*mask, *src);
161 *pdst = MUL4_SYM(mul_col, c);
163 src++; mask++; pdst += step;
170 MOV_P2R(*src, mm1, mm0)
172 MUL4_SYM_R2R(mm3, mm1, mm5)
173 MOV_R2P(mm1, *pdst, mm0)
175 *pdst = MUL_SYM(*mask, *src);
177 src++; mask++; pdst += step;
183 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
189 MOV_A2R(ALPHA_255, mm5)
192 MOV_P2R(mul_col, mm7, mm0)
207 if ((sx + 1) < src_len)
209 p2 = *(src + sx + 1);
210 a2 = *(mask + sx + 1);
212 a = 1 + ((sxx - (sx << 16)) >> 8);
215 MOV_P2R(p1, mm1, mm0)
216 MOV_P2R(p2, mm2, mm0)
217 INTERP_256_R2R(mm3, mm2, mm1, mm5)
218 a1 += 1 + ((a * (a2 - a1)) >> 8);
220 MUL4_256_R2R(mm3, mm1)
223 MUL4_SYM_R2R(mm7, mm1, mm5)
225 MOV_R2P(mm1, *pdst, mm0)
227 p1 = INTERP_256(a, p2, p1);
228 a1 += 1 + ((a * (a2 - a1)) >> 8);
229 p1 = MUL_256(a1, p1);
231 p1 = MUL4_SYM(mul_col, p1);
234 pdst += step; sxx += dsxx;
241 evas_common_scale_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
246 if (!mask || !dst) return;
247 if ((src_len < 1) || (dst_len < 1)) return;
248 if ((src_len > 65535) || (dst_len > 65535)) return;
255 if ((src_len == 1) || (dst_len == 1))
257 DATA32 c = MUL_SYM(*mask, mul_col);
266 MOV_A2R(ALPHA_255, mm5)
267 MOV_P2R(mul_col, mm7, mm0)
269 if (src_len == dst_len)
275 MUL4_SYM_R2R(mm7, mm3, mm5)
276 MOV_R2P(mm3, *pdst, mm0)
278 *pdst = MUL_SYM(*mask, mul_col);
280 mask++; pdst += step;
286 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
298 if ((sx + 1) < src_len)
299 a2 = *(mask + sx + 1);
300 a = 1 + ((sxx - (sx << 16)) >> 8);
301 a1 += 1 + ((a * (a2 - a1)) >> 8);
304 MUL4_256_R2R(mm7, mm3)
305 MOV_R2P(mm3, *pdst, mm0)
307 *pdst = MUL_256(a1, mul_col);
309 pdst += step; sxx += dsxx;
316 evas_common_scale_clip_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
318 int mul = 0, step = 1;
321 if (!mask || !dst) return;
322 if ((src_len < 1) || (dst_len < 1)) return;
323 if ((src_len > 65535) || (dst_len > 65535)) return;
324 if (mul_col != 0xffffffff)
334 MOV_A2R(ALPHA_255, mm5)
337 MOV_P2R(mul_col, mm7, mm0)
340 if ((src_len == 1) || (dst_len == 1))
350 MUL4_SYM_R2R(mm7, mm3, mm5)
352 c = MUL_SYM(c, mul_col);
357 MOV_P2R(*dst, mm1, mm0)
358 MUL4_SYM_R2R(mm3, mm1, mm5)
359 MOV_R2P(mm1, *dst, mm0)
361 *dst = MUL4_SYM(c, *dst);
370 MOV_P2R(*dst, mm1, mm0)
371 MUL4_SYM_R2R(mm3, mm1, mm5)
372 MOV_R2P(mm1, *dst, mm0)
374 *dst = MUL_SYM(c, *dst);
381 if (src_len == dst_len)
389 MUL4_SYM_R2R(mm7, mm3, mm5)
390 MOV_P2R(*pdst, mm1, mm0)
391 MUL4_SYM_R2R(mm3, mm1, mm5)
392 MOV_R2P(mm1, *pdst, mm0)
394 DATA32 c = MUL_SYM(*mask, mul_col);
396 *pdst = MUL4_SYM(c, *pdst);
398 mask++; pdst += step;
406 MOV_P2R(*pdst, mm1, mm0)
407 MUL4_SYM_R2R(mm3, mm1, mm5)
408 MOV_R2P(mm1, *pdst, mm0)
410 *pdst = MUL_SYM(*mask, *pdst);
412 mask++; pdst += step;
418 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
430 if ((sx + 1) < src_len)
431 a2 = *(mask + sx + 1);
432 a = 1 + ((sxx - (sx << 16)) >> 8);
433 a1 += 1 + ((a * (a2 - a1)) >> 8);
436 MOV_P2R(*pdst, mm1, mm0)
437 MUL4_256_R2R(mm3, mm1)
440 MUL4_SYM_R2R(mm7, mm1, mm5)
442 MOV_R2P(mm1, *pdst, mm0)
444 *pdst = MUL_256(a1, *pdst);
446 *pdst = MUL4_SYM(mul_col, *pdst);
448 pdst += step; sxx += dsxx;
455 evas_common_scale_rgba_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
457 evas_common_scale_rgba_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
458 evas_common_cpu_end_opt();
462 evas_common_scale_rgba_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
464 evas_common_scale_rgba_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
465 evas_common_cpu_end_opt();
469 evas_common_scale_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
471 evas_common_scale_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
472 evas_common_cpu_end_opt();
476 evas_common_scale_clip_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
478 evas_common_scale_clip_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir);
479 evas_common_cpu_end_opt();
483 evas_common_scale_hsva_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
485 int mul = 0, step = 1;
488 if (!src || !dst) return;
489 if ((src_len < 1) || (dst_len < 1)) return;
490 if ((src_len > 65535) || (dst_len > 65535)) return;
491 if (mul_col != 0xffffffff)
499 if ((src_len == 1) || (dst_len == 1))
503 if (mul) c = MUL4_SYM(mul_col, c);
509 if (src_len == dst_len)
515 *pdst = MUL4_SYM(mul_col, *src);
529 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
536 int a, h1, s1, v1, h2, s2, v2;
541 evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff,
544 if ((sx + 1) < src_len)
545 p2 = *(src + sx + 1);
546 evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff,
548 a = 1 + ((sxx - (sx << 16)) >> 8);
549 h1 += (a * (h2 - h1)) >> 8;
550 s1 += (a * (s2 - s1)) >> 8;
551 v1 += (a * (v2 - v1)) >> 8;
552 a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) +
553 (p1 & 0xff000000)) & 0xff000000;
554 evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2);
555 p1 = a + RGB_JOIN(h2,s2,v2);
557 p1 = MUL4_SYM(mul_col, p1);
559 pdst += step; sxx += dsxx;
566 evas_common_scale_hsva_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir)
568 int mul = 0, step = 1;
571 if (!src || !mask || !dst) return;
572 if ((src_len < 1) || (dst_len < 1)) return;
573 if ((src_len > 65535) || (dst_len > 65535)) return;
574 if (mul_col != 0xffffffff)
582 if ((src_len == 1) || (dst_len == 1))
584 DATA32 c = MUL_SYM(*mask, *src);
586 if (mul) c = MUL4_SYM(mul_col, c);
592 if (src_len == dst_len)
598 DATA32 c = MUL_SYM(*mask, *src);
599 *pdst = MUL4_SYM(mul_col, c);
600 src++; mask++; pdst += step;
606 *pdst = MUL_SYM(*mask, *src);
607 src++; mask++; pdst += step;
613 DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1));
621 int h1, s1, v1, h2, s2, v2;
630 if ((sx + 1) < src_len)
632 p2 = *(src + sx + 1);
633 a2 = *(mask + sx + 1);
635 evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff,
637 evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff,
639 a = 1 + ((sxx - (sx << 16)) >> 8);
640 a1 += (a * (a2 - a1)) >> 8;
641 h1 += (a * (h2 - h1)) >> 8;
642 s1 += (a * (s2 - s1)) >> 8;
643 v1 += (a * (v2 - v1)) >> 8;
644 a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) +
645 (p1 & 0xff000000)) & 0xff000000;
647 evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2);
648 p1 = a + RGB_JOIN(h2,s2,v2);
649 p1 = MUL_SYM(a1, p1);
651 p1 = MUL4_SYM(mul_col, p1);
653 pdst += step; sxx += dsxx;