mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-29 00:06:44 -04:00
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:
parent
de9b9590de
commit
58acc25ea2
@ -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')
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
}
|
@ -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__ */
|
@ -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;
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
@ -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
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
@ -1,4 +0,0 @@
|
||||
#include "config_osxdisplay.cxx"
|
||||
#include "osxGraphicsBuffer.cxx"
|
||||
#include "osxGraphicsPipe.cxx"
|
||||
#include "osxGraphicsStateGuardian.cxx"
|
Binary file not shown.
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
*/
|
@ -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
|
@ -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
|
@ -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);
|
||||
}
|
@ -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
Loading…
x
Reference in New Issue
Block a user