git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4492 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v1.1.90
/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB | |||||
* | |||||
* This is free software; you can redistribute it and/or modify | |||||
* it under the terms of the GNU General Public License as published by | |||||
* the Free Software Foundation; either version 2 of the License, or | |||||
* (at your option) any later version. | |||||
* | |||||
* This software is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU General Public License | |||||
* along with this software; if not, write to the Free Software | |||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |||||
* USA. | |||||
*/ | |||||
#ifndef __PLATFORMPIXELBUFFER_H__ | |||||
#define __PLATFORMPIXELBUFFER_H__ | |||||
#include <rfb/PixelBuffer.h> | |||||
#include <FL/fl_draw.H> | |||||
class PlatformPixelBuffer: public rfb::ManagedPixelBuffer { | |||||
public: | |||||
PlatformPixelBuffer(int width, int height) : | |||||
rfb::ManagedPixelBuffer(rfb::PixelFormat(32, 24, false, true, | |||||
255, 255, 255, 0, 8, 16), | |||||
width, height) | |||||
{}; | |||||
inline void draw(int src_x, int src_y, int x, int y, int w, int h); | |||||
}; | |||||
inline void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) | |||||
{ | |||||
int pixel_bytes, stride_bytes; | |||||
const uchar *buf_start; | |||||
pixel_bytes = getPF().bpp/8; | |||||
stride_bytes = pixel_bytes * getStride(); | |||||
buf_start = data + | |||||
pixel_bytes * src_x + | |||||
stride_bytes * src_y; | |||||
fl_draw_image(buf_start, x, y, w, h, pixel_bytes, stride_bytes); | |||||
} | |||||
#endif |
Fl::add_clipboard_notify(handleClipboardChange, this); | Fl::add_clipboard_notify(handleClipboardChange, this); | ||||
#endif | #endif | ||||
frameBuffer = new ManagedPixelBuffer(getPreferredPF(), w, h); | |||||
frameBuffer = new PlatformPixelBuffer(w, h); | |||||
assert(frameBuffer); | assert(frameBuffer); | ||||
setServerPF(serverPF); | setServerPF(serverPF); | ||||
const rfb::PixelFormat &Viewport::getPreferredPF() | const rfb::PixelFormat &Viewport::getPreferredPF() | ||||
{ | { | ||||
static PixelFormat prefPF(32, 24, false, true, 255, 255, 255, 0, 8, 16); | |||||
return prefPF; | |||||
return frameBuffer->getPF(); | |||||
} | } | ||||
{ | { | ||||
int X, Y, W, H; | int X, Y, W, H; | ||||
int pixel_bytes, stride_bytes; | |||||
const uchar *buf_start; | |||||
// Check what actually needs updating | // Check what actually needs updating | ||||
fl_clip_box(x(), y(), w(), h(), X, Y, W, H); | fl_clip_box(x(), y(), w(), h(), X, Y, W, H); | ||||
if ((W == 0) || (H == 0)) | if ((W == 0) || (H == 0)) | ||||
return; | return; | ||||
pixel_bytes = frameBuffer->getPF().bpp/8; | |||||
stride_bytes = pixel_bytes * frameBuffer->getStride(); | |||||
buf_start = frameBuffer->data + | |||||
pixel_bytes * (X - x()) + | |||||
stride_bytes * (Y - y()); | |||||
// FIXME: Check how efficient this thing really is | |||||
fl_draw_image(buf_start, X, Y, W, H, pixel_bytes, stride_bytes); | |||||
frameBuffer->draw(X - x(), Y - y(), X, Y, W, H); | |||||
} | } | ||||
void Viewport::resize(int x, int y, int w, int h) | void Viewport::resize(int x, int y, int w, int h) | ||||
{ | { | ||||
rfb::ManagedPixelBuffer* newBuffer; | |||||
PlatformPixelBuffer* newBuffer; | |||||
rfb::Rect rect; | rfb::Rect rect; | ||||
// FIXME: Resize should probably be a feature of ManagedPixelBuffer | |||||
// FIXME: Resize should probably be a feature of the pixel buffer itself | |||||
if ((w == frameBuffer->width()) && (h == frameBuffer->height())) | if ((w == frameBuffer->width()) && (h == frameBuffer->height())) | ||||
goto end; | goto end; | ||||
newBuffer = new ManagedPixelBuffer(frameBuffer->getPF(), w, h); | |||||
newBuffer = new PlatformPixelBuffer(w, h); | |||||
assert(newBuffer); | assert(newBuffer); | ||||
rect.setXYWH(0, 0, | rect.setXYWH(0, 0, |
#include <rfb/PixelBuffer.h> | #include <rfb/PixelBuffer.h> | ||||
#include <rfb/PixelTransformer.h> | #include <rfb/PixelTransformer.h> | ||||
#if defined(WIN32) | |||||
#include "PlatformPixelBuffer.h" | |||||
#elif defined(__APPLE__) | |||||
#include "PlatformPixelBuffer.h" | |||||
#else | |||||
#include "PlatformPixelBuffer.h" | |||||
#endif | |||||
class CConn; | class CConn; | ||||
class Viewport : public Fl_Widget { | class Viewport : public Fl_Widget { | ||||
private: | private: | ||||
CConn* cc; | CConn* cc; | ||||
rfb::ManagedPixelBuffer* frameBuffer; | |||||
PlatformPixelBuffer* frameBuffer; | |||||
rfb::PixelTransformer *pixelTrans; | rfb::PixelTransformer *pixelTrans; | ||||
rfb::SimpleColourMap colourMap; | rfb::SimpleColourMap colourMap; |