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