summaryrefslogtreecommitdiffstats
path: root/vncviewer
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2011-06-17 07:35:56 +0000
committerPierre Ossman <ossman@cendio.se>2011-06-17 07:35:56 +0000
commitc18753c3ee9d55f0454e7e02571f7ab636333e64 (patch)
tree285df0279926e0147f56866ded6acfb38012794f /vncviewer
parent84483e93176d34832fd41679eb485e7a9618b296 (diff)
downloadtigervnc-c18753c3ee9d55f0454e7e02571f7ab636333e64.tar.gz
tigervnc-c18753c3ee9d55f0454e7e02571f7ab636333e64.zip
Implement optimised drawing operations for OS X. Didn't see any reduction in
CPU usage unfortunately, but at least we're now using the native pixel format of our server which avoids a conversion on the server side. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4504 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'vncviewer')
-rw-r--r--vncviewer/CMakeLists.txt4
-rw-r--r--vncviewer/OSXPixelBuffer.cxx104
-rw-r--r--vncviewer/OSXPixelBuffer.h37
-rw-r--r--vncviewer/Viewport.h7
4 files changed, 150 insertions, 2 deletions
diff --git a/vncviewer/CMakeLists.txt b/vncviewer/CMakeLists.txt
index 12cd8aee..524a007f 100644
--- a/vncviewer/CMakeLists.txt
+++ b/vncviewer/CMakeLists.txt
@@ -23,7 +23,9 @@ endif()
if(WIN32)
set(VNCVIEWER_SOURCES ${VNCVIEWER_SOURCES} Win32PixelBuffer.cxx)
-elseif(NOT APPLE)
+elseif(APPLE)
+ set(VNCVIEWER_SOURCES ${VNCVIEWER_SOURCES} OSXPixelBuffer.cxx)
+else()
set(VNCVIEWER_SOURCES ${VNCVIEWER_SOURCES} X11PixelBuffer.cxx)
endif()
diff --git a/vncviewer/OSXPixelBuffer.cxx b/vncviewer/OSXPixelBuffer.cxx
new file mode 100644
index 00000000..b5882d7a
--- /dev/null
+++ b/vncviewer/OSXPixelBuffer.cxx
@@ -0,0 +1,104 @@
+/* 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.
+ */
+
+#include <assert.h>
+
+#include <ApplicationServices/ApplicationServices.h>
+
+#include <FL/Fl_Window.H>
+#include <FL/x.H>
+
+#include <rfb/LogWriter.h>
+#include <rfb/Exception.h>
+
+#include "OSXPixelBuffer.h"
+
+using namespace rfb;
+
+static rfb::LogWriter vlog("PlatformPixelBuffer");
+
+PlatformPixelBuffer::PlatformPixelBuffer(int width, int height) :
+ ManagedPixelBuffer(rfb::PixelFormat(32, 24, false, true,
+ 255, 255, 255, 16, 8, 0),
+ width, height),
+ image(NULL)
+{
+ CGColorSpaceRef lut;
+ CGDataProviderRef provider;
+
+ lut = CGColorSpaceCreateDeviceRGB();
+ assert(lut);
+ provider = CGDataProviderCreateWithData(NULL, data, datasize, NULL);
+ assert(provider);
+
+ image = CGImageCreate(width, height, 8, 32, width*4, lut,
+ kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
+ provider, NULL, false, kCGRenderingIntentDefault);
+ assert(image);
+
+ CGDataProviderRelease(provider);
+ CGColorSpaceRelease(lut);
+}
+
+
+PlatformPixelBuffer::~PlatformPixelBuffer()
+{
+ CGImageRelease((CGImageRef)image);
+}
+
+
+void PlatformPixelBuffer::draw(int src_x, int src_y, int x, int y, int w, int h)
+{
+ CGRect rect;
+ CGContextRef gc;
+ CGAffineTransform at;
+
+ gc = (CGContextRef)fl_gc;
+
+ CGContextSaveGState(gc);
+
+ // We have to use clipping to partially display an image
+
+ rect.origin.x = x - 0.5;
+ rect.origin.y = y - 0.5;
+ rect.size.width = w;
+ rect.size.height = h;
+
+ CGContextClipToRect(gc, rect);
+
+ // Oh the hackiness that is OS X image handling...
+ // The CGContextDrawImage() routine magically flips the images and offsets
+ // them by 0.5,0.5 in order to compensate for OS X unfamiliar coordinate
+ // system. But this breaks horribly when you set up the CTM to get the
+ // more familiar top-down system (which FLTK does), meaning we have to
+ // reset the CTM back to the identity matrix and calculate new origin
+ // coordinates.
+
+ at = CGContextGetCTM(gc);
+ CGContextScaleCTM(gc, 1, -1);
+ CGContextTranslateCTM(gc, -at.tx, -at.ty);
+
+ rect.origin.x = x - src_x;
+ rect.origin.y = Fl_Window::current()->h() - (y - src_y);
+ rect.size.width = width();
+ rect.size.height = -height(); // Negative height does _not_ flip the image
+
+ CGContextDrawImage(gc, rect, (CGImageRef)image);
+
+ CGContextRestoreGState(gc);
+}
diff --git a/vncviewer/OSXPixelBuffer.h b/vncviewer/OSXPixelBuffer.h
new file mode 100644
index 00000000..a74830c2
--- /dev/null
+++ b/vncviewer/OSXPixelBuffer.h
@@ -0,0 +1,37 @@
+/* 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 __OSXPIXELBUFFER_H__
+#define __OSXPIXELBUFFER_H__
+
+#include <rfb/PixelBuffer.h>
+
+class PlatformPixelBuffer: public rfb::ManagedPixelBuffer {
+public:
+ PlatformPixelBuffer(int width, int height);
+ ~PlatformPixelBuffer();
+
+ void draw(int src_x, int src_y, int x, int y, int w, int h);
+
+protected:
+ // This is really a CGImageRerf, but Apple headers conflict with FLTK
+ void *image;
+};
+
+
+#endif
diff --git a/vncviewer/Viewport.h b/vncviewer/Viewport.h
index 0b3a6c73..9eb3b73c 100644
--- a/vncviewer/Viewport.h
+++ b/vncviewer/Viewport.h
@@ -36,11 +36,16 @@
#if defined(WIN32)
#include "Win32PixelBuffer.h"
#elif defined(__APPLE__)
-#include "PlatformPixelBuffer.h"
+#include "OSXPixelBuffer.h"
#else
#include "X11PixelBuffer.h"
#endif
+// We also have a generic version of the above, using pure FLTK:
+//
+// #include "PlatformPixelBuffer.h"
+//
+
class CConn;
class Viewport : public Fl_Widget {