Date: Mon, 2 Mar 2009 16:27:42 +0200
From: "Mike Gorchak" Subject: About QNX support in SDL 1.3 Right now I'm working on QNX SDL 1.3 drivers implementation and looks like a lot of code must be completely reworked. But I'm ready for it :) Also I want to add QNX Graphics Framework SDL driver, which is fullscreen graphics framework, with support of hardware accelerated OpenGL ES implementations. This Graphics Framework (called GF in QNX) could also use QNX Photon (window manager GUI) as window manager. In the attachment initial patch for QNX support in SDL 1.3 --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403549
This commit is contained in:
parent
89b23cc7ea
commit
e87963bb44
23 changed files with 116 additions and 4656 deletions
155
README.QNX
155
README.QNX
|
@ -1,155 +1,4 @@
|
||||||
README.QNX by Mike Gorchak <mike@malva.ua>, <lestat@i.com.ua>
|
README.QNX by Mike Gorchak <mike@malva.ua>, <lestat@i.com.ua>
|
||||||
Last changed at 24 Apr 2004.
|
Last changed at 02 Mar 2009.
|
||||||
|
|
||||||
======================================================================
|
QNX Photon and GF drivers are under construction. Please be patient.
|
||||||
Table of Contents:
|
|
||||||
|
|
||||||
1. OpenGL.
|
|
||||||
2. Wheel and multi-button mouses.
|
|
||||||
3. CDROM handling issues.
|
|
||||||
4. Hardware video overlays.
|
|
||||||
5. Shared library building.
|
|
||||||
6. Some building issues.
|
|
||||||
7. Environment variables.
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
1. OpenGL:
|
|
||||||
|
|
||||||
OpenGL works well and is stable, but fullscreen mode has not been
|
|
||||||
heavily tested yet.
|
|
||||||
If you have QNX RtP version 6.1.0 or above you must download the
|
|
||||||
Photon3D runtime from http://developers.qnx.com or install it from the
|
|
||||||
public repository or from the public CD, available with QNX. OS versi-
|
|
||||||
ons below 6.1.0 are not supported.
|
|
||||||
When creating an OpenGL context, software renderer mode is artifi-
|
|
||||||
cially selected (QSSL made acceleration only for Voodoo boards in
|
|
||||||
fullscreen mode, sorry but I don't have this board to test OpenGL -
|
|
||||||
maybe it works or maybe not :)). If you want acceleration - you can
|
|
||||||
remove one line in the source code: find the file SDL_ph_image.c and
|
|
||||||
remove the following
|
|
||||||
|
|
||||||
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
|
|
||||||
|
|
||||||
line in the ph_SetupOpenGLContext() function or change the argument to
|
|
||||||
PHOGL_ATTRIB_FORCE_HW or PHOGL_ATTRIB_FAVOR_HW.
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
2. Wheel and multi-button mouses:
|
|
||||||
|
|
||||||
Photon emits keyboard events (key up and down) when the mouse
|
|
||||||
wheel is moved. The key_scan field appears valid, and it contains zero.
|
|
||||||
That is a basic method of detecting mouse wheel events under Photon.
|
|
||||||
It looks like a hack, but it works for me :) on various PC configura-
|
|
||||||
tions.
|
|
||||||
|
|
||||||
I've tested it on:
|
|
||||||
|
|
||||||
1. Genius Optical NetScroll/+ PS/2 (1 wheel)
|
|
||||||
2. A4Tech Optical GreatEye WheelMouse PS/2, model: WOP-35. (2 wheels
|
|
||||||
+ 2 additional buttons). The wheel for vertical scrolling works as
|
|
||||||
usual, but the second wheel for horizontal scrolling emits two se-
|
|
||||||
quential events up or down, so it can provide faster scrolling than
|
|
||||||
the first wheel. Additional buttons don't emit any events, but it
|
|
||||||
looks like they're handled by photon in an unusual way - like click
|
|
||||||
to front, but works not with any window, looks like a fun bug-o-fe-
|
|
||||||
ature :).
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
3. CDROM handling issues:
|
|
||||||
|
|
||||||
Access to CDROM can only be provided with 'root' privileges. I
|
|
||||||
can't do anything about that, /dev/cd0 has brw------- permissions and
|
|
||||||
root:root rights.
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
4. Hardware video overlays:
|
|
||||||
|
|
||||||
Overlays can flicker during window movement, resizing, etc. It
|
|
||||||
happens because the photon driver updates the real window contents be-
|
|
||||||
hind the overlay, then draws the temporary chroma key color over the
|
|
||||||
window contents. It can be done without using the chroma key but that
|
|
||||||
causes the overlay to always be on top. So flickering during window
|
|
||||||
movement is preferred instead.
|
|
||||||
Double buffering code is temporarily disabled in the photon driver
|
|
||||||
code, because on my GF2-MX it can accidentally cause a buffer switch,
|
|
||||||
which causes the old frame to show. S3 Savage4 has the same problem,
|
|
||||||
but ATI Rage 128 doesn't. I think it can be fixed later. Current code
|
|
||||||
works very well, so maybe double buffering is not needed right now.
|
|
||||||
Something strange happens when you try to move the window with the
|
|
||||||
overlay beyond the left border of the screen. The overlay tries to
|
|
||||||
stay at position x=0, but when attempting to move it a bit more it
|
|
||||||
jumps to position x=-60 (on GF2-MX, on ATI Rage128 this value a bit
|
|
||||||
smaller). It's really strange, looks like the overlay doesn't like
|
|
||||||
negative coordinates.
|
|
||||||
|
|
||||||
=======================================================================
|
|
||||||
5. Shared library building:
|
|
||||||
|
|
||||||
A shared library can be built, but before running the autogen.sh
|
|
||||||
script you must manually delete the libtool.m4 stuff from the acinclu-
|
|
||||||
de.m4 file (it comes after the ESD detection code up to the end of the
|
|
||||||
file), because the libtool stuff in the acinclude.m4 file was very old
|
|
||||||
in SDL distribution before the version 1.2.7 and doesn't knew anything
|
|
||||||
about QNX. SDL 1.2.7 distribution contains the new libtool.m4 script,
|
|
||||||
but anyway it is broken :), Just remove it, then run "libtoolize
|
|
||||||
--force --copy", delete the file aclocal.m4 if it is exists and after
|
|
||||||
that run the autogen.sh script. SDL 1.2.8 contains fixed libtool.m4,
|
|
||||||
ltmain.sh and config.sub files, so you can just run the autogen.sh
|
|
||||||
script.
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
6. Some building issues:
|
|
||||||
|
|
||||||
Feel free to not use the --disable-shared configure option if you'
|
|
||||||
ve read the above comment about 'Shared library building'. Otherwise
|
|
||||||
this option is strongly recommended, as without it the sdl-config
|
|
||||||
script will be broken.
|
|
||||||
|
|
||||||
Run the configure script without x11 support, e.g.:
|
|
||||||
|
|
||||||
a) for OpenGL support:
|
|
||||||
./configure --prefix=/usr \
|
|
||||||
--disable-video-x11 \
|
|
||||||
--disable-shared
|
|
||||||
|
|
||||||
b) without OpenGL support:
|
|
||||||
./configure --prefix=/usr \
|
|
||||||
--disable-video-x11 \
|
|
||||||
--disable-shared \
|
|
||||||
--disable-video-opengl
|
|
||||||
|
|
||||||
And of course dont forget to specify --disable-debug, which is on
|
|
||||||
by default, to disable debug and enable the expensive optimizations.
|
|
||||||
|
|
||||||
In the test directory also run the ./configure script without
|
|
||||||
x11 support, e.g.:
|
|
||||||
|
|
||||||
./configure --with-sdl-prefix=/usr \
|
|
||||||
--with-sdl-exec-prefix=/usr \
|
|
||||||
--prefix=/usr --without-x
|
|
||||||
|
|
||||||
======================================================================
|
|
||||||
7. Environment variables:
|
|
||||||
|
|
||||||
Please note that the photon driver is sensible to the following
|
|
||||||
environmental variables:
|
|
||||||
|
|
||||||
* SDL_PHOTON_FULLSCREEN_REFRESH - this environment variable controls
|
|
||||||
the refresh rate in all fullscreen modes. Be carefull !!! Photon
|
|
||||||
drivers usually do not checking the maximum refresh rate, which video
|
|
||||||
adapter or monitor supports.
|
|
||||||
|
|
||||||
* SDL_VIDEO_WINDOW_POS - can be set in the "X,Y" format. If X and Y
|
|
||||||
coordinates are bigger than the current desktop resolution, then win-
|
|
||||||
dow positioning across virtual consoles is activated. If X and Y are
|
|
||||||
smaller than the desktop resolution then window positioning in the
|
|
||||||
current console is activated. The word "center" can be used instead of
|
|
||||||
coordinates, it produces the same behavior as SDL_VIDEO_CENTERED
|
|
||||||
environmental variable.
|
|
||||||
|
|
||||||
* SDL_VIDEO_CENTERED - if this environmental variable exists then the
|
|
||||||
window centering is perfomed in the current virtual console.
|
|
||||||
|
|
||||||
Notes: The SDL_VIDEO_CENTERED enviromental variable has greater pri-
|
|
||||||
ority than the SDL_VIDEO_WINDOW_POS in case if both variables are sup-
|
|
||||||
plied to the application.
|
|
||||||
|
|
140
SDL.qpg.in
140
SDL.qpg.in
|
@ -1,140 +0,0 @@
|
||||||
<QPG:Generation>
|
|
||||||
<QPG:Options>
|
|
||||||
<QPG:User unattended="yes" verbosity="0" listfiles="yes"/>
|
|
||||||
<QPG:Defaults type="qnx_package"/>
|
|
||||||
<QPG:Source></QPG:Source>
|
|
||||||
<QPG:Release date="today" number="+"/>
|
|
||||||
<QPG:Build></QPG:Build>
|
|
||||||
<QPG:FileSorting strip="yes"/>
|
|
||||||
<QPG:Package targets="standart"/>
|
|
||||||
<QPG:Repository generate="yes"/>
|
|
||||||
<QPG:FinalDir></QPG:FinalDir>
|
|
||||||
<QPG:Cleanup></QPG:Cleanup>
|
|
||||||
</QPG:Options>
|
|
||||||
|
|
||||||
<QPG:Responsible>
|
|
||||||
<QPG:Company>QNX.ORG.RU Community</QPG:Company>
|
|
||||||
<QPG:Department></QPG:Department>
|
|
||||||
<QPG:Group></QPG:Group>
|
|
||||||
<QPG:Team>QNX.ORG.RU Team</QPG:Team>
|
|
||||||
<QPG:Employee>Mike Gorchak</QPG:Employee>
|
|
||||||
<QPG:EmailAddress>mike@malva.ua</QPG:EmailAddress>
|
|
||||||
</QPG:Responsible>
|
|
||||||
|
|
||||||
<QPG:Values>
|
|
||||||
<QPG:Files>
|
|
||||||
<QPG:Add file="./COPYING" install="LicenseUrl/" handling="repdata"/>
|
|
||||||
<QPG:Add permissions="0755" file="./src/.libs/libSDL-@SDL_MAJOR_VERSION@.@SDL_MINOR_VERSION@.so.@LT_AGE@" install="/usr/lib/"/>
|
|
||||||
<QPG:Add filetype="symlink" file="libSDL.so" install="/usr/lib/" linkto="libSDL-@SDL_MAJOR_VERSION@.@SDL_MINOR_VERSION@.so.@LT_AGE@"/>
|
|
||||||
<QPG:Add permissions="0644" file="./src/.libs/libSDL.a" install="/usr/lib/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./src/.libs/libSDL.lai" install="/usr/lib/libSDL.la"/>
|
|
||||||
<QPG:Add permissions="0644" file="./src/main/libSDLmain.a" install="/usr/lib/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./include/*.h" install="/usr/include/SDL/"/>
|
|
||||||
<QPG:Add permissions="0755" file="./sdl-config" install="/usr/bin/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./BUGS" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./COPYING" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./CREDITS" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./INSTALL" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./README" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./README-SDL.txt" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./README.CVS" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./README.QNX" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./TODO" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./WhatsNew" install="/usr/share/doc/SDL12/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./docs.html" install="/usr/share/doc/SDL12/Changes.html"/>
|
|
||||||
<QPG:Add permissions="0644" file="./docs/index.html" install="/usr/share/doc/SDL12/docs/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./docs/html/*.html" install="/usr/share/doc/SDL12/docs/html/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./docs/man3/*.3" install="/usr/share/man/man3/"/>
|
|
||||||
<QPG:Add permissions="0644" file="./sdl.m4" install="/usr/share/aclocal/"/>
|
|
||||||
</QPG:Files>
|
|
||||||
<QPG:PackageFilter>
|
|
||||||
<QPM:PackageManifest>
|
|
||||||
|
|
||||||
<QPM:PackageDescription>
|
|
||||||
<QPM:PackageType>Library</QPM:PackageType>
|
|
||||||
<QPM:PackageName>SDL</QPM:PackageName>
|
|
||||||
<QPM:PackageReleaseNumber>1</QPM:PackageReleaseNumber>
|
|
||||||
<QPM:PackageRepository>http://qnx.org.ru/repository</QPM:PackageRepository>
|
|
||||||
<QPM:FileVersion>2.6</QPM:FileVersion>
|
|
||||||
</QPM:PackageDescription>
|
|
||||||
|
|
||||||
<QPM:ProductDescription>
|
|
||||||
<QPM:ProductName>Simple DirectMedia Layer (SDL)</QPM:ProductName>
|
|
||||||
<QPM:ProductIdentifier>SDL</QPM:ProductIdentifier>
|
|
||||||
<QPM:ProductEmail>slouken@libsdl.org</QPM:ProductEmail>
|
|
||||||
<QPM:VendorName>Public</QPM:VendorName>
|
|
||||||
<QPM:VendorInstallName>public</QPM:VendorInstallName>
|
|
||||||
<QPM:VendorURL>http://www.libsdl.org</QPM:VendorURL>
|
|
||||||
<QPM:VendorEmbedURL/>
|
|
||||||
<QPM:VendorEmail>slouken@libsdl.org</QPM:VendorEmail>
|
|
||||||
<QPM:AuthorName>Sam Lantinga</QPM:AuthorName>
|
|
||||||
<QPM:AuthorURL>http://www.libsdl.org</QPM:AuthorURL>
|
|
||||||
<QPM:AuthorEmbedURL/>
|
|
||||||
<QPM:AuthorEmail>slouken@libsdl.org</QPM:AuthorEmail>
|
|
||||||
<QPM:ProductIconSmall/>
|
|
||||||
<QPM:ProductIconLarge/>
|
|
||||||
<QPM:ProductDescriptionShort>This is the Simple DirectMedia Layer (SDL), a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms.</QPM:ProductDescriptionShort>
|
|
||||||
<QPM:ProductDescriptionLong>This is the Simple DirectMedia Layer (SDL), a generic API that provides low level access to audio, keyboard, mouse, and display framebuffer across multiple platforms. This is the libraries, include files and other resources you can use to develop and run SDL applications.</QPM:ProductDescriptionLong>
|
|
||||||
<QPM:ProductDescriptionURL>http://www.libsdl.org</QPM:ProductDescriptionURL>
|
|
||||||
<QPM:ProductDescriptionEmbedURL/>
|
|
||||||
</QPM:ProductDescription>
|
|
||||||
|
|
||||||
<QPM:ReleaseDescription>
|
|
||||||
<QPM:ReleaseVersion>@VERSION@</QPM:ReleaseVersion>
|
|
||||||
<QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
|
|
||||||
<QPM:ReleaseStability>Stable</QPM:ReleaseStability>
|
|
||||||
<QPM:ReleaseNoteMinor/>
|
|
||||||
<QPM:ReleaseNoteMajor/>
|
|
||||||
<QPM:ReleaseBuild>1</QPM:ReleaseBuild>
|
|
||||||
<QPM:CountryExclude/>
|
|
||||||
<QPM:ReleaseCopyright>GNU Lesser General Public License</QPM:ReleaseCopyright>
|
|
||||||
</QPM:ReleaseDescription>
|
|
||||||
|
|
||||||
<QPM:ContentDescription>
|
|
||||||
<QPM:ContentTopic xmlmultiple="true">Software Development/Libraries and Extensions/C Libraries</QPM:ContentTopic>
|
|
||||||
<QPM:ContentKeyword>SDL,audio,graphics,demos,games,emulators,direct,media,layer</QPM:ContentKeyword>
|
|
||||||
<QPM:TargetOS>qnx6</QPM:TargetOS>
|
|
||||||
<QPM:HostOS>none</QPM:HostOS>
|
|
||||||
<QPM:DisplayEnvironment xmlmultiple="true">Photon</QPM:DisplayEnvironment>
|
|
||||||
<QPM:DisplayEnvironment xmlmultiple="true">Console</QPM:DisplayEnvironment>
|
|
||||||
<QPM:TargetAudience xmlmultiple="true">Developer</QPM:TargetAudience>
|
|
||||||
<QPM:TargetAudience xmlmultiple="true">User</QPM:TargetAudience>
|
|
||||||
</QPM:ContentDescription>
|
|
||||||
<QPM:LicenseUrl>repdata://LicenseUrl/COPYING</QPM:LicenseUrl>
|
|
||||||
</QPM:PackageManifest>
|
|
||||||
</QPG:PackageFilter>
|
|
||||||
|
|
||||||
<QPG:PackageFilter proc="none" target="none">
|
|
||||||
<QPM:PackageManifest>
|
|
||||||
<QPM:ProductInstallationDependencies>
|
|
||||||
<QPM:ProductRequirements></QPM:ProductRequirements>
|
|
||||||
</QPM:ProductInstallationDependencies>
|
|
||||||
</QPM:PackageManifest>
|
|
||||||
</QPG:PackageFilter>
|
|
||||||
|
|
||||||
<QPG:PackageFilter proc="x86" target="none">
|
|
||||||
<QPM:PackageManifest>
|
|
||||||
<QPM:ProductInstallationDependencies>
|
|
||||||
<QPM:ProductRequirements></QPM:ProductRequirements>
|
|
||||||
</QPM:ProductInstallationDependencies>
|
|
||||||
</QPM:PackageManifest>
|
|
||||||
</QPG:PackageFilter>
|
|
||||||
|
|
||||||
<QPG:PackageFilter proc="none" target="x86">
|
|
||||||
<QPM:PackageManifest>
|
|
||||||
<QPM:ProductInstallationDependencies>
|
|
||||||
<QPM:ProductRequirements></QPM:ProductRequirements>
|
|
||||||
</QPM:ProductInstallationDependencies>
|
|
||||||
</QPM:PackageManifest>
|
|
||||||
</QPG:PackageFilter>
|
|
||||||
|
|
||||||
<QPG:PackageFilter proc="x86" target="x86">
|
|
||||||
<QPM:PackageManifest>
|
|
||||||
<QPM:ProductInstallationDependencies>
|
|
||||||
<QPM:ProductRequirements></QPM:ProductRequirements>
|
|
||||||
</QPM:ProductInstallationDependencies>
|
|
||||||
</QPM:PackageManifest>
|
|
||||||
</QPG:PackageFilter>
|
|
||||||
|
|
||||||
</QPG:Values>
|
|
||||||
</QPG:Generation>
|
|
95
configure.in
95
configure.in
|
@ -1256,6 +1256,35 @@ AC_HELP_STRING([--enable-video-photon], [use QNX Photon video driver [[default=y
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dnl Check for QNX photon video driver
|
||||||
|
CheckQNXGF()
|
||||||
|
{
|
||||||
|
AC_ARG_ENABLE(video-qnxgf,
|
||||||
|
AC_HELP_STRING([--enable-video-qnxgf], [use QNX GF video driver [[default=yes]]]),
|
||||||
|
, enable_video_qnxgf=yes)
|
||||||
|
if test x$enable_video = xyes -a x$enable_video_qnxgf = xyes; then
|
||||||
|
AC_MSG_CHECKING(for QNX GF support)
|
||||||
|
video_qnxgf=no
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#include <gf/gf.h>
|
||||||
|
#include <gf/gf3d.h>
|
||||||
|
],[
|
||||||
|
gf_3d_config_info_t* gfinfo;
|
||||||
|
],[
|
||||||
|
video_qnxgf=yes
|
||||||
|
])
|
||||||
|
AC_MSG_RESULT($video_qnxgf)
|
||||||
|
if test x$video_qnxgf = xyes; then
|
||||||
|
AC_DEFINE(SDL_VIDEO_DRIVER_QNXGF)
|
||||||
|
SOURCES="$SOURCES $srcdir/src/video/qnxgf/*.c"
|
||||||
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lgf"
|
||||||
|
have_video=yes
|
||||||
|
|
||||||
|
CheckOpenGLESQNX
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
dnl Set up the BWindow video driver if enabled
|
dnl Set up the BWindow video driver if enabled
|
||||||
CheckBWINDOW()
|
CheckBWINDOW()
|
||||||
{
|
{
|
||||||
|
@ -1639,11 +1668,11 @@ CheckOpenGLX11()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
dnl Find QNX RtP OpenGL
|
dnl Find QNX 6.x Software OpenGL
|
||||||
CheckOpenGLQNX()
|
CheckOpenGLQNX()
|
||||||
{
|
{
|
||||||
if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
|
if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
|
||||||
AC_MSG_CHECKING(for OpenGL (Photon) support)
|
AC_MSG_CHECKING(for QNX 6.x Photon OpenGL support)
|
||||||
video_opengl=no
|
video_opengl=no
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
|
@ -1660,6 +1689,43 @@ CheckOpenGLQNX()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dnl Find QNX 6.3 and above OpenGL ES implementation
|
||||||
|
CheckOpenGLESQNX()
|
||||||
|
{
|
||||||
|
if test x$enable_video = xyes -a x$enable_video_opengl = xyes; then
|
||||||
|
AC_MSG_CHECKING(for QNX OpenGL ES (CM) support)
|
||||||
|
video_opengl=no
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#include <GLES/egl.h>
|
||||||
|
],[
|
||||||
|
],[
|
||||||
|
video_opengl=yes
|
||||||
|
])
|
||||||
|
AC_MSG_RESULT($video_opengl)
|
||||||
|
if test x$video_opengl = xyes; then
|
||||||
|
AC_DEFINE(SDL_VIDEO_OPENGL_ES)
|
||||||
|
AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES)
|
||||||
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lGLES_CM"
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING(for QNX OpenGL ES (CL) support)
|
||||||
|
video_opengl=no
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#include <GLES/egl.h>
|
||||||
|
],[
|
||||||
|
],[
|
||||||
|
video_opengl=yes
|
||||||
|
])
|
||||||
|
AC_MSG_RESULT($video_opengl)
|
||||||
|
if test x$video_opengl = xyes; then
|
||||||
|
AC_DEFINE(SDL_VIDEO_OPENGL_ES)
|
||||||
|
AC_DEFINE(SDL_VIDEO_RENDER_OGL_ES)
|
||||||
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lGLES_CL"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
dnl Check for Win32 OpenGL
|
dnl Check for Win32 OpenGL
|
||||||
CheckWIN32GL()
|
CheckWIN32GL()
|
||||||
{
|
{
|
||||||
|
@ -2406,16 +2472,27 @@ case "$host" in
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*-*-qnx*)
|
*-*-qnx*)
|
||||||
|
|
||||||
|
EXTRA_CFLAGS="-I/usr/include $CFLAGS"
|
||||||
|
EXTRA_LDLAGS="-L/usr/lib $LDFLAGS"
|
||||||
|
|
||||||
ARCH=qnx
|
ARCH=qnx
|
||||||
|
CheckVisibilityHidden
|
||||||
CheckDummyVideo
|
CheckDummyVideo
|
||||||
CheckDiskAudio
|
CheckDiskAudio
|
||||||
CheckDummyAudio
|
CheckDummyAudio
|
||||||
CheckDLOPEN
|
CheckDLOPEN
|
||||||
|
CheckPulseAudio
|
||||||
|
CheckESD
|
||||||
CheckNAS
|
CheckNAS
|
||||||
CheckPHOTON
|
CheckPHOTON
|
||||||
|
CheckQNXGF
|
||||||
CheckX11
|
CheckX11
|
||||||
CheckOpenGLX11
|
CheckOpenGLX11
|
||||||
CheckPTHREAD
|
CheckPTHREAD
|
||||||
|
CheckClockGettime
|
||||||
|
|
||||||
|
|
||||||
# Set up files for the audio library
|
# Set up files for the audio library
|
||||||
if test x$enable_audio = xyes; then
|
if test x$enable_audio = xyes; then
|
||||||
AC_DEFINE(SDL_AUDIO_DRIVER_QNXNTO)
|
AC_DEFINE(SDL_AUDIO_DRIVER_QNXNTO)
|
||||||
|
@ -2435,6 +2512,18 @@ case "$host" in
|
||||||
SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
|
SOURCES="$SOURCES $srcdir/src/timer/unix/*.c"
|
||||||
have_timers=yes
|
have_timers=yes
|
||||||
fi
|
fi
|
||||||
|
# Set up dummy files for the joystick for now
|
||||||
|
if test x$enable_joystick = xyes; then
|
||||||
|
AC_DEFINE(SDL_JOYSTICK_DUMMY)
|
||||||
|
SOURCES="$SOURCES $srcdir/src/joystick/dummy/*.c"
|
||||||
|
have_joystick=yes
|
||||||
|
fi
|
||||||
|
# Set up dummy files for the haptic for now
|
||||||
|
if test x$enable_haptic = xyes; then
|
||||||
|
AC_DEFINE(SDL_HAPTIC_DUMMY)
|
||||||
|
SOURCES="$SOURCES $srcdir/src/haptic/dummy/*.c"
|
||||||
|
have_haptic=yes
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*-*-cygwin* | *-*-mingw32*)
|
*-*-cygwin* | *-*-mingw32*)
|
||||||
ARCH=win32
|
ARCH=win32
|
||||||
|
@ -2865,7 +2954,7 @@ AC_SUBST(EXTRA_LDFLAGS)
|
||||||
AC_SUBST(WINDRES)
|
AC_SUBST(WINDRES)
|
||||||
|
|
||||||
AC_OUTPUT([
|
AC_OUTPUT([
|
||||||
Makefile sdl-config SDL.spec SDL.qpg sdl.pc
|
Makefile sdl-config SDL.spec sdl.pc
|
||||||
], [
|
], [
|
||||||
: >build-deps
|
: >build-deps
|
||||||
if test x"$MAKE" = x; then MAKE=make; fi; $MAKE depend
|
if test x"$MAKE" = x; then MAKE=make; fi; $MAKE depend
|
||||||
|
|
|
@ -285,6 +285,7 @@
|
||||||
#undef SDL_VIDEO_DRIVER_NDS
|
#undef SDL_VIDEO_DRIVER_NDS
|
||||||
#undef SDL_VIDEO_DRIVER_OS2FS
|
#undef SDL_VIDEO_DRIVER_OS2FS
|
||||||
#undef SDL_VIDEO_DRIVER_PHOTON
|
#undef SDL_VIDEO_DRIVER_PHOTON
|
||||||
|
#undef SDL_VIDEO_DRIVER_QNXGF
|
||||||
#undef SDL_VIDEO_DRIVER_PS2GS
|
#undef SDL_VIDEO_DRIVER_PS2GS
|
||||||
#undef SDL_VIDEO_DRIVER_RISCOS
|
#undef SDL_VIDEO_DRIVER_RISCOS
|
||||||
#undef SDL_VIDEO_DRIVER_SVGALIB
|
#undef SDL_VIDEO_DRIVER_SVGALIB
|
||||||
|
|
|
@ -40,6 +40,10 @@ extern "C"
|
||||||
#include <OpenGLES/ES1/gl.h> /* Header File For The OpenGL ES Library */
|
#include <OpenGLES/ES1/gl.h> /* Header File For The OpenGL ES Library */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__QNXNTO__) && defined(SDL_VIDEO_OPENGL_ES)
|
||||||
|
#include <GLES/egl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef APIENTRY
|
#ifndef APIENTRY
|
||||||
#define APIENTRY
|
#define APIENTRY
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -369,7 +369,10 @@ extern VideoBootStrap WIN32_bootstrap;
|
||||||
extern VideoBootStrap BWINDOW_bootstrap;
|
extern VideoBootStrap BWINDOW_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_PHOTON
|
#if SDL_VIDEO_DRIVER_PHOTON
|
||||||
extern VideoBootStrap ph_bootstrap;
|
extern VideoBootStrap photon_bootstrap;
|
||||||
|
#endif
|
||||||
|
#if SDL_VIDEO_DRIVER_QNXGF
|
||||||
|
extern VideoBootStrap qnxgf_bootstrap;
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_EPOC
|
#if SDL_VIDEO_DRIVER_EPOC
|
||||||
extern VideoBootStrap EPOC_bootstrap;
|
extern VideoBootStrap EPOC_bootstrap;
|
||||||
|
|
|
@ -89,7 +89,10 @@ static VideoBootStrap *bootstrap[] = {
|
||||||
&BWINDOW_bootstrap,
|
&BWINDOW_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_PHOTON
|
#if SDL_VIDEO_DRIVER_PHOTON
|
||||||
&ph_bootstrap,
|
&photon_bootstrap,
|
||||||
|
#endif
|
||||||
|
#if SDL_VIDEO_DRIVER_QNXGF
|
||||||
|
&qnxgf_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
#if SDL_VIDEO_DRIVER_EPOC
|
#if SDL_VIDEO_DRIVER_EPOC
|
||||||
&EPOC_bootstrap,
|
&EPOC_bootstrap,
|
||||||
|
|
|
@ -1,622 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
/* Handle the event stream, converting photon events into SDL events */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#include <Ph.h>
|
|
||||||
#include <photon/PkKeyDef.h>
|
|
||||||
|
|
||||||
#include "SDL_syswm.h"
|
|
||||||
#include "../SDL_sysvideo.h"
|
|
||||||
#include "../../events/SDL_sysevents.h"
|
|
||||||
#include "../../events/SDL_events_c.h"
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
#include "SDL_ph_modes_c.h"
|
|
||||||
#include "SDL_ph_image_c.h"
|
|
||||||
#include "SDL_ph_events_c.h"
|
|
||||||
#include "SDL_phyuv_c.h"
|
|
||||||
|
|
||||||
/* The translation tables from a photon keysym to a SDL keysym */
|
|
||||||
static SDLKey ODD_keymap[256];
|
|
||||||
static SDLKey MISC_keymap[0xFF + 1];
|
|
||||||
SDL_keysym *ph_TranslateKey(PhKeyEvent_t * key, SDL_keysym * keysym);
|
|
||||||
|
|
||||||
/* Check to see if this is a repeated key.
|
|
||||||
(idea shamelessly lifted from GII -- thanks guys! :) */
|
|
||||||
static int
|
|
||||||
ph_WarpedMotion(_THIS, PhEvent_t * winEvent)
|
|
||||||
{
|
|
||||||
PhRect_t *rect = PhGetRects(winEvent);
|
|
||||||
|
|
||||||
int centre_x, centre_y;
|
|
||||||
int dx, dy;
|
|
||||||
short abs_x, abs_y;
|
|
||||||
int posted;
|
|
||||||
|
|
||||||
centre_x = SDL_VideoSurface->w / 2;
|
|
||||||
centre_y = SDL_VideoSurface->h / 2;
|
|
||||||
|
|
||||||
dx = rect->ul.x - centre_x;
|
|
||||||
dy = rect->ul.y - centre_y;
|
|
||||||
|
|
||||||
posted = SDL_PrivateMouseMotion(0, 1, dx, dy);
|
|
||||||
|
|
||||||
/* Move mouse cursor to middle of the window */
|
|
||||||
PtGetAbsPosition(window, &abs_x, &abs_y);
|
|
||||||
PhMoveCursorAbs(PhInputGroup(NULL), abs_x + centre_x, abs_y + centre_y);
|
|
||||||
|
|
||||||
return (posted);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Control which motion flags the window has set, a flags value of -1 sets
|
|
||||||
* MOTION_BUTTON and MOTION_NOBUTTON */
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_motion_sensitivity(_THIS, unsigned int flags)
|
|
||||||
{
|
|
||||||
int rid;
|
|
||||||
int fields = Ph_EV_PTR_MOTION_BUTTON | Ph_EV_PTR_MOTION_NOBUTTON;
|
|
||||||
PhRegion_t region;
|
|
||||||
|
|
||||||
if (window) {
|
|
||||||
rid = PtWidgetRid(window);
|
|
||||||
if (rid != 0 && PhRegionQuery(rid, ®ion, NULL, NULL, 0) == 0) {
|
|
||||||
region.events_sense =
|
|
||||||
(region.events_sense & ~fields) | (flags & fields);
|
|
||||||
PhRegionChange(Ph_REGION_EV_SENSE, 0, ®ion, NULL, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert the photon button state value to an SDL value */
|
|
||||||
static Uint8
|
|
||||||
ph2sdl_mousebutton(unsigned short button_state)
|
|
||||||
{
|
|
||||||
Uint8 mouse_button = 0;
|
|
||||||
|
|
||||||
if (button_state & Ph_BUTTON_SELECT)
|
|
||||||
mouse_button |= SDL_BUTTON_LEFT;
|
|
||||||
if (button_state & Ph_BUTTON_MENU)
|
|
||||||
mouse_button |= SDL_BUTTON_RIGHT;
|
|
||||||
if (button_state & Ph_BUTTON_ADJUST)
|
|
||||||
mouse_button |= SDL_BUTTON_MIDDLE;
|
|
||||||
|
|
||||||
return (mouse_button);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ph_DispatchEvent(_THIS)
|
|
||||||
{
|
|
||||||
int posted;
|
|
||||||
PhRect_t *rect;
|
|
||||||
PhPointerEvent_t *pointerEvent;
|
|
||||||
PhKeyEvent_t *keyEvent;
|
|
||||||
PhWindowEvent_t *winEvent;
|
|
||||||
int i, buttons;
|
|
||||||
SDL_Rect sdlrects[PH_SDL_MAX_RECTS];
|
|
||||||
|
|
||||||
posted = 0;
|
|
||||||
|
|
||||||
switch (phevent->type) {
|
|
||||||
case Ph_EV_BOUNDARY:
|
|
||||||
{
|
|
||||||
if (phevent->subtype == Ph_EV_PTR_ENTER) {
|
|
||||||
posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
|
|
||||||
} else if (phevent->subtype == Ph_EV_PTR_LEAVE) {
|
|
||||||
posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_PTR_MOTION_BUTTON:
|
|
||||||
case Ph_EV_PTR_MOTION_NOBUTTON:
|
|
||||||
{
|
|
||||||
if (SDL_VideoSurface) {
|
|
||||||
pointerEvent = PhGetData(phevent);
|
|
||||||
rect = PhGetRects(phevent);
|
|
||||||
|
|
||||||
if (mouse_relative) {
|
|
||||||
posted = ph_WarpedMotion(this, phevent);
|
|
||||||
} else {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseMotion(0, 0, rect->ul.x, rect->ul.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_BUT_PRESS:
|
|
||||||
{
|
|
||||||
pointerEvent = PhGetData(phevent);
|
|
||||||
buttons = ph2sdl_mousebutton(pointerEvent->buttons);
|
|
||||||
if (buttons != 0) {
|
|
||||||
posted = SDL_PrivateMouseButton(SDL_PRESSED, buttons, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_BUT_RELEASE:
|
|
||||||
{
|
|
||||||
pointerEvent = PhGetData(phevent);
|
|
||||||
buttons = ph2sdl_mousebutton(pointerEvent->buttons);
|
|
||||||
if (phevent->subtype == Ph_EV_RELEASE_REAL && buttons != 0) {
|
|
||||||
posted = SDL_PrivateMouseButton(SDL_RELEASED, buttons, 0, 0);
|
|
||||||
} else if (phevent->subtype == Ph_EV_RELEASE_PHANTOM) {
|
|
||||||
/* If the mouse is outside the window,
|
|
||||||
* only a phantom release event is sent, so
|
|
||||||
* check if the window doesn't have mouse focus.
|
|
||||||
* Not perfect, maybe checking the mouse button
|
|
||||||
* state for Ph_EV_BOUNDARY events would be
|
|
||||||
* better. */
|
|
||||||
if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS) == 0) {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseButton(SDL_RELEASED, buttons, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_WM:
|
|
||||||
{
|
|
||||||
winEvent = PhGetData(phevent);
|
|
||||||
|
|
||||||
/* losing focus */
|
|
||||||
if ((winEvent->event_f == Ph_WM_FOCUS)
|
|
||||||
&& (winEvent->event_state == Ph_WM_EVSTATE_FOCUSLOST)) {
|
|
||||||
set_motion_sensitivity(this, Ph_EV_PTR_MOTION_BUTTON);
|
|
||||||
posted = SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
|
|
||||||
}
|
|
||||||
/* gaining focus */
|
|
||||||
else if ((winEvent->event_f == Ph_WM_FOCUS)
|
|
||||||
&& (winEvent->event_state == Ph_WM_EVSTATE_FOCUS)) {
|
|
||||||
set_motion_sensitivity(this, -1);
|
|
||||||
posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
|
|
||||||
}
|
|
||||||
/* request quit */
|
|
||||||
else if (winEvent->event_f == Ph_WM_CLOSE) {
|
|
||||||
posted = SDL_PrivateQuit();
|
|
||||||
}
|
|
||||||
/* request hide/unhide */
|
|
||||||
else if (winEvent->event_f == Ph_WM_HIDE) {
|
|
||||||
if (currently_hided) {
|
|
||||||
/* got unhide window event */
|
|
||||||
/* TODO: restore application's palette if in palette mode */
|
|
||||||
currently_hided = 0;
|
|
||||||
} else {
|
|
||||||
/* got hide window event */
|
|
||||||
/* TODO: restore original palette if in palette mode */
|
|
||||||
currently_hided = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* request to resize */
|
|
||||||
else if (winEvent->event_f == Ph_WM_RESIZE) {
|
|
||||||
currently_maximized = 0;
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
SDL_PrivateResize(winEvent->size.w + 1, winEvent->size.h + 1);
|
|
||||||
#else
|
|
||||||
/* QNX 6.3.0 have this bug fixed */
|
|
||||||
SDL_PrivateResize(winEvent->size.w, winEvent->size.h);
|
|
||||||
#endif /* _NTO_VERSION */
|
|
||||||
}
|
|
||||||
/* request to move */
|
|
||||||
else if (winEvent->event_f == Ph_WM_MOVE) {
|
|
||||||
if (current_overlay != NULL) {
|
|
||||||
int lockedstate = current_overlay->hwdata->locked;
|
|
||||||
int chromastate = current_overlay->hwdata->ischromakey;
|
|
||||||
int error;
|
|
||||||
SDL_Rect src, dst;
|
|
||||||
|
|
||||||
current_overlay->hwdata->locked = 1;
|
|
||||||
src.x = 0;
|
|
||||||
src.y = 0;
|
|
||||||
src.w = current_overlay->w;
|
|
||||||
src.y = current_overlay->h;
|
|
||||||
dst.x = current_overlay->hwdata->CurrentViewPort.pos.x;
|
|
||||||
dst.y = current_overlay->hwdata->CurrentViewPort.pos.y;
|
|
||||||
dst.w = current_overlay->hwdata->CurrentViewPort.size.w;
|
|
||||||
dst.h = current_overlay->hwdata->CurrentViewPort.size.h;
|
|
||||||
current_overlay->hwdata->ischromakey = 0;
|
|
||||||
error =
|
|
||||||
ph_DisplayYUVOverlay(this, current_overlay,
|
|
||||||
&src, &dst);
|
|
||||||
if (!error) {
|
|
||||||
current_overlay->hwdata->ischromakey = chromastate;
|
|
||||||
current_overlay->hwdata->locked = lockedstate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* maximize request */
|
|
||||||
else if (winEvent->event_f == Ph_WM_MAX) {
|
|
||||||
/* window already moved and resized here */
|
|
||||||
currently_maximized = 1;
|
|
||||||
}
|
|
||||||
/* restore request */
|
|
||||||
else if (winEvent->event_f == Ph_WM_RESTORE) {
|
|
||||||
/* window already moved and resized here */
|
|
||||||
currently_maximized = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* window has been resized, moved or removed */
|
|
||||||
case Ph_EV_EXPOSE:
|
|
||||||
{
|
|
||||||
if (phevent->num_rects != 0) {
|
|
||||||
int numrects;
|
|
||||||
|
|
||||||
if (SDL_VideoSurface) {
|
|
||||||
rect = PhGetRects(phevent);
|
|
||||||
if (phevent->num_rects > PH_SDL_MAX_RECTS) {
|
|
||||||
/* sorry, buffers underrun, we'll update only first PH_SDL_MAX_RECTS rects */
|
|
||||||
numrects = PH_SDL_MAX_RECTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < phevent->num_rects; i++) {
|
|
||||||
sdlrects[i].x = rect[i].ul.x;
|
|
||||||
sdlrects[i].y = rect[i].ul.y;
|
|
||||||
sdlrects[i].w = rect[i].lr.x - rect[i].ul.x + 1;
|
|
||||||
sdlrects[i].h = rect[i].lr.y - rect[i].ul.y + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->UpdateRects(this, phevent->num_rects, sdlrects);
|
|
||||||
|
|
||||||
if (current_overlay != NULL) {
|
|
||||||
int lockedstate = current_overlay->hwdata->locked;
|
|
||||||
int error;
|
|
||||||
SDL_Rect src, dst;
|
|
||||||
|
|
||||||
current_overlay->hwdata->locked = 1;
|
|
||||||
src.x = 0;
|
|
||||||
src.y = 0;
|
|
||||||
src.w = current_overlay->w;
|
|
||||||
src.y = current_overlay->h;
|
|
||||||
dst.x =
|
|
||||||
current_overlay->hwdata->CurrentViewPort.pos.x;
|
|
||||||
dst.y =
|
|
||||||
current_overlay->hwdata->CurrentViewPort.pos.y;
|
|
||||||
dst.w =
|
|
||||||
current_overlay->hwdata->CurrentViewPort.size.w;
|
|
||||||
dst.h =
|
|
||||||
current_overlay->hwdata->CurrentViewPort.size.h;
|
|
||||||
current_overlay->hwdata->forcedredraw = 1;
|
|
||||||
error =
|
|
||||||
ph_DisplayYUVOverlay(this,
|
|
||||||
current_overlay, &src, &dst);
|
|
||||||
if (!error) {
|
|
||||||
current_overlay->hwdata->forcedredraw = 0;
|
|
||||||
current_overlay->hwdata->locked = lockedstate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_KEY:
|
|
||||||
{
|
|
||||||
SDL_keysym keysym;
|
|
||||||
|
|
||||||
posted = 0;
|
|
||||||
|
|
||||||
keyEvent = PhGetData(phevent);
|
|
||||||
|
|
||||||
if (Pk_KF_Key_Down & keyEvent->key_flags) {
|
|
||||||
/* split the wheel events from real key events */
|
|
||||||
if ((keyEvent->key_cap == Pk_Up)
|
|
||||||
&& (keyEvent->key_scan == 0)
|
|
||||||
&& ((keyEvent->key_flags & Pk_KF_Scan_Valid) ==
|
|
||||||
Pk_KF_Scan_Valid)) {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseButton(SDL_PRESSED,
|
|
||||||
SDL_BUTTON_WHEELUP, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((keyEvent->key_cap == Pk_Down)
|
|
||||||
&& (keyEvent->key_scan == 0)
|
|
||||||
&& ((keyEvent->key_flags & Pk_KF_Scan_Valid) ==
|
|
||||||
Pk_KF_Scan_Valid)) {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseButton(SDL_PRESSED,
|
|
||||||
SDL_BUTTON_WHEELDOWN, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
posted =
|
|
||||||
SDL_PrivateKeyboard(SDL_PRESSED,
|
|
||||||
ph_TranslateKey(keyEvent, &keysym));
|
|
||||||
} else { /* must be key release */
|
|
||||||
|
|
||||||
/* split the wheel events from real key events */
|
|
||||||
if ((keyEvent->key_cap == Pk_Up)
|
|
||||||
&& (keyEvent->key_scan == 0)
|
|
||||||
&& ((keyEvent->key_flags & Pk_KF_Scan_Valid) ==
|
|
||||||
Pk_KF_Scan_Valid)) {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseButton(SDL_RELEASED,
|
|
||||||
SDL_BUTTON_WHEELUP, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ((keyEvent->key_cap == Pk_Down)
|
|
||||||
&& (keyEvent->key_scan == 0)
|
|
||||||
&& ((keyEvent->key_flags & Pk_KF_Scan_Valid) ==
|
|
||||||
Pk_KF_Scan_Valid)) {
|
|
||||||
posted =
|
|
||||||
SDL_PrivateMouseButton(SDL_RELEASED,
|
|
||||||
SDL_BUTTON_WHEELDOWN, 0, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
posted =
|
|
||||||
SDL_PrivateKeyboard(SDL_RELEASED,
|
|
||||||
ph_TranslateKey(keyEvent, &keysym));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Ph_EV_INFO:
|
|
||||||
{
|
|
||||||
if (phevent->subtype == Ph_OFFSCREEN_INVALID) {
|
|
||||||
unsigned long *EvInfoData;
|
|
||||||
|
|
||||||
EvInfoData = (unsigned long *) PhGetData(phevent);
|
|
||||||
|
|
||||||
switch (*EvInfoData) {
|
|
||||||
case Pg_VIDEO_MODE_SWITCHED:
|
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Pg_ENTERED_DIRECT:
|
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Pg_EXITED_DIRECT:
|
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Pg_DRIVER_STARTED:
|
|
||||||
{
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (posted);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* perform a blocking read if no events available */
|
|
||||||
int
|
|
||||||
ph_Pending(_THIS)
|
|
||||||
{
|
|
||||||
/* Flush the display connection and look to see if events are queued */
|
|
||||||
PgFlush();
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
switch (PhEventPeek(phevent, EVENT_SIZE)) {
|
|
||||||
case Ph_EVENT_MSG:
|
|
||||||
return 1;
|
|
||||||
case -1:
|
|
||||||
SDL_SetError("ph_Pending(): PhEventNext failed.\n");
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Oh well, nothing is ready .. */
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_PumpEvents(_THIS)
|
|
||||||
{
|
|
||||||
/* Flush the display connection and look to see if events are queued */
|
|
||||||
PgFlush();
|
|
||||||
|
|
||||||
while (ph_Pending(this)) {
|
|
||||||
PtEventHandler(phevent);
|
|
||||||
ph_DispatchEvent(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_InitKeymap(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Odd keys used in international keyboards */
|
|
||||||
for (i = 0; i < SDL_arraysize(ODD_keymap); ++i) {
|
|
||||||
ODD_keymap[i] = SDLK_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map the miscellaneous keys */
|
|
||||||
for (i = 0; i < SDL_arraysize(MISC_keymap); ++i) {
|
|
||||||
MISC_keymap[i] = SDLK_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
MISC_keymap[Pk_BackSpace & 0xFF] = SDLK_BACKSPACE;
|
|
||||||
MISC_keymap[Pk_Tab & 0xFF] = SDLK_TAB;
|
|
||||||
MISC_keymap[Pk_Clear & 0xFF] = SDLK_CLEAR;
|
|
||||||
MISC_keymap[Pk_Return & 0xFF] = SDLK_RETURN;
|
|
||||||
MISC_keymap[Pk_Pause & 0xFF] = SDLK_PAUSE;
|
|
||||||
MISC_keymap[Pk_Escape & 0xFF] = SDLK_ESCAPE;
|
|
||||||
MISC_keymap[Pk_Delete & 0xFF] = SDLK_DELETE;
|
|
||||||
|
|
||||||
MISC_keymap[Pk_KP_0 & 0xFF] = SDLK_KP0;
|
|
||||||
MISC_keymap[Pk_KP_1 & 0xFF] = SDLK_KP1;
|
|
||||||
MISC_keymap[Pk_KP_2 & 0xFF] = SDLK_KP2;
|
|
||||||
MISC_keymap[Pk_KP_3 & 0xFF] = SDLK_KP3;
|
|
||||||
MISC_keymap[Pk_KP_4 & 0xFF] = SDLK_KP4;
|
|
||||||
MISC_keymap[Pk_KP_5 & 0xFF] = SDLK_KP5;
|
|
||||||
MISC_keymap[Pk_KP_6 & 0xFF] = SDLK_KP6;
|
|
||||||
MISC_keymap[Pk_KP_7 & 0xFF] = SDLK_KP7;
|
|
||||||
MISC_keymap[Pk_KP_8 & 0xFF] = SDLK_KP8;
|
|
||||||
MISC_keymap[Pk_KP_9 & 0xFF] = SDLK_KP9;
|
|
||||||
|
|
||||||
MISC_keymap[Pk_KP_Decimal & 0xFF] = SDLK_KP_PERIOD;
|
|
||||||
MISC_keymap[Pk_KP_Divide & 0xFF] = SDLK_KP_DIVIDE;
|
|
||||||
MISC_keymap[Pk_KP_Multiply & 0xFF] = SDLK_KP_MULTIPLY;
|
|
||||||
MISC_keymap[Pk_KP_Subtract & 0xFF] = SDLK_KP_MINUS;
|
|
||||||
MISC_keymap[Pk_KP_Add & 0xFF] = SDLK_KP_PLUS;
|
|
||||||
MISC_keymap[Pk_KP_Enter & 0xFF] = SDLK_KP_ENTER;
|
|
||||||
MISC_keymap[Pk_KP_Equal & 0xFF] = SDLK_KP_EQUALS;
|
|
||||||
|
|
||||||
MISC_keymap[Pk_Up & 0xFF] = SDLK_UP;
|
|
||||||
MISC_keymap[Pk_Down & 0xFF] = SDLK_DOWN;
|
|
||||||
MISC_keymap[Pk_Right & 0xFF] = SDLK_RIGHT;
|
|
||||||
MISC_keymap[Pk_Left & 0xFF] = SDLK_LEFT;
|
|
||||||
MISC_keymap[Pk_Insert & 0xFF] = SDLK_INSERT;
|
|
||||||
MISC_keymap[Pk_Home & 0xFF] = SDLK_HOME;
|
|
||||||
MISC_keymap[Pk_End & 0xFF] = SDLK_END;
|
|
||||||
MISC_keymap[Pk_Pg_Up & 0xFF] = SDLK_PAGEUP;
|
|
||||||
MISC_keymap[Pk_Pg_Down & 0xFF] = SDLK_PAGEDOWN;
|
|
||||||
|
|
||||||
MISC_keymap[Pk_F1 & 0xFF] = SDLK_F1;
|
|
||||||
MISC_keymap[Pk_F2 & 0xFF] = SDLK_F2;
|
|
||||||
MISC_keymap[Pk_F3 & 0xFF] = SDLK_F3;
|
|
||||||
MISC_keymap[Pk_F4 & 0xFF] = SDLK_F4;
|
|
||||||
MISC_keymap[Pk_F5 & 0xFF] = SDLK_F5;
|
|
||||||
MISC_keymap[Pk_F6 & 0xFF] = SDLK_F6;
|
|
||||||
MISC_keymap[Pk_F7 & 0xFF] = SDLK_F7;
|
|
||||||
MISC_keymap[Pk_F8 & 0xFF] = SDLK_F8;
|
|
||||||
MISC_keymap[Pk_F9 & 0xFF] = SDLK_F9;
|
|
||||||
MISC_keymap[Pk_F10 & 0xFF] = SDLK_F10;
|
|
||||||
MISC_keymap[Pk_F11 & 0xFF] = SDLK_F11;
|
|
||||||
MISC_keymap[Pk_F12 & 0xFF] = SDLK_F12;
|
|
||||||
MISC_keymap[Pk_F13 & 0xFF] = SDLK_F13;
|
|
||||||
MISC_keymap[Pk_F14 & 0xFF] = SDLK_F14;
|
|
||||||
MISC_keymap[Pk_F15 & 0xFF] = SDLK_F15;
|
|
||||||
|
|
||||||
MISC_keymap[Pk_Num_Lock & 0xFF] = SDLK_NUMLOCK;
|
|
||||||
MISC_keymap[Pk_Caps_Lock & 0xFF] = SDLK_CAPSLOCK;
|
|
||||||
MISC_keymap[Pk_Scroll_Lock & 0xFF] = SDLK_SCROLLOCK;
|
|
||||||
MISC_keymap[Pk_Shift_R & 0xFF] = SDLK_RSHIFT;
|
|
||||||
MISC_keymap[Pk_Shift_L & 0xFF] = SDLK_LSHIFT;
|
|
||||||
MISC_keymap[Pk_Control_R & 0xFF] = SDLK_RCTRL;
|
|
||||||
MISC_keymap[Pk_Control_L & 0xFF] = SDLK_LCTRL;
|
|
||||||
MISC_keymap[Pk_Alt_R & 0xFF] = SDLK_RALT;
|
|
||||||
MISC_keymap[Pk_Alt_L & 0xFF] = SDLK_LALT;
|
|
||||||
MISC_keymap[Pk_Meta_R & 0xFF] = SDLK_RMETA;
|
|
||||||
MISC_keymap[Pk_Meta_L & 0xFF] = SDLK_LMETA;
|
|
||||||
MISC_keymap[Pk_Super_L & 0xFF] = SDLK_LSUPER;
|
|
||||||
MISC_keymap[Pk_Super_R & 0xFF] = SDLK_RSUPER;
|
|
||||||
MISC_keymap[Pk_Mode_switch & 0xFF] = SDLK_MODE; /* "Alt Gr" key */
|
|
||||||
|
|
||||||
MISC_keymap[Pk_Help & 0xFF] = SDLK_HELP;
|
|
||||||
MISC_keymap[Pk_Print & 0xFF] = SDLK_PRINT;
|
|
||||||
MISC_keymap[Pk_Break & 0xFF] = SDLK_BREAK;
|
|
||||||
MISC_keymap[Pk_Menu & 0xFF] = SDLK_MENU; /* Windows "Menu" key */
|
|
||||||
|
|
||||||
MISC_keymap[Pk_Hyper_R & 0xFF] = SDLK_RSUPER; /* Right "Windows" */
|
|
||||||
|
|
||||||
/* Left "Windows" key, but it can't be catched by application */
|
|
||||||
MISC_keymap[Pk_Hyper_L & 0xFF] = SDLK_LSUPER;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned long cap;
|
|
||||||
|
|
||||||
SDL_keysym *
|
|
||||||
ph_TranslateKey(PhKeyEvent_t * key, SDL_keysym * keysym)
|
|
||||||
{
|
|
||||||
/* 'sym' is set to the value of the key with modifiers applied to it.
|
|
||||||
This member is valid only if Pk_KF_Sym_Valid is set in the key_flags.
|
|
||||||
We will assume it is valid. */
|
|
||||||
|
|
||||||
/* FIXME: This needs to check whether the cap & scancode is valid */
|
|
||||||
|
|
||||||
cap = key->key_cap;
|
|
||||||
|
|
||||||
switch (cap >> 8) {
|
|
||||||
case 0x00: /* Latin 1 */
|
|
||||||
case 0x01: /* Latin 2 */
|
|
||||||
case 0x02: /* Latin 3 */
|
|
||||||
case 0x03: /* Latin 4 */
|
|
||||||
case 0x04: /* Katakana */
|
|
||||||
case 0x05: /* Arabic */
|
|
||||||
case 0x06: /* Cyrillic */
|
|
||||||
case 0x07: /* Greek */
|
|
||||||
case 0x08: /* Technical */
|
|
||||||
case 0x0A: /* Publishing */
|
|
||||||
case 0x0C: /* Hebrew */
|
|
||||||
case 0x0D: /* Thai */
|
|
||||||
keysym->sym = (SDLKey) (cap & 0xFF);
|
|
||||||
/* Map capital letter syms to lowercase */
|
|
||||||
if ((keysym->sym >= 'A') && (keysym->sym <= 'Z'))
|
|
||||||
keysym->sym += ('a' - 'A');
|
|
||||||
break;
|
|
||||||
case 0xF0:
|
|
||||||
keysym->sym = MISC_keymap[cap & 0xFF];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
keysym->sym = SDLK_UNKNOWN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
keysym->scancode = key->key_scan;
|
|
||||||
keysym->unicode = 0;
|
|
||||||
|
|
||||||
if (SDL_TranslateUNICODE) {
|
|
||||||
char utf8[MB_CUR_MAX];
|
|
||||||
int utf8len;
|
|
||||||
wchar_t unicode;
|
|
||||||
|
|
||||||
switch (keysym->scancode) {
|
|
||||||
/* Esc key */
|
|
||||||
case 0x01:
|
|
||||||
keysym->unicode = 27;
|
|
||||||
break;
|
|
||||||
/* BackSpace key */
|
|
||||||
case 0x0E:
|
|
||||||
keysym->unicode = 127;
|
|
||||||
break;
|
|
||||||
/* Enter key */
|
|
||||||
case 0x1C:
|
|
||||||
keysym->unicode = 10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
utf8len = PhKeyToMb(utf8, key);
|
|
||||||
if (utf8len > 0) {
|
|
||||||
utf8len = mbtowc(&unicode, utf8, utf8len);
|
|
||||||
if (utf8len > 0) {
|
|
||||||
keysym->unicode = unicode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return (keysym);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_InitOSKeymap(_THIS)
|
|
||||||
{
|
|
||||||
ph_InitKeymap();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,408 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include "SDL_ph_gl.h"
|
|
||||||
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
|
|
||||||
#if (_NTO_VERSION >= 630)
|
|
||||||
/* PhotonGL functions */
|
|
||||||
GLPH_DECLARE_FUNCS;
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
void
|
|
||||||
ph_GL_SwapBuffers(_THIS)
|
|
||||||
{
|
|
||||||
PgSetRegion(PtWidgetRid(window));
|
|
||||||
PdOpenGLContextSwapBuffers(oglctx);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void
|
|
||||||
ph_GL_SwapBuffers(_THIS)
|
|
||||||
{
|
|
||||||
qnxgl_swap_buffers(oglbuffers);
|
|
||||||
}
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value)
|
|
||||||
{
|
|
||||||
switch (attrib) {
|
|
||||||
case SDL_GL_DOUBLEBUFFER:
|
|
||||||
*value = this->gl_config.double_buffer;
|
|
||||||
break;
|
|
||||||
case SDL_GL_STENCIL_SIZE:
|
|
||||||
*value = this->gl_config.stencil_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_DEPTH_SIZE:
|
|
||||||
*value = this->gl_config.depth_size;
|
|
||||||
break;
|
|
||||||
#if (_NTO_VERSION >= 630)
|
|
||||||
case SDL_GL_RED_SIZE:
|
|
||||||
*value = this->gl_config.red_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_GREEN_SIZE:
|
|
||||||
*value = this->gl_config.green_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_BLUE_SIZE:
|
|
||||||
*value = this->gl_config.blue_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_ALPHA_SIZE:
|
|
||||||
*value = this->gl_config.alpha_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_ACCUM_RED_SIZE:
|
|
||||||
*value = this->gl_config.accum_red_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_ACCUM_GREEN_SIZE:
|
|
||||||
*value = this->gl_config.accum_green_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_ACCUM_BLUE_SIZE:
|
|
||||||
*value = this->gl_config.accum_blue_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_ACCUM_ALPHA_SIZE:
|
|
||||||
*value = this->gl_config.accum_alpha_size;
|
|
||||||
break;
|
|
||||||
case SDL_GL_STEREO:
|
|
||||||
*value = this->gl_config.stereo;
|
|
||||||
break;
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
default:
|
|
||||||
*value = 0;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
int
|
|
||||||
ph_GL_LoadLibrary(_THIS, const char *path)
|
|
||||||
{
|
|
||||||
/* if code compiled with SDL_VIDEO_OPENGL, that mean that library already linked */
|
|
||||||
this->gl_config.driver_loaded = 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int
|
|
||||||
ph_GL_LoadLibrary(_THIS, const char *path)
|
|
||||||
{
|
|
||||||
void *handle;
|
|
||||||
int dlopen_flags = RTLD_WORLD | RTLD_GROUP;
|
|
||||||
|
|
||||||
if (this->gl_config.dll_handle != NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle = dlopen(path, dlopen_flags);
|
|
||||||
|
|
||||||
if (handle == NULL) {
|
|
||||||
SDL_SetError("ph_GL_LoadLibrary(): Could not load OpenGL library");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->gl_config.dll_handle = handle;
|
|
||||||
this->gl_config.driver_loaded = 1;
|
|
||||||
|
|
||||||
SDL_strlcpy(this->gl_config.driver_path, path,
|
|
||||||
SDL_arraysize(this->gl_config.driver_path));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
void *
|
|
||||||
ph_GL_GetProcAddress(_THIS, const char *proc)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void *
|
|
||||||
ph_GL_GetProcAddress(_THIS, const char *proc)
|
|
||||||
{
|
|
||||||
void *function;
|
|
||||||
|
|
||||||
if (this->gl_config.dll_handle == NULL) {
|
|
||||||
ph_GL_LoadLibrary(this, DEFAULT_OPENGL);
|
|
||||||
if (this->gl_config.dll_handle == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function = qnxgl_get_func(proc, oglctx, 0);
|
|
||||||
if (function == NULL) {
|
|
||||||
function = dlsym(this->gl_config.dll_handle, proc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return function;
|
|
||||||
}
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
int
|
|
||||||
ph_GL_MakeCurrent(_THIS)
|
|
||||||
{
|
|
||||||
PgSetRegion(PtWidgetRid(window));
|
|
||||||
|
|
||||||
if (oglctx != NULL) {
|
|
||||||
PhDCSetCurrent(oglctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int
|
|
||||||
ph_GL_MakeCurrent(_THIS)
|
|
||||||
{
|
|
||||||
PgSetRegion(PtWidgetRid(window));
|
|
||||||
|
|
||||||
if (oglctx != NULL) {
|
|
||||||
if (qnxgl_set_current(oglctx) == -1) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
|
|
||||||
/* This code is actual for the Photon3D Runtime which was available prior to 6.3 only */
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
|
|
||||||
{
|
|
||||||
PhDim_t dim;
|
|
||||||
uint64_t OGLAttrib[PH_OGL_MAX_ATTRIBS];
|
|
||||||
int exposepost = 0;
|
|
||||||
int OGLargc;
|
|
||||||
|
|
||||||
dim.w = width;
|
|
||||||
dim.h = height;
|
|
||||||
|
|
||||||
if ((oglctx != NULL) && (oglflags == flags) && (oglbpp == bpp)) {
|
|
||||||
PdOpenGLContextResize(oglctx, &dim);
|
|
||||||
PhDCSetCurrent(oglctx);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
if (oglctx != NULL) {
|
|
||||||
PhDCSetCurrent(NULL);
|
|
||||||
PhDCRelease(oglctx);
|
|
||||||
oglctx = NULL;
|
|
||||||
exposepost = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OGLargc = 0;
|
|
||||||
if (this->gl_config.depth_size) {
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_DEPTH_BITS;
|
|
||||||
OGLAttrib[OGLargc++] = this->gl_config.depth_size;
|
|
||||||
}
|
|
||||||
if (this->gl_config.stencil_size) {
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_STENCIL_BITS;
|
|
||||||
OGLAttrib[OGLargc++] = this->gl_config.stencil_size;
|
|
||||||
}
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FORCE_SW;
|
|
||||||
if (flags & SDL_FULLSCREEN) {
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FULLSCREEN;
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_DIRECT;
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FULLSCREEN_BEST;
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_FULLSCREEN_CENTER;
|
|
||||||
}
|
|
||||||
OGLAttrib[OGLargc++] = PHOGL_ATTRIB_NONE;
|
|
||||||
|
|
||||||
if (this->gl_config.double_buffer) {
|
|
||||||
oglctx = PdCreateOpenGLContext(2, &dim, 0, OGLAttrib);
|
|
||||||
} else {
|
|
||||||
oglctx = PdCreateOpenGLContext(1, &dim, 0, OGLAttrib);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oglctx == NULL) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): cannot create OpenGL context !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PhDCSetCurrent(oglctx);
|
|
||||||
|
|
||||||
PtFlush();
|
|
||||||
|
|
||||||
oglflags = flags;
|
|
||||||
oglbpp = bpp;
|
|
||||||
|
|
||||||
if (exposepost != 0) {
|
|
||||||
/* OpenGL context has been recreated, so report about this fact */
|
|
||||||
SDL_PrivateExpose();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* _NTO_VERSION */
|
|
||||||
|
|
||||||
/* This code is actual for the built-in PhGL support, which became available since 6.3 */
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_SetupOpenGLContext(_THIS, int width, int height, int bpp, Uint32 flags)
|
|
||||||
{
|
|
||||||
qnxgl_buf_attrib_t qnxgl_attribs[PH_OGL_MAX_ATTRIBS];
|
|
||||||
qnxgl_buf_attrib_t *qnxgl_attribs_slide;
|
|
||||||
int num_interfaces = 0;
|
|
||||||
int num_buffers = 0;
|
|
||||||
|
|
||||||
/* Initialize the OpenGL subsystem */
|
|
||||||
|
|
||||||
num_interfaces = qnxgl_init(NULL, NULL, 0);
|
|
||||||
|
|
||||||
if (num_interfaces < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): cannot initialize OpenGL subsystem !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (num_interfaces == 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): there are no available OpenGL renderers was found !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Driver is linked */
|
|
||||||
this->gl_config.driver_loaded = 1;
|
|
||||||
|
|
||||||
/* Initialize the OpenGL context attributes */
|
|
||||||
qnxgl_attribs_slide = qnxgl_attribs;
|
|
||||||
|
|
||||||
/* Depth size */
|
|
||||||
if (this->gl_config.depth_size) {
|
|
||||||
fprintf(stderr, "setted depth size %d\n", this->gl_config.depth_size);
|
|
||||||
qnxgl_attribs_slide =
|
|
||||||
qnxgl_attrib_set_depth(qnxgl_attribs_slide,
|
|
||||||
this->gl_config.depth_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stencil size */
|
|
||||||
if (this->gl_config.stencil_size) {
|
|
||||||
qnxgl_attribs_slide =
|
|
||||||
qnxgl_attrib_set_stencil(qnxgl_attribs_slide,
|
|
||||||
this->gl_config.stencil_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The sum of the accum bits of each channel */
|
|
||||||
if ((this->gl_config.accum_red_size != 0)
|
|
||||||
&& (this->gl_config.accum_blue_size != 0)
|
|
||||||
&& (this->gl_config.accum_green_size != 0)) {
|
|
||||||
qnxgl_attribs_slide = qnxgl_attrib_set_accum(qnxgl_attribs_slide,
|
|
||||||
this->
|
|
||||||
gl_config.accum_red_size
|
|
||||||
+
|
|
||||||
this->
|
|
||||||
gl_config.accum_blue_size
|
|
||||||
+
|
|
||||||
this->
|
|
||||||
gl_config.
|
|
||||||
accum_green_size +
|
|
||||||
this->gl_config.
|
|
||||||
accum_alpha_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stereo mode */
|
|
||||||
if (this->gl_config.stereo) {
|
|
||||||
qnxgl_attribs_slide = qnxgl_attrib_set_stereo(qnxgl_attribs_slide);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fullscreen mode */
|
|
||||||
if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) {
|
|
||||||
qnxgl_attribs_slide =
|
|
||||||
qnxgl_attrib_set_hint_fullscreen(qnxgl_attribs_slide);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Double buffering mode */
|
|
||||||
if (this->gl_config.double_buffer) {
|
|
||||||
num_buffers = 2;
|
|
||||||
} else {
|
|
||||||
num_buffers = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Loading the function pointers so we can use the extensions */
|
|
||||||
GLPH_LOAD_FUNCS_GC(oglctx);
|
|
||||||
|
|
||||||
/* Set the buffers region to be that of our window's region */
|
|
||||||
qnxgl_attribs_slide =
|
|
||||||
glph_attrib_set_region(qnxgl_attribs_slide, PtWidgetRid(window));
|
|
||||||
|
|
||||||
/* End of the attributes array */
|
|
||||||
qnxgl_attribs_slide = qnxgl_attrib_set_end(qnxgl_attribs_slide);
|
|
||||||
|
|
||||||
/* Create the buffers with the specified color model */
|
|
||||||
fprintf(stderr, "ARGB: %d, %d, %d, %d\n", this->gl_config.alpha_size,
|
|
||||||
this->gl_config.red_size, this->gl_config.green_size,
|
|
||||||
this->gl_config.blue_size);
|
|
||||||
oglbuffers = qnxgl_buffers_create(QNXGL_FORMAT_BEST_RGB,
|
|
||||||
/* __QNXGL_BUILD_FORMAT(0, __QNXGL_COLOR_MODEL_RGB, this->gl_config.alpha_size,
|
|
||||||
this->gl_config.red_size, this->gl_config.green_size, this->gl_config.blue_size), */
|
|
||||||
num_buffers, width, height,
|
|
||||||
qnxgl_attribs, -1);
|
|
||||||
|
|
||||||
|
|
||||||
if (oglbuffers == NULL) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): failed to create OpenGL buffers !\n");
|
|
||||||
qnxgl_finish();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a QNXGL context for the previously created buffer */
|
|
||||||
oglctx = qnxgl_context_create(oglbuffers, NULL);
|
|
||||||
|
|
||||||
if (oglctx == NULL) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): failed to create OpenGL context !\n");
|
|
||||||
qnxgl_buffers_destroy(oglbuffers);
|
|
||||||
qnxgl_finish();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Attempt to make the context current so we can use OpenGL commands */
|
|
||||||
if (qnxgl_set_current(oglctx) == -1) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetupOpenGLContext(): failed to make the OpenGL context current !\n");
|
|
||||||
qnxgl_context_destroy(oglctx);
|
|
||||||
qnxgl_buffers_destroy(oglbuffers);
|
|
||||||
qnxgl_finish();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PtFlush();
|
|
||||||
|
|
||||||
oglflags = flags;
|
|
||||||
oglbpp = bpp;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _NTO_VERSION */
|
|
||||||
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_GL_H__
|
|
||||||
#define __SDL_PH_GL_H__
|
|
||||||
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
#define DEFAULT_OPENGL "/usr/lib/libGL.so"
|
|
||||||
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
void ph_GL_SwapBuffers(_THIS);
|
|
||||||
int ph_GL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
|
|
||||||
int ph_GL_LoadLibrary(_THIS, const char *path);
|
|
||||||
void *ph_GL_GetProcAddress(_THIS, const char *proc);
|
|
||||||
int ph_GL_MakeCurrent(_THIS);
|
|
||||||
|
|
||||||
int ph_SetupOpenGLContext(_THIS, int width, int height, int bpp,
|
|
||||||
Uint32 flags);
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_GL_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_IMAGE_H__
|
|
||||||
#define __SDL_PH_IMAGE_H__
|
|
||||||
|
|
||||||
#include "../../events/SDL_events_c.h"
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
struct private_hwdata
|
|
||||||
{
|
|
||||||
PdOffscreenContext_t *offscreenctx;
|
|
||||||
PdOSCCreateLockParams_t crlockparam;
|
|
||||||
PdOSCLockParams_t lockparam;
|
|
||||||
Uint32 colorkey;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int ph_SetupImage(_THIS, SDL_Surface * screen);
|
|
||||||
extern void ph_DestroyImage(_THIS, SDL_Surface * screen);
|
|
||||||
extern int ph_SetupUpdateFunction(_THIS, SDL_Surface * screen, Uint32 flags);
|
|
||||||
|
|
||||||
extern int ph_AllocHWSurface(_THIS, SDL_Surface * surface);
|
|
||||||
extern void ph_FreeHWSurface(_THIS, SDL_Surface * surface);
|
|
||||||
extern int ph_CheckHWBlit(_THIS, SDL_Surface * src, SDL_Surface * dst);
|
|
||||||
extern int ph_FillHWRect(_THIS, SDL_Surface * surface, SDL_Rect * rect,
|
|
||||||
Uint32 color);
|
|
||||||
extern int ph_LockHWSurface(_THIS, SDL_Surface * surface);
|
|
||||||
extern void ph_UnlockHWSurface(_THIS, SDL_Surface * surface);
|
|
||||||
extern int ph_FlipHWSurface(_THIS, SDL_Surface * surface);
|
|
||||||
extern int ph_SetHWColorKey(_THIS, SDL_Surface * surface, Uint32 key);
|
|
||||||
extern int ph_SetHWAlpha(_THIS, SDL_Surface * surface, Uint8 alpha);
|
|
||||||
extern int ph_HWAccelBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
|
||||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
|
||||||
extern int ph_UpdateHWInfo(_THIS);
|
|
||||||
|
|
||||||
extern void ph_NormalUpdate(_THIS, int numrects, SDL_Rect * rects);
|
|
||||||
extern void ph_OCUpdate(_THIS, int numrects, SDL_Rect * rects);
|
|
||||||
extern void ph_OCDCUpdate(_THIS, int numrects, SDL_Rect * rects);
|
|
||||||
extern void ph_OpenGLUpdate(_THIS, int numrects, SDL_Rect * rects);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_IMAGE_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,357 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#include "SDL_ph_modes_c.h"
|
|
||||||
|
|
||||||
static PgVideoModeInfo_t mode_info;
|
|
||||||
static PgVideoModes_t mode_list;
|
|
||||||
|
|
||||||
/* The current list of available video modes */
|
|
||||||
SDL_Rect SDL_modelist[PH_MAX_VIDEOMODES];
|
|
||||||
SDL_Rect *SDL_modearray[PH_MAX_VIDEOMODES];
|
|
||||||
|
|
||||||
static int
|
|
||||||
compare_modes_by_res(const void *mode1, const void *mode2)
|
|
||||||
{
|
|
||||||
PgVideoModeInfo_t mode1_info;
|
|
||||||
PgVideoModeInfo_t mode2_info;
|
|
||||||
|
|
||||||
if (PgGetVideoModeInfo(*(unsigned short *) mode1, &mode1_info) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PgGetVideoModeInfo(*(unsigned short *) mode2, &mode2_info) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode1_info.width == mode2_info.width) {
|
|
||||||
return mode2_info.height - mode1_info.height;
|
|
||||||
} else {
|
|
||||||
return mode2_info.width - mode1_info.width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Rect **
|
|
||||||
ph_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
int j = 0;
|
|
||||||
SDL_Rect Amodelist[PH_MAX_VIDEOMODES];
|
|
||||||
|
|
||||||
for (i = 0; i < PH_MAX_VIDEOMODES; i++) {
|
|
||||||
SDL_modearray[i] = &SDL_modelist[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PgGetVideoModeList(&mode_list) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_ListModes(): PgGetVideoModeList() function failed !\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mode_info.bits_per_pixel = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < mode_list.num_modes; i++) {
|
|
||||||
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_ListModes(): PgGetVideoModeInfo() function failed on mode: 0x%X.\n",
|
|
||||||
mode_list.modes[i]);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (mode_info.bits_per_pixel == format->BitsPerPixel) {
|
|
||||||
Amodelist[j].w = mode_info.width;
|
|
||||||
Amodelist[j].h = mode_info.height;
|
|
||||||
Amodelist[j].x = 0;
|
|
||||||
Amodelist[j].y = 0;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* reorder biggest for smallest, assume width dominates */
|
|
||||||
|
|
||||||
for (i = 0; i < j; i++) {
|
|
||||||
SDL_modelist[i].w = Amodelist[j - i - 1].w;
|
|
||||||
SDL_modelist[i].h = Amodelist[j - i - 1].h;
|
|
||||||
SDL_modelist[i].x = Amodelist[j - i - 1].x;
|
|
||||||
SDL_modelist[i].y = Amodelist[j - i - 1].y;
|
|
||||||
}
|
|
||||||
SDL_modearray[j] = NULL;
|
|
||||||
|
|
||||||
return SDL_modearray;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_FreeVideoModes(_THIS)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return the mode associated with width, height and bpp */
|
|
||||||
/* if there is no mode then zero is returned */
|
|
||||||
int
|
|
||||||
ph_GetVideoMode(int width, int height, int bpp)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int modestage = 0;
|
|
||||||
int closestmode = 0;
|
|
||||||
|
|
||||||
if (PgGetVideoModeList(&mode_list) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* special case for the double-sized 320x200 mode */
|
|
||||||
if ((width == 640) && (height == 400)) {
|
|
||||||
modestage = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search list for exact match */
|
|
||||||
for (i = 0; i < mode_list.num_modes; i++) {
|
|
||||||
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((mode_info.width == width) && (mode_info.height == height) &&
|
|
||||||
(mode_info.bits_per_pixel == bpp)) {
|
|
||||||
return mode_list.modes[i];
|
|
||||||
} else {
|
|
||||||
if ((modestage) && (mode_info.width == width)
|
|
||||||
&& (mode_info.height == height + 80)
|
|
||||||
&& (mode_info.bits_per_pixel == bpp)) {
|
|
||||||
modestage = 2;
|
|
||||||
closestmode = mode_list.modes[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we are here, then no 640x400xbpp mode found and we'll emulate it via 640x480xbpp mode */
|
|
||||||
if (modestage == 2) {
|
|
||||||
return closestmode;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (i == mode_list.num_modes) ? 0 : mode_list.modes[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return the mode associated with width, height and bpp */
|
|
||||||
/* if requested bpp is not found the mode with closest bpp is returned */
|
|
||||||
int
|
|
||||||
get_mode_any_format(int width, int height, int bpp)
|
|
||||||
{
|
|
||||||
int i, closest, delta, min_delta;
|
|
||||||
|
|
||||||
if (PgGetVideoModeList(&mode_list) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_qsort(mode_list.modes, mode_list.num_modes, sizeof(unsigned short),
|
|
||||||
compare_modes_by_res);
|
|
||||||
|
|
||||||
for (i = 0; i < mode_list.num_modes; i++) {
|
|
||||||
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if ((mode_info.width == width) && (mode_info.height == height)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i < mode_list.num_modes) {
|
|
||||||
/* get closest bpp */
|
|
||||||
closest = i++;
|
|
||||||
if (mode_info.bits_per_pixel == bpp) {
|
|
||||||
return mode_list.modes[closest];
|
|
||||||
}
|
|
||||||
|
|
||||||
min_delta = abs(mode_info.bits_per_pixel - bpp);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((mode_info.width != width)
|
|
||||||
|| (mode_info.height != height)) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if (mode_info.bits_per_pixel == bpp) {
|
|
||||||
closest = i;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
delta = abs(mode_info.bits_per_pixel - bpp);
|
|
||||||
if (delta < min_delta) {
|
|
||||||
closest = i;
|
|
||||||
min_delta = delta;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mode_list.modes[closest];
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_ToggleFullScreen(_THIS, int on)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_EnterFullScreen(_THIS, SDL_Surface * screen, int fmode)
|
|
||||||
{
|
|
||||||
PgDisplaySettings_t settings;
|
|
||||||
int mode;
|
|
||||||
char *refreshrate;
|
|
||||||
int refreshratenum;
|
|
||||||
|
|
||||||
if (!currently_fullscreen) {
|
|
||||||
/* Get the video mode and set it */
|
|
||||||
if (screen->flags & SDL_ANYFORMAT) {
|
|
||||||
if ((mode =
|
|
||||||
get_mode_any_format(screen->w, screen->h,
|
|
||||||
screen->format->BitsPerPixel)) == 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_EnterFullScreen(): can't find appropriate video mode !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((mode =
|
|
||||||
ph_GetVideoMode(screen->w, screen->h,
|
|
||||||
screen->format->BitsPerPixel)) == 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_EnterFullScreen(): can't find appropriate video mode !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (PgGetVideoModeInfo(mode, &mode_info) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_EnterFullScreen(): can't get video mode capabilities !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (mode_info.height != screen->h) {
|
|
||||||
if ((mode_info.height == 480) && (screen->h == 400)) {
|
|
||||||
videomode_emulatemode = 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
videomode_emulatemode = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* save old video mode caps */
|
|
||||||
PgGetVideoMode(&settings);
|
|
||||||
old_video_mode = settings.mode;
|
|
||||||
old_refresh_rate = settings.refresh;
|
|
||||||
|
|
||||||
/* setup new video mode */
|
|
||||||
settings.mode = mode;
|
|
||||||
settings.refresh = 0;
|
|
||||||
settings.flags = 0;
|
|
||||||
|
|
||||||
refreshrate = SDL_getenv("SDL_PHOTON_FULLSCREEN_REFRESH");
|
|
||||||
if (refreshrate != NULL) {
|
|
||||||
if (SDL_sscanf(refreshrate, "%d", &refreshratenum) == 1) {
|
|
||||||
settings.refresh = refreshratenum;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PgSetVideoMode(&settings) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_EnterFullScreen(): PgSetVideoMode() call failed !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->screen) {
|
|
||||||
if (this->screen->flags & SDL_INTERNALOPENGL) {
|
|
||||||
#if !SDL_VIDEO_OPENGL || (_NTO_VERSION < 630)
|
|
||||||
return 0; /* 6.3.0 */
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fmode == 0) {
|
|
||||||
if (OCImage.direct_context == NULL) {
|
|
||||||
OCImage.direct_context =
|
|
||||||
(PdDirectContext_t *) PdCreateDirectContext();
|
|
||||||
if (!OCImage.direct_context) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_EnterFullScreen(): Can't create direct context !\n");
|
|
||||||
ph_LeaveFullScreen(this);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
OCImage.oldDC = PdDirectStart(OCImage.direct_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
currently_fullscreen = 1;
|
|
||||||
}
|
|
||||||
PgFlush();
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_LeaveFullScreen(_THIS)
|
|
||||||
{
|
|
||||||
PgDisplaySettings_t oldmode_settings;
|
|
||||||
|
|
||||||
if (currently_fullscreen) {
|
|
||||||
if ((this->screen) && (this->screen->flags & SDL_INTERNALOPENGL)) {
|
|
||||||
#if !SDL_VIDEO_OPENGL || (_NTO_VERSION < 630)
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* release routines starts here */
|
|
||||||
{
|
|
||||||
if (OCImage.direct_context) {
|
|
||||||
PdDirectStop(OCImage.direct_context);
|
|
||||||
PdReleaseDirectContext(OCImage.direct_context);
|
|
||||||
OCImage.direct_context = NULL;
|
|
||||||
}
|
|
||||||
if (OCImage.oldDC) {
|
|
||||||
PhDCSetCurrent(OCImage.oldDC);
|
|
||||||
OCImage.oldDC = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
currently_fullscreen = 0;
|
|
||||||
|
|
||||||
/* Restore old video mode */
|
|
||||||
if (old_video_mode != -1) {
|
|
||||||
oldmode_settings.mode = (unsigned short) old_video_mode;
|
|
||||||
oldmode_settings.refresh = (unsigned short) old_refresh_rate;
|
|
||||||
oldmode_settings.flags = 0;
|
|
||||||
|
|
||||||
if (PgSetVideoMode(&oldmode_settings) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("Ph_LeaveFullScreen(): PgSetVideoMode() function failed !\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
old_video_mode = -1;
|
|
||||||
old_refresh_rate = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_MODES_H__
|
|
||||||
#define __SDL_PH_MODES_H__
|
|
||||||
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
#define PH_MAX_VIDEOMODES 127
|
|
||||||
|
|
||||||
#define PH_ENTER_DIRECTMODE 0
|
|
||||||
#define PH_IGNORE_DIRECTMODE 1
|
|
||||||
|
|
||||||
extern SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat * format, Uint32 flags);
|
|
||||||
extern void ph_FreeVideoModes(_THIS);
|
|
||||||
extern int ph_ResizeFullScreen(_THIS);
|
|
||||||
extern int ph_EnterFullScreen(_THIS, SDL_Surface * screen, int fmode);
|
|
||||||
extern int ph_LeaveFullScreen(_THIS);
|
|
||||||
extern int ph_GetVideoMode(int width, int height, int bpp);
|
|
||||||
extern int get_mode_any_format(int width, int height, int bpp);
|
|
||||||
extern int ph_ToggleFullScreen(_THIS, int on);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_MODES_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,218 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#include "SDL_mouse.h"
|
|
||||||
#include "../../events/SDL_events_c.h"
|
|
||||||
#include "../SDL_cursor_c.h"
|
|
||||||
#include "SDL_ph_mouse_c.h"
|
|
||||||
|
|
||||||
struct WMcursor
|
|
||||||
{
|
|
||||||
PhCursorDef_t *ph_cursor;
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_FreeWMCursor(_THIS, WMcursor * cursor)
|
|
||||||
{
|
|
||||||
if (window != NULL) {
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
if (PtSetResource(window, Pt_ARG_CURSOR_TYPE, Ph_CURSOR_INHERIT, 0)
|
|
||||||
< 0) {
|
|
||||||
/* TODO: output error msg */
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_free(cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
WMcursor *
|
|
||||||
ph_CreateWMCursor(_THIS, Uint8 * data, Uint8 * mask, int w, int h, int hot_x,
|
|
||||||
int hot_y)
|
|
||||||
{
|
|
||||||
WMcursor *cursor;
|
|
||||||
int clen, i;
|
|
||||||
unsigned char bit, databit, maskbit;
|
|
||||||
|
|
||||||
/* Allocate and initialize the cursor memory */
|
|
||||||
if ((cursor = (WMcursor *) SDL_malloc(sizeof(WMcursor))) == NULL) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
SDL_memset(cursor, 0, sizeof(WMcursor));
|
|
||||||
|
|
||||||
cursor->ph_cursor =
|
|
||||||
(PhCursorDef_t *) SDL_malloc(sizeof(PhCursorDef_t) + 32 * 4 * 2);
|
|
||||||
|
|
||||||
if (cursor->ph_cursor == NULL) {
|
|
||||||
SDL_SetError("ph_CreateWMCursor(): cursor malloc failed !\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_memset(cursor->ph_cursor, 0, (sizeof(PhCursorDef_t) + 32 * 4 * 2));
|
|
||||||
|
|
||||||
cursor->ph_cursor->hdr.type = Ph_RDATA_CURSOR;
|
|
||||||
cursor->ph_cursor->size1.x = (short) w;
|
|
||||||
cursor->ph_cursor->size1.y = (short) h;
|
|
||||||
cursor->ph_cursor->offset1.x = (short) hot_x;
|
|
||||||
cursor->ph_cursor->offset1.y = (short) hot_y;
|
|
||||||
cursor->ph_cursor->bytesperline1 = (char) w / 8;
|
|
||||||
cursor->ph_cursor->color1 = Pg_WHITE;
|
|
||||||
cursor->ph_cursor->size2.x = (short) w;
|
|
||||||
cursor->ph_cursor->size2.y = (short) h;
|
|
||||||
cursor->ph_cursor->offset2.x = (short) hot_x;
|
|
||||||
cursor->ph_cursor->offset2.y = (short) hot_y;
|
|
||||||
cursor->ph_cursor->bytesperline2 = (char) w / 8;
|
|
||||||
cursor->ph_cursor->color2 = Pg_BLACK;
|
|
||||||
|
|
||||||
clen = (w / 8) * h;
|
|
||||||
|
|
||||||
/* Copy the mask and the data to different bitmap planes */
|
|
||||||
for (i = 0; i < clen; ++i) {
|
|
||||||
for (bit = 0; bit < 8; bit++) {
|
|
||||||
databit = data[i] & (1 << bit);
|
|
||||||
maskbit = mask[i] & (1 << bit);
|
|
||||||
|
|
||||||
cursor->ph_cursor->images[i] |= (databit == 0) ? maskbit : 0;
|
|
||||||
/* If the databit != 0, treat it as a black pixel and
|
|
||||||
* ignore the maskbit (can't do an inverted color) */
|
|
||||||
cursor->ph_cursor->images[i + clen] |= databit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* #bytes following the hdr struct */
|
|
||||||
cursor->ph_cursor->hdr.len =
|
|
||||||
sizeof(PhCursorDef_t) + clen * 2 - sizeof(PhRegionDataHdr_t);
|
|
||||||
|
|
||||||
return (cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
PhCursorDef_t
|
|
||||||
ph_GetWMPhCursor(WMcursor * cursor)
|
|
||||||
{
|
|
||||||
return (*cursor->ph_cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_ShowWMCursor(_THIS, WMcursor * cursor)
|
|
||||||
{
|
|
||||||
PtArg_t args[3];
|
|
||||||
int nargs = 0;
|
|
||||||
|
|
||||||
/* Don't do anything if the display is gone */
|
|
||||||
if (window == NULL) {
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* looks like photon can't draw mouse cursor in direct mode */
|
|
||||||
if (this->screen->flags & SDL_FULLSCREEN) {
|
|
||||||
/* disable the fake mouse in the fullscreen OpenGL mode */
|
|
||||||
if (this->screen->flags & SDL_INTERNALOPENGL) {
|
|
||||||
cursor = NULL;
|
|
||||||
} else {
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the photon cursor, or blank if cursor is NULL */
|
|
||||||
if (cursor != NULL) {
|
|
||||||
PtSetArg(&args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_BITMAP, 0);
|
|
||||||
/* Could set next to any PgColor_t value */
|
|
||||||
PtSetArg(&args[1], Pt_ARG_CURSOR_COLOR, Ph_CURSOR_DEFAULT_COLOR, 0);
|
|
||||||
PtSetArg(&args[2], Pt_ARG_BITMAP_CURSOR, cursor->ph_cursor,
|
|
||||||
(cursor->ph_cursor->hdr.len + sizeof(PhRegionDataHdr_t)));
|
|
||||||
nargs = 3;
|
|
||||||
} else { /* Ph_CURSOR_NONE */
|
|
||||||
|
|
||||||
PtSetArg(&args[0], Pt_ARG_CURSOR_TYPE, Ph_CURSOR_NONE, 0);
|
|
||||||
nargs = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
if (PtSetResources(window, nargs, args) < 0) {
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
|
|
||||||
return (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
|
|
||||||
{
|
|
||||||
short abs_x, abs_y;
|
|
||||||
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
PtGetAbsPosition(window, &abs_x, &abs_y);
|
|
||||||
PhMoveCursorAbs(PhInputGroup(NULL), x + abs_x, y + abs_y);
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_CheckMouseMode(_THIS)
|
|
||||||
{
|
|
||||||
/* If the mouse is hidden and input is grabbed, we use relative mode */
|
|
||||||
if (!(SDL_cursorstate & CURSOR_VISIBLE)
|
|
||||||
&& (this->input_grab != SDL_GRAB_OFF)) {
|
|
||||||
mouse_relative = 1;
|
|
||||||
} else {
|
|
||||||
mouse_relative = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_UpdateMouse(_THIS)
|
|
||||||
{
|
|
||||||
PhCursorInfo_t phcursor;
|
|
||||||
short abs_x;
|
|
||||||
short abs_y;
|
|
||||||
|
|
||||||
/* Lock the event thread, in multi-threading environments */
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
/* synchronizing photon mouse cursor position and SDL mouse position, if cursor appears over window. */
|
|
||||||
PtGetAbsPosition(window, &abs_x, &abs_y);
|
|
||||||
PhQueryCursor(PhInputGroup(NULL), &phcursor);
|
|
||||||
if (((phcursor.pos.x >= abs_x)
|
|
||||||
&& (phcursor.pos.x <= abs_x + this->screen->w))
|
|
||||||
&& ((phcursor.pos.y >= abs_y)
|
|
||||||
&& (phcursor.pos.y <= abs_y + this->screen->h))) {
|
|
||||||
SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS);
|
|
||||||
SDL_PrivateMouseMotion(0, 0, phcursor.pos.x - abs_x,
|
|
||||||
phcursor.pos.y - abs_y);
|
|
||||||
} else {
|
|
||||||
SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unlock the event thread, in multi-threading environments */
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_MOUSE_H__
|
|
||||||
#define __SDL_PH_MOUSE_H__
|
|
||||||
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
/* Functions to be exported */
|
|
||||||
extern void ph_FreeWMCursor(_THIS, WMcursor * cursor);
|
|
||||||
extern WMcursor *ph_CreateWMCursor(_THIS,
|
|
||||||
Uint8 * data, Uint8 * mask, int w, int h,
|
|
||||||
int hot_x, int hot_y);
|
|
||||||
extern PhCursorDef_t ph_GetWMPhCursor(WMcursor * cursor);
|
|
||||||
extern int ph_ShowWMCursor(_THIS, WMcursor * cursor);
|
|
||||||
extern void ph_WarpWMCursor(_THIS, Uint16 x, Uint16 y);
|
|
||||||
extern void ph_CheckMouseMode(_THIS);
|
|
||||||
extern void ph_UpdateMouse(_THIS);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_MOUSE_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,629 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
|
|
||||||
#include "SDL_endian.h"
|
|
||||||
#include "SDL_timer.h"
|
|
||||||
#include "SDL_thread.h"
|
|
||||||
#include "SDL_video.h"
|
|
||||||
#include "SDL_mouse.h"
|
|
||||||
#include "../SDL_sysvideo.h"
|
|
||||||
#include "../SDL_pixels_c.h"
|
|
||||||
#include "../../events/SDL_events_c.h"
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
#include "SDL_ph_modes_c.h"
|
|
||||||
#include "SDL_ph_image_c.h"
|
|
||||||
#include "SDL_ph_events_c.h"
|
|
||||||
#include "SDL_ph_mouse_c.h"
|
|
||||||
#include "SDL_ph_wm_c.h"
|
|
||||||
#include "SDL_ph_gl.h"
|
|
||||||
#include "SDL_phyuv_c.h"
|
|
||||||
#include "../blank_cursor.h"
|
|
||||||
|
|
||||||
static int ph_VideoInit(_THIS, SDL_PixelFormat * vformat);
|
|
||||||
static SDL_Surface *ph_SetVideoMode(_THIS, SDL_Surface * current, int width,
|
|
||||||
int height, int bpp, Uint32 flags);
|
|
||||||
static int ph_SetColors(_THIS, int firstcolor, int ncolors,
|
|
||||||
SDL_Color * colors);
|
|
||||||
static void ph_VideoQuit(_THIS);
|
|
||||||
static void ph_DeleteDevice(SDL_VideoDevice * device);
|
|
||||||
|
|
||||||
static int phstatus = -1;
|
|
||||||
|
|
||||||
static int
|
|
||||||
ph_Available(void)
|
|
||||||
{
|
|
||||||
if (phstatus != 0) {
|
|
||||||
phstatus = PtInit(NULL);
|
|
||||||
if (phstatus == 0) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SDL_VideoDevice *
|
|
||||||
ph_CreateDevice(int devindex)
|
|
||||||
{
|
|
||||||
SDL_VideoDevice *device;
|
|
||||||
|
|
||||||
/* Initialize all variables that we clean on shutdown */
|
|
||||||
device = (SDL_VideoDevice *) SDL_malloc(sizeof(SDL_VideoDevice));
|
|
||||||
if (device) {
|
|
||||||
SDL_memset(device, 0, (sizeof *device));
|
|
||||||
device->hidden = (struct SDL_PrivateVideoData *)
|
|
||||||
SDL_malloc((sizeof *device->hidden));
|
|
||||||
device->gl_data = NULL;
|
|
||||||
}
|
|
||||||
if ((device == NULL) || (device->hidden == NULL)) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
ph_DeleteDevice(device);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SDL_memset(device->hidden, 0, (sizeof *device->hidden));
|
|
||||||
|
|
||||||
/* Set the driver flags */
|
|
||||||
device->handles_any_size = 1;
|
|
||||||
|
|
||||||
/* Set the function pointers */
|
|
||||||
device->CreateYUVOverlay = ph_CreateYUVOverlay;
|
|
||||||
device->VideoInit = ph_VideoInit;
|
|
||||||
device->ListModes = ph_ListModes;
|
|
||||||
device->SetVideoMode = ph_SetVideoMode;
|
|
||||||
device->ToggleFullScreen = ph_ToggleFullScreen;
|
|
||||||
device->UpdateMouse = ph_UpdateMouse;
|
|
||||||
device->SetColors = ph_SetColors;
|
|
||||||
device->UpdateRects = NULL; /* set up in ph_SetupUpdateFunction */
|
|
||||||
device->VideoQuit = ph_VideoQuit;
|
|
||||||
device->AllocHWSurface = ph_AllocHWSurface;
|
|
||||||
device->CheckHWBlit = ph_CheckHWBlit;
|
|
||||||
device->FillHWRect = ph_FillHWRect;
|
|
||||||
device->SetHWColorKey = ph_SetHWColorKey;
|
|
||||||
device->SetHWAlpha = ph_SetHWAlpha;
|
|
||||||
device->LockHWSurface = ph_LockHWSurface;
|
|
||||||
device->UnlockHWSurface = ph_UnlockHWSurface;
|
|
||||||
device->FlipHWSurface = ph_FlipHWSurface;
|
|
||||||
device->FreeHWSurface = ph_FreeHWSurface;
|
|
||||||
device->SetCaption = ph_SetCaption;
|
|
||||||
device->SetIcon = NULL;
|
|
||||||
device->IconifyWindow = ph_IconifyWindow;
|
|
||||||
device->GrabInput = ph_GrabInput;
|
|
||||||
device->GetWMInfo = ph_GetWMInfo;
|
|
||||||
device->FreeWMCursor = ph_FreeWMCursor;
|
|
||||||
device->CreateWMCursor = ph_CreateWMCursor;
|
|
||||||
device->ShowWMCursor = ph_ShowWMCursor;
|
|
||||||
device->WarpWMCursor = ph_WarpWMCursor;
|
|
||||||
device->MoveWMCursor = NULL;
|
|
||||||
device->CheckMouseMode = ph_CheckMouseMode;
|
|
||||||
device->InitOSKeymap = ph_InitOSKeymap;
|
|
||||||
device->PumpEvents = ph_PumpEvents;
|
|
||||||
|
|
||||||
/* OpenGL support. */
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
device->GL_MakeCurrent = ph_GL_MakeCurrent;
|
|
||||||
device->GL_SwapBuffers = ph_GL_SwapBuffers;
|
|
||||||
device->GL_GetAttribute = ph_GL_GetAttribute;
|
|
||||||
device->GL_LoadLibrary = ph_GL_LoadLibrary;
|
|
||||||
device->GL_GetProcAddress = ph_GL_GetProcAddress;
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
|
|
||||||
device->free = ph_DeleteDevice;
|
|
||||||
|
|
||||||
return device;
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoBootStrap ph_bootstrap = {
|
|
||||||
"photon", "QNX Photon video output",
|
|
||||||
ph_Available, ph_CreateDevice
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
ph_DeleteDevice(SDL_VideoDevice * device)
|
|
||||||
{
|
|
||||||
if (device) {
|
|
||||||
if (device->hidden) {
|
|
||||||
SDL_free(device->hidden);
|
|
||||||
device->hidden = NULL;
|
|
||||||
}
|
|
||||||
if (device->gl_data) {
|
|
||||||
SDL_free(device->gl_data);
|
|
||||||
device->gl_data = NULL;
|
|
||||||
}
|
|
||||||
SDL_free(device);
|
|
||||||
device = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static PtWidget_t *
|
|
||||||
ph_CreateWindow(_THIS)
|
|
||||||
{
|
|
||||||
PtWidget_t *widget;
|
|
||||||
|
|
||||||
widget = PtCreateWidget(PtWindow, NULL, 0, NULL);
|
|
||||||
|
|
||||||
return widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ph_SetupWindow(_THIS, int w, int h, int flags)
|
|
||||||
{
|
|
||||||
PtArg_t args[32];
|
|
||||||
PhPoint_t pos = { 0, 0 };
|
|
||||||
PhDim_t *olddim;
|
|
||||||
PhDim_t dim = { w, h };
|
|
||||||
PhRect_t desktopextent;
|
|
||||||
int nargs = 0;
|
|
||||||
const char *windowpos;
|
|
||||||
const char *iscentered;
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
/* check if window size has been changed by Window Manager */
|
|
||||||
PtGetResource(window, Pt_ARG_DIM, &olddim, 0);
|
|
||||||
if ((olddim->w != w) || (olddim->h != h)) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_DIM, &dim, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flags & SDL_RESIZABLE) == SDL_RESIZABLE) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE,
|
|
||||||
Ph_WM_CLOSE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_MAX | Ph_WM_RESTORE | Ph_WM_RESIZE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_RESIZE | Ph_WM_MOVE | Ph_WM_CLOSE | Ph_WM_MAX |
|
|
||||||
Ph_WM_RESTORE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX |
|
|
||||||
Ph_WM_RENDER_COLLAPSE | Ph_WM_RENDER_RETURN);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_RESIZE_FLAGS, Pt_TRUE,
|
|
||||||
Pt_RESIZE_XY_AS_REQUIRED);
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE,
|
|
||||||
Ph_WM_RESIZE | Ph_WM_MAX | Ph_WM_RESTORE | Ph_WM_CLOSE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_FALSE,
|
|
||||||
Ph_WM_RESIZE | Ph_WM_MAX | Ph_WM_RESTORE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_MOVE | Ph_WM_CLOSE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE,
|
|
||||||
Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_MAX |
|
|
||||||
Ph_WM_RENDER_COLLAPSE | Ph_WM_RENDER_RETURN);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_RESIZE_FLAGS, Pt_FALSE,
|
|
||||||
Pt_RESIZE_XY_AS_REQUIRED);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((flags & SDL_NOFRAME) == SDL_NOFRAME)
|
|
||||||
|| ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)) {
|
|
||||||
if ((flags & SDL_RESIZABLE) != SDL_RESIZABLE) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS,
|
|
||||||
Pt_FALSE, Pt_TRUE);
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS,
|
|
||||||
Pt_FALSE, Pt_TRUE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_RENDER_RESIZE | Ph_WM_RENDER_BORDER);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_RENDER_BORDER | Ph_WM_RENDER_TITLE |
|
|
||||||
Ph_WM_RENDER_CLOSE | Ph_WM_RENDER_MENU | Ph_WM_RENDER_MIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE,
|
|
||||||
Pt_BASIC_PREVENT_FILL);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_FFRONT | Ph_WM_MAX | Ph_WM_TOFRONT | Ph_WM_CONSWITCH);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
|
||||||
Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS |
|
|
||||||
Ph_WM_STATE_ISALTKEY);
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE,
|
|
||||||
Ph_WM_FFRONT | Ph_WM_CONSWITCH);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE,
|
|
||||||
Ph_WM_STATE_ISFRONT);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
|
||||||
Ph_WM_STATE_ISALTKEY);
|
|
||||||
|
|
||||||
if ((flags & SDL_HWSURFACE) == SDL_HWSURFACE) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE,
|
|
||||||
Pt_BASIC_PREVENT_FILL);
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
|
|
||||||
}
|
|
||||||
if (!currently_maximized) {
|
|
||||||
windowpos = SDL_getenv("SDL_VIDEO_WINDOW_POS");
|
|
||||||
iscentered = SDL_getenv("SDL_VIDEO_CENTERED");
|
|
||||||
|
|
||||||
if ((iscentered)
|
|
||||||
|| ((windowpos)
|
|
||||||
&& (SDL_strcmp(windowpos, "center") == 0))) {
|
|
||||||
PhWindowQueryVisible(Ph_QUERY_CONSOLE, 0, 0, &desktopextent);
|
|
||||||
if (desktop_mode.width > w) {
|
|
||||||
pos.x = (desktop_mode.width - w) / 2;
|
|
||||||
}
|
|
||||||
if (desktop_mode.height > h) {
|
|
||||||
pos.y = (desktop_mode.height - h) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos.x += desktopextent.ul.x;
|
|
||||||
pos.y += desktopextent.ul.y;
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
|
|
||||||
} else {
|
|
||||||
if (windowpos) {
|
|
||||||
if (SDL_sscanf(windowpos, "%d,%d", &x, &y) == 2) {
|
|
||||||
if ((x < desktop_mode.width)
|
|
||||||
&& (y < desktop_mode.height)) {
|
|
||||||
PhWindowQueryVisible
|
|
||||||
(Ph_QUERY_CONSOLE, 0, 0, &desktopextent);
|
|
||||||
pos.x = x + desktopextent.ul.x;
|
|
||||||
pos.y = y + desktopextent.ul.y;
|
|
||||||
}
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if window is maximized render it as maximized */
|
|
||||||
if (currently_maximized) {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
|
||||||
Ph_WM_STATE_ISMAX);
|
|
||||||
} else {
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE,
|
|
||||||
Ph_WM_STATE_ISMAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do not grab the keyboard by default */
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE,
|
|
||||||
Ph_WM_STATE_ISALTKEY);
|
|
||||||
|
|
||||||
/* bring the focus to the window */
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
|
||||||
Ph_WM_STATE_ISFOCUS);
|
|
||||||
|
|
||||||
/* allow to catch hide event */
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_HIDE);
|
|
||||||
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,
|
|
||||||
Ph_WM_HIDE);
|
|
||||||
}
|
|
||||||
|
|
||||||
PtSetResources(window, nargs, args);
|
|
||||||
PtRealizeWidget(window);
|
|
||||||
PtWindowToFront(window);
|
|
||||||
|
|
||||||
#if 0 /* FIXME */
|
|
||||||
PtGetResource(window, Pt_ARG_POS, &olddim, 0);
|
|
||||||
fprintf(stderr, "POSITION: %d, %d\n", olddim->w, olddim->h);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct ColourMasks *
|
|
||||||
ph_GetColourMasks(int bpp)
|
|
||||||
{
|
|
||||||
/* The alpha mask doesn't appears to be needed */
|
|
||||||
static const struct ColourMasks phColorMasks[5] = {
|
|
||||||
/* 8 bit */ {0, 0, 0, 0, 8},
|
|
||||||
/* 15 bit ARGB */ {0x7C00, 0x03E0, 0x001F, 0x8000, 15},
|
|
||||||
/* 16 bit RGB */ {0xF800, 0x07E0, 0x001F, 0x0000, 16},
|
|
||||||
/* 24 bit RGB */ {0xFF0000, 0x00FF00, 0x0000FF, 0x000000, 24},
|
|
||||||
/* 32 bit ARGB */ {0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000,
|
|
||||||
32},
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (bpp) {
|
|
||||||
case 8:
|
|
||||||
return &phColorMasks[0];
|
|
||||||
case 15:
|
|
||||||
return &phColorMasks[1];
|
|
||||||
case 16:
|
|
||||||
return &phColorMasks[2];
|
|
||||||
case 24:
|
|
||||||
return &phColorMasks[3];
|
|
||||||
case 32:
|
|
||||||
return &phColorMasks[4];
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ph_VideoInit(_THIS, SDL_PixelFormat * vformat)
|
|
||||||
{
|
|
||||||
PgHWCaps_t hwcaps;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
window = NULL;
|
|
||||||
desktoppal = SDLPH_PAL_NONE;
|
|
||||||
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
oglctx = NULL;
|
|
||||||
oglbuffers = NULL;
|
|
||||||
oglflags = 0;
|
|
||||||
oglbpp = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
old_video_mode = -1;
|
|
||||||
old_refresh_rate = -1;
|
|
||||||
|
|
||||||
if (NULL == (phevent = SDL_malloc(EVENT_SIZE))) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
SDL_memset(phevent, 0x00, EVENT_SIZE);
|
|
||||||
|
|
||||||
window = ph_CreateWindow(this);
|
|
||||||
if (window == NULL) {
|
|
||||||
SDL_SetError("ph_VideoInit(): Couldn't create video window !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create the blank cursor */
|
|
||||||
SDL_BlankCursor = this->CreateWMCursor(this, blank_cdata, blank_cmask,
|
|
||||||
(int) BLANK_CWIDTH,
|
|
||||||
(int) BLANK_CHEIGHT,
|
|
||||||
(int) BLANK_CHOTX,
|
|
||||||
(int) BLANK_CHOTY);
|
|
||||||
|
|
||||||
if (SDL_BlankCursor == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PgGetGraphicsHWCaps(&hwcaps) < 0) {
|
|
||||||
SDL_SetError("ph_VideoInit(): GetGraphicsHWCaps function failed !\n");
|
|
||||||
this->FreeWMCursor(this, SDL_BlankCursor);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PgGetVideoModeInfo(hwcaps.current_video_mode, &desktop_mode) < 0) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_VideoInit(): PgGetVideoModeInfo function failed !\n");
|
|
||||||
this->FreeWMCursor(this, SDL_BlankCursor);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Determine the current screen size */
|
|
||||||
this->info.current_w = desktop_mode.width;
|
|
||||||
this->info.current_h = desktop_mode.height;
|
|
||||||
|
|
||||||
/* We need to return BytesPerPixel as it in used by CreateRGBsurface */
|
|
||||||
vformat->BitsPerPixel = desktop_mode.bits_per_pixel;
|
|
||||||
vformat->BytesPerPixel =
|
|
||||||
desktop_mode.bytes_per_scanline / desktop_mode.width;
|
|
||||||
desktopbpp = desktop_mode.bits_per_pixel;
|
|
||||||
|
|
||||||
/* save current palette */
|
|
||||||
if (desktopbpp == 8) {
|
|
||||||
PgGetPalette(savedpal);
|
|
||||||
PgGetPalette(syspalph);
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < _Pg_MAX_PALETTE; i++) {
|
|
||||||
savedpal[i] = PgRGB(0, 0, 0);
|
|
||||||
syspalph[i] = PgRGB(0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
currently_fullscreen = 0;
|
|
||||||
currently_hided = 0;
|
|
||||||
currently_maximized = 0;
|
|
||||||
current_overlay = NULL;
|
|
||||||
|
|
||||||
OCImage.direct_context = NULL;
|
|
||||||
OCImage.offscreen_context = NULL;
|
|
||||||
OCImage.offscreen_backcontext = NULL;
|
|
||||||
OCImage.oldDC = NULL;
|
|
||||||
OCImage.CurrentFrameData = NULL;
|
|
||||||
OCImage.FrameData0 = NULL;
|
|
||||||
OCImage.FrameData1 = NULL;
|
|
||||||
videomode_emulatemode = 0;
|
|
||||||
|
|
||||||
this->info.wm_available = 1;
|
|
||||||
|
|
||||||
ph_UpdateHWInfo(this);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SDL_Surface *
|
|
||||||
ph_SetVideoMode(_THIS, SDL_Surface * current, int width, int height, int bpp,
|
|
||||||
Uint32 flags)
|
|
||||||
{
|
|
||||||
const struct ColourMasks *mask;
|
|
||||||
|
|
||||||
/* Lock the event thread, in multi-threading environments */
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
current->flags = flags;
|
|
||||||
|
|
||||||
/* if we do not have desired fullscreen mode, then fallback into window mode */
|
|
||||||
if (((current->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)
|
|
||||||
&& (ph_GetVideoMode(width, height, bpp) == 0)) {
|
|
||||||
current->flags &= ~SDL_FULLSCREEN;
|
|
||||||
current->flags &= ~SDL_NOFRAME;
|
|
||||||
current->flags &= ~SDL_RESIZABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ph_SetupWindow(this, width, height, current->flags);
|
|
||||||
|
|
||||||
mask = ph_GetColourMasks(bpp);
|
|
||||||
if (mask != NULL) {
|
|
||||||
SDL_ReallocFormat(current, mask->bpp, mask->red, mask->green,
|
|
||||||
mask->blue, 0);
|
|
||||||
} else {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetVideoMode(): desired bpp is not supported by photon !\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current->flags & SDL_INTERNALOPENGL) {
|
|
||||||
#if !SDL_VIDEO_OPENGL
|
|
||||||
/* if no built-in OpenGL support */
|
|
||||||
SDL_SetError
|
|
||||||
("ph_SetVideoMode(): no OpenGL support, you need to recompile SDL.\n");
|
|
||||||
current->flags &= ~SDL_INTERNALOPENGL;
|
|
||||||
return NULL;
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
} else {
|
|
||||||
/* Initialize internal variables */
|
|
||||||
if ((current->flags & SDL_FULLSCREEN) == SDL_FULLSCREEN) {
|
|
||||||
if (bpp == 8) {
|
|
||||||
desktoppal = SDLPH_PAL_SYSTEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
current->flags &= ~SDL_RESIZABLE; /* no resize for Direct Context */
|
|
||||||
current->flags |= SDL_HWSURFACE;
|
|
||||||
} else {
|
|
||||||
/* remove this if we'll have support for the non-fullscreen sw/hw+doublebuf one day */
|
|
||||||
current->flags &= ~SDL_DOUBLEBUF;
|
|
||||||
|
|
||||||
/* Use offscreen memory if SDL_HWSURFACE flag is set */
|
|
||||||
if ((current->flags & SDL_HWSURFACE) == SDL_HWSURFACE) {
|
|
||||||
if (desktopbpp != bpp) {
|
|
||||||
current->flags &= ~SDL_HWSURFACE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* using palette emulation code in window mode */
|
|
||||||
if (bpp == 8) {
|
|
||||||
if (desktopbpp >= 15) {
|
|
||||||
desktoppal = SDLPH_PAL_EMULATE;
|
|
||||||
} else {
|
|
||||||
desktoppal = SDLPH_PAL_SYSTEM;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
desktoppal = SDLPH_PAL_NONE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
current->w = width;
|
|
||||||
current->h = height;
|
|
||||||
|
|
||||||
if (desktoppal == SDLPH_PAL_SYSTEM) {
|
|
||||||
current->flags |= SDL_HWPALETTE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Must call at least once for setup image planes */
|
|
||||||
if (ph_SetupUpdateFunction(this, current, current->flags) == -1) {
|
|
||||||
/* Error string was filled in the ph_SetupUpdateFunction() */
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* finish window drawing, if we are not in fullscreen, of course */
|
|
||||||
if ((current->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN) {
|
|
||||||
PtFlush();
|
|
||||||
} else {
|
|
||||||
PgFlush();
|
|
||||||
}
|
|
||||||
|
|
||||||
visualbpp = bpp;
|
|
||||||
|
|
||||||
ph_UpdateHWInfo(this);
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
|
|
||||||
/* We've done! */
|
|
||||||
return (current);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ph_VideoQuit(_THIS)
|
|
||||||
{
|
|
||||||
/* restore palette */
|
|
||||||
if (desktopbpp == 8) {
|
|
||||||
PgSetPalette(syspalph, 0, -1, 0, 0, 0);
|
|
||||||
PgSetPalette(savedpal, 0, 0, _Pg_MAX_PALETTE,
|
|
||||||
Pg_PALSET_GLOBAL | Pg_PALSET_FORCE_EXPOSE, 0);
|
|
||||||
PgFlush();
|
|
||||||
}
|
|
||||||
|
|
||||||
ph_DestroyImage(this, SDL_VideoSurface);
|
|
||||||
|
|
||||||
if (window) {
|
|
||||||
PtUnrealizeWidget(window);
|
|
||||||
PtDestroyWidget(window);
|
|
||||||
window = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (phevent != NULL) {
|
|
||||||
SDL_free(phevent);
|
|
||||||
phevent = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
ph_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color * colors)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
SDL_Rect updaterect;
|
|
||||||
|
|
||||||
updaterect.x = updaterect.y = 0;
|
|
||||||
updaterect.w = this->screen->w;
|
|
||||||
updaterect.h = this->screen->h;
|
|
||||||
|
|
||||||
/* palette emulation code, using palette of the PhImage_t struct */
|
|
||||||
if (desktoppal == SDLPH_PAL_EMULATE) {
|
|
||||||
if ((SDL_Image) && (SDL_Image->palette)) {
|
|
||||||
for (i = firstcolor; i < firstcolor + ncolors; i++) {
|
|
||||||
syspalph[i] =
|
|
||||||
PgRGB(colors[i - firstcolor].r,
|
|
||||||
colors[i - firstcolor].g, colors[i - firstcolor].b);
|
|
||||||
SDL_Image->palette[i] = syspalph[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* image needs to be redrawn */
|
|
||||||
this->UpdateRects(this, 1, &updaterect);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (desktoppal == SDLPH_PAL_SYSTEM) {
|
|
||||||
for (i = firstcolor; i < firstcolor + ncolors; i++) {
|
|
||||||
syspalph[i] =
|
|
||||||
PgRGB(colors[i - firstcolor].r,
|
|
||||||
colors[i - firstcolor].g, colors[i - firstcolor].b);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((this->screen->flags & SDL_FULLSCREEN) != SDL_FULLSCREEN) {
|
|
||||||
/* window mode must use soft palette */
|
|
||||||
PgSetPalette(&syspalph[firstcolor], 0, firstcolor,
|
|
||||||
ncolors, Pg_PALSET_GLOBAL, 0);
|
|
||||||
/* image needs to be redrawn */
|
|
||||||
this->UpdateRects(this, 1, &updaterect);
|
|
||||||
} else {
|
|
||||||
/* fullscreen mode must use hardware palette */
|
|
||||||
PgSetPalette(&syspalph[firstcolor], 0, firstcolor,
|
|
||||||
ncolors, Pg_PALSET_GLOBAL, 0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* SDLPH_PAL_NONE do nothing */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,158 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with this library; if not, write to the Free
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_VIDEO_H__
|
|
||||||
#define __SDL_PH_VIDEO_H__
|
|
||||||
|
|
||||||
#include "SDL_mouse.h"
|
|
||||||
#include "../SDL_sysvideo.h"
|
|
||||||
|
|
||||||
#include <sys/neutrino.h>
|
|
||||||
|
|
||||||
#include <Ph.h>
|
|
||||||
#include <Pt.h>
|
|
||||||
#include <photon/Pg.h>
|
|
||||||
#include <photon/PdDirect.h>
|
|
||||||
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
#include <photon/PdGL.h>
|
|
||||||
#else
|
|
||||||
#include <GL/qnxgl.h>
|
|
||||||
#include <GL/GLPh.h>
|
|
||||||
#endif /* 6.3.0 */
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
|
|
||||||
/* Hidden "this" pointer for the video functions */
|
|
||||||
#define _THIS SDL_VideoDevice* this
|
|
||||||
|
|
||||||
#define PH_OGL_MAX_ATTRIBS 32
|
|
||||||
|
|
||||||
#define SDLPH_PAL_NONE 0x00000000L
|
|
||||||
#define SDLPH_PAL_EMULATE 0x00000001L
|
|
||||||
#define SDLPH_PAL_SYSTEM 0x00000002L
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
unsigned char *Y;
|
|
||||||
unsigned char *V;
|
|
||||||
unsigned char *U;
|
|
||||||
} FRAMEDATA;
|
|
||||||
|
|
||||||
/* Mask values for SDL_ReallocFormat() */
|
|
||||||
struct ColourMasks
|
|
||||||
{
|
|
||||||
Uint32 red;
|
|
||||||
Uint32 green;
|
|
||||||
Uint32 blue;
|
|
||||||
Uint32 alpha;
|
|
||||||
Uint32 bpp;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Private display data */
|
|
||||||
struct SDL_PrivateVideoData
|
|
||||||
{
|
|
||||||
PgDisplaySettings_t mode_settings;
|
|
||||||
PtWidget_t *Window; /* used to handle input events */
|
|
||||||
PhImage_t *image; /* used to display image */
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
#if (_NTO_VERSION < 630)
|
|
||||||
PdOpenGLContext_t *OGLContext; /* OpenGL context */
|
|
||||||
void *OGLBuffers; /* OpenGL buffers (unused) */
|
|
||||||
#else
|
|
||||||
qnxglc_t *OGLContext; /* OpenGL context for the 6.3 */
|
|
||||||
qnxgl_bufs_t *OGLBuffers; /* OpenGL buffers for the 6.3 */
|
|
||||||
#endif /* 630 */
|
|
||||||
|
|
||||||
Uint32 OGLFlags; /* OpenGL flags */
|
|
||||||
Uint32 OGLBPP; /* OpenGL bpp */
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
PgColor_t savedpal[_Pg_MAX_PALETTE];
|
|
||||||
PgColor_t syspalph[_Pg_MAX_PALETTE];
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
PdDirectContext_t *direct_context;
|
|
||||||
PdOffscreenContext_t *offscreen_context;
|
|
||||||
PdOffscreenContext_t *offscreen_backcontext;
|
|
||||||
PhDrawContext_t *oldDC;
|
|
||||||
uint8_t *dc_ptr;
|
|
||||||
unsigned char *CurrentFrameData;
|
|
||||||
unsigned char *FrameData0;
|
|
||||||
unsigned char *FrameData1;
|
|
||||||
Uint32 current;
|
|
||||||
Uint32 flags;
|
|
||||||
} ocimage;
|
|
||||||
|
|
||||||
PgHWCaps_t graphics_card_caps; /* Graphics card caps at the moment of start */
|
|
||||||
PgVideoModeInfo_t desktop_mode; /* Current desktop video mode information */
|
|
||||||
int old_video_mode; /* Stored mode before fullscreen switch */
|
|
||||||
int old_refresh_rate; /* Stored refresh rate befor fullscreen switch */
|
|
||||||
|
|
||||||
int mouse_relative;
|
|
||||||
WMcursor *BlankCursor;
|
|
||||||
uint32_t videomode_emulatemode;
|
|
||||||
|
|
||||||
Uint32 visualbpp; /* current visual bpp */
|
|
||||||
Uint32 desktopbpp; /* bpp of desktop at the moment of start */
|
|
||||||
Uint32 desktoppal; /* palette mode emulation or system */
|
|
||||||
|
|
||||||
int currently_fullscreen;
|
|
||||||
int currently_hided; /* 1 - window hided (minimazed), 0 - normal */
|
|
||||||
int currently_maximized; /* 1 - window hided (minimazed), 0 - normal */
|
|
||||||
|
|
||||||
PhEvent_t *event;
|
|
||||||
SDL_Overlay *overlay;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define mode_settings (this->hidden->mode_settings)
|
|
||||||
#define window (this->hidden->Window)
|
|
||||||
#define SDL_Image (this->hidden->image)
|
|
||||||
#define OCImage (this->hidden->ocimage)
|
|
||||||
#define old_video_mode (this->hidden->old_video_mode)
|
|
||||||
#define old_refresh_rate (this->hidden->old_refresh_rate)
|
|
||||||
#define graphics_card_caps (this->hidden->graphics_card_caps)
|
|
||||||
#define desktopbpp (this->hidden->desktopbpp)
|
|
||||||
#define visualbpp (this->hidden->visualbpp)
|
|
||||||
#define desktoppal (this->hidden->desktoppal)
|
|
||||||
#define savedpal (this->hidden->savedpal)
|
|
||||||
#define syspalph (this->hidden->syspalph)
|
|
||||||
#define currently_fullscreen (this->hidden->currently_fullscreen)
|
|
||||||
#define currently_hided (this->hidden->currently_hided)
|
|
||||||
#define currently_maximized (this->hidden->currently_maximized)
|
|
||||||
#define phevent (this->hidden->event)
|
|
||||||
#define current_overlay (this->hidden->overlay)
|
|
||||||
#define desktop_mode (this->hidden->desktop_mode)
|
|
||||||
#define mouse_relative (this->hidden->mouse_relative)
|
|
||||||
#define SDL_BlankCursor (this->hidden->BlankCursor)
|
|
||||||
#define videomode_emulatemode (this->hidden->videomode_emulatemode)
|
|
||||||
|
|
||||||
#if SDL_VIDEO_OPENGL
|
|
||||||
#define oglctx (this->hidden->OGLContext)
|
|
||||||
#define oglbuffers (this->hidden->OGLBuffers)
|
|
||||||
#define oglflags (this->hidden->OGLFlags)
|
|
||||||
#define oglbpp (this->hidden->OGLBPP)
|
|
||||||
#endif /* SDL_VIDEO_OPENGL */
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_VIDEO_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,123 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#include <Ph.h>
|
|
||||||
#include <photon/PpProto.h>
|
|
||||||
#include <photon/PhWm.h>
|
|
||||||
#include <photon/wmapi.h>
|
|
||||||
|
|
||||||
#include "SDL_version.h"
|
|
||||||
#include "SDL_timer.h"
|
|
||||||
#include "SDL_video.h"
|
|
||||||
#include "SDL_syswm.h"
|
|
||||||
#include "../SDL_pixels_c.h"
|
|
||||||
#include "../../events/SDL_events_c.h"
|
|
||||||
#include "SDL_ph_modes_c.h"
|
|
||||||
#include "SDL_ph_wm_c.h"
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set window caption */
|
|
||||||
void
|
|
||||||
ph_SetCaption(_THIS, const char *title, const char *icon)
|
|
||||||
{
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
/* sanity check for set caption call before window init */
|
|
||||||
if (window != NULL) {
|
|
||||||
PtSetResource(window, Pt_ARG_WINDOW_TITLE, title, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Iconify current window */
|
|
||||||
int
|
|
||||||
ph_IconifyWindow(_THIS)
|
|
||||||
{
|
|
||||||
PhWindowEvent_t windowevent;
|
|
||||||
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
|
|
||||||
SDL_memset(&windowevent, 0, sizeof(windowevent));
|
|
||||||
windowevent.event_f = Ph_WM_HIDE;
|
|
||||||
windowevent.event_state = Ph_WM_EVSTATE_HIDE;
|
|
||||||
windowevent.rid = PtWidgetRid(window);
|
|
||||||
PtForwardWindowEvent(&windowevent);
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_GrabMode
|
|
||||||
ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)
|
|
||||||
{
|
|
||||||
short abs_x, abs_y;
|
|
||||||
|
|
||||||
if (mode == SDL_GRAB_OFF) {
|
|
||||||
PtSetResource(window, Pt_ARG_WINDOW_STATE, Pt_FALSE,
|
|
||||||
Ph_WM_STATE_ISALTKEY);
|
|
||||||
} else {
|
|
||||||
PtSetResource(window, Pt_ARG_WINDOW_STATE, Pt_TRUE,
|
|
||||||
Ph_WM_STATE_ISALTKEY);
|
|
||||||
|
|
||||||
PtGetAbsPosition(window, &abs_x, &abs_y);
|
|
||||||
PhMoveCursorAbs(PhInputGroup(NULL),
|
|
||||||
abs_x + SDL_VideoSurface->w / 2,
|
|
||||||
abs_y + SDL_VideoSurface->h / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
|
|
||||||
return (mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_GrabMode
|
|
||||||
ph_GrabInput(_THIS, SDL_GrabMode mode)
|
|
||||||
{
|
|
||||||
SDL_Lock_EventThread();
|
|
||||||
mode = ph_GrabInputNoLock(this, mode);
|
|
||||||
SDL_Unlock_EventThread();
|
|
||||||
|
|
||||||
return (mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_GetWMInfo(_THIS, SDL_SysWMinfo * info)
|
|
||||||
{
|
|
||||||
if (info->version.major <= SDL_MAJOR_VERSION) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
SDL_SetError("Application not compiled with SDL %d.%d\n",
|
|
||||||
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_WM_H__
|
|
||||||
#define __SDL_PH_WM_H__
|
|
||||||
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
/* Functions to be exported */
|
|
||||||
extern void ph_SetCaption(_THIS, const char *title, const char *icon);
|
|
||||||
extern void ph_SetIcon(_THIS, SDL_Surface * icon, Uint8 * mask);
|
|
||||||
extern int ph_IconifyWindow(_THIS);
|
|
||||||
extern SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode);
|
|
||||||
extern SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode);
|
|
||||||
extern int ph_GetWMInfo(_THIS, SDL_SysWMinfo * info);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_WM_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,509 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
/* This is the QNX Realtime Platform version of SDL YUV video overlays */
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <Ph.h>
|
|
||||||
#include <Pt.h>
|
|
||||||
|
|
||||||
#include "SDL_video.h"
|
|
||||||
#include "SDL_phyuv_c.h"
|
|
||||||
#include "../SDL_yuvfuncs.h"
|
|
||||||
|
|
||||||
#define OVERLAY_STATE_UNINIT 0
|
|
||||||
#define OVERLAY_STATE_ACTIVE 1
|
|
||||||
|
|
||||||
/* The functions are used to manipulate software video overlays */
|
|
||||||
static struct private_yuvhwfuncs ph_yuvfuncs = {
|
|
||||||
ph_LockYUVOverlay,
|
|
||||||
ph_UnlockYUVOverlay,
|
|
||||||
ph_DisplayYUVOverlay,
|
|
||||||
ph_FreeYUVOverlay
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
grab_ptrs2(PgVideoChannel_t * channel, FRAMEDATA * Frame0, FRAMEDATA * Frame1)
|
|
||||||
{
|
|
||||||
int planes = 0;
|
|
||||||
|
|
||||||
/* Buffers have moved; re-obtain the pointers */
|
|
||||||
Frame0->Y = (unsigned char *) PdGetOffscreenContextPtr(channel->yplane1);
|
|
||||||
Frame1->Y = (unsigned char *) PdGetOffscreenContextPtr(channel->yplane2);
|
|
||||||
Frame0->U = (unsigned char *) PdGetOffscreenContextPtr(channel->vplane1);
|
|
||||||
Frame1->U = (unsigned char *) PdGetOffscreenContextPtr(channel->vplane2);
|
|
||||||
Frame0->V = (unsigned char *) PdGetOffscreenContextPtr(channel->uplane1);
|
|
||||||
Frame1->V = (unsigned char *) PdGetOffscreenContextPtr(channel->uplane2);
|
|
||||||
|
|
||||||
if (Frame0->Y)
|
|
||||||
planes++;
|
|
||||||
|
|
||||||
if (Frame0->U)
|
|
||||||
planes++;
|
|
||||||
|
|
||||||
if (Frame0->V)
|
|
||||||
planes++;
|
|
||||||
|
|
||||||
return planes;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Overlay *
|
|
||||||
ph_CreateYUVOverlay(_THIS, int width, int height, Uint32 format,
|
|
||||||
SDL_Surface * display)
|
|
||||||
{
|
|
||||||
SDL_Overlay *overlay;
|
|
||||||
struct private_yuvhwdata *hwdata;
|
|
||||||
int vidport;
|
|
||||||
int rtncode;
|
|
||||||
int planes;
|
|
||||||
int i = 0;
|
|
||||||
PhPoint_t pos;
|
|
||||||
|
|
||||||
/* Create the overlay structure */
|
|
||||||
overlay = SDL_calloc(1, sizeof(SDL_Overlay));
|
|
||||||
|
|
||||||
if (overlay == NULL) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fill in the basic members */
|
|
||||||
overlay->format = format;
|
|
||||||
overlay->w = width;
|
|
||||||
overlay->h = height;
|
|
||||||
overlay->hwdata = NULL;
|
|
||||||
|
|
||||||
/* Set up the YUV surface function structure */
|
|
||||||
overlay->hwfuncs = &ph_yuvfuncs;
|
|
||||||
|
|
||||||
/* Create the pixel data and lookup tables */
|
|
||||||
hwdata = SDL_calloc(1, sizeof(struct private_yuvhwdata));
|
|
||||||
|
|
||||||
if (hwdata == NULL) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata = hwdata;
|
|
||||||
|
|
||||||
PhDCSetCurrent(0);
|
|
||||||
if (overlay->hwdata->channel == NULL) {
|
|
||||||
if ((overlay->hwdata->channel =
|
|
||||||
PgCreateVideoChannel(Pg_VIDEO_CHANNEL_SCALER, 0)) == NULL) {
|
|
||||||
SDL_SetError
|
|
||||||
("ph_CreateYUVOverlay(): Create channel failed: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->forcedredraw = 0;
|
|
||||||
|
|
||||||
PtGetAbsPosition(window, &pos.x, &pos.y);
|
|
||||||
overlay->hwdata->CurrentWindowPos.x = pos.x;
|
|
||||||
overlay->hwdata->CurrentWindowPos.y = pos.y;
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.x = 0;
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.y = 0;
|
|
||||||
overlay->hwdata->CurrentViewPort.size.w = width;
|
|
||||||
overlay->hwdata->CurrentViewPort.size.h = height;
|
|
||||||
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
|
|
||||||
overlay->hwdata->FrameData0 =
|
|
||||||
(FRAMEDATA *) SDL_calloc(1, sizeof(FRAMEDATA));
|
|
||||||
overlay->hwdata->FrameData1 =
|
|
||||||
(FRAMEDATA *) SDL_calloc(1, sizeof(FRAMEDATA));
|
|
||||||
|
|
||||||
vidport = -1;
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
overlay->hwdata->ischromakey = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
SDL_memset(&overlay->hwdata->caps, 0x00, sizeof(PgScalerCaps_t));
|
|
||||||
overlay->hwdata->caps.size = sizeof(PgScalerCaps_t);
|
|
||||||
rtncode =
|
|
||||||
PgGetScalerCapabilities(overlay->hwdata->channel, i,
|
|
||||||
&overlay->hwdata->caps);
|
|
||||||
if (rtncode == 0) {
|
|
||||||
if (overlay->hwdata->caps.format == format) {
|
|
||||||
if ((overlay->hwdata->
|
|
||||||
caps.flags & Pg_SCALER_CAP_DST_CHROMA_KEY) ==
|
|
||||||
Pg_SCALER_CAP_DST_CHROMA_KEY) {
|
|
||||||
overlay->hwdata->ischromakey = 1;
|
|
||||||
}
|
|
||||||
vidport = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
} while (1);
|
|
||||||
|
|
||||||
|
|
||||||
if (vidport == -1) {
|
|
||||||
SDL_SetError("No available video ports for requested format\n");
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->format = format;
|
|
||||||
overlay->hwdata->props.format = format;
|
|
||||||
overlay->hwdata->props.size = sizeof(PgScalerProps_t);
|
|
||||||
overlay->hwdata->props.src_dim.w = width;
|
|
||||||
overlay->hwdata->props.src_dim.h = height;
|
|
||||||
|
|
||||||
/* overlay->hwdata->chromakey = PgGetOverlayChromaColor(); */
|
|
||||||
overlay->hwdata->chromakey = PgRGB(12, 6, 12); /* very dark pink color */
|
|
||||||
overlay->hwdata->props.color_key = overlay->hwdata->chromakey;
|
|
||||||
|
|
||||||
PhAreaToRect(&overlay->hwdata->CurrentViewPort,
|
|
||||||
&overlay->hwdata->props.viewport);
|
|
||||||
|
|
||||||
overlay->hwdata->props.flags = Pg_SCALER_PROP_DOUBLE_BUFFER;
|
|
||||||
|
|
||||||
if ((overlay->hwdata->ischromakey) && (overlay->hwdata->chromakey)) {
|
|
||||||
overlay->hwdata->props.flags |= Pg_SCALER_PROP_CHROMA_ENABLE;
|
|
||||||
overlay->hwdata->props.flags |=
|
|
||||||
Pg_SCALER_PROP_CHROMA_SPECIFY_KEY_MASK;
|
|
||||||
} else {
|
|
||||||
overlay->hwdata->props.flags &= ~Pg_SCALER_PROP_CHROMA_ENABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
rtncode =
|
|
||||||
PgConfigScalerChannel(overlay->hwdata->channel,
|
|
||||||
&overlay->hwdata->props);
|
|
||||||
|
|
||||||
switch (rtncode) {
|
|
||||||
case -1:
|
|
||||||
SDL_SetError("PgConfigScalerChannel failed\n");
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return NULL;
|
|
||||||
case 1:
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
planes =
|
|
||||||
grab_ptrs2(overlay->hwdata->channel, overlay->hwdata->FrameData0,
|
|
||||||
overlay->hwdata->FrameData1);
|
|
||||||
|
|
||||||
if (overlay->hwdata->channel->yplane1 != NULL)
|
|
||||||
overlay->hwdata->YStride = overlay->hwdata->channel->yplane1->pitch;
|
|
||||||
if (overlay->hwdata->channel->vplane1 != NULL)
|
|
||||||
overlay->hwdata->UStride = overlay->hwdata->channel->vplane1->pitch;
|
|
||||||
if (overlay->hwdata->channel->uplane1 != NULL)
|
|
||||||
overlay->hwdata->VStride = overlay->hwdata->channel->uplane1->pitch;
|
|
||||||
|
|
||||||
/* check for the validness of all planes */
|
|
||||||
if ((overlay->hwdata->channel->yplane1 == NULL) &&
|
|
||||||
(overlay->hwdata->channel->uplane1 == NULL) &&
|
|
||||||
(overlay->hwdata->channel->vplane1 == NULL)) {
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
SDL_SetError("PgConfigScaler() returns all planes equal NULL\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
|
|
||||||
|
|
||||||
if (overlay->hwdata->current==0)
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
overlay->hwdata->locked = 1;
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Find the pitch and offset values for the overlay */
|
|
||||||
overlay->planes = planes;
|
|
||||||
overlay->pitches = SDL_calloc(overlay->planes, sizeof(Uint16));
|
|
||||||
overlay->pixels = SDL_calloc(overlay->planes, sizeof(Uint8 *));
|
|
||||||
if (!overlay->pitches || !overlay->pixels) {
|
|
||||||
SDL_OutOfMemory();
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return (NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->planes > 0) {
|
|
||||||
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
|
|
||||||
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 1) {
|
|
||||||
overlay->pitches[1] = overlay->hwdata->channel->vplane1->pitch;
|
|
||||||
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 2) {
|
|
||||||
overlay->pitches[2] = overlay->hwdata->channel->uplane1->pitch;
|
|
||||||
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->State = OVERLAY_STATE_ACTIVE;
|
|
||||||
overlay->hwdata->scaler_on = 0;
|
|
||||||
overlay->hw_overlay = 1;
|
|
||||||
|
|
||||||
current_overlay = overlay;
|
|
||||||
|
|
||||||
return overlay;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_LockYUVOverlay(_THIS, SDL_Overlay * overlay)
|
|
||||||
{
|
|
||||||
if (overlay == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->locked = 1;
|
|
||||||
|
|
||||||
/* overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
|
|
||||||
if (overlay->hwdata->current == -1)
|
|
||||||
{
|
|
||||||
SDL_SetError("ph_LockYUVOverlay: PgNextFrame() failed, bailing out\n");
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->hwdata->current == 0)
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->planes > 0)
|
|
||||||
{
|
|
||||||
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
|
|
||||||
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 1)
|
|
||||||
{
|
|
||||||
overlay->pitches[1] = overlay->hwdata->channel->uplane1->pitch;
|
|
||||||
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 2)
|
|
||||||
{
|
|
||||||
overlay->pitches[2] = overlay->hwdata->channel->vplane1->pitch;
|
|
||||||
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay)
|
|
||||||
{
|
|
||||||
if (overlay == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->locked = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ph_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src,
|
|
||||||
SDL_Rect * dst)
|
|
||||||
{
|
|
||||||
int rtncode;
|
|
||||||
PhPoint_t pos;
|
|
||||||
SDL_Rect backrect;
|
|
||||||
PhRect_t windowextent;
|
|
||||||
int winchanged = 0;
|
|
||||||
|
|
||||||
if ((overlay == NULL) || (overlay->hwdata == NULL)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->hwdata->State == OVERLAY_STATE_UNINIT) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PtGetAbsPosition(window, &pos.x, &pos.y);
|
|
||||||
if ((pos.x != overlay->hwdata->CurrentWindowPos.x) ||
|
|
||||||
(pos.y != overlay->hwdata->CurrentWindowPos.y)) {
|
|
||||||
winchanged = 1;
|
|
||||||
overlay->hwdata->CurrentWindowPos.x = pos.x;
|
|
||||||
overlay->hwdata->CurrentWindowPos.y = pos.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If CurrentViewPort position/size has been changed, then move/resize the viewport */
|
|
||||||
if ((overlay->hwdata->CurrentViewPort.pos.x != dst->x) ||
|
|
||||||
(overlay->hwdata->CurrentViewPort.pos.y != dst->y) ||
|
|
||||||
(overlay->hwdata->CurrentViewPort.size.w != dst->w) ||
|
|
||||||
(overlay->hwdata->CurrentViewPort.size.h != dst->h) ||
|
|
||||||
(overlay->hwdata->scaler_on == 0) || (winchanged == 1) ||
|
|
||||||
(overlay->hwdata->forcedredraw == 1)) {
|
|
||||||
|
|
||||||
if (overlay->hwdata->ischromakey == 1) {
|
|
||||||
/* restore screen behind the overlay/chroma color. */
|
|
||||||
backrect.x = overlay->hwdata->CurrentViewPort.pos.x;
|
|
||||||
backrect.y = overlay->hwdata->CurrentViewPort.pos.y;
|
|
||||||
backrect.w = overlay->hwdata->CurrentViewPort.size.w;
|
|
||||||
backrect.h = overlay->hwdata->CurrentViewPort.size.h;
|
|
||||||
this->UpdateRects(this, 1, &backrect);
|
|
||||||
|
|
||||||
/* Draw the new rectangle of the chroma color at the viewport position */
|
|
||||||
PgSetFillColor(overlay->hwdata->chromakey);
|
|
||||||
PgDrawIRect(dst->x, dst->y, dst->x + dst->w - 1,
|
|
||||||
dst->y + dst->h - 1, Pg_DRAW_FILL);
|
|
||||||
PgFlush();
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->props.flags |= Pg_SCALER_PROP_SCALER_ENABLE;
|
|
||||||
overlay->hwdata->scaler_on = 1;
|
|
||||||
|
|
||||||
PhWindowQueryVisible(Ph_QUERY_CONSOLE, 0, PtWidgetRid(window),
|
|
||||||
&windowextent);
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.x =
|
|
||||||
pos.x - windowextent.ul.x + dst->x;
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.y =
|
|
||||||
pos.y - windowextent.ul.y + dst->y;
|
|
||||||
overlay->hwdata->CurrentViewPort.size.w = dst->w;
|
|
||||||
overlay->hwdata->CurrentViewPort.size.h = dst->h;
|
|
||||||
PhAreaToRect(&overlay->hwdata->CurrentViewPort,
|
|
||||||
&overlay->hwdata->props.viewport);
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.x = dst->x;
|
|
||||||
overlay->hwdata->CurrentViewPort.pos.y = dst->y;
|
|
||||||
|
|
||||||
rtncode =
|
|
||||||
PgConfigScalerChannel(overlay->hwdata->channel,
|
|
||||||
&(overlay->hwdata->props));
|
|
||||||
|
|
||||||
switch (rtncode) {
|
|
||||||
case -1:
|
|
||||||
SDL_SetError("PgConfigScalerChannel() function failed\n");
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return -1;
|
|
||||||
case 1:
|
|
||||||
grab_ptrs2(overlay->hwdata->channel,
|
|
||||||
overlay->hwdata->FrameData0,
|
|
||||||
overlay->hwdata->FrameData1);
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (overlay->hwdata->locked==0)
|
|
||||||
{
|
|
||||||
overlay->hwdata->current = PgNextVideoFrame(overlay->hwdata->channel);
|
|
||||||
if (overlay->hwdata->current == -1)
|
|
||||||
{
|
|
||||||
SDL_SetError("ph_LockYUVOverlay: PgNextFrame() failed, bailing out\n");
|
|
||||||
SDL_FreeYUVOverlay(overlay);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->hwdata->current == 0)
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
overlay->hwdata->CurrentFrameData = overlay->hwdata->FrameData1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->planes > 0)
|
|
||||||
{
|
|
||||||
overlay->pitches[0] = overlay->hwdata->channel->yplane1->pitch;
|
|
||||||
overlay->pixels[0] = overlay->hwdata->CurrentFrameData->Y;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 1)
|
|
||||||
{
|
|
||||||
overlay->pitches[1] = overlay->hwdata->channel->uplane1->pitch;
|
|
||||||
overlay->pixels[1] = overlay->hwdata->CurrentFrameData->U;
|
|
||||||
}
|
|
||||||
if (overlay->planes > 2)
|
|
||||||
{
|
|
||||||
overlay->pitches[2] = overlay->hwdata->channel->vplane1->pitch;
|
|
||||||
overlay->pixels[2] = overlay->hwdata->CurrentFrameData->V;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ph_FreeYUVOverlay(_THIS, SDL_Overlay * overlay)
|
|
||||||
{
|
|
||||||
SDL_Rect backrect;
|
|
||||||
|
|
||||||
if (overlay == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay->hwdata == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_overlay = NULL;
|
|
||||||
|
|
||||||
/* restore screen behind the overlay/chroma color. */
|
|
||||||
backrect.x = overlay->hwdata->CurrentViewPort.pos.x;
|
|
||||||
backrect.y = overlay->hwdata->CurrentViewPort.pos.y;
|
|
||||||
backrect.w = overlay->hwdata->CurrentViewPort.size.w;
|
|
||||||
backrect.h = overlay->hwdata->CurrentViewPort.size.h;
|
|
||||||
this->UpdateRects(this, 1, &backrect);
|
|
||||||
|
|
||||||
/* it is need for some buggy drivers, that can't hide overlay before */
|
|
||||||
/* freeing buffer, so we got trash on the srceen */
|
|
||||||
overlay->hwdata->props.flags &= ~Pg_SCALER_PROP_SCALER_ENABLE;
|
|
||||||
PgConfigScalerChannel(overlay->hwdata->channel,
|
|
||||||
&(overlay->hwdata->props));
|
|
||||||
|
|
||||||
overlay->hwdata->scaler_on = 0;
|
|
||||||
overlay->hwdata->State = OVERLAY_STATE_UNINIT;
|
|
||||||
|
|
||||||
if (overlay->hwdata->channel != NULL) {
|
|
||||||
PgDestroyVideoChannel(overlay->hwdata->channel);
|
|
||||||
overlay->hwdata->channel = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
overlay->hwdata->CurrentFrameData = NULL;
|
|
||||||
|
|
||||||
SDL_free(overlay->hwdata->FrameData0);
|
|
||||||
SDL_free(overlay->hwdata->FrameData1);
|
|
||||||
overlay->hwdata->FrameData0 = NULL;
|
|
||||||
overlay->hwdata->FrameData1 = NULL;
|
|
||||||
SDL_free(overlay->hwdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
SDL - Simple DirectMedia Layer
|
|
||||||
Copyright (C) 1997-2009 Sam Lantinga
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2.1 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
Sam Lantinga
|
|
||||||
slouken@libsdl.org
|
|
||||||
*/
|
|
||||||
#include "SDL_config.h"
|
|
||||||
|
|
||||||
#ifndef __SDL_PH_YUV_H__
|
|
||||||
#define __SDL_PH_YUV_H__
|
|
||||||
|
|
||||||
/* This is the photon implementation of YUV video overlays */
|
|
||||||
|
|
||||||
#include "SDL_video.h"
|
|
||||||
#include "SDL_ph_video.h"
|
|
||||||
|
|
||||||
struct private_yuvhwdata
|
|
||||||
{
|
|
||||||
FRAMEDATA *CurrentFrameData;
|
|
||||||
FRAMEDATA *FrameData0;
|
|
||||||
FRAMEDATA *FrameData1;
|
|
||||||
PgScalerProps_t props;
|
|
||||||
PgScalerCaps_t caps;
|
|
||||||
PgVideoChannel_t *channel;
|
|
||||||
PhArea_t CurrentViewPort;
|
|
||||||
PhPoint_t CurrentWindowPos;
|
|
||||||
long format;
|
|
||||||
int scaler_on;
|
|
||||||
int current;
|
|
||||||
long YStride;
|
|
||||||
long VStride;
|
|
||||||
long UStride;
|
|
||||||
int ischromakey;
|
|
||||||
long chromakey;
|
|
||||||
int forcedredraw;
|
|
||||||
unsigned long State;
|
|
||||||
long flags;
|
|
||||||
int locked;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern SDL_Overlay *ph_CreateYUVOverlay(_THIS, int width, int height,
|
|
||||||
Uint32 format, SDL_Surface * display);
|
|
||||||
extern int ph_LockYUVOverlay(_THIS, SDL_Overlay * overlay);
|
|
||||||
extern void ph_UnlockYUVOverlay(_THIS, SDL_Overlay * overlay);
|
|
||||||
extern int ph_DisplayYUVOverlay(_THIS, SDL_Overlay * overlay, SDL_Rect * src,
|
|
||||||
SDL_Rect * dst);
|
|
||||||
extern void ph_FreeYUVOverlay(_THIS, SDL_Overlay * overlay);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_YUV_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
|
@ -19,20 +19,17 @@
|
||||||
Sam Lantinga
|
Sam Lantinga
|
||||||
slouken@libsdl.org
|
slouken@libsdl.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SDL_config.h"
|
#include "SDL_config.h"
|
||||||
|
|
||||||
#ifndef __SDL_PH_EVENTS_H__
|
#include "../SDL_sysvideo.h"
|
||||||
#define __SDL_PH_EVENTS_H__
|
|
||||||
|
|
||||||
#include "SDL_ph_video.h"
|
VideoBootStrap qnxgf_bootstrap=
|
||||||
|
{
|
||||||
|
"QNXGF",
|
||||||
|
"QNX Graphics Framework",
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
#define PH_SDL_MAX_RECTS 256
|
|
||||||
#define PH_EVENT_SAFETY_POOL 512
|
|
||||||
#define EVENT_SIZE (sizeof(PhEvent_t) + 1000 + PH_EVENT_SAFETY_POOL)
|
|
||||||
|
|
||||||
/* Functions to be exported */
|
|
||||||
extern void ph_InitOSKeymap(_THIS);
|
|
||||||
extern void ph_PumpEvents(_THIS);
|
|
||||||
|
|
||||||
#endif /* __SDL_PH_EVENTS_H__ */
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
/* vi: set ts=4 sw=4 expandtab: */
|
Loading…
Add table
Add a link
Reference in a new issue