EAPI int evas_common_tilebuf_del_redraw(Tilebuf *tb, int x, int y, int w, int h) { #ifdef RECTUPDATE int i; for (i = 0; i < h; i++) evas_common_regionbuf_span_del(tb->rb, x, x + w - 1, y + i); #elif defined(EVAS_RECT_SPLIT) rect_t r; if (!tb->rects.head) return 0; if ((w <= 0) || (h <= 0)) return 0; RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h); if ((w <= 0) || (h <= 0)) return 0; x += 1; y += 1; x >>= 1; y >>= 1; w -= 1; w >>= 1; h -= 1; h >>= 1; if ((w <= 0) || (h <= 0)) return 0; rect_init(&r, x, y, w, h); //ERR("ACCOUNTING: del_redraw: %4d,%4d %3dx%3d", x, y, w, h); rect_list_del_split_strict(&tb->rects, r); tb->need_merge = 1; return 0; #else int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy; int num; num = 0; /* wipes out any motion vectors in tiles it touches into redraws */ if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) && tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2)) { Tilebuf_Tile *tbt; int delta_y; int delta_x; if (!tfx1) tx1++; if (!tfx2) tx2--; if (!tfy1) ty1++; if (!tfy2) ty2--; tbt = &(TILE(tb, tx1, ty1)); delta_x = tx2 - tx1 + 1; delta_y = ty2 - ty1 + 1; for (yy = delta_y; yy > 0; yy--) { Tilebuf_Tile *tbti; tbti = tbt; for (xx = delta_x; xx > 0; xx--) { tbti->redraw = 0; tbti++; } tbt += tb->tiles.w; } num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1); } return num; #endif }
EAPI int evas_common_tilebuf_del_redraw(Tilebuf *tb, int x, int y, int w, int h) { #ifdef RECTUPDATE /* int i; for (i = 0; i < h; i++) evas_common_regionbuf_span_del(tb->rb, x, x + w - 1, y + i); */ #elif defined(EVAS_RECT_SPLIT) rect_t r; if (!tb->rects.head) return 0; if ((w <= 0) || (h <= 0)) return 0; RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h); if ((w <= 0) || (h <= 0)) return 0; /* we dont need to do this fuzz stuff - it actually creates overdraw bugs * when evas shouldnt draw at all. x += 1; y += 1; x >>= 1; y >>= 1; w -= 1; w >>= 1; h -= 1; h >>= 1; if ((w <= 0) || (h <= 0)) return 0; */ // optimize a common case -> deleting the exact same rect 2x in a row if ((tb->prev_del.x == x) && (tb->prev_del.y == y) && (tb->prev_del.w == w) && (tb->prev_del.h == h)) return 1; tb->prev_del.x = x; tb->prev_del.y = y; tb->prev_del.w = w; tb->prev_del.h = h; tb->prev_add.w = 0; tb->prev_add.h = 0; rect_init(&r, x, y, w, h); rect_list_del_split_strict(&tb->rects, r); tb->need_merge = 1; return 0; #else /* int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy; int num; num = 0; // wipes out any motion vectors in tiles it touches into redraws if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) && tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2)) { Tilebuf_Tile *tbt; int delta_y; int delta_x; if (!tfx1) tx1++; if (!tfx2) tx2--; if (!tfy1) ty1++; if (!tfy2) ty2--; tbt = &(TILE(tb, tx1, ty1)); delta_x = tx2 - tx1 + 1; delta_y = ty2 - ty1 + 1; for (yy = delta_y; yy > 0; yy--) { Tilebuf_Tile *tbti; tbti = tbt; for (xx = delta_x; xx > 0; xx--) { tbti->redraw = 0; tbti++; } tbt += tb->tiles.w; } num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1); } return num; */ #endif }