[gtk+/broadway: 44/71] [broadway] Add some fuzz to rectangle scanner
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/broadway: 44/71] [broadway] Add some fuzz to rectangle scanner
- Date: Thu, 25 Nov 2010 21:18:58 +0000 (UTC)
commit 2e1f6e09e59c761f0a7706221bbfba50396876a2
Author: Alexander Larsson <alexl redhat com>
Date: Mon Nov 22 13:07:49 2010 +0100
[broadway] Add some fuzz to rectangle scanner
We don't want a bazillion tiny rectangles, so add some fuzz
to the rectangle scanners so we get less but larger rectangles.
gdk/broadway/broadway.c | 70 +++++++++++++++++++++++++++++++++-------------
1 files changed, 50 insertions(+), 20 deletions(-)
---
diff --git a/gdk/broadway/broadway.c b/gdk/broadway/broadway.c
index aaf7d98..f7e2c7d 100644
--- a/gdk/broadway/broadway.c
+++ b/gdk/broadway/broadway.c
@@ -852,13 +852,43 @@ typedef struct {
} BroadwayBox;
static int
-is_set (unsigned char *data,
- int x, int y,
- int byte_stride)
+is_any_x_set (unsigned char *data,
+ int box_x1, int box_x2,
+ int x1, int x2, int y, int *x_set,
+ int byte_stride)
{
- return (*(uint32_t *)(data + y * byte_stride + x * 4)) != 0;
+ int w ;
+ uint32_t *ptr;
+
+ if (x1 < box_x1)
+ x1 = box_x1;
+
+ if (x2 > box_x2)
+ x2 = box_x2;
+
+ w = x2 - x1;
+ if (w > 0)
+ {
+ ptr = (uint32_t *)(data + y * byte_stride + x1 * 4);
+ while (w-- > 0)
+ {
+ if (*ptr != 0)
+ {
+ if (x_set)
+ *x_set = x1;
+ return 1;
+ }
+ ptr++;
+ x1++;
+ }
+ }
+ return 0;
}
+
+#define EXTEND_X_FUZZ 10
+#define EXTEND_Y_FUZZ 10
+
static int
extend_x_range (unsigned char *data,
int box_x1, int box_y1,
@@ -867,23 +897,18 @@ extend_x_range (unsigned char *data,
int byte_stride)
{
int extended = 0;
+ int new_x;
- if (*x1 > box_x1 && is_set (data, *x1, y, byte_stride))
+ while (is_any_x_set (data, box_x1, box_x2, *x1 - EXTEND_X_FUZZ, *x1, y, &new_x, byte_stride))
{
- while (*x1 > box_x1 && is_set (data, *x1 - 1, y, byte_stride))
- {
- (*x1)--;
- extended = 1;
- }
+ *x1 = new_x;
+ extended = 1;
}
- if (*x2 < box_x2 && is_set (data, *x2 - 1, y, byte_stride))
+ while (is_any_x_set (data, box_x1, box_x2, *x2, *x2 + EXTEND_X_FUZZ, y, &new_x, byte_stride))
{
- while (*x2 < box_x2 && is_set (data, *x2, y, byte_stride))
- {
- (*x2)++;
- extended = 1;
- }
+ *x2 = new_x + 1;
+ extended = 1;
}
return extended;
@@ -896,16 +921,21 @@ extend_y_range (unsigned char *data,
int x1, int x2, int *y,
int byte_stride)
{
- int x;
int extended = 0;
int found_set;
+ int yy, y2;
while (*y < box_y2)
{
found_set = 0;
- for (x = x1; x < x2; x++)
+
+ y2 = *y + EXTEND_Y_FUZZ;
+ if (y2 > box_y2)
+ y2 = box_y2;
+
+ for (yy = y2; yy > *y + 1; yy--)
{
- if (is_set (data, x, (*y) + 1, byte_stride))
+ if (is_any_x_set (data, box_x1, box_x2, x1, x2, yy - 1, NULL, byte_stride))
{
found_set = 1;
break;
@@ -913,7 +943,7 @@ extend_y_range (unsigned char *data,
}
if (!found_set)
break;
- (*y)++;
+ *y = yy;
extended = 1;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]