From 87e5e70a9d888ce93ed807bb0d39d1738241ad9b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 23 Nov 2009 10:07:07 +0000 Subject: [PATCH] fix anothe rmap draw bug. SVN revision: 43917 --- legacy/evas/src/lib/canvas/evas_render.c | 14 ++++- .../src/lib/engines/common/evas_map_image.c | 57 ++++++++++++++++++- legacy/evas/src/lib/include/evas_inline.x | 2 +- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_render.c b/legacy/evas/src/lib/canvas/evas_render.c index d034da3e7b..71fddd7ee7 100644 --- a/legacy/evas/src/lib/canvas/evas_render.c +++ b/legacy/evas/src/lib/canvas/evas_render.c @@ -551,9 +551,13 @@ pending_change(void *data, void *gdata __UNUSED__) obj = data; if (obj->delete_me) return EINA_FALSE; + if (obj->pre_render_done) + { + RD(" OBJ [%p] pending change %i -> 0, pre %i\n", obj, obj->changed, obj->pre_render_done); obj->pre_render_done = 0; -// if (!obj->layer) - obj->changed = 0; +//// FIXME: this wipes out changes + obj->changed = 0; + } return obj->changed ? EINA_TRUE : EINA_FALSE; } @@ -590,6 +594,9 @@ evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface, return; } + // set render_pre - for child objs that may not have gotten it. + obj->pre_render_done = 1; + if (_evas_render_has_map(obj)) { const Evas_Map_Point *p, *p_end; @@ -1051,8 +1058,10 @@ evas_render_updates_internal(Evas *e, obj = eina_array_data_get(&e->active_objects, i); obj->pre_render_done = 0; + RD(" OBJ [%p] post... %i %i\n", obj, obj->changed, do_draw); if ((obj->changed) && (do_draw)) { + RD(" OBJ [%p] post... func1\n", obj); obj->func->render_post(obj); obj->restack = 0; obj->changed = 0; @@ -1060,6 +1069,7 @@ evas_render_updates_internal(Evas *e, else if ((obj->cur.map != obj->prev.map) || (obj->cur.usemap != obj->prev.usemap)) { + RD(" OBJ [%p] post... func2\n", obj); obj->func->render_post(obj); obj->restack = 0; obj->changed = 0; diff --git a/legacy/evas/src/lib/engines/common/evas_map_image.c b/legacy/evas/src/lib/engines/common/evas_map_image.c index 5042f4c0ab..14a3c02bae 100644 --- a/legacy/evas/src/lib/engines/common/evas_map_image.c +++ b/legacy/evas/src/lib/engines/common/evas_map_image.c @@ -24,7 +24,7 @@ typedef struct _Span Span; struct _Span { int x1, x2; - FPc o1, o2; + FPc o1, o2, z1, z2; FPc u[2], v[2]; DATA32 col[2]; }; @@ -43,6 +43,7 @@ _interp(int x1, int x2, int p, FPc u1, FPc u2) p -= x1; u = u2 - u1; u = (u * p) / (x2 + 1); + // FIXME: do z persp return u1 + u; } @@ -54,6 +55,7 @@ _interp_col(int x1, int x2, int p, DATA32 col1, DATA32 col2) x2 -= x1; p -= x1; p = (p << 8) / (x2 + 1); + // FIXME: do z persp return INTERP_256(p, col2, col1); } @@ -68,6 +70,7 @@ _limit(Span *s, int c1, int c2, int nocol) s->col[0] = _interp_col(s->x1, s->x2, c1, s->col[0], s->col[1]); s->x1 = c1; s->o1 = c1 << FP; + // FIXME: do s->z1 } if (s->x2 > c2) { @@ -77,6 +80,7 @@ _limit(Span *s, int c1, int c2, int nocol) s->col[1] = _interp_col(s->x1, s->x2, c2, s->col[0], s->col[1]); s->x2 = c2; s->o2 = c2 << FP; + // FIXME: do s->z2 } } @@ -140,7 +144,6 @@ _calc_spans(RGBA_Map_Point *p, Line *spans, int ystart, int yend, int cx, int cy } return; } - for (y = ystart; y <= yend; y++) { int nocol = 1; @@ -174,16 +177,64 @@ _calc_spans(RGBA_Map_Point *p, Line *spans, int ystart, int yend, int cx, int cy t = (((y << FP) + (FP1 - 1)) - p[e1].y) >> FP; x = p[e2].x - p[e1].x; x = p[e1].x + ((x * t) / h); + +/* + // FIXME: 3d accuracy here + // XXX t needs adjusting. above its a linear interp point + // only. + // + // // FIXME: do in fixed pt. reduce divides + evas_common_cpu_end_opt(); + // + int foc = 512, z0 = 0, px = 320, py = 240; // FIXME: need from map points + // + float focf, hf; + float z1, z2, y1, y2, dz, dy, zt, dydz, yt; + focf = foc; + hf = h; + + // adjust for fixed point and focal length and z0 for map + z1 = (p[e1].z >> FP) - z0 + foc; + z2 = (p[e2].z >> FP) - z0 + foc; + // deltas + dz = z1 - z2; + + if (dz != 0) + { + int pt; + + // adjust for perspective point (being 0 0) + y1 = (p[e1].y >> FP) - py; + y2 = (p[e2].y >> FP) - py; + + // correct for x &y not being in world coords - screen coords + y1 = (y1 * z1) / focf; + y2 = (y2 * z2) / focf; + + // deltas + dy = y1 - y2; + + yt = y - py; + dydz = dy / dz; + + zt = (y2 - (dydz * z2)) / ((yt / focf) - dydz); + + pt = t; + t = ((z1 - zt) * hf) / dz; + } + */ u = p[e2].u - p[e1].u; u = p[e1].u + ((u * t) / h); v = p[e2].v - p[e1].v; v = p[e1].v + ((v * t) / h); - + + // FIXME: 3d accuracy for color too t256 = (t << 8) / h; // maybe * 255? col[i] = INTERP_256(t256, p[e2].col, p[e1].col); + // FIXME: store z persp uv[i][1] = v; uv[i][0] = u; edge[i][2] = x >> FP; diff --git a/legacy/evas/src/lib/include/evas_inline.x b/legacy/evas/src/lib/include/evas_inline.x index 543a6a8707..926924a489 100644 --- a/legacy/evas/src/lib/include/evas_inline.x +++ b/legacy/evas/src/lib/include/evas_inline.x @@ -5,7 +5,7 @@ static inline int evas_object_was_visible(Evas_Object *obj) { if ((obj->prev.visible) && - (obj->prev.cache.clip.visible) && + ((obj->prev.cache.clip.visible) || (obj->smart.smart)) && (obj->prev.cache.clip.a > 0)) { if (obj->func->was_visible)