]> source.dussan.org Git - tigervnc.git/commitdiff
Create a proper interface base class for the viewport's framebuffer
authorPierre Ossman <ossman@cendio.se>
Fri, 7 Feb 2014 13:46:26 +0000 (14:46 +0100)
committerPierre Ossman <ossman@cendio.se>
Mon, 7 Jul 2014 12:50:28 +0000 (14:50 +0200)
This allows us to gracefully fall back to the FLTK code in case the
platform specific code cannot be used.

13 files changed:
vncviewer/CMakeLists.txt
vncviewer/FLTKPixelBuffer.cxx [new file with mode: 0644]
vncviewer/FLTKPixelBuffer.h [new file with mode: 0644]
vncviewer/OSXPixelBuffer.cxx
vncviewer/OSXPixelBuffer.h
vncviewer/PlatformPixelBuffer.cxx [new file with mode: 0644]
vncviewer/PlatformPixelBuffer.h
vncviewer/Viewport.cxx
vncviewer/Viewport.h
vncviewer/Win32PixelBuffer.cxx
vncviewer/Win32PixelBuffer.h
vncviewer/X11PixelBuffer.cxx
vncviewer/X11PixelBuffer.h

index c1facc67c6408fdccf147dff8efa25fb711b2539..9b815a390a24dadd3d93f9528043079ecf3f3f81 100644 (file)
@@ -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 (file)
index 0000000..91ff787
--- /dev/null
@@ -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 (file)
index 0000000..148c626
--- /dev/null
@@ -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
index 0e03fc984498512eefd736e991c32cf5ea7d0800..fc216a1200dada31bf99f78bfbc3900ebb48c18f 100644 (file)
@@ -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
 
 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;
index e59015e54f52dd9a5b09a8d8afec8e0ab5b32789..8ae0184859b19564c2b4675f920070c401774847 100644 (file)
@@ -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
 #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 (file)
index 0000000..8a24690
--- /dev/null
@@ -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)
+{
+}
index f634ccd4158d6144f82556deae89fde36a09f4f9..28d085aa8df6efb6732ca29a68b81fae8a558146 100644 (file)
@@ -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
 
 #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
index a7296e9a57645774d4a56ad16578750540991c99..a930cf89cc6a84ffe6a06dbf4dd0668d4045445f 100644 (file)
@@ -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__)
 #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;
index 7859db6d8cd710f8e7fdb2eae0dceed916b4ae0c..bd17655a9dd43b3b0afb7c91a32db1fdbcb758a0 100644 (file)
@@ -72,6 +72,8 @@ public:
 
 private:
 
+  PlatformPixelBuffer* createFramebuffer(int w, int h);
+
   static void handleUpdateTimeout(void *data);
 
   static void handleClipboardChange(int source, void *data);
index 4ee15ce5a4e1d1ddd70475c1a41c0827d9c7734e..429f63f1b9b5e6a030215395897d5a518257dbda 100644 (file)
@@ -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
 
 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;
 
index 7d91e09d0f258f7a6ae0d3b2550e05314b050199..728e5948e79dde8485e1ffa7f2559339be3bebba 100644 (file)
@@ -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
 
 #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;
index f834003ec33d82005dd73a024b01c81db8f0fde9..3675eb57a6074ce3075e77ced16507cacccd4ad5 100644 (file)
@@ -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;
index 0b0cee01dae781e44fe4a42ee8aa63e32895163c..6d54165f81f21ea9d00464dd6f0b0294ceced193 100644 (file)
@@ -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
 #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;