Revision: 4477
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4477&view=rev
Author:   ossman_
Date:     2011-06-09 08:32:49 +0000 (Thu, 09 Jun 2011)

Log Message:
-----------
Implement dot cursor in new viewer.

Modified Paths:
--------------
    trunk/vncviewer/Viewport.cxx

Modified: trunk/vncviewer/Viewport.cxx
===================================================================
--- trunk/vncviewer/Viewport.cxx        2011-06-09 08:24:37 UTC (rev 4476)
+++ trunk/vncviewer/Viewport.cxx        2011-06-09 08:32:49 UTC (rev 4477)
@@ -117,7 +117,8 @@
     delete pixelTrans;
 
   if (cursor) {
-    delete [] cursor->array;
+    if (!cursor->alloc_array)
+      delete [] cursor->array;
     delete cursor;
   }
 
@@ -178,44 +179,71 @@
   damage.clear();
 }
 
+#ifdef HAVE_FLTK_CURSOR
+static const char * dotcursor_xpm[] = {
+  "5 5 2 1",
+  ".   c #000000",
+  "    c #FFFFFF",
+  "     ",
+  " ... ",
+  " ... ",
+  " ... ",
+  "     "};
+#endif
 
 void Viewport::setCursor(int width, int height, const Point& hotspot,
                               void* data, void* mask)
 {
 #ifdef HAVE_FLTK_CURSOR
-  U8 *buffer = new U8[width*height*4];
-  U8 *i, *o, *m;
-  int m_width;
+  if (cursor) {
+    if (!cursor->alloc_array)
+      delete [] cursor->array;
+    delete cursor;
+  }
 
-  const PixelFormat &pf = frameBuffer->getPF();
+  int mask_len = ((width+7)/8) * height;
+  int i;
 
-  i = (U8*)data;
-  o = buffer;
-  m = (U8*)mask;
-  m_width = (width+7)/8;
-  for (int y = 0;y < height;y++) {
-    for (int x = 0;x < width;x++) {
-      pf.rgbFromBuffer(o, i, 1, &colourMap);
+  for (i = 0; i < mask_len; i++)
+    if (((rdr::U8*)mask)[i]) break;
 
-      if (m[(m_width*y)+(x/8)] & 0x80>>(x%8))
-        o[3] = 255;
-      else
-        o[3] = 0;
+  if (i == mask_len) {
+    if (dotWhenNoCursor)
+      vlog.debug("cursor is empty - using dot");
 
-      o += 4;
-      i += pf.bpp/8;
+    Fl_Pixmap pxm(dotcursor_xpm);
+    cursor = new Fl_RGB_Image(&pxm);
+    cursorHotspot.x = cursorHotspot.y = 2;
+  } else {
+    U8 *buffer = new U8[width*height*4];
+    U8 *i, *o, *m;
+    int m_width;
+
+    const PixelFormat &pf = frameBuffer->getPF();
+
+    i = (U8*)data;
+    o = buffer;
+    m = (U8*)mask;
+    m_width = (width+7)/8;
+    for (int y = 0;y < height;y++) {
+      for (int x = 0;x < width;x++) {
+        pf.rgbFromBuffer(o, i, 1, &colourMap);
+
+        if (m[(m_width*y)+(x/8)] & 0x80>>(x%8))
+          o[3] = 255;
+        else
+          o[3] = 0;
+
+        o += 4;
+        i += pf.bpp/8;
+      }
     }
-  }
 
-  if (cursor) {
-    delete [] cursor->array;
-    delete cursor;
+    cursor = new Fl_RGB_Image(buffer, width, height, 4);
+
+    cursorHotspot = hotspot;
   }
 
-  cursor = new Fl_RGB_Image(buffer, width, height, 4);
-
-  cursorHotspot = hotspot;
-
   if (Fl::belowmouse() == this)
     window()->cursor(cursor, cursorHotspot.x, cursorHotspot.y);
 #endif


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
Tigervnc-commits mailing list
Tigervnc-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to