diff options
author | Pierre Ossman <ossman@cendio.se> | 2014-02-07 14:46:26 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2014-07-07 14:50:28 +0200 |
commit | ac13abe4ce9f74522acd9697a08dc56de8e2949f (patch) | |
tree | 4eb0fdaa6cf22d0e06f63b9cb1a03063f5f21c27 /vncviewer | |
parent | 668468b3d43d5ea1562ebc0be8de0c98c5601a60 (diff) | |
download | tigervnc-ac13abe4ce9f74522acd9697a08dc56de8e2949f.tar.gz tigervnc-ac13abe4ce9f74522acd9697a08dc56de8e2949f.zip |
Create a proper interface base class for the viewport's framebuffer
This allows us to gracefully fall back to the FLTK code in case the
platform specific code cannot be used.
Diffstat (limited to 'vncviewer')
-rw-r--r-- | vncviewer/CMakeLists.txt | 2 | ||||
-rw-r--r-- | vncviewer/FLTKPixelBuffer.cxx | 52 | ||||
-rw-r--r-- | vncviewer/FLTKPixelBuffer.h | 33 | ||||
-rw-r--r-- | vncviewer/OSXPixelBuffer.cxx | 21 | ||||
-rw-r--r-- | vncviewer/OSXPixelBuffer.h | 12 | ||||
-rw-r--r-- | vncviewer/PlatformPixelBuffer.cxx | 26 | ||||
-rw-r--r-- | vncviewer/PlatformPixelBuffer.h | 32 | ||||
-rw-r--r-- | vncviewer/Viewport.cxx | 32 | ||||
-rw-r--r-- | vncviewer/Viewport.h | 2 | ||||
-rw-r--r-- | vncviewer/Win32PixelBuffer.cxx | 16 | ||||
-rw-r--r-- | vncviewer/Win32PixelBuffer.h | 12 | ||||
-rw-r--r-- | vncviewer/X11PixelBuffer.cxx | 16 | ||||
-rw-r--r-- | vncviewer/X11PixelBuffer.h | 12 |
13 files changed, 195 insertions, 73 deletions
diff --git a/vncviewer/CMakeLists.txt b/vncviewer/CMakeLists.txt index c1facc67..9b815a39 100644 --- a/vncviewer/CMakeLists.txt +++ b/vncviewer/CMakeLists.txt @@ -7,9 +7,11 @@ set(VNCVIEWER_SOURCES menukey.cxx CConn.cxx DesktopWindow.cxx + FLTKPixelBuffer.cxx UserDialog.cxx ServerDialog.cxx OptionsDialog.cxx + PlatformPixelBuffer.cxx Viewport.cxx parameters.cxx keysym2ucs.c diff --git a/vncviewer/FLTKPixelBuffer.cxx b/vncviewer/FLTKPixelBuffer.cxx new file mode 100644 index 00000000..91ff787e --- /dev/null +++ b/vncviewer/FLTKPixelBuffer.cxx @@ -0,0 +1,52 @@ +/* Copyright 2011-2014 Pierre Ossman 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. + */ + +#include <FL/fl_draw.H> + +#include <rfb/Exception.h> + +#include "FLTKPixelBuffer.h" + +FLTKPixelBuffer::FLTKPixelBuffer(int width, int height) : + PlatformPixelBuffer(rfb::PixelFormat(32, 24, false, true, + 255, 255, 255, 0, 8, 16), + width, height, NULL) +{ + data = new rdr::U8[width * height * format.bpp/8]; + if (data == NULL) + throw rfb::Exception("Error: Not enough memory for framebuffer"); +} + +FLTKPixelBuffer::~FLTKPixelBuffer() +{ + delete [] data; +} + +void FLTKPixelBuffer::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 = format.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); +} diff --git a/vncviewer/FLTKPixelBuffer.h b/vncviewer/FLTKPixelBuffer.h new file mode 100644 index 00000000..148c6264 --- /dev/null +++ b/vncviewer/FLTKPixelBuffer.h @@ -0,0 +1,33 @@ +/* Copyright 2011-2014 Pierre Ossman 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 __FLTKPIXELBUFFER_H__ +#define __FLTKPIXELBUFFER_H__ + +#include "PlatformPixelBuffer.h" + +class FLTKPixelBuffer: public PlatformPixelBuffer { +public: + FLTKPixelBuffer(int width, int height); + ~FLTKPixelBuffer(); + + virtual void draw(int src_x, int src_y, int x, int y, int w, int h); +}; + + +#endif diff --git a/vncviewer/OSXPixelBuffer.cxx b/vncviewer/OSXPixelBuffer.cxx index 0e03fc98..fc216a12 100644 --- a/vncviewer/OSXPixelBuffer.cxx +++ b/vncviewer/OSXPixelBuffer.cxx @@ -1,4 +1,4 @@ -/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB +/* Copyright 2011-2014 Pierre Ossman 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 @@ -34,16 +34,20 @@ using namespace rfb; -static rfb::LogWriter vlog("PlatformPixelBuffer"); +static rfb::LogWriter vlog("OSXPixelBuffer"); -PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : - ManagedPixelBuffer(rfb::PixelFormat(32, 24, false, true, - 255, 255, 255, 16, 8, 0), - width, height), +OSXPixelBuffer::OSXPixelBuffer(int width, int height) : + PlatformPixelBuffer(rfb::PixelFormat(32, 24, false, true, + 255, 255, 255, 16, 8, 0), + width, height, NULL), bitmap(NULL) { CGColorSpaceRef lut; + data = new rdr::U8[width * height * format.bpp/8]; + if (data == NULL) + throw rfb::Exception("Error: Not enough memory for framebuffer"); + lut = CGColorSpaceCreateDeviceRGB(); assert(lut); @@ -55,13 +59,14 @@ PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : } -PlatformPixelBuffer::~PlatformPixelBuffer() +OSXPixelBuffer::~OSXPixelBuffer() { CFRelease((CGContextRef)bitmap); + delete [] data; } -void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) +void OSXPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) { CGRect rect; CGContextRef gc; diff --git a/vncviewer/OSXPixelBuffer.h b/vncviewer/OSXPixelBuffer.h index e59015e5..8ae01848 100644 --- a/vncviewer/OSXPixelBuffer.h +++ b/vncviewer/OSXPixelBuffer.h @@ -1,4 +1,4 @@ -/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB +/* Copyright 2011-2014 Pierre Ossman 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 @@ -19,14 +19,14 @@ #ifndef __OSXPIXELBUFFER_H__ #define __OSXPIXELBUFFER_H__ -#include <rfb/PixelBuffer.h> +#include "PlatformPixelBuffer.h" -class PlatformPixelBuffer: public rfb::ManagedPixelBuffer { +class OSXPixelBuffer: public PlatformPixelBuffer { public: - PlatformPixelBuffer(int width, int height); - ~PlatformPixelBuffer(); + OSXPixelBuffer(int width, int height); + ~OSXPixelBuffer(); - void draw(int src_x, int src_y, int x, int y, int w, int h); + virtual void draw(int src_x, int src_y, int x, int y, int w, int h); protected: // This is really a CGContextRef, but Apple headers conflict with FLTK diff --git a/vncviewer/PlatformPixelBuffer.cxx b/vncviewer/PlatformPixelBuffer.cxx new file mode 100644 index 00000000..8a24690c --- /dev/null +++ b/vncviewer/PlatformPixelBuffer.cxx @@ -0,0 +1,26 @@ +/* Copyright 2011-2014 Pierre Ossman 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. + */ + +#include "PlatformPixelBuffer.h" + +PlatformPixelBuffer::PlatformPixelBuffer(const rfb::PixelFormat& pf, + int width, int height, + rdr::U8* data) : + FullFramePixelBuffer(pf, width, height, data) +{ +} diff --git a/vncviewer/PlatformPixelBuffer.h b/vncviewer/PlatformPixelBuffer.h index f634ccd4..28d085aa 100644 --- a/vncviewer/PlatformPixelBuffer.h +++ b/vncviewer/PlatformPixelBuffer.h @@ -1,4 +1,4 @@ -/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB +/* Copyright 2011-2014 Pierre Ossman 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 @@ -21,31 +21,15 @@ #include <rfb/PixelBuffer.h> -#include <FL/fl_draw.H> - -class PlatformPixelBuffer: public rfb::ManagedPixelBuffer { +class PlatformPixelBuffer: public rfb::FullFramePixelBuffer { 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); -}; + PlatformPixelBuffer(const rfb::PixelFormat& pf, int width, int height, + rdr::U8* data); -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; + virtual void draw(int src_x, int src_y, int x, int y, int w, int h) = 0; - 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); -} +protected: + int stride; +}; #endif diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx index a7296e9a..a930cf89 100644 --- a/vncviewer/Viewport.cxx +++ b/vncviewer/Viewport.cxx @@ -51,6 +51,9 @@ #include "menukey.h" #include "vncviewer.h" +#include "PlatformPixelBuffer.h" +#include "FLTKPixelBuffer.h" + #if defined(WIN32) #include "Win32PixelBuffer.h" #elif defined(__APPLE__) @@ -59,11 +62,6 @@ #include "X11PixelBuffer.h" #endif -// We also have a generic version of the above, using pure FLTK: -// -// #include "PlatformPixelBuffer.h" -// - #include <FL/fl_draw.H> #include <FL/fl_ask.H> @@ -100,7 +98,7 @@ Viewport::Viewport(int w, int h, const rfb::PixelFormat& serverPF, CConn* cc_) Fl::add_clipboard_notify(handleClipboardChange, this); #endif - frameBuffer = new PlatformPixelBuffer(w, h); + frameBuffer = createFramebuffer(w, h); assert(frameBuffer); setServerPF(serverPF); @@ -358,7 +356,7 @@ void Viewport::resize(int x, int y, int w, int h) vlog.debug("Resizing framebuffer from %dx%d to %dx%d", frameBuffer->width(), frameBuffer->height(), w, h); - newBuffer = new PlatformPixelBuffer(w, h); + newBuffer = createFramebuffer(w, h); assert(newBuffer); rect.setXYWH(0, 0, @@ -500,6 +498,26 @@ int Viewport::handle(int event) } +PlatformPixelBuffer* Viewport::createFramebuffer(int w, int h) +{ + PlatformPixelBuffer *fb; + + try { +#if defined(WIN32) + fb = new Win32PixelBuffer(w, h); +#elif defined(__APPLE__) + fb = new OSXPixelBuffer(w, h); +#else + fb = new X11PixelBuffer(w, h); +#endif + } catch (rdr::Exception& e) { + fb = new FLTKPixelBuffer(w, h); + } + + return fb; +} + + void Viewport::handleUpdateTimeout(void *data) { Viewport *self = (Viewport *)data; diff --git a/vncviewer/Viewport.h b/vncviewer/Viewport.h index 7859db6d..bd17655a 100644 --- a/vncviewer/Viewport.h +++ b/vncviewer/Viewport.h @@ -72,6 +72,8 @@ public: private: + PlatformPixelBuffer* createFramebuffer(int w, int h); + static void handleUpdateTimeout(void *data); static void handleClipboardChange(int source, void *data); diff --git a/vncviewer/Win32PixelBuffer.cxx b/vncviewer/Win32PixelBuffer.cxx index 4ee15ce5..429f63f1 100644 --- a/vncviewer/Win32PixelBuffer.cxx +++ b/vncviewer/Win32PixelBuffer.cxx @@ -1,5 +1,5 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB + * Copyright 2011-2014 Pierre Ossman 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 @@ -35,12 +35,12 @@ using namespace rfb; -static rfb::LogWriter vlog("PlatformPixelBuffer"); +static rfb::LogWriter vlog("Win32PixelBuffer"); -PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : - FullFramePixelBuffer(rfb::PixelFormat(32, 24, false, true, - 255, 255, 255, 16, 8, 0), - width, height, NULL), +Win32PixelBuffer::Win32PixelBuffer(int width, int height) : + PlatformPixelBuffer(rfb::PixelFormat(32, 24, false, true, + 255, 255, 255, 16, 8, 0), + width, height, NULL), bitmap(NULL) { BITMAPINFOHEADER bih; @@ -64,13 +64,13 @@ PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : } -PlatformPixelBuffer::~PlatformPixelBuffer() +Win32PixelBuffer::~Win32PixelBuffer() { DeleteObject(bitmap); } -void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) +void Win32PixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) { HDC dc; diff --git a/vncviewer/Win32PixelBuffer.h b/vncviewer/Win32PixelBuffer.h index 7d91e09d..728e5948 100644 --- a/vncviewer/Win32PixelBuffer.h +++ b/vncviewer/Win32PixelBuffer.h @@ -1,4 +1,4 @@ -/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB +/* Copyright 2011-2014 Pierre Ossman 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 @@ -21,14 +21,14 @@ #include <windows.h> -#include <rfb/PixelBuffer.h> +#include "PlatformPixelBuffer.h" -class PlatformPixelBuffer: public rfb::FullFramePixelBuffer { +class Win32PixelBuffer: public PlatformPixelBuffer { public: - PlatformPixelBuffer(int width, int height); - ~PlatformPixelBuffer(); + Win32PixelBuffer(int width, int height); + ~Win32PixelBuffer(); - void draw(int src_x, int src_y, int x, int y, int w, int h); + virtual void draw(int src_x, int src_y, int x, int y, int w, int h); protected: HBITMAP bitmap; diff --git a/vncviewer/X11PixelBuffer.cxx b/vncviewer/X11PixelBuffer.cxx index f834003e..3675eb57 100644 --- a/vncviewer/X11PixelBuffer.cxx +++ b/vncviewer/X11PixelBuffer.cxx @@ -1,5 +1,5 @@ /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB + * Copyright 2011-2014 Pierre Ossman 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 @@ -33,7 +33,7 @@ using namespace rfb; -static rfb::LogWriter vlog("PlatformPixelBuffer"); +static rfb::LogWriter vlog("X11PixelBuffer"); static PixelFormat display_pf() { @@ -93,8 +93,8 @@ static PixelFormat display_pf() redShift, greenShift, blueShift); } -PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : - FullFramePixelBuffer(display_pf(), width, height, NULL), +X11PixelBuffer::X11PixelBuffer(int width, int height) : + PlatformPixelBuffer(display_pf(), width, height, NULL), shminfo(NULL), xim(NULL) { // Might not be open at this point @@ -113,7 +113,7 @@ PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) : } -PlatformPixelBuffer::~PlatformPixelBuffer() +X11PixelBuffer::~X11PixelBuffer() { if (shminfo) { vlog.debug("Freeing shared memory XImage"); @@ -130,7 +130,7 @@ PlatformPixelBuffer::~PlatformPixelBuffer() } -void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) +void X11PixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) { if (shminfo) XShmPutImage(fl_display, fl_window, fl_gc, xim, src_x, src_y, x, y, w, h, False); @@ -139,7 +139,7 @@ void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h) } -int PlatformPixelBuffer::getStride() const +int X11PixelBuffer::getStride() const { return xim->bytes_per_line / (getPF().bpp/8); } @@ -152,7 +152,7 @@ static int XShmAttachErrorHandler(Display *dpy, XErrorEvent *error) return 0; } -int PlatformPixelBuffer::setupShm() +int X11PixelBuffer::setupShm() { int major, minor; Bool pixmaps; diff --git a/vncviewer/X11PixelBuffer.h b/vncviewer/X11PixelBuffer.h index 0b0cee01..6d54165f 100644 --- a/vncviewer/X11PixelBuffer.h +++ b/vncviewer/X11PixelBuffer.h @@ -1,4 +1,4 @@ -/* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB +/* Copyright 2011-2014 Pierre Ossman 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 @@ -24,14 +24,14 @@ #include <sys/shm.h> #include <X11/extensions/XShm.h> -#include <rfb/PixelBuffer.h> +#include "PlatformPixelBuffer.h" -class PlatformPixelBuffer: public rfb::FullFramePixelBuffer { +class X11PixelBuffer: public PlatformPixelBuffer { public: - PlatformPixelBuffer(int width, int height); - ~PlatformPixelBuffer(); + X11PixelBuffer(int width, int height); + ~X11PixelBuffer(); - void draw(int src_x, int src_y, int x, int y, int w, int h); + virtual void draw(int src_x, int src_y, int x, int y, int w, int h); int getStride() const; |