renderspu_cocoa_helper.m revision c9819fb7aaf7275898c2a4ad2f891245a4a13e67
4b22b9337f359bfd063322244f5336cc7c6ffcfars/** @file
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome * VirtualBox OpenGL Cocoa Window System Helper implementation
4b22b9337f359bfd063322244f5336cc7c6ffcfars */
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars/*
4b22b9337f359bfd063322244f5336cc7c6ffcfars * Copyright (C) 2009 Sun Microsystems, Inc.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *
4b22b9337f359bfd063322244f5336cc7c6ffcfars * This file is part of VirtualBox Open Source Edition (OSE), as
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * available from http://www.virtualbox.org. This file is free software;
4b22b9337f359bfd063322244f5336cc7c6ffcfars * you can redistribute it and/or modify it under the terms of the GNU
4b22b9337f359bfd063322244f5336cc7c6ffcfars * General Public License (GPL) as published by the Free Software
4b22b9337f359bfd063322244f5336cc7c6ffcfars * Foundation, in version 2 as it comes in the "COPYING" file of the
4b22b9337f359bfd063322244f5336cc7c6ffcfars * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
4b22b9337f359bfd063322244f5336cc7c6ffcfars * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4b22b9337f359bfd063322244f5336cc7c6ffcfars *
4b22b9337f359bfd063322244f5336cc7c6ffcfars * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
4b22b9337f359bfd063322244f5336cc7c6ffcfars * Clara, CA 95054 USA or visit http://www.sun.com if you need
4b22b9337f359bfd063322244f5336cc7c6ffcfars * additional information or have any questions.
4b22b9337f359bfd063322244f5336cc7c6ffcfars */
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#include "renderspu_cocoa_helper.h"
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#include "chromium.h" /* For the visual bits of chromium */
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#include <iprt/thread.h>
4b22b9337f359bfd063322244f5336cc7c6ffcfars#include <iprt/string.h>
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars/* Debug macros */
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define FBO 1 /* Disable this to see how the output is without the FBO in the middle of the processing chain. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars//#define SHOW_WINDOW_BACKGROUND 1 /* Define this to see the window background even if the window is clipped */
4b22b9337f359bfd063322244f5336cc7c6ffcfars//#define DEBUG_VERBOSE /* Define this could get some debug info about the messages flow. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifdef DEBUG_poetzsch
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define DEBUG_MSG(text) \
4b22b9337f359bfd063322244f5336cc7c6ffcfars printf text
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define DEBUG_MSG(text) \
4b22b9337f359bfd063322244f5336cc7c6ffcfars do {} while (0)
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifdef DEBUG_VERBOSE
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define DEBUG_MSG_1(text) \
4b22b9337f359bfd063322244f5336cc7c6ffcfars DEBUG_MSG(text)
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define DEBUG_MSG_1(text) \
4b22b9337f359bfd063322244f5336cc7c6ffcfars do {} while (0)
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifdef DEBUG_poetzsch
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define CHECK_GL_ERROR()\
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome do \
4b22b9337f359bfd063322244f5336cc7c6ffcfars { \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome checkGLError(__FILE__, __LINE__); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }while (0);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome static void checkGLError(char *file, int line)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLenum g = glGetError();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (g != GL_NO_ERROR)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome char *errStr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome switch (g)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_INVALID_ENUM: errStr = RTStrDup("GL_INVALID_ENUM"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_INVALID_VALUE: errStr = RTStrDup("GL_INVALID_VALUE"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_INVALID_OPERATION: errStr = RTStrDup("GL_INVALID_OPERATION"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_STACK_OVERFLOW: errStr = RTStrDup("GL_STACK_OVERFLOW"); break;
4b22b9337f359bfd063322244f5336cc7c6ffcfars case GL_STACK_UNDERFLOW: errStr = RTStrDup("GL_STACK_UNDERFLOW"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_OUT_OF_MEMORY: errStr = RTStrDup("GL_OUT_OF_MEMORY"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome case GL_TABLE_TOO_LARGE: errStr = RTStrDup("GL_TABLE_TOO_LARGE"); break;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome default: errStr = RTStrDup("UNKOWN"); break;
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("%s:%d: glError %d (%s)\n", file, line, g, errStr));
4b22b9337f359bfd063322244f5336cc7c6ffcfars RTMemFree(errStr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
4b22b9337f359bfd063322244f5336cc7c6ffcfars#define CHECK_GL_ERROR()\
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome do {} while (0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#define GL_SAVE_STATE \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomedo \
4b22b9337f359bfd063322244f5336cc7c6ffcfars{ \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glPushAttrib(GL_ALL_ATTRIB_BITS); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_PROJECTION); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glPushMatrix(); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_TEXTURE); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPushMatrix(); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_COLOR); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPushMatrix(); \
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome glMatrixMode(GL_MODELVIEW); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPushMatrix(); \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome} \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomewhile(0);
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome#define GL_RESTORE_STATE \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomedo \
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{ \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glMatrixMode(GL_MODELVIEW); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopMatrix(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glMatrixMode(GL_COLOR); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopMatrix(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glMatrixMode(GL_TEXTURE); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopMatrix(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glMatrixMode(GL_PROJECTION); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopMatrix(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopClientAttrib(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars glPopAttrib(); \
4b22b9337f359bfd063322244f5336cc7c6ffcfars} \
4b22b9337f359bfd063322244f5336cc7c6ffcfarswhile(0);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars/* Custom OpenGL context class. This implementation doesn't allow to set a view
4b22b9337f359bfd063322244f5336cc7c6ffcfars * to the context, but save the view for later use. Also it saves a copy of the
4b22b9337f359bfd063322244f5336cc7c6ffcfars * pixel format used to create that context for later use. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars@interface OverlayOpenGLContext: NSOpenGLContext
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars@private
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSOpenGLPixelFormat *m_pPixelFormat;
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSView *m_pView;
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (NSOpenGLPixelFormat*)openGLPixelFormat;
4b22b9337f359bfd063322244f5336cc7c6ffcfars@end
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars@class DockOverlayView;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars/* The custom view class. This is the main class of the cocoa OpenGL
4b22b9337f359bfd063322244f5336cc7c6ffcfars * implementation. It manages an frame buffer object for the rendering of the
4b22b9337f359bfd063322244f5336cc7c6ffcfars * guest applications. The guest applications render in this frame buffer which
4b22b9337f359bfd063322244f5336cc7c6ffcfars * is bind to an OpenGL texture. To display the guest content, an secondary
4b22b9337f359bfd063322244f5336cc7c6ffcfars * shared OpenGL context of the main OpenGL context is created. The secondary
4b22b9337f359bfd063322244f5336cc7c6ffcfars * context is marked as non opaque & the texture is displayed on an object
4b22b9337f359bfd063322244f5336cc7c6ffcfars * which is composed out of the several visible region rectangles. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars@interface OverlayView: NSView
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars@private
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSView *m_pParentView;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSOpenGLContext *m_pGLCtx;
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSOpenGLContext *m_pSharedGLCtx;
4b22b9337f359bfd063322244f5336cc7c6ffcfars RTTHREAD mThread;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* FBO handling */
4b22b9337f359bfd063322244f5336cc7c6ffcfars GLuint m_FBOId;
4b22b9337f359bfd063322244f5336cc7c6ffcfars GLuint m_FBOTexId;
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSSize m_FBOTexSize;
4b22b9337f359bfd063322244f5336cc7c6ffcfars GLuint m_FBODepthStencilPackedId;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* The corresponding dock tile view of this OpenGL view & all helper
4b22b9337f359bfd063322244f5336cc7c6ffcfars * members. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars DockOverlayView *m_DockTileView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLuint m_FBOThumbId;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLuint m_FBOThumbTexId;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLfloat m_FBOThumbScaleX;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLfloat m_FBOThumbScaleY;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome uint64_t m_uiDockUpdateTime;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* For clipping */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint m_cClipRects;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint *m_paClipRects;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Position/Size tracking */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSPoint m_Pos;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSSize m_Size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* This is necessary for clipping on the root window */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSPoint m_RootShift;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView*)pParentView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setGLCtx:(NSOpenGLContext*)pCtx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSOpenGLContext*)glCtx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setPos:(NSPoint)pos;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSPoint)pos;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setSize:(NSSize)size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSSize)size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)updateViewport;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)reshape;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)createFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)deleteFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)updateFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)makeCurrentFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)swapFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)flushFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)finishFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)bindFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)renderFBOToView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)clearVisibleRegions;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setVisibleRegions:(GLint)cRects paRects:(GLint*)paRects;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSView*)dockTileScreen;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)reshapeDockTile;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/* Helper view. This view is added as a sub view of the parent view to track
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * main window changes. Whenever the main window is changed (which happens on
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * fullscreen/seamless entry/exit) the overlay window is informed & can add
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * them self as a child window again. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@class OverlayWindow;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@interface OverlayHelperView: NSView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@private
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome OverlayWindow *m_pOverlayWindow;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome-(id)initWithOverlayWindow:(OverlayWindow*)pOverlayWindow;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/* Custom window class. This is the overlay window which contains our custom
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * NSView. Its a direct child of the Qt Main window. It marks its background
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * transparent & non opaque to make clipping possible. It also disable mouse
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * events and handle frame change events of the parent view. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@interface OverlayWindow: NSWindow
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@private
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *m_pParentView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome OverlayView *m_pOverlayView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome OverlayHelperView *m_pOverlayHelperView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSThread *m_Thread;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (id)initWithParentView:(NSView*)pParentView overlayView:(OverlayView*)pOverlayView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)parentWindowFrameChanged:(NSNotification *)note;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)parentWindowChanged:(NSWindow*)pWindow;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@interface DockOverlayView: NSView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSBitmapImageRep *m_ThumbBitmap;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSImage *m_ThumbImage;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSLock *m_Lock;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)dealloc;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)cleanup;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)lock;
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)unlock;
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)setFrame:(NSRect)frame;
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)drawRect:(NSRect)aRect;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSBitmapImageRep*)thumbBitmap;
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (NSImage*)thumbImage;
4b22b9337f359bfd063322244f5336cc7c6ffcfars@end
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars@implementation DockOverlayView
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (id)init
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome self = [super init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars if (self)
4b22b9337f359bfd063322244f5336cc7c6ffcfars {
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* We need a lock cause the thumb image could be accessed from the main
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * thread when someone is calling display on the dock tile & from the
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * OpenGL thread when the thumbnail is updated. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Lock = [[NSLock alloc] init];
4b22b9337f359bfd063322244f5336cc7c6ffcfars }
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars return self;
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)dealloc
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self cleanup];
4b22b9337f359bfd063322244f5336cc7c6ffcfars [m_Lock release];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars [super dealloc];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)cleanup
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars if (m_ThumbImage != nil)
4b22b9337f359bfd063322244f5336cc7c6ffcfars {
4b22b9337f359bfd063322244f5336cc7c6ffcfars [m_ThumbImage release];
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_ThumbImage = nil;
4b22b9337f359bfd063322244f5336cc7c6ffcfars }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_ThumbBitmap != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_ThumbBitmap release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_ThumbBitmap = nil;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)lock
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_Lock lock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)unlock
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_Lock unlock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setFrame:(NSRect)frame
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super setFrame:frame];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self lock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self cleanup];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Create a buffer for our thumbnail image. Its in the size of this view. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_ThumbBitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
4b22b9337f359bfd063322244f5336cc7c6ffcfars pixelsWide:frame.size.width
4b22b9337f359bfd063322244f5336cc7c6ffcfars pixelsHigh:frame.size.height
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome bitsPerSample:8
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome samplesPerPixel:4
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome hasAlpha:YES
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome isPlanar:NO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome colorSpaceName:NSDeviceRGBColorSpace
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome bytesPerRow:frame.size.width * 4
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome bitsPerPixel:8 * 4];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_ThumbImage = [[NSImage alloc] initWithSize:[m_ThumbBitmap size]];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_ThumbImage addRepresentation:m_ThumbBitmap];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self unlock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (BOOL)isFlipped
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars return YES;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)drawRect:(NSRect)aRect
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self lock];
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifdef SHOW_WINDOW_BACKGROUND
4b22b9337f359bfd063322244f5336cc7c6ffcfars [[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7] set];
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSRect frame = [self frame];
4b22b9337f359bfd063322244f5336cc7c6ffcfars [NSBezierPath fillRect:NSMakeRect(0, 0, frame.size.width, frame.size.height)];
4b22b9337f359bfd063322244f5336cc7c6ffcfars#endif /* SHOW_WINDOW_BACKGROUND */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_ThumbImage != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_ThumbImage drawAtPoint:NSMakePoint(0, 0) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self unlock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSBitmapImageRep*)thumbBitmap
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_ThumbBitmap;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSImage*)thumbImage
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_ThumbImage;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* OverlayOpenGLContext class implementation
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@implementation OverlayOpenGLContext
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome-(id)initWithFormat:(NSOpenGLPixelFormat*)format shareContext:(NSOpenGLContext*)share
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pPixelFormat = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pView = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome self = [super initWithFormat:format shareContext:share];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (self)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pPixelFormat = format;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return self;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)dealloc
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Dealloc context %X\n", (uint)self));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pPixelFormat release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super dealloc];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome-(bool)isDoubleBuffer
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint val;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pPixelFormat getValues:&val forAttribute:NSOpenGLPFADoubleBuffer forVirtualScreen:0];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return val == GL_TRUE ? YES : NO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome-(void)setView:(NSView*)view
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_pView = view;;
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super setView: view];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars-(NSView*)view
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_pView;
4b22b9337f359bfd063322244f5336cc7c6ffcfars#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return [super view];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars-(void)clearDrawable
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_pView = NULL;;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super clearDrawable];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars-(NSOpenGLPixelFormat*)openGLPixelFormat
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_pPixelFormat;
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars@end;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars/********************************************************************************
4b22b9337f359bfd063322244f5336cc7c6ffcfars*
4b22b9337f359bfd063322244f5336cc7c6ffcfars* OverlayHelperView class implementation
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@implementation OverlayHelperView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome-(id)initWithOverlayWindow:(OverlayWindow*)pOverlayWindow
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome self = [super initWithFrame:NSZeroRect];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pOverlayWindow = pOverlayWindow;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars return self;
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars-(void)viewDidMoveToWindow
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars [m_pOverlayWindow parentWindowChanged:[self window]];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* OverlayWindow class implementation
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@implementation OverlayWindow
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (id)initWithParentView:(NSView*)pParentView overlayView:(OverlayView*)pOverlayView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if(self = [super initWithContentRect:NSZeroRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pParentView = pParentView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pOverlayView = pOverlayView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Thread = [NSThread currentThread];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pOverlayHelperView = [[OverlayHelperView alloc] initWithOverlayWindow:self];
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Add the helper view as a child of the parent view to get notifications */
4b22b9337f359bfd063322244f5336cc7c6ffcfars [pParentView addSubview:m_pOverlayHelperView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Make sure this window is transparent */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef SHOW_WINDOW_BACKGROUND
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* For debugging */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setBackgroundColor:[NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:0.7]];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setBackgroundColor:[NSColor clearColor]];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setOpaque:NO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setAlphaValue:.999];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Disable mouse events for this window */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setIgnoresMouseEvents:YES];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSWindow *pParentWin = [m_pParentView window];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Initial set the position to the parents view top/left (Compiz fix). */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setFrameOrigin:
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pParentWin convertBaseToScreen:
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pParentView convertPoint:NSZeroPoint toView:nil]]];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Set the overlay view as our content view */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self setContentView:m_pOverlayView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Add ourself as a child to the parent views window. Note: this has to
4b22b9337f359bfd063322244f5336cc7c6ffcfars * be done last so that everything else is setup in
4b22b9337f359bfd063322244f5336cc7c6ffcfars * parentWindowChanged. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars [pParentWin addChildWindow:self ordered:NSWindowAbove];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
4b22b9337f359bfd063322244f5336cc7c6ffcfars return self;
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)dealloc
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars DEBUG_MSG(("Dealloc window %X\n", (uint)self));
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars [[NSNotificationCenter defaultCenter] removeObserver:self];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pOverlayHelperView removeFromSuperview];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pOverlayHelperView release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super dealloc];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)parentWindowFrameChanged:(NSNotification*)pNote
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Reposition this window with the help of the OverlayView. Perform the
4b22b9337f359bfd063322244f5336cc7c6ffcfars * call in the OpenGL thread. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars// [m_pOverlayView performSelector:@selector(reshape) onThread:m_Thread withObject:nil waitUntilDone:YES];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pOverlayView reshape];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)parentWindowChanged:(NSWindow*)pWindow
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[NSNotificationCenter defaultCenter] removeObserver:self];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if(pWindow != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Ask to get notifications when our parent window frame changes. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[NSNotificationCenter defaultCenter]
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome addObserver:self
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome selector:@selector(parentWindowFrameChanged:)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome name:NSWindowDidResizeNotification
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome object:pWindow];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Add us self as child window */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pWindow addChildWindow:self ordered:NSWindowAbove];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Reshape the overlay view after a short waiting time to let the main
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * window resize itself properly. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [m_pOverlayView performSelector:@selector(reshape) withObject:nil afterDelay:0.2];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [NSTimer scheduledTimerWithTimeInterval:0.2 target:m_pOverlayView selector:@selector(reshape) userInfo:nil repeats:NO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pOverlayView reshape];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* OverlayView class implementation
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@implementation OverlayView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (id)initWithFrame:(NSRect)frame thread:(RTTHREAD)aThread parentView:(NSView*)pParentView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pParentView = pParentView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Make some reasonable defaults */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pGLCtx = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pSharedGLCtx = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome mThread = aThread;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize = NSZeroSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBODepthStencilPackedId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_cClipRects = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Pos = NSZeroPoint;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Size = NSZeroSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_RootShift = NSZeroPoint;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Init view %X (%X)\n", (uint)self, (uint)mThread));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome self = [super initWithFrame:frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return self;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)dealloc
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Dealloc view %X\n", (uint)self));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self deleteFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([m_pGLCtx view] == self)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx clearDrawable];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pSharedGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([m_pSharedGLCtx view] == self)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx clearDrawable];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self clearVisibleRegions];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [super dealloc];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)drawRect:(NSRect)aRect
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// NSGraphicsContext*pC = [NSGraphicsContext currentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [[NSColor blueColor] set];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// NSBezierPath *p = [[NSBezierPath alloc] bezierPathWithOvalInRect:[self frame]];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [p fill];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [[NSColor greenColor] set];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [p stroke];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// if ([self lockFocusIfCanDraw])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [self renderFBOToView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [self unlockFocus];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setGLCtx:(NSOpenGLContext*)pCtx
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pGLCtx = pCtx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSOpenGLContext*)glCtx
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_pGLCtx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setPos:(NSPoint)pos
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Pos = pos;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self reshape];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSPoint)pos
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_Pos;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setSize:(NSSize)size
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_Size = size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self reshape];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self updateFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSSize)size
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return m_Size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)updateViewport
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pSharedGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Update the viewport for our OpenGL view */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx makeCurrentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx update];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect r = [self frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Setup all matrices */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_PROJECTION);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glViewport(0, 0, r.size.width, r.size.height);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glOrtho(0, r.size.width, 0, r.size.height, -1, 1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_TEXTURE);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTranslatef(0.0f, m_RootShift.y, 0.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_MODELVIEW);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTranslatef(-m_RootShift.x, 0.0f, 0.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Clear background to transparent */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnable(GL_TEXTURE_RECTANGLE_ARB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx makeCurrentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)reshape
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Getting the right screen coordinates of the parents frame is a little bit
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * complicated. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect parentFrame = [m_pParentView frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSPoint parentPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:NSMakePoint(parentFrame.origin.x, parentFrame.origin.y + parentFrame.size.height)]];
4b22b9337f359bfd063322244f5336cc7c6ffcfars parentFrame.origin.x = parentPos.x;
4b22b9337f359bfd063322244f5336cc7c6ffcfars parentFrame.origin.y = parentPos.y;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Calculate the new screen coordinates of the overlay window. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSPoint childPos = NSMakePoint(m_Pos.x, m_Pos.y + m_Size.height);
4b22b9337f359bfd063322244f5336cc7c6ffcfars childPos = [[m_pParentView window] convertBaseToScreen:[[m_pParentView superview] convertPointToBase:childPos]];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Make a frame out of it. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSRect childFrame = NSMakeRect(childPos.x, childPos.y, m_Size.width, m_Size.height);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* We have to make sure that the overlay window will not be displayed out
4b22b9337f359bfd063322244f5336cc7c6ffcfars * of the parent window. So intersect both frames & use the result as the new
4b22b9337f359bfd063322244f5336cc7c6ffcfars * frame for the window. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSRect newFrame = NSIntersectionRect(parentFrame, childFrame);
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Later we have to correct the texture position in the case the window is
4b22b9337f359bfd063322244f5336cc7c6ffcfars * out of the parents window frame. So save the shift values for later use. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars if (parentFrame.origin.x > childFrame.origin.x)
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_RootShift.x = parentFrame.origin.x - childFrame.origin.x;
4b22b9337f359bfd063322244f5336cc7c6ffcfars else
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_RootShift.x = 0;
4b22b9337f359bfd063322244f5336cc7c6ffcfars if (parentFrame.origin.y > childFrame.origin.y)
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_RootShift.y = parentFrame.origin.y - childFrame.origin.y;
4b22b9337f359bfd063322244f5336cc7c6ffcfars else
4b22b9337f359bfd063322244f5336cc7c6ffcfars m_RootShift.y = 0;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars// NSScrollView *pScrollView = [[[m_pParentView window] contentView] enclosingScrollView];
4b22b9337f359bfd063322244f5336cc7c6ffcfars// if (pScrollView)
4b22b9337f359bfd063322244f5336cc7c6ffcfars// {
4b22b9337f359bfd063322244f5336cc7c6ffcfars// NSRect scrollRect = [pScrollView documentVisibleRect];
4b22b9337f359bfd063322244f5336cc7c6ffcfars// NSRect scrollRect = [m_pParentView visibleRect];
4b22b9337f359bfd063322244f5336cc7c6ffcfars// printf ("sc rect: %d %d %d %d\n", (int) scrollRect.origin.x,(int) scrollRect.origin.y,(int) scrollRect.size.width,(int) scrollRect.size.height);
4b22b9337f359bfd063322244f5336cc7c6ffcfars// NSRect b = [[m_pParentView superview] bounds];
4b22b9337f359bfd063322244f5336cc7c6ffcfars// printf ("bound rect: %d %d %d %d\n", (int) b.origin.x,(int) b.origin.y,(int) b.size.width,(int) b.size.height);
4b22b9337f359bfd063322244f5336cc7c6ffcfars// newFrame.origin.x += scrollRect.origin.x;
4b22b9337f359bfd063322244f5336cc7c6ffcfars// newFrame.origin.y += scrollRect.origin.y;
4b22b9337f359bfd063322244f5336cc7c6ffcfars// }
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Set the new frame. */
4b22b9337f359bfd063322244f5336cc7c6ffcfars [[self window] setFrame:newFrame display:YES];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Inform the dock tile view as well */
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self reshapeDockTile];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars /* Make sure the context is updated according */
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self updateViewport];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars- (void)createFBO
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self deleteFBO];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
4b22b9337f359bfd063322244f5336cc7c6ffcfars GL_SAVE_STATE;
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* If not previously setup generate IDs for FBO and its associated texture. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!m_FBOId)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Make sure the framebuffer extension is supported */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome const GLubyte* strExt;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLboolean isFBO;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Get the extension name string. It is a space-delimited list of the
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * OpenGL extensions that are supported by the current renderer. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome strExt = glGetString(GL_EXTENSIONS);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome isFBO = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!isFBO)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Your system does not support framebuffer extension\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Create FBO object */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGenFramebuffersEXT(1, &m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* & the texture as well the depth/stencil render buffer */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGenTextures(1, &m_FBOTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("Create FBO %d %d\n", m_FBOId, m_FBOTexId));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGenRenderbuffersEXT(1, &m_FBODepthStencilPackedId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize = m_Size;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Bind to FBO */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnable(GL_TEXTURE_RECTANGLE_ARB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLfloat imageAspectRatio = m_FBOTexSize.width / m_FBOTexSize.height;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Sanity check against maximum OpenGL texture size. If bigger adjust to
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * maximum possible size while maintain the aspect ratio. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint maxTexSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// maxTexSize = 150;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint filter = GL_NEAREST;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBOTexSize.width > maxTexSize || m_FBOTexSize.height > maxTexSize)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome filter = GL_NICEST;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (imageAspectRatio > 1)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize.width = maxTexSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize.height = maxTexSize / imageAspectRatio;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize.width = maxTexSize * imageAspectRatio;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexSize.height = maxTexSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Initialize FBO Texture */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, filter);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, filter);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* The GPUs like the GL_BGRA / GL_UNSIGNED_INT_8_8_8_8_REV combination
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * others are also valid, but might incur a costly software translation. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, m_FBOTexSize.width, m_FBOTexSize.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Now attach texture to the FBO as its color destination */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, m_FBOTexSize.width, m_FBOTexSize.height);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_FBODepthStencilPackedId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Make sure the FBO was created succesfully. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (GL_FRAMEBUFFER_COMPLETE_EXT != glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Framebuffer Object creation or update failed!\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Is there a dock tile preview enabled in the GUI? If so setup a
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * additional thumbnail view for the dock tile. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *dockScreen = [self dockTileScreen];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (dockScreen)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!m_FBOThumbId)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGenFramebuffersEXT(1, &m_FBOThumbId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGenTextures(1, &m_FBOThumbTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOThumbId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Initialize FBO Texture */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOThumbTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NICEST);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NICEST);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* The GPUs like the GL_BGRA / GL_UNSIGNED_INT_8_8_8_8_REV combination
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * others are also valid, but might incur a costly software translation. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, m_FBOTexSize.width * m_FBOThumbScaleX, m_FBOTexSize.height * m_FBOThumbScaleY, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Now attach texture to the FBO as its color destination */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_FBOThumbTexId, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Make sure the FBO was created succesfully. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (GL_FRAMEBUFFER_COMPLETE_EXT != glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT))
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("Framebuffer Thumb Object creation or update failed!\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_DockTileView = [[DockOverlayView alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self reshapeDockTile];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [dockScreen addSubview:m_DockTileView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Initialize with one big visual region over the full size */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self clearVisibleRegions];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_cClipRects = 1;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects = (GLint*)RTMemAlloc(sizeof(GLint) * 4);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects[0] = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects[1] = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects[2] = m_FBOTexSize.width;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects[3] = m_FBOTexSize.height;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_RESTORE_STATE;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)deleteFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([NSOpenGLContext currentContext] != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_SAVE_STATE;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBODepthStencilPackedId > 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glDeleteRenderbuffersEXT(1, &m_FBODepthStencilPackedId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBODepthStencilPackedId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBOTexId > 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnable(GL_TEXTURE_RECTANGLE_ARB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glDeleteTextures(1, &m_FBOTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOTexId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBOId > 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glDeleteFramebuffersEXT(1, &m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOId = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_RESTORE_STATE;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_DockTileView != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView removeFromSuperview];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_DockTileView = nil;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)updateFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self makeCurrentFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self createFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx update];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)makeCurrentFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("MakeCurrent called %X\n", self));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if([NSOpenGLContext currentContext] != 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([m_pGLCtx view] != self)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* We change the active view, so flush first */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if([NSOpenGLContext currentContext] != 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx setView: self];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome CHECK_GL_ERROR();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// if ([NSOpenGLContext currentContext] != m_pGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx makeCurrentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome CHECK_GL_ERROR();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [m_pGLCtx update];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)swapFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("SwapCurrent called %X\n", self));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint tmpFB;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("Swap GetINT %d\n", tmpFB));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Don't use flush buffers cause we are using FBOs here */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [m_pGLCtx flushBuffer];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (tmpFB == m_FBOId)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([self lockFocusIfCanDraw])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self renderFBOToView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self unlockFocus];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx flushBuffer];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)flushFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint tmpFB;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1 (("Flush GetINT %d\n", tmpFB));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (tmpFB == m_FBOId)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([self lockFocusIfCanDraw])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self renderFBOToView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self unlockFocus];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)finishFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint tmpFB;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &tmpFB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFinish();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1 (("Finish GetINT %d\n", tmpFB));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (tmpFB == m_FBOId)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([self lockFocusIfCanDraw])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self renderFBOToView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self unlockFocus];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)bindFBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)renderFBOToView
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!m_pSharedGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Create a shared context out of the main context. Use the same pixel format. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_pSharedGLCtx = [[NSOpenGLContext alloc] initWithFormat:[(OverlayOpenGLContext*)m_pGLCtx openGLPixelFormat] shareContext:m_pGLCtx];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Set the new context as non opaque */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint opaque = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx setValues:&opaque forParameter:NSOpenGLCPSurfaceOpacity];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Only swap on screen refresh */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// GLint swap = 1;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [m_pSharedGLCtx setValues:&swap forParameter:NSOpenGLCPSwapInterval];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Set this view as the drawable for the new context */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx setView: self];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [self updateViewport];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_pSharedGLCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect r = [self frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBOTexId > 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx makeCurrentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (m_FBOThumbTexId > 0 &&
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView thumbBitmap] != nil)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Only update after atleast 200 ms, cause glReadPixels is
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * heavy performance wise. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome uint64_t uiNewTime = RTTimeMilliTS();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (uiNewTime - m_uiDockUpdateTime > 200)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_uiDockUpdateTime = uiNewTime;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#if 0
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* todo: check this for optimization */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_STORAGE_HINT_APPLE,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_STORAGE_SHARED_APPLE);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome sizex, sizey, 0, GL_BGRA,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_UNSIGNED_INT_8_8_8_8_REV, myImagePtr);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome 0, 0, 0, 0, 0, image_width, image_height);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // Do other work processing here, using a double or triple buffer
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glGetTexImage(GL_TEXTURE_RECTANGLE_ARB, 0, GL_BGRA,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_SAVE_STATE;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_FBOThumbId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* We like to read from the primary color buffer */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect rr = [m_DockTileView frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Setup all matrices */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_PROJECTION);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glViewport(0, 0, rr.size.width, rr.size.height);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glOrtho(0, rr.size.width, 0, rr.size.height, -1, 1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glScalef(m_FBOThumbScaleX, m_FBOThumbScaleY, 1.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_TEXTURE);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTranslatef(0.0f, m_RootShift.y, 0.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glMatrixMode(GL_MODELVIEW);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glLoadIdentity();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Clear background to transparent */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glClear(GL_COLOR_BUFFER_BIT);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnable(GL_TEXTURE_RECTANGLE_ARB);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_FBOTexId);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint i;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome for (i = 0; i < m_cClipRects; ++i)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint x1 = m_paClipRects[4*i];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint y1 = (r.size.height - m_paClipRects[4*i+1]);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint x2 = m_paClipRects[4*i+2];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint y2 = (r.size.height - m_paClipRects[4*i+3]);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBegin(GL_QUADS);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x1, y1); glVertex2i(x1, y1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x1, y2); glVertex2i(x1, y2);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x2, y2); glVertex2i(x2, y2);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x2, y1); glVertex2i(x2, y1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnd();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFinish();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Here the magic of reading the FBO content in our own buffer
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * happens. We have to lock this access, in the case the dock
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * is updated currently. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView lock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glReadPixels(0, 0, rr.size.width, rr.size.height,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_RGBA,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_UNSIGNED_BYTE,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[m_DockTileView thumbBitmap] bitmapData]);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView unlock];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSDockTile *pDT = [[NSApplication sharedApplication] dockTile];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Send a display message to the dock tile in the main thread */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[[NSApplication sharedApplication] dockTile] performSelectorOnMainThread:@selector(display) withObject:nil waitUntilDone:NO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GL_RESTORE_STATE;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Clear background to transparent */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glClear(GL_COLOR_BUFFER_BIT);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Blit the content of the FBO to the screen. todo: check for
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * optimization with display lists. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint i;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome for (i = 0; i < m_cClipRects; ++i)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint x1 = m_paClipRects[4*i];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint y1 = r.size.height - m_paClipRects[4*i+1];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint x2 = m_paClipRects[4*i+2];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome GLint y2 = r.size.height - m_paClipRects[4*i+3];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBegin(GL_QUADS);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x1, y1); glVertex2i(x1, y1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x1, y2); glVertex2i(x1, y2);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x2, y2); glVertex2i(x2, y2);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glTexCoord2i(x2, y1); glVertex2i(x2, y1);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glEnd();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pSharedGLCtx flushBuffer];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_pGLCtx makeCurrentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)clearVisibleRegions
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if(m_paClipRects)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome RTMemFree(m_paClipRects);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects = NULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_cClipRects = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)setVisibleRegions:(GLint)cRects paRects:(GLint*)paRects
4b22b9337f359bfd063322244f5336cc7c6ffcfars{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("New region recieved\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars [self clearVisibleRegions];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (cRects>0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_paClipRects = (GLint*)RTMemAlloc(sizeof(GLint) * 4 * cRects);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_cClipRects = cRects;
4b22b9337f359bfd063322244f5336cc7c6ffcfars memcpy(m_paClipRects, paRects, sizeof(GLint) * 4 * cRects);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (NSView*)dockTileScreen
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *contentView = [[[NSApplication sharedApplication] dockTile] contentView];
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSView *screenContent = nil;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([contentView respondsToSelector:@selector(screenContent)])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome screenContent = [contentView performSelector:@selector(screenContent)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return screenContent;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome- (void)reshapeDockTile
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect dockFrame = [[self dockTileScreen] frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect parentFrame = [m_pParentView frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOThumbScaleX = (float)dockFrame.size.width / parentFrame.size.width;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome m_FBOThumbScaleY = (float)dockFrame.size.height / parentFrame.size.height;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect newFrame = NSMakeRect ((int)(m_Pos.x * m_FBOThumbScaleX), (int)(dockFrame.size.height - (m_Pos.y + m_Size.height - m_RootShift.y) * m_FBOThumbScaleY), (int)(m_Size.width * m_FBOThumbScaleX), (int)(m_Size.height * m_FBOThumbScaleY));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// NSRect newFrame = NSMakeRect ((int)roundf(m_Pos.x * m_FBOThumbScaleX), (int)roundf(dockFrame.size.height - (m_Pos.y + m_Size.height) * m_FBOThumbScaleY), (int)roundf(m_Size.width * m_FBOThumbScaleX), (int)roundf(m_Size.height * m_FBOThumbScaleY));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// NSRect newFrame = NSMakeRect ((m_Pos.x * m_FBOThumbScaleX), (dockFrame.size.height - (m_Pos.y + m_Size.height) * m_FBOThumbScaleY), (m_Size.width * m_FBOThumbScaleX), (m_Size.height * m_FBOThumbScaleY));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// printf ("%f %f %f %f - %f %f\n", newFrame.origin.x, newFrame.origin.y, newFrame.size.width, newFrame.size.height, m_Size.height, m_FBOThumbScaleY);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [m_DockTileView setFrame: newFrame];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome@end
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* OpenGL context management
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaGLCtxCreate(NativeGLCtxRef *ppCtx, GLbitfield fVisParams)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLPixelFormatAttribute attribs[24] =
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSOpenGLPFAWindow,
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSOpenGLPFAAccelerated,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome };
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome int i = 4;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_ALPHA_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_ALPHA_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFAAlphaSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 8;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_DEPTH_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_DEPTH_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFADepthSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 24;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_STENCIL_BIT)
4b22b9337f359bfd063322244f5336cc7c6ffcfars {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_STENCIL_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFAStencilSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 8;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_ACCUM_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_ACCUM_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFAAccumSize;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_ALPHA_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 32;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 24;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_MULTISAMPLE_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_MULTISAMPLE_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFASampleBuffers;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 1;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFASamples;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 4;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_DOUBLE_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_DOUBLE_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFADoubleBuffer;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (fVisParams & CR_STEREO_BIT)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("CR_DOUBLE_BIT requested\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = NSOpenGLPFAStereo;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Mark the end */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome attribs[i++] = 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Choose a pixel format */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLPixelFormat* pFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pFmt)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *ppCtx = [[OverlayOpenGLContext alloc] initWithFormat:pFmt shareContext:nil];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Enable multi threaded OpenGL engine */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// CGLContextObj cglCtx = [*ppCtx CGLContextObj];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// CGLError err = CGLEnable(cglCtx, kCGLCEMPEngine);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// if (err != kCGLNoError)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// printf ("Couldn't enable MT OpenGL engine!\n");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG(("New context %X\n", (uint)*ppCtx));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaGLCtxDestroy(NativeGLCtxRef pCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
4b22b9337f359bfd063322244f5336cc7c6ffcfars NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [pCtx release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* View management
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewCreate(NativeViewRef *ppView, NativeViewRef pParentView, GLbitfield fVisParams)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Create our worker view */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome OverlayView* pView = [[OverlayView alloc] initWithFrame:NSZeroRect thread:RTThreadSelf() parentView:pParentView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* We need a real window as container for the view */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[OverlayWindow alloc] initWithParentView:pParentView overlayView:pView];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Return the freshly created overlay view */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *ppView = pView;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewDestroy(NativeViewRef pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
4b22b9337f359bfd063322244f5336cc7c6ffcfars
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome /* Hide the view early */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView setHidden: YES];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSWindow *win = [pView window];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[NSNotificationCenter defaultCenter] removeObserver:win];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [win setContentView: nil];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [[win parentWindow] removeChildWindow: win];
4b22b9337f359bfd063322244f5336cc7c6ffcfars int b = [win retainCount];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// for (; b > 1; --b)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [win performSelector:@selector(release)]
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome [win performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome// [win release];
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome /* There seems to be a bug in the performSelector method which is called in
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome * parentWindowChanged above. The object is retained but not released. This
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * results in an unbalanced reference count, which is here manually
4b22b9337f359bfd063322244f5336cc7c6ffcfars * decremented. */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome int a = [pView retainCount];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// for (; a > 1; --a)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// [pView release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewShow(NativeViewRef pView, GLboolean fShowIt)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView setHidden: fShowIt==GL_TRUE?NO:YES];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewDisplay(NativeViewRef pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView swapFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewSetPosition(NativeViewRef pView, NativeViewRef pParentView, int x, int y)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView setPos:NSMakePoint(x, y)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewSetSize(NativeViewRef pView, int w, int h)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView setSize:NSMakeSize(w, h)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewGetGeometry(NativeViewRef pView, int *pX, int *pY, int *pW, int *pH)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSRect frame = [[pView window] frame];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *pX = frame.origin.x;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *pY = frame.origin.y;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *pW = frame.size.width;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *pH = frame.size.height;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars [pPool release];
4b22b9337f359bfd063322244f5336cc7c6ffcfars}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewMakeCurrentContext(NativeViewRef pView, NativeGLCtxRef pCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView setGLCtx:pCtx];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView makeCurrentFBO];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaViewSetVisibleRegion(NativeViewRef pView, GLint cRects, GLint* paRects)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [(OverlayView*)pView setVisibleRegions:cRects paRects:paRects];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/********************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome* Additional OpenGL wrapper
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome*
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome********************************************************************************/
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaFlush()
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// return;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome DEBUG_MSG_1(("glFlush called\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# if 0
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pCtx)
4b22b9337f359bfd063322244f5336cc7c6ffcfars {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *pView = [pCtx view];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([pView respondsToSelector:@selector(flushFBO)])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView performSelector:@selector(flushFBO)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome# endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFlush();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
4b22b9337f359bfd063322244f5336cc7c6ffcfars [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaFinish()
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("glFinish called\n"));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *pView = [pCtx view];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([pView respondsToSelector:@selector(finishFBO)])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView performSelector:@selector(finishFBO)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glFinish();
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soomevoid cocoaBindFramebufferEXT(GLenum target, GLuint framebuffer)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DEBUG_MSG_1(("glRenderspuBindFramebufferEXT called %d\n", framebuffer));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#ifdef FBO
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (framebuffer != 0)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(target, framebuffer);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSOpenGLContext *pCtx = [NSOpenGLContext currentContext];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pCtx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome NSView *pView = [pCtx view];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (pView)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if ([pView respondsToSelector:@selector(bindFBO)])
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pView performSelector:@selector(bindFBO)];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome glBindFramebufferEXT(target, framebuffer);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#endif
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome [pPool release];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome