Browse Source

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
tags/v0.0.90
Constantin Kaplinsky 16 years ago
parent
commit
e0c80c5666

+ 24
- 16
unix/x0vncserver/XPixelBuffer.cxx View File

@@ -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

+ 4
- 2
unix/x0vncserver/XPixelBuffer.h View 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:

+ 7
- 8
unix/x0vncserver/x0vncserver.cxx View 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;

Loading…
Cancel
Save