]> source.dussan.org Git - tigervnc.git/commitdiff
Code refactoring: maintaining the Image object representing the framebuffer
authorConstantin Kaplinsky <const@tightvnc.com>
Wed, 4 Jun 2008 03:10:05 +0000 (03:10 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Wed, 4 Jun 2008 03:10:05 +0000 (03:10 +0000)
in XPixelBuffer instead of XDesktop.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2572 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/x0vncserver/XPixelBuffer.cxx
unix/x0vncserver/XPixelBuffer.h
unix/x0vncserver/x0vncserver.cxx

index 164c70421f7c09488df72404c8f051519bdc3401..7e515b254d06114989216cfe60a87d00bc945c97 100644 (file)
 
 using namespace rfb;
 
-XPixelBuffer::XPixelBuffer(Display *dpy, Image* image,
+XPixelBuffer::XPixelBuffer(Display *dpy, ImageFactory &factory,
                            int offsetLeft, int offsetTop,
+                           int width, int height,
                            ColourMap* cm)
   : FullFramePixelBuffer(),
     m_dpy(dpy),
-    m_image(image),
+    m_image(0),
     m_offsetLeft(offsetLeft),
     m_offsetTop(offsetTop),
-    m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel)
+    m_stride(0)
 {
+  m_image = factory.newImage(dpy, width, height);
+
   // Fill in the PixelFormat structure of the parent class.
-  format.bpp        = image->xim->bits_per_pixel;
-  format.depth      = image->xim->depth;
-  format.bigEndian  = (image->xim->byte_order == MSBFirst);
-  format.trueColour = image->isTrueColor();
-  format.redShift   = ffs(image->xim->red_mask) - 1;
-  format.greenShift = ffs(image->xim->green_mask) - 1;
-  format.blueShift  = ffs(image->xim->blue_mask) - 1;
-  format.redMax     = image->xim->red_mask   >> format.redShift;
-  format.greenMax   = image->xim->green_mask >> format.greenShift;
-  format.blueMax    = image->xim->blue_mask  >> format.blueShift;
+  format.bpp        = m_image->xim->bits_per_pixel;
+  format.depth      = m_image->xim->depth;
+  format.bigEndian  = (m_image->xim->byte_order == MSBFirst);
+  format.trueColour = m_image->isTrueColor();
+  format.redShift   = ffs(m_image->xim->red_mask) - 1;
+  format.greenShift = ffs(m_image->xim->green_mask) - 1;
+  format.blueShift  = ffs(m_image->xim->blue_mask) - 1;
+  format.redMax     = m_image->xim->red_mask   >> format.redShift;
+  format.greenMax   = m_image->xim->green_mask >> format.greenShift;
+  format.blueMax    = m_image->xim->blue_mask  >> format.blueShift;
 
   // Set up the remaining data of the parent class.
-  width_ = image->xim->width;
-  height_ = image->xim->height;
-  data = (rdr::U8 *)image->xim->data;
+  width_ = width;
+  height_ = height;
+  data = (rdr::U8 *)m_image->xim->data;
   colourmap = cm;
 
+  // Calculate the distance in pixels between two subsequent scan
+  // lines of the framebuffer.
+  m_stride = m_image->xim->bytes_per_line * 8 / m_image->xim->bits_per_pixel;
+
   // Get initial screen image from the X display.
   m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
 }
 
 XPixelBuffer::~XPixelBuffer()
 {
+  delete m_image;
 }
 
 void
index 75cd552dc8a5c8740ecfac65f1e5d45835a3416d..7829038c552291a8c8425454f2679ffb14ec7e1f 100644 (file)
@@ -35,8 +35,9 @@ using namespace rfb;
 class XPixelBuffer : public FullFramePixelBuffer
 {
 public:
-  XPixelBuffer(Display *dpy, Image* image,
+  XPixelBuffer(Display *dpy, ImageFactory &factory,
                int offsetLeft, int offsetTop,
+               int width, int height,
                ColourMap* cm);
   virtual ~XPixelBuffer();
 
@@ -46,9 +47,10 @@ public:
   //       Or better do not allow public access at all.
   virtual Image *getImage() const { return m_image; }
 
+  // Override PixelBuffer::getStride().
   virtual int getStride() const { return m_stride; }
 
-  // Override PixelBuffer's function.
+  // Override PixelBuffer::grabRegion().
   virtual void grabRegion(const rfb::Region& region);
 
 protected:
index 9331cf5664c795fa2c189e4a96d821735c89eb91..f2ff43060befb7de14dcb60a0d01a60edf5669a3 100644 (file)
@@ -138,7 +138,7 @@ class XDesktop : public SDesktop, public ColourMap
 {
 public:
   XDesktop(Display* dpy_, Geometry *geometry_)
-    : dpy(dpy_), geometry(geometry_), pb(0), server(0), image(0), pollmgr(0),
+    : dpy(dpy_), geometry(geometry_), pb(0), server(0), pollmgr(0),
       oldButtonMask(0), haveXtest(false), maxButtons(0), running(false)
   {
 #ifdef HAVE_XTEST
@@ -175,15 +175,17 @@ public:
     vlog.info("Enabling %d button%s of X pointer device",
               maxButtons, (maxButtons != 1) ? "s" : "");
 
-    // Create an image for maintaining framebuffer data.
+    // Create an ImageFactory instance for producing Image objects.
     ImageFactory factory((bool)useShm, (bool)useOverlay);
-    image = factory.newImage(dpy, geometry->width(), geometry->height());
-    vlog.info("Allocated %s", image->classDesc());
 
     // Provide pixel buffer to the server object.
-    pb = new XPixelBuffer(dpy, image,
+    // FIXME: Pass coordinates in a structure?
+    pb = new XPixelBuffer(dpy, factory,
                           geometry->offsetLeft(), geometry->offsetTop(),
+                          geometry->width(), geometry->height(),
                           this);
+    vlog.info("Allocated %s", pb->getImage()->classDesc());
+
     server = vs;
     server->setPixelBuffer(pb);
 
@@ -199,11 +201,9 @@ public:
 
     delete pb;
     delete pollmgr;
-    delete image;
 
     pb = 0;
     pollmgr = 0;
-    image = 0;
   }
 
   inline bool isRunning() {
@@ -273,7 +273,6 @@ protected:
   Geometry* geometry;
   XPixelBuffer* pb;
   VNCServer* server;
-  Image* image;
   PollingManager* pollmgr;
   int oldButtonMask;
   bool haveXtest;