diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-03-22 10:48:48 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-03-22 10:54:08 +0000 |
commit | e961cdf568f4551bbd6bca6b7505fc9f9b0805f9 (patch) | |
tree | 64838a53602d368ae0d3fc8adb5c582289d41e3b /src/drm | |
parent | 844d8ea57d69c9a68fbec64f4438953850f7657f (diff) |
image: Special case wholly unbounded fixups.
In the event of an empty bounded rectangle, the computation of the
unbounded - bounded rectangles leads to negative areas, integer overflow
and death.
[And similarly for the derived surfaces.]
Diffstat (limited to 'src/drm')
-rw-r--r-- | src/drm/cairo-drm-i915-surface.c | 62 | ||||
-rw-r--r-- | src/drm/cairo-drm-i965-surface.c | 93 |
2 files changed, 85 insertions, 70 deletions
diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c index fbfa83543..bd169a384 100644 --- a/src/drm/cairo-drm-i915-surface.c +++ b/src/drm/cairo-drm-i915-surface.c @@ -705,40 +705,48 @@ i915_fixup_unbounded (i915_surface_t *dst, if (unlikely (status)) goto BAIL; - /* top */ - if (extents->bounded.y != extents->unbounded.y) { + if (extents->bounded.width == 0 || extents->bounded.height == 0) { shader.add_rectangle (&shader, extents->unbounded.x, extents->unbounded.y, extents->unbounded.width, - extents->bounded.y - extents->unbounded.y); - } + extents->unbounded.height); + } else { + /* top */ + if (extents->bounded.y != extents->unbounded.y) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->unbounded.y, + extents->unbounded.width, + extents->bounded.y - extents->unbounded.y); + } - /* left */ - if (extents->bounded.x != extents->unbounded.x) { - shader.add_rectangle (&shader, - extents->unbounded.x, - extents->bounded.y, - extents->bounded.x - extents->unbounded.x, - extents->bounded.height); - } + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->bounded.y, + extents->bounded.x - extents->unbounded.x, + extents->bounded.height); + } - /* right */ - if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { - shader.add_rectangle (&shader, - extents->bounded.x + extents->bounded.width, - extents->bounded.y, - extents->unbounded.x + extents->unbounded.width - (extents->bounded.x + extents->bounded.width), - extents->bounded.height); - } + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + shader.add_rectangle (&shader, + extents->bounded.x + extents->bounded.width, + extents->bounded.y, + extents->unbounded.x + extents->unbounded.width - (extents->bounded.x + extents->bounded.width), + extents->bounded.height); + } - /* bottom */ - if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { - shader.add_rectangle (&shader, - extents->unbounded.x, - extents->bounded.y + extents->bounded.height, - extents->unbounded.width, - extents->unbounded.y + extents->unbounded.height - (extents->bounded.y + extents->bounded.height)); + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + shader.add_rectangle (&shader, + extents->unbounded.x, + extents->bounded.y + extents->bounded.height, + extents->unbounded.width, + extents->unbounded.y + extents->unbounded.height - (extents->bounded.y + extents->bounded.height)); + } } i915_shader_fini (&shader); diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c index 3aabd9976..6799b1625 100644 --- a/src/drm/cairo-drm-i965-surface.c +++ b/src/drm/cairo-drm-i965-surface.c @@ -766,60 +766,67 @@ i965_fixup_unbounded (i965_surface_t *dst, goto BAIL; } - /* top */ - if (extents->bounded.y != extents->unbounded.y) { - cairo_rectangle_int_t rect; + if (extents->bounded.width == 0 || extents->bounded.height == 0) { + i965_shader_add_rectangle (&shader, + extents->unbounded.x, + extents->unbounded.y, + extents->unbounded.width, + extents->unbounded.height); + } else { /* top */ + if (extents->bounded.y != extents->unbounded.y) { + cairo_rectangle_int_t rect; - rect.x = extents->unbounded.x; - rect.y = extents->unbounded.y; - rect.width = extents->unbounded.width; - rect.height = extents->bounded.y - rect.y; + rect.x = extents->unbounded.x; + rect.y = extents->unbounded.y; + rect.width = extents->unbounded.width; + rect.height = extents->bounded.y - rect.y; - i965_shader_add_rectangle (&shader, - rect.x, rect.y, - rect.width, rect.height); - } + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } - /* left */ - if (extents->bounded.x != extents->unbounded.x) { - cairo_rectangle_int_t rect; + /* left */ + if (extents->bounded.x != extents->unbounded.x) { + cairo_rectangle_int_t rect; - rect.x = extents->unbounded.x; - rect.y = extents->bounded.y; - rect.width = extents->bounded.x - extents->unbounded.x; - rect.height = extents->bounded.height; + rect.x = extents->unbounded.x; + rect.y = extents->bounded.y; + rect.width = extents->bounded.x - extents->unbounded.x; + rect.height = extents->bounded.height; - i965_shader_add_rectangle (&shader, - rect.x, rect.y, - rect.width, rect.height); - } + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } - /* right */ - if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { - cairo_rectangle_int_t rect; + /* right */ + if (extents->bounded.x + extents->bounded.width != extents->unbounded.x + extents->unbounded.width) { + cairo_rectangle_int_t rect; - rect.x = extents->bounded.x + extents->bounded.width; - rect.y = extents->bounded.y; - rect.width = extents->unbounded.x + extents->unbounded.width - rect.x; - rect.height = extents->bounded.height; + rect.x = extents->bounded.x + extents->bounded.width; + rect.y = extents->bounded.y; + rect.width = extents->unbounded.x + extents->unbounded.width - rect.x; + rect.height = extents->bounded.height; - i965_shader_add_rectangle (&shader, - rect.x, rect.y, - rect.width, rect.height); - } + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } - /* bottom */ - if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { - cairo_rectangle_int_t rect; + /* bottom */ + if (extents->bounded.y + extents->bounded.height != extents->unbounded.y + extents->unbounded.height) { + cairo_rectangle_int_t rect; - rect.x = extents->unbounded.x; - rect.y = extents->bounded.y + extents->bounded.height; - rect.width = extents->unbounded.width; - rect.height = extents->unbounded.y + extents->unbounded.height - rect.y; + rect.x = extents->unbounded.x; + rect.y = extents->bounded.y + extents->bounded.height; + rect.width = extents->unbounded.width; + rect.height = extents->unbounded.y + extents->unbounded.height - rect.y; - i965_shader_add_rectangle (&shader, - rect.x, rect.y, - rect.width, rect.height); + i965_shader_add_rectangle (&shader, + rect.x, rect.y, + rect.width, rect.height); + } } i965_shader_fini (&shader); |