From: Enlightenment S. <no-...@en...> - 2009-08-19 08:56:46
|
Log: + Add the displacement map (dispmap) renderer. For identity and affine matrices + Add the radial distort (raddist) renderer + Add examples of the above Author: turran Date: 2009-08-19 01:56:37 -0700 (Wed, 19 Aug 2009) New Revision: 41871 Modified: trunk/PROTO/enesim/examples/Makefile.am trunk/PROTO/enesim/examples/enesim_bench.c trunk/PROTO/enesim/examples/enesim_bench_dispmap.c trunk/PROTO/enesim/examples/enesim_bench_raddist.c trunk/PROTO/enesim/examples/enesim_bench_renderer.c trunk/PROTO/enesim/src/include/enesim_renderer.h trunk/PROTO/enesim/src/include/private/format_argb8888.h trunk/PROTO/enesim/src/lib/renderer/Makefile.am trunk/PROTO/enesim/src/lib/renderer/checker.c trunk/PROTO/enesim/src/lib/renderer/dispmap.c trunk/PROTO/enesim/src/lib/renderer/raddist.c Modified: trunk/PROTO/enesim/examples/Makefile.am =================================================================== --- trunk/PROTO/enesim/examples/Makefile.am 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/examples/Makefile.am 2009-08-19 08:56:37 UTC (rev 41871) @@ -26,6 +26,8 @@ enesim_bench_checker.c \ enesim_bench_stripes.c \ enesim_bench_hswitch.c \ +enesim_bench_dispmap.c \ +enesim_bench_raddist.c \ image.c endif Modified: trunk/PROTO/enesim/examples/enesim_bench.c =================================================================== --- trunk/PROTO/enesim/examples/enesim_bench.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/examples/enesim_bench.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -361,11 +361,11 @@ } else if (!strcmp(opt_bench, "raddist")) { - //raddist_bench(); + raddist_bench(); } else if (!strcmp(opt_bench, "dispmap")) { - //dispmap_bench(); + dispmap_bench(); } else if (!strcmp(opt_bench, "checker")) { @@ -384,9 +384,9 @@ compositor_bench(); //transformer_bench(); //scaler_bench(); - //rasterizer_bench(); - //raddist_bench(); - //dispmap_bench(); + rasterizer_bench(); + raddist_bench(); + dispmap_bench(); } enesim_shutdown(); /* this bench should be on test Modified: trunk/PROTO/enesim/examples/enesim_bench_dispmap.c =================================================================== --- trunk/PROTO/enesim/examples/enesim_bench_dispmap.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/examples/enesim_bench_dispmap.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -1,22 +1,9 @@ #include "enesim_bench_common.h" /****************************************************************************** - * Raddist benchmark functions * + * Dispmap functions * ******************************************************************************/ -static const char * quality_name_get(Enesim_Quality q) -{ - switch (q) - { - case ENESIM_FAST: - return "fast"; - case ENESIM_GOOD: - return "good"; - - default: - return NULL; - } -} - +#if 0 static void dispmap_map_create(Enesim_Surface **s) { uint32_t *d; @@ -46,26 +33,19 @@ } } +#endif -static void dispmap_1d_run(Enesim_Quality q) +void dispmap_bench(void) { Enesim_Surface *src = NULL; - Enesim_Surface *dst= NULL; - Enesim_Surface *map= NULL; - Enesim_Operator op; - uint32_t *s; - uint32_t *d; - uint32_t *m; - int t; - double start, end; - char name[256]; + Enesim_Surface *dst = NULL; + Enesim_Surface *map = NULL; + Enesim_Renderer *r; - snprintf(name, 256, "dispmap_%s", quality_name_get(q)); - if (!enesim_dispmap_1d_op_get(&op, opt_cpu, opt_fmt, q, opt_fmt)) - { - printf("%s [NOT BUILT]\n", name); - return; - } + printf("*********************\n"); + printf("* Dispmap Bench *\n"); + printf("*********************\n"); + #if 1 surfaces_create(&src, opt_fmt, &dst, opt_fmt, &map, opt_fmt); #else @@ -73,40 +53,9 @@ dispmap_map_create(&map); #endif - s = enesim_surface_data_get(src); - m = enesim_surface_data_get(map); - start = get_time(); - for (t = 0; t < opt_times; t++) - { - int h = opt_height; - int y = 0; - - d = enesim_surface_data_get(dst); - while (h--) - { - enesim_operator_dispmap_1d(&op, - s, opt_width, opt_width, opt_height, - 64, m, - 0, y, opt_width, d); - y++; - d += opt_width; - m += opt_width; - } - } - end = get_time(); - printf("%s [%3.3f sec]\n", name, end - start); - test_finish(name, ENESIM_FILL, dst, src, NULL, NULL); - enesim_surface_delete(map); + r = enesim_renderer_dispmap_new(); + enesim_renderer_dispmap_map_set(r, map); + enesim_renderer_dispmap_src_set(r, src); + enesim_renderer_dispmap_scale_set(r, 10); + renderer_run(r, dst, "Dispmap", "dispmap"); } - -void dispmap_bench(void) -{ - Enesim_Quality q; - - printf("*********************\n"); - printf("* Dispmap Bench *\n"); - printf("*********************\n"); - - //for (q = 0; q < ENESIM_QUALITIES; q++) - dispmap_1d_run(ENESIM_FAST); -} Modified: trunk/PROTO/enesim/examples/enesim_bench_raddist.c =================================================================== --- trunk/PROTO/enesim/examples/enesim_bench_raddist.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/examples/enesim_bench_raddist.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -2,75 +2,23 @@ /****************************************************************************** * Raddist benchmark functions * ******************************************************************************/ -static const char * quality_name_get(Enesim_Quality q) -{ - switch (q) - { - case ENESIM_FAST: - return "fast"; - - case ENESIM_GOOD: - return "good"; - - default: - return NULL; - } -} - -static void raddist_1d_run(Enesim_Quality q) -{ - Enesim_Surface *src = NULL; - Enesim_Surface *dst= NULL; - Enesim_Compositor_Span op; - uint32_t *s; - uint32_t *d; - int t; - double start, end; - char name[256]; - - snprintf(name, 256, "raddist_%s", quality_name_get(q)); - if (!enesim_raddist_1d_op_get(&op, opt_cpu, opt_fmt, q, opt_fmt)) - { - printf("%s [NOT BUILT]\n", name); - return; - } - surfaces_create(&src, opt_fmt, &dst, opt_fmt, NULL, 0); - - s = enesim_surface_data_get(src); - start = get_time(); - for (t = 0; t < opt_times; t++) - { - int h = opt_height; - int y = 0; - - d = enesim_surface_data_get(dst); - while (h--) - { - enesim_operator_raddist_1d(&op, - s, opt_width, opt_width, opt_height, - 100, opt_height / 2, hypot(opt_width, opt_height), 0, - //0, 0, hypot(opt_width/2.0, opt_height/2.0), 0, - //0, 0, opt_width / 2, 1, - 0, y, opt_width, d); - y++; - d += opt_width; - } - } - end = get_time(); - printf("%s [%3.3f sec]\n", name, end - start); - test_finish(name, ENESIM_FILL, dst, src, NULL, NULL); -} /* * TODO transform with a mask/color and without */ void raddist_bench(void) { - Enesim_Quality q; + Enesim_Surface *src = NULL; + Enesim_Surface *dst = NULL; + Enesim_Renderer *r; printf("*********************\n"); printf("* Raddist Bench *\n"); printf("*********************\n"); - - //for (q = 0; q < ENESIM_QUALITIES; q++) - raddist_1d_run(ENESIM_FAST); + surfaces_create(&src, opt_fmt, &dst, opt_fmt, NULL, 0); + r = enesim_renderer_raddist_new(); + enesim_renderer_raddist_src_set(r, src); + enesim_renderer_raddist_radius_set(r, opt_width / 2); + enesim_renderer_raddist_scale_set(r, 0.5); + enesim_renderer_raddist_center_set(r, opt_width / 2, opt_height / 2); + renderer_run(r, dst, "Raddist", "raddist"); } Modified: trunk/PROTO/enesim/examples/enesim_bench_renderer.c =================================================================== --- trunk/PROTO/enesim/examples/enesim_bench_renderer.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/examples/enesim_bench_renderer.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -108,10 +108,8 @@ { Enesim_Matrix m; char rfname[256]; - char *mtype; - mtype = _matrix_name_get(mt); - snprintf(rfname, 256, "%s_%s", fname, mtype); + snprintf(rfname, 256, "%s_%s", fname, _matrix_name_get(mt)); _matrix_get(mt, &m); enesim_renderer_transform_set(r, &m); Modified: trunk/PROTO/enesim/src/include/enesim_renderer.h =================================================================== --- trunk/PROTO/enesim/src/include/enesim_renderer.h 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/include/enesim_renderer.h 2009-08-19 08:56:37 UTC (rev 41871) @@ -78,7 +78,17 @@ EAPI void enesim_renderer_stripes_thickness_set(Enesim_Renderer *p, float thickness_0, float thickness_1); +EAPI Enesim_Renderer * enesim_renderer_dispmap_new(void); +EAPI void enesim_renderer_dispmap_map_set(Enesim_Renderer *r, Enesim_Surface *map); +EAPI void enesim_renderer_dispmap_src_set(Enesim_Renderer *r, Enesim_Surface *src); +EAPI void enesim_renderer_dispmap_scale_set(Enesim_Renderer *r, float scale); +EAPI Enesim_Renderer * enesim_renderer_raddist_new(void); +EAPI void enesim_renderer_raddist_radius_set(Enesim_Renderer *r, float radius); +EAPI void enesim_renderer_raddist_scale_set(Enesim_Renderer *r, float scale); +EAPI void enesim_renderer_raddist_src_set(Enesim_Renderer *r, Enesim_Surface *src); +EAPI void enesim_renderer_raddist_center_set(Enesim_Renderer *r, int ox, int oy); + EAPI Enesim_Renderer * enesim_renderer_importer_new(void); EAPI void enesim_renderer_importer_angle_set(Enesim_Renderer *r, Enesim_Angle angle); EAPI void enesim_renderer_importer_data_set(Enesim_Renderer *r, Enesim_Converter_Data *cdata); Modified: trunk/PROTO/enesim/src/include/private/format_argb8888.h =================================================================== --- trunk/PROTO/enesim/src/include/private/format_argb8888.h 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/include/private/format_argb8888.h 2009-08-19 08:56:37 UTC (rev 41871) @@ -259,4 +259,48 @@ (((((c) & 0x00ff00ff) * (a) + 0xff00ff) >> 8) & 0x00ff00ff) ); } +/* + * + */ +static inline uint32_t argb8888_sample_good(uint32_t *data, int stride, int sw, + int sh, Eina_F16p16 xx, Eina_F16p16 yy, int x, int y) +{ + if (x < sw && y < sh && x >= 0 && y >= 0) + { + uint32_t p0 = 0, p1 = 0, p2 = 0, p3 = 0; + + data = data + (stride * y) + x; + + if ((x > -1) && (y > - 1)) + p0 = *data; + + if ((y > -1) && ((x + 1) < sw)) + p1 = *(data + 1); + + if ((y + 1) < sh) + { + if (x > -1) + p2 = *(data + stride); + if ((x + 1) < sw) + p3 = *(data + stride + 1); + } + + if (p0 | p1 | p2 | p3) + { + uint16_t ax, ay; + + ax = 1 + ((xx & 0xffff) >> 8); + ay = 1 + ((yy & 0xffff) >> 8); + + p0 = argb8888_interp_256(ax, p1, p0); + p2 = argb8888_interp_256(ax, p3, p2); + p0 = argb8888_interp_256(ay, p2, p0); + } + return p0; + } + else + return 0; +} + + #endif /* FORMAT_ARGB8888_H_*/ Modified: trunk/PROTO/enesim/src/lib/renderer/Makefile.am =================================================================== --- trunk/PROTO/enesim/src/lib/renderer/Makefile.am 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/lib/renderer/Makefile.am 2009-08-19 08:56:37 UTC (rev 41871) @@ -16,4 +16,6 @@ circle.c \ ellipse.c \ stripes.c \ +dispmap.c \ +raddist.c \ importer.c Modified: trunk/PROTO/enesim/src/lib/renderer/checker.c =================================================================== --- trunk/PROTO/enesim/src/lib/renderer/checker.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/lib/renderer/checker.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -260,14 +260,13 @@ } } -static void _state_cleanup(Checker *s) +static void _state_cleanup(Enesim_Renderer *r) { } static Eina_Bool _state_setup(Enesim_Renderer *r) { - Enesim_Matrix_Type mt; Checker *c = (Checker *)r; if (r->matrix.type == ENESIM_MATRIX_IDENTITY) Modified: trunk/PROTO/enesim/src/lib/renderer/dispmap.c =================================================================== --- trunk/PROTO/enesim/src/lib/renderer/dispmap.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/lib/renderer/dispmap.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -17,102 +17,199 @@ */ #include "Enesim.h" #include "enesim_private.h" +/* + * P'(x,y) <- P(x + scale * (XC(x,y) - .5), y + scale * (YC(x,y) - .5)) + */ /*============================================================================* * Local * *============================================================================*/ -/* P'(x,y) <- P( x + scale * (XC(x,y) - .5), y + scale * (YC(x,y) - .5)) */ -static void _dm_argb8888_fast_argb8888(uint32_t *src, uint32_t spitch, uint32_t sw, uint32_t sh, - float scale, uint32_t *map, - uint32_t dx, uint32_t dy, uint32_t dlen, - uint32_t *dst) +typedef struct _Dispamp { - uint32_t *e = dst + dlen; + Enesim_Renderer base; + Enesim_Surface *map; + Enesim_Surface *src; + float scale; +} Dispmap; - while (dst < e) +static void _argb8888_a_b_span_identity(Enesim_Renderer *r, int x, int y, + unsigned int len, uint32_t *dst) +{ + Dispmap *d = (Dispmap *)r; + uint32_t *end = dst + len; + uint32_t *map, *src; + int mstride; + int sstride; + int sw, sh, mw, mh; + Eina_F16p16 scale, xx, yy; + + /* setup the parameters */ + enesim_surface_size_get(d->src, &sw, &sh); + enesim_surface_size_get(d->map, &mw, &mh); + mstride = enesim_surface_stride_get(d->map); + sstride = enesim_surface_stride_get(d->src); + map = enesim_surface_data_get(d->map); + src = enesim_surface_data_get(d->src); + + map = map + (mstride * y) + x; + /* FIXME put this on the setup */ + yy = eina_f16p16_int_from(y); + scale = eina_f16p16_float_from(d->scale); + + while (dst < end) { + Eina_F16p16 sxx, syy, vx, vy; + int sx, sy; + uint32_t p0; + uint16_t m0; + uint16_t m1; + + if (x < 0 || x >= mw || y < 0 || y >= mh) + goto next; + + xx = eina_f16p16_int_from(x); + + m0 = *map >> 24; + m1 = *map & 0xff; + /* FIXME define fixed(255) as a constant */ + vx = eina_f16p16_int_from(m0 - 127); + vx = eina_f16p16_mul((((int64_t)(vx) << 16) / eina_f16p16_int_from(255)), scale); + + vy = eina_f16p16_int_from(m1 - 127); + vy = eina_f16p16_mul((((int64_t)(vy) << 16) / eina_f16p16_int_from(255)), scale); + + sxx = xx + vx; + syy = yy + vy; + + sx = eina_f16p16_int_to(sxx); + sy = eina_f16p16_int_to(syy); + p0 = argb8888_sample_good(src, sstride, sw, sh, sxx, syy, sx, sy); + +next: + *dst++ = p0; + map++; + x++; + } +} + +static void _argb8888_a_b_span_affine(Enesim_Renderer *r, int x, int y, + unsigned int len, uint32_t *dst) +{ + Dispmap *d = (Dispmap *)r; + uint32_t *end = dst + len; + uint32_t *map, *src; + int mstride; + int sstride; + int sw, sh, mw, mh; + Eina_F16p16 scale, xx, yy; + + /* setup the parameters */ + enesim_surface_size_get(d->src, &sw, &sh); + enesim_surface_size_get(d->map, &mw, &mh); + mstride = enesim_surface_stride_get(d->map); + sstride = enesim_surface_stride_get(d->src); + map = enesim_surface_data_get(d->map); + src = enesim_surface_data_get(d->src); + + /* TODO move by the origin */ + yy = eina_f16p16_int_from(y); + xx = eina_f16p16_int_from(x); + yy = eina_f16p16_mul(r->matrix.values.yx, xx) + + eina_f16p16_mul(r->matrix.values.yy, yy) + r->matrix.values.yz; + xx = eina_f16p16_mul(r->matrix.values.xx, xx) + + eina_f16p16_mul(r->matrix.values.xy, yy) + r->matrix.values.xz; + + scale = eina_f16p16_float_from(d->scale); + + while (dst < end) + { + Eina_F16p16 sxx, syy, vx, vy; + int sx, sy; uint32_t p0 = 0; - uint16_t a; - int32_t sx, sy; - int32_t sxx, syy; -#if FIXED - int32_t vx, vy; -#else - float vx, vy; -#endif - /* first we transform input coords to src coords... */ - if (dx >= sw || dy >= sh) + uint16_t m0; + uint16_t m1; + + x = eina_f16p16_int_to(xx); + y = eina_f16p16_int_to(yy); + + if (x < 0 || x >= mw || y < 0 || y >= mh) goto next; - a = *(map) >> 24; - /* - { - uint32_t tmp = *map; - a = tmp >> 24; - if (a > 0 && a < 255) - a = ((tmp >> 16) & 0xff) * 255 / a; - else - a = a; - }*/ -#if FIXED - vx = ((a - 127) * 65536) / (255 * 65536); - vy = ((a - 127) * 65536) / (255 * 65536); - sxx = (dx * 65535) + (scale * 65536 * vx); - syy = (dy * 65535) + (scale * 65536 * vy); -#else - vx = (a / 255.0) - 0.5; - vy = (a / 255.0) - 0.5; - sxx = (dx + (scale * vx)) * 65536; - syy = (dy + (scale * vy)) * 65536; + m0 = *(map + (mstride * y) + x); + m1 = m0 & 0xff; + m0 = m0 >> 24; -#endif - sx = (sxx >> 16); - sy = (syy >> 16); - /* ... then we sample the src. */ - if ( (((unsigned) (sx + 1)) < (sw + 1)) && (((unsigned) (sy + 1)) < (sh + 1)) ) - { - unsigned int p3 = 0, p2 = 0, p1 = 0; - unsigned int *p = src + (sy * spitch) + sx; -#if 0 + /* FIXME define fixed(255) as a constant */ + vx = eina_f16p16_int_from(m0 - 127); + vx = eina_f16p16_mul((((int64_t)(vx) << 16) / eina_f16p16_int_from(255)), scale); - if ((sx > -1) && (sy > -1)) - p0 = *p; - if ((sy > -1) && ((sx + 1) < sw)) - p1 = *(p + 1); - if ((sy + 1) < sh) - { - if (sx > -1) - p2 = *(p + spitch); - if ((sx + 1) < sw) - p3 = *(p + spitch + 1); - } - if (p0 | p1 | p2 | p3) - { - sx = 1 + ((sxx >> 8) & 0xff); - sy = 1 + ((syy >> 8) & 0xff); + vy = eina_f16p16_int_from(m1 - 127); + vy = eina_f16p16_mul((((int64_t)(vy) << 16) / eina_f16p16_int_from(255)), scale); - p0 = INTERP_256(sx, p1, p0); - p2 = INTERP_256(sx, p3, p2); - p0 = INTERP_256(sy, p2, p0); - } -#else - if ((sx > -1) && (sy > -1)) - p0 = *p; -#endif - //printf("moving %d %d (%d)\n", vx >> 16, vy >> 16, a); - //printf("moving %g %g (%d)\n", vx, vy, a); - //printf("from %d %d to %d %d\n", dx, dy, sx, sy); - } + sxx = xx + vx; + syy = yy + vy; + + sx = eina_f16p16_int_to(sxx); + sy = eina_f16p16_int_to(syy); + p0 = argb8888_sample_good(src, sstride, sw, sh, sxx, syy, sx, sy); + next: *dst++ = p0; map++; - dx++; + yy += r->matrix.values.yx; + xx += r->matrix.values.xx; } } + + + +static void _state_cleanup(Enesim_Renderer *r) +{ + +} + +static Eina_Bool _state_setup(Enesim_Renderer *r) +{ + if (r->matrix.type == ENESIM_MATRIX_IDENTITY) + r->span = ENESIM_RENDERER_SPAN_DRAW(_argb8888_a_b_span_identity); + else if (r->matrix.type == ENESIM_MATRIX_AFFINE) + r->span = ENESIM_RENDERER_SPAN_DRAW(_argb8888_a_b_span_affine); + return EINA_TRUE; +} /*============================================================================* * API * *============================================================================*/ -EAPI Enesim_Renderer * enesim_dispmap_new(void) +EAPI Enesim_Renderer * enesim_renderer_dispmap_new(void) { + Dispmap *d; + Enesim_Renderer *r; + d = calloc(1, sizeof(Dispmap)); + + r = (Enesim_Renderer *)d; + enesim_renderer_init(r); + r->state_setup = ENESIM_RENDERER_STATE_SETUP(_state_setup); + + return r; } +EAPI void enesim_renderer_dispmap_map_set(Enesim_Renderer *r, Enesim_Surface *map) +{ + Dispmap *d = (Dispmap *)r; + + d->map = map; +} + + +EAPI void enesim_renderer_dispmap_src_set(Enesim_Renderer *r, Enesim_Surface *src) +{ + Dispmap *d = (Dispmap *)r; + + d->src = src; +} + +EAPI void enesim_renderer_dispmap_scale_set(Enesim_Renderer *r, float scale) +{ + Dispmap *d = (Dispmap *)r; + + d->scale = scale; +} Modified: trunk/PROTO/enesim/src/lib/renderer/raddist.c =================================================================== --- trunk/PROTO/enesim/src/lib/renderer/raddist.c 2009-08-19 07:54:13 UTC (rev 41870) +++ trunk/PROTO/enesim/src/lib/renderer/raddist.c 2009-08-19 08:56:37 UTC (rev 41871) @@ -17,70 +17,117 @@ */ #include "Enesim.h" #include "enesim_private.h" + /*============================================================================* * Local * *============================================================================*/ -static void _rd_argb8888_fast_argb8888(uint32_t *src, uint32_t spitch, uint32_t sw, uint32_t sh, - float x0, float y0, float r0, float scale, - uint32_t x, uint32_t y, uint32_t dlen, - uint32_t *dst) +typedef struct _Raddist { - uint32_t *e = dst + dlen; - float r0_inv = 1.0f/r0; - int32_t dx = x - x0; - int32_t dy = y - y0; + Enesim_Renderer base; + Enesim_Surface *src; + float scale; + float radius; + /* the x and y origin of the circle */ + int orx, ory; +} Raddist; - while (dst < e) +static void _span_identity(Enesim_Renderer *r, int x, int y, + unsigned int len, uint32_t *dst) +{ + Raddist *rd = (Raddist *)r; + uint32_t *end = dst + len; + float r_inv; + uint32_t *src; + int sw, sh; + int sstride; + + /* setup the parameters */ + enesim_surface_size_get(rd->src, &sw, &sh); + sstride = enesim_surface_stride_get(rd->src); + src = enesim_surface_data_get(rd->src); + /* FIXME move this to the setup */ + r_inv = 1.0f / rd->radius; + + x -= rd->orx; + y -= rd->ory; + + while (dst < end) { - /* first we transform input coords to src coords... */ - unsigned int p0 = 0; - int sxx, syy, sx, sy; - float r = hypot(dx, dy); + Eina_F16p16 sxx, syy; + uint32_t p0; + int sx, sy; + float r = hypot(x, y); - r = (((scale * (r0 - r)) + r) * r0_inv); - sxx = ((r * dx) + x0) * 65536; sx = (sxx >> 16); - syy = ((r * dy) + y0) * 65536; sy = (syy >> 16); - /* ... then we sample the src. */ - if ( (((unsigned) (sx + 1)) < (sw + 1)) && (((unsigned) (sy + 1)) < (sh + 1)) ) - { - unsigned int p3 = 0, p2 = 0, p1 = 0; - unsigned int *p = src + (sy * spitch) + sx; -#if 0 + r = (((rd->scale * (rd->radius - r)) + r) * r_inv); + sxx = eina_f16p16_int_from((r * x) + rd->orx); + syy = eina_f16p16_int_from((r * y) + rd->ory); - if ((sx > -1) && (sy > -1)) - p0 = *p; - if ((sy > -1) && ((sx + 1) < sw)) - p1 = *(p + 1); - if ((sy + 1) < sh) - { - if (sx > -1) - p2 = *(p + spitch); - if ((sx + 1) < sw) - p3 = *(p + spitch + 1); - } - if (p0 | p1 | p2 | p3) - { - sx = 1 + ((sxx >> 8) & 0xff); - sy = 1 + ((syy >> 8) & 0xff); + sy = (syy >> 16); + sx = (sxx >> 16); + p0 = argb8888_sample_good(src, sstride, sw, sh, sxx, syy, sx, sy); - p0 = INTERP_256(sx, p1, p0); - p2 = INTERP_256(sx, p3, p2); - p0 = INTERP_256(sy, p2, p0); - } -#else - if ((sx > -1) && (sy > -1)) - p0 = *p; -#endif - } *dst++ = p0; - dx++; + x++; } } + +static Eina_Bool _state_setup(Enesim_Renderer *r) +{ + r->span = ENESIM_RENDERER_SPAN_DRAW(_span_identity); +#if 0 + if (r->matrix.type == ENESIM_MATRIX_IDENTITY) + r->span = ENESIM_RENDERER_SPAN_DRAW(_argb8888_a_b_span_identity); + else if (r->matrix.type == ENESIM_MATRIX_AFFINE) + r->span = ENESIM_RENDERER_SPAN_DRAW(_argb8888_a_b_span_affine); +#endif + return EINA_TRUE; +} /*============================================================================* * API * *============================================================================*/ EAPI Enesim_Renderer * enesim_renderer_raddist_new(void) { + Raddist *rd; + Enesim_Renderer *r; + rd = calloc(1, sizeof(Raddist)); + + r = (Enesim_Renderer *)rd; + enesim_renderer_init(r); + r->state_setup = ENESIM_RENDERER_STATE_SETUP(_state_setup); + + return r; } +EAPI void enesim_renderer_raddist_radius_set(Enesim_Renderer *r, float radius) +{ + Raddist *rd = (Raddist *)r; + + if (!radius) + radius = 1; + rd->radius = radius; +} + +EAPI void enesim_renderer_raddist_scale_set(Enesim_Renderer *r, float scale) +{ + Raddist *rd = (Raddist *)r; + + if (scale > 1.0) + scale = 1.0; + rd->scale = scale; +} + +EAPI void enesim_renderer_raddist_src_set(Enesim_Renderer *r, Enesim_Surface *src) +{ + Raddist *rd = (Raddist *)r; + + rd->src = src; +} + +EAPI void enesim_renderer_raddist_center_set(Enesim_Renderer *r, int ox, int oy) +{ + Raddist *rd = (Raddist *)r; + + rd->orx = ox; + rd->ory = oy; +} |