File U_tigervnc-crop-cursor-before-calling-maskRect.patch of Package tigervnc.openSUSE_Leap_42.2_Update

Git-commit: 1391fc4bd5a409e17dfd76251ed4bf37b7951fc0
Patch-Mainline: Upstream
References: bnc#1024929
Author: Pierre Ossman <ossman@cendio.se>
Subject: Crop cursor before calling maskRect()
Signed-off-by: Michal Srb <msrb@suse.com>

We can no longer assume maskRect() will tolerate uncropped data.

diff --git a/common/rfb/Cursor.cxx b/common/rfb/Cursor.cxx
index 3bb8e0f..e226118 100644
--- a/common/rfb/Cursor.cxx
+++ b/common/rfb/Cursor.cxx
@@ -198,7 +198,7 @@ const rdr::U8* RenderedCursor::getBuffer(const Rect& _r, int* stride) const
 void RenderedCursor::update(PixelBuffer* framebuffer,
                             Cursor* cursor, const Point& pos)
 {
-  Point rawOffset;
+  Point rawOffset, diff;
   Rect clippedRect;
 
   const rdr::U8* data;
@@ -224,7 +224,9 @@ void RenderedCursor::update(PixelBuffer* framebuffer,
   data = framebuffer->getBuffer(buffer.getRect(offset), &stride);
   buffer.imageRect(buffer.getRect(), data, stride);
 
-  data = cursor->getBuffer(cursor->getRect(), &stride);
-  buffer.maskRect(cursor->getRect(rawOffset.subtract(offset)),
-                  data, cursor->mask.buf);
+  diff = offset.subtract(rawOffset);
+  data = cursor->getBuffer(buffer.getRect(diff), &stride);
+
+  buffer.maskRect(buffer.getRect(), data, cursor->mask.buf, diff,
+                  stride, (cursor->width() + 7) / 8);
 }
openSUSE Build Service is sponsored by