git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4492 3789f03b-4d11-0410-bbf8-ca57d06f2519tags/v1.1.90
@@ -0,0 +1,51 @@ | |||
/* 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 |
@@ -73,7 +73,7 @@ Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_) | |||
Fl::add_clipboard_notify(handleClipboardChange, this); | |||
#endif | |||
frameBuffer = new ManagedPixelBuffer(getPreferredPF(), w, h); | |||
frameBuffer = new PlatformPixelBuffer(w, h); | |||
assert(frameBuffer); | |||
setServerPF(serverPF); | |||
@@ -143,9 +143,7 @@ void Viewport::setServerPF(const rfb::PixelFormat& pf) | |||
const rfb::PixelFormat &Viewport::getPreferredPF() | |||
{ | |||
static PixelFormat prefPF(32, 24, false, true, 255, 255, 255, 0, 8, 16); | |||
return prefPF; | |||
return frameBuffer->getPF(); | |||
} | |||
@@ -260,36 +258,26 @@ void Viewport::draw() | |||
{ | |||
int X, Y, W, H; | |||
int pixel_bytes, stride_bytes; | |||
const uchar *buf_start; | |||
// Check what actually needs updating | |||
fl_clip_box(x(), y(), w(), h(), X, Y, W, H); | |||
if ((W == 0) || (H == 0)) | |||
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) | |||
{ | |||
rfb::ManagedPixelBuffer* newBuffer; | |||
PlatformPixelBuffer* newBuffer; | |||
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())) | |||
goto end; | |||
newBuffer = new ManagedPixelBuffer(frameBuffer->getPF(), w, h); | |||
newBuffer = new PlatformPixelBuffer(w, h); | |||
assert(newBuffer); | |||
rect.setXYWH(0, 0, |
@@ -33,6 +33,14 @@ | |||
#include <rfb/PixelBuffer.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 Viewport : public Fl_Widget { | |||
@@ -119,7 +127,7 @@ private: | |||
private: | |||
CConn* cc; | |||
rfb::ManagedPixelBuffer* frameBuffer; | |||
PlatformPixelBuffer* frameBuffer; | |||
rfb::PixelTransformer *pixelTrans; | |||
rfb::SimpleColourMap colourMap; |