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 typedef struct _Sinusoidal_Data Sinusoidal_Data;
11 struct _Sinusoidal_Data
21 sinusoidal_init(void);
24 sinusoidal_shutdown(void);
27 sinusoidal_init_geom(RGBA_Gradient *gr);
30 sinusoidal_setup_geom(RGBA_Gradient *gr);
33 sinusoidal_free_geom(void *gdata);
36 sinusoidal_has_alpha(RGBA_Gradient *gr, int op);
39 sinusoidal_has_mask(RGBA_Gradient *gr, int op);
42 sinusoidal_get_map_len(RGBA_Gradient *gr);
44 static Gfx_Func_Gradient_Fill
45 sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa);
47 static RGBA_Gradient_Type sinusoidal = {"sinusoidal", sinusoidal_init, sinusoidal_shutdown,
48 sinusoidal_init_geom, sinusoidal_setup_geom, sinusoidal_free_geom,
49 sinusoidal_has_alpha, sinusoidal_has_mask,
50 sinusoidal_get_map_len, sinusoidal_get_fill_func};
53 /** internal functions **/
56 sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
57 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
60 sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
61 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
64 sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
65 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
68 sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
69 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
72 sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
73 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
76 sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
77 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
80 sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
81 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
84 sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
85 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
88 sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
89 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
92 sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
93 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
96 sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
97 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
100 sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
101 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
104 sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
105 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
108 sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
109 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data);
113 evas_common_gradient_sinusoidal_get(void)
119 sinusoidal_init(void)
124 sinusoidal_shutdown(void)
129 sinusoidal_free_geom(void *gdata)
131 Sinusoidal_Data *data = (Sinusoidal_Data *)gdata;
132 if (data) free(data);
136 sinusoidal_setup_geom(RGBA_Gradient *gr)
138 Sinusoidal_Data *sinusoidal_data;
140 if (!gr || (gr->type.geometer != &sinusoidal)) return;
142 sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
143 if (!sinusoidal_data) return;
144 sinusoidal_data->sa = sinusoidal_data->amp * gr->fill.h;
145 sinusoidal_data->sp = sinusoidal_data->per * (M_PI / gr->fill.w);
146 sinusoidal_data->off = gr->map.offset;
147 sinusoidal_data->len = gr->fill.h;
151 sinusoidal_init_geom(RGBA_Gradient *gr)
153 Sinusoidal_Data *sinusoidal_data;
155 char *s, *p, key[256];
158 if (!gr || (gr->type.geometer != &sinusoidal)) return;
160 sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
161 if (!sinusoidal_data)
163 sinusoidal_data = calloc(1, sizeof(Sinusoidal_Data));
164 if (!sinusoidal_data) return;
165 sinusoidal_data->amp = 1.0;
166 sinusoidal_data->per = 1.0;
167 sinusoidal_data->sa = 32;
168 sinusoidal_data->sp = M_PI / 32;
169 sinusoidal_data->off = 0.0;
170 sinusoidal_data->len = 32;
172 gr->type.gdata = sinusoidal_data;
174 if (!gr->type.params || !*(gr->type.params))
177 s = strdup(gr->type.params);
180 amp = sinusoidal_data->amp;
181 per = sinusoidal_data->per;
183 while ((p = evas_common_gradient_get_key_fval(p, key, &val)))
185 if (!strcmp(key, "amplitude"))
190 else if (!strcmp(key, "period"))
203 sinusoidal_data->amp = amp;
204 if (per < 0.0) per = -per;
205 sinusoidal_data->per = per;
212 sinusoidal_has_alpha(RGBA_Gradient *gr, int op)
214 if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
216 if (gr->has_alpha | gr->map.has_alpha)
218 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
219 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
221 if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
222 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
223 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
229 sinusoidal_has_mask(RGBA_Gradient *gr, int op)
231 if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
232 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
233 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
235 if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) ||
236 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) ||
237 (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) )
245 sinusoidal_get_map_len(RGBA_Gradient *gr)
247 Sinusoidal_Data *sinusoidal_data;
249 if (!gr || (gr->type.geometer != &sinusoidal)) return 0;
250 sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
251 if (!sinusoidal_data) return 0;
252 return sinusoidal_data->len;
255 static Gfx_Func_Gradient_Fill
256 sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
258 Sinusoidal_Data *sinusoidal_data;
259 Gfx_Func_Gradient_Fill sfunc = NULL;
262 if (!gr || (gr->type.geometer != &sinusoidal))
264 sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata;
265 if (!sinusoidal_data) return sfunc;
267 sinusoidal_data->off = gr->map.offset;
268 if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) ||
269 (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) )
272 switch (gr->fill.spread)
274 case _EVAS_TEXTURE_REFLECT:
277 sfunc = sinusoidal_reflect_aa;
279 sfunc = sinusoidal_reflect;
282 case _EVAS_TEXTURE_REPEAT:
285 sfunc = sinusoidal_repeat_aa;
287 sfunc = sinusoidal_repeat;
290 case _EVAS_TEXTURE_RESTRICT:
291 sinusoidal_data->off = 0;
292 case _EVAS_TEXTURE_RESTRICT_REFLECT:
297 sfunc = sinusoidal_restrict_reflect_aa_masked;
299 sfunc = sinusoidal_restrict_reflect_aa;
304 sfunc = sinusoidal_restrict_reflect_masked;
306 sfunc = sinusoidal_restrict_reflect;
310 case _EVAS_TEXTURE_RESTRICT_REPEAT:
315 sfunc = sinusoidal_restrict_repeat_aa_masked;
317 sfunc = sinusoidal_restrict_repeat_aa;
322 sfunc = sinusoidal_restrict_repeat_masked;
324 sfunc = sinusoidal_restrict_repeat;
328 case _EVAS_TEXTURE_PAD:
331 sfunc = sinusoidal_pad_aa;
333 sfunc = sinusoidal_pad;
337 sfunc = sinusoidal_reflect_aa;
343 #define SETUP_SINU_FILL \
344 a00 = gdata->sp * (axx / 65536.0f); \
345 a01 = gdata->sp * (axy / 65536.0f); \
346 a10 = ayx / 65536.0f; \
347 a11 = ayy / 65536.0f; \
348 xf = (a00 * x) + (a01 * y); \
349 yf = (a10 * x) + (a11 * y);
352 sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
353 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
355 DATA32 *dst_end = dst + dst_len;
356 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
357 float xf, yf, sa = gdata->sa;
358 float a00, a01, a10, a11;
359 float off = gdata->off * (src_len - 1);
363 while (dst < dst_end)
365 int l = (yf - (sa * sin(xf))) + off;
370 int m = (l % (2 * src_len));
376 *dst++ = src[l]; xf += a00; yf += a10;
381 sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
382 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
384 DATA32 *dst_end = dst + dst_len;
385 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
386 float xf, yf, sa = gdata->sa;
387 float a00, a01, a10, a11;
388 float off = gdata->off * (src_len - 1);
392 while (dst < dst_end)
394 float r = (yf - (sa * sin(xf))) + off;
398 a = 1 + (int)(255 * (r - (int)r));
403 int m = (l % (2 * src_len));
407 { l = src_len - l - 1; a = 257 - a; }
411 *dst = INTERP_256(a, src[l + 1], *dst);
413 dst++; xf += a00; yf += a10;
418 sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
419 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
421 DATA32 *dst_end = dst + dst_len;
422 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
423 float xf, yf, sa = gdata->sa;
424 float a00, a01, a10, a11;
425 float off = gdata->off * (src_len - 1);
429 while (dst < dst_end)
431 int l = (yf - (sa * sin(xf))) + off;
436 *dst++ = src[l]; xf += a00; yf += a10;
441 sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
442 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
444 DATA32 *dst_end = dst + dst_len;
445 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
446 float xf, yf, sa = gdata->sa;
447 float a00, a01, a10, a11;
448 float off = gdata->off * (src_len - 1);
452 while (dst < dst_end)
454 float r = (yf - (sa * sin(xf))) + off;
458 a = 1 + (int)(255 * (r - (int)r));
462 { l += src_len; a = 257 - a; }
466 *dst = INTERP_256(a, src[l + 1], *dst);
467 if (l == (src_len - 1))
468 *dst = INTERP_256(a, src[0], *dst);
469 dst++; xf += a00; yf += a10;
474 sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
475 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
477 DATA32 *dst_end = dst + dst_len;
478 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
479 float xf, yf, sa = gdata->sa;
480 float a00, a01, a10, a11;
481 float off = gdata->off * (src_len - 1);
485 while (dst < dst_end)
487 int l = (yf - (sa * sin(xf)));
490 if ((unsigned)l < src_len)
496 int m = (l % (2 * src_len));
504 dst++; xf += a00; yf += a10;
509 sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
510 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
512 DATA32 *dst_end = dst + dst_len;
513 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
514 float xf, yf, sa = gdata->sa;
515 float a00, a01, a10, a11;
516 float off = gdata->off * (src_len - 1);
520 while (dst < dst_end)
522 float r = (yf - (sa * sin(xf))) + off, s = r - off;
526 if ((unsigned)l < src_len)
531 a = 1 + (int)(255 * (r - (int)r));
532 if (lp < 0) lp = -lp;
535 int m = (lp % (2 * src_len));
539 { lp = src_len - lp - 1; a = 257 - a; }
542 if (lp + 1 < src_len)
543 *dst = INTERP_256(a, src[lp + 1], *dst);
544 if ((l == 0) && (s < 0))
547 *dst = MUL_256(a, *dst);
549 if (l == (src_len - 1))
551 a = 256 - (255 * (s - l));
552 *dst = MUL_256(a, *dst);
555 dst++; xf += a00; yf += a10;
560 sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
561 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
563 DATA32 *dst_end = dst + dst_len;
564 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
565 float xf, yf, sa = gdata->sa;
566 float a00, a01, a10, a11;
567 float off = gdata->off * (src_len - 1);
571 while (dst < dst_end)
573 int l = (yf - (sa * sin(xf)));
576 if ((unsigned)l < src_len)
582 int m = (l % (2 * src_len));
588 *dst = src[l]; *mask = 255;
590 dst++; mask++; xf += a00; yf += a10;
595 sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
596 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
598 DATA32 *dst_end = dst + dst_len;
599 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
600 float xf, yf, sa = gdata->sa;
601 float a00, a01, a10, a11;
602 float off = gdata->off * (src_len - 1);
606 while (dst < dst_end)
608 float r = (yf - (sa * sin(xf))) + off, s = r - off;
612 if ((unsigned)l < src_len)
617 a = 1 + (int)(255 * (r - (int)r));
618 if (lp < 0) lp = -lp;
621 int m = (lp % (2 * src_len));
625 { lp = src_len - lp - 1; a = 257 - a; }
627 *dst = src[lp]; *mask = 255;
628 if (lp + 1 < src_len)
629 *dst = INTERP_256(a, src[lp + 1], *dst);
630 if ((l == 0) && (s < 0))
631 *mask = 255 + (255 * s);
632 if (l == (src_len - 1))
633 *mask = 255 - (255 * (s - l));
635 dst++; mask++; xf += a00; yf += a10;
640 sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, 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 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
645 float xf, yf, sa = gdata->sa;
646 float a00, a01, a10, a11;
647 float off = gdata->off * (src_len - 1);
651 while (dst < dst_end)
653 int l = (yf - (sa * sin(xf)));
656 if ((unsigned)l < src_len)
664 dst++; xf += a00; yf += a10;
669 sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
670 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
672 DATA32 *dst_end = dst + dst_len;
673 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
674 float xf, yf, sa = gdata->sa;
675 float a00, a01, a10, a11;
676 float off = gdata->off * (src_len - 1);
680 while (dst < dst_end)
682 float r = (yf - (sa * sin(xf))) + off, s = r - off;
686 if ((unsigned)l < src_len)
691 a = 1 + (int)(255 * (r - (int)r));
694 { lp += src_len; a = 257 - a; }
696 if (lp + 1 < src_len)
697 *dst = INTERP_256(a, src[lp + 1], *dst);
698 if (lp == (src_len - 1))
699 *dst = INTERP_256(a, src[0], *dst);
700 if ((l == 0) && (s < 0))
703 *dst = MUL_256(a, *dst);
705 if (l == (src_len - 1))
707 a = 256 - (255 * (s - l));
708 *dst = MUL_256(a, *dst);
711 dst++; xf += a00; yf += a10;
716 sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
717 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
719 DATA32 *dst_end = dst + dst_len;
720 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
721 float xf, yf, sa = gdata->sa;
722 float a00, a01, a10, a11;
723 float off = gdata->off * (src_len - 1);
727 while (dst < dst_end)
729 int l = (yf - (sa * sin(xf)));
732 if ((unsigned)l < src_len)
738 *dst = src[l]; *mask = 255;
740 dst++; mask++; xf += a00; yf += a10;
745 sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len,
746 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
748 DATA32 *dst_end = dst + dst_len;
749 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
750 float xf, yf, sa = gdata->sa;
751 float a00, a01, a10, a11;
752 float off = gdata->off * (src_len - 1);
756 while (dst < dst_end)
758 float r = (yf - (sa * sin(xf))) + off, s = r - off;
762 if ((unsigned)l < src_len)
767 a = 1 + (int)(255 * (r - (int)r));
770 { lp += src_len; a = 257 - a; }
771 *dst = src[lp]; *mask = 255;
772 if (lp + 1 < src_len)
773 *dst = INTERP_256(a, src[lp + 1], *dst);
774 if (lp == (src_len - 1))
775 *dst = INTERP_256(a, src[0], *dst);
776 if ((l == 0) && (s < 0))
777 *mask = 255 + (255 * s);
778 if (l == (src_len - 1))
779 *mask = 255 - (255 * (s - l));
781 dst++; mask++; xf += a00; yf += a10;
786 sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
787 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
789 DATA32 *dst_end = dst + dst_len;
790 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
791 float xf, yf, sa = gdata->sa;
792 float a00, a01, a10, a11;
796 while (dst < dst_end)
798 int l = (yf - (sa * sin(xf)));
805 dst++; xf += a00; yf += a10;
810 sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask __UNUSED__, int dst_len,
811 int x, int y, int axx, int axy, int ayx, int ayy, void *params_data)
813 DATA32 *dst_end = dst + dst_len;
814 Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data;
815 float xf, yf, sa = gdata->sa;
816 float a00, a01, a10, a11;
820 while (dst < dst_end)
822 float r = (yf - (sa * sin(xf)));
826 if ((unsigned)l < (src_len - 1))
831 a = 1 + (int)(255 * (r - (int)r));
832 *dst = INTERP_256(a, src[l + 1], src[l]);
834 if (l < 0) *dst = src[0];
835 if (l >= src_len) *dst = src[src_len - 1];
836 dst++; xf += a00; yf += a10;