Remove old Carbon-based OS X graphics back-end

This back-end has been deprecated by Apple for a while, and has not been used in Panda.  As we will no longer be supporting 32-bit macs going forward, and the Carbon windowing API is not available for 64-bit mac, there's no point in keeping it.
This commit is contained in:
rdb 2019-01-09 16:58:46 -05:00
parent de9b9590de
commit 58acc25ea2
27 changed files with 6 additions and 6179 deletions

View File

@ -94,7 +94,7 @@ PkgListSet(["PYTHON", "DIRECT", # Python support
"GTK2", # GTK2 is used for PStats on Unix
"MFC", "WX", "FLTK", # Used for web plug-in only
"ROCKET", # GUI libraries
"CARBON", "COCOA", # Mac OS X toolkits
"COCOA", # Mac OS X toolkits
"X11", # Unix platform support
"PANDATOOL", "PVIEW", "DEPLOYTOOLS", # Toolchain
"SKEL", # Example SKEL project
@ -178,6 +178,7 @@ def parseopts(args):
# Options for which to display a deprecation warning.
removedopts = [
"use-touchinput", "no-touchinput", "no-awesomium", "no-directscripts",
"no-carbon",
]
# All recognized options.
@ -622,7 +623,6 @@ if (COMPILER == "MSVC"):
PkgDisable("GLES")
PkgDisable("GLES2")
PkgDisable("EGL")
PkgDisable("CARBON")
PkgDisable("COCOA")
DefSymbol("FLEX", "YY_NO_UNISTD_H")
if (PkgSkip("PYTHON")==0):
@ -875,14 +875,10 @@ if (COMPILER == "MSVC"):
if (COMPILER=="GCC"):
if GetTarget() != "darwin":
PkgDisable("CARBON")
PkgDisable("COCOA")
elif RUNTIME:
# We don't support Cocoa in the runtime yet.
PkgDisable("COCOA")
if 'x86_64' in OSX_ARCHS:
# 64-bits OS X doesn't have Carbon.
PkgDisable("CARBON")
#if (PkgSkip("PYTHON")==0):
# IncDirectory("PYTHON", SDK["PYTHON"])
@ -2450,7 +2446,6 @@ DTOOL_CONFIG=[
("HAVE_ARTOOLKIT", 'UNDEF', 'UNDEF'),
("HAVE_DIRECTCAM", 'UNDEF', 'UNDEF'),
("HAVE_SQUISH", 'UNDEF', 'UNDEF'),
("HAVE_CARBON", 'UNDEF', 'UNDEF'),
("HAVE_COCOA", 'UNDEF', 'UNDEF'),
("HAVE_OPENAL_FRAMEWORK", 'UNDEF', 'UNDEF'),
("HAVE_ROCKET_PYTHON", '1', '1'),
@ -3354,7 +3349,6 @@ if not PkgSkip("EGG"):
if GetTarget() == 'windows':
CopyAllHeaders('panda/src/wgldisplay')
elif GetTarget() == 'darwin':
CopyAllHeaders('panda/src/osxdisplay')
CopyAllHeaders('panda/src/cocoadisplay')
elif GetTarget() == 'android':
CopyAllHeaders('panda/src/android')
@ -4875,26 +4869,6 @@ if (GetTarget() == 'darwin' and PkgSkip("COCOA")==0 and PkgSkip("GL")==0 and not
TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
TargetAdd('libpandagl.dll', opts=['MODULE', 'GL', 'NVIDIACG', 'CGGL', 'COCOA', 'CARBON'])
#
# DIRECTORY: panda/src/osxdisplay/
#
elif (GetTarget() == 'darwin' and PkgSkip("CARBON")==0 and PkgSkip("GL")==0 and not RUNTIME):
OPTS=['DIR:panda/src/osxdisplay', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
TargetAdd('p3osxdisplay_composite1.obj', opts=OPTS, input='p3osxdisplay_composite1.cxx')
TargetAdd('p3osxdisplay_osxGraphicsWindow.obj', opts=OPTS, input='osxGraphicsWindow.mm')
OPTS=['DIR:panda/metalibs/pandagl', 'BUILDING:PANDAGL', 'GL', 'NVIDIACG', 'CGGL']
TargetAdd('pandagl_pandagl.obj', opts=OPTS, input='pandagl.cxx')
TargetAdd('libpandagl.dll', input='pandagl_pandagl.obj')
TargetAdd('libpandagl.dll', input='p3glgsg_config_glgsg.obj')
TargetAdd('libpandagl.dll', input='p3glgsg_glgsg.obj')
TargetAdd('libpandagl.dll', input='p3osxdisplay_composite1.obj')
TargetAdd('libpandagl.dll', input='p3osxdisplay_osxGraphicsWindow.obj')
if (PkgSkip('PANDAFX')==0):
TargetAdd('libpandagl.dll', input='libpandafx.dll')
TargetAdd('libpandagl.dll', input=COMMON_PANDA_LIBS)
TargetAdd('libpandagl.dll', opts=['MODULE', 'GL', 'NVIDIACG', 'CGGL', 'CARBON', 'AGL', 'COCOA'])
#
# DIRECTORY: panda/src/wgldisplay/
#
@ -5247,14 +5221,10 @@ if (not RUNTIME and (GetTarget() in ('windows', 'darwin') or PkgSkip("X11")==0)
TargetAdd('p3tinydisplay_ztriangle_3.obj', opts=OPTS, input='ztriangle_3.cxx')
TargetAdd('p3tinydisplay_ztriangle_4.obj', opts=OPTS, input='ztriangle_4.cxx')
TargetAdd('p3tinydisplay_ztriangle_table.obj', opts=OPTS, input='ztriangle_table.cxx')
if GetTarget() == 'darwin':
TargetAdd('p3tinydisplay_tinyOsxGraphicsWindow.obj', opts=OPTS, input='tinyOsxGraphicsWindow.mm')
TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_tinyOsxGraphicsWindow.obj')
TargetAdd('libp3tinydisplay.dll', opts=['CARBON', 'AGL', 'COCOA'])
elif GetTarget() == 'windows':
if GetTarget() == 'windows':
TargetAdd('libp3tinydisplay.dll', input='libp3windisplay.dll')
TargetAdd('libp3tinydisplay.dll', opts=['WINIMM', 'WINGDI', 'WINKERNEL', 'WINOLDNAMES', 'WINUSER', 'WINMM'])
else:
elif GetTarget() != 'darwin':
TargetAdd('libp3tinydisplay.dll', input='p3x11display_composite1.obj')
TargetAdd('libp3tinydisplay.dll', opts=['X11'])
TargetAdd('libp3tinydisplay.dll', input='p3tinydisplay_composite1.obj')

View File

@ -1619,7 +1619,6 @@
<File RelativePath="..\panda\src\tinydisplay\zmath.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\zdither.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\zbuffer.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinydisplay_composite2.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsWindow.I"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOffscreenGraphicsPipe.cxx"></File>
@ -1627,13 +1626,11 @@
<File RelativePath="..\panda\src\tinydisplay\tinyOffscreenGraphicsPipe.I"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.h"></File>
<File RelativePath="..\panda\src\tinydisplay\image_util.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.I"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyGeomMunger.h"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyGeomMunger.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsPipe.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\td_texture.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsWindow.h"></File>
<File RelativePath="..\panda\src\tinydisplay\config_tinydisplay.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinySDLGraphicsPipe.h"></File>
<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_3.h"></File>
@ -1675,12 +1672,10 @@
<File RelativePath="..\panda\src\tinydisplay\ztriangle_code_1.h"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsWindow.h"></File>
<File RelativePath="..\panda\src\tinydisplay\ztriangle_2.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsWindow.I"></File>
<File RelativePath="..\panda\src\tinydisplay\ztriangle_3.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\init.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\zbuffer.h"></File>
<File RelativePath="..\panda\src\tinydisplay\vertex.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyOsxGraphicsPipe.h"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyWinGraphicsWindow.I"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyGraphicsStateGuardian.cxx"></File>
<File RelativePath="..\panda\src\tinydisplay\tinyXGraphicsPipe.h"></File>
@ -3506,20 +3501,6 @@
<File RelativePath="..\panda\src\physx\physxConvexShapeDesc.I"></File>
<File RelativePath="..\panda\src\physx\physxMaterialDesc.h"></File>
</Filter>
<Filter Name="osxdisplay">
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsBuffer.h"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsWindow.I"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsPipe.cxx"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsBuffer.cxx"></File>
<File RelativePath="..\panda\src\osxdisplay\config_osxdisplay.h"></File>
<File RelativePath="..\panda\src\osxdisplay\resize_box.rgb.c"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsStateGuardian.h"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsWindow.h"></File>
<File RelativePath="..\panda\src\osxdisplay\config_osxdisplay.cxx"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsPipe.h"></File>
<File RelativePath="..\panda\src\osxdisplay\osxdisplay_composite1.cxx"></File>
<File RelativePath="..\panda\src\osxdisplay\osxGraphicsStateGuardian.cxx"></File>
</Filter>
<Filter Name="net">
<File RelativePath="..\panda\src\net\queuedConnectionReader.cxx"></File>
<File RelativePath="..\panda\src\net\datagramGeneratorNet.I"></File>

View File

@ -16,9 +16,6 @@
#if defined(HAVE_COCOA)
#include "config_cocoadisplay.h"
#include "cocoaGraphicsPipe.h"
#elif defined(HAVE_CARBON)
#include "config_osxdisplay.h"
#include "osxGraphicsPipe.h"
#endif
#ifdef HAVE_GLX
@ -26,8 +23,8 @@
#include "glxGraphicsPipe.h"
#endif
#if !defined(HAVE_WGL) && !defined(HAVE_COCOA) && !defined(HAVE_CARBON) && !defined(HAVE_GLX)
#error One of HAVE_WGL, HAVE_COCOA, HAVE_CARBON or HAVE_GLX must be defined when compiling pandagl!
#if !defined(HAVE_WGL) && !defined(HAVE_COCOA) && !defined(HAVE_GLX)
#error One of HAVE_WGL, HAVE_COCOA or HAVE_GLX must be defined when compiling pandagl!
#endif
/**
@ -46,8 +43,6 @@ init_libpandagl() {
#if defined(HAVE_COCOA)
init_libcocoadisplay();
#elif defined(HAVE_CARBON)
init_libosxdisplay();
#endif
#ifdef IS_LINUX
@ -67,8 +62,6 @@ get_pipe_type_pandagl() {
#if defined(HAVE_COCOA)
return CocoaGraphicsPipe::get_class_type().get_index();
#elif defined(HAVE_CARBON)
return osxGraphicsPipe::get_class_type().get_index();
#endif
#ifdef HAVE_GLX

View File

@ -1,87 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file config_osxdisplay.cxx
*/
#include "config_osxdisplay.h"
#include "osxGraphicsBuffer.h"
#include "osxGraphicsPipe.h"
#include "osxGraphicsStateGuardian.h"
#include "osxGraphicsWindow.h"
#include "graphicsPipeSelection.h"
#include "dconfig.h"
#include "pandaSystem.h"
#if !defined(CPPPARSER) && !defined(LINK_ALL_STATIC) && !defined(BUILDING_PANDA_OSXDISPLAY)
#error Buildsystem error: BUILDING_PANDA_OSXDISPLAY not defined
#endif
Configure(config_osxdisplay);
NotifyCategoryDef(osxdisplay, "display");
ConfigureFn(config_osxdisplay) {
init_libosxdisplay();
}
ConfigVariableBool show_resize_box
("show-resize-box", true,
PRC_DESC("When this variable is true, then resizable OSX Panda windows will "
"be rendered with a resize control in the lower-right corner. "
"This is specially handled by Panda, since otherwise the 3-d "
"window would completely hide any resize control drawn by the "
"OS. Set this variable false to allow this control to be hidden."));
ConfigVariableBool osx_support_gl_buffer
("osx-support-gl-buffer", true,
PRC_DESC("Set this true to support use of GLBuffers on OSX. When true, there is a risk of "
"a program crash due to buggy driver support for GLBuffers. "
"If this is false, offscreen buffers will be created as "
"AGLPbuffers, which are less powerful, and appear to have their "
"own set of problems."));
ConfigVariableBool osx_disable_event_loop
("osx-disable-event-loop", false,
PRC_DESC("Set this true to disable the window event loop for the Panda "
"windows. This makes sense only in a publish environment where "
"the window event loop is already handled by another part of the "
"app."));
ConfigVariableInt osx_mouse_wheel_scale
("osx-mouse-wheel-scale", 1,
PRC_DESC("Specify the number of units to spin the Mac mouse wheel to "
"represent a single wheel_up or wheel_down message."));
/**
* Initializes the library. This must be called at least once before any of
* the functions or classes in this library can be used. Normally it will be
* called by the static initializers and need not be called explicitly, but
* special cases exist.
*/
void
init_libosxdisplay() {
static bool initialized = false;
if (initialized) {
return;
}
initialized = true;
osxGraphicsBuffer::init_type();
osxGraphicsPipe::init_type();
osxGraphicsWindow::init_type();
osxGraphicsStateGuardian::init_type();
GraphicsPipeSelection *selection = GraphicsPipeSelection::get_global_ptr();
selection->add_pipe_type(osxGraphicsPipe::get_class_type(), osxGraphicsPipe::pipe_constructor);
PandaSystem *ps = PandaSystem::get_global_ptr();
ps->set_system_tag("OpenGL", "window_system", "OSX");
}

View File

@ -1,29 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file config_osxdisplay.h
*/
#ifndef __CONFIG_OSXDISPLAY_H__
#define __CONFIG_OSXDISPLAY_H__
#include "pandabase.h"
#include "notifyCategoryProxy.h"
#include "configVariableBool.h"
#include "configVariableInt.h"
NotifyCategoryDecl( osxdisplay , EXPCL_PANDA_OSXDISPLAY, EXPTP_PANDA_OSXDISPLAY);
extern EXPCL_PANDA_OSXDISPLAY void init_libosxdisplay();
extern ConfigVariableBool show_resize_box;
extern ConfigVariableBool osx_support_gl_buffer;
extern ConfigVariableBool osx_disable_event_loop;
extern ConfigVariableInt osx_mouse_wheel_scale;
#endif /* __CONFIG_OSXDISPLAY_H__ */

View File

@ -1,200 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsBuffer.cxx
*/
#include "osxGraphicsBuffer.h"
#include "osxGraphicsStateGuardian.h"
#include "config_osxdisplay.h"
#include "osxGraphicsPipe.h"
#include "graphicsPipe.h"
#include "glgsg.h"
#include "pStatTimer.h"
TypeHandle osxGraphicsBuffer::_type_handle;
/**
*
*/
osxGraphicsBuffer::
osxGraphicsBuffer(GraphicsEngine *engine, GraphicsPipe *pipe,
const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsStateGuardian *gsg,
GraphicsOutput *host) :
GraphicsBuffer(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
{
osxGraphicsPipe *osx_pipe;
DCAST_INTO_V(osx_pipe, _pipe);
_pbuffer = nullptr;
// Since the pbuffer never gets flipped, we get screenshots from the same
// buffer we draw into.
_screenshot_buffer_type = _draw_buffer_type;
}
/**
*
*/
osxGraphicsBuffer::
~osxGraphicsBuffer() {
nassertv(_pbuffer == nullptr);
}
/**
* This function will be called within the draw thread before beginning
* rendering for a given frame. It should do whatever setup is required, and
* return true if the frame should be rendered, or false if it should be
* skipped.
*/
bool osxGraphicsBuffer::
begin_frame(FrameMode mode, Thread *current_thread) {
PStatTimer timer(_make_current_pcollector);
begin_frame_spam(mode);
if (_gsg == nullptr) {
return false;
}
nassertr(_pbuffer != nullptr, false);
osxGraphicsStateGuardian *osxgsg;
DCAST_INTO_R(osxgsg, _gsg, false);
if (!aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0)) {
report_agl_error("aglSetPBuffer");
return false;
}
if (!aglSetCurrentContext(osxgsg->get_context())) {
report_agl_error("aglSetCurrentContext");
return false;
}
osxgsg->reset_if_new();
if (mode == FM_render) {
CDLockedReader cdata(_cycler);
for (size_t i = 0; i != cdata->_textures.size(); ++i) {
const RenderTexture &rt = cdata->_textures[i];
RenderTextureMode rtm_mode = rt._rtm_mode;
if (rtm_mode == RTM_bind_or_copy) {
CDWriter cdataw(_cycler, cdata, false);
nassertr(cdata->_textures.size() == cdataw->_textures.size(), false);
cdataw->_textures[i]._rtm_mode = RTM_copy_texture;
}
}
clear_cube_map_selection();
}
_gsg->set_current_properties(&get_fb_properties());
return _gsg->begin_frame(current_thread);
}
/**
* This function will be called within the draw thread after rendering is
* completed for a given frame. It should do whatever finalization is
* required.
*/
void osxGraphicsBuffer::
end_frame(FrameMode mode, Thread *current_thread) {
end_frame_spam(mode);
nassertv(_gsg != nullptr);
if (mode == FM_render) {
copy_to_textures();
}
_gsg->end_frame(current_thread);
if (mode == FM_render) {
trigger_flip();
clear_cube_map_selection();
}
}
/**
* Closes the buffer right now. Called from the window thread.
*/
void osxGraphicsBuffer::
close_buffer() {
if (_gsg != nullptr) {
// aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0);
_gsg.clear();
}
if (_pbuffer != nullptr) {
aglDestroyPBuffer(_pbuffer);
_pbuffer = nullptr;
}
_is_valid = false;
}
/**
* Opens the buffer right now. Called from the window thread. Returns true
* if the buffer is successfully opened, or false if there was a problem.
*/
bool osxGraphicsBuffer::
open_buffer() {
if (_gsg == 0) {
_gsg = new osxGraphicsStateGuardian(_engine, _pipe, nullptr);
}
if (_pbuffer == nullptr) {
GLenum target = GL_TEXTURE_RECTANGLE_ARB;
if (_size[0] == Texture::up_to_power_2(_size[0]) &&
_size[1] == Texture::up_to_power_2(_size[1])) {
// It's a power-of-two size, so we can use GL_TEXTURE_2D as the target.
// Dunno, but maybe this will be more likely to work on some hardware.
target = GL_TEXTURE_2D;
}
if (!aglCreatePBuffer(_size.get_x(), _size.get_y(), target, GL_RGBA, 0, &_pbuffer)) {
report_agl_error("aglCreatePBuffer");
close_buffer();
return false;
}
}
osxGraphicsStateGuardian *osxgsg;
DCAST_INTO_R(osxgsg, _gsg, false);
OSStatus stat = osxgsg->build_gl(false, true, _fb_properties);
if (stat != noErr) {
return false;
}
if (!aglSetPBuffer(osxgsg->get_context(), _pbuffer, 0, 0, 0)) {
report_agl_error("aglSetPBuffer");
close_buffer();
return false;
}
if (!aglSetCurrentContext(osxgsg->get_context())) {
report_agl_error("aglSetCurrentContext");
return false;
}
osxgsg->reset_if_new();
if (!osxgsg->is_valid()) {
close_buffer();
return false;
}
/*
if (!osxgsg->get_fb_properties().verify_hardware_software
(_fb_properties, osxgsg->get_gl_renderer())) {
close_buffer();
return false;
}
_fb_properties = osxgsg->get_fb_properties();
*/
_is_valid = true;
return true;
}

View File

@ -1,69 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsBuffer.h
*/
#ifndef OSXGRAPHICSBUFFER_H
#define OSXGRAPHICSBUFFER_H
#include <Carbon/Carbon.h>
#define __glext_h_
#include <OpenGL/gl.h>
#include <AGL/agl.h>
#include "pandabase.h"
#include "graphicsBuffer.h"
#include "glgsg.h"
/**
* An offscreen buffer in the OSX environment. This creates an AGLPbuffer.
*/
class osxGraphicsBuffer : public GraphicsBuffer {
public:
osxGraphicsBuffer(GraphicsEngine *engine, GraphicsPipe *pipe,
const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsStateGuardian *gsg,
GraphicsOutput *host);
virtual ~osxGraphicsBuffer();
virtual bool begin_frame(FrameMode mode, Thread *current_thread);
virtual void end_frame(FrameMode mode, Thread *current_thread);
protected:
virtual void close_buffer();
virtual bool open_buffer();
private:
AGLPbuffer _pbuffer;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GraphicsBuffer::init_type();
register_type(_type_handle, "osxGraphicsBuffer",
GraphicsBuffer::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
friend class osxGraphicsStateGuardian;
};
#endif

View File

@ -1,451 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsPipe.cxx
*/
#include "osxGraphicsPipe.h"
#include "config_osxdisplay.h"
#include "osxGraphicsWindow.h"
#include "osxGraphicsBuffer.h"
#include "osxGraphicsStateGuardian.h"
#include "pnmImage.h"
#include "subprocessWindow.h"
#include "nativeWindowHandle.h"
#include "displayInformation.h"
#import <Carbon/Carbon.h>
// some macros to make code more readable.
#define GetModeWidth(mode) GetDictionaryLong((mode), kCGDisplayWidth)
#define GetModeHeight(mode) GetDictionaryLong((mode), kCGDisplayHeight)
#define GetModeRefreshRate(mode) GetDictionaryLong((mode), kCGDisplayRefreshRate)
#define GetModeBitsPerPixel(mode) GetDictionaryLong((mode), kCGDisplayBitsPerPixel)
#define GetModeSafeForHardware(mode) GetDictionaryBoolean((mode), kCGDisplayModeIsSafeForHardware)
#define GetModeStretched(mode) GetDictionaryBoolean((mode), kCGDisplayModeIsStretched)
#define MAX_DISPLAYS 32
Boolean GetDictionaryBoolean(CFDictionaryRef theDict, const void* key) {
// get a boolean from the dictionary
Boolean value = false;
CFBooleanRef boolRef;
boolRef = (CFBooleanRef)CFDictionaryGetValue(theDict, key);
if (boolRef != nullptr)
value = CFBooleanGetValue(boolRef);
return value;
}
long GetDictionaryLong(CFDictionaryRef theDict, const void* key) {
// get a long from the dictionary
long value = 0;
CFNumberRef numRef;
numRef = (CFNumberRef)CFDictionaryGetValue(theDict, key);
if (numRef != nullptr)
CFNumberGetValue(numRef, kCFNumberLongType, &value);
return value;
}
static CFComparisonResult CompareModes (const void *val1,const void *val2,void *context) {
// CFArray comparison callback for sorting display modes.
#pragma unused(context)
CFDictionaryRef thisMode = (CFDictionaryRef)val1;
CFDictionaryRef otherMode = (CFDictionaryRef)val2;
long width = GetModeWidth(thisMode);
long otherWidth = GetModeWidth(otherMode);
long height = GetModeHeight(thisMode);
long otherHeight = GetModeHeight(otherMode);
// sort modes in screen size order
if (width * height < otherWidth * otherHeight) {
return kCFCompareLessThan;
} else if (width * height > otherWidth * otherHeight) {
return kCFCompareGreaterThan;
}
// sort modes by bits per pixel
long bitsPerPixel = GetModeBitsPerPixel(thisMode);
long otherBitsPerPixel = GetModeBitsPerPixel(otherMode);
if (bitsPerPixel < otherBitsPerPixel) {
return kCFCompareLessThan;
} else if (bitsPerPixel > otherBitsPerPixel) {
return kCFCompareGreaterThan;
}
// sort modes by refresh rate.
long refreshRate = GetModeRefreshRate(thisMode);
long otherRefreshRate = GetModeRefreshRate(otherMode);
if (refreshRate < otherRefreshRate) {
return kCFCompareLessThan;
} else if (refreshRate > otherRefreshRate) {
return kCFCompareGreaterThan;
}
return kCFCompareEqualTo;
}
CFArrayRef GSCGDisplayAvailableModesUsefulForOpenGL(CGDirectDisplayID display) {
// get a list of all possible display modes for this system.
CFArrayRef availableModes = CGDisplayAvailableModes(display);
unsigned int numberOfAvailableModes = CFArrayGetCount(availableModes);
// creat mutable array to hold the display modes we are interested int.
CFMutableArrayRef usefulModes = CFArrayCreateMutable(kCFAllocatorDefault, numberOfAvailableModes, nullptr);
// get the current bits per pixel.
long currentModeBitsPerPixel = GetModeBitsPerPixel(CGDisplayCurrentMode(display));
unsigned int i;
for (i= 0; i<numberOfAvailableModes; ++i) {
// look at each mode in the available list
CFDictionaryRef mode = (CFDictionaryRef)CFArrayGetValueAtIndex(availableModes, i);
// we are only interested in modes with the same bits per pixel as
// current. to allow for switching from fullscreen to windowed modes.
// that are safe for this hardward that are not stretched.
long bitsPerPixel = GetModeBitsPerPixel(mode);
Boolean safeForHardware = GetModeSafeForHardware(mode);
Boolean stretched = GetModeStretched(mode);
if ((bitsPerPixel != currentModeBitsPerPixel) || (!safeForHardware) || (stretched)) {
continue; // skip this mode
}
long width = GetModeWidth(mode);
long height = GetModeHeight(mode);
long refreshRate = GetModeRefreshRate(mode);
Boolean replaced = false;
Boolean skipped = false;
// now check to see if we already added a mode like this one. we want the
// highest refresh rate for this widthheight
unsigned int j;
unsigned int currentNumberOfUsefulModes = CFArrayGetCount(usefulModes);
for (j = 0; j < currentNumberOfUsefulModes; ++j) {
CFDictionaryRef otherMode = (CFDictionaryRef)CFArrayGetValueAtIndex(usefulModes, j);
long otherWidth = GetModeWidth(otherMode);
long otherHeight = GetModeHeight(otherMode);
if ((otherWidth == width) && (otherHeight == height)) {
long otherRefreshRate = GetModeRefreshRate(otherMode);
if (otherRefreshRate < refreshRate) {
// replace lower refresh rate.
const void* value = mode;
CFArrayReplaceValues(usefulModes, CFRangeMake(j ,1), &value, 1);
replaced = true;
break;
}
else if (otherRefreshRate > refreshRate) {
skipped = true;
break;
}
}
}
// this is a useful mode so add it to the array.
if (!replaced && !skipped) {
CFArrayAppendValue(usefulModes, mode);
}
}
// now sort the useful mode array, using the comparison callback.
CFArraySortValues( usefulModes,
CFRangeMake(0, CFArrayGetCount(usefulModes)),
(CFComparatorFunction) CompareModes, nullptr);
// return the CFArray of the useful display modes.
return usefulModes;
}
TypeHandle osxGraphicsPipe::_type_handle;
/**
*
*/
osxGraphicsPipe::
osxGraphicsPipe() {
CGRect display_bounds = CGDisplayBounds(kCGDirectMainDisplay);
_display_width = CGRectGetWidth(display_bounds);
_display_height = CGRectGetHeight(display_bounds);
CGDirectDisplayID display, displayArray[MAX_DISPLAYS] ;
CGDisplayCount numDisplays;
CFDictionaryRef displayMode;
CFArrayRef displayModeArray;
int number, i;
CGGetActiveDisplayList (MAX_DISPLAYS, displayArray, &numDisplays);
display = displayArray [numDisplays - 1];
displayModeArray = GSCGDisplayAvailableModesUsefulForOpenGL( display );
number = CFArrayGetCount( displayModeArray );
DisplayMode *displays = new DisplayMode[ number ];
for(i = 0; i < number; i++) {
displayMode = (CFDictionaryRef) CFArrayGetValueAtIndex (displayModeArray, i);
_display_information -> _total_display_modes++;
displays[i].width = (signed int)GetModeWidth (displayMode);
displays[i].height = (signed int)GetModeHeight (displayMode);
displays[i].bits_per_pixel = (signed int)GetModeBitsPerPixel (displayMode);
displays[i].refresh_rate = (signed int)GetModeRefreshRate (displayMode);
}
_display_information -> _display_mode_array = displays;
}
/**
*
*/
osxGraphicsPipe::
~osxGraphicsPipe() {
}
/**
* Returns the name of the rendering interface associated with this
* GraphicsPipe. This is used to present to the user to allow him/her to
* choose between several possible GraphicsPipes available on a particular
* platform, so the name should be meaningful and unique for a given platform.
*/
std::string osxGraphicsPipe::
get_interface_name() const {
return "OpenGL";
}
/**
* This function is passed to the GraphicsPipeSelection object to allow the
* user to make a default osxGraphicsPipe.
*/
PT(GraphicsPipe) osxGraphicsPipe::
pipe_constructor() {
return new osxGraphicsPipe;
}
/**
* Returns an indication of the thread in which this GraphicsPipe requires its
* window processing to be performed: typically either the app thread (e.g.
* X) or the draw thread (Windows).
*/
GraphicsPipe::PreferredWindowThread
osxGraphicsPipe::get_preferred_window_thread() const {
return PWT_app;
}
/**
* Creates a new Quartz bitmap image with the data in the indicated PNMImage.
* The caller should eventually free this image via CGImageRelease.
*/
CGImageRef osxGraphicsPipe::
create_cg_image(const PNMImage &pnm_image) {
size_t width = pnm_image.get_x_size();
size_t height = pnm_image.get_y_size();
#ifdef PGM_BIGGRAYS
size_t bytes_per_component = 2;
#else
size_t bytes_per_component = 1;
#endif
size_t bits_per_component = bytes_per_component * 8;
size_t num_components = pnm_image.get_num_channels();
size_t bits_per_pixel = num_components * bits_per_component;
size_t bytes_per_row = num_components * bytes_per_component * width;
size_t num_bytes = bytes_per_row * height;
bool has_alpha;
bool is_grayscale;
CFStringRef color_space_name = nullptr;
switch (pnm_image.get_color_type()) {
case PNMImage::CT_grayscale:
color_space_name = kCGColorSpaceGenericGray;
has_alpha = false;
is_grayscale = true;
break;
case PNMImage::CT_two_channel:
color_space_name = kCGColorSpaceGenericGray;
has_alpha = true;
is_grayscale = true;
break;
case PNMImage::CT_color:
color_space_name = kCGColorSpaceGenericRGB;
has_alpha = false;
is_grayscale = false;
break;
case PNMImage::CT_four_channel:
color_space_name = kCGColorSpaceGenericRGB;
has_alpha = true;
is_grayscale = false;
break;
case PNMImage::CT_invalid:
// Shouldn't get here.
nassertr(false, nullptr);
break;
}
nassertr(color_space_name != nullptr, nullptr);
CGColorSpaceRef color_space = CGColorSpaceCreateWithName(color_space_name);
nassertr(color_space != nullptr, nullptr);
CGBitmapInfo bitmap_info = 0;
#ifdef PGM_BIGGRAYS
bitmap_info |= kCGBitmapByteOrder16Host;
#endif
if (has_alpha) {
bitmap_info |= kCGImageAlphaLast;
}
// Now convert the pixel data to a format friendly to CGImageCreate().
char *char_array = (char *)PANDA_MALLOC_ARRAY(num_bytes);
xelval *dp = (xelval *)char_array;
for (size_t yi = 0; yi < height; ++yi) {
for (size_t xi = 0; xi < width; ++xi) {
if (is_grayscale) {
*dp++ = (xelval)(pnm_image.get_gray(xi, yi) * PGM_MAXMAXVAL);
} else {
*dp++ = (xelval)(pnm_image.get_red(xi, yi) * PGM_MAXMAXVAL);
*dp++ = (xelval)(pnm_image.get_green(xi, yi) * PGM_MAXMAXVAL);
*dp++ = (xelval)(pnm_image.get_blue(xi, yi) * PGM_MAXMAXVAL);
}
if (has_alpha) {
*dp++ = (xelval)(pnm_image.get_alpha(xi, yi) * PGM_MAXMAXVAL);
}
}
}
nassertr((void *)dp == (void *)(char_array + num_bytes), nullptr);
CGDataProviderRef provider =
CGDataProviderCreateWithData(nullptr, char_array, num_bytes, release_data);
nassertr(provider != nullptr, nullptr);
CGImageRef image = CGImageCreate
(width, height, bits_per_component, bits_per_pixel, bytes_per_row,
color_space, bitmap_info, provider,
nullptr, false, kCGRenderingIntentDefault);
nassertr(image != nullptr, nullptr);
CGColorSpaceRelease(color_space);
CGDataProviderRelease(provider);
return image;
}
/**
* This callback is assigned to delete the data array allocated within
* create_cg_image().
*/
void osxGraphicsPipe::
release_data(void *info, const void *data, size_t size) {
char *char_array = (char *)data;
PANDA_FREE_ARRAY(char_array);
}
/**
* Creates a new window on the pipe, if possible.
*/
PT(GraphicsOutput) osxGraphicsPipe::
make_output(const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsEngine *engine,
GraphicsStateGuardian *gsg,
GraphicsOutput *host,
int retry,
bool &precertify) {
if (!_is_valid) {
return nullptr;
}
osxGraphicsStateGuardian *osxgsg = 0;
if (gsg != 0) {
DCAST_INTO_R(osxgsg, gsg, nullptr);
}
// First thing to try: an osxGraphicsWindow
if (retry == 0) {
if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)||
((flags&BF_can_bind_color)!=0)||
((flags&BF_can_bind_every)!=0)||
((flags&BF_can_bind_layered)!=0)) {
return nullptr;
}
WindowHandle *window_handle = win_prop.get_parent_window();
if (window_handle != nullptr) {
osxdisplay_cat.info()
<< "Got parent_window " << *window_handle << "\n";
#ifdef SUPPORT_SUBPROCESS_WINDOW
WindowHandle::OSHandle *os_handle = window_handle->get_os_handle();
if (os_handle != nullptr &&
os_handle->is_of_type(NativeWindowHandle::SubprocessHandle::get_class_type())) {
return new SubprocessWindow(engine, this, name, fb_prop, win_prop,
flags, gsg, host);
}
#endif // SUPPORT_SUBPROCESS_WINDOW
}
return new osxGraphicsWindow(engine, this, name, fb_prop, win_prop,
flags, gsg, host);
}
// Second thing to try: a GLGraphicsBuffer
if (retry == 1) {
if (!osx_support_gl_buffer || !gl_support_fbo || host == nullptr ||
(flags & (BF_require_parasite | BF_require_window)) != 0) {
return nullptr;
}
// Early failure - if we are sure that this buffer WONT meet specs, we can
// bail out early.
if ((flags & BF_fb_props_optional) == 0) {
if (fb_prop.get_indexed_color() ||
fb_prop.get_back_buffers() > 0 ||
fb_prop.get_accum_bits() > 0) {
return nullptr;
}
}
if (osxgsg != nullptr && osxgsg->is_valid() && !osxgsg->needs_reset()) {
if (!osxgsg->_supports_framebuffer_object ||
osxgsg->_glDrawBuffers == nullptr) {
return nullptr;
} else if (fb_prop.is_basic()) {
// Early success - if we are sure that this buffer WILL meet specs, we
// can precertify it.
precertify = true;
}
}
return new GLGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host);
}
// Third thing to try: an osxGraphicsBuffer
if (retry == 2) {
if ((!support_render_texture)||
((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)||
((flags&BF_can_bind_every)!=0)||
((flags&BF_can_bind_layered)!=0)) {
return nullptr;
}
return new osxGraphicsBuffer(engine, this, name, fb_prop, win_prop,
flags, gsg, host);
}
// Nothing else left to try.
return nullptr;
}
/**
* This is called when make_output() is used to create a
* CallbackGraphicsWindow. If the GraphicsPipe can construct a GSG that's not
* associated with any particular window object, do so now, assuming the
* correct graphics context has been set up externally.
*/
PT(GraphicsStateGuardian) osxGraphicsPipe::
make_callback_gsg(GraphicsEngine *engine) {
return new osxGraphicsStateGuardian(engine, this, nullptr);
}

View File

@ -1,73 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsPipe.h
*/
#ifndef OSXGRAPHICSPIPE_H
#define OSXGRAPHICSPIPE_H
#include "pandabase.h"
#include "graphicsPipe.h"
#include <Carbon/Carbon.h>
class osxGraphicsStateGuardian;
class PNMImage;
/**
* This graphics pipe represents the interface for creating OpenGL graphics
* windows on the various OSX's.
*/
class EXPCL_PANDA_OSXDISPLAY osxGraphicsPipe : public GraphicsPipe {
public:
osxGraphicsPipe();
virtual ~osxGraphicsPipe();
virtual std::string get_interface_name() const;
static PT(GraphicsPipe) pipe_constructor();
virtual PreferredWindowThread get_preferred_window_thread() const;
static CGImageRef create_cg_image(const PNMImage &pnm_image);
private:
static void release_data(void *info, const void *data, size_t size);
protected:
virtual PT(GraphicsOutput) make_output(const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsEngine *engine,
GraphicsStateGuardian *gsg,
GraphicsOutput *host,
int retry,
bool &precertify);
virtual PT(GraphicsStateGuardian) make_callback_gsg(GraphicsEngine *engine);
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GraphicsPipe::init_type();
register_type(_type_handle, "osxGraphicsPipe",
GraphicsPipe::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
friend class osxGraphicsBuffer;
};
#endif

View File

@ -1,459 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsStateGuardian.cxx
*/
#include "osxGraphicsStateGuardian.h"
#include "osxGraphicsBuffer.h"
#include "string_utils.h"
#include "config_osxdisplay.h"
#include "depthWriteAttrib.h"
#include "depthTestAttrib.h"
#include "textureAttrib.h"
#include "pnmImage.h"
#include <OpenGL/gl.h>
#import <mach-o/dyld.h>
// This is generated data for the standard texture we use for drawing the
// resize box in the window corner.
#include "resize_box.rgb.c"
TypeHandle osxGraphicsStateGuardian::_type_handle;
/**
* Returns the pointer to the GL extension function with the indicated name.
* It is the responsibility of the caller to ensure that the required
* extension is defined in the OpenGL runtime prior to calling this; it is an
* error to call this for a function that is not defined.
*/
void *osxGraphicsStateGuardian::
do_get_extension_func(const char *name) {
std::string fullname = "_" + std::string(name);
NSSymbol symbol = nullptr;
if (NSIsSymbolNameDefined(fullname.c_str())) {
symbol = NSLookupAndBindSymbol(fullname.c_str());
}
return symbol ? NSAddressOfSymbol(symbol) : nullptr;
}
/**
*
*/
osxGraphicsStateGuardian::
osxGraphicsStateGuardian(GraphicsEngine *engine, GraphicsPipe *pipe,
osxGraphicsStateGuardian *share_with) :
GLGraphicsStateGuardian(engine, pipe),
_share_with(share_with),
_aglPixFmt(nullptr),
_aglcontext(nullptr)
{
_shared_buffer = 1011;
get_gamma_table();
}
/**
*
*/
osxGraphicsStateGuardian::
~osxGraphicsStateGuardian() {
if (_aglcontext != (AGLContext)nullptr) {
aglSetCurrentContext(nullptr);
aglDestroyContext(_aglcontext);
report_agl_error("aglDestroyContext");
_aglcontext = (AGLContext)nullptr;
}
}
/**
* Resets all internal state as if the gsg were newly created.
*/
void osxGraphicsStateGuardian::reset()
{
/*
if(_aglcontext != (AGLContext)NULL)
{
aglDestroyContext(_aglcontext);
report_agl_error();
_aglcontext = (AGLContext)NULL;
}
*/
GLGraphicsStateGuardian::reset();
if (_aglcontext != (AGLContext)nullptr) {
// Apply the video-sync setting.
GLint value = sync_video ? 1 : 0;
aglSetInteger(_aglcontext, AGL_SWAP_INTERVAL, &value);
}
}
/**
* Draws an OSX-style resize icon in the bottom right corner of the current
* display region. This is normally done automatically at the end of each
* frame when the window is indicated as resizable, since the 3-D graphics
* overlay the normal, OS-drawn resize icon and the user won't be able see it.
*/
void osxGraphicsStateGuardian::
draw_resize_box() {
// This state is created, once, and never freed.
static CPT(RenderState) state;
if (state == nullptr) {
state = RenderState::make(TransparencyAttrib::make(TransparencyAttrib::M_alpha),
DepthWriteAttrib::make(DepthWriteAttrib::M_off),
DepthTestAttrib::make(DepthTestAttrib::M_none));
// Get the default texture to apply to the resize box; it's compiled into
// the code.
std::string resize_box_string((const char *)resize_box, resize_box_len);
std::istringstream resize_box_strm(resize_box_string);
PNMImage resize_box_pnm;
if (resize_box_pnm.read(resize_box_strm, "resize_box.rgb")) {
PT(Texture) tex = new Texture;
tex->set_name("resize_box.rgb");
tex->load(resize_box_pnm);
tex->set_minfilter(SamplerState::FT_linear);
tex->set_magfilter(SamplerState::FT_linear);
state = state->add_attrib(TextureAttrib::make(tex));
}
}
// Clear out the lens.
_projection_mat_inv = _projection_mat = TransformState::make_identity();
prepare_lens();
// Set the state to our specific, known state for drawing the icon.
set_state_and_transform(state, TransformState::make_identity());
// Now determine the inner corner of the quad, choosing a 15x15 pixel square
// in the lower-right corner, computed from the viewport size.
PN_stdfloat inner_x = 1.0f - (15.0f * 2.0f / _viewport_width);
PN_stdfloat inner_y = (15.0f * 2.0f / _viewport_height) - 1.0f;
// Draw the quad. We just use the slow, simple immediate mode calls here.
// It's just one quad, after all.
glBegin(GL_QUADS);
glColor4f(1.0, 1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0);
glVertex2f(inner_x, -1.0);
glTexCoord2f(0.9375, 0.0);
glVertex2f(1.0, -1.0);
glTexCoord2f(0.9375, 0.9375);
glVertex2f(1.0, inner_y);
glTexCoord2f(0.0, 0.9375);
glVertex2f(inner_x, inner_y);
glEnd();
}
/**
* This function will build up a context for a gsg..
*/
OSStatus osxGraphicsStateGuardian::
build_gl(bool full_screen, bool pbuffer, FrameBufferProperties &fb_props) {
if (_aglcontext) {
describe_pixel_format(fb_props);
return noErr; // already built
}
OSStatus err = noErr;
GDHandle display = GetMainDevice();
pvector<GLint> attrib;
if (!fb_props.get_indexed_color()) {
attrib.push_back(AGL_RGBA);
int color_bits = fb_props.get_color_bits();
int alpha_bits = fb_props.get_alpha_bits();
attrib.push_back(AGL_BUFFER_SIZE);
attrib.push_back(color_bits + alpha_bits);
attrib.push_back(AGL_PIXEL_SIZE);
attrib.push_back(color_bits);
attrib.push_back(AGL_RED_SIZE);
attrib.push_back(fb_props.get_red_bits());
attrib.push_back(AGL_GREEN_SIZE);
attrib.push_back(fb_props.get_green_bits());
attrib.push_back(AGL_BLUE_SIZE);
attrib.push_back(fb_props.get_blue_bits());
attrib.push_back(AGL_ALPHA_SIZE);
attrib.push_back(alpha_bits);
}
attrib.push_back(AGL_DEPTH_SIZE);
attrib.push_back(fb_props.get_depth_bits());
attrib.push_back(AGL_STENCIL_SIZE);
attrib.push_back(fb_props.get_stencil_bits());
if (fb_props.get_multisamples() != 0) {
attrib.push_back(AGL_MULTISAMPLE);
attrib.push_back(AGL_SAMPLE_BUFFERS_ARB);
attrib.push_back(1);
attrib.push_back(AGL_SAMPLES_ARB);
attrib.push_back(fb_props.get_multisamples());
}
if (fb_props.is_stereo()) {
attrib.push_back(AGL_STEREO);
}
if (!fb_props.is_single_buffered()) {
attrib.push_back(AGL_DOUBLEBUFFER);
}
if (full_screen) {
attrib.push_back(AGL_FULLSCREEN);
}
if (pbuffer) {
attrib.push_back(AGL_PBUFFER);
}
if (fb_props.get_force_hardware()) {
attrib.push_back(AGL_ACCELERATED);
attrib.push_back(AGL_NO_RECOVERY);
}
// Allow the system to choose the largest buffers requested that meets all
// our selections.
attrib.push_back(AGL_MAXIMUM_POLICY);
// Terminate the list.
attrib.push_back(AGL_NONE);
// build context
_aglcontext = nullptr;
_aglPixFmt = aglChoosePixelFormat(&display, 1, &attrib[0]);
err = report_agl_error("aglChoosePixelFormat");
if (_aglPixFmt) {
if(_share_with == nullptr) {
_aglcontext = aglCreateContext(_aglPixFmt, nullptr);
} else {
_aglcontext = aglCreateContext(_aglPixFmt, ((osxGraphicsStateGuardian *)_share_with)->_aglcontext);
}
err = report_agl_error("aglCreateContext");
if (_aglcontext == nullptr) {
osxdisplay_cat.error()
<< "osxGraphicsStateGuardian::build_gl Error Getting GL Context \n" ;
if(err == noErr) {
err = -1;
}
} else {
aglSetInteger(_aglcontext, AGL_BUFFER_NAME, &_shared_buffer);
err = report_agl_error("aglSetInteger AGL_BUFFER_NAME");
}
} else {
osxdisplay_cat.error()
<< "osxGraphicsStateGuardian::build_gl Error Getting Pixel Format\n" ;
osxdisplay_cat.error()
<< fb_props << "\n";
if(err == noErr) {
err = -1;
}
}
if (err == noErr) {
describe_pixel_format(fb_props);
}
if (osxdisplay_cat.is_debug()) {
osxdisplay_cat.debug()
<< "osxGraphicsStateGuardian::build_gl Returning :" << err << "\n";
osxdisplay_cat.debug()
<< fb_props << "\n";
}
return err;
}
/**
* Fills in the fb_props member with the appropriate values according to the
* chosen pixel format.
*/
void osxGraphicsStateGuardian::
describe_pixel_format(FrameBufferProperties &fb_props) {
fb_props.clear();
GLint value;
if (aglDescribePixelFormat(_aglPixFmt, AGL_RGBA, &value)) {
fb_props.set_indexed_color(!value);
fb_props.set_rgb_color(value);
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_DEPTH_SIZE, &value)) {
fb_props.set_depth_bits(value);
}
int color_bits = 0;
if (aglDescribePixelFormat(_aglPixFmt, AGL_RED_SIZE, &value)) {
fb_props.set_red_bits(value);
color_bits += value;
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_GREEN_SIZE, &value)) {
fb_props.set_green_bits(value);
color_bits += value;
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_BLUE_SIZE, &value)) {
fb_props.set_blue_bits(value);
color_bits += value;
}
fb_props.set_color_bits(color_bits);
if (aglDescribePixelFormat(_aglPixFmt, AGL_ALPHA_SIZE, &value)) {
fb_props.set_alpha_bits(value);
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_STENCIL_SIZE, &value)) {
fb_props.set_stencil_bits(value);
}
int accum_bits = 0;
if (aglDescribePixelFormat(_aglPixFmt, AGL_ACCUM_RED_SIZE, &value)) {
accum_bits += value;
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_ACCUM_GREEN_SIZE, &value)) {
accum_bits += value;
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_ACCUM_BLUE_SIZE, &value)) {
accum_bits += value;
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_SAMPLES_ARB, &value)) {
fb_props.set_multisamples(value);
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_DOUBLEBUFFER, &value)) {
if (value) {
fb_props.set_back_buffers(1);
} else {
fb_props.set_back_buffers(0);
}
}
if (aglDescribePixelFormat(_aglPixFmt, AGL_STEREO, &value)) {
fb_props.set_stereo(value);
}
// Until we query the renderer, we don't know whether it's hardware or
// software based, so set both flags to indicate we don't know.
fb_props.set_force_hardware(true);
fb_props.set_force_software(true);
GLint ndevs;
AGLDevice *gdevs = aglDevicesOfPixelFormat(_aglPixFmt, &ndevs);
if (gdevs != nullptr) {
AGLRendererInfo rinfo = aglQueryRendererInfo(gdevs, ndevs);
if (rinfo != nullptr) {
if (aglDescribeRenderer(rinfo, AGL_ACCELERATED, &value)) {
// Now we know whether it's hardware or software.
fb_props.set_force_hardware(value);
fb_props.set_force_software(!value);
}
if (aglDescribeRenderer(rinfo, AGL_VIDEO_MEMORY, &value)) {
osxdisplay_cat.debug()
<< "Reported video memory is " << value << "\n";
}
if (aglDescribeRenderer(rinfo, AGL_TEXTURE_MEMORY, &value)) {
osxdisplay_cat.debug()
<< "Reported texture memory is " << value << "\n";
}
}
}
}
/**
* Static function for getting the orig gamma tables
*/
bool osxGraphicsStateGuardian::
get_gamma_table() {
CGDisplayRestoreColorSyncSettings();
_cgErr = CGGetDisplayTransferByTable( 0, 256, _gOriginalRedTable, _gOriginalGreenTable, _gOriginalBlueTable, &_sampleCount);
}
/**
* Static function for setting gamma which is needed for atexit.
*/
bool osxGraphicsStateGuardian::
static_set_gamma(bool restore, PN_stdfloat gamma) {
bool set;
set = false;
if (restore) {
CGDisplayRestoreColorSyncSettings();
set = true;
return set;
}
// CGDisplayRestoreColorSyncSettings();
// CGGammaValue gOriginalRedTable[ 256 ]; CGGammaValue gOriginalGreenTable[
// 256 ]; CGGammaValue gOriginalBlueTable[ 256 ];
// CGTableCount sampleCount; CGDisplayErr cgErr;
// cgErr = CGGetDisplayTransferByTable( 0, 256, _gOriginalRedTable,
// _gOriginalGreenTable, _gOriginalBlueTable, &_sampleCount);
CGGammaValue redTable[ 256 ];
CGGammaValue greenTable[ 256 ];
CGGammaValue blueTable[ 256 ];
short j, i;
short y[3];
for (j = 0; j < 3; j++) {
y[j] = 255;
}
y[0] = 256 * gamma;
y[1] = 256 * gamma;
y[2] = 256 * gamma;
for (i = 0; i < 256; i++) {
redTable[i] = _gOriginalRedTable[ i ] * (y[ 0 ] ) / 256;
greenTable[ i ] = _gOriginalGreenTable[ i ] * (y[ 1 ] ) / 256;
blueTable[ i ] = _gOriginalBlueTable[ i ] * (y[ 2 ] ) / 256;
}
_cgErr = CGSetDisplayTransferByTable( 0, 256, redTable, greenTable, blueTable);
if (_cgErr == 0) {
set = true;
}
return set;
}
/**
* Non static version of setting gamma. Returns true on success.
*/
bool osxGraphicsStateGuardian::
set_gamma(PN_stdfloat gamma) {
bool set;
set = static_set_gamma(false, gamma);
return set;
}
/**
* Restore original gamma.
*/
void osxGraphicsStateGuardian::
restore_gamma() {
static_set_gamma(true, 1.0f);
}
/**
* This function is passed to the atexit function.
*/
void osxGraphicsStateGuardian::
atexit_function() {
static_set_gamma(true, 1.0);
}

View File

@ -1,94 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsStateGuardian.h
*/
#ifndef OSXGRAPHICSSTATEGUARDIAN_H
#define OSXGRAPHICSSTATEGUARDIAN_H
#include <Carbon/Carbon.h>
#include <ApplicationServices/ApplicationServices.h>
#define __glext_h_
#include <OpenGL/gl.h>
#include <AGL/agl.h>
#include "pandabase.h"
#include "glgsg.h"
#include "osxGraphicsWindow.h"
class osxGraphicsWindow;
/**
* A tiny specialization on GLGraphicsStateGuardian to add some wgl-specific
* information.
*/
class osxGraphicsStateGuardian : public GLGraphicsStateGuardian {
public:
osxGraphicsStateGuardian(GraphicsEngine *engine, GraphicsPipe *pipe,
osxGraphicsStateGuardian *share_with);
virtual ~osxGraphicsStateGuardian();
virtual void reset();
void draw_resize_box();
bool get_gamma_table();
bool static_set_gamma(bool restore, PN_stdfloat gamma);
bool set_gamma(PN_stdfloat gamma);
void atexit_function();
void restore_gamma();
protected:
virtual void *do_get_extension_func(const char *name);
public:
OSStatus build_gl(bool full_screen, bool pbuffer, FrameBufferProperties &fb_props);
AGLContext get_context() { return _aglcontext; };
const AGLPixelFormat get_agl_pixel_format() const { return _aglPixFmt; };
private:
void describe_pixel_format(FrameBufferProperties &fb_props);
// We have to save a pointer to the GSG we intend to share texture context
// with, since we don't create our own context in the constructor.
PT(osxGraphicsStateGuardian) _share_with;
AGLPixelFormat _aglPixFmt;
AGLContext _aglcontext;
CGGammaValue _gOriginalRedTable[ 256 ];
CGGammaValue _gOriginalGreenTable[ 256 ];
CGGammaValue _gOriginalBlueTable[ 256 ];
uint32_t _sampleCount;
CGDisplayErr _cgErr;
public:
GLint _shared_buffer;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GLGraphicsStateGuardian::init_type();
register_type(_type_handle, "osxGraphicsStateGuardian",
GLGraphicsStateGuardian::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
friend class osxGraphicsBuffer;
};
#endif

View File

@ -1,24 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsWindow.I
* @author drose
* @date 2009-02-13
*/
/**
*
*/
inline void osxGraphicsWindow::
send_key_event(ButtonHandle key, bool down) {
if (down) {
_input_devices[0].button_down(key);
} else {
_input_devices[0].button_up(key);
}
}

View File

@ -1,145 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file osxGraphicsWindow.h
*/
#ifndef OSXGRAPHICSWINDOW_H
#define OSXGRAPHICSWINDOW_H
#include "pandabase.h"
#include "graphicsWindow.h"
#include "buttonHandle.h"
#include <Carbon/Carbon.h>
#define __glext_h_
#include <OpenGL/gl.h>
#include <AGL/agl.h>
#define HACK_SCREEN_HASH_CONTEXT true
OSStatus report_agl_error(const std::string &comment);
/**
* An interface to the osx/ system for managing GL windows under X.
*/
class osxGraphicsWindow : public GraphicsWindow {
public:
osxGraphicsWindow(GraphicsEngine *engine, GraphicsPipe *pipe,
const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsStateGuardian *gsg,
GraphicsOutput *host);
virtual ~osxGraphicsWindow();
virtual bool move_pointer(int device, int x, int y);
virtual bool begin_frame(FrameMode mode, Thread *current_thread);
virtual void end_frame(FrameMode mode, Thread *current_thread);
virtual void begin_flip();
virtual void end_flip();
virtual void process_events();
virtual bool do_reshape_request(int x_origin, int y_origin, bool has_origin,
int x_size, int y_size);
virtual void mouse_mode_absolute();
virtual void mouse_mode_relative();
virtual void set_properties_now(WindowProperties &properties);
private:
void release_system_resources(bool destructing);
inline void send_key_event(ButtonHandle key, bool down);
protected:
virtual void close_window();
virtual bool open_window();
private:
bool os_open_window(WindowProperties &properties);
// a singleton .. for the events to find the right pipe to push the event
// into
public: // do not call direct ..
OSStatus handle_key_input(EventHandlerCallRef myHandler, EventRef event,
Boolean keyDown);
OSStatus handle_text_input(EventHandlerCallRef myHandler, EventRef event);
OSStatus handle_window_mouse_events(EventHandlerCallRef myHandler, EventRef event);
ButtonHandle osx_translate_key(UInt32 key, EventRef event);
static osxGraphicsWindow *get_current_osx_window(WindowRef hint);
void handle_modifier_delta(UInt32 new_modifiers);
void handle_button_delta(UInt32 new_buttons);
void do_resize();
OSStatus event_handler(EventHandlerCallRef myHandler, EventRef event);
virtual void user_close_request();
void system_close_window();
void system_set_window_foreground(bool foreground);
void system_point_to_local_point(Point &global_point);
void local_point_to_system_point(Point &local_point);
AGLContext get_gsg_context();
AGLContext get_context();
OSStatus build_gl(bool full_screen);
bool set_icon_filename(const Filename &icon_filename);
void set_pointer_in_window(int x, int y);
void set_pointer_out_of_window();
private:
UInt32 _last_key_modifiers;
UInt32 _last_buttons;
WindowRef _osx_window;
bool _is_fullscreen;
CGImageRef _pending_icon;
CGImageRef _current_icon;
int _ID;
static osxGraphicsWindow *full_screen_window;
#ifdef HACK_SCREEN_HASH_CONTEXT
AGLContext _holder_aglcontext;
#endif
CFDictionaryRef _originalMode;
// True if _properties.get_cursor_hidden() is true.
bool _cursor_hidden;
// True if the cursor is actually hidden right now via system calls.
bool _display_hide_cursor;
SInt32 _wheel_hdelta;
SInt32 _wheel_vdelta;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GraphicsWindow::init_type();
register_type(_type_handle, "osxGraphicsWindow",
GraphicsWindow::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
};
#include "osxGraphicsWindow.I"
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +0,0 @@
#include "config_osxdisplay.cxx"
#include "osxGraphicsBuffer.cxx"
#include "osxGraphicsPipe.cxx"
#include "osxGraphicsStateGuardian.cxx"

Binary file not shown.

View File

@ -1,167 +0,0 @@
/*
* This table was generated by the command:
*
* bin2c -static -string -n resize_box -o resize_box.rgb.c resize_box.rgb
*/
#include <stddef.h>
static const unsigned char resize_box[] = {
0x01, 0xda, 0x01, 0x01, 0x00, 0x03, 0x00, 0x10, 0x00, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x81, 0x00,
0x00, 0x06, 0x38, 0x00, 0x00, 0x05, 0xf2, 0x00, 0x00, 0x05, 0xb0,
0x00, 0x00, 0x05, 0x7a, 0x00, 0x00, 0x05, 0x41, 0x00, 0x00, 0x05,
0x0b, 0x00, 0x00, 0x04, 0xd9, 0x00, 0x00, 0x04, 0xb3, 0x00, 0x00,
0x04, 0x8a, 0x00, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x42, 0x00,
0x00, 0x04, 0x30, 0x00, 0x00, 0x04, 0x1e, 0x00, 0x00, 0x04, 0x0c,
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x86, 0x00, 0x00, 0x06,
0x4b, 0x00, 0x00, 0x06, 0x04, 0x00, 0x00, 0x05, 0xc1, 0x00, 0x00,
0x05, 0x88, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x05, 0x19, 0x00,
0x00, 0x04, 0xe6, 0x00, 0x00, 0x04, 0xbd, 0x00, 0x00, 0x04, 0x95,
0x00, 0x00, 0x04, 0x6e, 0x00, 0x00, 0x04, 0x4b, 0x00, 0x00, 0x04,
0x35, 0x00, 0x00, 0x04, 0x23, 0x00, 0x00, 0x04, 0x11, 0x00, 0x00,
0x04, 0x03, 0x00, 0x00, 0x06, 0x8b, 0x00, 0x00, 0x06, 0x5e, 0x00,
0x00, 0x06, 0x16, 0x00, 0x00, 0x05, 0xd2, 0x00, 0x00, 0x05, 0x96,
0x00, 0x00, 0x05, 0x5f, 0x00, 0x00, 0x05, 0x27, 0x00, 0x00, 0x04,
0xf3, 0x00, 0x00, 0x04, 0xc7, 0x00, 0x00, 0x04, 0xa0, 0x00, 0x00,
0x04, 0x78, 0x00, 0x00, 0x04, 0x54, 0x00, 0x00, 0x04, 0x3a, 0x00,
0x00, 0x04, 0x28, 0x00, 0x00, 0x04, 0x16, 0x00, 0x00, 0x04, 0x06,
0x00, 0x00, 0x06, 0x90, 0x00, 0x00, 0x06, 0x71, 0x00, 0x00, 0x06,
0x28, 0x00, 0x00, 0x05, 0xe3, 0x00, 0x00, 0x05, 0xa4, 0x00, 0x00,
0x05, 0x6e, 0x00, 0x00, 0x05, 0x35, 0x00, 0x00, 0x05, 0x00, 0x00,
0x00, 0x04, 0xd1, 0x00, 0x00, 0x04, 0xab, 0x00, 0x00, 0x04, 0x82,
0x00, 0x00, 0x04, 0x5d, 0x00, 0x00, 0x04, 0x3f, 0x00, 0x00, 0x04,
0x2d, 0x00, 0x00, 0x04, 0x1b, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00,
0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00,
0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f,
0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00,
0x00, 0x09, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00,
0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05,
0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0a, 0x00,
0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09,
0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00,
0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0e,
0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
0x00, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03,
0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x03, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10,
0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00,
0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0xec,
0x01, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x0f, 0xec, 0x01,
0x00, 0x00, 0x10, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x0f,
0xec, 0x01, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x10, 0x00,
0x00, 0x0d, 0xec, 0x81, 0xcf, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0d,
0xec, 0x81, 0xcf, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0d, 0xec, 0x81,
0xcf, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x81, 0xff, 0x02,
0x00, 0x00, 0x0c, 0xec, 0x82, 0xcf, 0x80, 0x01, 0xec, 0x01, 0x00,
0x00, 0x0c, 0xec, 0x82, 0xcf, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00,
0x0c, 0xec, 0x82, 0xcf, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0c,
0x00, 0x82, 0xff, 0xff, 0x02, 0x00, 0x00, 0x0b, 0xec, 0x83, 0xca,
0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0b, 0xec, 0x83, 0xca,
0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0b, 0xec, 0x83, 0xca,
0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x82, 0xff,
0xff, 0x03, 0x00, 0x00, 0x0a, 0xec, 0x82, 0xca, 0x7e, 0x03, 0xec,
0x01, 0x00, 0x00, 0x0a, 0xec, 0x82, 0xca, 0x7e, 0x03, 0xec, 0x01,
0x00, 0x00, 0x0a, 0xec, 0x82, 0xca, 0x7e, 0x03, 0xec, 0x01, 0x00,
0x00, 0x0a, 0x00, 0x82, 0xff, 0xff, 0x04, 0x00, 0x00, 0x09, 0xec,
0x85, 0xcc, 0x80, 0xec, 0xec, 0xcf, 0x01, 0xec, 0x01, 0x00, 0x00,
0x09, 0xec, 0x85, 0xcc, 0x80, 0xec, 0xec, 0xcf, 0x01, 0xec, 0x01,
0x00, 0x00, 0x09, 0xec, 0x85, 0xcc, 0x80, 0xec, 0xec, 0xcf, 0x01,
0xec, 0x01, 0x00, 0x00, 0x09, 0x00, 0x85, 0xff, 0xff, 0x00, 0x00,
0xff, 0x02, 0x00, 0x00, 0x08, 0xec, 0x86, 0xca, 0x80, 0xec, 0xec,
0xcf, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00, 0x08, 0xec, 0x86, 0xca,
0x80, 0xec, 0xec, 0xcf, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00, 0x08,
0xec, 0x86, 0xca, 0x80, 0xec, 0xec, 0xcf, 0x80, 0x01, 0xec, 0x01,
0x00, 0x00, 0x08, 0x00, 0x86, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
0x02, 0x00, 0x00, 0x07, 0xec, 0x87, 0xc6, 0x7e, 0xec, 0xec, 0xc9,
0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00, 0x07, 0xec, 0x87, 0xc6,
0x7e, 0xec, 0xec, 0xc9, 0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00,
0x07, 0xec, 0x87, 0xc6, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0xec, 0x01,
0xec, 0x01, 0x00, 0x00, 0x07, 0x00, 0x86, 0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x03, 0x00, 0x00, 0x06, 0xec, 0x86, 0xc6, 0x7e, 0xec,
0xec, 0xc9, 0x7e, 0x03, 0xec, 0x01, 0x00, 0x00, 0x06, 0xec, 0x86,
0xc6, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0x03, 0xec, 0x01, 0x00, 0x00,
0x06, 0xec, 0x86, 0xc6, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0x03, 0xec,
0x01, 0x00, 0x00, 0x06, 0x00, 0x86, 0xff, 0xff, 0x00, 0x00, 0xff,
0xff, 0x04, 0x00, 0x00, 0x05, 0xec, 0x89, 0xc8, 0x80, 0xec, 0xec,
0xcd, 0x80, 0xec, 0xec, 0xcd, 0x01, 0xec, 0x01, 0x00, 0x00, 0x05,
0xec, 0x89, 0xc8, 0x80, 0xec, 0xec, 0xcd, 0x80, 0xec, 0xec, 0xcd,
0x01, 0xec, 0x01, 0x00, 0x00, 0x05, 0xec, 0x89, 0xc8, 0x80, 0xec,
0xec, 0xcd, 0x80, 0xec, 0xec, 0xcd, 0x01, 0xec, 0x01, 0x00, 0x00,
0x05, 0x00, 0x89, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
0xff, 0x02, 0x00, 0x00, 0x04, 0xec, 0x8a, 0xcd, 0x80, 0xec, 0xec,
0xcd, 0x80, 0xec, 0xec, 0xcd, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00,
0x04, 0xec, 0x8a, 0xcd, 0x80, 0xec, 0xec, 0xcd, 0x80, 0xec, 0xec,
0xcd, 0x80, 0x01, 0xec, 0x01, 0x00, 0x00, 0x04, 0xec, 0x8a, 0xcd,
0x80, 0xec, 0xec, 0xcd, 0x80, 0xec, 0xec, 0xcd, 0x80, 0x01, 0xec,
0x01, 0x00, 0x00, 0x04, 0x00, 0x8a, 0xff, 0xff, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0xff, 0xff, 0x02, 0x00, 0x00, 0x03, 0xec, 0x8b,
0xc9, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0xec,
0x01, 0xec, 0x01, 0x00, 0x00, 0x03, 0xec, 0x8b, 0xc9, 0x7e, 0xec,
0xec, 0xc9, 0x7e, 0xec, 0xec, 0xc9, 0x7e, 0xec, 0x01, 0xec, 0x01,
0x00, 0x00, 0x03, 0xec, 0x8b, 0xc9, 0x7e, 0xec, 0xec, 0xc9, 0x7e,
0xec, 0xec, 0xc9, 0x7e, 0xec, 0x01, 0xec, 0x01, 0x00, 0x00, 0x03,
0x00, 0x8a, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
0xff, 0x03, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x0f, 0xec,
0x01, 0x00, 0x00, 0x0f, 0xec, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00
};
static const size_t resize_box_len = 1683;

View File

@ -122,7 +122,6 @@
#define BUILDING_PANDA_COCOADISPLAY
#define BUILDING_PANDA_GLGSG
#define BUILDING_PANDA_GLXDISPLAY
#define BUILDING_PANDA_OSXDISPLAY
#define BUILDING_PANDA_WGLDISPLAY
#endif
@ -340,14 +339,6 @@
#define EXPTP_PANDA_NET IMPORT_TEMPL
#endif
#ifdef BUILDING_PANDA_OSXDISPLAY
#define EXPCL_PANDA_OSXDISPLAY EXPORT_CLASS
#define EXPTP_PANDA_OSXDISPLAY EXPORT_TEMPL
#else
#define EXPCL_PANDA_OSXDISPLAY IMPORT_CLASS
#define EXPTP_PANDA_OSXDISPLAY IMPORT_TEMPL
#endif
#ifdef BUILDING_PANDA_PARAMETRICS
#define EXPCL_PANDA_PARAMETRICS EXPORT_CLASS
#define EXPTP_PANDA_PARAMETRICS EXPORT_TEMPL

View File

@ -16,8 +16,6 @@
#include "tinyXGraphicsWindow.h"
#include "tinyWinGraphicsPipe.h"
#include "tinyWinGraphicsWindow.h"
#include "tinyOsxGraphicsPipe.h"
#include "tinyOsxGraphicsWindow.h"
#include "tinySDLGraphicsPipe.h"
#include "tinySDLGraphicsWindow.h"
#include "tinyOffscreenGraphicsPipe.h"
@ -40,26 +38,6 @@ ConfigureFn(config_tinydisplay) {
init_libtinydisplay();
}
ConfigVariableBool show_resize_box
("show-resize-box", true,
PRC_DESC("When this variable is true, then resizable OSX Panda windows will "
"be rendered with a resize control in the lower-right corner. "
"This is specially handled by Panda, since otherwise the 3-d "
"window would completely hide any resize control drawn by the "
"OS. Set this variable false to allow this control to be hidden."));
ConfigVariableBool osx_disable_event_loop
("osx-disable-event-loop", false,
PRC_DESC("Set this true to disable the window event loop for the Panda "
"windows. This makes sense only in a publish environment where "
"the window event loop is already handled by another part of the "
"app."));
ConfigVariableInt osx_mouse_wheel_scale
("osx-mouse-wheel-scale", 1,
PRC_DESC("Specify the number of units to spin the Mac mouse wheel to "
"represent a single wheel_up or wheel_down message."));
ConfigVariableBool td_ignore_mipmaps
("td-ignore-mipmaps", false,
PRC_DESC("Configure this true to disable use of mipmaps on the "
@ -117,14 +95,6 @@ init_libtinydisplay() {
ps->set_system_tag("TinyPanda", "native_window_system", "Win");
#endif
#if defined(IS_OSX) && !defined(BUILD_IPHONE) && defined(HAVE_CARBON) && !__LP64__
TinyOsxGraphicsPipe::init_type();
TinyOsxGraphicsWindow::init_type();
selection->add_pipe_type(TinyOsxGraphicsPipe::get_class_type(),
TinyOsxGraphicsPipe::pipe_constructor);
ps->set_system_tag("TinyPanda", "native_window_system", "OSX");
#endif
#ifdef HAVE_SDL
TinySDLGraphicsPipe::init_type();
TinySDLGraphicsWindow::init_type();
@ -150,10 +120,6 @@ get_pipe_type_p3tinydisplay() {
return TinyWinGraphicsPipe::get_class_type().get_index();
#endif
#if defined(IS_OSX) && !defined(BUILD_IPHONE) && defined(HAVE_CARBON) && !__LP64__
return TinyOsxGraphicsPipe::get_class_type().get_index();
#endif
#ifdef HAVE_X11
return TinyXGraphicsPipe::get_class_type().get_index();
#endif

View File

@ -25,10 +25,6 @@ NotifyCategoryDecl(tinydisplay, EXPCL_TINYDISPLAY, EXPTP_TINYDISPLAY);
extern EXPCL_TINYDISPLAY void init_libtinydisplay();
extern "C" EXPCL_TINYDISPLAY int get_pipe_type_p3tinydisplay();
extern ConfigVariableBool show_resize_box;
extern ConfigVariableBool osx_disable_event_loop;
extern ConfigVariableInt osx_mouse_wheel_scale;
extern ConfigVariableInt td_texture_ram;
extern ConfigVariableBool td_ignore_mipmaps;
extern ConfigVariableBool td_ignore_clamp;

View File

@ -1,11 +1,5 @@
// We have to include this early, before anyone includes
// netinet/tcp.h, which will define TCP_NODELAY and other symbols and
// confuse the Apple system headers.
#include "tinyOsxGraphicsPipe.h"
#include "tinyGraphicsStateGuardian.cxx"
#include "tinyOffscreenGraphicsPipe.cxx"
#include "tinyOsxGraphicsPipe.cxx"
#include "tinySDLGraphicsPipe.cxx"
#include "tinySDLGraphicsWindow.cxx"
#include "tinyTextureContext.cxx"

View File

@ -1,12 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file tinyOsxGraphicsPipe.I
* @author drose
* @date 2008-05-12
*/

View File

@ -1,252 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file tinyOsxGraphicsPipe.cxx
* @author drose
* @date 2008-05-12
*/
#include "pandabase.h"
#if defined(IS_OSX) && !defined(BUILD_IPHONE) && defined(HAVE_CARBON) && !__LP64__
#include "tinyOsxGraphicsPipe.h"
#include "config_tinydisplay.h"
#include "tinyOsxGraphicsWindow.h"
#include "tinyGraphicsBuffer.h"
#include "pnmImage.h"
#include "subprocessWindow.h"
#include "nativeWindowHandle.h"
TypeHandle TinyOsxGraphicsPipe::_type_handle;
/**
*
*/
TinyOsxGraphicsPipe::
TinyOsxGraphicsPipe() {
CGRect display_bounds = CGDisplayBounds(kCGDirectMainDisplay);
_display_width = CGRectGetWidth(display_bounds);
_display_height = CGRectGetHeight(display_bounds);
}
/**
*
*/
TinyOsxGraphicsPipe::
~TinyOsxGraphicsPipe() {
}
/**
* Returns the name of the rendering interface associated with this
* GraphicsPipe. This is used to present to the user to allow him/her to
* choose between several possible GraphicsPipes available on a particular
* platform, so the name should be meaningful and unique for a given platform.
*/
std::string TinyOsxGraphicsPipe::
get_interface_name() const {
return "TinyPanda";
}
/**
* This function is passed to the GraphicsPipeSelection object to allow the
* user to make a default TinyOsxGraphicsPipe.
*/
PT(GraphicsPipe) TinyOsxGraphicsPipe::
pipe_constructor() {
return new TinyOsxGraphicsPipe;
}
/**
* Creates a new Quartz bitmap image with the data in the indicated PNMImage.
* The caller should eventually free this image via CGImageRelease.
*/
CGImageRef TinyOsxGraphicsPipe::
create_cg_image(const PNMImage &pnm_image) {
size_t width = pnm_image.get_x_size();
size_t height = pnm_image.get_y_size();
#ifdef PGM_BIGGRAYS
size_t bytes_per_component = 2;
#else
size_t bytes_per_component = 1;
#endif
size_t bits_per_component = bytes_per_component * 8;
size_t num_components = pnm_image.get_num_channels();
size_t bits_per_pixel = num_components * bits_per_component;
size_t bytes_per_row = num_components * bytes_per_component * width;
size_t num_bytes = bytes_per_row * height;
bool has_alpha;
bool is_grayscale;
CFStringRef color_space_name = nullptr;
switch (pnm_image.get_color_type()) {
case PNMImage::CT_grayscale:
color_space_name = kCGColorSpaceGenericGray;
has_alpha = false;
is_grayscale = true;
break;
case PNMImage::CT_two_channel:
color_space_name = kCGColorSpaceGenericGray;
has_alpha = true;
is_grayscale = true;
break;
case PNMImage::CT_color:
color_space_name = kCGColorSpaceGenericRGB;
has_alpha = false;
is_grayscale = false;
break;
case PNMImage::CT_four_channel:
color_space_name = kCGColorSpaceGenericRGB;
has_alpha = true;
is_grayscale = false;
break;
case PNMImage::CT_invalid:
// Shouldn't get here.
nassertr(false, nullptr);
break;
}
nassertr(color_space_name != nullptr, nullptr);
CGColorSpaceRef color_space = CGColorSpaceCreateWithName(color_space_name);
nassertr(color_space != nullptr, nullptr);
CGBitmapInfo bitmap_info = 0;
#ifdef PGM_BIGGRAYS
bitmap_info |= kCGBitmapByteOrder16Host;
#endif
if (has_alpha) {
bitmap_info |= kCGImageAlphaLast;
}
// Now convert the pixel data to a format friendly to CGImageCreate().
char *char_array = (char *)PANDA_MALLOC_ARRAY(num_bytes);
xelval *dp = (xelval *)char_array;
for (size_t yi = 0; yi < height; ++yi) {
for (size_t xi = 0; xi < width; ++xi) {
if (is_grayscale) {
*dp++ = (xelval)(pnm_image.get_gray(xi, yi) * PGM_MAXMAXVAL);
} else {
*dp++ = (xelval)(pnm_image.get_red(xi, yi) * PGM_MAXMAXVAL);
*dp++ = (xelval)(pnm_image.get_green(xi, yi) * PGM_MAXMAXVAL);
*dp++ = (xelval)(pnm_image.get_blue(xi, yi) * PGM_MAXMAXVAL);
}
if (has_alpha) {
*dp++ = (xelval)(pnm_image.get_alpha(xi, yi) * PGM_MAXMAXVAL);
}
}
}
nassertr((void *)dp == (void *)(char_array + num_bytes), nullptr);
CGDataProviderRef provider =
CGDataProviderCreateWithData(nullptr, char_array, num_bytes, release_data);
nassertr(provider != nullptr, nullptr);
CGImageRef image = CGImageCreate
(width, height, bits_per_component, bits_per_pixel, bytes_per_row,
color_space, bitmap_info, provider,
nullptr, false, kCGRenderingIntentDefault);
nassertr(image != nullptr, nullptr);
CGColorSpaceRelease(color_space);
CGDataProviderRelease(provider);
return image;
}
/**
* This callback is assigned to delete the data array allocated within
* create_cg_image().
*/
void TinyOsxGraphicsPipe::
release_data(void *info, const void *data, size_t size) {
char *char_array = (char *)data;
PANDA_FREE_ARRAY(char_array);
}
/**
* Creates a new window or buffer on the pipe, if possible. This routine is
* only called from GraphicsEngine::make_output.
*/
PT(GraphicsOutput) TinyOsxGraphicsPipe::
make_output(const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsEngine *engine,
GraphicsStateGuardian *gsg,
GraphicsOutput *host,
int retry,
bool &precertify) {
if (!_is_valid) {
return nullptr;
}
TinyGraphicsStateGuardian *tinygsg = 0;
if (gsg != 0) {
DCAST_INTO_R(tinygsg, gsg, nullptr);
}
// First thing to try: a TinyOsxGraphicsWindow
if (retry == 0) {
if (((flags&BF_require_parasite)!=0)||
((flags&BF_refuse_window)!=0)||
((flags&BF_resizeable)!=0)||
((flags&BF_size_track_host)!=0)||
((flags&BF_rtt_cumulative)!=0)||
((flags&BF_can_bind_color)!=0)||
((flags&BF_can_bind_every)!=0)) {
return nullptr;
}
if ((flags & BF_fb_props_optional)==0) {
if ((fb_prop.get_aux_rgba() > 0)||
(fb_prop.get_aux_hrgba() > 0)||
(fb_prop.get_aux_float() > 0)) {
return nullptr;
}
}
WindowHandle *window_handle = win_prop.get_parent_window();
if (window_handle != nullptr) {
tinydisplay_cat.info()
<< "Got parent_window " << *window_handle << "\n";
#ifdef SUPPORT_SUBPROCESS_WINDOW
WindowHandle::OSHandle *os_handle = window_handle->get_os_handle();
if (os_handle != nullptr &&
os_handle->is_of_type(NativeWindowHandle::SubprocessHandle::get_class_type())) {
return new SubprocessWindow(engine, this, name, fb_prop, win_prop,
flags, gsg, host);
}
#endif // SUPPORT_SUBPROCESS_WINDOW
}
return new TinyOsxGraphicsWindow(engine, this, name, fb_prop, win_prop,
flags, gsg, host);
}
// Second thing to try: a TinyGraphicsBuffer
if (retry == 1) {
if (((flags&BF_require_parasite)!=0)||
((flags&BF_require_window)!=0)) {
return nullptr;
}
return new TinyGraphicsBuffer(engine, this, name, fb_prop, win_prop, flags, gsg, host);
}
// Nothing else left to try.
return nullptr;
}
#endif // IS_OSX

View File

@ -1,79 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file tinyOsxGraphicsPipe.h
* @author drose
* @date 2008-05-12
*/
#ifndef TINYOSXGRAPHICSPIPE_H
#define TINYOSXGRAPHICSPIPE_H
#include "pandabase.h"
#if defined(IS_OSX) && !defined(BUILD_IPHONE) && defined(HAVE_CARBON) && !__LP64__
// We have to include this early, before anyone includes netinettcp.h, which
// will define TCP_NODELAY and other symbols and confuse the Apple system
// headers.
#include <Carbon/Carbon.h>
#include "graphicsPipe.h"
#include "tinyGraphicsStateGuardian.h"
/**
* This graphics pipe represents the interface for creating TinyPanda graphics
* windows on a Mac client.
*/
class EXPCL_TINYDISPLAY TinyOsxGraphicsPipe : public GraphicsPipe {
public:
TinyOsxGraphicsPipe();
virtual ~TinyOsxGraphicsPipe();
virtual std::string get_interface_name() const;
static PT(GraphicsPipe) pipe_constructor();
static CGImageRef create_cg_image(const PNMImage &pnm_image);
private:
static void release_data(void *info, const void *data, size_t size);
protected:
virtual PT(GraphicsOutput) make_output(const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsEngine *engine,
GraphicsStateGuardian *gsg,
GraphicsOutput *host,
int retry,
bool &precertify);
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GraphicsPipe::init_type();
register_type(_type_handle, "TinyOsxGraphicsPipe",
GraphicsPipe::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
};
#include "tinyOsxGraphicsPipe.I"
#endif // IS_OSX
#endif

View File

@ -1,20 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file tinyOsxGraphicsWindow.I
* @author drose
* @date 2008-05-12
*/
inline void TinyOsxGraphicsWindow::SendKeyEvent( ButtonHandle key, bool down)
{
if(down)
_input_devices[0].button_down(key);
else
_input_devices[0].button_up(key);
}

View File

@ -1,146 +0,0 @@
/**
* PANDA 3D SOFTWARE
* Copyright (c) Carnegie Mellon University. All rights reserved.
*
* All use of this software is subject to the terms of the revised BSD
* license. You should have received a copy of this license along
* with this source code in a file named "LICENSE."
*
* @file tinyOsxGraphicsWindow.h
* @author drose
* @date 2008-05-12
*/
#ifndef TINYOSXGRAPHICSWINDOW_H
#define TINYOSXGRAPHICSWINDOW_H
#include "pandabase.h"
#if defined(IS_OSX) && !defined(BUILD_IPHONE) && defined(HAVE_CARBON) && !__LP64__
#include <Carbon/Carbon.h>
#include "graphicsWindow.h"
#include "buttonHandle.h"
#include "tinyGraphicsStateGuardian.h"
/**
* Opens a window on OS X to display the TinyPanda software rendering.
*/
class TinyOsxGraphicsWindow : public GraphicsWindow {
public:
TinyOsxGraphicsWindow(GraphicsEngine *engine, GraphicsPipe *pipe,
const std::string &name,
const FrameBufferProperties &fb_prop,
const WindowProperties &win_prop,
int flags,
GraphicsStateGuardian *gsg,
GraphicsOutput *host);
virtual ~TinyOsxGraphicsWindow();
virtual bool move_pointer(int device, int x, int y);
virtual bool begin_frame(FrameMode mode, Thread *current_thread);
virtual void end_frame(FrameMode mode, Thread *current_thread);
virtual void begin_flip();
virtual void process_events();
virtual bool supports_pixel_zoom() const;
virtual bool do_reshape_request(int x_origin, int y_origin, bool has_origin,
int x_size, int y_size);
virtual void mouse_mode_absolute();
virtual void mouse_mode_relative();
virtual void set_properties_now(WindowProperties &properties);
private:
void ReleaseSystemResources();
inline void SendKeyEvent( ButtonHandle key, bool down);
protected:
virtual void close_window();
virtual bool open_window();
private:
bool OSOpenWindow(WindowProperties &properties);
// a singleton .. for the events to find the right pipe to push the event
// into
public: // do not call direct ..
OSStatus handleKeyInput (EventHandlerCallRef myHandler, EventRef event, Boolean keyDown);
OSStatus handleTextInput (EventHandlerCallRef myHandler, EventRef event);
OSStatus handleWindowMouseEvents (EventHandlerCallRef myHandler, EventRef event);
ButtonHandle OSX_TranslateKey( UInt32 key, EventRef event );
static TinyOsxGraphicsWindow * GetCurrentOSxWindow (WindowRef hint);
void HandleModifireDeleta(UInt32 modifiers);
void HandleButtonDelta(UInt32 new_buttons);
void DoResize(void);
OSStatus event_handler(EventHandlerCallRef myHandler, EventRef event);
virtual void user_close_request();
void SystemCloseWindow();
void SystemSetWindowForground(bool forground);
void SystemPointToLocalPoint(Point &qdGlobalPoint);
void LocalPointToSystemPoint(Point &qdLocalPoint);
bool set_icon_filename(const Filename &icon_filename);
void set_pointer_in_window(int x, int y);
void set_pointer_out_of_window();
private:
void create_frame_buffer();
private:
ZBuffer *_frame_buffer;
private:
UInt32 _last_key_modifiers;
UInt32 _last_buttons;
WindowRef _osx_window;
bool _is_fullscreen;
CGImageRef _pending_icon;
CGImageRef _current_icon;
int _ID;
static TinyOsxGraphicsWindow *FullScreenWindow;
CFDictionaryRef _originalMode;
// True if _properties.get_cursor_hidden() is true.
bool _cursor_hidden;
// True if the cursor is actually hidden right now via system calls.
bool _display_hide_cursor;
SInt32 _wheel_delta;
public:
static TypeHandle get_class_type() {
return _type_handle;
}
static void init_type() {
GraphicsWindow::init_type();
register_type(_type_handle, "TinyOsxGraphicsWindow",
GraphicsWindow::get_class_type());
}
virtual TypeHandle get_type() const {
return get_class_type();
}
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
private:
static TypeHandle _type_handle;
};
#include "tinyOsxGraphicsWindow.I"
#endif // IS_OSX
#endif

File diff suppressed because it is too large Load Diff