diff mbox

[v2,3/5] vmware-vga: use vmsvga_verify_rect in vmsvga_update_rect

Message ID 1413367839-30999-5-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann Oct. 15, 2014, 10:10 a.m. UTC
Switch vmsvga_update_rect over to use vmsvga_verify_rect.  Slight change
in behavior:  We don't try to automatically fixup rectangles any more.
In case we find invalid update requests we'll do a full-screen update
instead.

Cc: qemu-stable@nongnu.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/display/vmware_vga.c | 32 ++++----------------------------
 1 file changed, 4 insertions(+), 28 deletions(-)

Comments

Don Koch Oct. 16, 2014, 2:25 p.m. UTC | #1
On Wed, 15 Oct 2014 12:10:37 +0200
Gerd Hoffmann <kraxel@redhat.com> wrote:

> Switch vmsvga_update_rect over to use vmsvga_verify_rect.  Slight change
> in behavior:  We don't try to automatically fixup rectangles any more.
> In case we find invalid update requests we'll do a full-screen update
> instead.

This is good since the original calculations were wrong. (I had already fixed
said calculations but hadn't cleaned them up for submittal, yet.) Unfortunate
that you end up using "the big hammer" to fix it (i.e., update the entire screen),
but that's better than before.

Reviewed-by: Don Koch <dkoch@verizon.com>

> Cc: qemu-stable@nongnu.org
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/display/vmware_vga.c | 32 ++++----------------------------
>  1 file changed, 4 insertions(+), 28 deletions(-)
> 
> diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
> index ba73a1c..9d79de6 100644
> --- a/hw/display/vmware_vga.c
> +++ b/hw/display/vmware_vga.c
> @@ -356,36 +356,12 @@ static inline void vmsvga_update_rect(struct vmsvga_state_s *s,
>      uint8_t *src;
>      uint8_t *dst;
>  
> -    if (x < 0) {
> -        fprintf(stderr, "%s: update x was < 0 (%d)\n", __func__, x);
> -        w += x;
> +    if (!vmsvga_verify_rect(surface, __func__, x, y, w, h)) {
> +        /* go for a fullscreen update as fallback */
>          x = 0;
> -    }
> -    if (w < 0) {
> -        fprintf(stderr, "%s: update w was < 0 (%d)\n", __func__, w);
> -        w = 0;
> -    }
> -    if (x + w > surface_width(surface)) {
> -        fprintf(stderr, "%s: update width too large x: %d, w: %d\n",
> -                __func__, x, w);
> -        x = MIN(x, surface_width(surface));
> -        w = surface_width(surface) - x;
> -    }
> -
> -    if (y < 0) {
> -        fprintf(stderr, "%s: update y was < 0 (%d)\n",  __func__, y);
> -        h += y;
>          y = 0;
> -    }
> -    if (h < 0) {
> -        fprintf(stderr, "%s: update h was < 0 (%d)\n",  __func__, h);
> -        h = 0;
> -    }
> -    if (y + h > surface_height(surface)) {
> -        fprintf(stderr, "%s: update height too large y: %d, h: %d\n",
> -                __func__, y, h);
> -        y = MIN(y, surface_height(surface));
> -        h = surface_height(surface) - y;
> +        w = surface_width(surface);
> +        h = surface_height(surface);
>      }
>  
>      bypl = surface_stride(surface);
> -- 
> 1.8.3.1
> 
>
diff mbox

Patch

diff --git a/hw/display/vmware_vga.c b/hw/display/vmware_vga.c
index ba73a1c..9d79de6 100644
--- a/hw/display/vmware_vga.c
+++ b/hw/display/vmware_vga.c
@@ -356,36 +356,12 @@  static inline void vmsvga_update_rect(struct vmsvga_state_s *s,
     uint8_t *src;
     uint8_t *dst;
 
-    if (x < 0) {
-        fprintf(stderr, "%s: update x was < 0 (%d)\n", __func__, x);
-        w += x;
+    if (!vmsvga_verify_rect(surface, __func__, x, y, w, h)) {
+        /* go for a fullscreen update as fallback */
         x = 0;
-    }
-    if (w < 0) {
-        fprintf(stderr, "%s: update w was < 0 (%d)\n", __func__, w);
-        w = 0;
-    }
-    if (x + w > surface_width(surface)) {
-        fprintf(stderr, "%s: update width too large x: %d, w: %d\n",
-                __func__, x, w);
-        x = MIN(x, surface_width(surface));
-        w = surface_width(surface) - x;
-    }
-
-    if (y < 0) {
-        fprintf(stderr, "%s: update y was < 0 (%d)\n",  __func__, y);
-        h += y;
         y = 0;
-    }
-    if (h < 0) {
-        fprintf(stderr, "%s: update h was < 0 (%d)\n",  __func__, h);
-        h = 0;
-    }
-    if (y + h > surface_height(surface)) {
-        fprintf(stderr, "%s: update height too large y: %d, h: %d\n",
-                __func__, y, h);
-        y = MIN(y, surface_height(surface));
-        h = surface_height(surface) - y;
+        w = surface_width(surface);
+        h = surface_height(surface);
     }
 
     bypl = surface_stride(surface);