Code refactoring: maintaining the Image object representing the framebuffer
in XPixelBuffer instead of XDesktop.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2572 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx
index 164c704..7e515b2 100644
--- a/unix/x0vncserver/XPixelBuffer.cxx
+++ b/unix/x0vncserver/XPixelBuffer.cxx
@@ -27,40 +27,48 @@
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