From: Pierre Ossman Date: Fri, 17 Jun 2011 07:35:56 +0000 (+0000) Subject: Implement optimised drawing operations for OS X. Didn't see any reduction in X-Git-Tag: v1.1.90~282 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c18753c3ee9d55f0454e7e02571f7ab636333e64;p=tigervnc.git 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 --- 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 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 + +#include + +#include +#include + +#include +#include + +#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 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 + +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 {