summaryrefslogtreecommitdiff
path: root/src/drm
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-03-22 10:48:48 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2010-03-22 10:54:08 +0000
commite961cdf568f4551bbd6bca6b7505fc9f9b0805f9 (patch)
tree64838a53602d368ae0d3fc8adb5c582289d41e3b /src/drm
parent844d8ea57d69c9a68fbec64f4438953850f7657f (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.c62
-rw-r--r--src/drm/cairo-drm-i965-surface.c93
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);