in XPixelBuffer instead of XDesktop. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2572 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v0.0.90
@@ -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 |
@@ -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: |
@@ -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; |