diff options
author | Richard Wilson <rjw@netsurf-browser.org> | 2006-07-02 01:36:02 +0000 |
---|---|---|
committer | Richard Wilson <rjw@netsurf-browser.org> | 2006-07-02 01:36:02 +0000 |
commit | 467d9679f87b3d8f24bc882283ceb67873438843 (patch) | |
tree | 9018e21597098a825f5e9c59a45a3938dc9ee8b2 /desktop | |
parent | 6e8ba3f4bb68957f2589fb4cddce4fe7a1607313 (diff) | |
download | netsurf-467d9679f87b3d8f24bc882283ceb67873438843.tar.gz netsurf-467d9679f87b3d8f24bc882283ceb67873438843.tar.bz2 |
Totally knock out boxes as early into the tree as possible to improve efficiency. Fix incorrect buffer check.
svn path=/trunk/netsurf/; revision=2688
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/knockout.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/desktop/knockout.c b/desktop/knockout.c index e6bffe6c8..4594332f0 100644 --- a/desktop/knockout.c +++ b/desktop/knockout.c @@ -16,10 +16,11 @@ #include "netsurf/image/bitmap.h" #include "netsurf/utils/log.h" +#define NDEBUG -#define KNOCKOUT_BOXES 512 /* 28 bytes each */ -#define KNOCKOUT_ENTRIES 4096 /* 40 bytes each */ -#define KNOCKOUT_POLYGONS 512 /* 4 bytes each */ +#define KNOCKOUT_BOXES 768 /* 28 bytes each */ +#define KNOCKOUT_ENTRIES 3072 /* 40 bytes each */ +#define KNOCKOUT_POLYGONS 3072 /* 4 bytes each */ struct knockout_box; struct knockout_entry; @@ -239,6 +240,12 @@ bool knockout_plot_end(void) bool success = true; struct knockout_box *box; + /* debugging information */ + LOG(("Entries are %i/%i, %i/%i, %i/%i", + knockout_entry_cur, KNOCKOUT_ENTRIES, + knockout_box_cur, KNOCKOUT_BOXES, + knockout_polygon_cur, KNOCKOUT_POLYGONS)); + /* release our plotter */ plot = real_plot; @@ -387,6 +394,8 @@ bool knockout_plot_end(void) * \param x1 the right edge of the removal box * \param y1 the top edge of the removal box * \param box the current box set to consider + * \param c the colour the box is going to be, or -1 for a bitmap + * \return whether the area */ void knockout_calculate(int x0, int y0, int x1, int y1, struct knockout_box *box) { @@ -396,29 +405,28 @@ void knockout_calculate(int x0, int y0, int x1, int y1, struct knockout_box *box for (parent = box; parent; parent = parent->next) { if (parent->deleted) continue; + /* get the parent dimensions */ + nx0 = parent->bbox.x0; + ny0 = parent->bbox.y0; + nx1 = parent->bbox.x1; + ny1 = parent->bbox.y1; + /* reject non-overlapping boxes */ - if ((parent->bbox.x0 >= x1) || - (parent->bbox.x1 <= x0) || - (parent->bbox.y0 >= y1) || - (parent->bbox.y1 <= y0)) + if ((nx0 >= x1) || (nx1 <= x0) || (ny0 >= y1) || (ny1 <= y0)) + continue; + + /* check for a total knockout */ + if ((x0 <= nx0) && (x1 >= nx1) && (y0 <= ny0) && (y1 >= ny1)) { + parent->deleted = true; continue; + } + /* has the box been replaced by children? */ if (parent->child) { knockout_calculate(x0, y0, x1, y1, parent->child); } else { - nx0 = parent->bbox.x0; - ny0 = parent->bbox.y0; - nx1 = parent->bbox.x1; - ny1 = parent->bbox.y1; - - /* check for a total knockout */ - if ((x0 <= nx0) && (x1 >= nx1) && (y0 <= ny0) && (y1 >= ny1)) { - parent->deleted = true; - continue; - } - /* we need a maximum of 4 child boxes */ - if (knockout_box_cur + 4 >= KNOCKOUT_ENTRIES) { + if (knockout_box_cur + 4 >= KNOCKOUT_BOXES) { knockout_plot_start(&real_plot); return; } |