mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 08:34:40 +00:00
Add library SDL2
This commit is contained in:
parent
33a0579735
commit
674133ac86
767 changed files with 295058 additions and 10 deletions
1566
Engine/lib/sdl/src/video/SDL_RLEaccel.c
Normal file
1566
Engine/lib/sdl/src/video/SDL_RLEaccel.c
Normal file
File diff suppressed because it is too large
Load diff
31
Engine/lib/sdl/src/video/SDL_RLEaccel_c.h
Normal file
31
Engine/lib/sdl/src/video/SDL_RLEaccel_c.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
/* Useful functions and variables from SDL_RLEaccel.c */
|
||||
|
||||
extern int SDL_RLESurface(SDL_Surface * surface);
|
||||
extern int SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern int SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect);
|
||||
extern void SDL_UnRLESurface(SDL_Surface * surface, int recode);
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
286
Engine/lib/sdl/src/video/SDL_blit.c
Normal file
286
Engine/lib/sdl/src/video/SDL_blit.c
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_sysvideo.h"
|
||||
#include "SDL_blit.h"
|
||||
#include "SDL_blit_auto.h"
|
||||
#include "SDL_blit_copy.h"
|
||||
#include "SDL_blit_slow.h"
|
||||
#include "SDL_RLEaccel_c.h"
|
||||
#include "SDL_pixels_c.h"
|
||||
|
||||
/* The general purpose software blit routine */
|
||||
static int
|
||||
SDL_SoftBlit(SDL_Surface * src, SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, SDL_Rect * dstrect)
|
||||
{
|
||||
int okay;
|
||||
int src_locked;
|
||||
int dst_locked;
|
||||
|
||||
/* Everything is okay at the beginning... */
|
||||
okay = 1;
|
||||
|
||||
/* Lock the destination if it's in hardware */
|
||||
dst_locked = 0;
|
||||
if (SDL_MUSTLOCK(dst)) {
|
||||
if (SDL_LockSurface(dst) < 0) {
|
||||
okay = 0;
|
||||
} else {
|
||||
dst_locked = 1;
|
||||
}
|
||||
}
|
||||
/* Lock the source if it's in hardware */
|
||||
src_locked = 0;
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
if (SDL_LockSurface(src) < 0) {
|
||||
okay = 0;
|
||||
} else {
|
||||
src_locked = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up source and destination buffer pointers, and BLIT! */
|
||||
if (okay && !SDL_RectEmpty(srcrect)) {
|
||||
SDL_BlitFunc RunBlit;
|
||||
SDL_BlitInfo *info = &src->map->info;
|
||||
|
||||
/* Set up the blit information */
|
||||
info->src = (Uint8 *) src->pixels +
|
||||
(Uint16) srcrect->y * src->pitch +
|
||||
(Uint16) srcrect->x * info->src_fmt->BytesPerPixel;
|
||||
info->src_w = srcrect->w;
|
||||
info->src_h = srcrect->h;
|
||||
info->src_pitch = src->pitch;
|
||||
info->src_skip =
|
||||
info->src_pitch - info->src_w * info->src_fmt->BytesPerPixel;
|
||||
info->dst =
|
||||
(Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch +
|
||||
(Uint16) dstrect->x * info->dst_fmt->BytesPerPixel;
|
||||
info->dst_w = dstrect->w;
|
||||
info->dst_h = dstrect->h;
|
||||
info->dst_pitch = dst->pitch;
|
||||
info->dst_skip =
|
||||
info->dst_pitch - info->dst_w * info->dst_fmt->BytesPerPixel;
|
||||
RunBlit = (SDL_BlitFunc) src->map->data;
|
||||
|
||||
/* Run the actual software blit */
|
||||
RunBlit(info);
|
||||
}
|
||||
|
||||
/* We need to unlock the surfaces if they're locked */
|
||||
if (dst_locked) {
|
||||
SDL_UnlockSurface(dst);
|
||||
}
|
||||
if (src_locked) {
|
||||
SDL_UnlockSurface(src);
|
||||
}
|
||||
/* Blit is done! */
|
||||
return (okay ? 0 : -1);
|
||||
}
|
||||
|
||||
#ifdef __MACOSX__
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
static SDL_bool
|
||||
SDL_UseAltivecPrefetch()
|
||||
{
|
||||
const char key[] = "hw.l3cachesize";
|
||||
u_int64_t result = 0;
|
||||
size_t typeSize = sizeof(result);
|
||||
|
||||
if (sysctlbyname(key, &result, &typeSize, NULL, 0) == 0 && result > 0) {
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static SDL_bool
|
||||
SDL_UseAltivecPrefetch()
|
||||
{
|
||||
/* Just guess G4 */
|
||||
return SDL_TRUE;
|
||||
}
|
||||
#endif /* __MACOSX__ */
|
||||
|
||||
static SDL_BlitFunc
|
||||
SDL_ChooseBlitFunc(Uint32 src_format, Uint32 dst_format, int flags,
|
||||
SDL_BlitFuncEntry * entries)
|
||||
{
|
||||
int i, flagcheck;
|
||||
static Uint32 features = 0xffffffff;
|
||||
|
||||
/* Get the available CPU features */
|
||||
if (features == 0xffffffff) {
|
||||
const char *override = SDL_getenv("SDL_BLIT_CPU_FEATURES");
|
||||
|
||||
features = SDL_CPU_ANY;
|
||||
|
||||
/* Allow an override for testing .. */
|
||||
if (override) {
|
||||
SDL_sscanf(override, "%u", &features);
|
||||
} else {
|
||||
if (SDL_HasMMX()) {
|
||||
features |= SDL_CPU_MMX;
|
||||
}
|
||||
if (SDL_Has3DNow()) {
|
||||
features |= SDL_CPU_3DNOW;
|
||||
}
|
||||
if (SDL_HasSSE()) {
|
||||
features |= SDL_CPU_SSE;
|
||||
}
|
||||
if (SDL_HasSSE2()) {
|
||||
features |= SDL_CPU_SSE2;
|
||||
}
|
||||
if (SDL_HasAltiVec()) {
|
||||
if (SDL_UseAltivecPrefetch()) {
|
||||
features |= SDL_CPU_ALTIVEC_PREFETCH;
|
||||
} else {
|
||||
features |= SDL_CPU_ALTIVEC_NOPREFETCH;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; entries[i].func; ++i) {
|
||||
/* Check for matching pixel formats */
|
||||
if (src_format != entries[i].src_format) {
|
||||
continue;
|
||||
}
|
||||
if (dst_format != entries[i].dst_format) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check modulation flags */
|
||||
flagcheck =
|
||||
(flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA));
|
||||
if ((flagcheck & entries[i].flags) != flagcheck) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check blend flags */
|
||||
flagcheck =
|
||||
(flags &
|
||||
(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD));
|
||||
if ((flagcheck & entries[i].flags) != flagcheck) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check colorkey flag */
|
||||
flagcheck = (flags & SDL_COPY_COLORKEY);
|
||||
if ((flagcheck & entries[i].flags) != flagcheck) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check scaling flags */
|
||||
flagcheck = (flags & SDL_COPY_NEAREST);
|
||||
if ((flagcheck & entries[i].flags) != flagcheck) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check CPU features */
|
||||
flagcheck = entries[i].cpu;
|
||||
if ((flagcheck & features) != flagcheck) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We found the best one! */
|
||||
return entries[i].func;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Figure out which of many blit routines to set up on a surface */
|
||||
int
|
||||
SDL_CalculateBlit(SDL_Surface * surface)
|
||||
{
|
||||
SDL_BlitFunc blit = NULL;
|
||||
SDL_BlitMap *map = surface->map;
|
||||
SDL_Surface *dst = map->dst;
|
||||
|
||||
/* Clean everything out to start */
|
||||
if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
|
||||
SDL_UnRLESurface(surface, 1);
|
||||
}
|
||||
map->blit = SDL_SoftBlit;
|
||||
map->info.src_fmt = surface->format;
|
||||
map->info.src_pitch = surface->pitch;
|
||||
map->info.dst_fmt = dst->format;
|
||||
map->info.dst_pitch = dst->pitch;
|
||||
|
||||
/* See if we can do RLE acceleration */
|
||||
if (map->info.flags & SDL_COPY_RLE_DESIRED) {
|
||||
if (SDL_RLESurface(surface) == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Choose a standard blit function */
|
||||
if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) {
|
||||
blit = SDL_BlitCopy;
|
||||
} else if (surface->format->BitsPerPixel < 8 &&
|
||||
SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
|
||||
blit = SDL_CalculateBlit0(surface);
|
||||
} else if (surface->format->BytesPerPixel == 1 &&
|
||||
SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
|
||||
blit = SDL_CalculateBlit1(surface);
|
||||
} else if (map->info.flags & SDL_COPY_BLEND) {
|
||||
blit = SDL_CalculateBlitA(surface);
|
||||
} else {
|
||||
blit = SDL_CalculateBlitN(surface);
|
||||
}
|
||||
if (blit == NULL) {
|
||||
Uint32 src_format = surface->format->format;
|
||||
Uint32 dst_format = dst->format->format;
|
||||
|
||||
blit =
|
||||
SDL_ChooseBlitFunc(src_format, dst_format, map->info.flags,
|
||||
SDL_GeneratedBlitFuncTable);
|
||||
}
|
||||
#ifndef TEST_SLOW_BLIT
|
||||
if (blit == NULL)
|
||||
#endif
|
||||
{
|
||||
Uint32 src_format = surface->format->format;
|
||||
Uint32 dst_format = dst->format->format;
|
||||
|
||||
if (!SDL_ISPIXELFORMAT_INDEXED(src_format) &&
|
||||
!SDL_ISPIXELFORMAT_FOURCC(src_format) &&
|
||||
!SDL_ISPIXELFORMAT_INDEXED(dst_format) &&
|
||||
!SDL_ISPIXELFORMAT_FOURCC(dst_format)) {
|
||||
blit = SDL_Blit_Slow;
|
||||
}
|
||||
}
|
||||
map->data = blit;
|
||||
|
||||
/* Make sure we have a blit function */
|
||||
if (blit == NULL) {
|
||||
SDL_InvalidateMap(map);
|
||||
return SDL_SetError("Blit combination not supported");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
552
Engine/lib/sdl/src/video/SDL_blit.h
Normal file
552
Engine/lib/sdl/src/video/SDL_blit.h
Normal file
|
|
@ -0,0 +1,552 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_blit_h
|
||||
#define _SDL_blit_h
|
||||
|
||||
#include "SDL_cpuinfo.h"
|
||||
#include "SDL_endian.h"
|
||||
#include "SDL_surface.h"
|
||||
|
||||
/* Table to do pixel byte expansion */
|
||||
extern Uint8* SDL_expand_byte[9];
|
||||
|
||||
/* SDL blit copy flags */
|
||||
#define SDL_COPY_MODULATE_COLOR 0x00000001
|
||||
#define SDL_COPY_MODULATE_ALPHA 0x00000002
|
||||
#define SDL_COPY_BLEND 0x00000010
|
||||
#define SDL_COPY_ADD 0x00000020
|
||||
#define SDL_COPY_MOD 0x00000040
|
||||
#define SDL_COPY_COLORKEY 0x00000100
|
||||
#define SDL_COPY_NEAREST 0x00000200
|
||||
#define SDL_COPY_RLE_DESIRED 0x00001000
|
||||
#define SDL_COPY_RLE_COLORKEY 0x00002000
|
||||
#define SDL_COPY_RLE_ALPHAKEY 0x00004000
|
||||
#define SDL_COPY_RLE_MASK (SDL_COPY_RLE_DESIRED|SDL_COPY_RLE_COLORKEY|SDL_COPY_RLE_ALPHAKEY)
|
||||
|
||||
/* SDL blit CPU flags */
|
||||
#define SDL_CPU_ANY 0x00000000
|
||||
#define SDL_CPU_MMX 0x00000001
|
||||
#define SDL_CPU_3DNOW 0x00000002
|
||||
#define SDL_CPU_SSE 0x00000004
|
||||
#define SDL_CPU_SSE2 0x00000008
|
||||
#define SDL_CPU_ALTIVEC_PREFETCH 0x00000010
|
||||
#define SDL_CPU_ALTIVEC_NOPREFETCH 0x00000020
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Uint8 *src;
|
||||
int src_w, src_h;
|
||||
int src_pitch;
|
||||
int src_skip;
|
||||
Uint8 *dst;
|
||||
int dst_w, dst_h;
|
||||
int dst_pitch;
|
||||
int dst_skip;
|
||||
SDL_PixelFormat *src_fmt;
|
||||
SDL_PixelFormat *dst_fmt;
|
||||
Uint8 *table;
|
||||
int flags;
|
||||
Uint32 colorkey;
|
||||
Uint8 r, g, b, a;
|
||||
} SDL_BlitInfo;
|
||||
|
||||
typedef void (SDLCALL * SDL_BlitFunc) (SDL_BlitInfo * info);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Uint32 src_format;
|
||||
Uint32 dst_format;
|
||||
int flags;
|
||||
int cpu;
|
||||
SDL_BlitFunc func;
|
||||
} SDL_BlitFuncEntry;
|
||||
|
||||
/* Blit mapping definition */
|
||||
typedef struct SDL_BlitMap
|
||||
{
|
||||
SDL_Surface *dst;
|
||||
int identity;
|
||||
SDL_blit blit;
|
||||
void *data;
|
||||
SDL_BlitInfo info;
|
||||
|
||||
/* the version count matches the destination; mismatch indicates
|
||||
an invalid mapping */
|
||||
Uint32 dst_palette_version;
|
||||
Uint32 src_palette_version;
|
||||
} SDL_BlitMap;
|
||||
|
||||
/* Functions found in SDL_blit.c */
|
||||
extern int SDL_CalculateBlit(SDL_Surface * surface);
|
||||
|
||||
/* Functions found in SDL_blit_*.c */
|
||||
extern SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface * surface);
|
||||
extern SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface * surface);
|
||||
extern SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface * surface);
|
||||
extern SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface * surface);
|
||||
|
||||
/*
|
||||
* Useful macros for blitting routines
|
||||
*/
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define DECLARE_ALIGNED(t,v,a) t __attribute__((aligned(a))) v
|
||||
#elif defined(_MSC_VER)
|
||||
#define DECLARE_ALIGNED(t,v,a) __declspec(align(a)) t v
|
||||
#else
|
||||
#define DECLARE_ALIGNED(t,v,a) t v
|
||||
#endif
|
||||
|
||||
/* Load pixel of the specified format from a buffer and get its R-G-B values */
|
||||
#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \
|
||||
g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \
|
||||
b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB565(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0xF800)>>11)]; \
|
||||
g = SDL_expand_byte[2][((Pixel&0x07E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB555(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = SDL_expand_byte[3][((Pixel&0x7C00)>>10)]; \
|
||||
g = SDL_expand_byte[3][((Pixel&0x03E0)>>5)]; \
|
||||
b = SDL_expand_byte[3][(Pixel&0x001F)]; \
|
||||
}
|
||||
#define RGB_FROM_RGB888(Pixel, r, g, b) \
|
||||
{ \
|
||||
r = ((Pixel&0xFF0000)>>16); \
|
||||
g = ((Pixel&0xFF00)>>8); \
|
||||
b = (Pixel&0xFF); \
|
||||
}
|
||||
#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Uint8 *B = (Uint8 *)(buf); \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \
|
||||
} else { \
|
||||
Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
Pixel = 0; /* stop gcc complaints */ \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = 0; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Assemble R-G-B values into a specified pixel format and store them */
|
||||
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
fmt->Amask; \
|
||||
}
|
||||
#define RGB565_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
|
||||
}
|
||||
#define RGB555_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \
|
||||
}
|
||||
#define RGB888_FROM_RGB(Pixel, r, g, b) \
|
||||
{ \
|
||||
Pixel = (r<<16)|(g<<8)|b; \
|
||||
}
|
||||
#define ARGB8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(r<<16)|(g<<8)|b; \
|
||||
}
|
||||
#define RGBA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (r<<24)|(g<<16)|(b<<8)|a; \
|
||||
}
|
||||
#define ABGR8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (a<<24)|(b<<16)|(g<<8)|r; \
|
||||
}
|
||||
#define BGRA8888_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = (b<<24)|(g<<16)|(r<<8)|a; \
|
||||
}
|
||||
#define ARGB2101010_FROM_RGBA(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = r ? ((r << 2) | 0x3) : 0; \
|
||||
g = g ? ((g << 2) | 0x3) : 0; \
|
||||
b = b ? ((b << 2) | 0x3) : 0; \
|
||||
a = (a * 3) / 255; \
|
||||
Pixel = (a<<30)|(r<<20)|(g<<10)|b; \
|
||||
}
|
||||
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 1: { \
|
||||
Uint8 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint8 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* FIXME: Should we rescale alpha into 0..255 here? */
|
||||
#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
r = SDL_expand_byte[fmt->Rloss][((Pixel&fmt->Rmask)>>fmt->Rshift)]; \
|
||||
g = SDL_expand_byte[fmt->Gloss][((Pixel&fmt->Gmask)>>fmt->Gshift)]; \
|
||||
b = SDL_expand_byte[fmt->Bloss][((Pixel&fmt->Bmask)>>fmt->Bshift)]; \
|
||||
a = SDL_expand_byte[fmt->Aloss][((Pixel&fmt->Amask)>>fmt->Ashift)]; \
|
||||
}
|
||||
#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&fmt->Rmask)>>fmt->Rshift; \
|
||||
g = (Pixel&fmt->Gmask)>>fmt->Gshift; \
|
||||
b = (Pixel&fmt->Bmask)>>fmt->Bshift; \
|
||||
a = (Pixel&fmt->Amask)>>fmt->Ashift; \
|
||||
}
|
||||
#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel>>24); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = ((Pixel>>8)&0xFF); \
|
||||
a = (Pixel&0xFF); \
|
||||
}
|
||||
#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>16)&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = (Pixel&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
}
|
||||
#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = (Pixel&0xFF); \
|
||||
g = ((Pixel>>8)&0xFF); \
|
||||
b = ((Pixel>>16)&0xFF); \
|
||||
a = (Pixel>>24); \
|
||||
}
|
||||
#define RGBA_FROM_BGRA8888(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>8)&0xFF); \
|
||||
g = ((Pixel>>16)&0xFF); \
|
||||
b = (Pixel>>24); \
|
||||
a = (Pixel&0xFF); \
|
||||
}
|
||||
#define RGBA_FROM_ARGB2101010(Pixel, r, g, b, a) \
|
||||
{ \
|
||||
r = ((Pixel>>22)&0xFF); \
|
||||
g = ((Pixel>>12)&0xFF); \
|
||||
b = ((Pixel>>2)&0xFF); \
|
||||
a = SDL_expand_byte[6][(Pixel>>30)]; \
|
||||
}
|
||||
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \
|
||||
do { \
|
||||
switch (bpp) { \
|
||||
case 1: \
|
||||
Pixel = *((Uint8 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
case 2: \
|
||||
Pixel = *((Uint16 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
Pixel = 0; \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
r = *((buf)+fmt->Rshift/8); \
|
||||
g = *((buf)+fmt->Gshift/8); \
|
||||
b = *((buf)+fmt->Bshift/8); \
|
||||
} else { \
|
||||
r = *((buf)+2-fmt->Rshift/8); \
|
||||
g = *((buf)+2-fmt->Gshift/8); \
|
||||
b = *((buf)+2-fmt->Bshift/8); \
|
||||
} \
|
||||
a = 0xFF; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: \
|
||||
Pixel = *((Uint32 *)(buf)); \
|
||||
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
/* stop gcc complaints */ \
|
||||
Pixel = 0; \
|
||||
r = g = b = a = 0; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */
|
||||
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
|
||||
{ \
|
||||
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
|
||||
((g>>fmt->Gloss)<<fmt->Gshift)| \
|
||||
((b>>fmt->Bloss)<<fmt->Bshift)| \
|
||||
((a>>fmt->Aloss)<<fmt->Ashift); \
|
||||
}
|
||||
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
|
||||
{ \
|
||||
switch (bpp) { \
|
||||
case 1: { \
|
||||
Uint8 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint8 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 2: { \
|
||||
Uint16 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint16 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 3: { \
|
||||
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
|
||||
*((buf)+fmt->Rshift/8) = r; \
|
||||
*((buf)+fmt->Gshift/8) = g; \
|
||||
*((buf)+fmt->Bshift/8) = b; \
|
||||
} else { \
|
||||
*((buf)+2-fmt->Rshift/8) = r; \
|
||||
*((buf)+2-fmt->Gshift/8) = g; \
|
||||
*((buf)+2-fmt->Bshift/8) = b; \
|
||||
} \
|
||||
} \
|
||||
break; \
|
||||
\
|
||||
case 4: { \
|
||||
Uint32 Pixel; \
|
||||
\
|
||||
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
|
||||
*((Uint32 *)(buf)) = Pixel; \
|
||||
} \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Blend the RGB values of two pixels with an alpha value */
|
||||
#define ALPHA_BLEND_RGB(sR, sG, sB, A, dR, dG, dB) \
|
||||
do { \
|
||||
dR = ((((unsigned)(sR-dR)*(unsigned)A)/255)+dR); \
|
||||
dG = ((((unsigned)(sG-dG)*(unsigned)A)/255)+dG); \
|
||||
dB = ((((unsigned)(sB-dB)*(unsigned)A)/255)+dB); \
|
||||
} while(0)
|
||||
|
||||
|
||||
/* Blend the RGBA values of two pixels */
|
||||
#define ALPHA_BLEND_RGBA(sR, sG, sB, sA, dR, dG, dB, dA) \
|
||||
do { \
|
||||
dR = ((((unsigned)(sR-dR)*(unsigned)sA)/255)+dR); \
|
||||
dG = ((((unsigned)(sG-dG)*(unsigned)sA)/255)+dG); \
|
||||
dB = ((((unsigned)(sB-dB)*(unsigned)sA)/255)+dB); \
|
||||
dA = ((unsigned)sA+(unsigned)dA-((unsigned)sA*dA)/255); \
|
||||
} while(0)
|
||||
|
||||
|
||||
/* This is a very useful loop for optimizing blitters */
|
||||
#if defined(_MSC_VER) && (_MSC_VER == 1300)
|
||||
/* There's a bug in the Visual C++ 7 optimizer when compiling this code */
|
||||
#else
|
||||
#define USE_DUFFS_LOOP
|
||||
#endif
|
||||
#ifdef USE_DUFFS_LOOP
|
||||
|
||||
/* 8-times unrolled loop */
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
{ int n = (width+7)/8; \
|
||||
switch (width & 7) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 7: pixel_copy_increment; \
|
||||
case 6: pixel_copy_increment; \
|
||||
case 5: pixel_copy_increment; \
|
||||
case 4: pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while ( --n > 0 ); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* 4-times unrolled loop */
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
{ int n = (width+3)/4; \
|
||||
switch (width & 3) { \
|
||||
case 0: do { pixel_copy_increment; \
|
||||
case 3: pixel_copy_increment; \
|
||||
case 2: pixel_copy_increment; \
|
||||
case 1: pixel_copy_increment; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Use the 8-times version of the loop by default */
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP8(pixel_copy_increment, width)
|
||||
|
||||
/* Special version of Duff's device for even more optimization */
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
{ int n = width; \
|
||||
if (n & 1) { \
|
||||
pixel_copy_increment1; n -= 1; \
|
||||
} \
|
||||
if (n & 2) { \
|
||||
pixel_copy_increment2; n -= 2; \
|
||||
} \
|
||||
if (n & 4) { \
|
||||
pixel_copy_increment4; n -= 4; \
|
||||
} \
|
||||
if (n) { \
|
||||
n /= 8; \
|
||||
do { \
|
||||
pixel_copy_increment4; \
|
||||
pixel_copy_increment4; \
|
||||
} while (--n > 0); \
|
||||
} \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* Don't use Duff's device to unroll loops */
|
||||
#define DUFFS_LOOP(pixel_copy_increment, width) \
|
||||
{ int n; \
|
||||
for ( n=width; n > 0; --n ) { \
|
||||
pixel_copy_increment; \
|
||||
} \
|
||||
}
|
||||
#define DUFFS_LOOP8(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment, width)
|
||||
#define DUFFS_LOOP4(pixel_copy_increment, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment, width)
|
||||
#define DUFFS_LOOP_124(pixel_copy_increment1, \
|
||||
pixel_copy_increment2, \
|
||||
pixel_copy_increment4, width) \
|
||||
DUFFS_LOOP(pixel_copy_increment1, width)
|
||||
|
||||
#endif /* USE_DUFFS_LOOP */
|
||||
|
||||
/* Prevent Visual C++ 6.0 from printing out stupid warnings */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 600)
|
||||
#pragma warning(disable: 4550)
|
||||
#endif
|
||||
|
||||
#endif /* _SDL_blit_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
483
Engine/lib/sdl/src/video/SDL_blit_0.c
Normal file
483
Engine/lib/sdl/src/video/SDL_blit_0.c
Normal file
|
|
@ -0,0 +1,483 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
|
||||
/* Functions to blit from bitmaps to other surfaces */
|
||||
|
||||
static void
|
||||
BlitBto1(SDL_BlitInfo * info)
|
||||
{
|
||||
int c;
|
||||
int width, height;
|
||||
Uint8 *src, *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = info->dst;
|
||||
dstskip = info->dst_skip;
|
||||
map = info->table;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
if (map) {
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
*dst = map[bit];
|
||||
}
|
||||
dst++;
|
||||
byte <<= 1;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
} else {
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
*dst = bit;
|
||||
}
|
||||
dst++;
|
||||
byte <<= 1;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto2(SDL_BlitInfo * info)
|
||||
{
|
||||
int c;
|
||||
int width, height;
|
||||
Uint8 *src;
|
||||
Uint16 *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = (Uint16 *) info->dst;
|
||||
dstskip = info->dst_skip / 2;
|
||||
map = (Uint16 *) info->table;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
*dst = map[bit];
|
||||
}
|
||||
byte <<= 1;
|
||||
dst++;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto3(SDL_BlitInfo * info)
|
||||
{
|
||||
int c, o;
|
||||
int width, height;
|
||||
Uint8 *src, *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = info->dst;
|
||||
dstskip = info->dst_skip;
|
||||
map = info->table;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
o = bit * 4;
|
||||
dst[0] = map[o++];
|
||||
dst[1] = map[o++];
|
||||
dst[2] = map[o++];
|
||||
}
|
||||
byte <<= 1;
|
||||
dst += 3;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto4(SDL_BlitInfo * info)
|
||||
{
|
||||
int width, height;
|
||||
Uint8 *src;
|
||||
Uint32 *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
int c;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = (Uint32 *) info->dst;
|
||||
dstskip = info->dst_skip / 4;
|
||||
map = (Uint32 *) info->table;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
*dst = map[bit];
|
||||
}
|
||||
byte <<= 1;
|
||||
dst++;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto1Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint8 *dst = info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint32 ckey = info->colorkey;
|
||||
Uint8 *palmap = info->table;
|
||||
int c;
|
||||
|
||||
/* Set up some basic variables */
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
if (palmap) {
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
*dst = palmap[bit];
|
||||
}
|
||||
dst++;
|
||||
byte <<= 1;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
} else {
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
*dst = bit;
|
||||
}
|
||||
dst++;
|
||||
byte <<= 1;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto2Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint16 *dstp = (Uint16 *) info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint32 ckey = info->colorkey;
|
||||
Uint8 *palmap = info->table;
|
||||
int c;
|
||||
|
||||
/* Set up some basic variables */
|
||||
srcskip += width - (width + 7) / 8;
|
||||
dstskip /= 2;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
*dstp = ((Uint16 *) palmap)[bit];
|
||||
}
|
||||
byte <<= 1;
|
||||
dstp++;
|
||||
}
|
||||
src += srcskip;
|
||||
dstp += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto3Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint8 *dst = info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint32 ckey = info->colorkey;
|
||||
Uint8 *palmap = info->table;
|
||||
int c;
|
||||
|
||||
/* Set up some basic variables */
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
SDL_memcpy(dst, &palmap[bit * 4], 3);
|
||||
}
|
||||
byte <<= 1;
|
||||
dst += 3;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBto4Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint32 *dstp = (Uint32 *) info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint32 ckey = info->colorkey;
|
||||
Uint8 *palmap = info->table;
|
||||
int c;
|
||||
|
||||
/* Set up some basic variables */
|
||||
srcskip += width - (width + 7) / 8;
|
||||
dstskip /= 4;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
*dstp = ((Uint32 *) palmap)[bit];
|
||||
}
|
||||
byte <<= 1;
|
||||
dstp++;
|
||||
}
|
||||
src += srcskip;
|
||||
dstp += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBtoNAlpha(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint8 *dst = info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
const SDL_Color *srcpal = info->src_fmt->palette->colors;
|
||||
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
||||
int dstbpp;
|
||||
int c;
|
||||
Uint32 pixel;
|
||||
unsigned sR, sG, sB;
|
||||
unsigned dR, dG, dB, dA;
|
||||
const unsigned A = info->a;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstbpp = dstfmt->BytesPerPixel;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (1) {
|
||||
sR = srcpal[bit].r;
|
||||
sG = srcpal[bit].g;
|
||||
sB = srcpal[bit].b;
|
||||
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
|
||||
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
|
||||
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
|
||||
}
|
||||
byte <<= 1;
|
||||
dst += dstbpp;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
BlitBtoNAlphaKey(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
Uint8 *dst = info->dst;
|
||||
int srcskip = info->src_skip;
|
||||
int dstskip = info->dst_skip;
|
||||
SDL_PixelFormat *srcfmt = info->src_fmt;
|
||||
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
||||
const SDL_Color *srcpal = srcfmt->palette->colors;
|
||||
int dstbpp;
|
||||
int c;
|
||||
Uint32 pixel;
|
||||
unsigned sR, sG, sB;
|
||||
unsigned dR, dG, dB, dA;
|
||||
const unsigned A = info->a;
|
||||
Uint32 ckey = info->colorkey;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstbpp = dstfmt->BytesPerPixel;
|
||||
srcskip += width - (width + 7) / 8;
|
||||
|
||||
while (height--) {
|
||||
Uint8 byte = 0, bit;
|
||||
for (c = 0; c < width; ++c) {
|
||||
if ((c & 7) == 0) {
|
||||
byte = *src++;
|
||||
}
|
||||
bit = (byte & 0x80) >> 7;
|
||||
if (bit != ckey) {
|
||||
sR = srcpal[bit].r;
|
||||
sG = srcpal[bit].g;
|
||||
sB = srcpal[bit].b;
|
||||
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
|
||||
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
|
||||
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
|
||||
}
|
||||
byte <<= 1;
|
||||
dst += dstbpp;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static const SDL_BlitFunc bitmap_blit[] = {
|
||||
(SDL_BlitFunc) NULL, BlitBto1, BlitBto2, BlitBto3, BlitBto4
|
||||
};
|
||||
|
||||
static const SDL_BlitFunc colorkey_blit[] = {
|
||||
(SDL_BlitFunc) NULL, BlitBto1Key, BlitBto2Key, BlitBto3Key, BlitBto4Key
|
||||
};
|
||||
|
||||
SDL_BlitFunc
|
||||
SDL_CalculateBlit0(SDL_Surface * surface)
|
||||
{
|
||||
int which;
|
||||
|
||||
if (surface->format->BitsPerPixel != 1) {
|
||||
/* We don't support sub 8-bit packed pixel modes */
|
||||
return (SDL_BlitFunc) NULL;
|
||||
}
|
||||
if (surface->map->dst->format->BitsPerPixel < 8) {
|
||||
which = 0;
|
||||
} else {
|
||||
which = surface->map->dst->format->BytesPerPixel;
|
||||
}
|
||||
switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {
|
||||
case 0:
|
||||
return bitmap_blit[which];
|
||||
|
||||
case SDL_COPY_COLORKEY:
|
||||
return colorkey_blit[which];
|
||||
|
||||
case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:
|
||||
return which >= 2 ? BlitBtoNAlpha : (SDL_BlitFunc) NULL;
|
||||
|
||||
case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:
|
||||
return which >= 2 ? BlitBtoNAlphaKey : (SDL_BlitFunc) NULL;
|
||||
}
|
||||
return (SDL_BlitFunc) NULL;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
550
Engine/lib/sdl/src/video/SDL_blit_1.c
Normal file
550
Engine/lib/sdl/src/video/SDL_blit_1.c
Normal file
|
|
@ -0,0 +1,550 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
#include "SDL_sysvideo.h"
|
||||
#include "SDL_endian.h"
|
||||
|
||||
/* Functions to blit from 8-bit surfaces to other surfaces */
|
||||
|
||||
static void
|
||||
Blit1to1(SDL_BlitInfo * info)
|
||||
{
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
int c;
|
||||
#endif
|
||||
int width, height;
|
||||
Uint8 *src, *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = info->dst;
|
||||
dstskip = info->dst_skip;
|
||||
map = info->table;
|
||||
|
||||
while (height--) {
|
||||
#ifdef USE_DUFFS_LOOP
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
*dst = map[*src];
|
||||
}
|
||||
dst++;
|
||||
src++;
|
||||
, width);
|
||||
/* *INDENT-ON* */
|
||||
#else
|
||||
for (c = width; c; --c) {
|
||||
*dst = map[*src];
|
||||
dst++;
|
||||
src++;
|
||||
}
|
||||
#endif
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is now endian dependent */
|
||||
#if ( SDL_BYTEORDER == SDL_LIL_ENDIAN )
|
||||
#define HI 1
|
||||
#define LO 0
|
||||
#else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */
|
||||
#define HI 0
|
||||
#define LO 1
|
||||
#endif
|
||||
static void
|
||||
Blit1to2(SDL_BlitInfo * info)
|
||||
{
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
int c;
|
||||
#endif
|
||||
int width, height;
|
||||
Uint8 *src, *dst;
|
||||
Uint16 *map;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = info->dst;
|
||||
dstskip = info->dst_skip;
|
||||
map = (Uint16 *) info->table;
|
||||
|
||||
#ifdef USE_DUFFS_LOOP
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
*(Uint16 *)dst = map[*src++];
|
||||
dst += 2;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
#else
|
||||
/* Memory align at 4-byte boundary, if necessary */
|
||||
if ((long) dst & 0x03) {
|
||||
/* Don't do anything if width is 0 */
|
||||
if (width == 0) {
|
||||
return;
|
||||
}
|
||||
--width;
|
||||
|
||||
while (height--) {
|
||||
/* Perform copy alignment */
|
||||
*(Uint16 *) dst = map[*src++];
|
||||
dst += 2;
|
||||
|
||||
/* Copy in 4 pixel chunks */
|
||||
for (c = width / 4; c; --c) {
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
/* Get any leftovers */
|
||||
switch (width & 3) {
|
||||
case 3:
|
||||
*(Uint16 *) dst = map[*src++];
|
||||
dst += 2;
|
||||
case 2:
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
break;
|
||||
case 1:
|
||||
*(Uint16 *) dst = map[*src++];
|
||||
dst += 2;
|
||||
break;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
} else {
|
||||
while (height--) {
|
||||
/* Copy in 4 pixel chunks */
|
||||
for (c = width / 4; c; --c) {
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
}
|
||||
/* Get any leftovers */
|
||||
switch (width & 3) {
|
||||
case 3:
|
||||
*(Uint16 *) dst = map[*src++];
|
||||
dst += 2;
|
||||
case 2:
|
||||
*(Uint32 *) dst = (map[src[HI]] << 16) | (map[src[LO]]);
|
||||
src += 2;
|
||||
dst += 4;
|
||||
break;
|
||||
case 1:
|
||||
*(Uint16 *) dst = map[*src++];
|
||||
dst += 2;
|
||||
break;
|
||||
}
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
#endif /* USE_DUFFS_LOOP */
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to3(SDL_BlitInfo * info)
|
||||
{
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
int c;
|
||||
#endif
|
||||
int o;
|
||||
int width, height;
|
||||
Uint8 *src, *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = info->dst;
|
||||
dstskip = info->dst_skip;
|
||||
map = info->table;
|
||||
|
||||
while (height--) {
|
||||
#ifdef USE_DUFFS_LOOP
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
o = *src * 4;
|
||||
dst[0] = map[o++];
|
||||
dst[1] = map[o++];
|
||||
dst[2] = map[o++];
|
||||
}
|
||||
src++;
|
||||
dst += 3;
|
||||
, width);
|
||||
/* *INDENT-ON* */
|
||||
#else
|
||||
for (c = width; c; --c) {
|
||||
o = *src * 4;
|
||||
dst[0] = map[o++];
|
||||
dst[1] = map[o++];
|
||||
dst[2] = map[o++];
|
||||
src++;
|
||||
dst += 3;
|
||||
}
|
||||
#endif /* USE_DUFFS_LOOP */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to4(SDL_BlitInfo * info)
|
||||
{
|
||||
#ifndef USE_DUFFS_LOOP
|
||||
int c;
|
||||
#endif
|
||||
int width, height;
|
||||
Uint8 *src;
|
||||
Uint32 *map, *dst;
|
||||
int srcskip, dstskip;
|
||||
|
||||
/* Set up some basic variables */
|
||||
width = info->dst_w;
|
||||
height = info->dst_h;
|
||||
src = info->src;
|
||||
srcskip = info->src_skip;
|
||||
dst = (Uint32 *) info->dst;
|
||||
dstskip = info->dst_skip / 4;
|
||||
map = (Uint32 *) info->table;
|
||||
|
||||
while (height--) {
|
||||
#ifdef USE_DUFFS_LOOP
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
*dst++ = map[*src++];
|
||||
, width);
|
||||
/* *INDENT-ON* */
|
||||
#else
|
||||
for (c = width / 4; c; --c) {
|
||||
*dst++ = map[*src++];
|
||||
*dst++ = map[*src++];
|
||||
*dst++ = map[*src++];
|
||||
*dst++ = map[*src++];
|
||||
}
|
||||
switch (width & 3) {
|
||||
case 3:
|
||||
*dst++ = map[*src++];
|
||||
case 2:
|
||||
*dst++ = map[*src++];
|
||||
case 1:
|
||||
*dst++ = map[*src++];
|
||||
}
|
||||
#endif /* USE_DUFFS_LOOP */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to1Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint8 *dst = info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint8 *palmap = info->table;
|
||||
Uint32 ckey = info->colorkey;
|
||||
|
||||
if (palmap) {
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
*dst = palmap[*src];
|
||||
}
|
||||
dst++;
|
||||
src++;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
} else {
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
*dst = *src;
|
||||
}
|
||||
dst++;
|
||||
src++;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to2Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint16 *dstp = (Uint16 *) info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint16 *palmap = (Uint16 *) info->table;
|
||||
Uint32 ckey = info->colorkey;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstskip /= 2;
|
||||
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
*dstp=palmap[*src];
|
||||
}
|
||||
src++;
|
||||
dstp++;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dstp += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to3Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint8 *dst = info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint8 *palmap = info->table;
|
||||
Uint32 ckey = info->colorkey;
|
||||
int o;
|
||||
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
o = *src * 4;
|
||||
dst[0] = palmap[o++];
|
||||
dst[1] = palmap[o++];
|
||||
dst[2] = palmap[o++];
|
||||
}
|
||||
src++;
|
||||
dst += 3;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1to4Key(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint32 *dstp = (Uint32 *) info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
Uint32 *palmap = (Uint32 *) info->table;
|
||||
Uint32 ckey = info->colorkey;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstskip /= 4;
|
||||
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
*dstp = palmap[*src];
|
||||
}
|
||||
src++;
|
||||
dstp++;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dstp += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1toNAlpha(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint8 *dst = info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
||||
const SDL_Color *srcpal = info->src_fmt->palette->colors;
|
||||
int dstbpp;
|
||||
Uint32 pixel;
|
||||
unsigned sR, sG, sB;
|
||||
unsigned dR, dG, dB, dA;
|
||||
const unsigned A = info->a;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstbpp = dstfmt->BytesPerPixel;
|
||||
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP4(
|
||||
{
|
||||
sR = srcpal[*src].r;
|
||||
sG = srcpal[*src].g;
|
||||
sB = srcpal[*src].b;
|
||||
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
|
||||
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
|
||||
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
|
||||
src++;
|
||||
dst += dstbpp;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Blit1toNAlphaKey(SDL_BlitInfo * info)
|
||||
{
|
||||
int width = info->dst_w;
|
||||
int height = info->dst_h;
|
||||
Uint8 *src = info->src;
|
||||
int srcskip = info->src_skip;
|
||||
Uint8 *dst = info->dst;
|
||||
int dstskip = info->dst_skip;
|
||||
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
||||
const SDL_Color *srcpal = info->src_fmt->palette->colors;
|
||||
Uint32 ckey = info->colorkey;
|
||||
int dstbpp;
|
||||
Uint32 pixel;
|
||||
unsigned sR, sG, sB;
|
||||
unsigned dR, dG, dB, dA;
|
||||
const unsigned A = info->a;
|
||||
|
||||
/* Set up some basic variables */
|
||||
dstbpp = dstfmt->BytesPerPixel;
|
||||
|
||||
while (height--) {
|
||||
/* *INDENT-OFF* */
|
||||
DUFFS_LOOP(
|
||||
{
|
||||
if ( *src != ckey ) {
|
||||
sR = srcpal[*src].r;
|
||||
sG = srcpal[*src].g;
|
||||
sB = srcpal[*src].b;
|
||||
DISEMBLE_RGBA(dst, dstbpp, dstfmt, pixel, dR, dG, dB, dA);
|
||||
ALPHA_BLEND_RGBA(sR, sG, sB, A, dR, dG, dB, dA);
|
||||
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, dR, dG, dB, dA);
|
||||
}
|
||||
src++;
|
||||
dst += dstbpp;
|
||||
},
|
||||
width);
|
||||
/* *INDENT-ON* */
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
static const SDL_BlitFunc one_blit[] = {
|
||||
(SDL_BlitFunc) NULL, Blit1to1, Blit1to2, Blit1to3, Blit1to4
|
||||
};
|
||||
|
||||
static const SDL_BlitFunc one_blitkey[] = {
|
||||
(SDL_BlitFunc) NULL, Blit1to1Key, Blit1to2Key, Blit1to3Key, Blit1to4Key
|
||||
};
|
||||
|
||||
SDL_BlitFunc
|
||||
SDL_CalculateBlit1(SDL_Surface * surface)
|
||||
{
|
||||
int which;
|
||||
SDL_PixelFormat *dstfmt;
|
||||
|
||||
dstfmt = surface->map->dst->format;
|
||||
if (dstfmt->BitsPerPixel < 8) {
|
||||
which = 0;
|
||||
} else {
|
||||
which = dstfmt->BytesPerPixel;
|
||||
}
|
||||
switch (surface->map->info.flags & ~SDL_COPY_RLE_MASK) {
|
||||
case 0:
|
||||
return one_blit[which];
|
||||
|
||||
case SDL_COPY_COLORKEY:
|
||||
return one_blitkey[which];
|
||||
|
||||
case SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:
|
||||
/* Supporting 8bpp->8bpp alpha is doable but requires lots of
|
||||
tables which consume space and takes time to precompute,
|
||||
so is better left to the user */
|
||||
return which >= 2 ? Blit1toNAlpha : (SDL_BlitFunc) NULL;
|
||||
|
||||
case SDL_COPY_COLORKEY | SDL_COPY_MODULATE_ALPHA | SDL_COPY_BLEND:
|
||||
return which >= 2 ? Blit1toNAlphaKey : (SDL_BlitFunc) NULL;
|
||||
}
|
||||
return (SDL_BlitFunc) NULL;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1388
Engine/lib/sdl/src/video/SDL_blit_A.c
Normal file
1388
Engine/lib/sdl/src/video/SDL_blit_A.c
Normal file
File diff suppressed because it is too large
Load diff
2601
Engine/lib/sdl/src/video/SDL_blit_N.c
Normal file
2601
Engine/lib/sdl/src/video/SDL_blit_N.c
Normal file
File diff suppressed because it is too large
Load diff
7563
Engine/lib/sdl/src/video/SDL_blit_auto.c
Normal file
7563
Engine/lib/sdl/src/video/SDL_blit_auto.c
Normal file
File diff suppressed because it is too large
Load diff
30
Engine/lib/sdl/src/video/SDL_blit_auto.h
Normal file
30
Engine/lib/sdl/src/video/SDL_blit_auto.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* DO NOT EDIT! This file is generated by sdlgenblit.pl */
|
||||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
extern SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[];
|
||||
|
||||
/* *INDENT-ON* */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
152
Engine/lib/sdl/src/video/SDL_blit_copy.c
Normal file
152
Engine/lib/sdl/src/video/SDL_blit_copy.c
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
#include "SDL_blit_copy.h"
|
||||
|
||||
|
||||
#ifdef __SSE__
|
||||
/* This assumes 16-byte aligned src and dst */
|
||||
static SDL_INLINE void
|
||||
SDL_memcpySSE(Uint8 * dst, const Uint8 * src, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
__m128 values[4];
|
||||
for (i = len / 64; i--;) {
|
||||
_mm_prefetch(src, _MM_HINT_NTA);
|
||||
values[0] = *(__m128 *) (src + 0);
|
||||
values[1] = *(__m128 *) (src + 16);
|
||||
values[2] = *(__m128 *) (src + 32);
|
||||
values[3] = *(__m128 *) (src + 48);
|
||||
_mm_stream_ps((float *) (dst + 0), values[0]);
|
||||
_mm_stream_ps((float *) (dst + 16), values[1]);
|
||||
_mm_stream_ps((float *) (dst + 32), values[2]);
|
||||
_mm_stream_ps((float *) (dst + 48), values[3]);
|
||||
src += 64;
|
||||
dst += 64;
|
||||
}
|
||||
|
||||
if (len & 63)
|
||||
SDL_memcpy(dst, src, len & 63);
|
||||
}
|
||||
#endif /* __SSE__ */
|
||||
|
||||
#ifdef __MMX__
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4799)
|
||||
#endif
|
||||
static SDL_INLINE void
|
||||
SDL_memcpyMMX(Uint8 * dst, const Uint8 * src, int len)
|
||||
{
|
||||
const int remain = (len & 63);
|
||||
int i;
|
||||
|
||||
__m64* d64 = (__m64*)dst;
|
||||
__m64* s64 = (__m64*)src;
|
||||
|
||||
for(i= len / 64; i--;) {
|
||||
d64[0] = s64[0];
|
||||
d64[1] = s64[1];
|
||||
d64[2] = s64[2];
|
||||
d64[3] = s64[3];
|
||||
d64[4] = s64[4];
|
||||
d64[5] = s64[5];
|
||||
d64[6] = s64[6];
|
||||
d64[7] = s64[7];
|
||||
|
||||
d64 += 8;
|
||||
s64 += 8;
|
||||
}
|
||||
|
||||
if (remain)
|
||||
{
|
||||
const int skip = len - remain;
|
||||
SDL_memcpy(dst + skip, src + skip, remain);
|
||||
}
|
||||
}
|
||||
#endif /* __MMX__ */
|
||||
|
||||
void
|
||||
SDL_BlitCopy(SDL_BlitInfo * info)
|
||||
{
|
||||
SDL_bool overlap;
|
||||
Uint8 *src, *dst;
|
||||
int w, h;
|
||||
int srcskip, dstskip;
|
||||
|
||||
w = info->dst_w * info->dst_fmt->BytesPerPixel;
|
||||
h = info->dst_h;
|
||||
src = info->src;
|
||||
dst = info->dst;
|
||||
srcskip = info->src_pitch;
|
||||
dstskip = info->dst_pitch;
|
||||
|
||||
/* Properly handle overlapping blits */
|
||||
if (src < dst) {
|
||||
overlap = (dst < (src + h*srcskip));
|
||||
} else {
|
||||
overlap = (src < (dst + h*dstskip));
|
||||
}
|
||||
if (overlap) {
|
||||
while (h--) {
|
||||
SDL_memmove(dst, src, w);
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef __SSE__
|
||||
if (SDL_HasSSE() &&
|
||||
!((uintptr_t) src & 15) && !(srcskip & 15) &&
|
||||
!((uintptr_t) dst & 15) && !(dstskip & 15)) {
|
||||
while (h--) {
|
||||
SDL_memcpySSE(dst, src, w);
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __MMX__
|
||||
if (SDL_HasMMX() && !(srcskip & 7) && !(dstskip & 7)) {
|
||||
while (h--) {
|
||||
SDL_memcpyMMX(dst, src, w);
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
_mm_empty();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (h--) {
|
||||
SDL_memcpy(dst, src, w);
|
||||
src += srcskip;
|
||||
dst += dstskip;
|
||||
}
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
24
Engine/lib/sdl/src/video/SDL_blit_copy.h
Normal file
24
Engine/lib/sdl/src/video/SDL_blit_copy.h
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
void SDL_BlitCopy(SDL_BlitInfo * info);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
161
Engine/lib/sdl/src/video/SDL_blit_slow.c
Normal file
161
Engine/lib/sdl/src/video/SDL_blit_slow.c
Normal file
|
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
#include "SDL_blit_slow.h"
|
||||
|
||||
/* The ONE TRUE BLITTER
|
||||
* This puppy has to handle all the unoptimized cases - yes, it's slow.
|
||||
*/
|
||||
void
|
||||
SDL_Blit_Slow(SDL_BlitInfo * info)
|
||||
{
|
||||
const int flags = info->flags;
|
||||
const Uint32 modulateR = info->r;
|
||||
const Uint32 modulateG = info->g;
|
||||
const Uint32 modulateB = info->b;
|
||||
const Uint32 modulateA = info->a;
|
||||
Uint32 srcpixel;
|
||||
Uint32 srcR, srcG, srcB, srcA;
|
||||
Uint32 dstpixel;
|
||||
Uint32 dstR, dstG, dstB, dstA;
|
||||
int srcy, srcx;
|
||||
int posy, posx;
|
||||
int incy, incx;
|
||||
SDL_PixelFormat *src_fmt = info->src_fmt;
|
||||
SDL_PixelFormat *dst_fmt = info->dst_fmt;
|
||||
int srcbpp = src_fmt->BytesPerPixel;
|
||||
int dstbpp = dst_fmt->BytesPerPixel;
|
||||
|
||||
srcy = 0;
|
||||
posy = 0;
|
||||
incy = (info->src_h << 16) / info->dst_h;
|
||||
incx = (info->src_w << 16) / info->dst_w;
|
||||
|
||||
while (info->dst_h--) {
|
||||
Uint8 *src = 0;
|
||||
Uint8 *dst = (Uint8 *) info->dst;
|
||||
int n = info->dst_w;
|
||||
srcx = -1;
|
||||
posx = 0x10000L;
|
||||
while (posy >= 0x10000L) {
|
||||
++srcy;
|
||||
posy -= 0x10000L;
|
||||
}
|
||||
while (n--) {
|
||||
if (posx >= 0x10000L) {
|
||||
while (posx >= 0x10000L) {
|
||||
++srcx;
|
||||
posx -= 0x10000L;
|
||||
}
|
||||
src =
|
||||
(info->src + (srcy * info->src_pitch) + (srcx * srcbpp));
|
||||
}
|
||||
if (src_fmt->Amask) {
|
||||
DISEMBLE_RGBA(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
|
||||
srcB, srcA);
|
||||
} else {
|
||||
DISEMBLE_RGB(src, srcbpp, src_fmt, srcpixel, srcR, srcG,
|
||||
srcB);
|
||||
srcA = 0xFF;
|
||||
}
|
||||
if (flags & SDL_COPY_COLORKEY) {
|
||||
/* srcpixel isn't set for 24 bpp */
|
||||
if (srcbpp == 3) {
|
||||
srcpixel = (srcR << src_fmt->Rshift) |
|
||||
(srcG << src_fmt->Gshift) | (srcB << src_fmt->Bshift);
|
||||
}
|
||||
if (srcpixel == info->colorkey) {
|
||||
posx += incx;
|
||||
dst += dstbpp;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (dst_fmt->Amask) {
|
||||
DISEMBLE_RGBA(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
|
||||
dstB, dstA);
|
||||
} else {
|
||||
DISEMBLE_RGB(dst, dstbpp, dst_fmt, dstpixel, dstR, dstG,
|
||||
dstB);
|
||||
dstA = 0xFF;
|
||||
}
|
||||
|
||||
if (flags & SDL_COPY_MODULATE_COLOR) {
|
||||
srcR = (srcR * modulateR) / 255;
|
||||
srcG = (srcG * modulateG) / 255;
|
||||
srcB = (srcB * modulateB) / 255;
|
||||
}
|
||||
if (flags & SDL_COPY_MODULATE_ALPHA) {
|
||||
srcA = (srcA * modulateA) / 255;
|
||||
}
|
||||
if (flags & (SDL_COPY_BLEND | SDL_COPY_ADD)) {
|
||||
/* This goes away if we ever use premultiplied alpha */
|
||||
if (srcA < 255) {
|
||||
srcR = (srcR * srcA) / 255;
|
||||
srcG = (srcG * srcA) / 255;
|
||||
srcB = (srcB * srcA) / 255;
|
||||
}
|
||||
}
|
||||
switch (flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {
|
||||
case 0:
|
||||
dstR = srcR;
|
||||
dstG = srcG;
|
||||
dstB = srcB;
|
||||
dstA = srcA;
|
||||
break;
|
||||
case SDL_COPY_BLEND:
|
||||
dstR = srcR + ((255 - srcA) * dstR) / 255;
|
||||
dstG = srcG + ((255 - srcA) * dstG) / 255;
|
||||
dstB = srcB + ((255 - srcA) * dstB) / 255;
|
||||
break;
|
||||
case SDL_COPY_ADD:
|
||||
dstR = srcR + dstR;
|
||||
if (dstR > 255)
|
||||
dstR = 255;
|
||||
dstG = srcG + dstG;
|
||||
if (dstG > 255)
|
||||
dstG = 255;
|
||||
dstB = srcB + dstB;
|
||||
if (dstB > 255)
|
||||
dstB = 255;
|
||||
break;
|
||||
case SDL_COPY_MOD:
|
||||
dstR = (srcR * dstR) / 255;
|
||||
dstG = (srcG * dstG) / 255;
|
||||
dstB = (srcB * dstB) / 255;
|
||||
break;
|
||||
}
|
||||
if (dst_fmt->Amask) {
|
||||
ASSEMBLE_RGBA(dst, dstbpp, dst_fmt, dstR, dstG, dstB, dstA);
|
||||
} else {
|
||||
ASSEMBLE_RGB(dst, dstbpp, dst_fmt, dstR, dstG, dstB);
|
||||
}
|
||||
posx += incx;
|
||||
dst += dstbpp;
|
||||
}
|
||||
posy += incy;
|
||||
info->dst += info->dst_pitch;
|
||||
}
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
25
Engine/lib/sdl/src/video/SDL_blit_slow.h
Normal file
25
Engine/lib/sdl/src/video/SDL_blit_slow.h
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
extern void SDL_Blit_Slow(SDL_BlitInfo * info);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
612
Engine/lib/sdl/src/video/SDL_bmp.c
Normal file
612
Engine/lib/sdl/src/video/SDL_bmp.c
Normal file
|
|
@ -0,0 +1,612 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
/*
|
||||
Code to load and save surfaces in Windows BMP format.
|
||||
|
||||
Why support BMP format? Well, it's a native format for Windows, and
|
||||
most image processing programs can read and write it. It would be nice
|
||||
to be able to have at least one image format that we can natively load
|
||||
and save, and since PNG is so complex that it would bloat the library,
|
||||
BMP is a good alternative.
|
||||
|
||||
This code currently supports Win32 DIBs in uncompressed 8 and 24 bpp.
|
||||
*/
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_endian.h"
|
||||
#include "SDL_pixels_c.h"
|
||||
|
||||
#define SAVE_32BIT_BMP
|
||||
|
||||
/* Compression encodings for BMP files */
|
||||
#ifndef BI_RGB
|
||||
#define BI_RGB 0
|
||||
#define BI_RLE8 1
|
||||
#define BI_RLE4 2
|
||||
#define BI_BITFIELDS 3
|
||||
#endif
|
||||
|
||||
|
||||
static void CorrectAlphaChannel(SDL_Surface *surface)
|
||||
{
|
||||
/* Check to see if there is any alpha channel data */
|
||||
SDL_bool hasAlpha = SDL_FALSE;
|
||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||
int alphaChannelOffset = 0;
|
||||
#else
|
||||
int alphaChannelOffset = 3;
|
||||
#endif
|
||||
Uint8 *alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;
|
||||
Uint8 *end = alpha + surface->h * surface->pitch;
|
||||
|
||||
while (alpha < end) {
|
||||
if (*alpha != 0) {
|
||||
hasAlpha = SDL_TRUE;
|
||||
break;
|
||||
}
|
||||
alpha += 4;
|
||||
}
|
||||
|
||||
if (!hasAlpha) {
|
||||
alpha = ((Uint8*)surface->pixels) + alphaChannelOffset;
|
||||
while (alpha < end) {
|
||||
*alpha = SDL_ALPHA_OPAQUE;
|
||||
alpha += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SDL_Surface *
|
||||
SDL_LoadBMP_RW(SDL_RWops * src, int freesrc)
|
||||
{
|
||||
SDL_bool was_error;
|
||||
Sint64 fp_offset = 0;
|
||||
int bmpPitch;
|
||||
int i, pad;
|
||||
SDL_Surface *surface;
|
||||
Uint32 Rmask;
|
||||
Uint32 Gmask;
|
||||
Uint32 Bmask;
|
||||
Uint32 Amask;
|
||||
SDL_Palette *palette;
|
||||
Uint8 *bits;
|
||||
Uint8 *top, *end;
|
||||
SDL_bool topDown;
|
||||
int ExpandBMP;
|
||||
SDL_bool correctAlpha = SDL_FALSE;
|
||||
|
||||
/* The Win32 BMP file header (14 bytes) */
|
||||
char magic[2];
|
||||
/* Uint32 bfSize = 0; */
|
||||
/* Uint16 bfReserved1 = 0; */
|
||||
/* Uint16 bfReserved2 = 0; */
|
||||
Uint32 bfOffBits = 0;
|
||||
|
||||
/* The Win32 BITMAPINFOHEADER struct (40 bytes) */
|
||||
Uint32 biSize = 0;
|
||||
Sint32 biWidth = 0;
|
||||
Sint32 biHeight = 0;
|
||||
/* Uint16 biPlanes = 0; */
|
||||
Uint16 biBitCount = 0;
|
||||
Uint32 biCompression = 0;
|
||||
/* Uint32 biSizeImage = 0; */
|
||||
/* Sint32 biXPelsPerMeter = 0; */
|
||||
/* Sint32 biYPelsPerMeter = 0; */
|
||||
Uint32 biClrUsed = 0;
|
||||
/* Uint32 biClrImportant = 0; */
|
||||
|
||||
/* Make sure we are passed a valid data source */
|
||||
surface = NULL;
|
||||
was_error = SDL_FALSE;
|
||||
if (src == NULL) {
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Read in the BMP file header */
|
||||
fp_offset = SDL_RWtell(src);
|
||||
SDL_ClearError();
|
||||
if (SDL_RWread(src, magic, 1, 2) != 2) {
|
||||
SDL_Error(SDL_EFREAD);
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
if (SDL_strncmp(magic, "BM", 2) != 0) {
|
||||
SDL_SetError("File is not a Windows BMP file");
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
/* bfSize = */ SDL_ReadLE32(src);
|
||||
/* bfReserved1 = */ SDL_ReadLE16(src);
|
||||
/* bfReserved2 = */ SDL_ReadLE16(src);
|
||||
bfOffBits = SDL_ReadLE32(src);
|
||||
|
||||
/* Read the Win32 BITMAPINFOHEADER */
|
||||
biSize = SDL_ReadLE32(src);
|
||||
if (biSize == 12) {
|
||||
biWidth = (Uint32) SDL_ReadLE16(src);
|
||||
biHeight = (Uint32) SDL_ReadLE16(src);
|
||||
/* biPlanes = */ SDL_ReadLE16(src);
|
||||
biBitCount = SDL_ReadLE16(src);
|
||||
biCompression = BI_RGB;
|
||||
} else {
|
||||
const unsigned int headerSize = 40;
|
||||
|
||||
biWidth = SDL_ReadLE32(src);
|
||||
biHeight = SDL_ReadLE32(src);
|
||||
/* biPlanes = */ SDL_ReadLE16(src);
|
||||
biBitCount = SDL_ReadLE16(src);
|
||||
biCompression = SDL_ReadLE32(src);
|
||||
/* biSizeImage = */ SDL_ReadLE32(src);
|
||||
/* biXPelsPerMeter = */ SDL_ReadLE32(src);
|
||||
/* biYPelsPerMeter = */ SDL_ReadLE32(src);
|
||||
biClrUsed = SDL_ReadLE32(src);
|
||||
/* biClrImportant = */ SDL_ReadLE32(src);
|
||||
|
||||
if (biSize > headerSize) {
|
||||
SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR);
|
||||
}
|
||||
}
|
||||
if (biHeight < 0) {
|
||||
topDown = SDL_TRUE;
|
||||
biHeight = -biHeight;
|
||||
} else {
|
||||
topDown = SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Check for read error */
|
||||
if (SDL_strcmp(SDL_GetError(), "") != 0) {
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Expand 1 and 4 bit bitmaps to 8 bits per pixel */
|
||||
switch (biBitCount) {
|
||||
case 1:
|
||||
case 4:
|
||||
ExpandBMP = biBitCount;
|
||||
biBitCount = 8;
|
||||
break;
|
||||
default:
|
||||
ExpandBMP = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* We don't support any BMP compression right now */
|
||||
Rmask = Gmask = Bmask = Amask = 0;
|
||||
switch (biCompression) {
|
||||
case BI_RGB:
|
||||
/* If there are no masks, use the defaults */
|
||||
if (bfOffBits == (14 + biSize)) {
|
||||
/* Default values for the BMP format */
|
||||
switch (biBitCount) {
|
||||
case 15:
|
||||
case 16:
|
||||
Rmask = 0x7C00;
|
||||
Gmask = 0x03E0;
|
||||
Bmask = 0x001F;
|
||||
break;
|
||||
case 24:
|
||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||
Rmask = 0x000000FF;
|
||||
Gmask = 0x0000FF00;
|
||||
Bmask = 0x00FF0000;
|
||||
#else
|
||||
Rmask = 0x00FF0000;
|
||||
Gmask = 0x0000FF00;
|
||||
Bmask = 0x000000FF;
|
||||
#endif
|
||||
break;
|
||||
case 32:
|
||||
/* We don't know if this has alpha channel or not */
|
||||
correctAlpha = SDL_TRUE;
|
||||
Amask = 0xFF000000;
|
||||
Rmask = 0x00FF0000;
|
||||
Gmask = 0x0000FF00;
|
||||
Bmask = 0x000000FF;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* Fall through -- read the RGB masks */
|
||||
|
||||
case BI_BITFIELDS:
|
||||
switch (biBitCount) {
|
||||
case 15:
|
||||
case 16:
|
||||
Rmask = SDL_ReadLE32(src);
|
||||
Gmask = SDL_ReadLE32(src);
|
||||
Bmask = SDL_ReadLE32(src);
|
||||
break;
|
||||
case 32:
|
||||
Rmask = SDL_ReadLE32(src);
|
||||
Gmask = SDL_ReadLE32(src);
|
||||
Bmask = SDL_ReadLE32(src);
|
||||
Amask = SDL_ReadLE32(src);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SDL_SetError("Compressed BMP files not supported");
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Create a compatible surface, note that the colors are RGB ordered */
|
||||
surface =
|
||||
SDL_CreateRGBSurface(0, biWidth, biHeight, biBitCount, Rmask, Gmask,
|
||||
Bmask, Amask);
|
||||
if (surface == NULL) {
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Load the palette, if any */
|
||||
palette = (surface->format)->palette;
|
||||
if (palette) {
|
||||
if (biClrUsed == 0) {
|
||||
biClrUsed = 1 << biBitCount;
|
||||
}
|
||||
if ((int) biClrUsed > palette->ncolors) {
|
||||
palette->ncolors = biClrUsed;
|
||||
palette->colors =
|
||||
(SDL_Color *) SDL_realloc(palette->colors,
|
||||
palette->ncolors *
|
||||
sizeof(*palette->colors));
|
||||
if (!palette->colors) {
|
||||
SDL_OutOfMemory();
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
} else if ((int) biClrUsed < palette->ncolors) {
|
||||
palette->ncolors = biClrUsed;
|
||||
}
|
||||
if (biSize == 12) {
|
||||
for (i = 0; i < (int) biClrUsed; ++i) {
|
||||
SDL_RWread(src, &palette->colors[i].b, 1, 1);
|
||||
SDL_RWread(src, &palette->colors[i].g, 1, 1);
|
||||
SDL_RWread(src, &palette->colors[i].r, 1, 1);
|
||||
palette->colors[i].a = SDL_ALPHA_OPAQUE;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < (int) biClrUsed; ++i) {
|
||||
SDL_RWread(src, &palette->colors[i].b, 1, 1);
|
||||
SDL_RWread(src, &palette->colors[i].g, 1, 1);
|
||||
SDL_RWread(src, &palette->colors[i].r, 1, 1);
|
||||
SDL_RWread(src, &palette->colors[i].a, 1, 1);
|
||||
|
||||
/* According to Microsoft documentation, the fourth element
|
||||
is reserved and must be zero, so we shouldn't treat it as
|
||||
alpha.
|
||||
*/
|
||||
palette->colors[i].a = SDL_ALPHA_OPAQUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Read the surface pixels. Note that the bmp image is upside down */
|
||||
if (SDL_RWseek(src, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {
|
||||
SDL_Error(SDL_EFSEEK);
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
top = (Uint8 *)surface->pixels;
|
||||
end = (Uint8 *)surface->pixels+(surface->h*surface->pitch);
|
||||
switch (ExpandBMP) {
|
||||
case 1:
|
||||
bmpPitch = (biWidth + 7) >> 3;
|
||||
pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
|
||||
break;
|
||||
case 4:
|
||||
bmpPitch = (biWidth + 1) >> 1;
|
||||
pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
|
||||
break;
|
||||
default:
|
||||
pad = ((surface->pitch % 4) ? (4 - (surface->pitch % 4)) : 0);
|
||||
break;
|
||||
}
|
||||
if (topDown) {
|
||||
bits = top;
|
||||
} else {
|
||||
bits = end - surface->pitch;
|
||||
}
|
||||
while (bits >= top && bits < end) {
|
||||
switch (ExpandBMP) {
|
||||
case 1:
|
||||
case 4:{
|
||||
Uint8 pixel = 0;
|
||||
int shift = (8 - ExpandBMP);
|
||||
for (i = 0; i < surface->w; ++i) {
|
||||
if (i % (8 / ExpandBMP) == 0) {
|
||||
if (!SDL_RWread(src, &pixel, 1, 1)) {
|
||||
SDL_SetError("Error reading from BMP");
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
*(bits + i) = (pixel >> shift);
|
||||
pixel <<= ExpandBMP;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (SDL_RWread(src, bits, 1, surface->pitch)
|
||||
!= surface->pitch) {
|
||||
SDL_Error(SDL_EFREAD);
|
||||
was_error = SDL_TRUE;
|
||||
goto done;
|
||||
}
|
||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||
/* Byte-swap the pixels if needed. Note that the 24bpp
|
||||
case has already been taken care of above. */
|
||||
switch (biBitCount) {
|
||||
case 15:
|
||||
case 16:{
|
||||
Uint16 *pix = (Uint16 *) bits;
|
||||
for (i = 0; i < surface->w; i++)
|
||||
pix[i] = SDL_Swap16(pix[i]);
|
||||
break;
|
||||
}
|
||||
|
||||
case 32:{
|
||||
Uint32 *pix = (Uint32 *) bits;
|
||||
for (i = 0; i < surface->w; i++)
|
||||
pix[i] = SDL_Swap32(pix[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
/* Skip padding bytes, ugh */
|
||||
if (pad) {
|
||||
Uint8 padbyte;
|
||||
for (i = 0; i < pad; ++i) {
|
||||
SDL_RWread(src, &padbyte, 1, 1);
|
||||
}
|
||||
}
|
||||
if (topDown) {
|
||||
bits += surface->pitch;
|
||||
} else {
|
||||
bits -= surface->pitch;
|
||||
}
|
||||
}
|
||||
if (correctAlpha) {
|
||||
CorrectAlphaChannel(surface);
|
||||
}
|
||||
done:
|
||||
if (was_error) {
|
||||
if (src) {
|
||||
SDL_RWseek(src, fp_offset, RW_SEEK_SET);
|
||||
}
|
||||
SDL_FreeSurface(surface);
|
||||
surface = NULL;
|
||||
}
|
||||
if (freesrc && src) {
|
||||
SDL_RWclose(src);
|
||||
}
|
||||
return (surface);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SaveBMP_RW(SDL_Surface * saveme, SDL_RWops * dst, int freedst)
|
||||
{
|
||||
Sint64 fp_offset;
|
||||
int i, pad;
|
||||
SDL_Surface *surface;
|
||||
Uint8 *bits;
|
||||
|
||||
/* The Win32 BMP file header (14 bytes) */
|
||||
char magic[2] = { 'B', 'M' };
|
||||
Uint32 bfSize;
|
||||
Uint16 bfReserved1;
|
||||
Uint16 bfReserved2;
|
||||
Uint32 bfOffBits;
|
||||
|
||||
/* The Win32 BITMAPINFOHEADER struct (40 bytes) */
|
||||
Uint32 biSize;
|
||||
Sint32 biWidth;
|
||||
Sint32 biHeight;
|
||||
Uint16 biPlanes;
|
||||
Uint16 biBitCount;
|
||||
Uint32 biCompression;
|
||||
Uint32 biSizeImage;
|
||||
Sint32 biXPelsPerMeter;
|
||||
Sint32 biYPelsPerMeter;
|
||||
Uint32 biClrUsed;
|
||||
Uint32 biClrImportant;
|
||||
|
||||
/* Make sure we have somewhere to save */
|
||||
surface = NULL;
|
||||
if (dst) {
|
||||
SDL_bool save32bit = SDL_FALSE;
|
||||
#ifdef SAVE_32BIT_BMP
|
||||
/* We can save alpha information in a 32-bit BMP */
|
||||
if (saveme->map->info.flags & SDL_COPY_COLORKEY ||
|
||||
saveme->format->Amask) {
|
||||
save32bit = SDL_TRUE;
|
||||
}
|
||||
#endif /* SAVE_32BIT_BMP */
|
||||
|
||||
if (saveme->format->palette && !save32bit) {
|
||||
if (saveme->format->BitsPerPixel == 8) {
|
||||
surface = saveme;
|
||||
} else {
|
||||
SDL_SetError("%d bpp BMP files not supported",
|
||||
saveme->format->BitsPerPixel);
|
||||
}
|
||||
} else if ((saveme->format->BitsPerPixel == 24) &&
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
(saveme->format->Rmask == 0x00FF0000) &&
|
||||
(saveme->format->Gmask == 0x0000FF00) &&
|
||||
(saveme->format->Bmask == 0x000000FF)
|
||||
#else
|
||||
(saveme->format->Rmask == 0x000000FF) &&
|
||||
(saveme->format->Gmask == 0x0000FF00) &&
|
||||
(saveme->format->Bmask == 0x00FF0000)
|
||||
#endif
|
||||
) {
|
||||
surface = saveme;
|
||||
} else {
|
||||
SDL_PixelFormat format;
|
||||
|
||||
/* If the surface has a colorkey or alpha channel we'll save a
|
||||
32-bit BMP with alpha channel, otherwise save a 24-bit BMP. */
|
||||
if (save32bit) {
|
||||
SDL_InitFormat(&format,
|
||||
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||
SDL_PIXELFORMAT_ARGB8888
|
||||
#else
|
||||
SDL_PIXELFORMAT_BGRA8888
|
||||
#endif
|
||||
);
|
||||
} else {
|
||||
SDL_InitFormat(&format, SDL_PIXELFORMAT_BGR24);
|
||||
}
|
||||
surface = SDL_ConvertSurface(saveme, &format, 0);
|
||||
if (!surface) {
|
||||
SDL_SetError("Couldn't convert image to %d bpp",
|
||||
format.BitsPerPixel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (surface && (SDL_LockSurface(surface) == 0)) {
|
||||
const int bw = surface->w * surface->format->BytesPerPixel;
|
||||
|
||||
/* Set the BMP file header values */
|
||||
bfSize = 0; /* We'll write this when we're done */
|
||||
bfReserved1 = 0;
|
||||
bfReserved2 = 0;
|
||||
bfOffBits = 0; /* We'll write this when we're done */
|
||||
|
||||
/* Write the BMP file header values */
|
||||
fp_offset = SDL_RWtell(dst);
|
||||
SDL_ClearError();
|
||||
SDL_RWwrite(dst, magic, 2, 1);
|
||||
SDL_WriteLE32(dst, bfSize);
|
||||
SDL_WriteLE16(dst, bfReserved1);
|
||||
SDL_WriteLE16(dst, bfReserved2);
|
||||
SDL_WriteLE32(dst, bfOffBits);
|
||||
|
||||
/* Set the BMP info values */
|
||||
biSize = 40;
|
||||
biWidth = surface->w;
|
||||
biHeight = surface->h;
|
||||
biPlanes = 1;
|
||||
biBitCount = surface->format->BitsPerPixel;
|
||||
biCompression = BI_RGB;
|
||||
biSizeImage = surface->h * surface->pitch;
|
||||
biXPelsPerMeter = 0;
|
||||
biYPelsPerMeter = 0;
|
||||
if (surface->format->palette) {
|
||||
biClrUsed = surface->format->palette->ncolors;
|
||||
} else {
|
||||
biClrUsed = 0;
|
||||
}
|
||||
biClrImportant = 0;
|
||||
|
||||
/* Write the BMP info values */
|
||||
SDL_WriteLE32(dst, biSize);
|
||||
SDL_WriteLE32(dst, biWidth);
|
||||
SDL_WriteLE32(dst, biHeight);
|
||||
SDL_WriteLE16(dst, biPlanes);
|
||||
SDL_WriteLE16(dst, biBitCount);
|
||||
SDL_WriteLE32(dst, biCompression);
|
||||
SDL_WriteLE32(dst, biSizeImage);
|
||||
SDL_WriteLE32(dst, biXPelsPerMeter);
|
||||
SDL_WriteLE32(dst, biYPelsPerMeter);
|
||||
SDL_WriteLE32(dst, biClrUsed);
|
||||
SDL_WriteLE32(dst, biClrImportant);
|
||||
|
||||
/* Write the palette (in BGR color order) */
|
||||
if (surface->format->palette) {
|
||||
SDL_Color *colors;
|
||||
int ncolors;
|
||||
|
||||
colors = surface->format->palette->colors;
|
||||
ncolors = surface->format->palette->ncolors;
|
||||
for (i = 0; i < ncolors; ++i) {
|
||||
SDL_RWwrite(dst, &colors[i].b, 1, 1);
|
||||
SDL_RWwrite(dst, &colors[i].g, 1, 1);
|
||||
SDL_RWwrite(dst, &colors[i].r, 1, 1);
|
||||
SDL_RWwrite(dst, &colors[i].a, 1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Write the bitmap offset */
|
||||
bfOffBits = (Uint32)(SDL_RWtell(dst) - fp_offset);
|
||||
if (SDL_RWseek(dst, fp_offset + 10, RW_SEEK_SET) < 0) {
|
||||
SDL_Error(SDL_EFSEEK);
|
||||
}
|
||||
SDL_WriteLE32(dst, bfOffBits);
|
||||
if (SDL_RWseek(dst, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {
|
||||
SDL_Error(SDL_EFSEEK);
|
||||
}
|
||||
|
||||
/* Write the bitmap image upside down */
|
||||
bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);
|
||||
pad = ((bw % 4) ? (4 - (bw % 4)) : 0);
|
||||
while (bits > (Uint8 *) surface->pixels) {
|
||||
bits -= surface->pitch;
|
||||
if (SDL_RWwrite(dst, bits, 1, bw) != bw) {
|
||||
SDL_Error(SDL_EFWRITE);
|
||||
break;
|
||||
}
|
||||
if (pad) {
|
||||
const Uint8 padbyte = 0;
|
||||
for (i = 0; i < pad; ++i) {
|
||||
SDL_RWwrite(dst, &padbyte, 1, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Write the BMP file size */
|
||||
bfSize = (Uint32)(SDL_RWtell(dst) - fp_offset);
|
||||
if (SDL_RWseek(dst, fp_offset + 2, RW_SEEK_SET) < 0) {
|
||||
SDL_Error(SDL_EFSEEK);
|
||||
}
|
||||
SDL_WriteLE32(dst, bfSize);
|
||||
if (SDL_RWseek(dst, fp_offset + bfSize, RW_SEEK_SET) < 0) {
|
||||
SDL_Error(SDL_EFSEEK);
|
||||
}
|
||||
|
||||
/* Close it up.. */
|
||||
SDL_UnlockSurface(surface);
|
||||
if (surface != saveme) {
|
||||
SDL_FreeSurface(surface);
|
||||
}
|
||||
}
|
||||
|
||||
if (freedst && dst) {
|
||||
SDL_RWclose(dst);
|
||||
}
|
||||
return ((SDL_strcmp(SDL_GetError(), "") == 0) ? 0 : -1);
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
76
Engine/lib/sdl/src/video/SDL_clipboard.c
Normal file
76
Engine/lib/sdl/src/video/SDL_clipboard.c
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_clipboard.h"
|
||||
#include "SDL_sysvideo.h"
|
||||
|
||||
|
||||
int
|
||||
SDL_SetClipboardText(const char *text)
|
||||
{
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
|
||||
if (!text) {
|
||||
text = "";
|
||||
}
|
||||
if (_this->SetClipboardText) {
|
||||
return _this->SetClipboardText(_this, text);
|
||||
} else {
|
||||
SDL_free(_this->clipboard_text);
|
||||
_this->clipboard_text = SDL_strdup(text);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
SDL_GetClipboardText(void)
|
||||
{
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
|
||||
if (_this->GetClipboardText) {
|
||||
return _this->GetClipboardText(_this);
|
||||
} else {
|
||||
const char *text = _this->clipboard_text;
|
||||
if (!text) {
|
||||
text = "";
|
||||
}
|
||||
return SDL_strdup(text);
|
||||
}
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_HasClipboardText(void)
|
||||
{
|
||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||
|
||||
if (_this->HasClipboardText) {
|
||||
return _this->HasClipboardText(_this);
|
||||
} else {
|
||||
if (_this->clipboard_text && _this->clipboard_text[0] != '\0') {
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
509
Engine/lib/sdl/src/video/SDL_egl.c
Normal file
509
Engine/lib/sdl/src/video/SDL_egl.c
Normal file
|
|
@ -0,0 +1,509 @@
|
|||
/*
|
||||
* Simple DirectMedia Layer
|
||||
* Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
* 3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
|
||||
#include "SDL_sysvideo.h"
|
||||
#include "SDL_egl_c.h"
|
||||
#include "SDL_loadso.h"
|
||||
#include "SDL_hints.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
/* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
|
||||
#define DEFAULT_EGL "/opt/vc/lib/libEGL.so"
|
||||
#define DEFAULT_OGL_ES2 "/opt/vc/lib/libGLESv2.so"
|
||||
#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so"
|
||||
#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so"
|
||||
|
||||
#elif SDL_VIDEO_DRIVER_ANDROID
|
||||
/* Android */
|
||||
#define DEFAULT_EGL "libEGL.so"
|
||||
#define DEFAULT_OGL_ES2 "libGLESv2.so"
|
||||
#define DEFAULT_OGL_ES_PVR "libGLES_CM.so"
|
||||
#define DEFAULT_OGL_ES "libGLESv1_CM.so"
|
||||
|
||||
#elif SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT
|
||||
/* EGL AND OpenGL ES support via ANGLE */
|
||||
#define DEFAULT_EGL "libEGL.dll"
|
||||
#define DEFAULT_OGL_ES2 "libGLESv2.dll"
|
||||
#define DEFAULT_OGL_ES_PVR "libGLES_CM.dll"
|
||||
#define DEFAULT_OGL_ES "libGLESv1_CM.dll"
|
||||
|
||||
#else
|
||||
/* Desktop Linux */
|
||||
#define DEFAULT_OGL "libGL.so.1"
|
||||
#define DEFAULT_EGL "libEGL.so.1"
|
||||
#define DEFAULT_OGL_ES2 "libGLESv2.so.2"
|
||||
#define DEFAULT_OGL_ES_PVR "libGLES_CM.so.1"
|
||||
#define DEFAULT_OGL_ES "libGLESv1_CM.so.1"
|
||||
#endif /* SDL_VIDEO_DRIVER_RPI */
|
||||
|
||||
#define LOAD_FUNC(NAME) \
|
||||
*((void**)&_this->egl_data->NAME) = SDL_LoadFunction(_this->egl_data->dll_handle, #NAME); \
|
||||
if (!_this->egl_data->NAME) \
|
||||
{ \
|
||||
return SDL_SetError("Could not retrieve EGL function " #NAME); \
|
||||
}
|
||||
|
||||
/* EGL implementation of SDL OpenGL ES support */
|
||||
|
||||
void *
|
||||
SDL_EGL_GetProcAddress(_THIS, const char *proc)
|
||||
{
|
||||
static char procname[1024];
|
||||
void *retval;
|
||||
|
||||
/* eglGetProcAddress is busted on Android http://code.google.com/p/android/issues/detail?id=7681 */
|
||||
#if !defined(SDL_VIDEO_DRIVER_ANDROID)
|
||||
if (_this->egl_data->eglGetProcAddress) {
|
||||
retval = _this->egl_data->eglGetProcAddress(proc);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, proc);
|
||||
if (!retval && SDL_strlen(proc) <= 1022) {
|
||||
procname[0] = '_';
|
||||
SDL_strlcpy(procname + 1, proc, 1022);
|
||||
retval = SDL_LoadFunction(_this->egl_data->egl_dll_handle, procname);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_EGL_UnloadLibrary(_THIS)
|
||||
{
|
||||
if (_this->egl_data) {
|
||||
if (_this->egl_data->egl_display) {
|
||||
_this->egl_data->eglTerminate(_this->egl_data->egl_display);
|
||||
_this->egl_data->egl_display = NULL;
|
||||
}
|
||||
|
||||
if (_this->egl_data->dll_handle) {
|
||||
SDL_UnloadObject(_this->egl_data->dll_handle);
|
||||
_this->egl_data->dll_handle = NULL;
|
||||
}
|
||||
if (_this->egl_data->egl_dll_handle) {
|
||||
SDL_UnloadObject(_this->egl_data->egl_dll_handle);
|
||||
_this->egl_data->egl_dll_handle = NULL;
|
||||
}
|
||||
|
||||
SDL_free(_this->egl_data);
|
||||
_this->egl_data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_display)
|
||||
{
|
||||
void *dll_handle = NULL, *egl_dll_handle = NULL; /* The naming is counter intuitive, but hey, I just work here -- Gabriel */
|
||||
char *path = NULL;
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT
|
||||
const char *d3dcompiler;
|
||||
#endif
|
||||
|
||||
if (_this->egl_data) {
|
||||
return SDL_SetError("OpenGL ES context already created");
|
||||
}
|
||||
|
||||
_this->egl_data = (struct SDL_EGL_VideoData *) SDL_calloc(1, sizeof(SDL_EGL_VideoData));
|
||||
if (!_this->egl_data) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT
|
||||
d3dcompiler = SDL_GetHint(SDL_HINT_VIDEO_WIN_D3DCOMPILER);
|
||||
if (!d3dcompiler) {
|
||||
/* By default we load the Vista+ compatible compiler */
|
||||
d3dcompiler = "d3dcompiler_46.dll";
|
||||
}
|
||||
if (SDL_strcasecmp(d3dcompiler, "none") != 0) {
|
||||
SDL_LoadObject(d3dcompiler);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* A funny thing, loading EGL.so first does not work on the Raspberry, so we load libGL* first */
|
||||
path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
|
||||
if (path != NULL) {
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
|
||||
if (egl_dll_handle == NULL) {
|
||||
if(_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
if (_this->gl_config.major_version > 1) {
|
||||
path = DEFAULT_OGL_ES2;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
else {
|
||||
path = DEFAULT_OGL_ES;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
if (egl_dll_handle == NULL) {
|
||||
path = DEFAULT_OGL_ES_PVR;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef DEFAULT_OGL
|
||||
else {
|
||||
path = DEFAULT_OGL;
|
||||
egl_dll_handle = SDL_LoadObject(path);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
_this->egl_data->egl_dll_handle = egl_dll_handle;
|
||||
|
||||
if (egl_dll_handle == NULL) {
|
||||
return SDL_SetError("Could not initialize OpenGL / GLES library");
|
||||
}
|
||||
|
||||
/* Loading libGL* in the previous step took care of loading libEGL.so, but we future proof by double checking */
|
||||
if (egl_path != NULL) {
|
||||
dll_handle = SDL_LoadObject(egl_path);
|
||||
}
|
||||
/* Try loading a EGL symbol, if it does not work try the default library paths */
|
||||
if (SDL_LoadFunction(dll_handle, "eglChooseConfig") == NULL) {
|
||||
if (dll_handle != NULL) {
|
||||
SDL_UnloadObject(dll_handle);
|
||||
}
|
||||
path = SDL_getenv("SDL_VIDEO_EGL_DRIVER");
|
||||
if (path == NULL) {
|
||||
path = DEFAULT_EGL;
|
||||
}
|
||||
dll_handle = SDL_LoadObject(path);
|
||||
if (dll_handle == NULL) {
|
||||
return SDL_SetError("Could not load EGL library");
|
||||
}
|
||||
}
|
||||
|
||||
_this->egl_data->dll_handle = dll_handle;
|
||||
|
||||
/* Load new function pointers */
|
||||
LOAD_FUNC(eglGetDisplay);
|
||||
LOAD_FUNC(eglInitialize);
|
||||
LOAD_FUNC(eglTerminate);
|
||||
LOAD_FUNC(eglGetProcAddress);
|
||||
LOAD_FUNC(eglChooseConfig);
|
||||
LOAD_FUNC(eglGetConfigAttrib);
|
||||
LOAD_FUNC(eglCreateContext);
|
||||
LOAD_FUNC(eglDestroyContext);
|
||||
LOAD_FUNC(eglCreateWindowSurface);
|
||||
LOAD_FUNC(eglDestroySurface);
|
||||
LOAD_FUNC(eglMakeCurrent);
|
||||
LOAD_FUNC(eglSwapBuffers);
|
||||
LOAD_FUNC(eglSwapInterval);
|
||||
LOAD_FUNC(eglWaitNative);
|
||||
LOAD_FUNC(eglWaitGL);
|
||||
LOAD_FUNC(eglBindAPI);
|
||||
|
||||
_this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display);
|
||||
if (!_this->egl_data->egl_display) {
|
||||
return SDL_SetError("Could not get EGL display");
|
||||
}
|
||||
|
||||
if (_this->egl_data->eglInitialize(_this->egl_data->egl_display, NULL, NULL) != EGL_TRUE) {
|
||||
return SDL_SetError("Could not initialize EGL");
|
||||
}
|
||||
|
||||
_this->egl_data->dll_handle = dll_handle;
|
||||
_this->egl_data->egl_dll_handle = egl_dll_handle;
|
||||
_this->gl_config.driver_loaded = 1;
|
||||
|
||||
if (path) {
|
||||
SDL_strlcpy(_this->gl_config.driver_path, path, sizeof(_this->gl_config.driver_path) - 1);
|
||||
} else {
|
||||
*_this->gl_config.driver_path = '\0';
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_EGL_ChooseConfig(_THIS)
|
||||
{
|
||||
/* 64 seems nice. */
|
||||
EGLint attribs[64];
|
||||
EGLint found_configs = 0, value;
|
||||
/* 128 seems even nicer here */
|
||||
EGLConfig configs[128];
|
||||
int i, j, best_bitdiff = -1, bitdiff;
|
||||
|
||||
if (!_this->egl_data) {
|
||||
/* The EGL library wasn't loaded, SDL_GetError() should have info */
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Get a valid EGL configuration */
|
||||
i = 0;
|
||||
attribs[i++] = EGL_RED_SIZE;
|
||||
attribs[i++] = _this->gl_config.red_size;
|
||||
attribs[i++] = EGL_GREEN_SIZE;
|
||||
attribs[i++] = _this->gl_config.green_size;
|
||||
attribs[i++] = EGL_BLUE_SIZE;
|
||||
attribs[i++] = _this->gl_config.blue_size;
|
||||
|
||||
if (_this->gl_config.alpha_size) {
|
||||
attribs[i++] = EGL_ALPHA_SIZE;
|
||||
attribs[i++] = _this->gl_config.alpha_size;
|
||||
}
|
||||
|
||||
if (_this->gl_config.buffer_size) {
|
||||
attribs[i++] = EGL_BUFFER_SIZE;
|
||||
attribs[i++] = _this->gl_config.buffer_size;
|
||||
}
|
||||
|
||||
attribs[i++] = EGL_DEPTH_SIZE;
|
||||
attribs[i++] = _this->gl_config.depth_size;
|
||||
|
||||
if (_this->gl_config.stencil_size) {
|
||||
attribs[i++] = EGL_STENCIL_SIZE;
|
||||
attribs[i++] = _this->gl_config.stencil_size;
|
||||
}
|
||||
|
||||
if (_this->gl_config.multisamplebuffers) {
|
||||
attribs[i++] = EGL_SAMPLE_BUFFERS;
|
||||
attribs[i++] = _this->gl_config.multisamplebuffers;
|
||||
}
|
||||
|
||||
if (_this->gl_config.multisamplesamples) {
|
||||
attribs[i++] = EGL_SAMPLES;
|
||||
attribs[i++] = _this->gl_config.multisamplesamples;
|
||||
}
|
||||
|
||||
attribs[i++] = EGL_RENDERABLE_TYPE;
|
||||
if(_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
if (_this->gl_config.major_version == 2) {
|
||||
attribs[i++] = EGL_OPENGL_ES2_BIT;
|
||||
} else {
|
||||
attribs[i++] = EGL_OPENGL_ES_BIT;
|
||||
}
|
||||
_this->egl_data->eglBindAPI(EGL_OPENGL_ES_API);
|
||||
}
|
||||
else {
|
||||
attribs[i++] = EGL_OPENGL_BIT;
|
||||
_this->egl_data->eglBindAPI(EGL_OPENGL_API);
|
||||
}
|
||||
|
||||
attribs[i++] = EGL_NONE;
|
||||
|
||||
if (_this->egl_data->eglChooseConfig(_this->egl_data->egl_display,
|
||||
attribs,
|
||||
configs, SDL_arraysize(configs),
|
||||
&found_configs) == EGL_FALSE ||
|
||||
found_configs == 0) {
|
||||
return SDL_SetError("Couldn't find matching EGL config");
|
||||
}
|
||||
|
||||
/* eglChooseConfig returns a number of configurations that match or exceed the requested attribs. */
|
||||
/* From those, we select the one that matches our requirements more closely via a makeshift algorithm */
|
||||
|
||||
for ( i=0; i<found_configs; i++ ) {
|
||||
bitdiff = 0;
|
||||
for (j = 0; j < SDL_arraysize(attribs) - 1; j += 2) {
|
||||
if (attribs[j] == EGL_NONE) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( attribs[j+1] != EGL_DONT_CARE && (
|
||||
attribs[j] == EGL_RED_SIZE ||
|
||||
attribs[j] == EGL_GREEN_SIZE ||
|
||||
attribs[j] == EGL_BLUE_SIZE ||
|
||||
attribs[j] == EGL_ALPHA_SIZE ||
|
||||
attribs[j] == EGL_DEPTH_SIZE ||
|
||||
attribs[j] == EGL_STENCIL_SIZE)) {
|
||||
_this->egl_data->eglGetConfigAttrib(_this->egl_data->egl_display, configs[i], attribs[j], &value);
|
||||
bitdiff += value - attribs[j + 1]; /* value is always >= attrib */
|
||||
}
|
||||
}
|
||||
|
||||
if (bitdiff < best_bitdiff || best_bitdiff == -1) {
|
||||
_this->egl_data->egl_config = configs[i];
|
||||
|
||||
best_bitdiff = bitdiff;
|
||||
}
|
||||
|
||||
if (bitdiff == 0) break; /* we found an exact match! */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SDL_GLContext
|
||||
SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface)
|
||||
{
|
||||
EGLint context_attrib_list[] = {
|
||||
EGL_CONTEXT_CLIENT_VERSION,
|
||||
1,
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
EGLContext egl_context, share_context = EGL_NO_CONTEXT;
|
||||
|
||||
if (!_this->egl_data) {
|
||||
/* The EGL library wasn't loaded, SDL_GetError() should have info */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_this->gl_config.share_with_current_context) {
|
||||
share_context = (EGLContext)SDL_GL_GetCurrentContext();
|
||||
}
|
||||
|
||||
/* Bind the API */
|
||||
if(_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
_this->egl_data->eglBindAPI(EGL_OPENGL_ES_API);
|
||||
if (_this->gl_config.major_version) {
|
||||
context_attrib_list[1] = _this->gl_config.major_version;
|
||||
}
|
||||
|
||||
egl_context = _this->egl_data->eglCreateContext(_this->egl_data->egl_display,
|
||||
_this->egl_data->egl_config,
|
||||
share_context, context_attrib_list);
|
||||
}
|
||||
else {
|
||||
_this->egl_data->eglBindAPI(EGL_OPENGL_API);
|
||||
egl_context = _this->egl_data->eglCreateContext(_this->egl_data->egl_display,
|
||||
_this->egl_data->egl_config,
|
||||
share_context, NULL);
|
||||
}
|
||||
|
||||
if (egl_context == EGL_NO_CONTEXT) {
|
||||
SDL_SetError("Could not create EGL context");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_this->egl_data->egl_swapinterval = 0;
|
||||
|
||||
if (SDL_EGL_MakeCurrent(_this, egl_surface, egl_context) < 0) {
|
||||
SDL_EGL_DeleteContext(_this, egl_context);
|
||||
SDL_SetError("Could not make EGL context current");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (SDL_GLContext) egl_context;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context)
|
||||
{
|
||||
EGLContext egl_context = (EGLContext) context;
|
||||
|
||||
if (!_this->egl_data) {
|
||||
return SDL_SetError("OpenGL not initialized");
|
||||
}
|
||||
|
||||
/* The android emulator crashes badly if you try to eglMakeCurrent
|
||||
* with a valid context and invalid surface, so we have to check for both here.
|
||||
*/
|
||||
if (!egl_context || !egl_surface) {
|
||||
_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
}
|
||||
else {
|
||||
if (!_this->egl_data->eglMakeCurrent(_this->egl_data->egl_display,
|
||||
egl_surface, egl_surface, egl_context)) {
|
||||
return SDL_SetError("Unable to make EGL context current");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_EGL_SetSwapInterval(_THIS, int interval)
|
||||
{
|
||||
EGLBoolean status;
|
||||
|
||||
if (!_this->egl_data) {
|
||||
return SDL_SetError("EGL not initialized");
|
||||
}
|
||||
|
||||
status = _this->egl_data->eglSwapInterval(_this->egl_data->egl_display, interval);
|
||||
if (status == EGL_TRUE) {
|
||||
_this->egl_data->egl_swapinterval = interval;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SDL_SetError("Unable to set the EGL swap interval");
|
||||
}
|
||||
|
||||
int
|
||||
SDL_EGL_GetSwapInterval(_THIS)
|
||||
{
|
||||
if (!_this->egl_data) {
|
||||
return SDL_SetError("EGL not initialized");
|
||||
}
|
||||
|
||||
return _this->egl_data->egl_swapinterval;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface)
|
||||
{
|
||||
_this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, egl_surface);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_EGL_DeleteContext(_THIS, SDL_GLContext context)
|
||||
{
|
||||
EGLContext egl_context = (EGLContext) context;
|
||||
|
||||
/* Clean up GLES and EGL */
|
||||
if (!_this->egl_data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (egl_context != NULL && egl_context != EGL_NO_CONTEXT) {
|
||||
SDL_EGL_MakeCurrent(_this, NULL, NULL);
|
||||
_this->egl_data->eglDestroyContext(_this->egl_data->egl_display, egl_context);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
EGLSurface *
|
||||
SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
||||
{
|
||||
if (SDL_EGL_ChooseConfig(_this) != 0) {
|
||||
return EGL_NO_SURFACE;
|
||||
}
|
||||
|
||||
return _this->egl_data->eglCreateWindowSurface(
|
||||
_this->egl_data->egl_display,
|
||||
_this->egl_data->egl_config,
|
||||
nw, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface)
|
||||
{
|
||||
if (!_this->egl_data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (egl_surface != EGL_NO_SURFACE) {
|
||||
_this->egl_data->eglDestroySurface(_this->egl_data->egl_display, egl_surface);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
130
Engine/lib/sdl/src/video/SDL_egl_c.h
Normal file
130
Engine/lib/sdl/src/video/SDL_egl_c.h
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_egl_h
|
||||
#define _SDL_egl_h
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
|
||||
#include "SDL_egl.h"
|
||||
|
||||
#include "SDL_sysvideo.h"
|
||||
|
||||
typedef struct SDL_EGL_VideoData
|
||||
{
|
||||
void *egl_dll_handle, *dll_handle;
|
||||
EGLDisplay egl_display;
|
||||
EGLConfig egl_config;
|
||||
int egl_swapinterval;
|
||||
|
||||
EGLDisplay(EGLAPIENTRY *eglGetDisplay) (NativeDisplayType display);
|
||||
EGLBoolean(EGLAPIENTRY *eglInitialize) (EGLDisplay dpy, EGLint * major,
|
||||
EGLint * minor);
|
||||
EGLBoolean(EGLAPIENTRY *eglTerminate) (EGLDisplay dpy);
|
||||
|
||||
void *(EGLAPIENTRY *eglGetProcAddress) (const char * procName);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglChooseConfig) (EGLDisplay dpy,
|
||||
const EGLint * attrib_list,
|
||||
EGLConfig * configs,
|
||||
EGLint config_size, EGLint * num_config);
|
||||
|
||||
EGLContext(EGLAPIENTRY *eglCreateContext) (EGLDisplay dpy,
|
||||
EGLConfig config,
|
||||
EGLContext share_list,
|
||||
const EGLint * attrib_list);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglDestroyContext) (EGLDisplay dpy, EGLContext ctx);
|
||||
|
||||
EGLSurface(EGLAPIENTRY *eglCreateWindowSurface) (EGLDisplay dpy,
|
||||
EGLConfig config,
|
||||
NativeWindowType window,
|
||||
const EGLint * attrib_list);
|
||||
EGLBoolean(EGLAPIENTRY *eglDestroySurface) (EGLDisplay dpy, EGLSurface surface);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglMakeCurrent) (EGLDisplay dpy, EGLSurface draw,
|
||||
EGLSurface read, EGLContext ctx);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglSwapBuffers) (EGLDisplay dpy, EGLSurface draw);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglSwapInterval) (EGLDisplay dpy, EGLint interval);
|
||||
|
||||
const char *(EGLAPIENTRY *eglQueryString) (EGLDisplay dpy, EGLint name);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglGetConfigAttrib) (EGLDisplay dpy, EGLConfig config,
|
||||
EGLint attribute, EGLint * value);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglWaitNative) (EGLint engine);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglWaitGL)(void);
|
||||
|
||||
EGLBoolean(EGLAPIENTRY *eglBindAPI)(EGLenum);
|
||||
|
||||
} SDL_EGL_VideoData;
|
||||
|
||||
/* OpenGLES functions */
|
||||
extern int SDL_EGL_GetAttribute(_THIS, SDL_GLattr attrib, int *value);
|
||||
extern int SDL_EGL_LoadLibrary(_THIS, const char *path, NativeDisplayType native_display);
|
||||
extern void *SDL_EGL_GetProcAddress(_THIS, const char *proc);
|
||||
extern void SDL_EGL_UnloadLibrary(_THIS);
|
||||
extern int SDL_EGL_ChooseConfig(_THIS);
|
||||
extern int SDL_EGL_SetSwapInterval(_THIS, int interval);
|
||||
extern int SDL_EGL_GetSwapInterval(_THIS);
|
||||
extern void SDL_EGL_DeleteContext(_THIS, SDL_GLContext context);
|
||||
extern EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw);
|
||||
extern void SDL_EGL_DestroySurface(_THIS, EGLSurface egl_surface);
|
||||
|
||||
/* These need to be wrapped to get the surface for the window by the platform GLES implementation */
|
||||
extern SDL_GLContext SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface);
|
||||
extern int SDL_EGL_MakeCurrent(_THIS, EGLSurface egl_surface, SDL_GLContext context);
|
||||
extern void SDL_EGL_SwapBuffers(_THIS, EGLSurface egl_surface);
|
||||
|
||||
/* A few of useful macros */
|
||||
|
||||
#define SDL_EGL_SwapWindow_impl(BACKEND) void \
|
||||
BACKEND ## _GLES_SwapWindow(_THIS, SDL_Window * window) \
|
||||
{\
|
||||
SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
|
||||
}
|
||||
|
||||
#define SDL_EGL_MakeCurrent_impl(BACKEND) int \
|
||||
BACKEND ## _GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) \
|
||||
{\
|
||||
if (window && context) { \
|
||||
return SDL_EGL_MakeCurrent(_this, ((SDL_WindowData *) window->driverdata)->egl_surface, context); \
|
||||
}\
|
||||
else {\
|
||||
return SDL_EGL_MakeCurrent(_this, NULL, NULL);\
|
||||
}\
|
||||
}
|
||||
|
||||
#define SDL_EGL_CreateContext_impl(BACKEND) SDL_GLContext \
|
||||
BACKEND ## _GLES_CreateContext(_THIS, SDL_Window * window) \
|
||||
{\
|
||||
return SDL_EGL_CreateContext(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);\
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_EGL */
|
||||
|
||||
#endif /* _SDL_egl_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
335
Engine/lib/sdl/src/video/SDL_fillrect.c
Normal file
335
Engine/lib/sdl/src/video/SDL_fillrect.c
Normal file
|
|
@ -0,0 +1,335 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
|
||||
|
||||
#ifdef __SSE__
|
||||
/* *INDENT-OFF* */
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define SSE_BEGIN \
|
||||
__m128 c128; \
|
||||
c128.m128_u32[0] = color; \
|
||||
c128.m128_u32[1] = color; \
|
||||
c128.m128_u32[2] = color; \
|
||||
c128.m128_u32[3] = color;
|
||||
#else
|
||||
#define SSE_BEGIN \
|
||||
__m128 c128; \
|
||||
DECLARE_ALIGNED(Uint32, cccc[4], 16); \
|
||||
cccc[0] = color; \
|
||||
cccc[1] = color; \
|
||||
cccc[2] = color; \
|
||||
cccc[3] = color; \
|
||||
c128 = *(__m128 *)cccc;
|
||||
#endif
|
||||
|
||||
#define SSE_WORK \
|
||||
for (i = n / 64; i--;) { \
|
||||
_mm_stream_ps((float *)(p+0), c128); \
|
||||
_mm_stream_ps((float *)(p+16), c128); \
|
||||
_mm_stream_ps((float *)(p+32), c128); \
|
||||
_mm_stream_ps((float *)(p+48), c128); \
|
||||
p += 64; \
|
||||
}
|
||||
|
||||
#define SSE_END
|
||||
|
||||
#define DEFINE_SSE_FILLRECT(bpp, type) \
|
||||
static void \
|
||||
SDL_FillRect##bpp##SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h) \
|
||||
{ \
|
||||
int i, n; \
|
||||
Uint8 *p = NULL; \
|
||||
\
|
||||
SSE_BEGIN; \
|
||||
\
|
||||
while (h--) { \
|
||||
n = w * bpp; \
|
||||
p = pixels; \
|
||||
\
|
||||
if (n > 63) { \
|
||||
int adjust = 16 - ((uintptr_t)p & 15); \
|
||||
if (adjust < 16) { \
|
||||
n -= adjust; \
|
||||
adjust /= bpp; \
|
||||
while (adjust--) { \
|
||||
*((type *)p) = (type)color; \
|
||||
p += bpp; \
|
||||
} \
|
||||
} \
|
||||
SSE_WORK; \
|
||||
} \
|
||||
if (n & 63) { \
|
||||
int remainder = (n & 63); \
|
||||
remainder /= bpp; \
|
||||
while (remainder--) { \
|
||||
*((type *)p) = (type)color; \
|
||||
p += bpp; \
|
||||
} \
|
||||
} \
|
||||
pixels += pitch; \
|
||||
} \
|
||||
\
|
||||
SSE_END; \
|
||||
}
|
||||
|
||||
static void
|
||||
SDL_FillRect1SSE(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
|
||||
{
|
||||
int i, n;
|
||||
Uint8 *p = NULL;
|
||||
|
||||
SSE_BEGIN;
|
||||
while (h--) {
|
||||
n = w;
|
||||
p = pixels;
|
||||
|
||||
if (n > 63) {
|
||||
int adjust = 16 - ((uintptr_t)p & 15);
|
||||
if (adjust) {
|
||||
n -= adjust;
|
||||
SDL_memset(p, color, adjust);
|
||||
p += adjust;
|
||||
}
|
||||
SSE_WORK;
|
||||
}
|
||||
if (n & 63) {
|
||||
int remainder = (n & 63);
|
||||
SDL_memset(p, color, remainder);
|
||||
p += remainder;
|
||||
}
|
||||
pixels += pitch;
|
||||
}
|
||||
|
||||
SSE_END;
|
||||
}
|
||||
/* DEFINE_SSE_FILLRECT(1, Uint8) */
|
||||
DEFINE_SSE_FILLRECT(2, Uint16)
|
||||
DEFINE_SSE_FILLRECT(4, Uint32)
|
||||
|
||||
/* *INDENT-ON* */
|
||||
#endif /* __SSE__ */
|
||||
|
||||
static void
|
||||
SDL_FillRect1(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
||||
{
|
||||
int n;
|
||||
Uint8 *p = NULL;
|
||||
|
||||
while (h--) {
|
||||
n = w;
|
||||
p = pixels;
|
||||
|
||||
if (n > 3) {
|
||||
switch ((uintptr_t) p & 3) {
|
||||
case 1:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
case 2:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
case 3:
|
||||
*p++ = (Uint8) color;
|
||||
--n;
|
||||
}
|
||||
SDL_memset4(p, color, (n >> 2));
|
||||
}
|
||||
if (n & 3) {
|
||||
p += (n & ~3);
|
||||
switch (n & 3) {
|
||||
case 3:
|
||||
*p++ = (Uint8) color;
|
||||
case 2:
|
||||
*p++ = (Uint8) color;
|
||||
case 1:
|
||||
*p++ = (Uint8) color;
|
||||
}
|
||||
}
|
||||
pixels += pitch;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SDL_FillRect2(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
||||
{
|
||||
int n;
|
||||
Uint16 *p = NULL;
|
||||
|
||||
while (h--) {
|
||||
n = w;
|
||||
p = (Uint16 *) pixels;
|
||||
|
||||
if (n > 1) {
|
||||
if ((uintptr_t) p & 2) {
|
||||
*p++ = (Uint16) color;
|
||||
--n;
|
||||
}
|
||||
SDL_memset4(p, color, (n >> 1));
|
||||
}
|
||||
if (n & 1) {
|
||||
p[n - 1] = (Uint16) color;
|
||||
}
|
||||
pixels += pitch;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SDL_FillRect3(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
||||
{
|
||||
Uint8 r = (Uint8) ((color >> 16) & 0xFF);
|
||||
Uint8 g = (Uint8) ((color >> 8) & 0xFF);
|
||||
Uint8 b = (Uint8) (color & 0xFF);
|
||||
int n;
|
||||
Uint8 *p = NULL;
|
||||
|
||||
while (h--) {
|
||||
n = w;
|
||||
p = pixels;
|
||||
|
||||
while (n--) {
|
||||
*p++ = r;
|
||||
*p++ = g;
|
||||
*p++ = b;
|
||||
}
|
||||
pixels += pitch;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
SDL_FillRect4(Uint8 * pixels, int pitch, Uint32 color, int w, int h)
|
||||
{
|
||||
while (h--) {
|
||||
SDL_memset4(pixels, color, w);
|
||||
pixels += pitch;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function performs a fast fill of the given rectangle with 'color'
|
||||
*/
|
||||
int
|
||||
SDL_FillRect(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color)
|
||||
{
|
||||
SDL_Rect clipped;
|
||||
Uint8 *pixels;
|
||||
|
||||
if (!dst) {
|
||||
return SDL_SetError("Passed NULL destination surface");
|
||||
}
|
||||
|
||||
/* This function doesn't work on surfaces < 8 bpp */
|
||||
if (dst->format->BitsPerPixel < 8) {
|
||||
return SDL_SetError("SDL_FillRect(): Unsupported surface format");
|
||||
}
|
||||
|
||||
/* If 'rect' == NULL, then fill the whole surface */
|
||||
if (rect) {
|
||||
/* Perform clipping */
|
||||
if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) {
|
||||
return 0;
|
||||
}
|
||||
rect = &clipped;
|
||||
} else {
|
||||
rect = &dst->clip_rect;
|
||||
}
|
||||
|
||||
/* Perform software fill */
|
||||
if (!dst->pixels) {
|
||||
return SDL_SetError("SDL_FillRect(): You must lock the surface");
|
||||
}
|
||||
|
||||
pixels = (Uint8 *) dst->pixels + rect->y * dst->pitch +
|
||||
rect->x * dst->format->BytesPerPixel;
|
||||
|
||||
switch (dst->format->BytesPerPixel) {
|
||||
case 1:
|
||||
{
|
||||
color |= (color << 8);
|
||||
color |= (color << 16);
|
||||
#ifdef __SSE__
|
||||
if (SDL_HasSSE()) {
|
||||
SDL_FillRect1SSE(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
SDL_FillRect1(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
|
||||
case 2:
|
||||
{
|
||||
color |= (color << 16);
|
||||
#ifdef __SSE__
|
||||
if (SDL_HasSSE()) {
|
||||
SDL_FillRect2SSE(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
SDL_FillRect2(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
|
||||
case 3:
|
||||
/* 24-bit RGB is a slow path, at least for now. */
|
||||
{
|
||||
SDL_FillRect3(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
|
||||
case 4:
|
||||
{
|
||||
#ifdef __SSE__
|
||||
if (SDL_HasSSE()) {
|
||||
SDL_FillRect4SSE(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
SDL_FillRect4(pixels, dst->pitch, color, rect->w, rect->h);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* We're done! */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_FillRects(SDL_Surface * dst, const SDL_Rect * rects, int count,
|
||||
Uint32 color)
|
||||
{
|
||||
int i;
|
||||
int status = 0;
|
||||
|
||||
if (!rects) {
|
||||
return SDL_SetError("SDL_FillRects() passed NULL rects");
|
||||
}
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
status += SDL_FillRect(dst, &rects[i], color);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1127
Engine/lib/sdl/src/video/SDL_pixels.c
Normal file
1127
Engine/lib/sdl/src/video/SDL_pixels.c
Normal file
File diff suppressed because it is too large
Load diff
41
Engine/lib/sdl/src/video/SDL_pixels_c.h
Normal file
41
Engine/lib/sdl/src/video/SDL_pixels_c.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
/* Useful functions and variables from SDL_pixel.c */
|
||||
|
||||
#include "SDL_blit.h"
|
||||
|
||||
/* Pixel format functions */
|
||||
extern int SDL_InitFormat(SDL_PixelFormat * format, Uint32 pixel_format);
|
||||
|
||||
/* Blit mapping functions */
|
||||
extern SDL_BlitMap *SDL_AllocBlitMap(void);
|
||||
extern void SDL_InvalidateMap(SDL_BlitMap * map);
|
||||
extern int SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst);
|
||||
extern void SDL_FreeBlitMap(SDL_BlitMap * map);
|
||||
|
||||
/* Miscellaneous functions */
|
||||
extern int SDL_CalculatePitch(SDL_Surface * surface);
|
||||
extern void SDL_DitherColors(SDL_Color * colors, int bpp);
|
||||
extern Uint8 SDL_FindColor(SDL_Palette * pal, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
525
Engine/lib/sdl/src/video/SDL_rect.c
Normal file
525
Engine/lib/sdl/src/video/SDL_rect.c
Normal file
|
|
@ -0,0 +1,525 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL_rect.h"
|
||||
#include "SDL_rect_c.h"
|
||||
|
||||
|
||||
SDL_bool
|
||||
SDL_HasIntersection(const SDL_Rect * A, const SDL_Rect * B)
|
||||
{
|
||||
int Amin, Amax, Bmin, Bmax;
|
||||
|
||||
if (!A) {
|
||||
SDL_InvalidParamError("A");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!B) {
|
||||
SDL_InvalidParamError("B");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Special cases for empty rects */
|
||||
if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Horizontal intersection */
|
||||
Amin = A->x;
|
||||
Amax = Amin + A->w;
|
||||
Bmin = B->x;
|
||||
Bmax = Bmin + B->w;
|
||||
if (Bmin > Amin)
|
||||
Amin = Bmin;
|
||||
if (Bmax < Amax)
|
||||
Amax = Bmax;
|
||||
if (Amax <= Amin)
|
||||
return SDL_FALSE;
|
||||
|
||||
/* Vertical intersection */
|
||||
Amin = A->y;
|
||||
Amax = Amin + A->h;
|
||||
Bmin = B->y;
|
||||
Bmax = Bmin + B->h;
|
||||
if (Bmin > Amin)
|
||||
Amin = Bmin;
|
||||
if (Bmax < Amax)
|
||||
Amax = Bmax;
|
||||
if (Amax <= Amin)
|
||||
return SDL_FALSE;
|
||||
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_IntersectRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result)
|
||||
{
|
||||
int Amin, Amax, Bmin, Bmax;
|
||||
|
||||
if (!A) {
|
||||
SDL_InvalidParamError("A");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!B) {
|
||||
SDL_InvalidParamError("B");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
SDL_InvalidParamError("result");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Special cases for empty rects */
|
||||
if (SDL_RectEmpty(A) || SDL_RectEmpty(B)) {
|
||||
result->w = 0;
|
||||
result->h = 0;
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Horizontal intersection */
|
||||
Amin = A->x;
|
||||
Amax = Amin + A->w;
|
||||
Bmin = B->x;
|
||||
Bmax = Bmin + B->w;
|
||||
if (Bmin > Amin)
|
||||
Amin = Bmin;
|
||||
result->x = Amin;
|
||||
if (Bmax < Amax)
|
||||
Amax = Bmax;
|
||||
result->w = Amax - Amin;
|
||||
|
||||
/* Vertical intersection */
|
||||
Amin = A->y;
|
||||
Amax = Amin + A->h;
|
||||
Bmin = B->y;
|
||||
Bmax = Bmin + B->h;
|
||||
if (Bmin > Amin)
|
||||
Amin = Bmin;
|
||||
result->y = Amin;
|
||||
if (Bmax < Amax)
|
||||
Amax = Bmax;
|
||||
result->h = Amax - Amin;
|
||||
|
||||
return !SDL_RectEmpty(result);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_UnionRect(const SDL_Rect * A, const SDL_Rect * B, SDL_Rect * result)
|
||||
{
|
||||
int Amin, Amax, Bmin, Bmax;
|
||||
|
||||
if (!A) {
|
||||
SDL_InvalidParamError("A");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!B) {
|
||||
SDL_InvalidParamError("B");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!result) {
|
||||
SDL_InvalidParamError("result");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Special cases for empty Rects */
|
||||
if (SDL_RectEmpty(A)) {
|
||||
if (SDL_RectEmpty(B)) {
|
||||
/* A and B empty */
|
||||
return;
|
||||
} else {
|
||||
/* A empty, B not empty */
|
||||
*result = *B;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (SDL_RectEmpty(B)) {
|
||||
/* A not empty, B empty */
|
||||
*result = *A;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Horizontal union */
|
||||
Amin = A->x;
|
||||
Amax = Amin + A->w;
|
||||
Bmin = B->x;
|
||||
Bmax = Bmin + B->w;
|
||||
if (Bmin < Amin)
|
||||
Amin = Bmin;
|
||||
result->x = Amin;
|
||||
if (Bmax > Amax)
|
||||
Amax = Bmax;
|
||||
result->w = Amax - Amin;
|
||||
|
||||
/* Vertical union */
|
||||
Amin = A->y;
|
||||
Amax = Amin + A->h;
|
||||
Bmin = B->y;
|
||||
Bmax = Bmin + B->h;
|
||||
if (Bmin < Amin)
|
||||
Amin = Bmin;
|
||||
result->y = Amin;
|
||||
if (Bmax > Amax)
|
||||
Amax = Bmax;
|
||||
result->h = Amax - Amin;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_EnclosePoints(const SDL_Point * points, int count, const SDL_Rect * clip,
|
||||
SDL_Rect * result)
|
||||
{
|
||||
int minx = 0;
|
||||
int miny = 0;
|
||||
int maxx = 0;
|
||||
int maxy = 0;
|
||||
int x, y, i;
|
||||
|
||||
if (!points) {
|
||||
SDL_InvalidParamError("points");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (count < 1) {
|
||||
SDL_InvalidParamError("count");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (clip) {
|
||||
SDL_bool added = SDL_FALSE;
|
||||
const int clip_minx = clip->x;
|
||||
const int clip_miny = clip->y;
|
||||
const int clip_maxx = clip->x+clip->w-1;
|
||||
const int clip_maxy = clip->y+clip->h-1;
|
||||
|
||||
/* Special case for empty rectangle */
|
||||
if (SDL_RectEmpty(clip)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
x = points[i].x;
|
||||
y = points[i].y;
|
||||
|
||||
if (x < clip_minx || x > clip_maxx ||
|
||||
y < clip_miny || y > clip_maxy) {
|
||||
continue;
|
||||
}
|
||||
if (!added) {
|
||||
/* Special case: if no result was requested, we are done */
|
||||
if (result == NULL) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* First point added */
|
||||
minx = maxx = x;
|
||||
miny = maxy = y;
|
||||
added = SDL_TRUE;
|
||||
continue;
|
||||
}
|
||||
if (x < minx) {
|
||||
minx = x;
|
||||
} else if (x > maxx) {
|
||||
maxx = x;
|
||||
}
|
||||
if (y < miny) {
|
||||
miny = y;
|
||||
} else if (y > maxy) {
|
||||
maxy = y;
|
||||
}
|
||||
}
|
||||
if (!added) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
} else {
|
||||
/* Special case: if no result was requested, we are done */
|
||||
if (result == NULL) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* No clipping, always add the first point */
|
||||
minx = maxx = points[0].x;
|
||||
miny = maxy = points[0].y;
|
||||
|
||||
for (i = 1; i < count; ++i) {
|
||||
x = points[i].x;
|
||||
y = points[i].y;
|
||||
|
||||
if (x < minx) {
|
||||
minx = x;
|
||||
} else if (x > maxx) {
|
||||
maxx = x;
|
||||
}
|
||||
if (y < miny) {
|
||||
miny = y;
|
||||
} else if (y > maxy) {
|
||||
maxy = y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
result->x = minx;
|
||||
result->y = miny;
|
||||
result->w = (maxx-minx)+1;
|
||||
result->h = (maxy-miny)+1;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Use the Cohen-Sutherland algorithm for line clipping */
|
||||
#define CODE_BOTTOM 1
|
||||
#define CODE_TOP 2
|
||||
#define CODE_LEFT 4
|
||||
#define CODE_RIGHT 8
|
||||
|
||||
static int
|
||||
ComputeOutCode(const SDL_Rect * rect, int x, int y)
|
||||
{
|
||||
int code = 0;
|
||||
if (y < rect->y) {
|
||||
code |= CODE_TOP;
|
||||
} else if (y >= rect->y + rect->h) {
|
||||
code |= CODE_BOTTOM;
|
||||
}
|
||||
if (x < rect->x) {
|
||||
code |= CODE_LEFT;
|
||||
} else if (x >= rect->x + rect->w) {
|
||||
code |= CODE_RIGHT;
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_IntersectRectAndLine(const SDL_Rect * rect, int *X1, int *Y1, int *X2,
|
||||
int *Y2)
|
||||
{
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int x1, y1;
|
||||
int x2, y2;
|
||||
int rectx1;
|
||||
int recty1;
|
||||
int rectx2;
|
||||
int recty2;
|
||||
int outcode1, outcode2;
|
||||
|
||||
if (!rect) {
|
||||
SDL_InvalidParamError("rect");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!X1) {
|
||||
SDL_InvalidParamError("X1");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!Y1) {
|
||||
SDL_InvalidParamError("Y1");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!X2) {
|
||||
SDL_InvalidParamError("X2");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!Y2) {
|
||||
SDL_InvalidParamError("Y2");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Special case for empty rect */
|
||||
if (SDL_RectEmpty(rect)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
x1 = *X1;
|
||||
y1 = *Y1;
|
||||
x2 = *X2;
|
||||
y2 = *Y2;
|
||||
rectx1 = rect->x;
|
||||
recty1 = rect->y;
|
||||
rectx2 = rect->x + rect->w - 1;
|
||||
recty2 = rect->y + rect->h - 1;
|
||||
|
||||
/* Check to see if entire line is inside rect */
|
||||
if (x1 >= rectx1 && x1 <= rectx2 && x2 >= rectx1 && x2 <= rectx2 &&
|
||||
y1 >= recty1 && y1 <= recty2 && y2 >= recty1 && y2 <= recty2) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Check to see if entire line is to one side of rect */
|
||||
if ((x1 < rectx1 && x2 < rectx1) || (x1 > rectx2 && x2 > rectx2) ||
|
||||
(y1 < recty1 && y2 < recty1) || (y1 > recty2 && y2 > recty2)) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (y1 == y2) {
|
||||
/* Horizontal line, easy to clip */
|
||||
if (x1 < rectx1) {
|
||||
*X1 = rectx1;
|
||||
} else if (x1 > rectx2) {
|
||||
*X1 = rectx2;
|
||||
}
|
||||
if (x2 < rectx1) {
|
||||
*X2 = rectx1;
|
||||
} else if (x2 > rectx2) {
|
||||
*X2 = rectx2;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
if (x1 == x2) {
|
||||
/* Vertical line, easy to clip */
|
||||
if (y1 < recty1) {
|
||||
*Y1 = recty1;
|
||||
} else if (y1 > recty2) {
|
||||
*Y1 = recty2;
|
||||
}
|
||||
if (y2 < recty1) {
|
||||
*Y2 = recty1;
|
||||
} else if (y2 > recty2) {
|
||||
*Y2 = recty2;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* More complicated Cohen-Sutherland algorithm */
|
||||
outcode1 = ComputeOutCode(rect, x1, y1);
|
||||
outcode2 = ComputeOutCode(rect, x2, y2);
|
||||
while (outcode1 || outcode2) {
|
||||
if (outcode1 & outcode2) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (outcode1) {
|
||||
if (outcode1 & CODE_TOP) {
|
||||
y = recty1;
|
||||
x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);
|
||||
} else if (outcode1 & CODE_BOTTOM) {
|
||||
y = recty2;
|
||||
x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);
|
||||
} else if (outcode1 & CODE_LEFT) {
|
||||
x = rectx1;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
} else if (outcode1 & CODE_RIGHT) {
|
||||
x = rectx2;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
}
|
||||
x1 = x;
|
||||
y1 = y;
|
||||
outcode1 = ComputeOutCode(rect, x, y);
|
||||
} else {
|
||||
if (outcode2 & CODE_TOP) {
|
||||
y = recty1;
|
||||
x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);
|
||||
} else if (outcode2 & CODE_BOTTOM) {
|
||||
y = recty2;
|
||||
x = x1 + ((x2 - x1) * (y - y1)) / (y2 - y1);
|
||||
} else if (outcode2 & CODE_LEFT) {
|
||||
x = rectx1;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
} else if (outcode2 & CODE_RIGHT) {
|
||||
x = rectx2;
|
||||
y = y1 + ((y2 - y1) * (x - x1)) / (x2 - x1);
|
||||
}
|
||||
x2 = x;
|
||||
y2 = y;
|
||||
outcode2 = ComputeOutCode(rect, x, y);
|
||||
}
|
||||
}
|
||||
*X1 = x1;
|
||||
*Y1 = y1;
|
||||
*X2 = x2;
|
||||
*Y2 = y2;
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_GetSpanEnclosingRect(int width, int height,
|
||||
int numrects, const SDL_Rect * rects, SDL_Rect *span)
|
||||
{
|
||||
int i;
|
||||
int span_y1, span_y2;
|
||||
int rect_y1, rect_y2;
|
||||
|
||||
if (width < 1) {
|
||||
SDL_InvalidParamError("width");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (height < 1) {
|
||||
SDL_InvalidParamError("height");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!rects) {
|
||||
SDL_InvalidParamError("rects");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (!span) {
|
||||
SDL_InvalidParamError("span");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
if (numrects < 1) {
|
||||
SDL_InvalidParamError("numrects");
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Initialize to empty rect */
|
||||
span_y1 = height;
|
||||
span_y2 = 0;
|
||||
|
||||
for (i = 0; i < numrects; ++i) {
|
||||
rect_y1 = rects[i].y;
|
||||
rect_y2 = rect_y1 + rects[i].h;
|
||||
|
||||
/* Clip out of bounds rectangles, and expand span rect */
|
||||
if (rect_y1 < 0) {
|
||||
span_y1 = 0;
|
||||
} else if (rect_y1 < span_y1) {
|
||||
span_y1 = rect_y1;
|
||||
}
|
||||
if (rect_y2 > height) {
|
||||
span_y2 = height;
|
||||
} else if (rect_y2 > span_y2) {
|
||||
span_y2 = rect_y2;
|
||||
}
|
||||
}
|
||||
if (span_y2 > span_y1) {
|
||||
span->x = 0;
|
||||
span->y = span_y1;
|
||||
span->w = width;
|
||||
span->h = (span_y2 - span_y1);
|
||||
return SDL_TRUE;
|
||||
}
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
25
Engine/lib/sdl/src/video/SDL_rect_c.h
Normal file
25
Engine/lib/sdl/src/video/SDL_rect_c.h
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
extern SDL_bool SDL_GetSpanEnclosingRect(int width, int height, int numrects, const SDL_Rect * rects, SDL_Rect *span);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
286
Engine/lib/sdl/src/video/SDL_shape.c
Normal file
286
Engine/lib/sdl/src/video/SDL_shape.c
Normal file
|
|
@ -0,0 +1,286 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#include "SDL.h"
|
||||
#include "SDL_assert.h"
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_sysvideo.h"
|
||||
#include "SDL_pixels.h"
|
||||
#include "SDL_surface.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "SDL_shape_internals.h"
|
||||
|
||||
SDL_Window*
|
||||
SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags)
|
||||
{
|
||||
SDL_Window *result = NULL;
|
||||
result = SDL_CreateWindow(title,-1000,-1000,w,h,(flags | SDL_WINDOW_BORDERLESS) & (~SDL_WINDOW_FULLSCREEN) & (~SDL_WINDOW_RESIZABLE) /* & (~SDL_WINDOW_SHOWN) */);
|
||||
if(result != NULL) {
|
||||
result->shaper = SDL_GetVideoDevice()->shape_driver.CreateShaper(result);
|
||||
if(result->shaper != NULL) {
|
||||
result->shaper->userx = x;
|
||||
result->shaper->usery = y;
|
||||
result->shaper->mode.mode = ShapeModeDefault;
|
||||
result->shaper->mode.parameters.binarizationCutoff = 1;
|
||||
result->shaper->hasshape = SDL_FALSE;
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
SDL_DestroyWindow(result);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
SDL_IsShapedWindow(const SDL_Window *window)
|
||||
{
|
||||
if(window == NULL)
|
||||
return SDL_FALSE;
|
||||
else
|
||||
return (SDL_bool)(window->shaper != NULL);
|
||||
}
|
||||
|
||||
/* REQUIRES that bitmap point to a w-by-h bitmap with ppb pixels-per-byte. */
|
||||
void
|
||||
SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb)
|
||||
{
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
Uint8 r = 0,g = 0,b = 0,alpha = 0;
|
||||
Uint8* pixel = NULL;
|
||||
Uint32 bitmap_pixel,pixel_value = 0,mask_value = 0;
|
||||
SDL_Color key;
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_LockSurface(shape);
|
||||
for(y = 0;y<shape->h;y++) {
|
||||
for(x=0;x<shape->w;x++) {
|
||||
alpha = 0;
|
||||
pixel_value = 0;
|
||||
pixel = (Uint8 *)(shape->pixels) + (y*shape->pitch) + (x*shape->format->BytesPerPixel);
|
||||
switch(shape->format->BytesPerPixel) {
|
||||
case(1):
|
||||
pixel_value = *(Uint8*)pixel;
|
||||
break;
|
||||
case(2):
|
||||
pixel_value = *(Uint16*)pixel;
|
||||
break;
|
||||
case(3):
|
||||
pixel_value = *(Uint32*)pixel & (~shape->format->Amask);
|
||||
break;
|
||||
case(4):
|
||||
pixel_value = *(Uint32*)pixel;
|
||||
break;
|
||||
}
|
||||
SDL_GetRGBA(pixel_value,shape->format,&r,&g,&b,&alpha);
|
||||
bitmap_pixel = y*shape->w + x;
|
||||
switch(mode.mode) {
|
||||
case(ShapeModeDefault):
|
||||
mask_value = (alpha >= 1 ? 1 : 0);
|
||||
break;
|
||||
case(ShapeModeBinarizeAlpha):
|
||||
mask_value = (alpha >= mode.parameters.binarizationCutoff ? 1 : 0);
|
||||
break;
|
||||
case(ShapeModeReverseBinarizeAlpha):
|
||||
mask_value = (alpha <= mode.parameters.binarizationCutoff ? 1 : 0);
|
||||
break;
|
||||
case(ShapeModeColorKey):
|
||||
key = mode.parameters.colorKey;
|
||||
mask_value = ((key.r != r || key.g != g || key.b != b) ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
bitmap[bitmap_pixel / ppb] |= mask_value << (7 - ((ppb - 1) - (bitmap_pixel % ppb)));
|
||||
}
|
||||
}
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_UnlockSurface(shape);
|
||||
}
|
||||
|
||||
static SDL_ShapeTree*
|
||||
RecursivelyCalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* mask,SDL_Rect dimensions) {
|
||||
int x = 0,y = 0;
|
||||
Uint8* pixel = NULL;
|
||||
Uint32 pixel_value = 0;
|
||||
Uint8 r = 0,g = 0,b = 0,a = 0;
|
||||
SDL_bool pixel_opaque = SDL_FALSE;
|
||||
int last_opaque = -1;
|
||||
SDL_Color key;
|
||||
SDL_ShapeTree* result = (SDL_ShapeTree*)SDL_malloc(sizeof(SDL_ShapeTree));
|
||||
SDL_Rect next = {0,0,0,0};
|
||||
for(y=dimensions.y;y<dimensions.y + dimensions.h;y++) {
|
||||
for(x=dimensions.x;x<dimensions.x + dimensions.w;x++) {
|
||||
pixel_value = 0;
|
||||
pixel = (Uint8 *)(mask->pixels) + (y*mask->pitch) + (x*mask->format->BytesPerPixel);
|
||||
switch(mask->format->BytesPerPixel) {
|
||||
case(1):
|
||||
pixel_value = *(Uint8*)pixel;
|
||||
break;
|
||||
case(2):
|
||||
pixel_value = *(Uint16*)pixel;
|
||||
break;
|
||||
case(3):
|
||||
pixel_value = *(Uint32*)pixel & (~mask->format->Amask);
|
||||
break;
|
||||
case(4):
|
||||
pixel_value = *(Uint32*)pixel;
|
||||
break;
|
||||
}
|
||||
SDL_GetRGBA(pixel_value,mask->format,&r,&g,&b,&a);
|
||||
switch(mode.mode) {
|
||||
case(ShapeModeDefault):
|
||||
pixel_opaque = (a >= 1 ? SDL_TRUE : SDL_FALSE);
|
||||
break;
|
||||
case(ShapeModeBinarizeAlpha):
|
||||
pixel_opaque = (a >= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE);
|
||||
break;
|
||||
case(ShapeModeReverseBinarizeAlpha):
|
||||
pixel_opaque = (a <= mode.parameters.binarizationCutoff ? SDL_TRUE : SDL_FALSE);
|
||||
break;
|
||||
case(ShapeModeColorKey):
|
||||
key = mode.parameters.colorKey;
|
||||
pixel_opaque = ((key.r != r || key.g != g || key.b != b) ? SDL_TRUE : SDL_FALSE);
|
||||
break;
|
||||
}
|
||||
if(last_opaque == -1)
|
||||
last_opaque = pixel_opaque;
|
||||
if(last_opaque != pixel_opaque) {
|
||||
result->kind = QuadShape;
|
||||
/* These will stay the same. */
|
||||
next.w = dimensions.w / 2;
|
||||
next.h = dimensions.h / 2;
|
||||
/* These will change from recursion to recursion. */
|
||||
next.x = dimensions.x;
|
||||
next.y = dimensions.y;
|
||||
result->data.children.upleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
|
||||
next.x += next.w;
|
||||
/* Unneeded: next.y = dimensions.y; */
|
||||
result->data.children.upright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
|
||||
next.x = dimensions.x;
|
||||
next.y += next.h;
|
||||
result->data.children.downleft = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
|
||||
next.x += next.w;
|
||||
/* Unneeded: next.y = dimensions.y + dimensions.h /2; */
|
||||
result->data.children.downright = (struct SDL_ShapeTree *)RecursivelyCalculateShapeTree(mode,mask,next);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* If we never recursed, all the pixels in this quadrant have the same "value". */
|
||||
result->kind = (last_opaque == SDL_TRUE ? OpaqueShape : TransparentShape);
|
||||
result->data.shape = dimensions;
|
||||
return result;
|
||||
}
|
||||
|
||||
SDL_ShapeTree*
|
||||
SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape)
|
||||
{
|
||||
SDL_Rect dimensions = {0,0,shape->w,shape->h};
|
||||
SDL_ShapeTree* result = NULL;
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_LockSurface(shape);
|
||||
result = RecursivelyCalculateShapeTree(mode,shape,dimensions);
|
||||
if(SDL_MUSTLOCK(shape))
|
||||
SDL_UnlockSurface(shape);
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure)
|
||||
{
|
||||
SDL_assert(tree != NULL);
|
||||
if(tree->kind == QuadShape) {
|
||||
SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upleft,function,closure);
|
||||
SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.upright,function,closure);
|
||||
SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downleft,function,closure);
|
||||
SDL_TraverseShapeTree((SDL_ShapeTree *)tree->data.children.downright,function,closure);
|
||||
}
|
||||
else
|
||||
function(tree,closure);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_FreeShapeTree(SDL_ShapeTree** shape_tree)
|
||||
{
|
||||
if((*shape_tree)->kind == QuadShape) {
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.upright);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downleft);
|
||||
SDL_FreeShapeTree((SDL_ShapeTree **)&(*shape_tree)->data.children.downright);
|
||||
}
|
||||
SDL_free(*shape_tree);
|
||||
*shape_tree = NULL;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode)
|
||||
{
|
||||
int result;
|
||||
if(window == NULL || !SDL_IsShapedWindow(window))
|
||||
/* The window given was not a shapeable window. */
|
||||
return SDL_NONSHAPEABLE_WINDOW;
|
||||
if(shape == NULL)
|
||||
/* Invalid shape argument. */
|
||||
return SDL_INVALID_SHAPE_ARGUMENT;
|
||||
|
||||
if(shape_mode != NULL)
|
||||
window->shaper->mode = *shape_mode;
|
||||
result = SDL_GetVideoDevice()->shape_driver.SetWindowShape(window->shaper,shape,shape_mode);
|
||||
window->shaper->hasshape = SDL_TRUE;
|
||||
if(window->shaper->userx != 0 && window->shaper->usery != 0) {
|
||||
SDL_SetWindowPosition(window,window->shaper->userx,window->shaper->usery);
|
||||
window->shaper->userx = 0;
|
||||
window->shaper->usery = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
SDL_WindowHasAShape(SDL_Window *window)
|
||||
{
|
||||
if (window == NULL || !SDL_IsShapedWindow(window))
|
||||
return SDL_FALSE;
|
||||
return window->shaper->hasshape;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode)
|
||||
{
|
||||
if(window != NULL && SDL_IsShapedWindow(window)) {
|
||||
if(shape_mode == NULL) {
|
||||
if(SDL_WindowHasAShape(window))
|
||||
/* The window given has a shape. */
|
||||
return 0;
|
||||
else
|
||||
/* The window given is shapeable but lacks a shape. */
|
||||
return SDL_WINDOW_LACKS_SHAPE;
|
||||
}
|
||||
else {
|
||||
*shape_mode = window->shaper->mode;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
/* The window given is not a valid shapeable window. */
|
||||
return SDL_NONSHAPEABLE_WINDOW;
|
||||
}
|
||||
69
Engine/lib/sdl/src/video/SDL_shape_internals.h
Normal file
69
Engine/lib/sdl/src/video/SDL_shape_internals.h
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_shape_internals_h
|
||||
#define _SDL_shape_internals_h
|
||||
|
||||
#include "SDL_rect.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "SDL_surface.h"
|
||||
|
||||
#include "begin_code.h"
|
||||
/* Set up for C function definitions, even when using C++ */
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
extern "C" {
|
||||
/* *INDENT-ON* */
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
struct SDL_ShapeTree *upleft,*upright,*downleft,*downright;
|
||||
} SDL_QuadTreeChildren;
|
||||
|
||||
typedef union {
|
||||
SDL_QuadTreeChildren children;
|
||||
SDL_Rect shape;
|
||||
} SDL_ShapeUnion;
|
||||
|
||||
typedef enum { QuadShape,TransparentShape,OpaqueShape } SDL_ShapeKind;
|
||||
|
||||
typedef struct {
|
||||
SDL_ShapeKind kind;
|
||||
SDL_ShapeUnion data;
|
||||
} SDL_ShapeTree;
|
||||
|
||||
typedef void(*SDL_TraversalFunction)(SDL_ShapeTree*,void*);
|
||||
|
||||
extern void SDL_CalculateShapeBitmap(SDL_WindowShapeMode mode,SDL_Surface *shape,Uint8* bitmap,Uint8 ppb);
|
||||
extern SDL_ShapeTree* SDL_CalculateShapeTree(SDL_WindowShapeMode mode,SDL_Surface* shape);
|
||||
extern void SDL_TraverseShapeTree(SDL_ShapeTree *tree,SDL_TraversalFunction function,void* closure);
|
||||
extern void SDL_FreeShapeTree(SDL_ShapeTree** shape_tree);
|
||||
|
||||
/* Ends C function definitions when using C++ */
|
||||
#ifdef __cplusplus
|
||||
/* *INDENT-OFF* */
|
||||
}
|
||||
/* *INDENT-ON* */
|
||||
#endif
|
||||
#include "close_code.h"
|
||||
|
||||
#endif
|
||||
353
Engine/lib/sdl/src/video/SDL_stretch.c
Normal file
353
Engine/lib/sdl/src/video/SDL_stretch.c
Normal file
|
|
@ -0,0 +1,353 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
/* This a stretch blit implementation based on ideas given to me by
|
||||
Tomasz Cejner - thanks! :)
|
||||
|
||||
April 27, 2000 - Sam Lantinga
|
||||
*/
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_blit.h"
|
||||
|
||||
/* This isn't ready for general consumption yet - it should be folded
|
||||
into the general blitting mechanism.
|
||||
*/
|
||||
|
||||
#if ((defined(_MFC_VER) && defined(_M_IX86)) || \
|
||||
defined(__WATCOMC__) || \
|
||||
(defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES
|
||||
/* There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct
|
||||
* value after the first scanline. FIXME? */
|
||||
/* #define USE_ASM_STRETCH */
|
||||
#endif
|
||||
|
||||
#ifdef USE_ASM_STRETCH
|
||||
|
||||
#ifdef HAVE_MPROTECT
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
#ifdef __GNUC__
|
||||
#define PAGE_ALIGNED __attribute__((__aligned__(4096)))
|
||||
#else
|
||||
#define PAGE_ALIGNED
|
||||
#endif
|
||||
|
||||
#if defined(_M_IX86) || defined(i386)
|
||||
#define PREFIX16 0x66
|
||||
#define STORE_BYTE 0xAA
|
||||
#define STORE_WORD 0xAB
|
||||
#define LOAD_BYTE 0xAC
|
||||
#define LOAD_WORD 0xAD
|
||||
#define RETURN 0xC3
|
||||
#else
|
||||
#error Need assembly opcodes for this architecture
|
||||
#endif
|
||||
|
||||
static unsigned char copy_row[4096] PAGE_ALIGNED;
|
||||
|
||||
static int
|
||||
generate_rowbytes(int src_w, int dst_w, int bpp)
|
||||
{
|
||||
static struct
|
||||
{
|
||||
int bpp;
|
||||
int src_w;
|
||||
int dst_w;
|
||||
int status;
|
||||
} last;
|
||||
|
||||
int i;
|
||||
int pos, inc;
|
||||
unsigned char *eip, *fence;
|
||||
unsigned char load, store;
|
||||
|
||||
/* See if we need to regenerate the copy buffer */
|
||||
if ((src_w == last.src_w) && (dst_w == last.dst_w) && (bpp == last.bpp)) {
|
||||
return (last.status);
|
||||
}
|
||||
last.bpp = bpp;
|
||||
last.src_w = src_w;
|
||||
last.dst_w = dst_w;
|
||||
last.status = -1;
|
||||
|
||||
switch (bpp) {
|
||||
case 1:
|
||||
load = LOAD_BYTE;
|
||||
store = STORE_BYTE;
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
load = LOAD_WORD;
|
||||
store = STORE_WORD;
|
||||
break;
|
||||
default:
|
||||
return SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp);
|
||||
}
|
||||
#ifdef HAVE_MPROTECT
|
||||
/* Make the code writeable */
|
||||
if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_WRITE) < 0) {
|
||||
return SDL_SetError("Couldn't make copy buffer writeable");
|
||||
}
|
||||
#endif
|
||||
pos = 0x10000;
|
||||
inc = (src_w << 16) / dst_w;
|
||||
eip = copy_row;
|
||||
fence = copy_row + sizeof(copy_row)-2;
|
||||
for (i = 0; i < dst_w; ++i) {
|
||||
while (pos >= 0x10000L) {
|
||||
if (eip == fence) {
|
||||
return -1;
|
||||
}
|
||||
if (bpp == 2) {
|
||||
*eip++ = PREFIX16;
|
||||
}
|
||||
*eip++ = load;
|
||||
pos -= 0x10000L;
|
||||
}
|
||||
if (eip == fence) {
|
||||
return -1;
|
||||
}
|
||||
if (bpp == 2) {
|
||||
*eip++ = PREFIX16;
|
||||
}
|
||||
*eip++ = store;
|
||||
pos += inc;
|
||||
}
|
||||
*eip++ = RETURN;
|
||||
|
||||
#ifdef HAVE_MPROTECT
|
||||
/* Make the code executable but not writeable */
|
||||
if (mprotect(copy_row, sizeof(copy_row), PROT_READ | PROT_EXEC) < 0) {
|
||||
return SDL_SetError("Couldn't make copy buffer executable");
|
||||
}
|
||||
#endif
|
||||
last.status = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
#endif /* USE_ASM_STRETCH */
|
||||
|
||||
#define DEFINE_COPY_ROW(name, type) \
|
||||
static void name(type *src, int src_w, type *dst, int dst_w) \
|
||||
{ \
|
||||
int i; \
|
||||
int pos, inc; \
|
||||
type pixel = 0; \
|
||||
\
|
||||
pos = 0x10000; \
|
||||
inc = (src_w << 16) / dst_w; \
|
||||
for ( i=dst_w; i>0; --i ) { \
|
||||
while ( pos >= 0x10000L ) { \
|
||||
pixel = *src++; \
|
||||
pos -= 0x10000L; \
|
||||
} \
|
||||
*dst++ = pixel; \
|
||||
pos += inc; \
|
||||
} \
|
||||
}
|
||||
/* *INDENT-OFF* */
|
||||
DEFINE_COPY_ROW(copy_row1, Uint8)
|
||||
DEFINE_COPY_ROW(copy_row2, Uint16)
|
||||
DEFINE_COPY_ROW(copy_row4, Uint32)
|
||||
/* *INDENT-ON* */
|
||||
|
||||
/* The ASM code doesn't handle 24-bpp stretch blits */
|
||||
static void
|
||||
copy_row3(Uint8 * src, int src_w, Uint8 * dst, int dst_w)
|
||||
{
|
||||
int i;
|
||||
int pos, inc;
|
||||
Uint8 pixel[3] = { 0, 0, 0 };
|
||||
|
||||
pos = 0x10000;
|
||||
inc = (src_w << 16) / dst_w;
|
||||
for (i = dst_w; i > 0; --i) {
|
||||
while (pos >= 0x10000L) {
|
||||
pixel[0] = *src++;
|
||||
pixel[1] = *src++;
|
||||
pixel[2] = *src++;
|
||||
pos -= 0x10000L;
|
||||
}
|
||||
*dst++ = pixel[0];
|
||||
*dst++ = pixel[1];
|
||||
*dst++ = pixel[2];
|
||||
pos += inc;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform a stretch blit between two surfaces of the same format.
|
||||
NOTE: This function is not safe to call from multiple threads!
|
||||
*/
|
||||
int
|
||||
SDL_SoftStretch(SDL_Surface * src, const SDL_Rect * srcrect,
|
||||
SDL_Surface * dst, const SDL_Rect * dstrect)
|
||||
{
|
||||
int src_locked;
|
||||
int dst_locked;
|
||||
int pos, inc;
|
||||
int dst_maxrow;
|
||||
int src_row, dst_row;
|
||||
Uint8 *srcp = NULL;
|
||||
Uint8 *dstp;
|
||||
SDL_Rect full_src;
|
||||
SDL_Rect full_dst;
|
||||
#ifdef USE_ASM_STRETCH
|
||||
SDL_bool use_asm = SDL_TRUE;
|
||||
#ifdef __GNUC__
|
||||
int u1, u2;
|
||||
#endif
|
||||
#endif /* USE_ASM_STRETCH */
|
||||
const int bpp = dst->format->BytesPerPixel;
|
||||
|
||||
if (src->format->format != dst->format->format) {
|
||||
return SDL_SetError("Only works with same format surfaces");
|
||||
}
|
||||
|
||||
/* Verify the blit rectangles */
|
||||
if (srcrect) {
|
||||
if ((srcrect->x < 0) || (srcrect->y < 0) ||
|
||||
((srcrect->x + srcrect->w) > src->w) ||
|
||||
((srcrect->y + srcrect->h) > src->h)) {
|
||||
return SDL_SetError("Invalid source blit rectangle");
|
||||
}
|
||||
} else {
|
||||
full_src.x = 0;
|
||||
full_src.y = 0;
|
||||
full_src.w = src->w;
|
||||
full_src.h = src->h;
|
||||
srcrect = &full_src;
|
||||
}
|
||||
if (dstrect) {
|
||||
if ((dstrect->x < 0) || (dstrect->y < 0) ||
|
||||
((dstrect->x + dstrect->w) > dst->w) ||
|
||||
((dstrect->y + dstrect->h) > dst->h)) {
|
||||
return SDL_SetError("Invalid destination blit rectangle");
|
||||
}
|
||||
} else {
|
||||
full_dst.x = 0;
|
||||
full_dst.y = 0;
|
||||
full_dst.w = dst->w;
|
||||
full_dst.h = dst->h;
|
||||
dstrect = &full_dst;
|
||||
}
|
||||
|
||||
/* Lock the destination if it's in hardware */
|
||||
dst_locked = 0;
|
||||
if (SDL_MUSTLOCK(dst)) {
|
||||
if (SDL_LockSurface(dst) < 0) {
|
||||
return SDL_SetError("Unable to lock destination surface");
|
||||
}
|
||||
dst_locked = 1;
|
||||
}
|
||||
/* Lock the source if it's in hardware */
|
||||
src_locked = 0;
|
||||
if (SDL_MUSTLOCK(src)) {
|
||||
if (SDL_LockSurface(src) < 0) {
|
||||
if (dst_locked) {
|
||||
SDL_UnlockSurface(dst);
|
||||
}
|
||||
return SDL_SetError("Unable to lock source surface");
|
||||
}
|
||||
src_locked = 1;
|
||||
}
|
||||
|
||||
/* Set up the data... */
|
||||
pos = 0x10000;
|
||||
inc = (srcrect->h << 16) / dstrect->h;
|
||||
src_row = srcrect->y;
|
||||
dst_row = dstrect->y;
|
||||
|
||||
#ifdef USE_ASM_STRETCH
|
||||
/* Write the opcodes for this stretch */
|
||||
if ((bpp == 3) || (generate_rowbytes(srcrect->w, dstrect->w, bpp) < 0)) {
|
||||
use_asm = SDL_FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Perform the stretch blit */
|
||||
for (dst_maxrow = dst_row + dstrect->h; dst_row < dst_maxrow; ++dst_row) {
|
||||
dstp = (Uint8 *) dst->pixels + (dst_row * dst->pitch)
|
||||
+ (dstrect->x * bpp);
|
||||
while (pos >= 0x10000L) {
|
||||
srcp = (Uint8 *) src->pixels + (src_row * src->pitch)
|
||||
+ (srcrect->x * bpp);
|
||||
++src_row;
|
||||
pos -= 0x10000L;
|
||||
}
|
||||
#ifdef USE_ASM_STRETCH
|
||||
if (use_asm) {
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__("call *%4":"=&D"(u1), "=&S"(u2)
|
||||
:"0"(dstp), "1"(srcp), "r"(copy_row)
|
||||
:"memory");
|
||||
#elif defined(_MSC_VER) || defined(__WATCOMC__)
|
||||
/* *INDENT-OFF* */
|
||||
{
|
||||
void *code = copy_row;
|
||||
__asm {
|
||||
push edi
|
||||
push esi
|
||||
mov edi, dstp
|
||||
mov esi, srcp
|
||||
call dword ptr code
|
||||
pop esi
|
||||
pop edi
|
||||
}
|
||||
}
|
||||
/* *INDENT-ON* */
|
||||
#else
|
||||
#error Need inline assembly for this compiler
|
||||
#endif
|
||||
} else
|
||||
#endif
|
||||
switch (bpp) {
|
||||
case 1:
|
||||
copy_row1(srcp, srcrect->w, dstp, dstrect->w);
|
||||
break;
|
||||
case 2:
|
||||
copy_row2((Uint16 *) srcp, srcrect->w,
|
||||
(Uint16 *) dstp, dstrect->w);
|
||||
break;
|
||||
case 3:
|
||||
copy_row3(srcp, srcrect->w, dstp, dstrect->w);
|
||||
break;
|
||||
case 4:
|
||||
copy_row4((Uint32 *) srcp, srcrect->w,
|
||||
(Uint32 *) dstp, dstrect->w);
|
||||
break;
|
||||
}
|
||||
pos += inc;
|
||||
}
|
||||
|
||||
/* We need to unlock the surfaces if they're locked */
|
||||
if (dst_locked) {
|
||||
SDL_UnlockSurface(dst);
|
||||
}
|
||||
if (src_locked) {
|
||||
SDL_UnlockSurface(src);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1094
Engine/lib/sdl/src/video/SDL_surface.c
Normal file
1094
Engine/lib/sdl/src/video/SDL_surface.c
Normal file
File diff suppressed because it is too large
Load diff
410
Engine/lib/sdl/src/video/SDL_sysvideo.h
Normal file
410
Engine/lib/sdl/src/video/SDL_sysvideo.h
Normal file
|
|
@ -0,0 +1,410 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_sysvideo_h
|
||||
#define _SDL_sysvideo_h
|
||||
|
||||
#include "SDL_messagebox.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "SDL_thread.h"
|
||||
|
||||
/* The SDL video driver */
|
||||
|
||||
typedef struct SDL_WindowShaper SDL_WindowShaper;
|
||||
typedef struct SDL_ShapeDriver SDL_ShapeDriver;
|
||||
typedef struct SDL_VideoDisplay SDL_VideoDisplay;
|
||||
typedef struct SDL_VideoDevice SDL_VideoDevice;
|
||||
|
||||
/* Define the SDL window-shaper structure */
|
||||
struct SDL_WindowShaper
|
||||
{
|
||||
/* The window associated with the shaper */
|
||||
SDL_Window *window;
|
||||
|
||||
/* The user's specified coordinates for the window, for once we give it a shape. */
|
||||
Uint32 userx,usery;
|
||||
|
||||
/* The parameters for shape calculation. */
|
||||
SDL_WindowShapeMode mode;
|
||||
|
||||
/* Has this window been assigned a shape? */
|
||||
SDL_bool hasshape;
|
||||
|
||||
void *driverdata;
|
||||
};
|
||||
|
||||
/* Define the SDL shape driver structure */
|
||||
struct SDL_ShapeDriver
|
||||
{
|
||||
SDL_WindowShaper *(*CreateShaper)(SDL_Window * window);
|
||||
int (*SetWindowShape)(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
|
||||
int (*ResizeWindowShape)(SDL_Window *window);
|
||||
};
|
||||
|
||||
typedef struct SDL_WindowUserData
|
||||
{
|
||||
char *name;
|
||||
void *data;
|
||||
struct SDL_WindowUserData *next;
|
||||
} SDL_WindowUserData;
|
||||
|
||||
/* Define the SDL window structure, corresponding to toplevel windows */
|
||||
struct SDL_Window
|
||||
{
|
||||
const void *magic;
|
||||
Uint32 id;
|
||||
char *title;
|
||||
SDL_Surface *icon;
|
||||
int x, y;
|
||||
int w, h;
|
||||
int min_w, min_h;
|
||||
int max_w, max_h;
|
||||
Uint32 flags;
|
||||
Uint32 last_fullscreen_flags;
|
||||
|
||||
/* Stored position and size for windowed mode */
|
||||
SDL_Rect windowed;
|
||||
|
||||
SDL_DisplayMode fullscreen_mode;
|
||||
|
||||
float brightness;
|
||||
Uint16 *gamma;
|
||||
Uint16 *saved_gamma; /* (just offset into gamma) */
|
||||
|
||||
SDL_Surface *surface;
|
||||
SDL_bool surface_valid;
|
||||
|
||||
SDL_bool is_destroying;
|
||||
|
||||
SDL_WindowShaper *shaper;
|
||||
|
||||
SDL_WindowUserData *data;
|
||||
|
||||
void *driverdata;
|
||||
|
||||
SDL_Window *prev;
|
||||
SDL_Window *next;
|
||||
};
|
||||
#define FULLSCREEN_VISIBLE(W) \
|
||||
(((W)->flags & SDL_WINDOW_FULLSCREEN) && \
|
||||
((W)->flags & SDL_WINDOW_SHOWN) && \
|
||||
!((W)->flags & SDL_WINDOW_MINIMIZED))
|
||||
|
||||
/*
|
||||
* Define the SDL display structure This corresponds to physical monitors
|
||||
* attached to the system.
|
||||
*/
|
||||
struct SDL_VideoDisplay
|
||||
{
|
||||
char *name;
|
||||
int max_display_modes;
|
||||
int num_display_modes;
|
||||
SDL_DisplayMode *display_modes;
|
||||
SDL_DisplayMode desktop_mode;
|
||||
SDL_DisplayMode current_mode;
|
||||
|
||||
SDL_Window *fullscreen_window;
|
||||
|
||||
SDL_VideoDevice *device;
|
||||
|
||||
void *driverdata;
|
||||
};
|
||||
|
||||
/* Forward declaration */
|
||||
struct SDL_SysWMinfo;
|
||||
|
||||
/* Define the SDL video driver structure */
|
||||
#define _THIS SDL_VideoDevice *_this
|
||||
|
||||
struct SDL_VideoDevice
|
||||
{
|
||||
/* * * */
|
||||
/* The name of this video driver */
|
||||
const char *name;
|
||||
|
||||
/* * * */
|
||||
/* Initialization/Query functions */
|
||||
|
||||
/*
|
||||
* Initialize the native video subsystem, filling in the list of
|
||||
* displays for this driver, returning 0 or -1 if there's an error.
|
||||
*/
|
||||
int (*VideoInit) (_THIS);
|
||||
|
||||
/*
|
||||
* Reverse the effects VideoInit() -- called if VideoInit() fails or
|
||||
* if the application is shutting down the video subsystem.
|
||||
*/
|
||||
void (*VideoQuit) (_THIS);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Display functions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Get the bounds of a display
|
||||
*/
|
||||
int (*GetDisplayBounds) (_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
|
||||
|
||||
/*
|
||||
* Get a list of the available display modes for a display.
|
||||
*/
|
||||
void (*GetDisplayModes) (_THIS, SDL_VideoDisplay * display);
|
||||
|
||||
/*
|
||||
* Setting the display mode is independent of creating windows, so
|
||||
* when the display mode is changed, all existing windows should have
|
||||
* their data updated accordingly, including the display surfaces
|
||||
* associated with them.
|
||||
*/
|
||||
int (*SetDisplayMode) (_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Window functions
|
||||
*/
|
||||
int (*CreateWindow) (_THIS, SDL_Window * window);
|
||||
int (*CreateWindowFrom) (_THIS, SDL_Window * window, const void *data);
|
||||
void (*SetWindowTitle) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowIcon) (_THIS, SDL_Window * window, SDL_Surface * icon);
|
||||
void (*SetWindowPosition) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowSize) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowMinimumSize) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
|
||||
void (*ShowWindow) (_THIS, SDL_Window * window);
|
||||
void (*HideWindow) (_THIS, SDL_Window * window);
|
||||
void (*RaiseWindow) (_THIS, SDL_Window * window);
|
||||
void (*MaximizeWindow) (_THIS, SDL_Window * window);
|
||||
void (*MinimizeWindow) (_THIS, SDL_Window * window);
|
||||
void (*RestoreWindow) (_THIS, SDL_Window * window);
|
||||
void (*SetWindowBordered) (_THIS, SDL_Window * window, SDL_bool bordered);
|
||||
void (*SetWindowFullscreen) (_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||
int (*SetWindowGammaRamp) (_THIS, SDL_Window * window, const Uint16 * ramp);
|
||||
int (*GetWindowGammaRamp) (_THIS, SDL_Window * window, Uint16 * ramp);
|
||||
void (*SetWindowGrab) (_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||
void (*DestroyWindow) (_THIS, SDL_Window * window);
|
||||
int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
|
||||
int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
|
||||
void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
|
||||
void (*OnWindowEnter) (_THIS, SDL_Window * window);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Shaped-window functions
|
||||
*/
|
||||
SDL_ShapeDriver shape_driver;
|
||||
|
||||
/* Get some platform dependent window information */
|
||||
SDL_bool(*GetWindowWMInfo) (_THIS, SDL_Window * window,
|
||||
struct SDL_SysWMinfo * info);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* OpenGL support
|
||||
*/
|
||||
int (*GL_LoadLibrary) (_THIS, const char *path);
|
||||
void *(*GL_GetProcAddress) (_THIS, const char *proc);
|
||||
void (*GL_UnloadLibrary) (_THIS);
|
||||
SDL_GLContext(*GL_CreateContext) (_THIS, SDL_Window * window);
|
||||
int (*GL_MakeCurrent) (_THIS, SDL_Window * window, SDL_GLContext context);
|
||||
void (*GL_GetDrawableSize) (_THIS, SDL_Window * window, int *w, int *h);
|
||||
int (*GL_SetSwapInterval) (_THIS, int interval);
|
||||
int (*GL_GetSwapInterval) (_THIS);
|
||||
void (*GL_SwapWindow) (_THIS, SDL_Window * window);
|
||||
void (*GL_DeleteContext) (_THIS, SDL_GLContext context);
|
||||
|
||||
/* * * */
|
||||
/*
|
||||
* Event manager functions
|
||||
*/
|
||||
void (*PumpEvents) (_THIS);
|
||||
|
||||
/* Suspend the screensaver */
|
||||
void (*SuspendScreenSaver) (_THIS);
|
||||
|
||||
/* Text input */
|
||||
void (*StartTextInput) (_THIS);
|
||||
void (*StopTextInput) (_THIS);
|
||||
void (*SetTextInputRect) (_THIS, SDL_Rect *rect);
|
||||
|
||||
/* Screen keyboard */
|
||||
SDL_bool (*HasScreenKeyboardSupport) (_THIS);
|
||||
void (*ShowScreenKeyboard) (_THIS, SDL_Window *window);
|
||||
void (*HideScreenKeyboard) (_THIS, SDL_Window *window);
|
||||
SDL_bool (*IsScreenKeyboardShown) (_THIS, SDL_Window *window);
|
||||
|
||||
/* Clipboard */
|
||||
int (*SetClipboardText) (_THIS, const char *text);
|
||||
char * (*GetClipboardText) (_THIS);
|
||||
SDL_bool (*HasClipboardText) (_THIS);
|
||||
|
||||
/* MessageBox */
|
||||
int (*ShowMessageBox) (_THIS, const SDL_MessageBoxData *messageboxdata, int *buttonid);
|
||||
|
||||
/* * * */
|
||||
/* Data common to all drivers */
|
||||
SDL_bool suspend_screensaver;
|
||||
int num_displays;
|
||||
SDL_VideoDisplay *displays;
|
||||
SDL_Window *windows;
|
||||
Uint8 window_magic;
|
||||
Uint32 next_object_id;
|
||||
char * clipboard_text;
|
||||
|
||||
/* * * */
|
||||
/* Data used by the GL drivers */
|
||||
struct
|
||||
{
|
||||
int red_size;
|
||||
int green_size;
|
||||
int blue_size;
|
||||
int alpha_size;
|
||||
int depth_size;
|
||||
int buffer_size;
|
||||
int stencil_size;
|
||||
int double_buffer;
|
||||
int accum_red_size;
|
||||
int accum_green_size;
|
||||
int accum_blue_size;
|
||||
int accum_alpha_size;
|
||||
int stereo;
|
||||
int multisamplebuffers;
|
||||
int multisamplesamples;
|
||||
int accelerated;
|
||||
int major_version;
|
||||
int minor_version;
|
||||
int flags;
|
||||
int profile_mask;
|
||||
int share_with_current_context;
|
||||
int framebuffer_srgb_capable;
|
||||
int retained_backing;
|
||||
int driver_loaded;
|
||||
char driver_path[256];
|
||||
void *dll_handle;
|
||||
} gl_config;
|
||||
|
||||
/* * * */
|
||||
/* Cache current GL context; don't call the OS when it hasn't changed. */
|
||||
/* We have the global pointers here so Cocoa continues to work the way
|
||||
it always has, and the thread-local storage for the general case.
|
||||
*/
|
||||
SDL_Window *current_glwin;
|
||||
SDL_GLContext current_glctx;
|
||||
SDL_TLSID current_glwin_tls;
|
||||
SDL_TLSID current_glctx_tls;
|
||||
|
||||
/* * * */
|
||||
/* Data private to this driver */
|
||||
void *driverdata;
|
||||
struct SDL_GLDriverData *gl_data;
|
||||
|
||||
#if SDL_VIDEO_OPENGL_EGL
|
||||
struct SDL_EGL_VideoData *egl_data;
|
||||
#endif
|
||||
|
||||
#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
|
||||
struct SDL_PrivateGLESData *gles_data;
|
||||
#endif
|
||||
|
||||
/* * * */
|
||||
/* The function used to dispose of this structure */
|
||||
void (*free) (_THIS);
|
||||
};
|
||||
|
||||
typedef struct VideoBootStrap
|
||||
{
|
||||
const char *name;
|
||||
const char *desc;
|
||||
int (*available) (void);
|
||||
SDL_VideoDevice *(*create) (int devindex);
|
||||
} VideoBootStrap;
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
extern VideoBootStrap COCOA_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_X11
|
||||
extern VideoBootStrap X11_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_MIR
|
||||
extern VideoBootStrap MIR_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
extern VideoBootStrap DirectFB_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WINDOWS
|
||||
extern VideoBootStrap WINDOWS_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WINRT
|
||||
extern VideoBootStrap WINRT_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
extern VideoBootStrap HAIKU_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_PANDORA
|
||||
extern VideoBootStrap PND_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_UIKIT
|
||||
extern VideoBootStrap UIKIT_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
extern VideoBootStrap Android_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_PSP
|
||||
extern VideoBootStrap PSP_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_RPI
|
||||
extern VideoBootStrap RPI_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
extern VideoBootStrap DUMMY_bootstrap;
|
||||
#endif
|
||||
#if SDL_VIDEO_DRIVER_WAYLAND
|
||||
extern VideoBootStrap Wayland_bootstrap;
|
||||
#endif
|
||||
|
||||
extern SDL_VideoDevice *SDL_GetVideoDevice(void);
|
||||
extern int SDL_AddBasicVideoDisplay(const SDL_DisplayMode * desktop_mode);
|
||||
extern int SDL_AddVideoDisplay(const SDL_VideoDisplay * display);
|
||||
extern SDL_bool SDL_AddDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode * mode);
|
||||
extern SDL_VideoDisplay *SDL_GetDisplayForWindow(SDL_Window *window);
|
||||
extern void *SDL_GetDisplayDriverData( int displayIndex );
|
||||
|
||||
extern int SDL_RecreateWindow(SDL_Window * window, Uint32 flags);
|
||||
|
||||
extern void SDL_OnWindowShown(SDL_Window * window);
|
||||
extern void SDL_OnWindowHidden(SDL_Window * window);
|
||||
extern void SDL_OnWindowResized(SDL_Window * window);
|
||||
extern void SDL_OnWindowMinimized(SDL_Window * window);
|
||||
extern void SDL_OnWindowRestored(SDL_Window * window);
|
||||
extern void SDL_OnWindowEnter(SDL_Window * window);
|
||||
extern void SDL_OnWindowLeave(SDL_Window * window);
|
||||
extern void SDL_OnWindowFocusGained(SDL_Window * window);
|
||||
extern void SDL_OnWindowFocusLost(SDL_Window * window);
|
||||
extern void SDL_UpdateWindowGrab(SDL_Window * window);
|
||||
extern SDL_Window * SDL_GetFocusWindow(void);
|
||||
|
||||
extern SDL_bool SDL_ShouldAllowTopmost(void);
|
||||
|
||||
#endif /* _SDL_sysvideo_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
3345
Engine/lib/sdl/src/video/SDL_video.c
Normal file
3345
Engine/lib/sdl/src/video/SDL_video.c
Normal file
File diff suppressed because it is too large
Load diff
48
Engine/lib/sdl/src/video/android/SDL_androidclipboard.c
Normal file
48
Engine/lib/sdl/src/video/android/SDL_androidclipboard.c
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
int
|
||||
Android_SetClipboardText(_THIS, const char *text)
|
||||
{
|
||||
return Android_JNI_SetClipboardText(text);
|
||||
}
|
||||
|
||||
char *
|
||||
Android_GetClipboardText(_THIS)
|
||||
{
|
||||
return Android_JNI_GetClipboardText();
|
||||
}
|
||||
|
||||
SDL_bool Android_HasClipboardText(_THIS)
|
||||
{
|
||||
return Android_JNI_HasClipboardText();
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
32
Engine/lib/sdl/src/video/android/SDL_androidclipboard.h
Normal file
32
Engine/lib/sdl/src/video/android/SDL_androidclipboard.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidclipboard_h
|
||||
#define _SDL_androidclipboard_h
|
||||
|
||||
extern int Android_SetClipboardText(_THIS, const char *text);
|
||||
extern char *Android_GetClipboardText(_THIS);
|
||||
extern SDL_bool Android_HasClipboardText(_THIS);
|
||||
|
||||
#endif /* _SDL_androidclipboard_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
112
Engine/lib/sdl/src/video/android/SDL_androidevents.c
Normal file
112
Engine/lib/sdl/src/video/android/SDL_androidevents.c
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
/* We're going to do this by default */
|
||||
#define SDL_ANDROID_BLOCK_ON_PAUSE 1
|
||||
|
||||
#include "SDL_androidevents.h"
|
||||
#include "SDL_events.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
|
||||
void android_egl_context_backup();
|
||||
void android_egl_context_restore();
|
||||
|
||||
void
|
||||
android_egl_context_restore()
|
||||
{
|
||||
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
|
||||
if (SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context) < 0) {
|
||||
/* The context is no longer valid, create a new one */
|
||||
/* FIXME: Notify the user that the context changed and textures need to be re created */
|
||||
data->egl_context = (EGLContext) SDL_GL_CreateContext(Android_Window);
|
||||
SDL_GL_MakeCurrent(Android_Window, (SDL_GLContext) data->egl_context);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
android_egl_context_backup()
|
||||
{
|
||||
/* Keep a copy of the EGL Context so we can try to restore it when we resume */
|
||||
SDL_WindowData *data = (SDL_WindowData *) Android_Window->driverdata;
|
||||
data->egl_context = SDL_GL_GetCurrentContext();
|
||||
/* We need to do this so the EGLSurface can be freed */
|
||||
SDL_GL_MakeCurrent(Android_Window, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
Android_PumpEvents(_THIS)
|
||||
{
|
||||
static int isPaused = 0;
|
||||
#if SDL_ANDROID_BLOCK_ON_PAUSE
|
||||
static int isPausing = 0;
|
||||
#endif
|
||||
/* No polling necessary */
|
||||
|
||||
/*
|
||||
* Android_ResumeSem and Android_PauseSem are signaled from Java_org_libsdl_app_SDLActivity_nativePause and Java_org_libsdl_app_SDLActivity_nativeResume
|
||||
* When the pause semaphore is signaled, if SDL_ANDROID_BLOCK_ON_PAUSE is defined the event loop will block until the resume signal is emitted.
|
||||
*/
|
||||
|
||||
#if SDL_ANDROID_BLOCK_ON_PAUSE
|
||||
if (isPaused && !isPausing) {
|
||||
/* Make sure this is the last thing we do before pausing */
|
||||
android_egl_context_backup();
|
||||
if(SDL_SemWait(Android_ResumeSem) == 0) {
|
||||
#else
|
||||
if (isPaused) {
|
||||
if(SDL_SemTryWait(Android_ResumeSem) == 0) {
|
||||
#endif
|
||||
isPaused = 0;
|
||||
|
||||
/* Restore the GL Context from here, as this operation is thread dependent */
|
||||
if (!SDL_HasEvent(SDL_QUIT)) {
|
||||
android_egl_context_restore();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
#if SDL_ANDROID_BLOCK_ON_PAUSE
|
||||
if( isPausing || SDL_SemTryWait(Android_PauseSem) == 0 ) {
|
||||
/* We've been signaled to pause, but before we block ourselves,
|
||||
we need to make sure that certain key events have reached the app */
|
||||
if (SDL_HasEvent(SDL_WINDOWEVENT) || SDL_HasEvent(SDL_APP_WILLENTERBACKGROUND) || SDL_HasEvent(SDL_APP_DIDENTERBACKGROUND) ) {
|
||||
isPausing = 1;
|
||||
}
|
||||
else {
|
||||
isPausing = 0;
|
||||
isPaused = 1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if(SDL_SemTryWait(Android_PauseSem) == 0) {
|
||||
android_egl_context_backup();
|
||||
isPaused = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
27
Engine/lib/sdl/src/video/android/SDL_androidevents.h
Normal file
27
Engine/lib/sdl/src/video/android/SDL_androidevents.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
extern void Android_PumpEvents(_THIS);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
57
Engine/lib/sdl/src/video/android/SDL_androidgl.c
Normal file
57
Engine/lib/sdl/src/video/android/SDL_androidgl.c
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
/* Android SDL video driver implementation */
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "../SDL_egl_c.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
SDL_EGL_CreateContext_impl(Android)
|
||||
SDL_EGL_MakeCurrent_impl(Android)
|
||||
|
||||
void
|
||||
Android_GLES_SwapWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
/* FIXME: These two functions were in the Java code, do we really need them? */
|
||||
_this->egl_data->eglWaitNative(EGL_CORE_NATIVE_ENGINE);
|
||||
_this->egl_data->eglWaitGL();
|
||||
SDL_EGL_SwapBuffers(_this, ((SDL_WindowData *) window->driverdata)->egl_surface);
|
||||
}
|
||||
|
||||
int
|
||||
Android_GLES_LoadLibrary(_THIS, const char *path) {
|
||||
return SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) 0);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
334
Engine/lib/sdl/src/video/android/SDL_androidkeyboard.c
Normal file
334
Engine/lib/sdl/src/video/android/SDL_androidkeyboard.c
Normal file
|
|
@ -0,0 +1,334 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
#include "../../events/SDL_events_c.h"
|
||||
|
||||
#include "SDL_androidkeyboard.h"
|
||||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
void Android_InitKeyboard(void)
|
||||
{
|
||||
SDL_Keycode keymap[SDL_NUM_SCANCODES];
|
||||
|
||||
/* Add default scancode to key mapping */
|
||||
SDL_GetDefaultKeymap(keymap);
|
||||
SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
|
||||
}
|
||||
|
||||
static SDL_Scancode Android_Keycodes[] = {
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_UNKNOWN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_LEFT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SOFT_RIGHT */
|
||||
SDL_SCANCODE_AC_HOME, /* AKEYCODE_HOME */
|
||||
SDL_SCANCODE_AC_BACK, /* AKEYCODE_BACK */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALL */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ENDCALL */
|
||||
SDL_SCANCODE_0, /* AKEYCODE_0 */
|
||||
SDL_SCANCODE_1, /* AKEYCODE_1 */
|
||||
SDL_SCANCODE_2, /* AKEYCODE_2 */
|
||||
SDL_SCANCODE_3, /* AKEYCODE_3 */
|
||||
SDL_SCANCODE_4, /* AKEYCODE_4 */
|
||||
SDL_SCANCODE_5, /* AKEYCODE_5 */
|
||||
SDL_SCANCODE_6, /* AKEYCODE_6 */
|
||||
SDL_SCANCODE_7, /* AKEYCODE_7 */
|
||||
SDL_SCANCODE_8, /* AKEYCODE_8 */
|
||||
SDL_SCANCODE_9, /* AKEYCODE_9 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STAR */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_POUND */
|
||||
SDL_SCANCODE_UP, /* AKEYCODE_DPAD_UP */
|
||||
SDL_SCANCODE_DOWN, /* AKEYCODE_DPAD_DOWN */
|
||||
SDL_SCANCODE_LEFT, /* AKEYCODE_DPAD_LEFT */
|
||||
SDL_SCANCODE_RIGHT, /* AKEYCODE_DPAD_RIGHT */
|
||||
SDL_SCANCODE_SELECT, /* AKEYCODE_DPAD_CENTER */
|
||||
SDL_SCANCODE_VOLUMEUP, /* AKEYCODE_VOLUME_UP */
|
||||
SDL_SCANCODE_VOLUMEDOWN, /* AKEYCODE_VOLUME_DOWN */
|
||||
SDL_SCANCODE_POWER, /* AKEYCODE_POWER */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAMERA */
|
||||
SDL_SCANCODE_CLEAR, /* AKEYCODE_CLEAR */
|
||||
SDL_SCANCODE_A, /* AKEYCODE_A */
|
||||
SDL_SCANCODE_B, /* AKEYCODE_B */
|
||||
SDL_SCANCODE_C, /* AKEYCODE_C */
|
||||
SDL_SCANCODE_D, /* AKEYCODE_D */
|
||||
SDL_SCANCODE_E, /* AKEYCODE_E */
|
||||
SDL_SCANCODE_F, /* AKEYCODE_F */
|
||||
SDL_SCANCODE_G, /* AKEYCODE_G */
|
||||
SDL_SCANCODE_H, /* AKEYCODE_H */
|
||||
SDL_SCANCODE_I, /* AKEYCODE_I */
|
||||
SDL_SCANCODE_J, /* AKEYCODE_J */
|
||||
SDL_SCANCODE_K, /* AKEYCODE_K */
|
||||
SDL_SCANCODE_L, /* AKEYCODE_L */
|
||||
SDL_SCANCODE_M, /* AKEYCODE_M */
|
||||
SDL_SCANCODE_N, /* AKEYCODE_N */
|
||||
SDL_SCANCODE_O, /* AKEYCODE_O */
|
||||
SDL_SCANCODE_P, /* AKEYCODE_P */
|
||||
SDL_SCANCODE_Q, /* AKEYCODE_Q */
|
||||
SDL_SCANCODE_R, /* AKEYCODE_R */
|
||||
SDL_SCANCODE_S, /* AKEYCODE_S */
|
||||
SDL_SCANCODE_T, /* AKEYCODE_T */
|
||||
SDL_SCANCODE_U, /* AKEYCODE_U */
|
||||
SDL_SCANCODE_V, /* AKEYCODE_V */
|
||||
SDL_SCANCODE_W, /* AKEYCODE_W */
|
||||
SDL_SCANCODE_X, /* AKEYCODE_X */
|
||||
SDL_SCANCODE_Y, /* AKEYCODE_Y */
|
||||
SDL_SCANCODE_Z, /* AKEYCODE_Z */
|
||||
SDL_SCANCODE_COMMA, /* AKEYCODE_COMMA */
|
||||
SDL_SCANCODE_PERIOD, /* AKEYCODE_PERIOD */
|
||||
SDL_SCANCODE_LALT, /* AKEYCODE_ALT_LEFT */
|
||||
SDL_SCANCODE_RALT, /* AKEYCODE_ALT_RIGHT */
|
||||
SDL_SCANCODE_LSHIFT, /* AKEYCODE_SHIFT_LEFT */
|
||||
SDL_SCANCODE_RSHIFT, /* AKEYCODE_SHIFT_RIGHT */
|
||||
SDL_SCANCODE_TAB, /* AKEYCODE_TAB */
|
||||
SDL_SCANCODE_SPACE, /* AKEYCODE_SPACE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SYM */
|
||||
SDL_SCANCODE_WWW, /* AKEYCODE_EXPLORER */
|
||||
SDL_SCANCODE_MAIL, /* AKEYCODE_ENVELOPE */
|
||||
SDL_SCANCODE_RETURN, /* AKEYCODE_ENTER */
|
||||
SDL_SCANCODE_BACKSPACE, /* AKEYCODE_DEL */
|
||||
SDL_SCANCODE_GRAVE, /* AKEYCODE_GRAVE */
|
||||
SDL_SCANCODE_MINUS, /* AKEYCODE_MINUS */
|
||||
SDL_SCANCODE_EQUALS, /* AKEYCODE_EQUALS */
|
||||
SDL_SCANCODE_LEFTBRACKET, /* AKEYCODE_LEFT_BRACKET */
|
||||
SDL_SCANCODE_RIGHTBRACKET, /* AKEYCODE_RIGHT_BRACKET */
|
||||
SDL_SCANCODE_BACKSLASH, /* AKEYCODE_BACKSLASH */
|
||||
SDL_SCANCODE_SEMICOLON, /* AKEYCODE_SEMICOLON */
|
||||
SDL_SCANCODE_APOSTROPHE, /* AKEYCODE_APOSTROPHE */
|
||||
SDL_SCANCODE_SLASH, /* AKEYCODE_SLASH */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_HEADSETHOOK */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FOCUS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PLUS */
|
||||
SDL_SCANCODE_MENU, /* AKEYCODE_MENU */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NOTIFICATION */
|
||||
SDL_SCANCODE_AC_SEARCH, /* AKEYCODE_SEARCH */
|
||||
SDL_SCANCODE_AUDIOPLAY, /* AKEYCODE_MEDIA_PLAY_PAUSE */
|
||||
SDL_SCANCODE_AUDIOSTOP, /* AKEYCODE_MEDIA_STOP */
|
||||
SDL_SCANCODE_AUDIONEXT, /* AKEYCODE_MEDIA_NEXT */
|
||||
SDL_SCANCODE_AUDIOPREV, /* AKEYCODE_MEDIA_PREVIOUS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_REWIND */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_FAST_FORWARD */
|
||||
SDL_SCANCODE_MUTE, /* AKEYCODE_MUTE */
|
||||
SDL_SCANCODE_PAGEUP, /* AKEYCODE_PAGE_UP */
|
||||
SDL_SCANCODE_PAGEDOWN, /* AKEYCODE_PAGE_DOWN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PICTSYMBOLS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SWITCH_CHARSET */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_A */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_B */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_C */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_X */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Y */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_Z */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L1 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R1 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_L2 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_R2 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBL */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_THUMBR */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_START */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_SELECT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_MODE */
|
||||
SDL_SCANCODE_ESCAPE, /* AKEYCODE_ESCAPE */
|
||||
SDL_SCANCODE_DELETE, /* AKEYCODE_FORWARD_DEL */
|
||||
SDL_SCANCODE_LCTRL, /* AKEYCODE_CTRL_LEFT */
|
||||
SDL_SCANCODE_RCTRL, /* AKEYCODE_CTRL_RIGHT */
|
||||
SDL_SCANCODE_CAPSLOCK, /* AKEYCODE_CAPS_LOCK */
|
||||
SDL_SCANCODE_SCROLLLOCK, /* AKEYCODE_SCROLL_LOCK */
|
||||
SDL_SCANCODE_LGUI, /* AKEYCODE_META_LEFT */
|
||||
SDL_SCANCODE_RGUI, /* AKEYCODE_META_RIGHT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_FUNCTION */
|
||||
SDL_SCANCODE_PRINTSCREEN, /* AKEYCODE_SYSRQ */
|
||||
SDL_SCANCODE_PAUSE, /* AKEYCODE_BREAK */
|
||||
SDL_SCANCODE_HOME, /* AKEYCODE_MOVE_HOME */
|
||||
SDL_SCANCODE_END, /* AKEYCODE_MOVE_END */
|
||||
SDL_SCANCODE_INSERT, /* AKEYCODE_INSERT */
|
||||
SDL_SCANCODE_AC_FORWARD, /* AKEYCODE_FORWARD */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PLAY */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_PAUSE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_CLOSE */
|
||||
SDL_SCANCODE_EJECT, /* AKEYCODE_MEDIA_EJECT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_RECORD */
|
||||
SDL_SCANCODE_F1, /* AKEYCODE_F1 */
|
||||
SDL_SCANCODE_F2, /* AKEYCODE_F2 */
|
||||
SDL_SCANCODE_F3, /* AKEYCODE_F3 */
|
||||
SDL_SCANCODE_F4, /* AKEYCODE_F4 */
|
||||
SDL_SCANCODE_F5, /* AKEYCODE_F5 */
|
||||
SDL_SCANCODE_F6, /* AKEYCODE_F6 */
|
||||
SDL_SCANCODE_F7, /* AKEYCODE_F7 */
|
||||
SDL_SCANCODE_F8, /* AKEYCODE_F8 */
|
||||
SDL_SCANCODE_F9, /* AKEYCODE_F9 */
|
||||
SDL_SCANCODE_F10, /* AKEYCODE_F10 */
|
||||
SDL_SCANCODE_F11, /* AKEYCODE_F11 */
|
||||
SDL_SCANCODE_F12, /* AKEYCODE_F12 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_NUM_LOCK */
|
||||
SDL_SCANCODE_KP_0, /* AKEYCODE_NUMPAD_0 */
|
||||
SDL_SCANCODE_KP_1, /* AKEYCODE_NUMPAD_1 */
|
||||
SDL_SCANCODE_KP_2, /* AKEYCODE_NUMPAD_2 */
|
||||
SDL_SCANCODE_KP_3, /* AKEYCODE_NUMPAD_3 */
|
||||
SDL_SCANCODE_KP_4, /* AKEYCODE_NUMPAD_4 */
|
||||
SDL_SCANCODE_KP_5, /* AKEYCODE_NUMPAD_5 */
|
||||
SDL_SCANCODE_KP_6, /* AKEYCODE_NUMPAD_6 */
|
||||
SDL_SCANCODE_KP_7, /* AKEYCODE_NUMPAD_7 */
|
||||
SDL_SCANCODE_KP_8, /* AKEYCODE_NUMPAD_8 */
|
||||
SDL_SCANCODE_KP_9, /* AKEYCODE_NUMPAD_9 */
|
||||
SDL_SCANCODE_KP_DIVIDE, /* AKEYCODE_NUMPAD_DIVIDE */
|
||||
SDL_SCANCODE_KP_MULTIPLY, /* AKEYCODE_NUMPAD_MULTIPLY */
|
||||
SDL_SCANCODE_KP_MINUS, /* AKEYCODE_NUMPAD_SUBTRACT */
|
||||
SDL_SCANCODE_KP_PLUS, /* AKEYCODE_NUMPAD_ADD */
|
||||
SDL_SCANCODE_KP_PERIOD, /* AKEYCODE_NUMPAD_DOT */
|
||||
SDL_SCANCODE_KP_COMMA, /* AKEYCODE_NUMPAD_COMMA */
|
||||
SDL_SCANCODE_KP_ENTER, /* AKEYCODE_NUMPAD_ENTER */
|
||||
SDL_SCANCODE_KP_EQUALS, /* AKEYCODE_NUMPAD_EQUALS */
|
||||
SDL_SCANCODE_KP_LEFTPAREN, /* AKEYCODE_NUMPAD_LEFT_PAREN */
|
||||
SDL_SCANCODE_KP_RIGHTPAREN, /* AKEYCODE_NUMPAD_RIGHT_PAREN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_VOLUME_MUTE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_INFO */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_UP */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CHANNEL_DOWN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_IN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ZOOM_OUT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_WINDOW */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_GUIDE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_DVR */
|
||||
SDL_SCANCODE_AC_BOOKMARKS, /* AKEYCODE_BOOKMARK */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CAPTIONS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_SETTINGS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_POWER */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_TV_INPUT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_POWER */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_STB_INPUT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_POWER */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_AVR_INPUT */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_RED */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_GREEN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_YELLOW */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_PROG_BLUE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_APP_SWITCH */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_1 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_2 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_3 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_4 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_5 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_6 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_7 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_8 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_9 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_10 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_11 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_12 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_13 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_14 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_15 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_BUTTON_16 */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_LANGUAGE_SWITCH */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MANNER_MODE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_3D_MODE */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CONTACTS */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_CALENDAR */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MUSIC */
|
||||
SDL_SCANCODE_CALCULATOR, /* AKEYCODE_CALCULATOR */
|
||||
SDL_SCANCODE_LANG5, /* AKEYCODE_ZENKAKU_HANKAKU */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_EISU */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MUHENKAN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_HENKAN */
|
||||
SDL_SCANCODE_LANG3, /* AKEYCODE_KATAKANA_HIRAGANA */
|
||||
SDL_SCANCODE_INTERNATIONAL3, /* AKEYCODE_YEN */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_RO */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_KANA */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_ASSIST */
|
||||
SDL_SCANCODE_BRIGHTNESSDOWN, /* AKEYCODE_BRIGHTNESS_DOWN */
|
||||
SDL_SCANCODE_BRIGHTNESSUP, /* AKEYCODE_BRIGHTNESS_UP */
|
||||
SDL_SCANCODE_UNKNOWN, /* AKEYCODE_MEDIA_AUDIO_TRACK */
|
||||
};
|
||||
|
||||
static SDL_Scancode
|
||||
TranslateKeycode(int keycode)
|
||||
{
|
||||
SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
|
||||
|
||||
if (keycode < SDL_arraysize(Android_Keycodes)) {
|
||||
scancode = Android_Keycodes[keycode];
|
||||
}
|
||||
if (scancode == SDL_SCANCODE_UNKNOWN) {
|
||||
__android_log_print(ANDROID_LOG_INFO, "SDL", "Unknown keycode %d", keycode);
|
||||
}
|
||||
return scancode;
|
||||
}
|
||||
|
||||
int
|
||||
Android_OnKeyDown(int keycode)
|
||||
{
|
||||
return SDL_SendKeyboardKey(SDL_PRESSED, TranslateKeycode(keycode));
|
||||
}
|
||||
|
||||
int
|
||||
Android_OnKeyUp(int keycode)
|
||||
{
|
||||
return SDL_SendKeyboardKey(SDL_RELEASED, TranslateKeycode(keycode));
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
Android_HasScreenKeyboardSupport(_THIS)
|
||||
{
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
Android_IsScreenKeyboardShown(_THIS, SDL_Window * window)
|
||||
{
|
||||
return SDL_IsTextInputActive();
|
||||
}
|
||||
|
||||
void
|
||||
Android_StartTextInput(_THIS)
|
||||
{
|
||||
SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
|
||||
Android_JNI_ShowTextInput(&videodata->textRect);
|
||||
}
|
||||
|
||||
void
|
||||
Android_StopTextInput(_THIS)
|
||||
{
|
||||
Android_JNI_HideTextInput();
|
||||
}
|
||||
|
||||
void
|
||||
Android_SetTextInputRect(_THIS, SDL_Rect *rect)
|
||||
{
|
||||
SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata;
|
||||
|
||||
if (!rect) {
|
||||
SDL_InvalidParamError("rect");
|
||||
return;
|
||||
}
|
||||
|
||||
videodata->textRect = *rect;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
36
Engine/lib/sdl/src/video/android/SDL_androidkeyboard.h
Normal file
36
Engine/lib/sdl/src/video/android/SDL_androidkeyboard.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
extern void Android_InitKeyboard(void);
|
||||
extern int Android_OnKeyDown(int keycode);
|
||||
extern int Android_OnKeyUp(int keycode);
|
||||
|
||||
extern SDL_bool Android_HasScreenKeyboardSupport(_THIS);
|
||||
extern SDL_bool Android_IsScreenKeyboardShown(_THIS, SDL_Window * window);
|
||||
|
||||
extern void Android_StartTextInput(_THIS);
|
||||
extern void Android_StopTextInput(_THIS);
|
||||
extern void Android_SetTextInputRect(_THIS, SDL_Rect *rect);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
125
Engine/lib/sdl/src/video/android/SDL_androidtouch.c
Normal file
125
Engine/lib/sdl/src/video/android/SDL_androidtouch.c
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
#include "SDL_events.h"
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
#include "../../events/SDL_touch_c.h"
|
||||
#include "SDL_log.h"
|
||||
|
||||
#include "SDL_androidtouch.h"
|
||||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
|
||||
#define ACTION_DOWN 0
|
||||
#define ACTION_UP 1
|
||||
#define ACTION_MOVE 2
|
||||
#define ACTION_CANCEL 3
|
||||
#define ACTION_OUTSIDE 4
|
||||
#define ACTION_POINTER_DOWN 5
|
||||
#define ACTION_POINTER_UP 6
|
||||
|
||||
static void Android_GetWindowCoordinates(float x, float y,
|
||||
int *window_x, int *window_y)
|
||||
{
|
||||
int window_w, window_h;
|
||||
|
||||
SDL_GetWindowSize(Android_Window, &window_w, &window_h);
|
||||
*window_x = (int)(x * window_w);
|
||||
*window_y = (int)(y * window_h);
|
||||
}
|
||||
|
||||
void Android_InitTouch(void)
|
||||
{
|
||||
int i;
|
||||
int* ids;
|
||||
int number = Android_JNI_GetTouchDeviceIds(&ids);
|
||||
if (0 < number) {
|
||||
for (i = 0; i < number; ++i) {
|
||||
SDL_AddTouch((SDL_TouchID) ids[i], ""); /* no error handling */
|
||||
}
|
||||
SDL_free(ids);
|
||||
}
|
||||
}
|
||||
|
||||
void Android_OnTouch(int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p)
|
||||
{
|
||||
SDL_TouchID touchDeviceId = 0;
|
||||
SDL_FingerID fingerId = 0;
|
||||
int window_x, window_y;
|
||||
static SDL_FingerID pointerFingerID = 0;
|
||||
|
||||
if (!Android_Window) {
|
||||
return;
|
||||
}
|
||||
|
||||
touchDeviceId = (SDL_TouchID)touch_device_id_in;
|
||||
if (SDL_AddTouch(touchDeviceId, "") < 0) {
|
||||
SDL_Log("error: can't add touch %s, %d", __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
fingerId = (SDL_FingerID)pointer_finger_id_in;
|
||||
switch (action) {
|
||||
case ACTION_DOWN:
|
||||
/* Primary pointer down */
|
||||
Android_GetWindowCoordinates(x, y, &window_x, &window_y);
|
||||
/* send moved event */
|
||||
SDL_SendMouseMotion(NULL, SDL_TOUCH_MOUSEID, 0, window_x, window_y);
|
||||
/* send mouse down event */
|
||||
SDL_SendMouseButton(NULL, SDL_TOUCH_MOUSEID, SDL_PRESSED, SDL_BUTTON_LEFT);
|
||||
pointerFingerID = fingerId;
|
||||
case ACTION_POINTER_DOWN:
|
||||
/* Non primary pointer down */
|
||||
SDL_SendTouch(touchDeviceId, fingerId, SDL_TRUE, x, y, p);
|
||||
break;
|
||||
|
||||
case ACTION_MOVE:
|
||||
if (!pointerFingerID) {
|
||||
Android_GetWindowCoordinates(x, y, &window_x, &window_y);
|
||||
|
||||
/* send moved event */
|
||||
SDL_SendMouseMotion(NULL, SDL_TOUCH_MOUSEID, 0, window_x, window_y);
|
||||
}
|
||||
SDL_SendTouchMotion(touchDeviceId, fingerId, x, y, p);
|
||||
break;
|
||||
|
||||
case ACTION_UP:
|
||||
/* Primary pointer up */
|
||||
/* send mouse up */
|
||||
pointerFingerID = (SDL_FingerID) 0;
|
||||
SDL_SendMouseButton(NULL, SDL_TOUCH_MOUSEID, SDL_RELEASED, SDL_BUTTON_LEFT);
|
||||
case ACTION_POINTER_UP:
|
||||
/* Non primary pointer up */
|
||||
SDL_SendTouch(touchDeviceId, fingerId, SDL_FALSE, x, y, p);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
28
Engine/lib/sdl/src/video/android/SDL_androidtouch.h
Normal file
28
Engine/lib/sdl/src/video/android/SDL_androidtouch.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
|
||||
extern void Android_InitTouch(void);
|
||||
extern void Android_OnTouch( int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
195
Engine/lib/sdl/src/video/android/SDL_androidvideo.c
Normal file
195
Engine/lib/sdl/src/video/android/SDL_androidvideo.c
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
/* Android SDL video driver implementation
|
||||
*/
|
||||
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_mouse.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../SDL_pixels_c.h"
|
||||
#include "../../events/SDL_events_c.h"
|
||||
#include "../../events/SDL_windowevents_c.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidclipboard.h"
|
||||
#include "SDL_androidevents.h"
|
||||
#include "SDL_androidkeyboard.h"
|
||||
#include "SDL_androidtouch.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
|
||||
#define ANDROID_VID_DRIVER_NAME "Android"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int Android_VideoInit(_THIS);
|
||||
static void Android_VideoQuit(_THIS);
|
||||
|
||||
#include "../SDL_egl_c.h"
|
||||
/* GL functions (SDL_androidgl.c) */
|
||||
extern SDL_GLContext Android_GLES_CreateContext(_THIS, SDL_Window * window);
|
||||
extern int Android_GLES_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context);
|
||||
extern void Android_GLES_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern int Android_GLES_LoadLibrary(_THIS, const char *path);
|
||||
#define Android_GLES_GetProcAddress SDL_EGL_GetProcAddress
|
||||
#define Android_GLES_UnloadLibrary SDL_EGL_UnloadLibrary
|
||||
#define Android_GLES_SetSwapInterval SDL_EGL_SetSwapInterval
|
||||
#define Android_GLES_GetSwapInterval SDL_EGL_GetSwapInterval
|
||||
#define Android_GLES_DeleteContext SDL_EGL_DeleteContext
|
||||
|
||||
/* Android driver bootstrap functions */
|
||||
|
||||
|
||||
/* These are filled in with real values in Android_SetScreenResolution on init (before SDL_main()) */
|
||||
int Android_ScreenWidth = 0;
|
||||
int Android_ScreenHeight = 0;
|
||||
Uint32 Android_ScreenFormat = SDL_PIXELFORMAT_UNKNOWN;
|
||||
SDL_sem *Android_PauseSem = NULL, *Android_ResumeSem = NULL;
|
||||
|
||||
/* Currently only one window */
|
||||
SDL_Window *Android_Window = NULL;
|
||||
|
||||
static int
|
||||
Android_Available(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
Android_DeleteDevice(SDL_VideoDevice * device)
|
||||
{
|
||||
SDL_free(device);
|
||||
}
|
||||
|
||||
static SDL_VideoDevice *
|
||||
Android_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_VideoDevice *device;
|
||||
SDL_VideoData *data;
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
|
||||
if (!device) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
data = (SDL_VideoData*) SDL_calloc(1, sizeof(SDL_VideoData));
|
||||
if (!data) {
|
||||
SDL_OutOfMemory();
|
||||
SDL_free(device);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
device->driverdata = data;
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = Android_VideoInit;
|
||||
device->VideoQuit = Android_VideoQuit;
|
||||
device->PumpEvents = Android_PumpEvents;
|
||||
|
||||
device->CreateWindow = Android_CreateWindow;
|
||||
device->SetWindowTitle = Android_SetWindowTitle;
|
||||
device->DestroyWindow = Android_DestroyWindow;
|
||||
|
||||
device->free = Android_DeleteDevice;
|
||||
|
||||
/* GL pointers */
|
||||
device->GL_LoadLibrary = Android_GLES_LoadLibrary;
|
||||
device->GL_GetProcAddress = Android_GLES_GetProcAddress;
|
||||
device->GL_UnloadLibrary = Android_GLES_UnloadLibrary;
|
||||
device->GL_CreateContext = Android_GLES_CreateContext;
|
||||
device->GL_MakeCurrent = Android_GLES_MakeCurrent;
|
||||
device->GL_SetSwapInterval = Android_GLES_SetSwapInterval;
|
||||
device->GL_GetSwapInterval = Android_GLES_GetSwapInterval;
|
||||
device->GL_SwapWindow = Android_GLES_SwapWindow;
|
||||
device->GL_DeleteContext = Android_GLES_DeleteContext;
|
||||
|
||||
/* Text input */
|
||||
device->StartTextInput = Android_StartTextInput;
|
||||
device->StopTextInput = Android_StopTextInput;
|
||||
device->SetTextInputRect = Android_SetTextInputRect;
|
||||
|
||||
/* Screen keyboard */
|
||||
device->HasScreenKeyboardSupport = Android_HasScreenKeyboardSupport;
|
||||
device->IsScreenKeyboardShown = Android_IsScreenKeyboardShown;
|
||||
|
||||
/* Clipboard */
|
||||
device->SetClipboardText = Android_SetClipboardText;
|
||||
device->GetClipboardText = Android_GetClipboardText;
|
||||
device->HasClipboardText = Android_HasClipboardText;
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
VideoBootStrap Android_bootstrap = {
|
||||
ANDROID_VID_DRIVER_NAME, "SDL Android video driver",
|
||||
Android_Available, Android_CreateDevice
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
Android_VideoInit(_THIS)
|
||||
{
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
mode.format = Android_ScreenFormat;
|
||||
mode.w = Android_ScreenWidth;
|
||||
mode.h = Android_ScreenHeight;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
SDL_AddDisplayMode(&_this->displays[0], &mode);
|
||||
|
||||
Android_InitKeyboard();
|
||||
|
||||
Android_InitTouch();
|
||||
|
||||
/* We're done! */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Android_VideoQuit(_THIS)
|
||||
{
|
||||
}
|
||||
|
||||
/* This function gets called before VideoInit() */
|
||||
void
|
||||
Android_SetScreenResolution(int width, int height, Uint32 format)
|
||||
{
|
||||
Android_ScreenWidth = width;
|
||||
Android_ScreenHeight = height;
|
||||
Android_ScreenFormat = format;
|
||||
|
||||
if (Android_Window) {
|
||||
SDL_SendWindowEvent(Android_Window, SDL_WINDOWEVENT_RESIZED, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
49
Engine/lib/sdl/src/video/android/SDL_androidvideo.h
Normal file
49
Engine/lib/sdl/src/video/android/SDL_androidvideo.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidvideo_h
|
||||
#define _SDL_androidvideo_h
|
||||
|
||||
#include "SDL_mutex.h"
|
||||
#include "SDL_rect.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
/* Called by the JNI layer when the screen changes size or format */
|
||||
extern void Android_SetScreenResolution(int width, int height, Uint32 format);
|
||||
|
||||
/* Private display data */
|
||||
|
||||
typedef struct SDL_VideoData
|
||||
{
|
||||
SDL_Rect textRect;
|
||||
} SDL_VideoData;
|
||||
|
||||
extern int Android_ScreenWidth;
|
||||
extern int Android_ScreenHeight;
|
||||
extern Uint32 Android_ScreenFormat;
|
||||
extern SDL_sem *Android_PauseSem, *Android_ResumeSem;
|
||||
extern SDL_Window *Android_Window;
|
||||
|
||||
|
||||
#endif /* _SDL_androidvideo_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
120
Engine/lib/sdl/src/video/android/SDL_androidwindow.c
Normal file
120
Engine/lib/sdl/src/video/android/SDL_androidwindow.c
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_ANDROID
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../../events/SDL_keyboard_c.h"
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
#include "SDL_androidvideo.h"
|
||||
#include "SDL_androidwindow.h"
|
||||
|
||||
int
|
||||
Android_CreateWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_WindowData *data;
|
||||
|
||||
if (Android_Window) {
|
||||
return SDL_SetError("Android only supports one window");
|
||||
}
|
||||
|
||||
Android_PauseSem = SDL_CreateSemaphore(0);
|
||||
Android_ResumeSem = SDL_CreateSemaphore(0);
|
||||
|
||||
/* Adjust the window data to match the screen */
|
||||
window->x = 0;
|
||||
window->y = 0;
|
||||
window->w = Android_ScreenWidth;
|
||||
window->h = Android_ScreenHeight;
|
||||
|
||||
window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
|
||||
window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */
|
||||
window->flags &= ~SDL_WINDOW_HIDDEN;
|
||||
window->flags |= SDL_WINDOW_SHOWN; /* only one window on Android */
|
||||
window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */
|
||||
|
||||
/* One window, it always has focus */
|
||||
SDL_SetMouseFocus(window);
|
||||
SDL_SetKeyboardFocus(window);
|
||||
|
||||
data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
|
||||
if (!data) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
|
||||
data->native_window = Android_JNI_GetNativeWindow();
|
||||
|
||||
if (!data->native_window) {
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Could not fetch native window");
|
||||
}
|
||||
|
||||
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->native_window);
|
||||
|
||||
if (data->egl_surface == EGL_NO_SURFACE) {
|
||||
ANativeWindow_release(data->native_window);
|
||||
SDL_free(data);
|
||||
return SDL_SetError("Could not create GLES window surface");
|
||||
}
|
||||
|
||||
window->driverdata = data;
|
||||
Android_Window = window;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Android_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
Android_JNI_SetActivityTitle(window->title);
|
||||
}
|
||||
|
||||
void
|
||||
Android_DestroyWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_WindowData *data;
|
||||
|
||||
if (window == Android_Window) {
|
||||
Android_Window = NULL;
|
||||
if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem);
|
||||
if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem);
|
||||
Android_PauseSem = NULL;
|
||||
Android_ResumeSem = NULL;
|
||||
|
||||
if(window->driverdata) {
|
||||
data = (SDL_WindowData *) window->driverdata;
|
||||
if (data->egl_surface != EGL_NO_SURFACE) {
|
||||
SDL_EGL_DestroySurface(_this, data->egl_surface);
|
||||
}
|
||||
if(data->native_window) {
|
||||
ANativeWindow_release(data->native_window);
|
||||
}
|
||||
SDL_free(window->driverdata);
|
||||
window->driverdata = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
43
Engine/lib/sdl/src/video/android/SDL_androidwindow.h
Normal file
43
Engine/lib/sdl/src/video/android/SDL_androidwindow.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_androidwindow_h
|
||||
#define _SDL_androidwindow_h
|
||||
|
||||
#include "../../core/android/SDL_android.h"
|
||||
#include "../SDL_egl_c.h"
|
||||
|
||||
extern int Android_CreateWindow(_THIS, SDL_Window * window);
|
||||
extern void Android_SetWindowTitle(_THIS, SDL_Window * window);
|
||||
extern void Android_DestroyWindow(_THIS, SDL_Window * window);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
EGLSurface egl_surface;
|
||||
EGLContext egl_context; /* We use this to preserve the context when losing focus */
|
||||
ANativeWindow* native_window;
|
||||
|
||||
} SDL_WindowData;
|
||||
|
||||
#endif /* _SDL_androidwindow_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
36
Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.h
Normal file
36
Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaclipboard_h
|
||||
#define _SDL_cocoaclipboard_h
|
||||
|
||||
/* Forward declaration */
|
||||
struct SDL_VideoData;
|
||||
|
||||
extern int Cocoa_SetClipboardText(_THIS, const char *text);
|
||||
extern char *Cocoa_GetClipboardText(_THIS);
|
||||
extern SDL_bool Cocoa_HasClipboardText(_THIS);
|
||||
extern void Cocoa_CheckClipboardUpdate(struct SDL_VideoData * data);
|
||||
|
||||
#endif /* _SDL_cocoaclipboard_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
127
Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.m
Normal file
127
Engine/lib/sdl/src/video/cocoa/SDL_cocoaclipboard.m
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "../../events/SDL_clipboardevents_c.h"
|
||||
|
||||
static NSString *
|
||||
GetTextFormat(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
if (data->osversion >= 0x1060) {
|
||||
return NSPasteboardTypeString;
|
||||
} else {
|
||||
return NSStringPboardType;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_SetClipboardText(_THIS, const char *text)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
NSAutoreleasePool *pool;
|
||||
NSPasteboard *pasteboard;
|
||||
NSString *format = GetTextFormat(_this);
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
pasteboard = [NSPasteboard generalPasteboard];
|
||||
data->clipboard_count = [pasteboard declareTypes:[NSArray arrayWithObject:format] owner:nil];
|
||||
[pasteboard setString:[NSString stringWithUTF8String:text] forType:format];
|
||||
|
||||
[pool release];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *
|
||||
Cocoa_GetClipboardText(_THIS)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
NSPasteboard *pasteboard;
|
||||
NSString *format = GetTextFormat(_this);
|
||||
NSString *available;
|
||||
char *text;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
pasteboard = [NSPasteboard generalPasteboard];
|
||||
available = [pasteboard availableTypeFromArray: [NSArray arrayWithObject:format]];
|
||||
if ([available isEqualToString:format]) {
|
||||
NSString* string;
|
||||
const char *utf8;
|
||||
|
||||
string = [pasteboard stringForType:format];
|
||||
if (string == nil) {
|
||||
utf8 = "";
|
||||
} else {
|
||||
utf8 = [string UTF8String];
|
||||
}
|
||||
text = SDL_strdup(utf8);
|
||||
} else {
|
||||
text = SDL_strdup("");
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
Cocoa_HasClipboardText(_THIS)
|
||||
{
|
||||
SDL_bool result = SDL_FALSE;
|
||||
char *text = Cocoa_GetClipboardText(_this);
|
||||
if (text) {
|
||||
result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE;
|
||||
SDL_free(text);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_CheckClipboardUpdate(struct SDL_VideoData * data)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
NSPasteboard *pasteboard;
|
||||
NSInteger count;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
pasteboard = [NSPasteboard generalPasteboard];
|
||||
count = [pasteboard changeCount];
|
||||
if (count != data->clipboard_count) {
|
||||
if (data->clipboard_count) {
|
||||
SDL_SendClipboardUpdate();
|
||||
}
|
||||
data->clipboard_count = count;
|
||||
}
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
31
Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.h
Normal file
31
Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaevents_h
|
||||
#define _SDL_cocoaevents_h
|
||||
|
||||
extern void Cocoa_RegisterApp(void);
|
||||
extern void Cocoa_PumpEvents(_THIS);
|
||||
|
||||
#endif /* _SDL_cocoaevents_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
349
Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.m
Normal file
349
Engine/lib/sdl/src/video/cocoa/SDL_cocoaevents.m
Normal file
|
|
@ -0,0 +1,349 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
#include "SDL_timer.h"
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "../../events/SDL_events_c.h"
|
||||
|
||||
#if !defined(UsrActivity) && defined(__LP64__) && !defined(__POWER__)
|
||||
/*
|
||||
* Workaround for a bug in the 10.5 SDK: By accident, OSService.h does
|
||||
* not include Power.h at all when compiling in 64bit mode. This has
|
||||
* been fixed in 10.6, but for 10.5, we manually define UsrActivity
|
||||
* to ensure compilation works.
|
||||
*/
|
||||
#define UsrActivity 1
|
||||
#endif
|
||||
|
||||
@interface SDLApplication : NSApplication
|
||||
|
||||
- (void)terminate:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
@implementation SDLApplication
|
||||
|
||||
// Override terminate to handle Quit and System Shutdown smoothly.
|
||||
- (void)terminate:(id)sender
|
||||
{
|
||||
SDL_SendQuit();
|
||||
}
|
||||
|
||||
@end // SDLApplication
|
||||
|
||||
/* setAppleMenu disappeared from the headers in 10.4 */
|
||||
@interface NSApplication(NSAppleMenu)
|
||||
- (void)setAppleMenu:(NSMenu *)menu;
|
||||
@end
|
||||
|
||||
@interface SDLAppDelegate : NSObject {
|
||||
@public
|
||||
BOOL seenFirstActivate;
|
||||
}
|
||||
|
||||
- (id)init;
|
||||
@end
|
||||
|
||||
@implementation SDLAppDelegate : NSObject
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
if (self) {
|
||||
seenFirstActivate = NO;
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(focusSomeWindow:)
|
||||
name:NSApplicationDidBecomeActiveNotification
|
||||
object:nil];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)focusSomeWindow:(NSNotification *)aNotification
|
||||
{
|
||||
/* HACK: Ignore the first call. The application gets a
|
||||
* applicationDidBecomeActive: a little bit after the first window is
|
||||
* created, and if we don't ignore it, a window that has been created with
|
||||
* SDL_WINDOW_MINIZED will ~immediately be restored.
|
||||
*/
|
||||
if (!seenFirstActivate) {
|
||||
seenFirstActivate = YES;
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_VideoDevice *device = SDL_GetVideoDevice();
|
||||
if (device && device->windows)
|
||||
{
|
||||
SDL_Window *window = device->windows;
|
||||
int i;
|
||||
for (i = 0; i < device->num_displays; ++i)
|
||||
{
|
||||
SDL_Window *fullscreen_window = device->displays[i].fullscreen_window;
|
||||
if (fullscreen_window)
|
||||
{
|
||||
if (fullscreen_window->flags & SDL_WINDOW_MINIMIZED) {
|
||||
SDL_RestoreWindow(fullscreen_window);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (window->flags & SDL_WINDOW_MINIMIZED) {
|
||||
SDL_RestoreWindow(window);
|
||||
} else {
|
||||
SDL_RaiseWindow(window);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
|
||||
{
|
||||
return (BOOL)SDL_SendDropFile([filename UTF8String]);
|
||||
}
|
||||
@end
|
||||
|
||||
static SDLAppDelegate *appDelegate = nil;
|
||||
|
||||
static NSString *
|
||||
GetApplicationName(void)
|
||||
{
|
||||
NSString *appName;
|
||||
|
||||
/* Determine the application name */
|
||||
appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
|
||||
if (!appName)
|
||||
appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
|
||||
|
||||
if (![appName length])
|
||||
appName = [[NSProcessInfo processInfo] processName];
|
||||
|
||||
return appName;
|
||||
}
|
||||
|
||||
static void
|
||||
CreateApplicationMenus(void)
|
||||
{
|
||||
NSString *appName;
|
||||
NSString *title;
|
||||
NSMenu *appleMenu;
|
||||
NSMenu *serviceMenu;
|
||||
NSMenu *windowMenu;
|
||||
NSMenu *viewMenu;
|
||||
NSMenuItem *menuItem;
|
||||
|
||||
if (NSApp == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Create the main menu bar */
|
||||
[NSApp setMainMenu:[[NSMenu alloc] init]];
|
||||
|
||||
/* Create the application menu */
|
||||
appName = GetApplicationName();
|
||||
appleMenu = [[NSMenu alloc] initWithTitle:@""];
|
||||
|
||||
/* Add menu items */
|
||||
title = [@"About " stringByAppendingString:appName];
|
||||
[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
|
||||
|
||||
[appleMenu addItem:[NSMenuItem separatorItem]];
|
||||
|
||||
[appleMenu addItemWithTitle:@"Preferences…" action:nil keyEquivalent:@","];
|
||||
|
||||
[appleMenu addItem:[NSMenuItem separatorItem]];
|
||||
|
||||
serviceMenu = [[NSMenu alloc] initWithTitle:@""];
|
||||
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Services" action:nil keyEquivalent:@""];
|
||||
[menuItem setSubmenu:serviceMenu];
|
||||
|
||||
[NSApp setServicesMenu:serviceMenu];
|
||||
[serviceMenu release];
|
||||
|
||||
[appleMenu addItem:[NSMenuItem separatorItem]];
|
||||
|
||||
title = [@"Hide " stringByAppendingString:appName];
|
||||
[appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
|
||||
|
||||
menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
|
||||
[menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
|
||||
|
||||
[appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
|
||||
|
||||
[appleMenu addItem:[NSMenuItem separatorItem]];
|
||||
|
||||
title = [@"Quit " stringByAppendingString:appName];
|
||||
[appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
|
||||
|
||||
/* Put menu into the menubar */
|
||||
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
|
||||
[menuItem setSubmenu:appleMenu];
|
||||
[[NSApp mainMenu] addItem:menuItem];
|
||||
[menuItem release];
|
||||
|
||||
/* Tell the application object that this is now the application menu */
|
||||
[NSApp setAppleMenu:appleMenu];
|
||||
[appleMenu release];
|
||||
|
||||
|
||||
/* Create the window menu */
|
||||
windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
|
||||
|
||||
/* Add menu items */
|
||||
[windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
|
||||
|
||||
[windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""];
|
||||
|
||||
/* Put menu into the menubar */
|
||||
menuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
|
||||
[menuItem setSubmenu:windowMenu];
|
||||
[[NSApp mainMenu] addItem:menuItem];
|
||||
[menuItem release];
|
||||
|
||||
/* Tell the application object that this is now the window menu */
|
||||
[NSApp setWindowsMenu:windowMenu];
|
||||
[windowMenu release];
|
||||
|
||||
|
||||
/* Add the fullscreen view toggle menu option, if supported */
|
||||
if ([NSApp respondsToSelector:@selector(setPresentationOptions:)]) {
|
||||
/* Create the view menu */
|
||||
viewMenu = [[NSMenu alloc] initWithTitle:@"View"];
|
||||
|
||||
/* Add menu items */
|
||||
menuItem = [viewMenu addItemWithTitle:@"Toggle Full Screen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"];
|
||||
[menuItem setKeyEquivalentModifierMask:NSControlKeyMask | NSCommandKeyMask];
|
||||
|
||||
/* Put menu into the menubar */
|
||||
menuItem = [[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""];
|
||||
[menuItem setSubmenu:viewMenu];
|
||||
[[NSApp mainMenu] addItem:menuItem];
|
||||
[menuItem release];
|
||||
|
||||
[viewMenu release];
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_RegisterApp(void)
|
||||
{
|
||||
/* This can get called more than once! Be careful what you initialize! */
|
||||
ProcessSerialNumber psn;
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
if (!GetCurrentProcess(&psn)) {
|
||||
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
|
||||
SetFrontProcess(&psn);
|
||||
}
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
if (NSApp == nil) {
|
||||
[SDLApplication sharedApplication];
|
||||
|
||||
if ([NSApp mainMenu] == nil) {
|
||||
CreateApplicationMenus();
|
||||
}
|
||||
[NSApp finishLaunching];
|
||||
NSDictionary *appDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:
|
||||
[NSNumber numberWithBool:NO], @"AppleMomentumScrollSupported",
|
||||
[NSNumber numberWithBool:NO], @"ApplePressAndHoldEnabled",
|
||||
nil];
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
|
||||
|
||||
}
|
||||
if (NSApp && !appDelegate) {
|
||||
appDelegate = [[SDLAppDelegate alloc] init];
|
||||
|
||||
/* If someone else has an app delegate, it means we can't turn a
|
||||
* termination into SDL_Quit, and we can't handle application:openFile:
|
||||
*/
|
||||
if (![NSApp delegate]) {
|
||||
[NSApp setDelegate:appDelegate];
|
||||
} else {
|
||||
appDelegate->seenFirstActivate = YES;
|
||||
}
|
||||
}
|
||||
[pool release];
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_PumpEvents(_THIS)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
/* Update activity every 30 seconds to prevent screensaver */
|
||||
if (_this->suspend_screensaver) {
|
||||
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;
|
||||
Uint32 now = SDL_GetTicks();
|
||||
if (!data->screensaver_activity ||
|
||||
SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) {
|
||||
UpdateSystemActivity(UsrActivity);
|
||||
data->screensaver_activity = now;
|
||||
}
|
||||
}
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
for ( ; ; ) {
|
||||
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
|
||||
if ( event == nil ) {
|
||||
break;
|
||||
}
|
||||
|
||||
switch ([event type]) {
|
||||
case NSLeftMouseDown:
|
||||
case NSOtherMouseDown:
|
||||
case NSRightMouseDown:
|
||||
case NSLeftMouseUp:
|
||||
case NSOtherMouseUp:
|
||||
case NSRightMouseUp:
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case NSOtherMouseDragged: /* usually middle mouse dragged */
|
||||
case NSMouseMoved:
|
||||
case NSScrollWheel:
|
||||
Cocoa_HandleMouseEvent(_this, event);
|
||||
break;
|
||||
case NSKeyDown:
|
||||
case NSKeyUp:
|
||||
case NSFlagsChanged:
|
||||
Cocoa_HandleKeyEvent(_this, event);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Pass through to NSApp to make sure everything stays in sync */
|
||||
[NSApp sendEvent:event];
|
||||
}
|
||||
[pool release];
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
36
Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.h
Normal file
36
Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.h
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoakeyboard_h
|
||||
#define _SDL_cocoakeyboard_h
|
||||
|
||||
extern void Cocoa_InitKeyboard(_THIS);
|
||||
extern void Cocoa_HandleKeyEvent(_THIS, NSEvent * event);
|
||||
extern void Cocoa_QuitKeyboard(_THIS);
|
||||
|
||||
extern void Cocoa_StartTextInput(_THIS);
|
||||
extern void Cocoa_StopTextInput(_THIS);
|
||||
extern void Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect);
|
||||
|
||||
#endif /* _SDL_cocoakeyboard_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
630
Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.m
Normal file
630
Engine/lib/sdl/src/video/cocoa/SDL_cocoakeyboard.m
Normal file
|
|
@ -0,0 +1,630 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
#include "../../events/SDL_keyboard_c.h"
|
||||
#include "../../events/scancodes_darwin.h"
|
||||
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
/*#define DEBUG_IME NSLog */
|
||||
#define DEBUG_IME(...)
|
||||
|
||||
#ifndef NX_DEVICERCTLKEYMASK
|
||||
#define NX_DEVICELCTLKEYMASK 0x00000001
|
||||
#endif
|
||||
#ifndef NX_DEVICELSHIFTKEYMASK
|
||||
#define NX_DEVICELSHIFTKEYMASK 0x00000002
|
||||
#endif
|
||||
#ifndef NX_DEVICERSHIFTKEYMASK
|
||||
#define NX_DEVICERSHIFTKEYMASK 0x00000004
|
||||
#endif
|
||||
#ifndef NX_DEVICELCMDKEYMASK
|
||||
#define NX_DEVICELCMDKEYMASK 0x00000008
|
||||
#endif
|
||||
#ifndef NX_DEVICERCMDKEYMASK
|
||||
#define NX_DEVICERCMDKEYMASK 0x00000010
|
||||
#endif
|
||||
#ifndef NX_DEVICELALTKEYMASK
|
||||
#define NX_DEVICELALTKEYMASK 0x00000020
|
||||
#endif
|
||||
#ifndef NX_DEVICERALTKEYMASK
|
||||
#define NX_DEVICERALTKEYMASK 0x00000040
|
||||
#endif
|
||||
#ifndef NX_DEVICERCTLKEYMASK
|
||||
#define NX_DEVICERCTLKEYMASK 0x00002000
|
||||
#endif
|
||||
|
||||
@interface SDLTranslatorResponder : NSView <NSTextInput>
|
||||
{
|
||||
NSString *_markedText;
|
||||
NSRange _markedRange;
|
||||
NSRange _selectedRange;
|
||||
SDL_Rect _inputRect;
|
||||
}
|
||||
- (void) doCommandBySelector:(SEL)myselector;
|
||||
- (void) setInputRect:(SDL_Rect *) rect;
|
||||
@end
|
||||
|
||||
@implementation SDLTranslatorResponder
|
||||
|
||||
- (void) setInputRect:(SDL_Rect *) rect
|
||||
{
|
||||
_inputRect = *rect;
|
||||
}
|
||||
|
||||
- (void) insertText:(id) aString
|
||||
{
|
||||
const char *str;
|
||||
|
||||
DEBUG_IME(@"insertText: %@", aString);
|
||||
|
||||
/* Could be NSString or NSAttributedString, so we have
|
||||
* to test and convert it before return as SDL event */
|
||||
if ([aString isKindOfClass: [NSAttributedString class]])
|
||||
str = [[aString string] UTF8String];
|
||||
else
|
||||
str = [aString UTF8String];
|
||||
|
||||
SDL_SendKeyboardText(str);
|
||||
}
|
||||
|
||||
- (void) doCommandBySelector:(SEL) myselector
|
||||
{
|
||||
/* No need to do anything since we are not using Cocoa
|
||||
selectors to handle special keys, instead we use SDL
|
||||
key events to do the same job.
|
||||
*/
|
||||
}
|
||||
|
||||
- (BOOL) hasMarkedText
|
||||
{
|
||||
return _markedText != nil;
|
||||
}
|
||||
|
||||
- (NSRange) markedRange
|
||||
{
|
||||
return _markedRange;
|
||||
}
|
||||
|
||||
- (NSRange) selectedRange
|
||||
{
|
||||
return _selectedRange;
|
||||
}
|
||||
|
||||
- (void) setMarkedText:(id) aString
|
||||
selectedRange:(NSRange) selRange
|
||||
{
|
||||
if ([aString isKindOfClass: [NSAttributedString class]])
|
||||
aString = [aString string];
|
||||
|
||||
if ([aString length] == 0)
|
||||
{
|
||||
[self unmarkText];
|
||||
return;
|
||||
}
|
||||
|
||||
if (_markedText != aString)
|
||||
{
|
||||
[_markedText release];
|
||||
_markedText = [aString retain];
|
||||
}
|
||||
|
||||
_selectedRange = selRange;
|
||||
_markedRange = NSMakeRange(0, [aString length]);
|
||||
|
||||
SDL_SendEditingText([aString UTF8String],
|
||||
selRange.location, selRange.length);
|
||||
|
||||
DEBUG_IME(@"setMarkedText: %@, (%d, %d)", _markedText,
|
||||
selRange.location, selRange.length);
|
||||
}
|
||||
|
||||
- (void) unmarkText
|
||||
{
|
||||
[_markedText release];
|
||||
_markedText = nil;
|
||||
|
||||
SDL_SendEditingText("", 0, 0);
|
||||
}
|
||||
|
||||
- (NSRect) firstRectForCharacterRange: (NSRange) theRange
|
||||
{
|
||||
NSWindow *window = [self window];
|
||||
NSRect contentRect = [window contentRectForFrameRect: [window frame]];
|
||||
float windowHeight = contentRect.size.height;
|
||||
NSRect rect = NSMakeRect(_inputRect.x, windowHeight - _inputRect.y - _inputRect.h,
|
||||
_inputRect.w, _inputRect.h);
|
||||
|
||||
DEBUG_IME(@"firstRectForCharacterRange: (%d, %d): windowHeight = %g, rect = %@",
|
||||
theRange.location, theRange.length, windowHeight,
|
||||
NSStringFromRect(rect));
|
||||
rect.origin = [[self window] convertBaseToScreen: rect.origin];
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
- (NSAttributedString *) attributedSubstringFromRange: (NSRange) theRange
|
||||
{
|
||||
DEBUG_IME(@"attributedSubstringFromRange: (%d, %d)", theRange.location, theRange.length);
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSInteger) conversationIdentifier
|
||||
{
|
||||
return (NSInteger) self;
|
||||
}
|
||||
|
||||
/* This method returns the index for character that is
|
||||
* nearest to thePoint. thPoint is in screen coordinate system.
|
||||
*/
|
||||
- (NSUInteger) characterIndexForPoint:(NSPoint) thePoint
|
||||
{
|
||||
DEBUG_IME(@"characterIndexForPoint: (%g, %g)", thePoint.x, thePoint.y);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This method is the key to attribute extension.
|
||||
* We could add new attributes through this method.
|
||||
* NSInputServer examines the return value of this
|
||||
* method & constructs appropriate attributed string.
|
||||
*/
|
||||
- (NSArray *) validAttributesForMarkedText
|
||||
{
|
||||
return [NSArray array];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
/* This is a helper function for HandleModifierSide. This
|
||||
* function reverts back to behavior before the distinction between
|
||||
* sides was made.
|
||||
*/
|
||||
static void
|
||||
HandleNonDeviceModifier(unsigned int device_independent_mask,
|
||||
unsigned int oldMods,
|
||||
unsigned int newMods,
|
||||
SDL_Scancode scancode)
|
||||
{
|
||||
unsigned int oldMask, newMask;
|
||||
|
||||
/* Isolate just the bits we care about in the depedent bits so we can
|
||||
* figure out what changed
|
||||
*/
|
||||
oldMask = oldMods & device_independent_mask;
|
||||
newMask = newMods & device_independent_mask;
|
||||
|
||||
if (oldMask && oldMask != newMask) {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
||||
} else if (newMask && oldMask != newMask) {
|
||||
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a helper function for HandleModifierSide.
|
||||
* This function sets the actual SDL_PrivateKeyboard event.
|
||||
*/
|
||||
static void
|
||||
HandleModifierOneSide(unsigned int oldMods, unsigned int newMods,
|
||||
SDL_Scancode scancode,
|
||||
unsigned int sided_device_dependent_mask)
|
||||
{
|
||||
unsigned int old_dep_mask, new_dep_mask;
|
||||
|
||||
/* Isolate just the bits we care about in the depedent bits so we can
|
||||
* figure out what changed
|
||||
*/
|
||||
old_dep_mask = oldMods & sided_device_dependent_mask;
|
||||
new_dep_mask = newMods & sided_device_dependent_mask;
|
||||
|
||||
/* We now know that this side bit flipped. But we don't know if
|
||||
* it went pressed to released or released to pressed, so we must
|
||||
* find out which it is.
|
||||
*/
|
||||
if (new_dep_mask && old_dep_mask != new_dep_mask) {
|
||||
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
|
||||
} else {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a helper function for DoSidedModifiers.
|
||||
* This function will figure out if the modifier key is the left or right side,
|
||||
* e.g. left-shift vs right-shift.
|
||||
*/
|
||||
static void
|
||||
HandleModifierSide(int device_independent_mask,
|
||||
unsigned int oldMods, unsigned int newMods,
|
||||
SDL_Scancode left_scancode,
|
||||
SDL_Scancode right_scancode,
|
||||
unsigned int left_device_dependent_mask,
|
||||
unsigned int right_device_dependent_mask)
|
||||
{
|
||||
unsigned int device_dependent_mask = (left_device_dependent_mask |
|
||||
right_device_dependent_mask);
|
||||
unsigned int diff_mod;
|
||||
|
||||
/* On the basis that the device independent mask is set, but there are
|
||||
* no device dependent flags set, we'll assume that we can't detect this
|
||||
* keyboard and revert to the unsided behavior.
|
||||
*/
|
||||
if ((device_dependent_mask & newMods) == 0) {
|
||||
/* Revert to the old behavior */
|
||||
HandleNonDeviceModifier(device_independent_mask, oldMods, newMods, left_scancode);
|
||||
return;
|
||||
}
|
||||
|
||||
/* XOR the previous state against the new state to see if there's a change */
|
||||
diff_mod = (device_dependent_mask & oldMods) ^
|
||||
(device_dependent_mask & newMods);
|
||||
if (diff_mod) {
|
||||
/* A change in state was found. Isolate the left and right bits
|
||||
* to handle them separately just in case the values can simulataneously
|
||||
* change or if the bits don't both exist.
|
||||
*/
|
||||
if (left_device_dependent_mask & diff_mod) {
|
||||
HandleModifierOneSide(oldMods, newMods, left_scancode, left_device_dependent_mask);
|
||||
}
|
||||
if (right_device_dependent_mask & diff_mod) {
|
||||
HandleModifierOneSide(oldMods, newMods, right_scancode, right_device_dependent_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a helper function for DoSidedModifiers.
|
||||
* This function will release a key press in the case that
|
||||
* it is clear that the modifier has been released (i.e. one side
|
||||
* can't still be down).
|
||||
*/
|
||||
static void
|
||||
ReleaseModifierSide(unsigned int device_independent_mask,
|
||||
unsigned int oldMods, unsigned int newMods,
|
||||
SDL_Scancode left_scancode,
|
||||
SDL_Scancode right_scancode,
|
||||
unsigned int left_device_dependent_mask,
|
||||
unsigned int right_device_dependent_mask)
|
||||
{
|
||||
unsigned int device_dependent_mask = (left_device_dependent_mask |
|
||||
right_device_dependent_mask);
|
||||
|
||||
/* On the basis that the device independent mask is set, but there are
|
||||
* no device dependent flags set, we'll assume that we can't detect this
|
||||
* keyboard and revert to the unsided behavior.
|
||||
*/
|
||||
if ((device_dependent_mask & oldMods) == 0) {
|
||||
/* In this case, we can't detect the keyboard, so use the left side
|
||||
* to represent both, and release it.
|
||||
*/
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, left_scancode);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* This could have been done in an if-else case because at this point,
|
||||
* we know that all keys have been released when calling this function.
|
||||
* But I'm being paranoid so I want to handle each separately,
|
||||
* so I hope this doesn't cause other problems.
|
||||
*/
|
||||
if ( left_device_dependent_mask & oldMods ) {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, left_scancode);
|
||||
}
|
||||
if ( right_device_dependent_mask & oldMods ) {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, right_scancode);
|
||||
}
|
||||
}
|
||||
|
||||
/* This is a helper function for DoSidedModifiers.
|
||||
* This function handles the CapsLock case.
|
||||
*/
|
||||
static void
|
||||
HandleCapsLock(unsigned short scancode,
|
||||
unsigned int oldMods, unsigned int newMods)
|
||||
{
|
||||
unsigned int oldMask, newMask;
|
||||
|
||||
oldMask = oldMods & NSAlphaShiftKeyMask;
|
||||
newMask = newMods & NSAlphaShiftKeyMask;
|
||||
|
||||
if (oldMask != newMask) {
|
||||
SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK);
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
/* This function will handle the modifier keys and also determine the
|
||||
* correct side of the key.
|
||||
*/
|
||||
static void
|
||||
DoSidedModifiers(unsigned short scancode,
|
||||
unsigned int oldMods, unsigned int newMods)
|
||||
{
|
||||
/* Set up arrays for the key syms for the left and right side. */
|
||||
const SDL_Scancode left_mapping[] = {
|
||||
SDL_SCANCODE_LSHIFT,
|
||||
SDL_SCANCODE_LCTRL,
|
||||
SDL_SCANCODE_LALT,
|
||||
SDL_SCANCODE_LGUI
|
||||
};
|
||||
const SDL_Scancode right_mapping[] = {
|
||||
SDL_SCANCODE_RSHIFT,
|
||||
SDL_SCANCODE_RCTRL,
|
||||
SDL_SCANCODE_RALT,
|
||||
SDL_SCANCODE_RGUI
|
||||
};
|
||||
/* Set up arrays for the device dependent masks with indices that
|
||||
* correspond to the _mapping arrays
|
||||
*/
|
||||
const unsigned int left_device_mapping[] = { NX_DEVICELSHIFTKEYMASK, NX_DEVICELCTLKEYMASK, NX_DEVICELALTKEYMASK, NX_DEVICELCMDKEYMASK };
|
||||
const unsigned int right_device_mapping[] = { NX_DEVICERSHIFTKEYMASK, NX_DEVICERCTLKEYMASK, NX_DEVICERALTKEYMASK, NX_DEVICERCMDKEYMASK };
|
||||
|
||||
unsigned int i, bit;
|
||||
|
||||
/* Handle CAPSLOCK separately because it doesn't have a left/right side */
|
||||
HandleCapsLock(scancode, oldMods, newMods);
|
||||
|
||||
/* Iterate through the bits, testing each against the old modifiers */
|
||||
for (i = 0, bit = NSShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) {
|
||||
unsigned int oldMask, newMask;
|
||||
|
||||
oldMask = oldMods & bit;
|
||||
newMask = newMods & bit;
|
||||
|
||||
/* If the bit is set, we must always examine it because the left
|
||||
* and right side keys may alternate or both may be pressed.
|
||||
*/
|
||||
if (newMask) {
|
||||
HandleModifierSide(bit, oldMods, newMods,
|
||||
left_mapping[i], right_mapping[i],
|
||||
left_device_mapping[i], right_device_mapping[i]);
|
||||
}
|
||||
/* If the state changed from pressed to unpressed, we must examine
|
||||
* the device dependent bits to release the correct keys.
|
||||
*/
|
||||
else if (oldMask && oldMask != newMask) {
|
||||
ReleaseModifierSide(bit, oldMods, newMods,
|
||||
left_mapping[i], right_mapping[i],
|
||||
left_device_mapping[i], right_device_mapping[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
HandleModifiers(_THIS, unsigned short scancode, unsigned int modifierFlags)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
if (modifierFlags == data->modifierFlags) {
|
||||
return;
|
||||
}
|
||||
|
||||
DoSidedModifiers(scancode, data->modifierFlags, modifierFlags);
|
||||
data->modifierFlags = modifierFlags;
|
||||
}
|
||||
|
||||
static void
|
||||
UpdateKeymap(SDL_VideoData *data)
|
||||
{
|
||||
TISInputSourceRef key_layout;
|
||||
const void *chr_data;
|
||||
int i;
|
||||
SDL_Scancode scancode;
|
||||
SDL_Keycode keymap[SDL_NUM_SCANCODES];
|
||||
|
||||
/* See if the keymap needs to be updated */
|
||||
key_layout = TISCopyCurrentKeyboardLayoutInputSource();
|
||||
if (key_layout == data->key_layout) {
|
||||
return;
|
||||
}
|
||||
data->key_layout = key_layout;
|
||||
|
||||
SDL_GetDefaultKeymap(keymap);
|
||||
|
||||
/* Try Unicode data first */
|
||||
CFDataRef uchrDataRef = TISGetInputSourceProperty(key_layout, kTISPropertyUnicodeKeyLayoutData);
|
||||
if (uchrDataRef)
|
||||
chr_data = CFDataGetBytePtr(uchrDataRef);
|
||||
else
|
||||
goto cleanup;
|
||||
|
||||
if (chr_data) {
|
||||
UInt32 keyboard_type = LMGetKbdType();
|
||||
OSStatus err;
|
||||
|
||||
for (i = 0; i < SDL_arraysize(darwin_scancode_table); i++) {
|
||||
UniChar s[8];
|
||||
UniCharCount len;
|
||||
UInt32 dead_key_state;
|
||||
|
||||
/* Make sure this scancode is a valid character scancode */
|
||||
scancode = darwin_scancode_table[i];
|
||||
if (scancode == SDL_SCANCODE_UNKNOWN ||
|
||||
(keymap[scancode] & SDLK_SCANCODE_MASK)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
dead_key_state = 0;
|
||||
err = UCKeyTranslate ((UCKeyboardLayout *) chr_data,
|
||||
i, kUCKeyActionDown,
|
||||
0, keyboard_type,
|
||||
kUCKeyTranslateNoDeadKeysMask,
|
||||
&dead_key_state, 8, &len, s);
|
||||
if (err != noErr)
|
||||
continue;
|
||||
|
||||
if (len > 0 && s[0] != 0x10) {
|
||||
keymap[scancode] = s[0];
|
||||
}
|
||||
}
|
||||
SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
|
||||
return;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
CFRelease(key_layout);
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_InitKeyboard(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
UpdateKeymap(data);
|
||||
|
||||
/* Set our own names for the platform-dependent but layout-independent keys */
|
||||
/* This key is NumLock on the MacBook keyboard. :) */
|
||||
/*SDL_SetScancodeName(SDL_SCANCODE_NUMLOCKCLEAR, "Clear");*/
|
||||
SDL_SetScancodeName(SDL_SCANCODE_LALT, "Left Option");
|
||||
SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Command");
|
||||
SDL_SetScancodeName(SDL_SCANCODE_RALT, "Right Option");
|
||||
SDL_SetScancodeName(SDL_SCANCODE_RGUI, "Right Command");
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_StartTextInput(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
SDL_Window *window = SDL_GetKeyboardFocus();
|
||||
NSWindow *nswindow = nil;
|
||||
if (window)
|
||||
nswindow = ((SDL_WindowData*)window->driverdata)->nswindow;
|
||||
|
||||
NSView *parentView = [nswindow contentView];
|
||||
|
||||
/* We only keep one field editor per process, since only the front most
|
||||
* window can receive text input events, so it make no sense to keep more
|
||||
* than one copy. When we switched to another window and requesting for
|
||||
* text input, simply remove the field editor from its superview then add
|
||||
* it to the front most window's content view */
|
||||
if (!data->fieldEdit) {
|
||||
data->fieldEdit =
|
||||
[[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)];
|
||||
}
|
||||
|
||||
if (![[data->fieldEdit superview] isEqual: parentView])
|
||||
{
|
||||
/* DEBUG_IME(@"add fieldEdit to window contentView"); */
|
||||
[data->fieldEdit removeFromSuperview];
|
||||
[parentView addSubview: data->fieldEdit];
|
||||
[nswindow makeFirstResponder: data->fieldEdit];
|
||||
}
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_StopTextInput(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
if (data && data->fieldEdit) {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
[data->fieldEdit removeFromSuperview];
|
||||
[data->fieldEdit release];
|
||||
data->fieldEdit = nil;
|
||||
[pool release];
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_SetTextInputRect(_THIS, SDL_Rect *rect)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
if (!rect) {
|
||||
SDL_InvalidParamError("rect");
|
||||
return;
|
||||
}
|
||||
|
||||
[data->fieldEdit setInputRect: rect];
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
unsigned short scancode = [event keyCode];
|
||||
SDL_Scancode code;
|
||||
#if 0
|
||||
const char *text;
|
||||
#endif
|
||||
|
||||
if ((scancode == 10 || scancode == 50) && KBGetLayoutType(LMGetKbdType()) == kKeyboardISO) {
|
||||
/* see comments in SDL_cocoakeys.h */
|
||||
scancode = 60 - scancode;
|
||||
}
|
||||
if (scancode < SDL_arraysize(darwin_scancode_table)) {
|
||||
code = darwin_scancode_table[scancode];
|
||||
}
|
||||
else {
|
||||
/* Hmm, does this ever happen? If so, need to extend the keymap... */
|
||||
code = SDL_SCANCODE_UNKNOWN;
|
||||
}
|
||||
|
||||
switch ([event type]) {
|
||||
case NSKeyDown:
|
||||
if (![event isARepeat]) {
|
||||
/* See if we need to rebuild the keyboard layout */
|
||||
UpdateKeymap(data);
|
||||
}
|
||||
|
||||
SDL_SendKeyboardKey(SDL_PRESSED, code);
|
||||
#if 1
|
||||
if (code == SDL_SCANCODE_UNKNOWN) {
|
||||
fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>. Mac virtual key code is %d.\n", scancode);
|
||||
}
|
||||
#endif
|
||||
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
|
||||
/* FIXME CW 2007-08-16: only send those events to the field editor for which we actually want text events, not e.g. esc or function keys. Arrow keys in particular seem to produce crashes sometimes. */
|
||||
[data->fieldEdit interpretKeyEvents:[NSArray arrayWithObject:event]];
|
||||
#if 0
|
||||
text = [[event characters] UTF8String];
|
||||
if(text && *text) {
|
||||
SDL_SendKeyboardText(text);
|
||||
[data->fieldEdit setString:@""];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case NSKeyUp:
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, code);
|
||||
break;
|
||||
case NSFlagsChanged:
|
||||
/* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */
|
||||
HandleModifiers(_this, scancode, [event modifierFlags]);
|
||||
break;
|
||||
default: /* just to avoid compiler warnings */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitKeyboard(_THIS)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
29
Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.h
Normal file
29
Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
extern int Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
145
Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.m
Normal file
145
Engine/lib/sdl/src/video/cocoa/SDL_cocoamessagebox.m
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#if defined(__APPLE__) && defined(__POWERPC__) && !defined(__APPLE_ALTIVEC__)
|
||||
#include <altivec.h>
|
||||
#undef bool
|
||||
#undef vector
|
||||
#undef pixel
|
||||
#endif
|
||||
|
||||
#include "SDL_events.h"
|
||||
#include "SDL_timer.h"
|
||||
#include "SDL_messagebox.h"
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
@interface SDLMessageBoxPresenter : NSObject {
|
||||
@public
|
||||
NSInteger clicked;
|
||||
NSWindow *nswindow;
|
||||
}
|
||||
- (id) initWithParentWindow:(SDL_Window *)window;
|
||||
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
|
||||
@end
|
||||
|
||||
@implementation SDLMessageBoxPresenter
|
||||
- (id) initWithParentWindow:(SDL_Window *)window
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
clicked = -1;
|
||||
|
||||
/* Retain the NSWindow because we'll show the alert later on the main thread */
|
||||
if (window) {
|
||||
nswindow = [((SDL_WindowData *) window->driverdata)->nswindow retain];
|
||||
} else {
|
||||
nswindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)showAlert:(NSAlert*)alert
|
||||
{
|
||||
if (nswindow) {
|
||||
[alert beginSheetModalForWindow:nswindow modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:nil];
|
||||
while (clicked < 0) {
|
||||
SDL_PumpEvents();
|
||||
SDL_Delay(100);
|
||||
}
|
||||
[nswindow release];
|
||||
} else {
|
||||
clicked = [alert runModal];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
|
||||
{
|
||||
clicked = returnCode;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/* Display a Cocoa message box */
|
||||
int
|
||||
Cocoa_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||
{
|
||||
Cocoa_RegisterApp();
|
||||
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
NSAlert* alert = [[[NSAlert alloc] init] autorelease];
|
||||
|
||||
if (messageboxdata->flags & SDL_MESSAGEBOX_ERROR) {
|
||||
[alert setAlertStyle:NSCriticalAlertStyle];
|
||||
} else if (messageboxdata->flags & SDL_MESSAGEBOX_WARNING) {
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
} else {
|
||||
[alert setAlertStyle:NSInformationalAlertStyle];
|
||||
}
|
||||
|
||||
[alert setMessageText:[NSString stringWithUTF8String:messageboxdata->title]];
|
||||
[alert setInformativeText:[NSString stringWithUTF8String:messageboxdata->message]];
|
||||
|
||||
const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
|
||||
int i;
|
||||
for (i = 0; i < messageboxdata->numbuttons; ++i) {
|
||||
NSButton *button = [alert addButtonWithTitle:[NSString stringWithUTF8String:buttons[i].text]];
|
||||
if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) {
|
||||
[button setKeyEquivalent:@"\r"];
|
||||
} else if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) {
|
||||
[button setKeyEquivalent:@"\033"];
|
||||
} else {
|
||||
[button setKeyEquivalent:@""];
|
||||
}
|
||||
}
|
||||
|
||||
SDLMessageBoxPresenter* presenter = [[[SDLMessageBoxPresenter alloc] initWithParentWindow:messageboxdata->window] autorelease];
|
||||
|
||||
[presenter performSelectorOnMainThread:@selector(showAlert:)
|
||||
withObject:alert
|
||||
waitUntilDone:YES];
|
||||
|
||||
int returnValue = 0;
|
||||
NSInteger clicked = presenter->clicked;
|
||||
if (clicked >= NSAlertFirstButtonReturn)
|
||||
{
|
||||
clicked -= NSAlertFirstButtonReturn;
|
||||
*buttonid = buttons[clicked].buttonid;
|
||||
}
|
||||
else
|
||||
{
|
||||
returnValue = SDL_SetError("Did not get a valid `clicked button' id: %d", clicked);
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
44
Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.h
Normal file
44
Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.h
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamodes_h
|
||||
#define _SDL_cocoamodes_h
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CGDirectDisplayID display;
|
||||
} SDL_DisplayData;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const void *moderef;
|
||||
} SDL_DisplayModeData;
|
||||
|
||||
extern void Cocoa_InitModes(_THIS);
|
||||
extern int Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect);
|
||||
extern void Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display);
|
||||
extern int Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
|
||||
extern void Cocoa_QuitModes(_THIS);
|
||||
|
||||
#endif /* _SDL_cocoamodes_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
465
Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.m
Normal file
465
Engine/lib/sdl/src/video/cocoa/SDL_cocoamodes.m
Normal file
|
|
@ -0,0 +1,465 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
/* We need this for IODisplayCreateInfoDictionary and kIODisplayOnlyPreferredName */
|
||||
#include <IOKit/graphics/IOGraphicsLib.h>
|
||||
|
||||
/* we need this for ShowMenuBar() and HideMenuBar(). */
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */
|
||||
#include <AvailabilityMacros.h>
|
||||
|
||||
|
||||
static void
|
||||
Cocoa_ToggleMenuBar(const BOOL show)
|
||||
{
|
||||
/* !!! FIXME: keep an eye on this.
|
||||
* ShowMenuBar/HideMenuBar is officially unavailable for 64-bit binaries.
|
||||
* It happens to work, as of 10.7, but we're going to see if
|
||||
* we can just simply do without it on newer OSes...
|
||||
*/
|
||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < 1070) && !defined(__LP64__)
|
||||
if (show)
|
||||
ShowMenuBar();
|
||||
else
|
||||
HideMenuBar();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/* !!! FIXME: clean out the pre-10.6 code when it makes sense to do so. */
|
||||
#define FORCE_OLD_API 0
|
||||
|
||||
#if FORCE_OLD_API
|
||||
#undef MAC_OS_X_VERSION_MIN_REQUIRED
|
||||
#define MAC_OS_X_VERSION_MIN_REQUIRED 1050
|
||||
#endif
|
||||
|
||||
static BOOL
|
||||
IS_SNOW_LEOPARD_OR_LATER(_THIS)
|
||||
{
|
||||
#if FORCE_OLD_API
|
||||
return NO;
|
||||
#else
|
||||
return ((((SDL_VideoData *) _this->driverdata))->osversion >= 0x1060);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
CG_SetError(const char *prefix, CGDisplayErr result)
|
||||
{
|
||||
const char *error;
|
||||
|
||||
switch (result) {
|
||||
case kCGErrorFailure:
|
||||
error = "kCGErrorFailure";
|
||||
break;
|
||||
case kCGErrorIllegalArgument:
|
||||
error = "kCGErrorIllegalArgument";
|
||||
break;
|
||||
case kCGErrorInvalidConnection:
|
||||
error = "kCGErrorInvalidConnection";
|
||||
break;
|
||||
case kCGErrorInvalidContext:
|
||||
error = "kCGErrorInvalidContext";
|
||||
break;
|
||||
case kCGErrorCannotComplete:
|
||||
error = "kCGErrorCannotComplete";
|
||||
break;
|
||||
case kCGErrorNotImplemented:
|
||||
error = "kCGErrorNotImplemented";
|
||||
break;
|
||||
case kCGErrorRangeCheck:
|
||||
error = "kCGErrorRangeCheck";
|
||||
break;
|
||||
case kCGErrorTypeCheck:
|
||||
error = "kCGErrorTypeCheck";
|
||||
break;
|
||||
case kCGErrorInvalidOperation:
|
||||
error = "kCGErrorInvalidOperation";
|
||||
break;
|
||||
case kCGErrorNoneAvailable:
|
||||
error = "kCGErrorNoneAvailable";
|
||||
break;
|
||||
default:
|
||||
error = "Unknown Error";
|
||||
break;
|
||||
}
|
||||
return SDL_SetError("%s: %s", prefix, error);
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
GetDisplayMode(_THIS, const void *moderef, SDL_DisplayMode *mode)
|
||||
{
|
||||
SDL_DisplayModeData *data;
|
||||
long width = 0;
|
||||
long height = 0;
|
||||
long bpp = 0;
|
||||
long refreshRate = 0;
|
||||
|
||||
data = (SDL_DisplayModeData *) SDL_malloc(sizeof(*data));
|
||||
if (!data) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
data->moderef = moderef;
|
||||
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
CGDisplayModeRef vidmode = (CGDisplayModeRef) moderef;
|
||||
CFStringRef fmt = CGDisplayModeCopyPixelEncoding(vidmode);
|
||||
width = (long) CGDisplayModeGetWidth(vidmode);
|
||||
height = (long) CGDisplayModeGetHeight(vidmode);
|
||||
refreshRate = (long) CGDisplayModeGetRefreshRate(vidmode);
|
||||
|
||||
if (CFStringCompare(fmt, CFSTR(IO32BitDirectPixels),
|
||||
kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
bpp = 32;
|
||||
} else if (CFStringCompare(fmt, CFSTR(IO16BitDirectPixels),
|
||||
kCFCompareCaseInsensitive) == kCFCompareEqualTo) {
|
||||
bpp = 16;
|
||||
} else {
|
||||
bpp = 0; /* ignore 8-bit and such for now. */
|
||||
}
|
||||
|
||||
CFRelease(fmt);
|
||||
}
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
if (!IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
CFNumberRef number;
|
||||
CFDictionaryRef vidmode = (CFDictionaryRef) moderef;
|
||||
number = CFDictionaryGetValue(vidmode, kCGDisplayWidth);
|
||||
CFNumberGetValue(number, kCFNumberLongType, &width);
|
||||
number = CFDictionaryGetValue(vidmode, kCGDisplayHeight);
|
||||
CFNumberGetValue(number, kCFNumberLongType, &height);
|
||||
number = CFDictionaryGetValue(vidmode, kCGDisplayBitsPerPixel);
|
||||
CFNumberGetValue(number, kCFNumberLongType, &bpp);
|
||||
number = CFDictionaryGetValue(vidmode, kCGDisplayRefreshRate);
|
||||
CFNumberGetValue(number, kCFNumberLongType, &refreshRate);
|
||||
}
|
||||
#endif
|
||||
|
||||
mode->format = SDL_PIXELFORMAT_UNKNOWN;
|
||||
switch (bpp) {
|
||||
case 16:
|
||||
mode->format = SDL_PIXELFORMAT_ARGB1555;
|
||||
break;
|
||||
case 32:
|
||||
mode->format = SDL_PIXELFORMAT_ARGB8888;
|
||||
break;
|
||||
case 8: /* We don't support palettized modes now */
|
||||
default: /* Totally unrecognizable bit depth. */
|
||||
return SDL_FALSE;
|
||||
}
|
||||
mode->w = width;
|
||||
mode->h = height;
|
||||
mode->refresh_rate = refreshRate;
|
||||
mode->driverdata = data;
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
Cocoa_ReleaseDisplayMode(_THIS, const void *moderef)
|
||||
{
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
CGDisplayModeRelease((CGDisplayModeRef) moderef); /* NULL is ok */
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
Cocoa_ReleaseDisplayModeList(_THIS, CFArrayRef modelist)
|
||||
{
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
CFRelease(modelist); /* NULL is ok */
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
Cocoa_GetDisplayName(CGDirectDisplayID displayID)
|
||||
{
|
||||
NSDictionary *deviceInfo = (NSDictionary *)IODisplayCreateInfoDictionary(CGDisplayIOServicePort(displayID), kIODisplayOnlyPreferredName);
|
||||
NSDictionary *localizedNames = [deviceInfo objectForKey:[NSString stringWithUTF8String:kDisplayProductName]];
|
||||
const char* displayName = NULL;
|
||||
|
||||
if ([localizedNames count] > 0) {
|
||||
displayName = SDL_strdup([[localizedNames objectForKey:[[localizedNames allKeys] objectAtIndex:0]] UTF8String]);
|
||||
}
|
||||
[deviceInfo release];
|
||||
return displayName;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_InitModes(_THIS)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
CGDisplayErr result;
|
||||
CGDirectDisplayID *displays;
|
||||
CGDisplayCount numDisplays;
|
||||
int pass, i;
|
||||
|
||||
result = CGGetOnlineDisplayList(0, NULL, &numDisplays);
|
||||
if (result != kCGErrorSuccess) {
|
||||
CG_SetError("CGGetOnlineDisplayList()", result);
|
||||
[pool release];
|
||||
return;
|
||||
}
|
||||
displays = SDL_stack_alloc(CGDirectDisplayID, numDisplays);
|
||||
result = CGGetOnlineDisplayList(numDisplays, displays, &numDisplays);
|
||||
if (result != kCGErrorSuccess) {
|
||||
CG_SetError("CGGetOnlineDisplayList()", result);
|
||||
SDL_stack_free(displays);
|
||||
[pool release];
|
||||
return;
|
||||
}
|
||||
|
||||
/* Pick up the primary display in the first pass, then get the rest */
|
||||
for (pass = 0; pass < 2; ++pass) {
|
||||
for (i = 0; i < numDisplays; ++i) {
|
||||
SDL_VideoDisplay display;
|
||||
SDL_DisplayData *displaydata;
|
||||
SDL_DisplayMode mode;
|
||||
const void *moderef = NULL;
|
||||
|
||||
if (pass == 0) {
|
||||
if (!CGDisplayIsMain(displays[i])) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (CGDisplayIsMain(displays[i])) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (CGDisplayMirrorsDisplay(displays[i]) != kCGNullDirectDisplay) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
moderef = CGDisplayCopyDisplayMode(displays[i]);
|
||||
}
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
if (!IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
moderef = CGDisplayCurrentMode(displays[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!moderef) {
|
||||
continue;
|
||||
}
|
||||
|
||||
displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
|
||||
if (!displaydata) {
|
||||
Cocoa_ReleaseDisplayMode(_this, moderef);
|
||||
continue;
|
||||
}
|
||||
displaydata->display = displays[i];
|
||||
|
||||
SDL_zero(display);
|
||||
/* this returns a stddup'ed string */
|
||||
display.name = (char *)Cocoa_GetDisplayName(displays[i]);
|
||||
if (!GetDisplayMode (_this, moderef, &mode)) {
|
||||
Cocoa_ReleaseDisplayMode(_this, moderef);
|
||||
SDL_free(display.name);
|
||||
SDL_free(displaydata);
|
||||
continue;
|
||||
}
|
||||
|
||||
display.desktop_mode = mode;
|
||||
display.current_mode = mode;
|
||||
display.driverdata = displaydata;
|
||||
SDL_AddVideoDisplay(&display);
|
||||
SDL_free(display.name);
|
||||
}
|
||||
}
|
||||
SDL_stack_free(displays);
|
||||
[pool release];
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_GetDisplayBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
|
||||
{
|
||||
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
|
||||
CGRect cgrect;
|
||||
|
||||
cgrect = CGDisplayBounds(displaydata->display);
|
||||
rect->x = (int)cgrect.origin.x;
|
||||
rect->y = (int)cgrect.origin.y;
|
||||
rect->w = (int)cgrect.size.width;
|
||||
rect->h = (int)cgrect.size.height;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
|
||||
{
|
||||
SDL_DisplayData *data = (SDL_DisplayData *) display->driverdata;
|
||||
CFArrayRef modes = NULL;
|
||||
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
modes = CGDisplayCopyAllDisplayModes(data->display, NULL);
|
||||
}
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
if (!IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
modes = CGDisplayAvailableModes(data->display);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (modes) {
|
||||
const CFIndex count = CFArrayGetCount(modes);
|
||||
CFIndex i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const void *moderef = CFArrayGetValueAtIndex(modes, i);
|
||||
SDL_DisplayMode mode;
|
||||
if (GetDisplayMode(_this, moderef, &mode)) {
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
CGDisplayModeRetain((CGDisplayModeRef) moderef);
|
||||
}
|
||||
SDL_AddDisplayMode(display, &mode);
|
||||
}
|
||||
}
|
||||
|
||||
Cocoa_ReleaseDisplayModeList(_this, modes);
|
||||
}
|
||||
}
|
||||
|
||||
static CGError
|
||||
Cocoa_SwitchMode(_THIS, CGDirectDisplayID display, const void *mode)
|
||||
{
|
||||
if (IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
return CGDisplaySetDisplayMode(display, (CGDisplayModeRef) mode, NULL);
|
||||
}
|
||||
|
||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
|
||||
if (!IS_SNOW_LEOPARD_OR_LATER(_this)) {
|
||||
return CGDisplaySwitchToMode(display, (CFDictionaryRef) mode);
|
||||
}
|
||||
#endif
|
||||
|
||||
return kCGErrorFailure;
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
||||
{
|
||||
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
|
||||
SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata;
|
||||
CGDisplayFadeReservationToken fade_token = kCGDisplayFadeReservationInvalidToken;
|
||||
CGError result;
|
||||
|
||||
/* Fade to black to hide resolution-switching flicker */
|
||||
if (CGAcquireDisplayFadeReservation(5, &fade_token) == kCGErrorSuccess) {
|
||||
CGDisplayFade(fade_token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE);
|
||||
}
|
||||
|
||||
if (data == display->desktop_mode.driverdata) {
|
||||
/* Restoring desktop mode */
|
||||
Cocoa_SwitchMode(_this, displaydata->display, data->moderef);
|
||||
|
||||
if (CGDisplayIsMain(displaydata->display)) {
|
||||
CGReleaseAllDisplays();
|
||||
} else {
|
||||
CGDisplayRelease(displaydata->display);
|
||||
}
|
||||
|
||||
if (CGDisplayIsMain(displaydata->display)) {
|
||||
Cocoa_ToggleMenuBar(YES);
|
||||
}
|
||||
} else {
|
||||
/* Put up the blanking window (a window above all other windows) */
|
||||
if (CGDisplayIsMain(displaydata->display)) {
|
||||
/* If we don't capture all displays, Cocoa tries to rearrange windows... *sigh* */
|
||||
result = CGCaptureAllDisplays();
|
||||
} else {
|
||||
result = CGDisplayCapture(displaydata->display);
|
||||
}
|
||||
if (result != kCGErrorSuccess) {
|
||||
CG_SetError("CGDisplayCapture()", result);
|
||||
goto ERR_NO_CAPTURE;
|
||||
}
|
||||
|
||||
/* Do the physical switch */
|
||||
result = Cocoa_SwitchMode(_this, displaydata->display, data->moderef);
|
||||
if (result != kCGErrorSuccess) {
|
||||
CG_SetError("CGDisplaySwitchToMode()", result);
|
||||
goto ERR_NO_SWITCH;
|
||||
}
|
||||
|
||||
/* Hide the menu bar so it doesn't intercept events */
|
||||
if (CGDisplayIsMain(displaydata->display)) {
|
||||
Cocoa_ToggleMenuBar(NO);
|
||||
}
|
||||
}
|
||||
|
||||
/* Fade in again (asynchronously) */
|
||||
if (fade_token != kCGDisplayFadeReservationInvalidToken) {
|
||||
CGDisplayFade(fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
|
||||
CGReleaseDisplayFadeReservation(fade_token);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
/* Since the blanking window covers *all* windows (even force quit) correct recovery is crucial */
|
||||
ERR_NO_SWITCH:
|
||||
CGDisplayRelease(displaydata->display);
|
||||
ERR_NO_CAPTURE:
|
||||
if (fade_token != kCGDisplayFadeReservationInvalidToken) {
|
||||
CGDisplayFade (fade_token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE);
|
||||
CGReleaseDisplayFadeReservation(fade_token);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitModes(_THIS)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < _this->num_displays; ++i) {
|
||||
SDL_VideoDisplay *display = &_this->displays[i];
|
||||
SDL_DisplayModeData *mode;
|
||||
|
||||
if (display->current_mode.driverdata != display->desktop_mode.driverdata) {
|
||||
Cocoa_SetDisplayMode(_this, display, &display->desktop_mode);
|
||||
}
|
||||
|
||||
mode = (SDL_DisplayModeData *) display->desktop_mode.driverdata;
|
||||
Cocoa_ReleaseDisplayMode(_this, mode->moderef);
|
||||
|
||||
for (j = 0; j < display->num_display_modes; j++) {
|
||||
mode = (SDL_DisplayModeData*) display->display_modes[j].driverdata;
|
||||
Cocoa_ReleaseDisplayMode(_this, mode->moderef);
|
||||
}
|
||||
|
||||
}
|
||||
Cocoa_ToggleMenuBar(YES);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
52
Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.h
Normal file
52
Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.h
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamouse_h
|
||||
#define _SDL_cocoamouse_h
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
extern void Cocoa_InitMouse(_THIS);
|
||||
extern void Cocoa_HandleMouseEvent(_THIS, NSEvent * event);
|
||||
extern void Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent * event);
|
||||
extern void Cocoa_HandleMouseWarp(CGFloat x, CGFloat y);
|
||||
extern void Cocoa_QuitMouse(_THIS);
|
||||
|
||||
typedef struct {
|
||||
/* Wether we've seen a cursor warp since the last move event. */
|
||||
SDL_bool seenWarp;
|
||||
/* What location our last cursor warp was to. */
|
||||
CGFloat lastWarpX;
|
||||
CGFloat lastWarpY;
|
||||
/* What location we last saw the cursor move to. */
|
||||
CGFloat lastMoveX;
|
||||
CGFloat lastMoveY;
|
||||
void *tapdata;
|
||||
} SDL_MouseData;
|
||||
|
||||
@interface NSCursor (InvisibleCursor)
|
||||
+ (NSCursor *)invisibleCursor;
|
||||
@end
|
||||
|
||||
#endif /* _SDL_cocoamouse_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
407
Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.m
Normal file
407
Engine/lib/sdl/src/video/cocoa/SDL_cocoamouse.m
Normal file
|
|
@ -0,0 +1,407 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_assert.h"
|
||||
#include "SDL_events.h"
|
||||
#include "SDL_cocoamouse.h"
|
||||
#include "SDL_cocoamousetap.h"
|
||||
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
/* #define DEBUG_COCOAMOUSE */
|
||||
|
||||
#ifdef DEBUG_COCOAMOUSE
|
||||
#define DLog(fmt, ...) printf("%s: " fmt "\n", __func__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define DLog(...) do { } while (0)
|
||||
#endif
|
||||
|
||||
@implementation NSCursor (InvisibleCursor)
|
||||
+ (NSCursor *)invisibleCursor
|
||||
{
|
||||
static NSCursor *invisibleCursor = NULL;
|
||||
if (!invisibleCursor) {
|
||||
/* RAW 16x16 transparent GIF */
|
||||
static unsigned char cursorBytes[] = {
|
||||
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04,
|
||||
0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x10,
|
||||
0x00, 0x10, 0x00, 0x00, 0x02, 0x0E, 0x8C, 0x8F, 0xA9, 0xCB, 0xED,
|
||||
0x0F, 0xA3, 0x9C, 0xB4, 0xDA, 0x8B, 0xB3, 0x3E, 0x05, 0x00, 0x3B
|
||||
};
|
||||
|
||||
NSData *cursorData = [NSData dataWithBytesNoCopy:&cursorBytes[0]
|
||||
length:sizeof(cursorBytes)
|
||||
freeWhenDone:NO];
|
||||
NSImage *cursorImage = [[[NSImage alloc] initWithData:cursorData] autorelease];
|
||||
invisibleCursor = [[NSCursor alloc] initWithImage:cursorImage
|
||||
hotSpot:NSZeroPoint];
|
||||
}
|
||||
|
||||
return invisibleCursor;
|
||||
}
|
||||
@end
|
||||
|
||||
|
||||
static SDL_Cursor *
|
||||
Cocoa_CreateDefaultCursor()
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSCursor *nscursor;
|
||||
SDL_Cursor *cursor = NULL;
|
||||
|
||||
nscursor = [NSCursor arrowCursor];
|
||||
|
||||
if (nscursor) {
|
||||
cursor = SDL_calloc(1, sizeof(*cursor));
|
||||
if (cursor) {
|
||||
cursor->driverdata = nscursor;
|
||||
[nscursor retain];
|
||||
}
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
static SDL_Cursor *
|
||||
Cocoa_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSImage *nsimage;
|
||||
NSCursor *nscursor = NULL;
|
||||
SDL_Cursor *cursor = NULL;
|
||||
|
||||
nsimage = Cocoa_CreateImage(surface);
|
||||
if (nsimage) {
|
||||
nscursor = [[NSCursor alloc] initWithImage: nsimage hotSpot: NSMakePoint(hot_x, hot_y)];
|
||||
}
|
||||
|
||||
if (nscursor) {
|
||||
cursor = SDL_calloc(1, sizeof(*cursor));
|
||||
if (cursor) {
|
||||
cursor->driverdata = nscursor;
|
||||
} else {
|
||||
[nscursor release];
|
||||
}
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
static SDL_Cursor *
|
||||
Cocoa_CreateSystemCursor(SDL_SystemCursor id)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSCursor *nscursor = NULL;
|
||||
SDL_Cursor *cursor = NULL;
|
||||
|
||||
switch(id)
|
||||
{
|
||||
case SDL_SYSTEM_CURSOR_ARROW:
|
||||
nscursor = [NSCursor arrowCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_IBEAM:
|
||||
nscursor = [NSCursor IBeamCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_WAIT:
|
||||
nscursor = [NSCursor arrowCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_CROSSHAIR:
|
||||
nscursor = [NSCursor crosshairCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_WAITARROW:
|
||||
nscursor = [NSCursor arrowCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_SIZENWSE:
|
||||
case SDL_SYSTEM_CURSOR_SIZENESW:
|
||||
nscursor = [NSCursor closedHandCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_SIZEWE:
|
||||
nscursor = [NSCursor resizeLeftRightCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_SIZENS:
|
||||
nscursor = [NSCursor resizeUpDownCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_SIZEALL:
|
||||
nscursor = [NSCursor closedHandCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_NO:
|
||||
nscursor = [NSCursor operationNotAllowedCursor];
|
||||
break;
|
||||
case SDL_SYSTEM_CURSOR_HAND:
|
||||
nscursor = [NSCursor pointingHandCursor];
|
||||
break;
|
||||
default:
|
||||
SDL_assert(!"Unknown system cursor");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (nscursor) {
|
||||
cursor = SDL_calloc(1, sizeof(*cursor));
|
||||
if (cursor) {
|
||||
/* We'll free it later, so retain it here */
|
||||
[nscursor retain];
|
||||
cursor->driverdata = nscursor;
|
||||
}
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
static void
|
||||
Cocoa_FreeCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSCursor *nscursor = (NSCursor *)cursor->driverdata;
|
||||
|
||||
[nscursor release];
|
||||
SDL_free(cursor);
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
static int
|
||||
Cocoa_ShowCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
SDL_VideoDevice *device = SDL_GetVideoDevice();
|
||||
SDL_Window *window = (device ? device->windows : NULL);
|
||||
for (; window != NULL; window = window->next) {
|
||||
SDL_WindowData *driverdata = (SDL_WindowData *)window->driverdata;
|
||||
if (driverdata) {
|
||||
[driverdata->nswindow performSelectorOnMainThread:@selector(invalidateCursorRectsForView:)
|
||||
withObject:[driverdata->nswindow contentView]
|
||||
waitUntilDone:NO];
|
||||
}
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
Cocoa_WarpMouse(SDL_Window * window, int x, int y)
|
||||
{
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
if ([data->listener isMoving])
|
||||
{
|
||||
DLog("Postponing warp, window being moved.");
|
||||
[data->listener setPendingMoveX:x
|
||||
Y:y];
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
CGPoint point = CGPointMake(x + (float)window->x, y + (float)window->y);
|
||||
|
||||
Cocoa_HandleMouseWarp(point.x, point.y);
|
||||
|
||||
/* According to the docs, this was deprecated in 10.6, but it's still
|
||||
* around. The substitute requires a CGEventSource, but I'm not entirely
|
||||
* sure how we'd procure the right one for this event.
|
||||
*/
|
||||
CGSetLocalEventsSuppressionInterval(0.0);
|
||||
CGWarpMouseCursorPosition(point);
|
||||
CGSetLocalEventsSuppressionInterval(0.25);
|
||||
|
||||
if (!mouse->relative_mode) {
|
||||
/* CGWarpMouseCursorPosition doesn't generate a window event, unlike our
|
||||
* other implementations' APIs.
|
||||
*/
|
||||
SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 0, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
Cocoa_SetRelativeMouseMode(SDL_bool enabled)
|
||||
{
|
||||
/* We will re-apply the relative mode when the window gets focus, if it
|
||||
* doesn't have focus right now.
|
||||
*/
|
||||
SDL_Window *window = SDL_GetMouseFocus();
|
||||
if (!window) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We will re-apply the relative mode when the window finishes being moved,
|
||||
* if it is being moved right now.
|
||||
*/
|
||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
||||
if ([data->listener isMoving]) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
CGError result;
|
||||
if (enabled) {
|
||||
DLog("Turning on.");
|
||||
result = CGAssociateMouseAndMouseCursorPosition(NO);
|
||||
} else {
|
||||
DLog("Turning off.");
|
||||
result = CGAssociateMouseAndMouseCursorPosition(YES);
|
||||
}
|
||||
if (result != kCGErrorSuccess) {
|
||||
return SDL_SetError("CGAssociateMouseAndMouseCursorPosition() failed");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_InitMouse(_THIS)
|
||||
{
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
|
||||
mouse->driverdata = SDL_calloc(1, sizeof(SDL_MouseData));
|
||||
|
||||
mouse->CreateCursor = Cocoa_CreateCursor;
|
||||
mouse->CreateSystemCursor = Cocoa_CreateSystemCursor;
|
||||
mouse->ShowCursor = Cocoa_ShowCursor;
|
||||
mouse->FreeCursor = Cocoa_FreeCursor;
|
||||
mouse->WarpMouse = Cocoa_WarpMouse;
|
||||
mouse->SetRelativeMouseMode = Cocoa_SetRelativeMouseMode;
|
||||
|
||||
SDL_SetDefaultCursor(Cocoa_CreateDefaultCursor());
|
||||
|
||||
Cocoa_InitMouseEventTap(mouse->driverdata);
|
||||
|
||||
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
|
||||
const NSPoint location = [NSEvent mouseLocation];
|
||||
driverdata->lastMoveX = location.x;
|
||||
driverdata->lastMoveY = location.y;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_HandleMouseEvent(_THIS, NSEvent *event)
|
||||
{
|
||||
switch ([event type])
|
||||
{
|
||||
case NSMouseMoved:
|
||||
case NSLeftMouseDragged:
|
||||
case NSRightMouseDragged:
|
||||
case NSOtherMouseDragged:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Ignore any other events. */
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
|
||||
SDL_MouseData *driverdata = (SDL_MouseData*)mouse->driverdata;
|
||||
const SDL_bool seenWarp = driverdata->seenWarp;
|
||||
driverdata->seenWarp = NO;
|
||||
|
||||
const NSPoint location = [NSEvent mouseLocation];
|
||||
const CGFloat lastMoveX = driverdata->lastMoveX;
|
||||
const CGFloat lastMoveY = driverdata->lastMoveY;
|
||||
driverdata->lastMoveX = location.x;
|
||||
driverdata->lastMoveY = location.y;
|
||||
DLog("Last seen mouse: (%g, %g)", location.x, location.y);
|
||||
|
||||
/* Non-relative movement is handled in -[Cocoa_WindowListener mouseMoved:] */
|
||||
if (!mouse->relative_mode) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ignore events that aren't inside the client area (i.e. title bar.) */
|
||||
if ([event window]) {
|
||||
NSRect windowRect = [[[event window] contentView] frame];
|
||||
if (!NSPointInRect([event locationInWindow], windowRect)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
float deltaX = [event deltaX];
|
||||
float deltaY = [event deltaY];
|
||||
|
||||
if (seenWarp)
|
||||
{
|
||||
deltaX += (lastMoveX - driverdata->lastWarpX);
|
||||
deltaY += ((CGDisplayPixelsHigh(kCGDirectMainDisplay) - lastMoveY) - driverdata->lastWarpY);
|
||||
|
||||
DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY);
|
||||
}
|
||||
|
||||
SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)deltaX, (int)deltaY);
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event)
|
||||
{
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
|
||||
float x = -[event deltaX];
|
||||
float y = [event deltaY];
|
||||
|
||||
if (x > 0) {
|
||||
x += 0.9f;
|
||||
} else if (x < 0) {
|
||||
x -= 0.9f;
|
||||
}
|
||||
if (y > 0) {
|
||||
y += 0.9f;
|
||||
} else if (y < 0) {
|
||||
y -= 0.9f;
|
||||
}
|
||||
SDL_SendMouseWheel(window, mouse->mouseID, (int)x, (int)y);
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_HandleMouseWarp(CGFloat x, CGFloat y)
|
||||
{
|
||||
/* This makes Cocoa_HandleMouseEvent ignore the delta caused by the warp,
|
||||
* since it gets included in the next movement event.
|
||||
*/
|
||||
SDL_MouseData *driverdata = (SDL_MouseData*)SDL_GetMouse()->driverdata;
|
||||
driverdata->lastWarpX = x;
|
||||
driverdata->lastWarpY = y;
|
||||
driverdata->seenWarp = SDL_TRUE;
|
||||
|
||||
DLog("(%g, %g)", x, y);
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitMouse(_THIS)
|
||||
{
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
if (mouse) {
|
||||
if (mouse->driverdata) {
|
||||
Cocoa_QuitMouseEventTap(((SDL_MouseData*)mouse->driverdata));
|
||||
}
|
||||
|
||||
SDL_free(mouse->driverdata);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
33
Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.h
Normal file
33
Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoamousetap_h
|
||||
#define _SDL_cocoamousetap_h
|
||||
|
||||
#include "SDL_cocoamouse.h"
|
||||
|
||||
extern void Cocoa_InitMouseEventTap(SDL_MouseData *driverdata);
|
||||
extern void Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata);
|
||||
|
||||
#endif /* _SDL_cocoamousetap_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
259
Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.m
Normal file
259
Engine/lib/sdl/src/video/cocoa/SDL_cocoamousetap.m
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoamousetap.h"
|
||||
|
||||
/* Event taps are forbidden in the Mac App Store, so we can only enable this
|
||||
* code if your app doesn't need to ship through the app store.
|
||||
* This code makes it so that a grabbed cursor cannot "leak" a mouse click
|
||||
* past the edge of the window if moving the cursor too fast.
|
||||
*/
|
||||
#if SDL_MAC_NO_SANDBOX
|
||||
|
||||
#include "SDL_keyboard.h"
|
||||
#include "SDL_thread.h"
|
||||
#include "SDL_cocoavideo.h"
|
||||
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
typedef struct {
|
||||
CFMachPortRef tap;
|
||||
CFRunLoopRef runloop;
|
||||
CFRunLoopSourceRef runloopSource;
|
||||
SDL_Thread *thread;
|
||||
SDL_sem *runloopStartedSemaphore;
|
||||
} SDL_MouseEventTapData;
|
||||
|
||||
static const CGEventMask movementEventsMask =
|
||||
CGEventMaskBit(kCGEventLeftMouseDragged)
|
||||
| CGEventMaskBit(kCGEventRightMouseDragged)
|
||||
| CGEventMaskBit(kCGEventMouseMoved);
|
||||
|
||||
static const CGEventMask allGrabbedEventsMask =
|
||||
CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp)
|
||||
| CGEventMaskBit(kCGEventRightMouseDown) | CGEventMaskBit(kCGEventRightMouseUp)
|
||||
| CGEventMaskBit(kCGEventOtherMouseDown) | CGEventMaskBit(kCGEventOtherMouseUp)
|
||||
| CGEventMaskBit(kCGEventLeftMouseDragged) | CGEventMaskBit(kCGEventRightMouseDragged)
|
||||
| CGEventMaskBit(kCGEventMouseMoved);
|
||||
|
||||
static CGEventRef
|
||||
Cocoa_MouseTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
|
||||
{
|
||||
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)refcon;
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
SDL_Window *window = SDL_GetKeyboardFocus();
|
||||
NSWindow *nswindow;
|
||||
NSRect windowRect;
|
||||
CGPoint eventLocation;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case kCGEventTapDisabledByTimeout:
|
||||
case kCGEventTapDisabledByUserInput:
|
||||
{
|
||||
CGEventTapEnable(tapdata->tap, true);
|
||||
return NULL;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (!window || !mouse) {
|
||||
return event;
|
||||
}
|
||||
|
||||
if (mouse->relative_mode) {
|
||||
return event;
|
||||
}
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_INPUT_GRABBED)) {
|
||||
return event;
|
||||
}
|
||||
|
||||
/* This is the same coordinate system as Cocoa uses. */
|
||||
nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
||||
eventLocation = CGEventGetUnflippedLocation(event);
|
||||
windowRect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
||||
|
||||
if (!NSPointInRect(NSPointFromCGPoint(eventLocation), windowRect)) {
|
||||
|
||||
/* This is in CGs global screenspace coordinate system, which has a
|
||||
* flipped Y.
|
||||
*/
|
||||
CGPoint newLocation = CGEventGetLocation(event);
|
||||
|
||||
if (eventLocation.x < NSMinX(windowRect)) {
|
||||
newLocation.x = NSMinX(windowRect);
|
||||
} else if (eventLocation.x >= NSMaxX(windowRect)) {
|
||||
newLocation.x = NSMaxX(windowRect) - 1.0;
|
||||
}
|
||||
|
||||
if (eventLocation.y < NSMinY(windowRect)) {
|
||||
newLocation.y -= (NSMinY(windowRect) - eventLocation.y + 1);
|
||||
} else if (eventLocation.y >= NSMaxY(windowRect)) {
|
||||
newLocation.y += (eventLocation.y - NSMaxY(windowRect) + 1);
|
||||
}
|
||||
|
||||
CGSetLocalEventsSuppressionInterval(0);
|
||||
CGWarpMouseCursorPosition(newLocation);
|
||||
CGSetLocalEventsSuppressionInterval(0.25);
|
||||
|
||||
if ((CGEventMaskBit(type) & movementEventsMask) == 0) {
|
||||
/* For click events, we just constrain the event to the window, so
|
||||
* no other app receives the click event. We can't due the same to
|
||||
* movement events, since they mean that our warp cursor above
|
||||
* behaves strangely.
|
||||
*/
|
||||
CGEventSetLocation(event, newLocation);
|
||||
}
|
||||
}
|
||||
|
||||
return event;
|
||||
}
|
||||
|
||||
static void
|
||||
SemaphorePostCallback(CFRunLoopTimerRef timer, void *info)
|
||||
{
|
||||
SDL_SemPost((SDL_sem*)info);
|
||||
}
|
||||
|
||||
static int
|
||||
Cocoa_MouseTapThread(void *data)
|
||||
{
|
||||
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)data;
|
||||
|
||||
/* Create a tap. */
|
||||
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
|
||||
kCGEventTapOptionDefault, allGrabbedEventsMask,
|
||||
&Cocoa_MouseTapCallback, tapdata);
|
||||
if (eventTap) {
|
||||
/* Try to create a runloop source we can schedule. */
|
||||
CFRunLoopSourceRef runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
|
||||
if (runloopSource) {
|
||||
tapdata->tap = eventTap;
|
||||
tapdata->runloopSource = runloopSource;
|
||||
} else {
|
||||
CFRelease(eventTap);
|
||||
SDL_SemPost(tapdata->runloopStartedSemaphore);
|
||||
/* TODO: Both here and in the return below, set some state in
|
||||
* tapdata to indicate that initialization failed, which we should
|
||||
* check in InitMouseEventTap, after we move the semaphore check
|
||||
* from Quit to Init.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
SDL_SemPost(tapdata->runloopStartedSemaphore);
|
||||
return 1;
|
||||
}
|
||||
|
||||
tapdata->runloop = CFRunLoopGetCurrent();
|
||||
CFRunLoopAddSource(tapdata->runloop, tapdata->runloopSource, kCFRunLoopCommonModes);
|
||||
CFRunLoopTimerContext context = {.info = tapdata->runloopStartedSemaphore};
|
||||
/* We signal the runloop started semaphore *after* the run loop has started, indicating it's safe to CFRunLoopStop it. */
|
||||
CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), 0, 0, 0, &SemaphorePostCallback, &context);
|
||||
CFRunLoopAddTimer(tapdata->runloop, timer, kCFRunLoopCommonModes);
|
||||
CFRelease(timer);
|
||||
|
||||
/* Run the event loop to handle events in the event tap. */
|
||||
CFRunLoopRun();
|
||||
/* Make sure this is signaled so that SDL_QuitMouseEventTap knows it can safely SDL_WaitThread for us. */
|
||||
if (SDL_SemValue(tapdata->runloopStartedSemaphore) < 1) {
|
||||
SDL_SemPost(tapdata->runloopStartedSemaphore);
|
||||
}
|
||||
CFRunLoopRemoveSource(tapdata->runloop, tapdata->runloopSource, kCFRunLoopCommonModes);
|
||||
|
||||
/* Clean up. */
|
||||
CGEventTapEnable(tapdata->tap, false);
|
||||
CFRelease(tapdata->runloopSource);
|
||||
CFRelease(tapdata->tap);
|
||||
tapdata->runloopSource = NULL;
|
||||
tapdata->tap = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_InitMouseEventTap(SDL_MouseData* driverdata)
|
||||
{
|
||||
SDL_MouseEventTapData *tapdata;
|
||||
driverdata->tapdata = SDL_calloc(1, sizeof(SDL_MouseEventTapData));
|
||||
tapdata = (SDL_MouseEventTapData*)driverdata->tapdata;
|
||||
|
||||
tapdata->runloopStartedSemaphore = SDL_CreateSemaphore(0);
|
||||
if (tapdata->runloopStartedSemaphore) {
|
||||
tapdata->thread = SDL_CreateThread(&Cocoa_MouseTapThread, "Event Tap Loop", tapdata);
|
||||
if (!tapdata->thread) {
|
||||
SDL_DestroySemaphore(tapdata->runloopStartedSemaphore);
|
||||
}
|
||||
}
|
||||
|
||||
if (!tapdata->thread) {
|
||||
SDL_free(driverdata->tapdata);
|
||||
driverdata->tapdata = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata)
|
||||
{
|
||||
SDL_MouseEventTapData *tapdata = (SDL_MouseEventTapData*)driverdata->tapdata;
|
||||
int status;
|
||||
|
||||
/* Ensure that the runloop has been started first.
|
||||
* TODO: Move this to InitMouseEventTap, check for error conditions that can
|
||||
* happen in Cocoa_MouseTapThread, and fall back to the non-EventTap way of
|
||||
* grabbing the mouse if it fails to Init.
|
||||
*/
|
||||
status = SDL_SemWaitTimeout(tapdata->runloopStartedSemaphore, 5000);
|
||||
if (status > -1) {
|
||||
/* Then stop it, which will cause Cocoa_MouseTapThread to return. */
|
||||
CFRunLoopStop(tapdata->runloop);
|
||||
/* And then wait for Cocoa_MouseTapThread to finish cleaning up. It
|
||||
* releases some of the pointers in tapdata. */
|
||||
SDL_WaitThread(tapdata->thread, &status);
|
||||
}
|
||||
|
||||
SDL_free(driverdata->tapdata);
|
||||
driverdata->tapdata = NULL;
|
||||
}
|
||||
|
||||
#else /* SDL_MAC_NO_SANDBOX */
|
||||
|
||||
void
|
||||
Cocoa_InitMouseEventTap(SDL_MouseData *unused)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_QuitMouseEventTap(SDL_MouseData *driverdata)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* !SDL_MAC_NO_SANDBOX */
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
68
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.h
Normal file
68
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.h
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoaopengl_h
|
||||
#define _SDL_cocoaopengl_h
|
||||
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
|
||||
#include "SDL_atomic.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
struct SDL_GLDriverData
|
||||
{
|
||||
int initialized;
|
||||
};
|
||||
|
||||
@interface SDLOpenGLContext : NSOpenGLContext {
|
||||
SDL_atomic_t dirty;
|
||||
SDL_Window *window;
|
||||
}
|
||||
|
||||
- (id)initWithFormat:(NSOpenGLPixelFormat *)format
|
||||
shareContext:(NSOpenGLContext *)share;
|
||||
- (void)scheduleUpdate;
|
||||
- (void)updateIfNeeded;
|
||||
- (void)setWindow:(SDL_Window *)window;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
/* OpenGL functions */
|
||||
extern int Cocoa_GL_LoadLibrary(_THIS, const char *path);
|
||||
extern void *Cocoa_GL_GetProcAddress(_THIS, const char *proc);
|
||||
extern void Cocoa_GL_UnloadLibrary(_THIS);
|
||||
extern SDL_GLContext Cocoa_GL_CreateContext(_THIS, SDL_Window * window);
|
||||
extern int Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window,
|
||||
SDL_GLContext context);
|
||||
extern void Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window,
|
||||
int * w, int * h);
|
||||
extern int Cocoa_GL_SetSwapInterval(_THIS, int interval);
|
||||
extern int Cocoa_GL_GetSwapInterval(_THIS);
|
||||
extern void Cocoa_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context);
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_CGL */
|
||||
|
||||
#endif /* _SDL_cocoaopengl_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
440
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.m
Normal file
440
Engine/lib/sdl/src/video/cocoa/SDL_cocoaopengl.m
Normal file
|
|
@ -0,0 +1,440 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
/* NSOpenGL implementation of SDL OpenGL support */
|
||||
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoaopengl.h"
|
||||
|
||||
#include <OpenGL/CGLTypes.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <OpenGL/CGLRenderers.h>
|
||||
|
||||
#include "SDL_loadso.h"
|
||||
#include "SDL_opengl.h"
|
||||
|
||||
#define DEFAULT_OPENGL "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib"
|
||||
|
||||
#ifndef NSOpenGLPFAOpenGLProfile
|
||||
#define NSOpenGLPFAOpenGLProfile 99
|
||||
#endif
|
||||
#ifndef NSOpenGLProfileVersionLegacy
|
||||
#define NSOpenGLProfileVersionLegacy 0x1000
|
||||
#endif
|
||||
#ifndef NSOpenGLProfileVersion3_2Core
|
||||
#define NSOpenGLProfileVersion3_2Core 0x3200
|
||||
#endif
|
||||
|
||||
@implementation SDLOpenGLContext : NSOpenGLContext
|
||||
|
||||
- (id)initWithFormat:(NSOpenGLPixelFormat *)format
|
||||
shareContext:(NSOpenGLContext *)share
|
||||
{
|
||||
self = [super initWithFormat:format shareContext:share];
|
||||
if (self) {
|
||||
SDL_AtomicSet(&self->dirty, 0);
|
||||
self->window = NULL;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)scheduleUpdate
|
||||
{
|
||||
SDL_AtomicAdd(&self->dirty, 1);
|
||||
}
|
||||
|
||||
/* This should only be called on the thread on which a user is using the context. */
|
||||
- (void)updateIfNeeded
|
||||
{
|
||||
int value = SDL_AtomicSet(&self->dirty, 0);
|
||||
if (value > 0) {
|
||||
/* We call the real underlying update here, since -[SDLOpenGLContext update] just calls us. */
|
||||
[super update];
|
||||
}
|
||||
}
|
||||
|
||||
/* This should only be called on the thread on which a user is using the context. */
|
||||
- (void)update
|
||||
{
|
||||
/* This ensures that regular 'update' calls clear the atomic dirty flag. */
|
||||
[self scheduleUpdate];
|
||||
[self updateIfNeeded];
|
||||
}
|
||||
|
||||
/* Updates the drawable for the contexts and manages related state. */
|
||||
- (void)setWindow:(SDL_Window *)newWindow
|
||||
{
|
||||
if (self->window) {
|
||||
SDL_WindowData *oldwindowdata = (SDL_WindowData *)self->window->driverdata;
|
||||
|
||||
/* Make sure to remove us from the old window's context list, or we'll get scheduled updates from it too. */
|
||||
NSMutableArray *contexts = oldwindowdata->nscontexts;
|
||||
@synchronized (contexts) {
|
||||
[contexts removeObject:self];
|
||||
}
|
||||
}
|
||||
|
||||
self->window = newWindow;
|
||||
|
||||
if (newWindow) {
|
||||
SDL_WindowData *windowdata = (SDL_WindowData *)newWindow->driverdata;
|
||||
|
||||
/* Now sign up for scheduled updates for the new window. */
|
||||
NSMutableArray *contexts = windowdata->nscontexts;
|
||||
@synchronized (contexts) {
|
||||
[contexts addObject:self];
|
||||
}
|
||||
|
||||
if ([self view] != [windowdata->nswindow contentView]) {
|
||||
[self setView:[windowdata->nswindow contentView]];
|
||||
if (self == [NSOpenGLContext currentContext]) {
|
||||
[self update];
|
||||
} else {
|
||||
[self scheduleUpdate];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
[self clearDrawable];
|
||||
if (self == [NSOpenGLContext currentContext]) {
|
||||
[self update];
|
||||
} else {
|
||||
[self scheduleUpdate];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
int
|
||||
Cocoa_GL_LoadLibrary(_THIS, const char *path)
|
||||
{
|
||||
/* Load the OpenGL library */
|
||||
if (path == NULL) {
|
||||
path = SDL_getenv("SDL_OPENGL_LIBRARY");
|
||||
}
|
||||
if (path == NULL) {
|
||||
path = DEFAULT_OPENGL;
|
||||
}
|
||||
_this->gl_config.dll_handle = SDL_LoadObject(path);
|
||||
if (!_this->gl_config.dll_handle) {
|
||||
return -1;
|
||||
}
|
||||
SDL_strlcpy(_this->gl_config.driver_path, path,
|
||||
SDL_arraysize(_this->gl_config.driver_path));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *
|
||||
Cocoa_GL_GetProcAddress(_THIS, const char *proc)
|
||||
{
|
||||
return SDL_LoadFunction(_this->gl_config.dll_handle, proc);
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GL_UnloadLibrary(_THIS)
|
||||
{
|
||||
SDL_UnloadObject(_this->gl_config.dll_handle);
|
||||
_this->gl_config.dll_handle = NULL;
|
||||
}
|
||||
|
||||
SDL_GLContext
|
||||
Cocoa_GL_CreateContext(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
NSAutoreleasePool *pool;
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
SDL_DisplayData *displaydata = (SDL_DisplayData *)display->driverdata;
|
||||
NSOpenGLPixelFormatAttribute attr[32];
|
||||
NSOpenGLPixelFormat *fmt;
|
||||
SDLOpenGLContext *context;
|
||||
NSOpenGLContext *share_context = nil;
|
||||
int i = 0;
|
||||
const char *glversion;
|
||||
int glversion_major;
|
||||
int glversion_minor;
|
||||
|
||||
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) {
|
||||
SDL_SetError ("OpenGL ES is not supported on this platform");
|
||||
return NULL;
|
||||
}
|
||||
if ((_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) && (data->osversion < 0x1070)) {
|
||||
SDL_SetError ("OpenGL Core Profile is not supported on this platform version");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
/* specify a profile if we're on Lion (10.7) or later. */
|
||||
if (data->osversion >= 0x1070) {
|
||||
NSOpenGLPixelFormatAttribute profile = NSOpenGLProfileVersionLegacy;
|
||||
if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_CORE) {
|
||||
profile = NSOpenGLProfileVersion3_2Core;
|
||||
}
|
||||
attr[i++] = NSOpenGLPFAOpenGLProfile;
|
||||
attr[i++] = profile;
|
||||
}
|
||||
|
||||
attr[i++] = NSOpenGLPFAColorSize;
|
||||
attr[i++] = SDL_BYTESPERPIXEL(display->current_mode.format)*8;
|
||||
|
||||
attr[i++] = NSOpenGLPFADepthSize;
|
||||
attr[i++] = _this->gl_config.depth_size;
|
||||
|
||||
if (_this->gl_config.double_buffer) {
|
||||
attr[i++] = NSOpenGLPFADoubleBuffer;
|
||||
}
|
||||
|
||||
if (_this->gl_config.stereo) {
|
||||
attr[i++] = NSOpenGLPFAStereo;
|
||||
}
|
||||
|
||||
if (_this->gl_config.stencil_size) {
|
||||
attr[i++] = NSOpenGLPFAStencilSize;
|
||||
attr[i++] = _this->gl_config.stencil_size;
|
||||
}
|
||||
|
||||
if ((_this->gl_config.accum_red_size +
|
||||
_this->gl_config.accum_green_size +
|
||||
_this->gl_config.accum_blue_size +
|
||||
_this->gl_config.accum_alpha_size) > 0) {
|
||||
attr[i++] = NSOpenGLPFAAccumSize;
|
||||
attr[i++] = _this->gl_config.accum_red_size + _this->gl_config.accum_green_size + _this->gl_config.accum_blue_size + _this->gl_config.accum_alpha_size;
|
||||
}
|
||||
|
||||
if (_this->gl_config.multisamplebuffers) {
|
||||
attr[i++] = NSOpenGLPFASampleBuffers;
|
||||
attr[i++] = _this->gl_config.multisamplebuffers;
|
||||
}
|
||||
|
||||
if (_this->gl_config.multisamplesamples) {
|
||||
attr[i++] = NSOpenGLPFASamples;
|
||||
attr[i++] = _this->gl_config.multisamplesamples;
|
||||
attr[i++] = NSOpenGLPFANoRecovery;
|
||||
}
|
||||
|
||||
if (_this->gl_config.accelerated >= 0) {
|
||||
if (_this->gl_config.accelerated) {
|
||||
attr[i++] = NSOpenGLPFAAccelerated;
|
||||
} else {
|
||||
attr[i++] = NSOpenGLPFARendererID;
|
||||
attr[i++] = kCGLRendererGenericFloatID;
|
||||
}
|
||||
}
|
||||
|
||||
attr[i++] = NSOpenGLPFAScreenMask;
|
||||
attr[i++] = CGDisplayIDToOpenGLDisplayMask(displaydata->display);
|
||||
attr[i] = 0;
|
||||
|
||||
fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attr];
|
||||
if (fmt == nil) {
|
||||
SDL_SetError("Failed creating OpenGL pixel format");
|
||||
[pool release];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_this->gl_config.share_with_current_context) {
|
||||
share_context = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
|
||||
}
|
||||
|
||||
context = [[SDLOpenGLContext alloc] initWithFormat:fmt shareContext:share_context];
|
||||
|
||||
[fmt release];
|
||||
|
||||
if (context == nil) {
|
||||
SDL_SetError("Failed creating OpenGL context");
|
||||
[pool release];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
[pool release];
|
||||
|
||||
if ( Cocoa_GL_MakeCurrent(_this, window, context) < 0 ) {
|
||||
Cocoa_GL_DeleteContext(_this, context);
|
||||
SDL_SetError("Failed making OpenGL context current");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_this->gl_config.major_version < 3 &&
|
||||
_this->gl_config.profile_mask == 0 &&
|
||||
_this->gl_config.flags == 0) {
|
||||
/* This is a legacy profile, so to match other backends, we're done. */
|
||||
} else {
|
||||
const GLubyte *(APIENTRY * glGetStringFunc)(GLenum);
|
||||
|
||||
glGetStringFunc = (const GLubyte *(APIENTRY *)(GLenum)) SDL_GL_GetProcAddress("glGetString");
|
||||
if (!glGetStringFunc) {
|
||||
Cocoa_GL_DeleteContext(_this, context);
|
||||
SDL_SetError ("Failed getting OpenGL glGetString entry point");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
glversion = (const char *)glGetStringFunc(GL_VERSION);
|
||||
if (glversion == NULL) {
|
||||
Cocoa_GL_DeleteContext(_this, context);
|
||||
SDL_SetError ("Failed getting OpenGL context version");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (SDL_sscanf(glversion, "%d.%d", &glversion_major, &glversion_minor) != 2) {
|
||||
Cocoa_GL_DeleteContext(_this, context);
|
||||
SDL_SetError ("Failed parsing OpenGL context version");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((glversion_major < _this->gl_config.major_version) ||
|
||||
((glversion_major == _this->gl_config.major_version) && (glversion_minor < _this->gl_config.minor_version))) {
|
||||
Cocoa_GL_DeleteContext(_this, context);
|
||||
SDL_SetError ("Failed creating OpenGL context at version requested");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* In the future we'll want to do this, but to match other platforms
|
||||
we'll leave the OpenGL version the way it is for now
|
||||
*/
|
||||
/*_this->gl_config.major_version = glversion_major;*/
|
||||
/*_this->gl_config.minor_version = glversion_minor;*/
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
if (context) {
|
||||
SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context;
|
||||
[nscontext setWindow:window];
|
||||
[nscontext updateIfNeeded];
|
||||
[nscontext makeCurrentContext];
|
||||
} else {
|
||||
[NSOpenGLContext clearCurrentContext];
|
||||
}
|
||||
|
||||
[pool release];
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GL_GetDrawableSize(_THIS, SDL_Window * window, int * w, int * h)
|
||||
{
|
||||
SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
||||
NSView *contentView = [windata->nswindow contentView];
|
||||
NSRect viewport = [contentView bounds];
|
||||
|
||||
/* This gives us the correct viewport for a Retina-enabled view, only
|
||||
* supported on 10.7+. */
|
||||
if ([contentView respondsToSelector:@selector(convertRectToBacking:)]) {
|
||||
viewport = [contentView convertRectToBacking:viewport];
|
||||
}
|
||||
|
||||
if (w) {
|
||||
*w = viewport.size.width;
|
||||
}
|
||||
|
||||
if (h) {
|
||||
*h = viewport.size.height;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_GL_SetSwapInterval(_THIS, int interval)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
NSOpenGLContext *nscontext;
|
||||
GLint value;
|
||||
int status;
|
||||
|
||||
if (interval < 0) { /* no extension for this on Mac OS X at the moment. */
|
||||
return SDL_SetError("Late swap tearing currently unsupported");
|
||||
}
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
|
||||
if (nscontext != nil) {
|
||||
value = interval;
|
||||
[nscontext setValues:&value forParameter:NSOpenGLCPSwapInterval];
|
||||
status = 0;
|
||||
} else {
|
||||
status = SDL_SetError("No current OpenGL context");
|
||||
}
|
||||
|
||||
[pool release];
|
||||
return status;
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_GL_GetSwapInterval(_THIS)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
NSOpenGLContext *nscontext;
|
||||
GLint value;
|
||||
int status = 0;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
nscontext = (NSOpenGLContext*)SDL_GL_GetCurrentContext();
|
||||
if (nscontext != nil) {
|
||||
[nscontext getValues:&value forParameter:NSOpenGLCPSwapInterval];
|
||||
status = (int)value;
|
||||
}
|
||||
|
||||
[pool release];
|
||||
return status;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GL_SwapWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
SDLOpenGLContext* nscontext = (SDLOpenGLContext*)SDL_GL_GetCurrentContext();
|
||||
[nscontext flushBuffer];
|
||||
[nscontext updateIfNeeded];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_GL_DeleteContext(_THIS, SDL_GLContext context)
|
||||
{
|
||||
NSAutoreleasePool *pool;
|
||||
SDLOpenGLContext *nscontext = (SDLOpenGLContext *)context;
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
[nscontext setWindow:NULL];
|
||||
[nscontext release];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_OPENGL_CGL */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
43
Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.h
Normal file
43
Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.h
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoashape_h
|
||||
#define _SDL_cocoashape_h
|
||||
|
||||
#include "SDL_stdinc.h"
|
||||
#include "SDL_video.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "../SDL_shape_internals.h"
|
||||
|
||||
typedef struct {
|
||||
NSGraphicsContext* context;
|
||||
SDL_bool saved;
|
||||
|
||||
SDL_ShapeTree* shape;
|
||||
} SDL_ShapeData;
|
||||
|
||||
extern SDL_WindowShaper* Cocoa_CreateShaper(SDL_Window* window);
|
||||
extern int Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
|
||||
extern int Cocoa_ResizeWindowShape(SDL_Window *window);
|
||||
|
||||
#endif
|
||||
113
Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.m
Normal file
113
Engine/lib/sdl/src/video/cocoa/SDL_cocoashape.m
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_shape.h"
|
||||
#include "SDL_cocoashape.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
SDL_WindowShaper*
|
||||
Cocoa_CreateShaper(SDL_Window* window) {
|
||||
SDL_WindowData* windata = (SDL_WindowData*)window->driverdata;
|
||||
[windata->nswindow setOpaque:NO];
|
||||
|
||||
if ([windata->nswindow respondsToSelector:@selector(setStyleMask:)]) {
|
||||
[windata->nswindow setStyleMask:NSBorderlessWindowMask];
|
||||
}
|
||||
|
||||
SDL_WindowShaper* result = result = malloc(sizeof(SDL_WindowShaper));
|
||||
result->window = window;
|
||||
result->mode.mode = ShapeModeDefault;
|
||||
result->mode.parameters.binarizationCutoff = 1;
|
||||
result->userx = result->usery = 0;
|
||||
window->shaper = result;
|
||||
|
||||
SDL_ShapeData* data = malloc(sizeof(SDL_ShapeData));
|
||||
result->driverdata = data;
|
||||
data->context = [windata->nswindow graphicsContext];
|
||||
data->saved = SDL_FALSE;
|
||||
data->shape = NULL;
|
||||
|
||||
int resized_properly = Cocoa_ResizeWindowShape(window);
|
||||
SDL_assert(resized_properly == 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
NSView* view;
|
||||
NSBezierPath* path;
|
||||
SDL_Window* window;
|
||||
} SDL_CocoaClosure;
|
||||
|
||||
void
|
||||
ConvertRects(SDL_ShapeTree* tree,void* closure) {
|
||||
SDL_CocoaClosure* data = (SDL_CocoaClosure*)closure;
|
||||
if(tree->kind == OpaqueShape) {
|
||||
NSRect rect = NSMakeRect(tree->data.shape.x,data->window->h - tree->data.shape.y,tree->data.shape.w,tree->data.shape.h);
|
||||
[data->path appendBezierPathWithRect:[data->view convertRect:rect toView:nil]];
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) {
|
||||
SDL_ShapeData* data = (SDL_ShapeData*)shaper->driverdata;
|
||||
SDL_WindowData* windata = (SDL_WindowData*)shaper->window->driverdata;
|
||||
SDL_CocoaClosure closure;
|
||||
NSAutoreleasePool *pool = NULL;
|
||||
if(data->saved == SDL_TRUE) {
|
||||
[data->context restoreGraphicsState];
|
||||
data->saved = SDL_FALSE;
|
||||
}
|
||||
|
||||
/*[data->context saveGraphicsState];*/
|
||||
/*data->saved = SDL_TRUE;*/
|
||||
[NSGraphicsContext setCurrentContext:data->context];
|
||||
|
||||
[[NSColor clearColor] set];
|
||||
NSRectFill([[windata->nswindow contentView] frame]);
|
||||
data->shape = SDL_CalculateShapeTree(*shape_mode,shape);
|
||||
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
closure.view = [windata->nswindow contentView];
|
||||
closure.path = [[NSBezierPath bezierPath] init];
|
||||
closure.window = shaper->window;
|
||||
SDL_TraverseShapeTree(data->shape,&ConvertRects,&closure);
|
||||
[closure.path addClip];
|
||||
[pool release];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
Cocoa_ResizeWindowShape(SDL_Window *window) {
|
||||
SDL_ShapeData* data = window->shaper->driverdata;
|
||||
SDL_assert(data != NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
62
Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.h
Normal file
62
Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.h
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoavideo_h
|
||||
#define _SDL_cocoavideo_h
|
||||
|
||||
#include "SDL_opengl.h"
|
||||
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
#include <Cocoa/Cocoa.h>
|
||||
|
||||
#include "SDL_keycode.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#include "SDL_cocoaclipboard.h"
|
||||
#include "SDL_cocoaevents.h"
|
||||
#include "SDL_cocoakeyboard.h"
|
||||
#include "SDL_cocoamodes.h"
|
||||
#include "SDL_cocoamouse.h"
|
||||
#include "SDL_cocoaopengl.h"
|
||||
#include "SDL_cocoawindow.h"
|
||||
|
||||
/* Private display data */
|
||||
|
||||
@class SDLTranslatorResponder;
|
||||
|
||||
typedef struct SDL_VideoData
|
||||
{
|
||||
SInt32 osversion;
|
||||
int allow_spaces;
|
||||
unsigned int modifierFlags;
|
||||
void *key_layout;
|
||||
SDLTranslatorResponder *fieldEdit;
|
||||
NSInteger clipboard_count;
|
||||
Uint32 screensaver_activity;
|
||||
} SDL_VideoData;
|
||||
|
||||
/* Utility functions */
|
||||
extern NSImage * Cocoa_CreateImage(SDL_Surface * surface);
|
||||
|
||||
#endif /* _SDL_cocoavideo_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
242
Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.m
Normal file
242
Engine/lib/sdl/src/video/cocoa/SDL_cocoavideo.m
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_COCOA
|
||||
|
||||
#if defined(__APPLE__) && defined(__POWERPC__) && !defined(__APPLE_ALTIVEC__)
|
||||
#include <altivec.h>
|
||||
#undef bool
|
||||
#undef vector
|
||||
#undef pixel
|
||||
#endif
|
||||
|
||||
#include "SDL.h"
|
||||
#include "SDL_endian.h"
|
||||
#include "SDL_cocoavideo.h"
|
||||
#include "SDL_cocoashape.h"
|
||||
#include "SDL_assert.h"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int Cocoa_VideoInit(_THIS);
|
||||
static void Cocoa_VideoQuit(_THIS);
|
||||
|
||||
/* Cocoa driver bootstrap functions */
|
||||
|
||||
static int
|
||||
Cocoa_Available(void)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
static void
|
||||
Cocoa_DeleteDevice(SDL_VideoDevice * device)
|
||||
{
|
||||
SDL_free(device->driverdata);
|
||||
SDL_free(device);
|
||||
}
|
||||
|
||||
static SDL_VideoDevice *
|
||||
Cocoa_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_VideoDevice *device;
|
||||
SDL_VideoData *data;
|
||||
|
||||
Cocoa_RegisterApp();
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
|
||||
if (device) {
|
||||
data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData));
|
||||
} else {
|
||||
data = NULL;
|
||||
}
|
||||
if (!data) {
|
||||
SDL_OutOfMemory();
|
||||
SDL_free(device);
|
||||
return NULL;
|
||||
}
|
||||
device->driverdata = data;
|
||||
|
||||
/* Find out what version of Mac OS X we're running */
|
||||
Gestalt(gestaltSystemVersion, &data->osversion);
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = Cocoa_VideoInit;
|
||||
device->VideoQuit = Cocoa_VideoQuit;
|
||||
device->GetDisplayBounds = Cocoa_GetDisplayBounds;
|
||||
device->GetDisplayModes = Cocoa_GetDisplayModes;
|
||||
device->SetDisplayMode = Cocoa_SetDisplayMode;
|
||||
device->PumpEvents = Cocoa_PumpEvents;
|
||||
|
||||
device->CreateWindow = Cocoa_CreateWindow;
|
||||
device->CreateWindowFrom = Cocoa_CreateWindowFrom;
|
||||
device->SetWindowTitle = Cocoa_SetWindowTitle;
|
||||
device->SetWindowIcon = Cocoa_SetWindowIcon;
|
||||
device->SetWindowPosition = Cocoa_SetWindowPosition;
|
||||
device->SetWindowSize = Cocoa_SetWindowSize;
|
||||
device->SetWindowMinimumSize = Cocoa_SetWindowMinimumSize;
|
||||
device->SetWindowMaximumSize = Cocoa_SetWindowMaximumSize;
|
||||
device->ShowWindow = Cocoa_ShowWindow;
|
||||
device->HideWindow = Cocoa_HideWindow;
|
||||
device->RaiseWindow = Cocoa_RaiseWindow;
|
||||
device->MaximizeWindow = Cocoa_MaximizeWindow;
|
||||
device->MinimizeWindow = Cocoa_MinimizeWindow;
|
||||
device->RestoreWindow = Cocoa_RestoreWindow;
|
||||
device->SetWindowBordered = Cocoa_SetWindowBordered;
|
||||
device->SetWindowFullscreen = Cocoa_SetWindowFullscreen;
|
||||
device->SetWindowGammaRamp = Cocoa_SetWindowGammaRamp;
|
||||
device->GetWindowGammaRamp = Cocoa_GetWindowGammaRamp;
|
||||
device->SetWindowGrab = Cocoa_SetWindowGrab;
|
||||
device->DestroyWindow = Cocoa_DestroyWindow;
|
||||
device->GetWindowWMInfo = Cocoa_GetWindowWMInfo;
|
||||
|
||||
device->shape_driver.CreateShaper = Cocoa_CreateShaper;
|
||||
device->shape_driver.SetWindowShape = Cocoa_SetWindowShape;
|
||||
device->shape_driver.ResizeWindowShape = Cocoa_ResizeWindowShape;
|
||||
|
||||
#if SDL_VIDEO_OPENGL_CGL
|
||||
device->GL_LoadLibrary = Cocoa_GL_LoadLibrary;
|
||||
device->GL_GetProcAddress = Cocoa_GL_GetProcAddress;
|
||||
device->GL_UnloadLibrary = Cocoa_GL_UnloadLibrary;
|
||||
device->GL_CreateContext = Cocoa_GL_CreateContext;
|
||||
device->GL_MakeCurrent = Cocoa_GL_MakeCurrent;
|
||||
device->GL_GetDrawableSize = Cocoa_GL_GetDrawableSize;
|
||||
device->GL_SetSwapInterval = Cocoa_GL_SetSwapInterval;
|
||||
device->GL_GetSwapInterval = Cocoa_GL_GetSwapInterval;
|
||||
device->GL_SwapWindow = Cocoa_GL_SwapWindow;
|
||||
device->GL_DeleteContext = Cocoa_GL_DeleteContext;
|
||||
#endif
|
||||
|
||||
device->StartTextInput = Cocoa_StartTextInput;
|
||||
device->StopTextInput = Cocoa_StopTextInput;
|
||||
device->SetTextInputRect = Cocoa_SetTextInputRect;
|
||||
|
||||
device->SetClipboardText = Cocoa_SetClipboardText;
|
||||
device->GetClipboardText = Cocoa_GetClipboardText;
|
||||
device->HasClipboardText = Cocoa_HasClipboardText;
|
||||
|
||||
device->free = Cocoa_DeleteDevice;
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
VideoBootStrap COCOA_bootstrap = {
|
||||
"cocoa", "SDL Cocoa video driver",
|
||||
Cocoa_Available, Cocoa_CreateDevice
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
Cocoa_VideoInit(_THIS)
|
||||
{
|
||||
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
|
||||
|
||||
Cocoa_InitModes(_this);
|
||||
Cocoa_InitKeyboard(_this);
|
||||
Cocoa_InitMouse(_this);
|
||||
|
||||
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
|
||||
data->allow_spaces = ( (data->osversion >= 0x1070) && (!hint || (*hint != '0')) );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
Cocoa_VideoQuit(_THIS)
|
||||
{
|
||||
Cocoa_QuitModes(_this);
|
||||
Cocoa_QuitKeyboard(_this);
|
||||
Cocoa_QuitMouse(_this);
|
||||
}
|
||||
|
||||
/* This function assumes that it's called from within an autorelease pool */
|
||||
NSImage *
|
||||
Cocoa_CreateImage(SDL_Surface * surface)
|
||||
{
|
||||
SDL_Surface *converted;
|
||||
NSBitmapImageRep *imgrep;
|
||||
Uint8 *pixels;
|
||||
int i;
|
||||
NSImage *img;
|
||||
|
||||
converted = SDL_ConvertSurfaceFormat(surface,
|
||||
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||
SDL_PIXELFORMAT_RGBA8888,
|
||||
#else
|
||||
SDL_PIXELFORMAT_ABGR8888,
|
||||
#endif
|
||||
0);
|
||||
if (!converted) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
imgrep = [[[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL
|
||||
pixelsWide: converted->w
|
||||
pixelsHigh: converted->h
|
||||
bitsPerSample: 8
|
||||
samplesPerPixel: 4
|
||||
hasAlpha: YES
|
||||
isPlanar: NO
|
||||
colorSpaceName: NSDeviceRGBColorSpace
|
||||
bytesPerRow: converted->pitch
|
||||
bitsPerPixel: converted->format->BitsPerPixel] autorelease];
|
||||
if (imgrep == nil) {
|
||||
SDL_FreeSurface(converted);
|
||||
return nil;
|
||||
}
|
||||
|
||||
/* Copy the pixels */
|
||||
pixels = [imgrep bitmapData];
|
||||
SDL_memcpy(pixels, converted->pixels, converted->h * converted->pitch);
|
||||
SDL_FreeSurface(converted);
|
||||
|
||||
/* Premultiply the alpha channel */
|
||||
for (i = (surface->h * surface->w); i--; ) {
|
||||
Uint8 alpha = pixels[3];
|
||||
pixels[0] = (Uint8)(((Uint16)pixels[0] * alpha) / 255);
|
||||
pixels[1] = (Uint8)(((Uint16)pixels[1] * alpha) / 255);
|
||||
pixels[2] = (Uint8)(((Uint16)pixels[2] * alpha) / 255);
|
||||
pixels += 4;
|
||||
}
|
||||
|
||||
img = [[[NSImage alloc] initWithSize: NSMakeSize(surface->w, surface->h)] autorelease];
|
||||
if (img != nil) {
|
||||
[img addRepresentation: imgrep];
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mac OS X log support.
|
||||
*
|
||||
* This doesn't really have aything to do with the interfaces of the SDL video
|
||||
* subsystem, but we need to stuff this into an Objective-C source code file.
|
||||
*/
|
||||
|
||||
void SDL_NSLog(const char *text)
|
||||
{
|
||||
NSLog(@"%s", text);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
||||
|
||||
/* vim: set ts=4 sw=4 expandtab: */
|
||||
146
Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.h
Normal file
146
Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.h
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_cocoawindow_h
|
||||
#define _SDL_cocoawindow_h
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
typedef struct SDL_WindowData SDL_WindowData;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PENDING_OPERATION_NONE,
|
||||
PENDING_OPERATION_ENTER_FULLSCREEN,
|
||||
PENDING_OPERATION_LEAVE_FULLSCREEN,
|
||||
PENDING_OPERATION_MINIMIZE
|
||||
} PendingWindowOperation;
|
||||
|
||||
@interface Cocoa_WindowListener : NSResponder <NSWindowDelegate> {
|
||||
SDL_WindowData *_data;
|
||||
BOOL observingVisible;
|
||||
BOOL wasCtrlLeft;
|
||||
BOOL wasVisible;
|
||||
BOOL isFullscreenSpace;
|
||||
BOOL inFullscreenTransition;
|
||||
PendingWindowOperation pendingWindowOperation;
|
||||
BOOL isMoving;
|
||||
int pendingWindowWarpX, pendingWindowWarpY;
|
||||
}
|
||||
|
||||
-(void) listen:(SDL_WindowData *) data;
|
||||
-(void) pauseVisibleObservation;
|
||||
-(void) resumeVisibleObservation;
|
||||
-(BOOL) setFullscreenSpace:(BOOL) state;
|
||||
-(BOOL) isInFullscreenSpace;
|
||||
-(BOOL) isInFullscreenSpaceTransition;
|
||||
-(void) addPendingWindowOperation:(PendingWindowOperation) operation;
|
||||
-(void) close;
|
||||
|
||||
-(BOOL) isMoving;
|
||||
-(void) setPendingMoveX:(int)x Y:(int)y;
|
||||
-(void) windowDidFinishMoving;
|
||||
|
||||
/* Window delegate functionality */
|
||||
-(BOOL) windowShouldClose:(id) sender;
|
||||
-(void) windowDidExpose:(NSNotification *) aNotification;
|
||||
-(void) windowDidMove:(NSNotification *) aNotification;
|
||||
-(void) windowDidResize:(NSNotification *) aNotification;
|
||||
-(void) windowDidMiniaturize:(NSNotification *) aNotification;
|
||||
-(void) windowDidDeminiaturize:(NSNotification *) aNotification;
|
||||
-(void) windowDidBecomeKey:(NSNotification *) aNotification;
|
||||
-(void) windowDidResignKey:(NSNotification *) aNotification;
|
||||
-(void) windowWillEnterFullScreen:(NSNotification *) aNotification;
|
||||
-(void) windowDidEnterFullScreen:(NSNotification *) aNotification;
|
||||
-(void) windowWillExitFullScreen:(NSNotification *) aNotification;
|
||||
-(void) windowDidExitFullScreen:(NSNotification *) aNotification;
|
||||
-(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions;
|
||||
|
||||
/* Window event handling */
|
||||
-(void) mouseDown:(NSEvent *) theEvent;
|
||||
-(void) rightMouseDown:(NSEvent *) theEvent;
|
||||
-(void) otherMouseDown:(NSEvent *) theEvent;
|
||||
-(void) mouseUp:(NSEvent *) theEvent;
|
||||
-(void) rightMouseUp:(NSEvent *) theEvent;
|
||||
-(void) otherMouseUp:(NSEvent *) theEvent;
|
||||
-(void) mouseMoved:(NSEvent *) theEvent;
|
||||
-(void) mouseDragged:(NSEvent *) theEvent;
|
||||
-(void) rightMouseDragged:(NSEvent *) theEvent;
|
||||
-(void) otherMouseDragged:(NSEvent *) theEvent;
|
||||
-(void) scrollWheel:(NSEvent *) theEvent;
|
||||
-(void) touchesBeganWithEvent:(NSEvent *) theEvent;
|
||||
-(void) touchesMovedWithEvent:(NSEvent *) theEvent;
|
||||
-(void) touchesEndedWithEvent:(NSEvent *) theEvent;
|
||||
-(void) touchesCancelledWithEvent:(NSEvent *) theEvent;
|
||||
|
||||
/* Touch event handling */
|
||||
typedef enum {
|
||||
COCOA_TOUCH_DOWN,
|
||||
COCOA_TOUCH_UP,
|
||||
COCOA_TOUCH_MOVE,
|
||||
COCOA_TOUCH_CANCELLED
|
||||
} cocoaTouchType;
|
||||
-(void) handleTouches:(cocoaTouchType)type withEvent:(NSEvent*) event;
|
||||
|
||||
@end
|
||||
/* *INDENT-ON* */
|
||||
|
||||
@class SDLOpenGLContext;
|
||||
|
||||
struct SDL_WindowData
|
||||
{
|
||||
SDL_Window *window;
|
||||
NSWindow *nswindow;
|
||||
NSMutableArray *nscontexts;
|
||||
SDL_bool created;
|
||||
SDL_bool inWindowMove;
|
||||
Cocoa_WindowListener *listener;
|
||||
struct SDL_VideoData *videodata;
|
||||
};
|
||||
|
||||
extern int Cocoa_CreateWindow(_THIS, SDL_Window * window);
|
||||
extern int Cocoa_CreateWindowFrom(_THIS, SDL_Window * window,
|
||||
const void *data);
|
||||
extern void Cocoa_SetWindowTitle(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon);
|
||||
extern void Cocoa_SetWindowPosition(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_SetWindowSize(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_SetWindowMaximumSize(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_ShowWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_HideWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_RaiseWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_MaximizeWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_MinimizeWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_RestoreWindow(_THIS, SDL_Window * window);
|
||||
extern void Cocoa_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered);
|
||||
extern void Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
|
||||
extern int Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp);
|
||||
extern int Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp);
|
||||
extern void Cocoa_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||
extern void Cocoa_DestroyWindow(_THIS, SDL_Window * window);
|
||||
extern SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||
struct SDL_SysWMinfo *info);
|
||||
|
||||
#endif /* _SDL_cocoawindow_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1550
Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.m
Normal file
1550
Engine/lib/sdl/src/video/cocoa/SDL_cocoawindow.m
Normal file
File diff suppressed because it is too large
Load diff
413
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.c
Normal file
413
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.c
Normal file
|
|
@ -0,0 +1,413 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
|
||||
#include "../../events/SDL_windowevents_c.h"
|
||||
|
||||
#define COLOR_EXPAND(col) col.r, col.g, col.b, col.a
|
||||
|
||||
static DFB_Theme theme_std = {
|
||||
4, 4, 8, 8,
|
||||
{255, 200, 200, 200},
|
||||
24,
|
||||
{255, 0, 0, 255},
|
||||
16,
|
||||
{255, 255, 255, 255},
|
||||
"/usr/share/fonts/truetype/freefont/FreeSans.ttf",
|
||||
{255, 255, 0, 0},
|
||||
{255, 255, 255, 0},
|
||||
};
|
||||
|
||||
static DFB_Theme theme_none = {
|
||||
0, 0, 0, 0,
|
||||
{0, 0, 0, 0},
|
||||
0,
|
||||
{0, 0, 0, 0},
|
||||
0,
|
||||
{0, 0, 0, 0},
|
||||
NULL
|
||||
};
|
||||
|
||||
static void
|
||||
DrawTriangle(IDirectFBSurface * s, int down, int x, int y, int w)
|
||||
{
|
||||
int x1, x2, x3;
|
||||
int y1, y2, y3;
|
||||
|
||||
if (down) {
|
||||
x1 = x + w / 2;
|
||||
x2 = x;
|
||||
x3 = x + w;
|
||||
y1 = y + w;
|
||||
y2 = y;
|
||||
y3 = y;
|
||||
} else {
|
||||
x1 = x + w / 2;
|
||||
x2 = x;
|
||||
x3 = x + w;
|
||||
y1 = y;
|
||||
y2 = y + w;
|
||||
y3 = y + w;
|
||||
}
|
||||
s->FillTriangle(s, x1, y1, x2, y2, x3, y3);
|
||||
}
|
||||
|
||||
static void
|
||||
LoadFont(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
if (windata->font != NULL) {
|
||||
SDL_DFB_RELEASE(windata->font);
|
||||
windata->font = NULL;
|
||||
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
|
||||
}
|
||||
|
||||
if (windata->theme.font != NULL)
|
||||
{
|
||||
DFBFontDescription fdesc;
|
||||
|
||||
SDL_zero(fdesc);
|
||||
fdesc.flags = DFDESC_HEIGHT;
|
||||
fdesc.height = windata->theme.font_size;
|
||||
SDL_DFB_CHECK(devdata->
|
||||
dfb->CreateFont(devdata->dfb, windata->theme.font,
|
||||
&fdesc, &windata->font));
|
||||
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
DrawCraption(_THIS, IDirectFBSurface * s, int x, int y, char *text)
|
||||
{
|
||||
DFBSurfaceTextFlags flags;
|
||||
|
||||
flags = DSTF_CENTER | DSTF_TOP;
|
||||
|
||||
s->DrawString(s, text, -1, x, y, flags);
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
IDirectFBSurface *s = windata->window_surface;
|
||||
DFB_Theme *t = &windata->theme;
|
||||
int i;
|
||||
int d = (t->caption_size - t->font_size) / 2;
|
||||
int x, y, w;
|
||||
|
||||
|
||||
if (!windata->is_managed || (window->flags & SDL_WINDOW_FULLSCREEN))
|
||||
return;
|
||||
|
||||
SDL_DFB_CHECK(s->SetSrcBlendFunction(s, DSBF_ONE));
|
||||
SDL_DFB_CHECK(s->SetDstBlendFunction(s, DSBF_ZERO));
|
||||
SDL_DFB_CHECK(s->SetDrawingFlags(s, DSDRAW_NOFX));
|
||||
SDL_DFB_CHECK(s->SetBlittingFlags(s, DSBLIT_NOFX));
|
||||
|
||||
LoadFont(_this, window);
|
||||
/* s->SetDrawingFlags(s, DSDRAW_BLEND); */
|
||||
s->SetColor(s, COLOR_EXPAND(t->frame_color));
|
||||
/* top */
|
||||
for (i = 0; i < t->top_size; i++)
|
||||
s->DrawLine(s, 0, i, windata->size.w, i);
|
||||
/* bottom */
|
||||
for (i = windata->size.h - t->bottom_size; i < windata->size.h; i++)
|
||||
s->DrawLine(s, 0, i, windata->size.w, i);
|
||||
/* left */
|
||||
for (i = 0; i < t->left_size; i++)
|
||||
s->DrawLine(s, i, 0, i, windata->size.h);
|
||||
/* right */
|
||||
for (i = windata->size.w - t->right_size; i < windata->size.w; i++)
|
||||
s->DrawLine(s, i, 0, i, windata->size.h);
|
||||
/* Caption */
|
||||
s->SetColor(s, COLOR_EXPAND(t->caption_color));
|
||||
s->FillRectangle(s, t->left_size, t->top_size, windata->client.w,
|
||||
t->caption_size);
|
||||
/* Close Button */
|
||||
w = t->caption_size;
|
||||
x = windata->size.w - t->right_size - w + d;
|
||||
y = t->top_size + d;
|
||||
s->SetColor(s, COLOR_EXPAND(t->close_color));
|
||||
DrawTriangle(s, 1, x, y, w - 2 * d);
|
||||
/* Max Button */
|
||||
s->SetColor(s, COLOR_EXPAND(t->max_color));
|
||||
DrawTriangle(s, window->flags & SDL_WINDOW_MAXIMIZED ? 1 : 0, x - w,
|
||||
y, w - 2 * d);
|
||||
|
||||
/* Caption */
|
||||
if (window->title) {
|
||||
s->SetColor(s, COLOR_EXPAND(t->font_color));
|
||||
DrawCraption(_this, s, (x - w) / 2, t->top_size + d, window->title);
|
||||
}
|
||||
/* Icon */
|
||||
if (windata->icon) {
|
||||
DFBRectangle dr;
|
||||
|
||||
dr.x = t->left_size + d;
|
||||
dr.y = t->top_size + d;
|
||||
dr.w = w - 2 * d;
|
||||
dr.h = w - 2 * d;
|
||||
s->SetBlittingFlags(s, DSBLIT_BLEND_ALPHACHANNEL);
|
||||
|
||||
s->StretchBlit(s, windata->icon, NULL, &dr);
|
||||
}
|
||||
windata->wm_needs_redraw = 0;
|
||||
}
|
||||
|
||||
DFBResult
|
||||
DirectFB_WM_GetClientSize(_THIS, SDL_Window * window, int *cw, int *ch)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
IDirectFBWindow *dfbwin = windata->dfbwin;
|
||||
|
||||
SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, cw, ch));
|
||||
dfbwin->GetSize(dfbwin, cw, ch);
|
||||
*cw -= windata->theme.left_size + windata->theme.right_size;
|
||||
*ch -=
|
||||
windata->theme.top_size + windata->theme.caption_size +
|
||||
windata->theme.bottom_size;
|
||||
return DFB_OK;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
if (!windata->is_managed)
|
||||
windata->theme = theme_none;
|
||||
else if (flags & SDL_WINDOW_BORDERLESS)
|
||||
/* desc.caps |= DWCAPS_NODECORATION;) */
|
||||
windata->theme = theme_none;
|
||||
else if (flags & SDL_WINDOW_FULLSCREEN) {
|
||||
windata->theme = theme_none;
|
||||
} else if (flags & SDL_WINDOW_MAXIMIZED) {
|
||||
windata->theme = theme_std;
|
||||
windata->theme.left_size = 0;
|
||||
windata->theme.right_size = 0;
|
||||
windata->theme.top_size = 0;
|
||||
windata->theme.bottom_size = 0;
|
||||
} else {
|
||||
windata->theme = theme_std;
|
||||
}
|
||||
|
||||
windata->client.x = windata->theme.left_size;
|
||||
windata->client.y = windata->theme.top_size + windata->theme.caption_size;
|
||||
windata->client.w = w;
|
||||
windata->client.h = h;
|
||||
windata->size.w =
|
||||
w + windata->theme.left_size + windata->theme.right_size;
|
||||
windata->size.h =
|
||||
h + windata->theme.top_size +
|
||||
windata->theme.caption_size + windata->theme.bottom_size;
|
||||
}
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
WM_POS_NONE = 0x00,
|
||||
WM_POS_CAPTION = 0x01,
|
||||
WM_POS_CLOSE = 0x02,
|
||||
WM_POS_MAX = 0x04,
|
||||
WM_POS_LEFT = 0x08,
|
||||
WM_POS_RIGHT = 0x10,
|
||||
WM_POS_TOP = 0x20,
|
||||
WM_POS_BOTTOM = 0x40,
|
||||
};
|
||||
|
||||
static int
|
||||
WMIsClient(DFB_WindowData * p, int x, int y)
|
||||
{
|
||||
x -= p->client.x;
|
||||
y -= p->client.y;
|
||||
if (x < 0 || y < 0)
|
||||
return 0;
|
||||
if (x >= p->client.w || y >= p->client.h)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
WMPos(DFB_WindowData * p, int x, int y)
|
||||
{
|
||||
int pos = WM_POS_NONE;
|
||||
|
||||
if (!WMIsClient(p, x, y)) {
|
||||
if (y < p->theme.top_size) {
|
||||
pos |= WM_POS_TOP;
|
||||
} else if (y < p->client.y) {
|
||||
if (x <
|
||||
p->size.w - p->theme.right_size - 2 * p->theme.caption_size) {
|
||||
pos |= WM_POS_CAPTION;
|
||||
} else if (x <
|
||||
p->size.w - p->theme.right_size -
|
||||
p->theme.caption_size) {
|
||||
pos |= WM_POS_MAX;
|
||||
} else {
|
||||
pos |= WM_POS_CLOSE;
|
||||
}
|
||||
} else if (y >= p->size.h - p->theme.bottom_size) {
|
||||
pos |= WM_POS_BOTTOM;
|
||||
}
|
||||
if (x < p->theme.left_size) {
|
||||
pos |= WM_POS_LEFT;
|
||||
} else if (x >= p->size.w - p->theme.right_size) {
|
||||
pos |= WM_POS_RIGHT;
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
|
||||
IDirectFBWindow *dfbwin = windata->dfbwin;
|
||||
DFBWindowOptions wopts;
|
||||
|
||||
if (!windata->is_managed)
|
||||
return 0;
|
||||
|
||||
SDL_DFB_CHECK(dfbwin->GetOptions(dfbwin, &wopts));
|
||||
|
||||
switch (evt->type) {
|
||||
case DWET_BUTTONDOWN:
|
||||
if (evt->buttons & DIBM_LEFT) {
|
||||
int pos = WMPos(windata, evt->x, evt->y);
|
||||
switch (pos) {
|
||||
case WM_POS_NONE:
|
||||
return 0;
|
||||
case WM_POS_CLOSE:
|
||||
windata->wm_grab = WM_POS_NONE;
|
||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_CLOSE, 0,
|
||||
0);
|
||||
return 1;
|
||||
case WM_POS_MAX:
|
||||
windata->wm_grab = WM_POS_NONE;
|
||||
if (window->flags & SDL_WINDOW_MAXIMIZED) {
|
||||
SDL_RestoreWindow(window);
|
||||
} else {
|
||||
SDL_MaximizeWindow(window);
|
||||
}
|
||||
return 1;
|
||||
case WM_POS_CAPTION:
|
||||
if (!(wopts & DWOP_KEEP_STACKING)) {
|
||||
DirectFB_RaiseWindow(_this, window);
|
||||
}
|
||||
if (window->flags & SDL_WINDOW_MAXIMIZED)
|
||||
return 1;
|
||||
/* fall through */
|
||||
default:
|
||||
windata->wm_grab = pos;
|
||||
if (gwindata != NULL)
|
||||
SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
|
||||
SDL_DFB_CHECK(dfbwin->GrabPointer(dfbwin));
|
||||
windata->wm_lastx = evt->cx;
|
||||
windata->wm_lasty = evt->cy;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
case DWET_BUTTONUP:
|
||||
if (!windata->wm_grab)
|
||||
return 0;
|
||||
if (!(evt->buttons & DIBM_LEFT)) {
|
||||
if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) {
|
||||
int dx = evt->cx - windata->wm_lastx;
|
||||
int dy = evt->cy - windata->wm_lasty;
|
||||
|
||||
if (!(wopts & DWOP_KEEP_SIZE)) {
|
||||
int cw, ch;
|
||||
if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM)
|
||||
dx = 0;
|
||||
else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT)
|
||||
dy = 0;
|
||||
SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, &cw, &ch));
|
||||
|
||||
/* necessary to trigger an event - ugly */
|
||||
SDL_DFB_CHECK(dfbwin->DisableEvents(dfbwin, DWET_ALL));
|
||||
SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx + 1, ch + dy));
|
||||
SDL_DFB_CHECK(dfbwin->EnableEvents(dfbwin, DWET_ALL));
|
||||
|
||||
SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx, ch + dy));
|
||||
}
|
||||
}
|
||||
SDL_DFB_CHECK(dfbwin->UngrabPointer(dfbwin));
|
||||
if (gwindata != NULL)
|
||||
SDL_DFB_CHECK(gwindata->dfbwin->GrabPointer(gwindata->dfbwin));
|
||||
windata->wm_grab = WM_POS_NONE;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case DWET_MOTION:
|
||||
if (!windata->wm_grab)
|
||||
return 0;
|
||||
if (evt->buttons & DIBM_LEFT) {
|
||||
int dx = evt->cx - windata->wm_lastx;
|
||||
int dy = evt->cy - windata->wm_lasty;
|
||||
|
||||
if (windata->wm_grab & WM_POS_CAPTION) {
|
||||
if (!(wopts & DWOP_KEEP_POSITION))
|
||||
SDL_DFB_CHECK(dfbwin->Move(dfbwin, dx, dy));
|
||||
}
|
||||
if (windata->wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) {
|
||||
if (!(wopts & DWOP_KEEP_SIZE)) {
|
||||
int cw, ch;
|
||||
|
||||
/* Make sure all events are disabled for this operation ! */
|
||||
SDL_DFB_CHECK(dfbwin->DisableEvents(dfbwin, DWET_ALL));
|
||||
|
||||
if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM)
|
||||
dx = 0;
|
||||
else if ((windata->wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT)
|
||||
dy = 0;
|
||||
|
||||
SDL_DFB_CHECK(dfbwin->GetSize(dfbwin, &cw, &ch));
|
||||
SDL_DFB_CHECK(dfbwin->Resize(dfbwin, cw + dx, ch + dy));
|
||||
|
||||
SDL_DFB_CHECK(dfbwin->EnableEvents(dfbwin, DWET_ALL));
|
||||
}
|
||||
}
|
||||
windata->wm_lastx = evt->cx;
|
||||
windata->wm_lasty = evt->cy;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case DWET_KEYDOWN:
|
||||
break;
|
||||
case DWET_KEYUP:
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
56
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.h
Normal file
56
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_WM.h
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_directfb_wm_h
|
||||
#define _SDL_directfb_wm_h
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
typedef struct _DFB_Theme DFB_Theme;
|
||||
struct _DFB_Theme
|
||||
{
|
||||
int left_size;
|
||||
int right_size;
|
||||
int top_size;
|
||||
int bottom_size;
|
||||
DFBColor frame_color;
|
||||
int caption_size;
|
||||
DFBColor caption_color;
|
||||
int font_size;
|
||||
DFBColor font_color;
|
||||
char *font;
|
||||
DFBColor close_color;
|
||||
DFBColor max_color;
|
||||
};
|
||||
|
||||
extern void DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h);
|
||||
extern void DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window);
|
||||
|
||||
extern int DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window,
|
||||
DFBWindowEvent * evt);
|
||||
|
||||
extern DFBResult DirectFB_WM_GetClientSize(_THIS, SDL_Window * window,
|
||||
int *cw, int *ch);
|
||||
|
||||
|
||||
#endif /* _SDL_directfb_wm_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
117
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.c
Normal file
117
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.c
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_dyn.h"
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC
|
||||
#include "SDL_name.h"
|
||||
#include "SDL_loadso.h"
|
||||
|
||||
#define DFB_SYM(ret, name, args, al, func) ret (*name) args;
|
||||
static struct _SDL_DirectFB_Symbols
|
||||
{
|
||||
DFB_SYMS
|
||||
const unsigned int *directfb_major_version;
|
||||
const unsigned int *directfb_minor_version;
|
||||
const unsigned int *directfb_micro_version;
|
||||
} SDL_DirectFB_Symbols;
|
||||
#undef DFB_SYM
|
||||
|
||||
#define DFB_SYM(ret, name, args, al, func) ret name args { func SDL_DirectFB_Symbols.name al ; }
|
||||
DFB_SYMS
|
||||
#undef DFB_SYM
|
||||
|
||||
static void *handle = NULL;
|
||||
|
||||
int
|
||||
SDL_DirectFB_LoadLibrary(void)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (handle == NULL) {
|
||||
handle = SDL_LoadObject(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC);
|
||||
if (handle != NULL) {
|
||||
retval = 1;
|
||||
#define DFB_SYM(ret, name, args, al, func) if (!(SDL_DirectFB_Symbols.name = SDL_LoadFunction(handle, # name))) retval = 0;
|
||||
DFB_SYMS
|
||||
#undef DFB_SYM
|
||||
if (!
|
||||
(SDL_DirectFB_Symbols.directfb_major_version =
|
||||
SDL_LoadFunction(handle, "directfb_major_version")))
|
||||
retval = 0;
|
||||
if (!
|
||||
(SDL_DirectFB_Symbols.directfb_minor_version =
|
||||
SDL_LoadFunction(handle, "directfb_minor_version")))
|
||||
retval = 0;
|
||||
if (!
|
||||
(SDL_DirectFB_Symbols.directfb_micro_version =
|
||||
SDL_LoadFunction(handle, "directfb_micro_version")))
|
||||
retval = 0;
|
||||
}
|
||||
}
|
||||
if (retval) {
|
||||
const char *stemp = DirectFBCheckVersion(DIRECTFB_MAJOR_VERSION,
|
||||
DIRECTFB_MINOR_VERSION,
|
||||
DIRECTFB_MICRO_VERSION);
|
||||
/* Version Check */
|
||||
if (stemp != NULL) {
|
||||
fprintf(stderr,
|
||||
"DirectFB Lib: Version mismatch. Compiled: %d.%d.%d Library %d.%d.%d\n",
|
||||
DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION,
|
||||
DIRECTFB_MICRO_VERSION,
|
||||
*SDL_DirectFB_Symbols.directfb_major_version,
|
||||
*SDL_DirectFB_Symbols.directfb_minor_version,
|
||||
*SDL_DirectFB_Symbols.directfb_micro_version);
|
||||
retval = 0;
|
||||
}
|
||||
}
|
||||
if (!retval)
|
||||
SDL_DirectFB_UnLoadLibrary();
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DirectFB_UnLoadLibrary(void)
|
||||
{
|
||||
if (handle != NULL) {
|
||||
SDL_UnloadObject(handle);
|
||||
handle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
int
|
||||
SDL_DirectFB_LoadLibrary(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DirectFB_UnLoadLibrary(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
39
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.h
Normal file
39
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_dyn.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_dyn_h
|
||||
#define _SDL_DirectFB_dyn_h
|
||||
|
||||
#define DFB_SYMS \
|
||||
DFB_SYM(DFBResult, DirectFBError, (const char *msg, DFBResult result), (msg, result), return) \
|
||||
DFB_SYM(DFBResult, DirectFBErrorFatal, (const char *msg, DFBResult result), (msg, result), return) \
|
||||
DFB_SYM(const char *, DirectFBErrorString, (DFBResult result), (result), return) \
|
||||
DFB_SYM(const char *, DirectFBUsageString, ( void ), (), return) \
|
||||
DFB_SYM(DFBResult, DirectFBInit, (int *argc, char *(*argv[]) ), (argc, argv), return) \
|
||||
DFB_SYM(DFBResult, DirectFBSetOption, (const char *name, const char *value), (name, value), return) \
|
||||
DFB_SYM(DFBResult, DirectFBCreate, (IDirectFB **interface), (interface), return) \
|
||||
DFB_SYM(const char *, DirectFBCheckVersion, (unsigned int required_major, unsigned int required_minor, unsigned int required_micro), \
|
||||
(required_major, required_minor, required_micro), return)
|
||||
|
||||
int SDL_DirectFB_LoadLibrary(void);
|
||||
void SDL_DirectFB_UnLoadLibrary(void);
|
||||
|
||||
#endif
|
||||
751
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.c
Normal file
751
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.c
Normal file
|
|
@ -0,0 +1,751 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
/* Handle the event stream, converting DirectFB input events into SDL events */
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
|
||||
#include "SDL_syswm.h"
|
||||
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
#include "../../events/SDL_keyboard_c.h"
|
||||
#include "../../events/SDL_windowevents_c.h"
|
||||
#include "../../events/SDL_events_c.h"
|
||||
#include "../../events/scancodes_linux.h"
|
||||
#include "../../events/scancodes_xfree86.h"
|
||||
|
||||
#include "SDL_DirectFB_events.h"
|
||||
|
||||
#if USE_MULTI_API
|
||||
#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, id, relative, x, y, p)
|
||||
#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, id, state, button)
|
||||
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(id, state, scancode)
|
||||
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(id, text)
|
||||
#else
|
||||
#define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, id, relative, x, y)
|
||||
#define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, id, state, button)
|
||||
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(state, scancode)
|
||||
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(text)
|
||||
#endif
|
||||
|
||||
typedef struct _cb_data cb_data;
|
||||
struct _cb_data
|
||||
{
|
||||
DFB_DeviceData *devdata;
|
||||
int sys_ids;
|
||||
int sys_kbd;
|
||||
};
|
||||
|
||||
/* The translation tables from a DirectFB keycode to a SDL keysym */
|
||||
static SDL_Scancode oskeymap[256];
|
||||
|
||||
|
||||
static SDL_Keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt,
|
||||
SDL_Keysym * keysym, Uint32 *unicode);
|
||||
static SDL_Keysym *DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt,
|
||||
SDL_Keysym * keysym, Uint32 *unicode);
|
||||
|
||||
static void DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keypmap, int numkeys);
|
||||
static int DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button);
|
||||
|
||||
static void UnicodeToUtf8( Uint16 w , char *utf8buf)
|
||||
{
|
||||
unsigned char *utf8s = (unsigned char *) utf8buf;
|
||||
|
||||
if ( w < 0x0080 ) {
|
||||
utf8s[0] = ( unsigned char ) w;
|
||||
utf8s[1] = 0;
|
||||
}
|
||||
else if ( w < 0x0800 ) {
|
||||
utf8s[0] = 0xc0 | (( w ) >> 6 );
|
||||
utf8s[1] = 0x80 | (( w ) & 0x3f );
|
||||
utf8s[2] = 0;
|
||||
}
|
||||
else {
|
||||
utf8s[0] = 0xe0 | (( w ) >> 12 );
|
||||
utf8s[1] = 0x80 | (( ( w ) >> 6 ) & 0x3f );
|
||||
utf8s[2] = 0x80 | (( w ) & 0x3f );
|
||||
utf8s[3] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
FocusAllMice(_THIS, SDL_Window *window)
|
||||
{
|
||||
#if USE_MULTI_API
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int index;
|
||||
|
||||
for (index = 0; index < devdata->num_mice; index++)
|
||||
SDL_SetMouseFocus(devdata->mouse_id[index], id);
|
||||
#else
|
||||
SDL_SetMouseFocus(window);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
FocusAllKeyboards(_THIS, SDL_Window *window)
|
||||
{
|
||||
#if USE_MULTI_API
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int index;
|
||||
|
||||
for (index = 0; index < devdata->num_keyboard; index++)
|
||||
SDL_SetKeyboardFocus(index, id);
|
||||
#else
|
||||
SDL_SetKeyboardFocus(window);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
MotionAllMice(_THIS, int x, int y)
|
||||
{
|
||||
#if USE_MULTI_API
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int index;
|
||||
|
||||
for (index = 0; index < devdata->num_mice; index++) {
|
||||
SDL_Mouse *mouse = SDL_GetMouse(index);
|
||||
mouse->x = mouse->last_x = x;
|
||||
mouse->y = mouse->last_y = y;
|
||||
/* SDL_SendMouseMotion(devdata->mouse_id[index], 0, x, y, 0); */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
KbdIndex(_THIS, int id)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int index;
|
||||
|
||||
for (index = 0; index < devdata->num_keyboard; index++) {
|
||||
if (devdata->keyboard[index].id == id)
|
||||
return index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
ClientXY(DFB_WindowData * p, int *x, int *y)
|
||||
{
|
||||
int cx, cy;
|
||||
|
||||
cx = *x;
|
||||
cy = *y;
|
||||
|
||||
cx -= p->client.x;
|
||||
cy -= p->client.y;
|
||||
|
||||
if (cx < 0 || cy < 0)
|
||||
return 0;
|
||||
if (cx >= p->client.w || cy >= p->client.h)
|
||||
return 0;
|
||||
*x = cx;
|
||||
*y = cy;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
ProcessWindowEvent(_THIS, SDL_Window *sdlwin, DFBWindowEvent * evt)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(sdlwin);
|
||||
SDL_Keysym keysym;
|
||||
Uint32 unicode;
|
||||
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
|
||||
|
||||
if (evt->clazz == DFEC_WINDOW) {
|
||||
switch (evt->type) {
|
||||
case DWET_BUTTONDOWN:
|
||||
if (ClientXY(windata, &evt->x, &evt->y)) {
|
||||
if (!devdata->use_linux_input) {
|
||||
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x,
|
||||
evt->y, 0);
|
||||
SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0],
|
||||
SDL_PRESSED,
|
||||
DirectFB_TranslateButton
|
||||
(evt->button));
|
||||
} else {
|
||||
MotionAllMice(_this, evt->x, evt->y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DWET_BUTTONUP:
|
||||
if (ClientXY(windata, &evt->x, &evt->y)) {
|
||||
if (!devdata->use_linux_input) {
|
||||
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0, evt->x,
|
||||
evt->y, 0);
|
||||
SDL_SendMouseButton_ex(sdlwin, devdata->mouse_id[0],
|
||||
SDL_RELEASED,
|
||||
DirectFB_TranslateButton
|
||||
(evt->button));
|
||||
} else {
|
||||
MotionAllMice(_this, evt->x, evt->y);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DWET_MOTION:
|
||||
if (ClientXY(windata, &evt->x, &evt->y)) {
|
||||
if (!devdata->use_linux_input) {
|
||||
if (!(sdlwin->flags & SDL_WINDOW_INPUT_GRABBED))
|
||||
SDL_SendMouseMotion_ex(sdlwin, devdata->mouse_id[0], 0,
|
||||
evt->x, evt->y, 0);
|
||||
} else {
|
||||
/* relative movements are not exact!
|
||||
* This code should limit the number of events sent.
|
||||
* However it kills MAME axis recognition ... */
|
||||
static int cnt = 0;
|
||||
if (1 && ++cnt > 20) {
|
||||
MotionAllMice(_this, evt->x, evt->y);
|
||||
cnt = 0;
|
||||
}
|
||||
}
|
||||
if (!(sdlwin->flags & SDL_WINDOW_MOUSE_FOCUS))
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0,
|
||||
0);
|
||||
}
|
||||
break;
|
||||
case DWET_KEYDOWN:
|
||||
if (!devdata->use_linux_input) {
|
||||
DirectFB_TranslateKey(_this, evt, &keysym, &unicode);
|
||||
/* printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id); */
|
||||
SDL_SendKeyboardKey_ex(0, SDL_PRESSED, keysym.scancode);
|
||||
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
|
||||
SDL_zero(text);
|
||||
UnicodeToUtf8(unicode, text);
|
||||
if (*text) {
|
||||
SDL_SendKeyboardText_ex(0, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DWET_KEYUP:
|
||||
if (!devdata->use_linux_input) {
|
||||
DirectFB_TranslateKey(_this, evt, &keysym, &unicode);
|
||||
SDL_SendKeyboardKey_ex(0, SDL_RELEASED, keysym.scancode);
|
||||
}
|
||||
break;
|
||||
case DWET_POSITION:
|
||||
if (ClientXY(windata, &evt->x, &evt->y)) {
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED,
|
||||
evt->x, evt->y);
|
||||
}
|
||||
break;
|
||||
case DWET_POSITION_SIZE:
|
||||
if (ClientXY(windata, &evt->x, &evt->y)) {
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_MOVED,
|
||||
evt->x, evt->y);
|
||||
}
|
||||
/* fall throught */
|
||||
case DWET_SIZE:
|
||||
/* FIXME: what about < 0 */
|
||||
evt->w -= (windata->theme.right_size + windata->theme.left_size);
|
||||
evt->h -=
|
||||
(windata->theme.top_size + windata->theme.bottom_size +
|
||||
windata->theme.caption_size);
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_RESIZED,
|
||||
evt->w, evt->h);
|
||||
break;
|
||||
case DWET_CLOSE:
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_CLOSE, 0, 0);
|
||||
break;
|
||||
case DWET_GOTFOCUS:
|
||||
DirectFB_SetContext(_this, sdlwin);
|
||||
FocusAllKeyboards(_this, sdlwin);
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_GAINED,
|
||||
0, 0);
|
||||
break;
|
||||
case DWET_LOSTFOCUS:
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
|
||||
FocusAllKeyboards(_this, 0);
|
||||
break;
|
||||
case DWET_ENTER:
|
||||
/* SDL_DirectFB_ReshowCursor(_this, 0); */
|
||||
FocusAllMice(_this, sdlwin);
|
||||
/* FIXME: when do we really enter ? */
|
||||
if (ClientXY(windata, &evt->x, &evt->y))
|
||||
MotionAllMice(_this, evt->x, evt->y);
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_ENTER, 0, 0);
|
||||
break;
|
||||
case DWET_LEAVE:
|
||||
SDL_SendWindowEvent(sdlwin, SDL_WINDOWEVENT_LEAVE, 0, 0);
|
||||
FocusAllMice(_this, 0);
|
||||
/* SDL_DirectFB_ReshowCursor(_this, 1); */
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
} else
|
||||
printf("Event Clazz %d\n", evt->clazz);
|
||||
}
|
||||
|
||||
static void
|
||||
ProcessInputEvent(_THIS, DFBInputEvent * ievt)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_Keysym keysym;
|
||||
int kbd_idx;
|
||||
Uint32 unicode;
|
||||
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];
|
||||
|
||||
if (!devdata->use_linux_input) {
|
||||
if (ievt->type == DIET_AXISMOTION) {
|
||||
if ((devdata->grabbed_window != NULL) && (ievt->flags & DIEF_AXISREL)) {
|
||||
if (ievt->axis == DIAI_X)
|
||||
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
|
||||
ievt->axisrel, 0, 0);
|
||||
else if (ievt->axis == DIAI_Y)
|
||||
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
|
||||
ievt->axisrel, 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
static int last_x, last_y;
|
||||
|
||||
switch (ievt->type) {
|
||||
case DIET_AXISMOTION:
|
||||
if (ievt->flags & DIEF_AXISABS) {
|
||||
if (ievt->axis == DIAI_X)
|
||||
last_x = ievt->axisabs;
|
||||
else if (ievt->axis == DIAI_Y)
|
||||
last_y = ievt->axisabs;
|
||||
if (!(ievt->flags & DIEF_FOLLOW)) {
|
||||
#if USE_MULTI_API
|
||||
SDL_Mouse *mouse = SDL_GetMouse(ievt->device_id);
|
||||
SDL_Window *window = SDL_GetWindowFromID(mouse->focus);
|
||||
#else
|
||||
SDL_Window *window = devdata->grabbed_window;
|
||||
#endif
|
||||
if (window) {
|
||||
DFB_WindowData *windata =
|
||||
(DFB_WindowData *) window->driverdata;
|
||||
int x, y;
|
||||
|
||||
windata->dfbwin->GetPosition(windata->dfbwin, &x, &y);
|
||||
SDL_SendMouseMotion_ex(window, ievt->device_id, 0,
|
||||
last_x - (x +
|
||||
windata->client.x),
|
||||
last_y - (y +
|
||||
windata->client.y), 0);
|
||||
} else {
|
||||
SDL_SendMouseMotion_ex(window, ievt->device_id, 0, last_x,
|
||||
last_y, 0);
|
||||
}
|
||||
}
|
||||
} else if (ievt->flags & DIEF_AXISREL) {
|
||||
if (ievt->axis == DIAI_X)
|
||||
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
|
||||
ievt->axisrel, 0, 0);
|
||||
else if (ievt->axis == DIAI_Y)
|
||||
SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
|
||||
ievt->axisrel, 0);
|
||||
}
|
||||
break;
|
||||
case DIET_KEYPRESS:
|
||||
kbd_idx = KbdIndex(_this, ievt->device_id);
|
||||
DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym, &unicode);
|
||||
/* printf("Scancode %d %d %d\n", keysym.scancode, evt->key_code, evt->key_id); */
|
||||
SDL_SendKeyboardKey_ex(kbd_idx, SDL_PRESSED, keysym.scancode);
|
||||
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
|
||||
SDL_zero(text);
|
||||
UnicodeToUtf8(unicode, text);
|
||||
if (*text) {
|
||||
SDL_SendKeyboardText_ex(kbd_idx, text);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DIET_KEYRELEASE:
|
||||
kbd_idx = KbdIndex(_this, ievt->device_id);
|
||||
DirectFB_TranslateKeyInputEvent(_this, ievt, &keysym, &unicode);
|
||||
SDL_SendKeyboardKey_ex(kbd_idx, SDL_RELEASED, keysym.scancode);
|
||||
break;
|
||||
case DIET_BUTTONPRESS:
|
||||
if (ievt->buttons & DIBM_LEFT)
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 1);
|
||||
if (ievt->buttons & DIBM_MIDDLE)
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 2);
|
||||
if (ievt->buttons & DIBM_RIGHT)
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 3);
|
||||
break;
|
||||
case DIET_BUTTONRELEASE:
|
||||
if (!(ievt->buttons & DIBM_LEFT))
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 1);
|
||||
if (!(ievt->buttons & DIBM_MIDDLE))
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 2);
|
||||
if (!(ievt->buttons & DIBM_RIGHT))
|
||||
SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 3);
|
||||
break;
|
||||
default:
|
||||
break; /* please gcc */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_PumpEventsWindow(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
DFBInputEvent ievt;
|
||||
SDL_Window *w;
|
||||
|
||||
for (w = devdata->firstwin; w != NULL; w = w->next) {
|
||||
SDL_DFB_WINDOWDATA(w);
|
||||
DFBWindowEvent evt;
|
||||
|
||||
while (windata->eventbuffer->GetEvent(windata->eventbuffer,
|
||||
DFB_EVENT(&evt)) == DFB_OK) {
|
||||
if (!DirectFB_WM_ProcessEvent(_this, w, &evt)) {
|
||||
/* Send a SDL_SYSWMEVENT if the application wants them */
|
||||
if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
|
||||
SDL_SysWMmsg wmmsg;
|
||||
SDL_VERSION(&wmmsg.version);
|
||||
wmmsg.subsystem = SDL_SYSWM_DIRECTFB;
|
||||
wmmsg.msg.dfb.event.window = evt;
|
||||
SDL_SendSysWMEvent(&wmmsg);
|
||||
}
|
||||
ProcessWindowEvent(_this, w, &evt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Now get relative events in case we need them */
|
||||
while (devdata->events->GetEvent(devdata->events,
|
||||
DFB_EVENT(&ievt)) == DFB_OK) {
|
||||
|
||||
if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
|
||||
SDL_SysWMmsg wmmsg;
|
||||
SDL_VERSION(&wmmsg.version);
|
||||
wmmsg.subsystem = SDL_SYSWM_DIRECTFB;
|
||||
wmmsg.msg.dfb.event.input = ievt;
|
||||
SDL_SendSysWMEvent(&wmmsg);
|
||||
}
|
||||
ProcessInputEvent(_this, &ievt);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_InitOSKeymap(_THIS, SDL_Scancode * keymap, int numkeys)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Initialize the DirectFB key translation table */
|
||||
for (i = 0; i < numkeys; ++i)
|
||||
keymap[i] = SDL_SCANCODE_UNKNOWN;
|
||||
|
||||
keymap[DIKI_A - DIKI_UNKNOWN] = SDL_SCANCODE_A;
|
||||
keymap[DIKI_B - DIKI_UNKNOWN] = SDL_SCANCODE_B;
|
||||
keymap[DIKI_C - DIKI_UNKNOWN] = SDL_SCANCODE_C;
|
||||
keymap[DIKI_D - DIKI_UNKNOWN] = SDL_SCANCODE_D;
|
||||
keymap[DIKI_E - DIKI_UNKNOWN] = SDL_SCANCODE_E;
|
||||
keymap[DIKI_F - DIKI_UNKNOWN] = SDL_SCANCODE_F;
|
||||
keymap[DIKI_G - DIKI_UNKNOWN] = SDL_SCANCODE_G;
|
||||
keymap[DIKI_H - DIKI_UNKNOWN] = SDL_SCANCODE_H;
|
||||
keymap[DIKI_I - DIKI_UNKNOWN] = SDL_SCANCODE_I;
|
||||
keymap[DIKI_J - DIKI_UNKNOWN] = SDL_SCANCODE_J;
|
||||
keymap[DIKI_K - DIKI_UNKNOWN] = SDL_SCANCODE_K;
|
||||
keymap[DIKI_L - DIKI_UNKNOWN] = SDL_SCANCODE_L;
|
||||
keymap[DIKI_M - DIKI_UNKNOWN] = SDL_SCANCODE_M;
|
||||
keymap[DIKI_N - DIKI_UNKNOWN] = SDL_SCANCODE_N;
|
||||
keymap[DIKI_O - DIKI_UNKNOWN] = SDL_SCANCODE_O;
|
||||
keymap[DIKI_P - DIKI_UNKNOWN] = SDL_SCANCODE_P;
|
||||
keymap[DIKI_Q - DIKI_UNKNOWN] = SDL_SCANCODE_Q;
|
||||
keymap[DIKI_R - DIKI_UNKNOWN] = SDL_SCANCODE_R;
|
||||
keymap[DIKI_S - DIKI_UNKNOWN] = SDL_SCANCODE_S;
|
||||
keymap[DIKI_T - DIKI_UNKNOWN] = SDL_SCANCODE_T;
|
||||
keymap[DIKI_U - DIKI_UNKNOWN] = SDL_SCANCODE_U;
|
||||
keymap[DIKI_V - DIKI_UNKNOWN] = SDL_SCANCODE_V;
|
||||
keymap[DIKI_W - DIKI_UNKNOWN] = SDL_SCANCODE_W;
|
||||
keymap[DIKI_X - DIKI_UNKNOWN] = SDL_SCANCODE_X;
|
||||
keymap[DIKI_Y - DIKI_UNKNOWN] = SDL_SCANCODE_Y;
|
||||
keymap[DIKI_Z - DIKI_UNKNOWN] = SDL_SCANCODE_Z;
|
||||
|
||||
keymap[DIKI_0 - DIKI_UNKNOWN] = SDL_SCANCODE_0;
|
||||
keymap[DIKI_1 - DIKI_UNKNOWN] = SDL_SCANCODE_1;
|
||||
keymap[DIKI_2 - DIKI_UNKNOWN] = SDL_SCANCODE_2;
|
||||
keymap[DIKI_3 - DIKI_UNKNOWN] = SDL_SCANCODE_3;
|
||||
keymap[DIKI_4 - DIKI_UNKNOWN] = SDL_SCANCODE_4;
|
||||
keymap[DIKI_5 - DIKI_UNKNOWN] = SDL_SCANCODE_5;
|
||||
keymap[DIKI_6 - DIKI_UNKNOWN] = SDL_SCANCODE_6;
|
||||
keymap[DIKI_7 - DIKI_UNKNOWN] = SDL_SCANCODE_7;
|
||||
keymap[DIKI_8 - DIKI_UNKNOWN] = SDL_SCANCODE_8;
|
||||
keymap[DIKI_9 - DIKI_UNKNOWN] = SDL_SCANCODE_9;
|
||||
|
||||
keymap[DIKI_F1 - DIKI_UNKNOWN] = SDL_SCANCODE_F1;
|
||||
keymap[DIKI_F2 - DIKI_UNKNOWN] = SDL_SCANCODE_F2;
|
||||
keymap[DIKI_F3 - DIKI_UNKNOWN] = SDL_SCANCODE_F3;
|
||||
keymap[DIKI_F4 - DIKI_UNKNOWN] = SDL_SCANCODE_F4;
|
||||
keymap[DIKI_F5 - DIKI_UNKNOWN] = SDL_SCANCODE_F5;
|
||||
keymap[DIKI_F6 - DIKI_UNKNOWN] = SDL_SCANCODE_F6;
|
||||
keymap[DIKI_F7 - DIKI_UNKNOWN] = SDL_SCANCODE_F7;
|
||||
keymap[DIKI_F8 - DIKI_UNKNOWN] = SDL_SCANCODE_F8;
|
||||
keymap[DIKI_F9 - DIKI_UNKNOWN] = SDL_SCANCODE_F9;
|
||||
keymap[DIKI_F10 - DIKI_UNKNOWN] = SDL_SCANCODE_F10;
|
||||
keymap[DIKI_F11 - DIKI_UNKNOWN] = SDL_SCANCODE_F11;
|
||||
keymap[DIKI_F12 - DIKI_UNKNOWN] = SDL_SCANCODE_F12;
|
||||
|
||||
keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = SDL_SCANCODE_ESCAPE;
|
||||
keymap[DIKI_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFT;
|
||||
keymap[DIKI_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHT;
|
||||
keymap[DIKI_UP - DIKI_UNKNOWN] = SDL_SCANCODE_UP;
|
||||
keymap[DIKI_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_DOWN;
|
||||
keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = SDL_SCANCODE_LCTRL;
|
||||
keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = SDL_SCANCODE_RCTRL;
|
||||
keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LSHIFT;
|
||||
keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RSHIFT;
|
||||
keymap[DIKI_ALT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LALT;
|
||||
keymap[DIKI_ALT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RALT;
|
||||
keymap[DIKI_META_L - DIKI_UNKNOWN] = SDL_SCANCODE_LGUI;
|
||||
keymap[DIKI_META_R - DIKI_UNKNOWN] = SDL_SCANCODE_RGUI;
|
||||
keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
|
||||
keymap[DIKI_SUPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
|
||||
/* FIXME:Do we read hyper keys ?
|
||||
* keymap[DIKI_HYPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
|
||||
* keymap[DIKI_HYPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
|
||||
*/
|
||||
keymap[DIKI_TAB - DIKI_UNKNOWN] = SDL_SCANCODE_TAB;
|
||||
keymap[DIKI_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_RETURN;
|
||||
keymap[DIKI_SPACE - DIKI_UNKNOWN] = SDL_SCANCODE_SPACE;
|
||||
keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSPACE;
|
||||
keymap[DIKI_INSERT - DIKI_UNKNOWN] = SDL_SCANCODE_INSERT;
|
||||
keymap[DIKI_DELETE - DIKI_UNKNOWN] = SDL_SCANCODE_DELETE;
|
||||
keymap[DIKI_HOME - DIKI_UNKNOWN] = SDL_SCANCODE_HOME;
|
||||
keymap[DIKI_END - DIKI_UNKNOWN] = SDL_SCANCODE_END;
|
||||
keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEUP;
|
||||
keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEDOWN;
|
||||
keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_CAPSLOCK;
|
||||
keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_NUMLOCKCLEAR;
|
||||
keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_SCROLLLOCK;
|
||||
keymap[DIKI_PRINT - DIKI_UNKNOWN] = SDL_SCANCODE_PRINTSCREEN;
|
||||
keymap[DIKI_PAUSE - DIKI_UNKNOWN] = SDL_SCANCODE_PAUSE;
|
||||
|
||||
keymap[DIKI_KP_EQUAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_EQUALS;
|
||||
keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PERIOD;
|
||||
keymap[DIKI_KP_0 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_0;
|
||||
keymap[DIKI_KP_1 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_1;
|
||||
keymap[DIKI_KP_2 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_2;
|
||||
keymap[DIKI_KP_3 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_3;
|
||||
keymap[DIKI_KP_4 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_4;
|
||||
keymap[DIKI_KP_5 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_5;
|
||||
keymap[DIKI_KP_6 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_6;
|
||||
keymap[DIKI_KP_7 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_7;
|
||||
keymap[DIKI_KP_8 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_8;
|
||||
keymap[DIKI_KP_9 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_9;
|
||||
keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = SDL_SCANCODE_KP_DIVIDE;
|
||||
keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MULTIPLY;
|
||||
keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MINUS;
|
||||
keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PLUS;
|
||||
keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_KP_ENTER;
|
||||
|
||||
keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_GRAVE; /* TLDE */
|
||||
keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_MINUS; /* AE11 */
|
||||
keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_EQUALS; /* AE12 */
|
||||
keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHTBRACKET; /* AD11 */
|
||||
keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFTBRACKET; /* AD12 */
|
||||
keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSLASH; /* BKSL */
|
||||
keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = SDL_SCANCODE_SEMICOLON; /* AC10 */
|
||||
keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_APOSTROPHE; /* AC11 */
|
||||
keymap[DIKI_COMMA - DIKI_UNKNOWN] = SDL_SCANCODE_COMMA; /* AB08 */
|
||||
keymap[DIKI_PERIOD - DIKI_UNKNOWN] = SDL_SCANCODE_PERIOD; /* AB09 */
|
||||
keymap[DIKI_SLASH - DIKI_UNKNOWN] = SDL_SCANCODE_SLASH; /* AB10 */
|
||||
keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_NONUSBACKSLASH; /* 103rd */
|
||||
|
||||
}
|
||||
|
||||
static SDL_Keysym *
|
||||
DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, SDL_Keysym * keysym, Uint32 *unicode)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int kbd_idx = 0; /* Window events lag the device source KbdIndex(_this, evt->device_id); */
|
||||
DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx];
|
||||
|
||||
keysym->scancode = SDL_SCANCODE_UNKNOWN;
|
||||
|
||||
if (kbd->map && evt->key_code >= kbd->map_adjust &&
|
||||
evt->key_code < kbd->map_size + kbd->map_adjust)
|
||||
keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust];
|
||||
|
||||
if (keysym->scancode == SDL_SCANCODE_UNKNOWN ||
|
||||
devdata->keyboard[kbd_idx].is_generic) {
|
||||
if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap))
|
||||
keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN];
|
||||
else
|
||||
keysym->scancode = SDL_SCANCODE_UNKNOWN;
|
||||
}
|
||||
|
||||
*unicode =
|
||||
(DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0;
|
||||
if (*unicode == 0 &&
|
||||
(evt->key_symbol > 0 && evt->key_symbol < 255))
|
||||
*unicode = evt->key_symbol;
|
||||
|
||||
return keysym;
|
||||
}
|
||||
|
||||
static SDL_Keysym *
|
||||
DirectFB_TranslateKeyInputEvent(_THIS, DFBInputEvent * evt,
|
||||
SDL_Keysym * keysym, Uint32 *unicode)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
int kbd_idx = KbdIndex(_this, evt->device_id);
|
||||
DFB_KeyboardData *kbd = &devdata->keyboard[kbd_idx];
|
||||
|
||||
keysym->scancode = SDL_SCANCODE_UNKNOWN;
|
||||
|
||||
if (kbd->map && evt->key_code >= kbd->map_adjust &&
|
||||
evt->key_code < kbd->map_size + kbd->map_adjust)
|
||||
keysym->scancode = kbd->map[evt->key_code - kbd->map_adjust];
|
||||
|
||||
if (keysym->scancode == SDL_SCANCODE_UNKNOWN || devdata->keyboard[kbd_idx].is_generic) {
|
||||
if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(oskeymap))
|
||||
keysym->scancode = oskeymap[evt->key_id - DIKI_UNKNOWN];
|
||||
else
|
||||
keysym->scancode = SDL_SCANCODE_UNKNOWN;
|
||||
}
|
||||
|
||||
*unicode =
|
||||
(DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0;
|
||||
if (*unicode == 0 &&
|
||||
(evt->key_symbol > 0 && evt->key_symbol < 255))
|
||||
*unicode = evt->key_symbol;
|
||||
|
||||
return keysym;
|
||||
}
|
||||
|
||||
static int
|
||||
DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button)
|
||||
{
|
||||
switch (button) {
|
||||
case DIBI_LEFT:
|
||||
return 1;
|
||||
case DIBI_MIDDLE:
|
||||
return 2;
|
||||
case DIBI_RIGHT:
|
||||
return 3;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static DFBEnumerationResult
|
||||
EnumKeyboards(DFBInputDeviceID device_id,
|
||||
DFBInputDeviceDescription desc, void *callbackdata)
|
||||
{
|
||||
cb_data *cb = callbackdata;
|
||||
DFB_DeviceData *devdata = cb->devdata;
|
||||
#if USE_MULTI_API
|
||||
SDL_Keyboard keyboard;
|
||||
#endif
|
||||
SDL_Keycode keymap[SDL_NUM_SCANCODES];
|
||||
|
||||
if (!cb->sys_kbd) {
|
||||
if (cb->sys_ids) {
|
||||
if (device_id >= 0x10)
|
||||
return DFENUM_OK;
|
||||
} else {
|
||||
if (device_id < 0x10)
|
||||
return DFENUM_OK;
|
||||
}
|
||||
} else {
|
||||
if (device_id != DIDID_KEYBOARD)
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
if ((desc.caps & DIDTF_KEYBOARD)) {
|
||||
#if USE_MULTI_API
|
||||
SDL_zero(keyboard);
|
||||
SDL_AddKeyboard(&keyboard, devdata->num_keyboard);
|
||||
#endif
|
||||
devdata->keyboard[devdata->num_keyboard].id = device_id;
|
||||
devdata->keyboard[devdata->num_keyboard].is_generic = 0;
|
||||
if (!strncmp("X11", desc.name, 3))
|
||||
{
|
||||
devdata->keyboard[devdata->num_keyboard].map = xfree86_scancode_table2;
|
||||
devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(xfree86_scancode_table2);
|
||||
devdata->keyboard[devdata->num_keyboard].map_adjust = 8;
|
||||
} else {
|
||||
devdata->keyboard[devdata->num_keyboard].map = linux_scancode_table;
|
||||
devdata->keyboard[devdata->num_keyboard].map_size = SDL_arraysize(linux_scancode_table);
|
||||
devdata->keyboard[devdata->num_keyboard].map_adjust = 0;
|
||||
}
|
||||
|
||||
SDL_DFB_LOG("Keyboard %d - %s\n", device_id, desc.name);
|
||||
|
||||
SDL_GetDefaultKeymap(keymap);
|
||||
#if USE_MULTI_API
|
||||
SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES);
|
||||
#else
|
||||
SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
|
||||
#endif
|
||||
devdata->num_keyboard++;
|
||||
|
||||
if (cb->sys_kbd)
|
||||
return DFENUM_CANCEL;
|
||||
}
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_InitKeyboard(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
cb_data cb;
|
||||
|
||||
DirectFB_InitOSKeymap(_this, &oskeymap[0], SDL_arraysize(oskeymap));
|
||||
|
||||
devdata->num_keyboard = 0;
|
||||
cb.devdata = devdata;
|
||||
|
||||
if (devdata->use_linux_input) {
|
||||
cb.sys_kbd = 0;
|
||||
cb.sys_ids = 0;
|
||||
SDL_DFB_CHECK(devdata->dfb->
|
||||
EnumInputDevices(devdata->dfb, EnumKeyboards, &cb));
|
||||
if (devdata->num_keyboard == 0) {
|
||||
cb.sys_ids = 1;
|
||||
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
|
||||
EnumKeyboards,
|
||||
&cb));
|
||||
}
|
||||
} else {
|
||||
cb.sys_kbd = 1;
|
||||
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
|
||||
EnumKeyboards,
|
||||
&cb));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_QuitKeyboard(_THIS)
|
||||
{
|
||||
/* SDL_DFB_DEVICEDATA(_this); */
|
||||
|
||||
SDL_KeyboardQuit();
|
||||
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
32
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.h
Normal file
32
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_events.h
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_events_h
|
||||
#define _SDL_DirectFB_events_h
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
/* Functions to be exported */
|
||||
extern void DirectFB_InitKeyboard(_THIS);
|
||||
extern void DirectFB_QuitKeyboard(_THIS);
|
||||
extern void DirectFB_PumpEventsWindow(_THIS);
|
||||
|
||||
#endif
|
||||
414
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.c
Normal file
414
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.c
Normal file
|
|
@ -0,0 +1,414 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
|
||||
#define DFB_MAX_MODES 200
|
||||
|
||||
struct screen_callback_t
|
||||
{
|
||||
int numscreens;
|
||||
DFBScreenID screenid[DFB_MAX_SCREENS];
|
||||
DFBDisplayLayerID gralayer[DFB_MAX_SCREENS];
|
||||
DFBDisplayLayerID vidlayer[DFB_MAX_SCREENS];
|
||||
int aux; /* auxiliary integer for callbacks */
|
||||
};
|
||||
|
||||
struct modes_callback_t
|
||||
{
|
||||
int nummodes;
|
||||
SDL_DisplayMode *modelist;
|
||||
};
|
||||
|
||||
static DFBEnumerationResult
|
||||
EnumModesCallback(int width, int height, int bpp, void *data)
|
||||
{
|
||||
struct modes_callback_t *modedata = (struct modes_callback_t *) data;
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
mode.w = width;
|
||||
mode.h = height;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
mode.format = SDL_PIXELFORMAT_UNKNOWN;
|
||||
|
||||
if (modedata->nummodes < DFB_MAX_MODES) {
|
||||
modedata->modelist[modedata->nummodes++] = mode;
|
||||
}
|
||||
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
static DFBEnumerationResult
|
||||
EnumScreensCallback(DFBScreenID screen_id, DFBScreenDescription desc,
|
||||
void *callbackdata)
|
||||
{
|
||||
struct screen_callback_t *devdata = (struct screen_callback_t *) callbackdata;
|
||||
|
||||
devdata->screenid[devdata->numscreens++] = screen_id;
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
static DFBEnumerationResult
|
||||
EnumLayersCallback(DFBDisplayLayerID layer_id, DFBDisplayLayerDescription desc,
|
||||
void *callbackdata)
|
||||
{
|
||||
struct screen_callback_t *devdata = (struct screen_callback_t *) callbackdata;
|
||||
|
||||
if (desc.caps & DLCAPS_SURFACE) {
|
||||
if ((desc.type & DLTF_GRAPHICS) && (desc.type & DLTF_VIDEO)) {
|
||||
if (devdata->vidlayer[devdata->aux] == -1)
|
||||
devdata->vidlayer[devdata->aux] = layer_id;
|
||||
} else if (desc.type & DLTF_GRAPHICS) {
|
||||
if (devdata->gralayer[devdata->aux] == -1)
|
||||
devdata->gralayer[devdata->aux] = layer_id;
|
||||
}
|
||||
}
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, SDL_DisplayMode * mode)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
DFBDisplayLayerConfig config;
|
||||
DFBDisplayLayerConfigFlags failed;
|
||||
|
||||
SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
config.width = mode->w;
|
||||
config.height = mode->h;
|
||||
config.pixelformat = DirectFB_SDLToDFBPixelFormat(mode->format);
|
||||
config.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT;
|
||||
if (devdata->use_yuv_underlays) {
|
||||
config.flags |= DLCONF_OPTIONS;
|
||||
config.options = DLOP_ALPHACHANNEL;
|
||||
}
|
||||
failed = 0;
|
||||
data->layer->TestConfiguration(data->layer, &config, &failed);
|
||||
SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer,
|
||||
DLSCL_SHARED));
|
||||
if (failed == 0)
|
||||
{
|
||||
SDL_AddDisplayMode(display, mode);
|
||||
SDL_DFB_LOG("Mode %d x %d Added\n", mode->w, mode->h);
|
||||
}
|
||||
else
|
||||
SDL_DFB_ERR("Mode %d x %d not available: %x\n", mode->w,
|
||||
mode->h, failed);
|
||||
|
||||
return;
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DirectFB_SetContext(_THIS, SDL_Window *window)
|
||||
{
|
||||
#if (DFB_VERSION_ATLEAST(1,0,0))
|
||||
/* FIXME: does not work on 1.0/1.2 with radeon driver
|
||||
* the approach did work with the matrox driver
|
||||
* This has simply no effect.
|
||||
*/
|
||||
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
|
||||
/* FIXME: should we handle the error */
|
||||
if (dispdata->vidIDinuse)
|
||||
SDL_DFB_CHECK(dispdata->vidlayer->SwitchContext(dispdata->vidlayer,
|
||||
DFB_TRUE));
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_InitModes(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
IDirectFBDisplayLayer *layer = NULL;
|
||||
SDL_VideoDisplay display;
|
||||
DFB_DisplayData *dispdata = NULL;
|
||||
SDL_DisplayMode mode;
|
||||
DFBGraphicsDeviceDescription caps;
|
||||
DFBDisplayLayerConfig dlc;
|
||||
struct screen_callback_t *screencbdata;
|
||||
|
||||
int tcw[DFB_MAX_SCREENS];
|
||||
int tch[DFB_MAX_SCREENS];
|
||||
int i;
|
||||
DFBResult ret;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(screencbdata, sizeof(*screencbdata));
|
||||
|
||||
screencbdata->numscreens = 0;
|
||||
|
||||
for (i = 0; i < DFB_MAX_SCREENS; i++) {
|
||||
screencbdata->gralayer[i] = -1;
|
||||
screencbdata->vidlayer[i] = -1;
|
||||
}
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->EnumScreens(devdata->dfb, &EnumScreensCallback,
|
||||
screencbdata));
|
||||
|
||||
for (i = 0; i < screencbdata->numscreens; i++) {
|
||||
IDirectFBScreen *screen;
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->GetScreen(devdata->dfb,
|
||||
screencbdata->screenid
|
||||
[i], &screen));
|
||||
|
||||
screencbdata->aux = i;
|
||||
SDL_DFB_CHECKERR(screen->EnumDisplayLayers(screen, &EnumLayersCallback,
|
||||
screencbdata));
|
||||
screen->GetSize(screen, &tcw[i], &tch[i]);
|
||||
|
||||
screen->Release(screen);
|
||||
}
|
||||
|
||||
/* Query card capabilities */
|
||||
|
||||
devdata->dfb->GetDeviceDescription(devdata->dfb, &caps);
|
||||
|
||||
for (i = 0; i < screencbdata->numscreens; i++) {
|
||||
SDL_DFB_CHECKERR(devdata->dfb->GetDisplayLayer(devdata->dfb,
|
||||
screencbdata->gralayer
|
||||
[i], &layer));
|
||||
|
||||
SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
layer->EnableCursor(layer, 1);
|
||||
SDL_DFB_CHECKERR(layer->SetCursorOpacity(layer, 0xC0));
|
||||
|
||||
if (devdata->use_yuv_underlays) {
|
||||
dlc.flags = DLCONF_PIXELFORMAT | DLCONF_OPTIONS;
|
||||
dlc.pixelformat = DSPF_ARGB;
|
||||
dlc.options = DLOP_ALPHACHANNEL;
|
||||
|
||||
ret = layer->SetConfiguration(layer, &dlc);
|
||||
if (ret != DFB_OK) {
|
||||
/* try AiRGB if the previous failed */
|
||||
dlc.pixelformat = DSPF_AiRGB;
|
||||
SDL_DFB_CHECKERR(layer->SetConfiguration(layer, &dlc));
|
||||
}
|
||||
}
|
||||
|
||||
/* Query layer configuration to determine the current mode and pixelformat */
|
||||
dlc.flags = DLCONF_ALL;
|
||||
SDL_DFB_CHECKERR(layer->GetConfiguration(layer, &dlc));
|
||||
|
||||
mode.format = DirectFB_DFBToSDLPixelFormat(dlc.pixelformat);
|
||||
|
||||
if (mode.format == SDL_PIXELFORMAT_UNKNOWN) {
|
||||
SDL_DFB_ERR("Unknown dfb pixelformat %x !\n", dlc.pixelformat);
|
||||
goto error;
|
||||
}
|
||||
|
||||
mode.w = dlc.width;
|
||||
mode.h = dlc.height;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(dispdata, sizeof(*dispdata));
|
||||
|
||||
dispdata->layer = layer;
|
||||
dispdata->pixelformat = dlc.pixelformat;
|
||||
dispdata->cw = tcw[i];
|
||||
dispdata->ch = tch[i];
|
||||
|
||||
/* YUV - Video layer */
|
||||
|
||||
dispdata->vidID = screencbdata->vidlayer[i];
|
||||
dispdata->vidIDinuse = 0;
|
||||
|
||||
SDL_zero(display);
|
||||
|
||||
display.desktop_mode = mode;
|
||||
display.current_mode = mode;
|
||||
display.driverdata = dispdata;
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,2,0))
|
||||
dlc.flags =
|
||||
DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT |
|
||||
DLCONF_OPTIONS;
|
||||
ret = layer->SetConfiguration(layer, &dlc);
|
||||
#endif
|
||||
|
||||
SDL_DFB_CHECKERR(layer->SetCooperativeLevel(layer, DLSCL_SHARED));
|
||||
|
||||
SDL_AddVideoDisplay(&display);
|
||||
}
|
||||
SDL_DFB_FREE(screencbdata);
|
||||
return;
|
||||
error:
|
||||
/* FIXME: Cleanup not complete, Free existing displays */
|
||||
SDL_DFB_FREE(dispdata);
|
||||
SDL_DFB_RELEASE(layer);
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
SDL_DisplayMode mode;
|
||||
struct modes_callback_t data;
|
||||
int i;
|
||||
|
||||
data.nummodes = 0;
|
||||
/* Enumerate the available fullscreen modes */
|
||||
SDL_DFB_CALLOC(data.modelist, DFB_MAX_MODES, sizeof(SDL_DisplayMode));
|
||||
SDL_DFB_CHECKERR(devdata->dfb->EnumVideoModes(devdata->dfb,
|
||||
EnumModesCallback, &data));
|
||||
|
||||
for (i = 0; i < data.nummodes; ++i) {
|
||||
mode = data.modelist[i];
|
||||
|
||||
mode.format = SDL_PIXELFORMAT_ARGB8888;
|
||||
CheckSetDisplayMode(_this, display, dispdata, &mode);
|
||||
mode.format = SDL_PIXELFORMAT_RGB888;
|
||||
CheckSetDisplayMode(_this, display, dispdata, &mode);
|
||||
mode.format = SDL_PIXELFORMAT_RGB24;
|
||||
CheckSetDisplayMode(_this, display, dispdata, &mode);
|
||||
mode.format = SDL_PIXELFORMAT_RGB565;
|
||||
CheckSetDisplayMode(_this, display, dispdata, &mode);
|
||||
mode.format = SDL_PIXELFORMAT_INDEX8;
|
||||
CheckSetDisplayMode(_this, display, dispdata, &mode);
|
||||
}
|
||||
|
||||
SDL_DFB_FREE(data.modelist);
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
||||
{
|
||||
/*
|
||||
* FIXME: video mode switch is currently broken for 1.2.0
|
||||
*
|
||||
*/
|
||||
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
DFB_DisplayData *data = (DFB_DisplayData *) display->driverdata;
|
||||
DFBDisplayLayerConfig config, rconfig;
|
||||
DFBDisplayLayerConfigFlags fail = 0;
|
||||
|
||||
SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
|
||||
SDL_DFB_CHECKERR(data->layer->GetConfiguration(data->layer, &config));
|
||||
config.flags = DLCONF_WIDTH | DLCONF_HEIGHT;
|
||||
if (mode->format != SDL_PIXELFORMAT_UNKNOWN) {
|
||||
config.flags |= DLCONF_PIXELFORMAT;
|
||||
config.pixelformat = DirectFB_SDLToDFBPixelFormat(mode->format);
|
||||
data->pixelformat = config.pixelformat;
|
||||
}
|
||||
config.width = mode->w;
|
||||
config.height = mode->h;
|
||||
|
||||
if (devdata->use_yuv_underlays) {
|
||||
config.flags |= DLCONF_OPTIONS;
|
||||
config.options = DLOP_ALPHACHANNEL;
|
||||
}
|
||||
|
||||
data->layer->TestConfiguration(data->layer, &config, &fail);
|
||||
|
||||
if (fail &
|
||||
(DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT |
|
||||
DLCONF_OPTIONS)) {
|
||||
SDL_DFB_ERR("Error setting mode %dx%d-%x\n", mode->w, mode->h,
|
||||
mode->format);
|
||||
return -1;
|
||||
}
|
||||
|
||||
config.flags &= ~fail;
|
||||
SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config));
|
||||
#if (DFB_VERSION_ATLEAST(1,2,0))
|
||||
/* Need to call this twice ! */
|
||||
SDL_DFB_CHECKERR(data->layer->SetConfiguration(data->layer, &config));
|
||||
#endif
|
||||
|
||||
/* Double check */
|
||||
SDL_DFB_CHECKERR(data->layer->GetConfiguration(data->layer, &rconfig));
|
||||
SDL_DFB_CHECKERR(data->
|
||||
layer->SetCooperativeLevel(data->layer, DLSCL_SHARED));
|
||||
|
||||
if ((config.width != rconfig.width) || (config.height != rconfig.height)
|
||||
|| ((mode->format != SDL_PIXELFORMAT_UNKNOWN)
|
||||
&& (config.pixelformat != rconfig.pixelformat))) {
|
||||
SDL_DFB_ERR("Error setting mode %dx%d-%x\n", mode->w, mode->h,
|
||||
mode->format);
|
||||
return -1;
|
||||
}
|
||||
|
||||
data->pixelformat = rconfig.pixelformat;
|
||||
data->cw = config.width;
|
||||
data->ch = config.height;
|
||||
display->current_mode = *mode;
|
||||
|
||||
return 0;
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_QuitModes(_THIS)
|
||||
{
|
||||
SDL_DisplayMode tmode;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < _this->num_displays; ++i) {
|
||||
SDL_VideoDisplay *display = &_this->displays[i];
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
|
||||
SDL_GetDesktopDisplayMode(i, &tmode);
|
||||
tmode.format = SDL_PIXELFORMAT_UNKNOWN;
|
||||
DirectFB_SetDisplayMode(_this, display, &tmode);
|
||||
|
||||
SDL_GetDesktopDisplayMode(i, &tmode);
|
||||
DirectFB_SetDisplayMode(_this, display, &tmode);
|
||||
|
||||
if (dispdata->layer) {
|
||||
SDL_DFB_CHECK(dispdata->
|
||||
layer->SetCooperativeLevel(dispdata->layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
SDL_DFB_CHECK(dispdata->
|
||||
layer->SetCursorOpacity(dispdata->layer, 0x00));
|
||||
SDL_DFB_CHECK(dispdata->
|
||||
layer->SetCooperativeLevel(dispdata->layer,
|
||||
DLSCL_SHARED));
|
||||
}
|
||||
|
||||
SDL_DFB_RELEASE(dispdata->layer);
|
||||
SDL_DFB_RELEASE(dispdata->vidlayer);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
59
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.h
Normal file
59
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_modes.h
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_directfb_modes_h
|
||||
#define _SDL_directfb_modes_h
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#define SDL_DFB_DISPLAYDATA(win) DFB_DisplayData *dispdata = ((win) ? (DFB_DisplayData *) SDL_GetDisplayForWindow(window)->driverdata : NULL)
|
||||
|
||||
typedef struct _DFB_DisplayData DFB_DisplayData;
|
||||
struct _DFB_DisplayData
|
||||
{
|
||||
IDirectFBDisplayLayer *layer;
|
||||
DFBSurfacePixelFormat pixelformat;
|
||||
/* FIXME: support for multiple video layer.
|
||||
* However, I do not know any card supporting
|
||||
* more than one
|
||||
*/
|
||||
DFBDisplayLayerID vidID;
|
||||
IDirectFBDisplayLayer *vidlayer;
|
||||
|
||||
int vidIDinuse;
|
||||
|
||||
int cw;
|
||||
int ch;
|
||||
};
|
||||
|
||||
|
||||
extern void DirectFB_InitModes(_THIS);
|
||||
extern void DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display);
|
||||
extern int DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
|
||||
extern void DirectFB_QuitModes(_THIS);
|
||||
|
||||
extern void DirectFB_SetContext(_THIS, SDL_Window *window);
|
||||
|
||||
#endif /* _SDL_directfb_modes_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
394
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.c
Normal file
394
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.c
Normal file
|
|
@ -0,0 +1,394 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_assert.h"
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_mouse.h"
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "../../events/SDL_mouse_c.h"
|
||||
|
||||
static SDL_Cursor *DirectFB_CreateDefaultCursor(void);
|
||||
static SDL_Cursor *DirectFB_CreateCursor(SDL_Surface * surface,
|
||||
int hot_x, int hot_y);
|
||||
static int DirectFB_ShowCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_MoveCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_FreeCursor(SDL_Cursor * cursor);
|
||||
static void DirectFB_WarpMouse(SDL_Window * window, int x, int y);
|
||||
static void DirectFB_FreeMouse(SDL_Mouse * mouse);
|
||||
|
||||
static const char *arrow[] = {
|
||||
/* pixels */
|
||||
"X ",
|
||||
"XX ",
|
||||
"X.X ",
|
||||
"X..X ",
|
||||
"X...X ",
|
||||
"X....X ",
|
||||
"X.....X ",
|
||||
"X......X ",
|
||||
"X.......X ",
|
||||
"X........X ",
|
||||
"X.....XXXXX ",
|
||||
"X..X..X ",
|
||||
"X.X X..X ",
|
||||
"XX X..X ",
|
||||
"X X..X ",
|
||||
" X..X ",
|
||||
" X..X ",
|
||||
" X..X ",
|
||||
" XX ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
};
|
||||
|
||||
static SDL_Cursor *
|
||||
DirectFB_CreateDefaultCursor(void)
|
||||
{
|
||||
SDL_VideoDevice *dev = SDL_GetVideoDevice();
|
||||
|
||||
SDL_DFB_DEVICEDATA(dev);
|
||||
DFB_CursorData *curdata;
|
||||
DFBResult ret;
|
||||
DFBSurfaceDescription dsc;
|
||||
SDL_Cursor *cursor;
|
||||
Uint32 *dest;
|
||||
Uint32 *p;
|
||||
int pitch, i, j;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR( cursor, sizeof(*cursor));
|
||||
SDL_DFB_ALLOC_CLEAR(curdata, sizeof(*curdata));
|
||||
|
||||
dsc.flags =
|
||||
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
|
||||
dsc.caps = DSCAPS_VIDEOONLY;
|
||||
dsc.width = 32;
|
||||
dsc.height = 32;
|
||||
dsc.pixelformat = DSPF_ARGB;
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
|
||||
&curdata->surf));
|
||||
curdata->hotx = 0;
|
||||
curdata->hoty = 0;
|
||||
cursor->driverdata = curdata;
|
||||
|
||||
SDL_DFB_CHECKERR(curdata->surf->Lock(curdata->surf, DSLF_WRITE,
|
||||
(void *) &dest, &pitch));
|
||||
|
||||
/* Relies on the fact that this is only called with ARGB surface. */
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
for (j = 0; j < 32; j++)
|
||||
{
|
||||
switch (arrow[i][j])
|
||||
{
|
||||
case ' ': dest[j] = 0x00000000; break;
|
||||
case '.': dest[j] = 0xffffffff; break;
|
||||
case 'X': dest[j] = 0xff000000; break;
|
||||
}
|
||||
}
|
||||
dest += (pitch >> 2);
|
||||
}
|
||||
|
||||
curdata->surf->Unlock(curdata->surf);
|
||||
return cursor;
|
||||
error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create a cursor from a surface */
|
||||
static SDL_Cursor *
|
||||
DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
|
||||
{
|
||||
SDL_VideoDevice *dev = SDL_GetVideoDevice();
|
||||
|
||||
SDL_DFB_DEVICEDATA(dev);
|
||||
DFB_CursorData *curdata;
|
||||
DFBResult ret;
|
||||
DFBSurfaceDescription dsc;
|
||||
SDL_Cursor *cursor;
|
||||
Uint32 *dest;
|
||||
Uint32 *p;
|
||||
int pitch, i;
|
||||
|
||||
SDL_assert(surface->format->format == SDL_PIXELFORMAT_ARGB8888);
|
||||
SDL_assert(surface->pitch == surface->w * 4);
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR( cursor, sizeof(*cursor));
|
||||
SDL_DFB_ALLOC_CLEAR(curdata, sizeof(*curdata));
|
||||
|
||||
dsc.flags =
|
||||
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
|
||||
dsc.caps = DSCAPS_VIDEOONLY;
|
||||
dsc.width = surface->w;
|
||||
dsc.height = surface->h;
|
||||
dsc.pixelformat = DSPF_ARGB;
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
|
||||
&curdata->surf));
|
||||
curdata->hotx = hot_x;
|
||||
curdata->hoty = hot_y;
|
||||
cursor->driverdata = curdata;
|
||||
|
||||
SDL_DFB_CHECKERR(curdata->surf->Lock(curdata->surf, DSLF_WRITE,
|
||||
(void *) &dest, &pitch));
|
||||
|
||||
p = surface->pixels;
|
||||
for (i = 0; i < surface->h; i++)
|
||||
memcpy((char *) dest + i * pitch,
|
||||
(char *) p + i * surface->pitch, 4 * surface->w);
|
||||
|
||||
curdata->surf->Unlock(curdata->surf);
|
||||
return cursor;
|
||||
error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Show the specified cursor, or hide if cursor is NULL */
|
||||
static int
|
||||
DirectFB_ShowCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
SDL_DFB_CURSORDATA(cursor);
|
||||
DFBResult ret;
|
||||
SDL_Window *window;
|
||||
|
||||
window = SDL_GetFocusWindow();
|
||||
if (!window)
|
||||
return -1;
|
||||
else {
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
|
||||
if (display) {
|
||||
DFB_DisplayData *dispdata =
|
||||
(DFB_DisplayData *) display->driverdata;
|
||||
DFB_WindowData *windata = (DFB_WindowData *) window->driverdata;
|
||||
|
||||
if (cursor)
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->
|
||||
SetCursorShape(windata->dfbwin,
|
||||
curdata->surf, curdata->hotx,
|
||||
curdata->hoty));
|
||||
|
||||
SDL_DFB_CHECKERR(dispdata->layer->
|
||||
SetCooperativeLevel(dispdata->layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
SDL_DFB_CHECKERR(dispdata->layer->
|
||||
SetCursorOpacity(dispdata->layer,
|
||||
cursor ? 0xC0 : 0x00));
|
||||
SDL_DFB_CHECKERR(dispdata->layer->
|
||||
SetCooperativeLevel(dispdata->layer,
|
||||
DLSCL_SHARED));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Free a window manager cursor */
|
||||
static void
|
||||
DirectFB_FreeCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
SDL_DFB_CURSORDATA(cursor);
|
||||
|
||||
SDL_DFB_RELEASE(curdata->surf);
|
||||
SDL_DFB_FREE(cursor->driverdata);
|
||||
SDL_DFB_FREE(cursor);
|
||||
}
|
||||
|
||||
/* Warp the mouse to (x,y) */
|
||||
static void
|
||||
DirectFB_WarpMouse(SDL_Window * window, int x, int y)
|
||||
{
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
DFB_WindowData *windata = (DFB_WindowData *) window->driverdata;
|
||||
DFBResult ret;
|
||||
int cx, cy;
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->GetPosition(windata->dfbwin, &cx, &cy));
|
||||
SDL_DFB_CHECKERR(dispdata->layer->WarpCursor(dispdata->layer,
|
||||
cx + x + windata->client.x,
|
||||
cy + y + windata->client.y));
|
||||
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
#if USE_MULTI_API
|
||||
|
||||
static void DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_Window * window,
|
||||
int x, int y);
|
||||
|
||||
static int id_mask;
|
||||
|
||||
static DFBEnumerationResult
|
||||
EnumMice(DFBInputDeviceID device_id, DFBInputDeviceDescription desc,
|
||||
void *callbackdata)
|
||||
{
|
||||
DFB_DeviceData *devdata = callbackdata;
|
||||
|
||||
if ((desc.type & DIDTF_MOUSE) && (device_id & id_mask)) {
|
||||
SDL_Mouse mouse;
|
||||
|
||||
SDL_zero(mouse);
|
||||
mouse.id = device_id;
|
||||
mouse.CreateCursor = DirectFB_CreateCursor;
|
||||
mouse.ShowCursor = DirectFB_ShowCursor;
|
||||
mouse.MoveCursor = DirectFB_MoveCursor;
|
||||
mouse.FreeCursor = DirectFB_FreeCursor;
|
||||
mouse.WarpMouse = DirectFB_WarpMouse;
|
||||
mouse.FreeMouse = DirectFB_FreeMouse;
|
||||
mouse.cursor_shown = 1;
|
||||
|
||||
SDL_AddMouse(&mouse, desc.name, 0, 0, 1);
|
||||
devdata->mouse_id[devdata->num_mice++] = device_id;
|
||||
}
|
||||
return DFENUM_OK;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_InitMouse(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
|
||||
devdata->num_mice = 0;
|
||||
if (devdata->use_linux_input) {
|
||||
/* try non-core devices first */
|
||||
id_mask = 0xF0;
|
||||
devdata->dfb->EnumInputDevices(devdata->dfb, EnumMice, devdata);
|
||||
if (devdata->num_mice == 0) {
|
||||
/* try core devices */
|
||||
id_mask = 0x0F;
|
||||
devdata->dfb->EnumInputDevices(devdata->dfb, EnumMice, devdata);
|
||||
}
|
||||
}
|
||||
if (devdata->num_mice == 0) {
|
||||
SDL_Mouse mouse;
|
||||
|
||||
SDL_zero(mouse);
|
||||
mouse.CreateCursor = DirectFB_CreateCursor;
|
||||
mouse.ShowCursor = DirectFB_ShowCursor;
|
||||
mouse.MoveCursor = DirectFB_MoveCursor;
|
||||
mouse.FreeCursor = DirectFB_FreeCursor;
|
||||
mouse.WarpMouse = DirectFB_WarpMouse;
|
||||
mouse.FreeMouse = DirectFB_FreeMouse;
|
||||
mouse.cursor_shown = 1;
|
||||
|
||||
SDL_AddMouse(&mouse, "Mouse", 0, 0, 1);
|
||||
devdata->num_mice = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_QuitMouse(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
|
||||
if (devdata->use_linux_input) {
|
||||
SDL_MouseQuit();
|
||||
} else {
|
||||
SDL_DelMouse(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* This is called when a mouse motion event occurs */
|
||||
static void
|
||||
DirectFB_MoveCursor(SDL_Cursor * cursor)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/* Warp the mouse to (x,y) */
|
||||
static void
|
||||
DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_Window * window, int x, int y)
|
||||
{
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
|
||||
DFB_WindowData *windata = (DFB_WindowData *) window->driverdata;
|
||||
DFBResult ret;
|
||||
int cx, cy;
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->GetPosition(windata->dfbwin, &cx, &cy));
|
||||
SDL_DFB_CHECKERR(dispdata->layer->WarpCursor(dispdata->layer,
|
||||
cx + x + windata->client.x,
|
||||
cy + y + windata->client.y));
|
||||
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
/* Free the mouse when it's time */
|
||||
static void
|
||||
DirectFB_FreeMouse(SDL_Mouse * mouse)
|
||||
{
|
||||
/* nothing yet */
|
||||
}
|
||||
|
||||
#else /* USE_MULTI_API */
|
||||
|
||||
void
|
||||
DirectFB_InitMouse(_THIS)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
|
||||
SDL_Mouse *mouse = SDL_GetMouse();
|
||||
|
||||
mouse->CreateCursor = DirectFB_CreateCursor;
|
||||
mouse->ShowCursor = DirectFB_ShowCursor;
|
||||
mouse->WarpMouse = DirectFB_WarpMouse;
|
||||
mouse->FreeCursor = DirectFB_FreeCursor;
|
||||
|
||||
SDL_SetDefaultCursor(DirectFB_CreateDefaultCursor());
|
||||
|
||||
devdata->num_mice = 1;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_QuitMouse(_THIS)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
44
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.h
Normal file
44
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_mouse.h
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_mouse_h
|
||||
#define _SDL_DirectFB_mouse_h
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
typedef struct _DFB_CursorData DFB_CursorData;
|
||||
struct _DFB_CursorData
|
||||
{
|
||||
IDirectFBSurface *surf;
|
||||
int hotx;
|
||||
int hoty;
|
||||
};
|
||||
|
||||
#define SDL_DFB_CURSORDATA(curs) DFB_CursorData *curdata = (DFB_CursorData *) ((curs) ? (curs)->driverdata : NULL)
|
||||
|
||||
extern void DirectFB_InitMouse(_THIS);
|
||||
extern void DirectFB_QuitMouse(_THIS);
|
||||
|
||||
#endif /* _SDL_DirectFB_mouse_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
345
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.c
Normal file
345
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.c
Normal file
|
|
@ -0,0 +1,345 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
|
||||
#include "SDL_DirectFB_opengl.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
|
||||
#include <directfbgl.h>
|
||||
#include "SDL_loadso.h"
|
||||
#endif
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
|
||||
struct SDL_GLDriverData
|
||||
{
|
||||
int gl_active; /* to stop switching drivers while we have a valid context */
|
||||
int initialized;
|
||||
DirectFB_GLContext *firstgl; /* linked list */
|
||||
|
||||
/* OpenGL */
|
||||
void (*glFinish) (void);
|
||||
void (*glFlush) (void);
|
||||
};
|
||||
|
||||
#define OPENGL_REQUIRS_DLOPEN
|
||||
#if defined(OPENGL_REQUIRS_DLOPEN) && defined(SDL_LOADSO_DLOPEN)
|
||||
#include <dlfcn.h>
|
||||
#define GL_LoadObject(X) dlopen(X, (RTLD_NOW|RTLD_GLOBAL))
|
||||
#define GL_LoadFunction dlsym
|
||||
#define GL_UnloadObject dlclose
|
||||
#else
|
||||
#define GL_LoadObject SDL_LoadObject
|
||||
#define GL_LoadFunction SDL_LoadFunction
|
||||
#define GL_UnloadObject SDL_UnloadObject
|
||||
#endif
|
||||
|
||||
static void DirectFB_GL_UnloadLibrary(_THIS);
|
||||
|
||||
int
|
||||
DirectFB_GL_Initialize(_THIS)
|
||||
{
|
||||
if (_this->gl_data) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
_this->gl_data =
|
||||
(struct SDL_GLDriverData *) SDL_calloc(1,
|
||||
sizeof(struct
|
||||
SDL_GLDriverData));
|
||||
if (!_this->gl_data) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
_this->gl_data->initialized = 0;
|
||||
|
||||
++_this->gl_data->initialized;
|
||||
_this->gl_data->firstgl = NULL;
|
||||
|
||||
if (DirectFB_GL_LoadLibrary(_this, NULL) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Initialize extensions */
|
||||
/* FIXME needed?
|
||||
* X11_GL_InitExtensions(_this);
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_Shutdown(_THIS)
|
||||
{
|
||||
if (!_this->gl_data || (--_this->gl_data->initialized > 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
DirectFB_GL_UnloadLibrary(_this);
|
||||
|
||||
SDL_free(_this->gl_data);
|
||||
_this->gl_data = NULL;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_GL_LoadLibrary(_THIS, const char *path)
|
||||
{
|
||||
void *handle = NULL;
|
||||
|
||||
SDL_DFB_DEBUG("Loadlibrary : %s\n", path);
|
||||
|
||||
if (_this->gl_data->gl_active) {
|
||||
return SDL_SetError("OpenGL context already created");
|
||||
}
|
||||
|
||||
|
||||
if (path == NULL) {
|
||||
path = SDL_getenv("SDL_VIDEO_GL_DRIVER");
|
||||
if (path == NULL) {
|
||||
path = "libGL.so";
|
||||
}
|
||||
}
|
||||
|
||||
handle = GL_LoadObject(path);
|
||||
if (handle == NULL) {
|
||||
SDL_DFB_ERR("Library not found: %s\n", path);
|
||||
/* SDL_LoadObject() will call SDL_SetError() for us. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
SDL_DFB_DEBUG("Loaded library: %s\n", path);
|
||||
|
||||
_this->gl_config.dll_handle = handle;
|
||||
_this->gl_config.driver_loaded = 1;
|
||||
if (path) {
|
||||
SDL_strlcpy(_this->gl_config.driver_path, path,
|
||||
SDL_arraysize(_this->gl_config.driver_path));
|
||||
} else {
|
||||
*_this->gl_config.driver_path = '\0';
|
||||
}
|
||||
|
||||
_this->gl_data->glFinish = DirectFB_GL_GetProcAddress(_this, "glFinish");
|
||||
_this->gl_data->glFlush = DirectFB_GL_GetProcAddress(_this, "glFlush");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
DirectFB_GL_UnloadLibrary(_THIS)
|
||||
{
|
||||
#if 0
|
||||
int ret;
|
||||
|
||||
if (_this->gl_config.driver_loaded) {
|
||||
|
||||
ret = GL_UnloadObject(_this->gl_config.dll_handle);
|
||||
if (ret)
|
||||
SDL_DFB_ERR("Error #%d trying to unload library.\n", ret);
|
||||
_this->gl_config.dll_handle = NULL;
|
||||
_this->gl_config.driver_loaded = 0;
|
||||
}
|
||||
#endif
|
||||
/* Free OpenGL memory */
|
||||
SDL_free(_this->gl_data);
|
||||
_this->gl_data = NULL;
|
||||
}
|
||||
|
||||
void *
|
||||
DirectFB_GL_GetProcAddress(_THIS, const char *proc)
|
||||
{
|
||||
void *handle;
|
||||
|
||||
handle = _this->gl_config.dll_handle;
|
||||
return GL_LoadFunction(handle, proc);
|
||||
}
|
||||
|
||||
SDL_GLContext
|
||||
DirectFB_GL_CreateContext(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DirectFB_GLContext *context;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(context, sizeof(DirectFB_GLContext));
|
||||
|
||||
SDL_DFB_CHECKERR(windata->surface->GetGL(windata->surface,
|
||||
&context->context));
|
||||
|
||||
if (!context->context)
|
||||
return NULL;
|
||||
|
||||
context->is_locked = 0;
|
||||
context->sdl_window = window;
|
||||
|
||||
context->next = _this->gl_data->firstgl;
|
||||
_this->gl_data->firstgl = context;
|
||||
|
||||
SDL_DFB_CHECK(context->context->Unlock(context->context));
|
||||
|
||||
if (DirectFB_GL_MakeCurrent(_this, window, context) < 0) {
|
||||
DirectFB_GL_DeleteContext(_this, context);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return context;
|
||||
|
||||
error:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
|
||||
{
|
||||
DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
for (p = _this->gl_data->firstgl; p; p = p->next)
|
||||
{
|
||||
if (p->is_locked) {
|
||||
SDL_DFB_CHECKERR(p->context->Unlock(p->context));
|
||||
p->is_locked = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (ctx != NULL) {
|
||||
SDL_DFB_CHECKERR(ctx->context->Lock(ctx->context));
|
||||
ctx->is_locked = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_GL_SetSwapInterval(_THIS, int interval)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_GL_GetSwapInterval(_THIS)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_SwapWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFBRegion region;
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
region.x1 = 0;
|
||||
region.y1 = 0;
|
||||
region.x2 = window->w;
|
||||
region.y2 = window->h;
|
||||
|
||||
#if 0
|
||||
if (devdata->glFinish)
|
||||
devdata->glFinish();
|
||||
else if (devdata->glFlush)
|
||||
devdata->glFlush();
|
||||
#endif
|
||||
|
||||
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
|
||||
if (p->sdl_window == window && p->is_locked)
|
||||
{
|
||||
SDL_DFB_CHECKERR(p->context->Unlock(p->context));
|
||||
p->is_locked = 0;
|
||||
}
|
||||
|
||||
SDL_DFB_CHECKERR(windata->window_surface->Flip(windata->window_surface,NULL, DSFLIP_PIPELINE |DSFLIP_BLIT | DSFLIP_ONSYNC ));
|
||||
return;
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context)
|
||||
{
|
||||
DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
if (ctx->is_locked)
|
||||
SDL_DFB_CHECK(ctx->context->Unlock(ctx->context));
|
||||
SDL_DFB_RELEASE(ctx->context);
|
||||
|
||||
for (p = _this->gl_data->firstgl; p && p->next != ctx; p = p->next)
|
||||
;
|
||||
if (p)
|
||||
p->next = ctx->next;
|
||||
else
|
||||
_this->gl_data->firstgl = ctx->next;
|
||||
|
||||
SDL_DFB_FREE(ctx);
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window)
|
||||
{
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
|
||||
if (p->sdl_window == window)
|
||||
{
|
||||
if (p->is_locked)
|
||||
SDL_DFB_CHECK(p->context->Unlock(p->context));
|
||||
SDL_DFB_RELEASE(p->context);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window)
|
||||
{
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
|
||||
if (p->sdl_window == window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
SDL_DFB_CHECK(windata->surface->GetGL(windata->surface,
|
||||
&p->context));
|
||||
if (p->is_locked)
|
||||
SDL_DFB_CHECK(p->context->Lock(p->context));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window)
|
||||
{
|
||||
DirectFB_GLContext *p;
|
||||
|
||||
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
|
||||
if (p->sdl_window == window)
|
||||
DirectFB_GL_DeleteContext(_this, p);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
64
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.h
Normal file
64
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_opengl.h
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _SDL_directfb_opengl_h
|
||||
#define _SDL_directfb_opengl_h
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
|
||||
#include "SDL_opengl.h"
|
||||
|
||||
typedef struct _DirectFB_GLContext DirectFB_GLContext;
|
||||
struct _DirectFB_GLContext
|
||||
{
|
||||
IDirectFBGL *context;
|
||||
DirectFB_GLContext *next;
|
||||
|
||||
SDL_Window *sdl_window;
|
||||
int is_locked;
|
||||
};
|
||||
|
||||
/* OpenGL functions */
|
||||
extern int DirectFB_GL_Initialize(_THIS);
|
||||
extern void DirectFB_GL_Shutdown(_THIS);
|
||||
|
||||
extern int DirectFB_GL_LoadLibrary(_THIS, const char *path);
|
||||
extern void *DirectFB_GL_GetProcAddress(_THIS, const char *proc);
|
||||
extern SDL_GLContext DirectFB_GL_CreateContext(_THIS, SDL_Window * window);
|
||||
extern int DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window,
|
||||
SDL_GLContext context);
|
||||
extern int DirectFB_GL_SetSwapInterval(_THIS, int interval);
|
||||
extern int DirectFB_GL_GetSwapInterval(_THIS);
|
||||
extern void DirectFB_GL_SwapWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context);
|
||||
|
||||
extern void DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window);
|
||||
|
||||
#endif /* SDL_DIRECTFB_OPENGL */
|
||||
|
||||
#endif /* _SDL_directfb_opengl_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
1328
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.c
Normal file
1328
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.c
Normal file
File diff suppressed because it is too large
Load diff
25
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.h
Normal file
25
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_render.h
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
|
||||
/* SDL surface based renderer implementation */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
134
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.c
Normal file
134
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.c
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_assert.h"
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_shape.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
|
||||
#include "../SDL_shape_internals.h"
|
||||
|
||||
SDL_Window*
|
||||
DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags) {
|
||||
return SDL_CreateWindow(title,x,y,w,h,flags /* | SDL_DFB_WINDOW_SHAPED */);
|
||||
}
|
||||
|
||||
SDL_WindowShaper*
|
||||
DirectFB_CreateShaper(SDL_Window* window) {
|
||||
SDL_WindowShaper* result = NULL;
|
||||
|
||||
result = malloc(sizeof(SDL_WindowShaper));
|
||||
result->window = window;
|
||||
result->mode.mode = ShapeModeDefault;
|
||||
result->mode.parameters.binarizationCutoff = 1;
|
||||
result->userx = result->usery = 0;
|
||||
SDL_ShapeData* data = SDL_malloc(sizeof(SDL_ShapeData));
|
||||
result->driverdata = data;
|
||||
data->surface = NULL;
|
||||
window->shaper = result;
|
||||
int resized_properly = DirectFB_ResizeWindowShape(window);
|
||||
SDL_assert(resized_properly == 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_ResizeWindowShape(SDL_Window* window) {
|
||||
SDL_ShapeData* data = window->shaper->driverdata;
|
||||
SDL_assert(data != NULL);
|
||||
|
||||
if (window->x != -1000)
|
||||
{
|
||||
window->shaper->userx = window->x;
|
||||
window->shaper->usery = window->y;
|
||||
}
|
||||
SDL_SetWindowPosition(window,-1000,-1000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode) {
|
||||
|
||||
if(shaper == NULL || shape == NULL || shaper->driverdata == NULL)
|
||||
return -1;
|
||||
if(shape->format->Amask == 0 && SDL_SHAPEMODEALPHA(shape_mode->mode))
|
||||
return -2;
|
||||
if(shape->w != shaper->window->w || shape->h != shaper->window->h)
|
||||
return -3;
|
||||
|
||||
{
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(shaper->window);
|
||||
SDL_DFB_DEVICEDATA(display->device);
|
||||
Uint32 *pixels;
|
||||
Sint32 pitch;
|
||||
Uint32 h,w;
|
||||
Uint8 *src, *bitmap;
|
||||
DFBSurfaceDescription dsc;
|
||||
|
||||
SDL_ShapeData *data = shaper->driverdata;
|
||||
|
||||
SDL_DFB_RELEASE(data->surface);
|
||||
|
||||
dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
|
||||
dsc.width = shape->w;
|
||||
dsc.height = shape->h;
|
||||
dsc.caps = DSCAPS_PREMULTIPLIED;
|
||||
dsc.pixelformat = DSPF_ARGB;
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc, &data->surface));
|
||||
|
||||
/* Assume that shaper->alphacutoff already has a value, because SDL_SetWindowShape() should have given it one. */
|
||||
SDL_DFB_ALLOC_CLEAR(bitmap, shape->w * shape->h);
|
||||
SDL_CalculateShapeBitmap(shaper->mode,shape,bitmap,1);
|
||||
|
||||
src = bitmap;
|
||||
|
||||
SDL_DFB_CHECK(data->surface->Lock(data->surface, DSLF_WRITE | DSLF_READ, (void **) &pixels, &pitch));
|
||||
|
||||
h = shaper->window->h;
|
||||
while (h--) {
|
||||
for (w = 0; w < shaper->window->w; w++) {
|
||||
if (*src)
|
||||
pixels[w] = 0xFFFFFFFF;
|
||||
else
|
||||
pixels[w] = 0;
|
||||
src++;
|
||||
|
||||
}
|
||||
pixels += (pitch >> 2);
|
||||
}
|
||||
SDL_DFB_CHECK(data->surface->Unlock(data->surface));
|
||||
SDL_DFB_FREE(bitmap);
|
||||
|
||||
/* FIXME: Need to call this here - Big ?? */
|
||||
DirectFB_WM_RedrawLayout(SDL_GetDisplayForWindow(shaper->window)->device, shaper->window);
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
39
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.h
Normal file
39
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_shape.h
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_DirectFB_shape_h
|
||||
#define _SDL_DirectFB_shape_h
|
||||
|
||||
#include <directfb.h>
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "SDL_shape.h"
|
||||
|
||||
typedef struct {
|
||||
IDirectFBSurface *surface;
|
||||
} SDL_ShapeData;
|
||||
|
||||
extern SDL_Window* DirectFB_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags);
|
||||
extern SDL_WindowShaper* DirectFB_CreateShaper(SDL_Window* window);
|
||||
extern int DirectFB_ResizeWindowShape(SDL_Window* window);
|
||||
extern int DirectFB_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shapeMode);
|
||||
|
||||
#endif /* _SDL_DirectFB_shape_h */
|
||||
424
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.c
Normal file
424
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.c
Normal file
|
|
@ -0,0 +1,424 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
|
||||
#include "SDL_DirectFB_events.h"
|
||||
/*
|
||||
* #include "SDL_DirectFB_keyboard.h"
|
||||
*/
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
#include "SDL_DirectFB_mouse.h"
|
||||
#include "SDL_DirectFB_opengl.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
#include "SDL_DirectFB_WM.h"
|
||||
|
||||
|
||||
/* DirectFB video driver implementation.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfb_version.h>
|
||||
#include <directfb_strings.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_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_events.h"
|
||||
#include "SDL_DirectFB_render.h"
|
||||
#include "SDL_DirectFB_mouse.h"
|
||||
#include "SDL_DirectFB_shape.h"
|
||||
|
||||
|
||||
#include "SDL_DirectFB_dyn.h"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int DirectFB_VideoInit(_THIS);
|
||||
static void DirectFB_VideoQuit(_THIS);
|
||||
|
||||
static int DirectFB_Available(void);
|
||||
static SDL_VideoDevice *DirectFB_CreateDevice(int devindex);
|
||||
|
||||
VideoBootStrap DirectFB_bootstrap = {
|
||||
"directfb", "DirectFB",
|
||||
DirectFB_Available, DirectFB_CreateDevice
|
||||
};
|
||||
|
||||
static const DirectFBSurfaceDrawingFlagsNames(drawing_flags);
|
||||
static const DirectFBSurfaceBlittingFlagsNames(blitting_flags);
|
||||
static const DirectFBAccelerationMaskNames(acceleration_mask);
|
||||
|
||||
/* DirectFB driver bootstrap functions */
|
||||
|
||||
static int
|
||||
DirectFB_Available(void)
|
||||
{
|
||||
if (!SDL_DirectFB_LoadLibrary())
|
||||
return 0;
|
||||
SDL_DirectFB_UnLoadLibrary();
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
DirectFB_DeleteDevice(SDL_VideoDevice * device)
|
||||
{
|
||||
SDL_DirectFB_UnLoadLibrary();
|
||||
SDL_DFB_FREE(device->driverdata);
|
||||
SDL_DFB_FREE(device);
|
||||
}
|
||||
|
||||
static SDL_VideoDevice *
|
||||
DirectFB_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_VideoDevice *device;
|
||||
|
||||
if (!SDL_DirectFB_LoadLibrary()) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
SDL_DFB_ALLOC_CLEAR(device, sizeof(SDL_VideoDevice));
|
||||
|
||||
/* Set the function pointers */
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = DirectFB_VideoInit;
|
||||
device->VideoQuit = DirectFB_VideoQuit;
|
||||
device->GetDisplayModes = DirectFB_GetDisplayModes;
|
||||
device->SetDisplayMode = DirectFB_SetDisplayMode;
|
||||
device->PumpEvents = DirectFB_PumpEventsWindow;
|
||||
device->CreateWindow = DirectFB_CreateWindow;
|
||||
device->CreateWindowFrom = DirectFB_CreateWindowFrom;
|
||||
device->SetWindowTitle = DirectFB_SetWindowTitle;
|
||||
device->SetWindowIcon = DirectFB_SetWindowIcon;
|
||||
device->SetWindowPosition = DirectFB_SetWindowPosition;
|
||||
device->SetWindowSize = DirectFB_SetWindowSize;
|
||||
device->ShowWindow = DirectFB_ShowWindow;
|
||||
device->HideWindow = DirectFB_HideWindow;
|
||||
device->RaiseWindow = DirectFB_RaiseWindow;
|
||||
device->MaximizeWindow = DirectFB_MaximizeWindow;
|
||||
device->MinimizeWindow = DirectFB_MinimizeWindow;
|
||||
device->RestoreWindow = DirectFB_RestoreWindow;
|
||||
device->SetWindowGrab = DirectFB_SetWindowGrab;
|
||||
device->DestroyWindow = DirectFB_DestroyWindow;
|
||||
device->GetWindowWMInfo = DirectFB_GetWindowWMInfo;
|
||||
|
||||
/* !!! FIXME: implement SetWindowBordered */
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
device->GL_LoadLibrary = DirectFB_GL_LoadLibrary;
|
||||
device->GL_GetProcAddress = DirectFB_GL_GetProcAddress;
|
||||
device->GL_MakeCurrent = DirectFB_GL_MakeCurrent;
|
||||
|
||||
device->GL_CreateContext = DirectFB_GL_CreateContext;
|
||||
device->GL_SetSwapInterval = DirectFB_GL_SetSwapInterval;
|
||||
device->GL_GetSwapInterval = DirectFB_GL_GetSwapInterval;
|
||||
device->GL_SwapWindow = DirectFB_GL_SwapWindow;
|
||||
device->GL_DeleteContext = DirectFB_GL_DeleteContext;
|
||||
|
||||
#endif
|
||||
|
||||
/* Shaped window support */
|
||||
device->shape_driver.CreateShaper = DirectFB_CreateShaper;
|
||||
device->shape_driver.SetWindowShape = DirectFB_SetWindowShape;
|
||||
device->shape_driver.ResizeWindowShape = DirectFB_ResizeWindowShape;
|
||||
|
||||
device->free = DirectFB_DeleteDevice;
|
||||
|
||||
return device;
|
||||
error:
|
||||
if (device)
|
||||
free(device);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
DirectFB_DeviceInformation(IDirectFB * dfb)
|
||||
{
|
||||
DFBGraphicsDeviceDescription desc;
|
||||
int n;
|
||||
|
||||
dfb->GetDeviceDescription(dfb, &desc);
|
||||
|
||||
SDL_DFB_LOG( "DirectFB Device Information");
|
||||
SDL_DFB_LOG( "===========================");
|
||||
SDL_DFB_LOG( "Name: %s", desc.name);
|
||||
SDL_DFB_LOG( "Vendor: %s", desc.vendor);
|
||||
SDL_DFB_LOG( "Driver Name: %s", desc.driver.name);
|
||||
SDL_DFB_LOG( "Driver Vendor: %s", desc.driver.vendor);
|
||||
SDL_DFB_LOG( "Driver Version: %d.%d", desc.driver.major,
|
||||
desc.driver.minor);
|
||||
|
||||
SDL_DFB_LOG( "Video memoory: %d", desc.video_memory);
|
||||
|
||||
SDL_DFB_LOG( "Blitting flags:");
|
||||
for (n = 0; blitting_flags[n].flag; n++) {
|
||||
if (desc.blitting_flags & blitting_flags[n].flag)
|
||||
SDL_DFB_LOG( " %s", blitting_flags[n].name);
|
||||
}
|
||||
|
||||
SDL_DFB_LOG( "Drawing flags:");
|
||||
for (n = 0; drawing_flags[n].flag; n++) {
|
||||
if (desc.drawing_flags & drawing_flags[n].flag)
|
||||
SDL_DFB_LOG( " %s", drawing_flags[n].name);
|
||||
}
|
||||
|
||||
|
||||
SDL_DFB_LOG( "Acceleration flags:");
|
||||
for (n = 0; acceleration_mask[n].mask; n++) {
|
||||
if (desc.acceleration_mask & acceleration_mask[n].mask)
|
||||
SDL_DFB_LOG( " %s", acceleration_mask[n].name);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static int readBoolEnv(const char *env_name, int def_val)
|
||||
{
|
||||
char *stemp;
|
||||
|
||||
stemp = SDL_getenv(env_name);
|
||||
if (stemp)
|
||||
return atoi(stemp);
|
||||
else
|
||||
return def_val;
|
||||
}
|
||||
|
||||
static int
|
||||
DirectFB_VideoInit(_THIS)
|
||||
{
|
||||
IDirectFB *dfb = NULL;
|
||||
DFB_DeviceData *devdata = NULL;
|
||||
DFBResult ret;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(devdata, sizeof(*devdata));
|
||||
|
||||
SDL_DFB_CHECKERR(DirectFBInit(NULL, NULL));
|
||||
|
||||
/* avoid switching to the framebuffer when we
|
||||
* are running X11 */
|
||||
ret = readBoolEnv(DFBENV_USE_X11_CHECK , 1);
|
||||
if (ret) {
|
||||
if (SDL_getenv("DISPLAY"))
|
||||
DirectFBSetOption("system", "x11");
|
||||
else
|
||||
DirectFBSetOption("disable-module", "x11input");
|
||||
}
|
||||
|
||||
/* FIXME: Reenable as default once multi kbd/mouse interface is sorted out */
|
||||
devdata->use_linux_input = readBoolEnv(DFBENV_USE_LINUX_INPUT, 0); /* default: on */
|
||||
|
||||
if (!devdata->use_linux_input)
|
||||
{
|
||||
SDL_DFB_LOG("Disabling linxu input\n");
|
||||
DirectFBSetOption("disable-module", "linux_input");
|
||||
}
|
||||
|
||||
SDL_DFB_CHECKERR(DirectFBCreate(&dfb));
|
||||
|
||||
DirectFB_DeviceInformation(dfb);
|
||||
|
||||
devdata->use_yuv_underlays = readBoolEnv(DFBENV_USE_YUV_UNDERLAY, 0); /* default: off */
|
||||
devdata->use_yuv_direct = readBoolEnv(DFBENV_USE_YUV_DIRECT, 0); /* default is off! */
|
||||
|
||||
/* Create global Eventbuffer for axis events */
|
||||
if (devdata->use_linux_input) {
|
||||
SDL_DFB_CHECKERR(dfb->CreateInputEventBuffer(dfb, DICAPS_ALL,
|
||||
DFB_TRUE,
|
||||
&devdata->events));
|
||||
} else {
|
||||
SDL_DFB_CHECKERR(dfb->CreateInputEventBuffer(dfb, DICAPS_AXES
|
||||
/* DICAPS_ALL */ ,
|
||||
DFB_TRUE,
|
||||
&devdata->events));
|
||||
}
|
||||
|
||||
/* simple window manager support */
|
||||
devdata->has_own_wm = readBoolEnv(DFBENV_USE_WM, 0);
|
||||
|
||||
devdata->initialized = 1;
|
||||
|
||||
devdata->dfb = dfb;
|
||||
devdata->firstwin = NULL;
|
||||
devdata->grabbed_window = NULL;
|
||||
|
||||
_this->driverdata = devdata;
|
||||
|
||||
DirectFB_InitModes(_this);
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
DirectFB_GL_Initialize(_this);
|
||||
#endif
|
||||
|
||||
DirectFB_InitMouse(_this);
|
||||
DirectFB_InitKeyboard(_this);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
error:
|
||||
SDL_DFB_FREE(devdata);
|
||||
SDL_DFB_RELEASE(dfb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
DirectFB_VideoQuit(_THIS)
|
||||
{
|
||||
DFB_DeviceData *devdata = (DFB_DeviceData *) _this->driverdata;
|
||||
|
||||
DirectFB_QuitModes(_this);
|
||||
DirectFB_QuitKeyboard(_this);
|
||||
DirectFB_QuitMouse(_this);
|
||||
|
||||
devdata->events->Reset(devdata->events);
|
||||
SDL_DFB_RELEASE(devdata->events);
|
||||
SDL_DFB_RELEASE(devdata->dfb);
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
DirectFB_GL_Shutdown(_this);
|
||||
#endif
|
||||
|
||||
devdata->initialized = 0;
|
||||
}
|
||||
|
||||
/* DirectFB driver general support functions */
|
||||
|
||||
static const struct {
|
||||
DFBSurfacePixelFormat dfb;
|
||||
Uint32 sdl;
|
||||
} pixelformat_tab[] =
|
||||
{
|
||||
{ DSPF_RGB32, SDL_PIXELFORMAT_RGB888 }, /* 24 bit RGB (4 byte, nothing@24, red 8@16, green 8@8, blue 8@0) */
|
||||
{ DSPF_ARGB, SDL_PIXELFORMAT_ARGB8888 }, /* 32 bit ARGB (4 byte, alpha 8@24, red 8@16, green 8@8, blue 8@0) */
|
||||
{ DSPF_RGB16, SDL_PIXELFORMAT_RGB565 }, /* 16 bit RGB (2 byte, red 5@11, green 6@5, blue 5@0) */
|
||||
{ DSPF_RGB332, SDL_PIXELFORMAT_RGB332 }, /* 8 bit RGB (1 byte, red 3@5, green 3@2, blue 2@0) */
|
||||
{ DSPF_ARGB4444, SDL_PIXELFORMAT_ARGB4444 }, /* 16 bit ARGB (2 byte, alpha 4@12, red 4@8, green 4@4, blue 4@0) */
|
||||
{ DSPF_ARGB1555, SDL_PIXELFORMAT_ARGB1555 }, /* 16 bit ARGB (2 byte, alpha 1@15, red 5@10, green 5@5, blue 5@0) */
|
||||
{ DSPF_RGB24, SDL_PIXELFORMAT_RGB24 }, /* 24 bit RGB (3 byte, red 8@16, green 8@8, blue 8@0) */
|
||||
{ DSPF_RGB444, SDL_PIXELFORMAT_RGB444 }, /* 16 bit RGB (2 byte, nothing @12, red 4@8, green 4@4, blue 4@0) */
|
||||
{ DSPF_YV12, SDL_PIXELFORMAT_YV12 }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size V/U planes) */
|
||||
{ DSPF_I420,SDL_PIXELFORMAT_IYUV }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size U/V planes) */
|
||||
{ DSPF_YUY2, SDL_PIXELFORMAT_YUY2 }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains CbYCrY [31:0]) */
|
||||
{ DSPF_UYVY, SDL_PIXELFORMAT_UYVY }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains YCbYCr [31:0]) */
|
||||
{ DSPF_RGB555, SDL_PIXELFORMAT_RGB555 }, /* 16 bit RGB (2 byte, nothing @15, red 5@10, green 5@5, blue 5@0) */
|
||||
#if (ENABLE_LUT8)
|
||||
{ DSPF_LUT8, SDL_PIXELFORMAT_INDEX8 }, /* 8 bit LUT (8 bit color and alpha lookup from palette) */
|
||||
#endif
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,2,0))
|
||||
{ DSPF_BGR555, SDL_PIXELFORMAT_BGR555 }, /* 16 bit BGR (2 byte, nothing @15, blue 5@10, green 5@5, red 5@0) */
|
||||
#else
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR555 },
|
||||
#endif
|
||||
|
||||
/* Pfff ... nonmatching formats follow */
|
||||
|
||||
{ DSPF_ALUT44, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit ALUT (1 byte, alpha 4@4, color lookup 4@0) */
|
||||
{ DSPF_A8, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit alpha (1 byte, alpha 8@0), e.g. anti-aliased glyphs */
|
||||
{ DSPF_AiRGB, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit ARGB (4 byte, inv. alpha 8@24, red 8@16, green 8@8, blue 8@0) */
|
||||
{ DSPF_A1, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (1 byte/ 8 pixel, most significant bit used first) */
|
||||
{ DSPF_NV12, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CbCr [15:0] plane) */
|
||||
{ DSPF_NV16, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit YUV (8 bit Y plane followed by one 16 bit half width CbCr [15:0] plane) */
|
||||
{ DSPF_ARGB2554, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit ARGB (2 byte, alpha 2@14, red 5@9, green 5@4, blue 4@0) */
|
||||
{ DSPF_NV21, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CrCb [15:0] plane) */
|
||||
{ DSPF_AYUV, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AYUV (4 byte, alpha 8@24, Y 8@16, Cb 8@8, Cr 8@0) */
|
||||
{ DSPF_A4, SDL_PIXELFORMAT_UNKNOWN }, /* 4 bit alpha (1 byte/ 2 pixel, more significant nibble used first) */
|
||||
{ DSPF_ARGB1666, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (3 byte/ alpha 1@18, red 6@16, green 6@6, blue 6@0) */
|
||||
{ DSPF_ARGB6666, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit alpha (3 byte/ alpha 6@18, red 6@16, green 6@6, blue 6@0) */
|
||||
{ DSPF_RGB18, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit RGB (3 byte/ red 6@16, green 6@6, blue 6@0) */
|
||||
{ DSPF_LUT2, SDL_PIXELFORMAT_UNKNOWN }, /* 2 bit LUT (1 byte/ 4 pixel, 2 bit color and alpha lookup from palette) */
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,3,0))
|
||||
{ DSPF_RGBA4444, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 4@12, green 4@8, blue 4@4, alpha 4@0) */
|
||||
#endif
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,4,3))
|
||||
{ DSPF_RGBA5551, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 5@11, green 5@6, blue 5@1, alpha 1@0) */
|
||||
{ DSPF_YUV444P, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit full YUV planar (8 bit Y plane followed by an 8 bit Cb and an 8 bit Cr plane) */
|
||||
{ DSPF_ARGB8565, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit ARGB (3 byte, alpha 8@16, red 5@11, green 6@5, blue 5@0) */
|
||||
{ DSPF_AVYU, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AVYU 4:4:4 (4 byte, alpha 8@24, Cr 8@16, Y 8@8, Cb 8@0) */
|
||||
{ DSPF_VYU, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit VYU 4:4:4 (3 byte, Cr 8@16, Y 8@8, Cb 8@0) */
|
||||
#endif
|
||||
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1LSB },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1MSB },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4LSB },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4MSB },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR24 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR888 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_RGBA8888 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR8888 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGRA8888 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ARGB2101010 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR4444 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR1555 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR565 },
|
||||
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_YVYU }, /**< Packed mode: Y0+V0+Y1+U0 (1 pla */
|
||||
};
|
||||
|
||||
Uint32
|
||||
DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++)
|
||||
if (pixelformat_tab[i].dfb == pixelformat)
|
||||
{
|
||||
return pixelformat_tab[i].sdl;
|
||||
}
|
||||
return SDL_PIXELFORMAT_UNKNOWN;
|
||||
}
|
||||
|
||||
DFBSurfacePixelFormat
|
||||
DirectFB_SDLToDFBPixelFormat(Uint32 format)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++)
|
||||
if (pixelformat_tab[i].sdl == format)
|
||||
{
|
||||
return pixelformat_tab[i].dfb;
|
||||
}
|
||||
return DSPF_UNKNOWN;
|
||||
}
|
||||
|
||||
void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo* ri)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i=0, j=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++)
|
||||
if (pixelformat_tab[i].sdl != SDL_PIXELFORMAT_UNKNOWN)
|
||||
ri->texture_formats[j++] = pixelformat_tab[i].sdl;
|
||||
ri->num_texture_formats = j;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
170
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.h
Normal file
170
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_video.h
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_DirectFB_video_h
|
||||
#define _SDL_DirectFB_video_h
|
||||
|
||||
#include <directfb.h>
|
||||
#include <directfb_version.h>
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "SDL_scancode.h"
|
||||
#include "SDL_render.h"
|
||||
|
||||
#include "SDL_log.h"
|
||||
|
||||
#define DFB_VERSIONNUM(X, Y, Z) \
|
||||
((X)*1000 + (Y)*100 + (Z))
|
||||
|
||||
#define DFB_COMPILEDVERSION \
|
||||
DFB_VERSIONNUM(DIRECTFB_MAJOR_VERSION, DIRECTFB_MINOR_VERSION, DIRECTFB_MICRO_VERSION)
|
||||
|
||||
#define DFB_VERSION_ATLEAST(X, Y, Z) \
|
||||
(DFB_COMPILEDVERSION >= DFB_VERSIONNUM(X, Y, Z))
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,0,0))
|
||||
#ifdef SDL_VIDEO_OPENGL
|
||||
#define SDL_DIRECTFB_OPENGL 1
|
||||
#endif
|
||||
#else
|
||||
#error "SDL_DIRECTFB: Please compile against libdirectfb version >= 1.0.0"
|
||||
#endif
|
||||
|
||||
/* Set below to 1 to compile with (old) multi mice/keyboard api. Code left in
|
||||
* in case we see this again ...
|
||||
*/
|
||||
|
||||
#define USE_MULTI_API (0)
|
||||
|
||||
/* Support for LUT8/INDEX8 pixel format.
|
||||
* This is broken in DirectFB 1.4.3. It works in 1.4.0 and 1.4.5
|
||||
* occurred.
|
||||
*/
|
||||
|
||||
#if (DFB_COMPILEDVERSION == DFB_VERSIONNUM(1, 4, 3))
|
||||
#define ENABLE_LUT8 (0)
|
||||
#else
|
||||
#define ENABLE_LUT8 (1)
|
||||
#endif
|
||||
|
||||
#define DIRECTFB_DEBUG 1
|
||||
|
||||
#define DFBENV_USE_YUV_UNDERLAY "SDL_DIRECTFB_YUV_UNDERLAY" /* Default: off */
|
||||
#define DFBENV_USE_YUV_DIRECT "SDL_DIRECTFB_YUV_DIRECT" /* Default: off */
|
||||
#define DFBENV_USE_X11_CHECK "SDL_DIRECTFB_X11_CHECK" /* Default: on */
|
||||
#define DFBENV_USE_LINUX_INPUT "SDL_DIRECTFB_LINUX_INPUT" /* Default: on */
|
||||
#define DFBENV_USE_WM "SDL_DIRECTFB_WM" /* Default: off */
|
||||
|
||||
#define SDL_DFB_RELEASE(x) do { if ( (x) != NULL ) { SDL_DFB_CHECK(x->Release(x)); x = NULL; } } while (0)
|
||||
#define SDL_DFB_FREE(x) do { SDL_free((x)); (x) = NULL; } while (0)
|
||||
#define SDL_DFB_UNLOCK(x) do { if ( (x) != NULL ) { x->Unlock(x); } } while (0)
|
||||
|
||||
#define SDL_DFB_CONTEXT "SDL_DirectFB"
|
||||
|
||||
#define SDL_DFB_ERR(x...) SDL_LogError(SDL_LOG_CATEGORY_ERROR, x)
|
||||
|
||||
#if (DIRECTFB_DEBUG)
|
||||
#define SDL_DFB_LOG(x...) SDL_LogInfo(SDL_LOG_CATEGORY_VIDEO, x)
|
||||
|
||||
#define SDL_DFB_DEBUG(x...) SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, x)
|
||||
|
||||
static SDL_INLINE DFBResult sdl_dfb_check(DFBResult ret, const char *src_file, int src_line) {
|
||||
if (ret != DFB_OK) {
|
||||
SDL_DFB_LOG("%s (%d):%s", src_file, src_line, DirectFBErrorString (ret) );
|
||||
SDL_SetError("%s:%s", SDL_DFB_CONTEXT, DirectFBErrorString (ret) );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define SDL_DFB_CHECK(x...) do { sdl_dfb_check( x, __FILE__, __LINE__); } while (0)
|
||||
#define SDL_DFB_CHECKERR(x...) do { if ( sdl_dfb_check( x, __FILE__, __LINE__) != DFB_OK ) goto error; } while (0)
|
||||
|
||||
#else
|
||||
|
||||
#define SDL_DFB_CHECK(x...) x
|
||||
#define SDL_DFB_CHECKERR(x...) do { if (x != DFB_OK ) goto error; } while (0)
|
||||
#define SDL_DFB_LOG(x...) do {} while (0)
|
||||
#define SDL_DFB_DEBUG(x...) do {} while (0)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#define SDL_DFB_CALLOC(r, n, s) \
|
||||
do { \
|
||||
r = SDL_calloc (n, s); \
|
||||
if (!(r)) { \
|
||||
SDL_DFB_ERR("Out of memory"); \
|
||||
SDL_OutOfMemory(); \
|
||||
goto error; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define SDL_DFB_ALLOC_CLEAR(r, s) SDL_DFB_CALLOC(r, 1, s)
|
||||
|
||||
/* Private display data */
|
||||
|
||||
#define SDL_DFB_DEVICEDATA(dev) DFB_DeviceData *devdata = (dev ? (DFB_DeviceData *) ((dev)->driverdata) : NULL)
|
||||
|
||||
#define DFB_MAX_SCREENS 10
|
||||
|
||||
typedef struct _DFB_KeyboardData DFB_KeyboardData;
|
||||
struct _DFB_KeyboardData
|
||||
{
|
||||
const SDL_Scancode *map; /* keyboard scancode map */
|
||||
int map_size; /* size of map */
|
||||
int map_adjust; /* index adjust */
|
||||
int is_generic; /* generic keyboard */
|
||||
int id;
|
||||
};
|
||||
|
||||
typedef struct _DFB_DeviceData DFB_DeviceData;
|
||||
struct _DFB_DeviceData
|
||||
{
|
||||
int initialized;
|
||||
|
||||
IDirectFB *dfb;
|
||||
int num_mice;
|
||||
int mouse_id[0x100];
|
||||
int num_keyboard;
|
||||
DFB_KeyboardData keyboard[10];
|
||||
SDL_Window *firstwin;
|
||||
|
||||
int use_yuv_underlays;
|
||||
int use_yuv_direct;
|
||||
int use_linux_input;
|
||||
int has_own_wm;
|
||||
|
||||
|
||||
/* window grab */
|
||||
SDL_Window *grabbed_window;
|
||||
|
||||
/* global events */
|
||||
IDirectFBEventBuffer *events;
|
||||
};
|
||||
|
||||
Uint32 DirectFB_DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat);
|
||||
DFBSurfacePixelFormat DirectFB_SDLToDFBPixelFormat(Uint32 format);
|
||||
void DirectFB_SetSupportedPixelFormats(SDL_RendererInfo *ri);
|
||||
|
||||
|
||||
#endif /* _SDL_DirectFB_video_h */
|
||||
532
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.c
Normal file
532
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.c
Normal file
|
|
@ -0,0 +1,532 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DIRECTFB
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_modes.h"
|
||||
#include "SDL_DirectFB_window.h"
|
||||
#include "SDL_DirectFB_shape.h"
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
#include "SDL_DirectFB_opengl.h"
|
||||
#endif
|
||||
|
||||
#include "SDL_syswm.h"
|
||||
|
||||
#include "../SDL_pixels_c.h"
|
||||
|
||||
int
|
||||
DirectFB_CreateWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_DISPLAYDATA(window);
|
||||
DFB_WindowData *windata = NULL;
|
||||
DFBWindowOptions wopts;
|
||||
DFBWindowDescription desc;
|
||||
int x, y;
|
||||
int bshaped = 0;
|
||||
|
||||
SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData));
|
||||
SDL_memset(&desc, 0, sizeof(DFBWindowDescription));
|
||||
windata = (DFB_WindowData *) window->driverdata;
|
||||
|
||||
windata->is_managed = devdata->has_own_wm;
|
||||
#if 1
|
||||
SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb,
|
||||
DFSCL_NORMAL));
|
||||
SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer,
|
||||
DLSCL_ADMINISTRATIVE));
|
||||
#endif
|
||||
/* FIXME ... ughh, ugly */
|
||||
if (window->x == -1000 && window->y == -1000)
|
||||
bshaped = 1;
|
||||
|
||||
/* Fill the window description. */
|
||||
x = window->x;
|
||||
y = window->y;
|
||||
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
|
||||
|
||||
/* Create Window */
|
||||
desc.caps = 0;
|
||||
desc.flags =
|
||||
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS;
|
||||
|
||||
if (bshaped) {
|
||||
desc.flags |= DWDESC_CAPS;
|
||||
desc.caps |= DWCAPS_ALPHACHANNEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
desc.flags |= DWDESC_PIXELFORMAT;
|
||||
}
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_BORDERLESS))
|
||||
desc.caps |= DWCAPS_NODECORATION;
|
||||
|
||||
desc.posx = x;
|
||||
desc.posy = y;
|
||||
desc.width = windata->size.w;
|
||||
desc.height = windata->size.h;
|
||||
desc.pixelformat = dispdata->pixelformat;
|
||||
desc.surface_caps = DSCAPS_PREMULTIPLIED;
|
||||
#if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 4
|
||||
if (window->flags & SDL_WINDOW_OPENGL) {
|
||||
desc.surface_caps |= DSCAPS_GL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create the window. */
|
||||
SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc,
|
||||
&windata->dfbwin));
|
||||
|
||||
/* Set Options */
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
|
||||
|
||||
/* explicit rescaling of surface */
|
||||
wopts |= DWOP_SCALE;
|
||||
if (window->flags & SDL_WINDOW_RESIZABLE) {
|
||||
wopts &= ~DWOP_KEEP_SIZE;
|
||||
}
|
||||
else {
|
||||
wopts |= DWOP_KEEP_SIZE;
|
||||
}
|
||||
|
||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
||||
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetStackingClass(windata->dfbwin, DWSC_UPPER));
|
||||
}
|
||||
|
||||
if (bshaped) {
|
||||
wopts |= DWOP_SHAPED | DWOP_ALPHACHANNEL;
|
||||
wopts &= ~DWOP_OPAQUE_REGION;
|
||||
}
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
|
||||
|
||||
/* See what we got */
|
||||
SDL_DFB_CHECK(DirectFB_WM_GetClientSize
|
||||
(_this, window, &window->w, &window->h));
|
||||
|
||||
/* Get the window's surface. */
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin,
|
||||
&windata->window_surface));
|
||||
|
||||
/* And get a subsurface for rendering */
|
||||
SDL_DFB_CHECKERR(windata->window_surface->
|
||||
GetSubSurface(windata->window_surface, &windata->client,
|
||||
&windata->surface));
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF));
|
||||
|
||||
/* Create Eventbuffer */
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin,
|
||||
&windata->
|
||||
eventbuffer));
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->
|
||||
EnableEvents(windata->dfbwin, DWET_ALL));
|
||||
|
||||
/* Create a font */
|
||||
/* FIXME: once during Video_Init */
|
||||
windata->font = NULL;
|
||||
|
||||
/* Make it the top most window. */
|
||||
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
|
||||
|
||||
/* remember parent */
|
||||
/* windata->sdlwin = window; */
|
||||
|
||||
/* Add to list ... */
|
||||
|
||||
windata->next = devdata->firstwin;
|
||||
windata->opacity = 0xFF;
|
||||
devdata->firstwin = window;
|
||||
|
||||
/* Draw Frame */
|
||||
DirectFB_WM_RedrawLayout(_this, window);
|
||||
|
||||
return 0;
|
||||
error:
|
||||
SDL_DFB_RELEASE(windata->surface);
|
||||
SDL_DFB_RELEASE(windata->dfbwin);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_SetWindowTitle(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
if (windata->is_managed) {
|
||||
windata->wm_needs_redraw = 1;
|
||||
DirectFB_WM_RedrawLayout(_this, window);
|
||||
} else {
|
||||
SDL_Unsupported();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
SDL_Surface *surface = NULL;
|
||||
|
||||
if (icon) {
|
||||
SDL_PixelFormat format;
|
||||
DFBSurfaceDescription dsc;
|
||||
Uint32 *dest;
|
||||
Uint32 *p;
|
||||
int pitch, i;
|
||||
|
||||
/* Convert the icon to ARGB for modern window managers */
|
||||
SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
|
||||
surface = SDL_ConvertSurface(icon, &format, 0);
|
||||
if (!surface) {
|
||||
return;
|
||||
}
|
||||
dsc.flags =
|
||||
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
|
||||
dsc.caps = DSCAPS_VIDEOONLY;
|
||||
dsc.width = surface->w;
|
||||
dsc.height = surface->h;
|
||||
dsc.pixelformat = DSPF_ARGB;
|
||||
|
||||
SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
|
||||
&windata->icon));
|
||||
|
||||
SDL_DFB_CHECKERR(windata->icon->Lock(windata->icon, DSLF_WRITE,
|
||||
(void *) &dest, &pitch));
|
||||
|
||||
p = surface->pixels;
|
||||
for (i = 0; i < surface->h; i++)
|
||||
memcpy((char *) dest + i * pitch,
|
||||
(char *) p + i * surface->pitch, 4 * surface->w);
|
||||
|
||||
SDL_DFB_CHECK(windata->icon->Unlock(windata->icon));
|
||||
SDL_FreeSurface(surface);
|
||||
} else {
|
||||
SDL_DFB_RELEASE(windata->icon);
|
||||
}
|
||||
return;
|
||||
error:
|
||||
SDL_FreeSurface(surface);
|
||||
SDL_DFB_RELEASE(windata->icon);
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
int x, y;
|
||||
|
||||
x = window->x;
|
||||
y = window->y;
|
||||
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
|
||||
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y));
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_SetWindowSize(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
if(SDL_IsShapedWindow(window))
|
||||
DirectFB_ResizeWindowShape(window);
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
|
||||
int cw;
|
||||
int ch;
|
||||
|
||||
/* Make sure all events are disabled for this operation ! */
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin,
|
||||
DWET_ALL));
|
||||
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch));
|
||||
|
||||
if (cw != window->w || ch != window->h) {
|
||||
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin,
|
||||
windata->size.w,
|
||||
windata->size.h));
|
||||
}
|
||||
|
||||
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
|
||||
(_this, window, &window->w, &window->h));
|
||||
DirectFB_AdjustWindowSurface(window);
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin,
|
||||
DWET_ALL));
|
||||
|
||||
}
|
||||
return;
|
||||
error:
|
||||
SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_ShowWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_HideWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_RaiseWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
|
||||
SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
||||
DFBWindowOptions wopts;
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetPosition(windata->dfbwin,
|
||||
&windata->restore.x, &windata->restore.y));
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w,
|
||||
&windata->restore.h));
|
||||
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ;
|
||||
|
||||
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0));
|
||||
SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin,
|
||||
display->current_mode.w, display->current_mode.h));
|
||||
|
||||
/* Set Options */
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
|
||||
wopts |= DWOP_KEEP_SIZE | DWOP_KEEP_POSITION;
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_MinimizeWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
/* FIXME: Size to 32x32 ? */
|
||||
|
||||
SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_RestoreWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFBWindowOptions wopts;
|
||||
|
||||
/* Set Options */
|
||||
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
|
||||
wopts &= ~(DWOP_KEEP_SIZE | DWOP_KEEP_POSITION);
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
|
||||
|
||||
/* Window layout */
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED),
|
||||
windata->restore.w, windata->restore.h);
|
||||
SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, windata->restore.w,
|
||||
windata->restore.h));
|
||||
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, windata->restore.x,
|
||||
windata->restore.y));
|
||||
|
||||
if (!(window->flags & SDL_WINDOW_RESIZABLE))
|
||||
wopts |= DWOP_KEEP_SIZE;
|
||||
|
||||
if (window->flags & SDL_WINDOW_FULLSCREEN)
|
||||
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE;
|
||||
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
|
||||
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
|
||||
|
||||
if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
|
||||
if (gwindata != NULL)
|
||||
{
|
||||
SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
|
||||
SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin));
|
||||
}
|
||||
SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin));
|
||||
SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin));
|
||||
devdata->grabbed_window = window;
|
||||
} else {
|
||||
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
|
||||
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
|
||||
devdata->grabbed_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_DestroyWindow(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
DFB_WindowData *p;
|
||||
|
||||
/* Some cleanups */
|
||||
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
|
||||
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
DirectFB_GL_DestroyWindowContexts(_this, window);
|
||||
#endif
|
||||
|
||||
if (window->shaper)
|
||||
{
|
||||
SDL_ShapeData *data = window->shaper->driverdata;
|
||||
SDL_DFB_CHECK(data->surface->ReleaseSource(data->surface));
|
||||
SDL_DFB_RELEASE(data->surface);
|
||||
SDL_DFB_FREE(data);
|
||||
SDL_DFB_FREE(window->shaper);
|
||||
}
|
||||
|
||||
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, NULL));
|
||||
SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface));
|
||||
SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface));
|
||||
SDL_DFB_RELEASE(windata->icon);
|
||||
SDL_DFB_RELEASE(windata->font);
|
||||
SDL_DFB_RELEASE(windata->eventbuffer);
|
||||
SDL_DFB_RELEASE(windata->surface);
|
||||
SDL_DFB_RELEASE(windata->window_surface);
|
||||
|
||||
SDL_DFB_RELEASE(windata->dfbwin);
|
||||
|
||||
/* Remove from list ... */
|
||||
|
||||
p = devdata->firstwin->driverdata;
|
||||
|
||||
while (p && p->next != window)
|
||||
p = (p->next ? p->next->driverdata : NULL);
|
||||
if (p)
|
||||
p->next = windata->next;
|
||||
else
|
||||
devdata->firstwin = windata->next;
|
||||
SDL_free(windata);
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_bool
|
||||
DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||
struct SDL_SysWMinfo * info)
|
||||
{
|
||||
SDL_DFB_DEVICEDATA(_this);
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
|
||||
if (info->version.major == SDL_MAJOR_VERSION &&
|
||||
info->version.minor == SDL_MINOR_VERSION) {
|
||||
info->subsystem = SDL_SYSWM_DIRECTFB;
|
||||
info->info.dfb.dfb = devdata->dfb;
|
||||
info->info.dfb.window = windata->dfbwin;
|
||||
info->info.dfb.surface = windata->surface;
|
||||
return SDL_TRUE;
|
||||
} else {
|
||||
SDL_SetError("Application not compiled with SDL %d.%d\n",
|
||||
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
||||
return SDL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DirectFB_AdjustWindowSurface(SDL_Window * window)
|
||||
{
|
||||
SDL_DFB_WINDOWDATA(window);
|
||||
int adjust = windata->wm_needs_redraw;
|
||||
int cw, ch;
|
||||
|
||||
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
|
||||
|
||||
SDL_DFB_CHECKERR(windata->
|
||||
window_surface->GetSize(windata->window_surface, &cw,
|
||||
&ch));
|
||||
if (cw != windata->size.w || ch != windata->size.h) {
|
||||
adjust = 1;
|
||||
}
|
||||
|
||||
if (adjust) {
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window);
|
||||
#endif
|
||||
|
||||
#if (DFB_VERSION_ATLEAST(1,2,1))
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
|
||||
windata->size.w,
|
||||
windata->size.h));
|
||||
SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
|
||||
windata->
|
||||
window_surface,
|
||||
&windata->client));
|
||||
#else
|
||||
DFBWindowOptions opts;
|
||||
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts));
|
||||
/* recreate subsurface */
|
||||
SDL_DFB_RELEASE(windata->surface);
|
||||
|
||||
if (opts & DWOP_SCALE)
|
||||
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
|
||||
windata->size.w,
|
||||
windata->size.h));
|
||||
SDL_DFB_CHECKERR(windata->window_surface->
|
||||
GetSubSurface(windata->window_surface,
|
||||
&windata->client, &windata->surface));
|
||||
#endif
|
||||
DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window);
|
||||
|
||||
#if SDL_DIRECTFB_OPENGL
|
||||
DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window);
|
||||
#endif
|
||||
}
|
||||
error:
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DIRECTFB */
|
||||
81
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.h
Normal file
81
Engine/lib/sdl/src/video/directfb/SDL_DirectFB_window.h
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_directfb_window_h
|
||||
#define _SDL_directfb_window_h
|
||||
|
||||
#include "SDL_DirectFB_video.h"
|
||||
#include "SDL_DirectFB_WM.h"
|
||||
|
||||
#define SDL_DFB_WINDOWDATA(win) DFB_WindowData *windata = ((win) ? (DFB_WindowData *) ((win)->driverdata) : NULL)
|
||||
|
||||
typedef struct _DFB_WindowData DFB_WindowData;
|
||||
struct _DFB_WindowData
|
||||
{
|
||||
IDirectFBSurface *window_surface; /* window surface */
|
||||
IDirectFBSurface *surface; /* client drawing surface */
|
||||
IDirectFBWindow *dfbwin;
|
||||
IDirectFBEventBuffer *eventbuffer;
|
||||
/* SDL_Window *sdlwin; */
|
||||
SDL_Window *next;
|
||||
Uint8 opacity;
|
||||
DFBRectangle client;
|
||||
DFBDimension size;
|
||||
DFBRectangle restore;
|
||||
|
||||
/* WM extras */
|
||||
int is_managed;
|
||||
int wm_needs_redraw;
|
||||
IDirectFBSurface *icon;
|
||||
IDirectFBFont *font;
|
||||
DFB_Theme theme;
|
||||
|
||||
/* WM moving and sizing */
|
||||
int wm_grab;
|
||||
int wm_lastx;
|
||||
int wm_lasty;
|
||||
};
|
||||
|
||||
extern int DirectFB_CreateWindow(_THIS, SDL_Window * window);
|
||||
extern int DirectFB_CreateWindowFrom(_THIS, SDL_Window * window,
|
||||
const void *data);
|
||||
extern void DirectFB_SetWindowTitle(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_SetWindowIcon(_THIS, SDL_Window * window,
|
||||
SDL_Surface * icon);
|
||||
|
||||
extern void DirectFB_SetWindowPosition(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_SetWindowSize(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_ShowWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_HideWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_RaiseWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_MaximizeWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_MinimizeWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_RestoreWindow(_THIS, SDL_Window * window);
|
||||
extern void DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed);
|
||||
extern void DirectFB_DestroyWindow(_THIS, SDL_Window * window);
|
||||
extern SDL_bool DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
|
||||
struct SDL_SysWMinfo *info);
|
||||
|
||||
extern void DirectFB_AdjustWindowSurface(SDL_Window * window);
|
||||
|
||||
#endif /* _SDL_directfb_window_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
41
Engine/lib/sdl/src/video/dummy/SDL_nullevents.c
Normal file
41
Engine/lib/sdl/src/video/dummy/SDL_nullevents.c
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
|
||||
/* Being a null driver, there's no event stream. We just define stubs for
|
||||
most of the API. */
|
||||
|
||||
#include "../../events/SDL_events_c.h"
|
||||
|
||||
#include "SDL_nullvideo.h"
|
||||
#include "SDL_nullevents_c.h"
|
||||
|
||||
void
|
||||
DUMMY_PumpEvents(_THIS)
|
||||
{
|
||||
/* do nothing. */
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DUMMY */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
27
Engine/lib/sdl/src/video/dummy/SDL_nullevents_c.h
Normal file
27
Engine/lib/sdl/src/video/dummy/SDL_nullevents_c.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#include "SDL_nullvideo.h"
|
||||
|
||||
extern void DUMMY_PumpEvents(_THIS);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
89
Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer.c
Normal file
89
Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer.c
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
#include "SDL_nullframebuffer_c.h"
|
||||
|
||||
|
||||
#define DUMMY_SURFACE "_SDL_DummySurface"
|
||||
|
||||
int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
|
||||
{
|
||||
SDL_Surface *surface;
|
||||
const Uint32 surface_format = SDL_PIXELFORMAT_RGB888;
|
||||
int w, h;
|
||||
int bpp;
|
||||
Uint32 Rmask, Gmask, Bmask, Amask;
|
||||
|
||||
/* Free the old framebuffer surface */
|
||||
surface = (SDL_Surface *) SDL_GetWindowData(window, DUMMY_SURFACE);
|
||||
SDL_FreeSurface(surface);
|
||||
|
||||
/* Create a new one */
|
||||
SDL_PixelFormatEnumToMasks(surface_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask);
|
||||
SDL_GetWindowSize(window, &w, &h);
|
||||
surface = SDL_CreateRGBSurface(0, w, h, bpp, Rmask, Gmask, Bmask, Amask);
|
||||
if (!surface) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Save the info and return! */
|
||||
SDL_SetWindowData(window, DUMMY_SURFACE, surface);
|
||||
*format = surface_format;
|
||||
*pixels = surface->pixels;
|
||||
*pitch = surface->pitch;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects)
|
||||
{
|
||||
static int frame_number;
|
||||
SDL_Surface *surface;
|
||||
|
||||
surface = (SDL_Surface *) SDL_GetWindowData(window, DUMMY_SURFACE);
|
||||
if (!surface) {
|
||||
return SDL_SetError("Couldn't find dummy surface for window");
|
||||
}
|
||||
|
||||
/* Send the data to the display */
|
||||
if (SDL_getenv("SDL_VIDEO_DUMMY_SAVE_FRAMES")) {
|
||||
char file[128];
|
||||
SDL_snprintf(file, sizeof(file), "SDL_window%d-%8.8d.bmp",
|
||||
SDL_GetWindowID(window), ++frame_number);
|
||||
SDL_SaveBMP(surface, file);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window)
|
||||
{
|
||||
SDL_Surface *surface;
|
||||
|
||||
surface = (SDL_Surface *) SDL_SetWindowData(window, DUMMY_SURFACE, NULL);
|
||||
SDL_FreeSurface(surface);
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DUMMY */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
27
Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer_c.h
Normal file
27
Engine/lib/sdl/src/video/dummy/SDL_nullframebuffer_c.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
extern int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
|
||||
extern int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, const SDL_Rect * rects, int numrects);
|
||||
extern void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
144
Engine/lib/sdl/src/video/dummy/SDL_nullvideo.c
Normal file
144
Engine/lib/sdl/src/video/dummy/SDL_nullvideo.c
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_DUMMY
|
||||
|
||||
/* Dummy SDL video driver implementation; this is just enough to make an
|
||||
* SDL-based application THINK it's got a working video driver, for
|
||||
* applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it,
|
||||
* and also for use as a collection of stubs when porting SDL to a new
|
||||
* platform for which you haven't yet written a valid video driver.
|
||||
*
|
||||
* This is also a great way to determine bottlenecks: if you think that SDL
|
||||
* is a performance problem for a given platform, enable this driver, and
|
||||
* then see if your application runs faster without video overhead.
|
||||
*
|
||||
* Initial work by Ryan C. Gordon (icculus@icculus.org). A good portion
|
||||
* of this was cut-and-pasted from Stephane Peter's work in the AAlib
|
||||
* SDL video driver. Renamed to "DUMMY" by Sam Lantinga.
|
||||
*/
|
||||
|
||||
#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_nullvideo.h"
|
||||
#include "SDL_nullevents_c.h"
|
||||
#include "SDL_nullframebuffer_c.h"
|
||||
|
||||
#define DUMMYVID_DRIVER_NAME "dummy"
|
||||
|
||||
/* Initialization/Query functions */
|
||||
static int DUMMY_VideoInit(_THIS);
|
||||
static int DUMMY_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode);
|
||||
static void DUMMY_VideoQuit(_THIS);
|
||||
|
||||
/* DUMMY driver bootstrap functions */
|
||||
|
||||
static int
|
||||
DUMMY_Available(void)
|
||||
{
|
||||
const char *envr = SDL_getenv("SDL_VIDEODRIVER");
|
||||
if ((envr) && (SDL_strcmp(envr, DUMMYVID_DRIVER_NAME) == 0)) {
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
DUMMY_DeleteDevice(SDL_VideoDevice * device)
|
||||
{
|
||||
SDL_free(device);
|
||||
}
|
||||
|
||||
static SDL_VideoDevice *
|
||||
DUMMY_CreateDevice(int devindex)
|
||||
{
|
||||
SDL_VideoDevice *device;
|
||||
|
||||
/* Initialize all variables that we clean on shutdown */
|
||||
device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice));
|
||||
if (!device) {
|
||||
SDL_OutOfMemory();
|
||||
SDL_free(device);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Set the function pointers */
|
||||
device->VideoInit = DUMMY_VideoInit;
|
||||
device->VideoQuit = DUMMY_VideoQuit;
|
||||
device->SetDisplayMode = DUMMY_SetDisplayMode;
|
||||
device->PumpEvents = DUMMY_PumpEvents;
|
||||
device->CreateWindowFramebuffer = SDL_DUMMY_CreateWindowFramebuffer;
|
||||
device->UpdateWindowFramebuffer = SDL_DUMMY_UpdateWindowFramebuffer;
|
||||
device->DestroyWindowFramebuffer = SDL_DUMMY_DestroyWindowFramebuffer;
|
||||
|
||||
device->free = DUMMY_DeleteDevice;
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
VideoBootStrap DUMMY_bootstrap = {
|
||||
DUMMYVID_DRIVER_NAME, "SDL dummy video driver",
|
||||
DUMMY_Available, DUMMY_CreateDevice
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
DUMMY_VideoInit(_THIS)
|
||||
{
|
||||
SDL_DisplayMode mode;
|
||||
|
||||
/* Use a fake 32-bpp desktop mode */
|
||||
mode.format = SDL_PIXELFORMAT_RGB888;
|
||||
mode.w = 1024;
|
||||
mode.h = 768;
|
||||
mode.refresh_rate = 0;
|
||||
mode.driverdata = NULL;
|
||||
if (SDL_AddBasicVideoDisplay(&mode) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
SDL_zero(mode);
|
||||
SDL_AddDisplayMode(&_this->displays[0], &mode);
|
||||
|
||||
/* We're done! */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
DUMMY_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
DUMMY_VideoQuit(_THIS)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_DUMMY */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
30
Engine/lib/sdl/src/video/dummy/SDL_nullvideo.h
Normal file
30
Engine/lib/sdl/src/video/dummy/SDL_nullvideo.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef _SDL_nullvideo_h
|
||||
#define _SDL_nullvideo_h
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#endif /* _SDL_nullvideo_h */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
638
Engine/lib/sdl/src/video/haiku/SDL_BWin.h
Normal file
638
Engine/lib/sdl/src/video/haiku/SDL_BWin.h
Normal file
|
|
@ -0,0 +1,638 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef _SDL_BWin_h
|
||||
#define _SDL_BWin_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
#include "SDL.h"
|
||||
#include "SDL_syswm.h"
|
||||
#include "SDL_bframebuffer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <AppKit.h>
|
||||
#include <InterfaceKit.h>
|
||||
#include <be/game/DirectWindow.h>
|
||||
#if SDL_VIDEO_OPENGL
|
||||
#include <be/opengl/GLView.h>
|
||||
#endif
|
||||
#include "SDL_events.h"
|
||||
#include "../../main/haiku/SDL_BApp.h"
|
||||
|
||||
|
||||
enum WinCommands {
|
||||
BWIN_MOVE_WINDOW,
|
||||
BWIN_RESIZE_WINDOW,
|
||||
BWIN_SHOW_WINDOW,
|
||||
BWIN_HIDE_WINDOW,
|
||||
BWIN_MAXIMIZE_WINDOW,
|
||||
BWIN_MINIMIZE_WINDOW,
|
||||
BWIN_RESTORE_WINDOW,
|
||||
BWIN_SET_TITLE,
|
||||
BWIN_SET_BORDERED,
|
||||
BWIN_FULLSCREEN
|
||||
};
|
||||
|
||||
|
||||
class SDL_BWin:public BDirectWindow
|
||||
{
|
||||
public:
|
||||
/* Constructor/Destructor */
|
||||
SDL_BWin(BRect bounds, window_look look, uint32 flags)
|
||||
: BDirectWindow(bounds, "Untitled", look, B_NORMAL_WINDOW_FEEL, flags)
|
||||
{
|
||||
_last_buttons = 0;
|
||||
|
||||
#if SDL_VIDEO_OPENGL
|
||||
_SDL_GLView = NULL;
|
||||
#endif
|
||||
_shown = false;
|
||||
_inhibit_resize = false;
|
||||
_mouse_focused = false;
|
||||
_prev_frame = NULL;
|
||||
|
||||
/* Handle framebuffer stuff */
|
||||
_connected = _connection_disabled = false;
|
||||
_buffer_created = _buffer_dirty = false;
|
||||
_trash_window_buffer = false;
|
||||
_buffer_locker = new BLocker();
|
||||
_bitmap = NULL;
|
||||
_clips = NULL;
|
||||
|
||||
#ifdef DRAWTHREAD
|
||||
_draw_thread_id = spawn_thread(BE_DrawThread, "drawing_thread",
|
||||
B_NORMAL_PRIORITY, (void*) this);
|
||||
resume_thread(_draw_thread_id);
|
||||
#endif
|
||||
}
|
||||
|
||||
virtual ~ SDL_BWin()
|
||||
{
|
||||
Lock();
|
||||
_connection_disabled = true;
|
||||
int32 result;
|
||||
|
||||
#if SDL_VIDEO_OPENGL
|
||||
if (_SDL_GLView) {
|
||||
_SDL_GLView->UnlockGL();
|
||||
RemoveChild(_SDL_GLView); /* Why was this outside the if
|
||||
statement before? */
|
||||
}
|
||||
|
||||
#endif
|
||||
Unlock();
|
||||
#if SDL_VIDEO_OPENGL
|
||||
if (_SDL_GLView) {
|
||||
delete _SDL_GLView;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Clean up framebuffer stuff */
|
||||
_buffer_locker->Lock();
|
||||
#ifdef DRAWTHREAD
|
||||
wait_for_thread(_draw_thread_id, &result);
|
||||
#endif
|
||||
free(_clips);
|
||||
delete _buffer_locker;
|
||||
}
|
||||
|
||||
|
||||
/* * * * * OpenGL functionality * * * * */
|
||||
#if SDL_VIDEO_OPENGL
|
||||
virtual BGLView *CreateGLView(Uint32 gl_flags) {
|
||||
Lock();
|
||||
if (_SDL_GLView == NULL) {
|
||||
_SDL_GLView = new BGLView(Bounds(), "SDL GLView",
|
||||
B_FOLLOW_ALL_SIDES,
|
||||
(B_WILL_DRAW | B_FRAME_EVENTS),
|
||||
gl_flags);
|
||||
}
|
||||
AddChild(_SDL_GLView);
|
||||
_SDL_GLView->EnableDirectMode(true);
|
||||
_SDL_GLView->LockGL(); /* "New" GLViews are created */
|
||||
Unlock();
|
||||
return (_SDL_GLView);
|
||||
}
|
||||
|
||||
virtual void RemoveGLView() {
|
||||
Lock();
|
||||
if(_SDL_GLView) {
|
||||
_SDL_GLView->UnlockGL();
|
||||
RemoveChild(_SDL_GLView);
|
||||
}
|
||||
Unlock();
|
||||
}
|
||||
|
||||
virtual void SwapBuffers(void) {
|
||||
_SDL_GLView->UnlockGL();
|
||||
_SDL_GLView->LockGL();
|
||||
_SDL_GLView->SwapBuffers();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* * * * * Framebuffering* * * * */
|
||||
virtual void DirectConnected(direct_buffer_info *info) {
|
||||
if(!_connected && _connection_disabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Determine if the pixel buffer is usable after this update */
|
||||
_trash_window_buffer = _trash_window_buffer
|
||||
|| ((info->buffer_state & B_BUFFER_RESIZED)
|
||||
|| (info->buffer_state & B_BUFFER_RESET)
|
||||
|| (info->driver_state == B_MODE_CHANGED));
|
||||
LockBuffer();
|
||||
|
||||
switch(info->buffer_state & B_DIRECT_MODE_MASK) {
|
||||
case B_DIRECT_START:
|
||||
_connected = true;
|
||||
|
||||
case B_DIRECT_MODIFY:
|
||||
if(_clips) {
|
||||
free(_clips);
|
||||
_clips = NULL;
|
||||
}
|
||||
|
||||
_num_clips = info->clip_list_count;
|
||||
_clips = (clipping_rect *)malloc(_num_clips*sizeof(clipping_rect));
|
||||
if(_clips) {
|
||||
memcpy(_clips, info->clip_list,
|
||||
_num_clips*sizeof(clipping_rect));
|
||||
|
||||
_bits = (uint8*) info->bits;
|
||||
_row_bytes = info->bytes_per_row;
|
||||
_bounds = info->window_bounds;
|
||||
_bytes_per_px = info->bits_per_pixel / 8;
|
||||
_buffer_dirty = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case B_DIRECT_STOP:
|
||||
_connected = false;
|
||||
break;
|
||||
}
|
||||
#if SDL_VIDEO_OPENGL
|
||||
if(_SDL_GLView) {
|
||||
_SDL_GLView->DirectConnected(info);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Call the base object directconnected */
|
||||
BDirectWindow::DirectConnected(info);
|
||||
|
||||
UnlockBuffer();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* * * * * Event sending * * * * */
|
||||
/* Hook functions */
|
||||
virtual void FrameMoved(BPoint origin) {
|
||||
/* Post a message to the BApp so that it can handle the window event */
|
||||
BMessage msg(BAPP_WINDOW_MOVED);
|
||||
msg.AddInt32("window-x", (int)origin.x);
|
||||
msg.AddInt32("window-y", (int)origin.y);
|
||||
_PostWindowEvent(msg);
|
||||
|
||||
/* Perform normal hook operations */
|
||||
BDirectWindow::FrameMoved(origin);
|
||||
}
|
||||
|
||||
virtual void FrameResized(float width, float height) {
|
||||
/* Post a message to the BApp so that it can handle the window event */
|
||||
BMessage msg(BAPP_WINDOW_RESIZED);
|
||||
|
||||
msg.AddInt32("window-w", (int)width + 1);
|
||||
msg.AddInt32("window-h", (int)height + 1);
|
||||
_PostWindowEvent(msg);
|
||||
|
||||
/* Perform normal hook operations */
|
||||
BDirectWindow::FrameResized(width, height);
|
||||
}
|
||||
|
||||
virtual bool QuitRequested() {
|
||||
BMessage msg(BAPP_WINDOW_CLOSE_REQUESTED);
|
||||
_PostWindowEvent(msg);
|
||||
|
||||
/* We won't allow a quit unless asked by DestroyWindow() */
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual void WindowActivated(bool active) {
|
||||
BMessage msg(BAPP_KEYBOARD_FOCUS); /* Mouse focus sold separately */
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
virtual void Zoom(BPoint origin,
|
||||
float width,
|
||||
float height) {
|
||||
BMessage msg(BAPP_MAXIMIZE); /* Closest thing to maximization Haiku has */
|
||||
_PostWindowEvent(msg);
|
||||
|
||||
/* Before the window zooms, record its size */
|
||||
if( !_prev_frame )
|
||||
_prev_frame = new BRect(Frame());
|
||||
|
||||
/* Perform normal hook operations */
|
||||
BDirectWindow::Zoom(origin, width, height);
|
||||
}
|
||||
|
||||
/* Member functions */
|
||||
virtual void Show() {
|
||||
while(IsHidden()) {
|
||||
BDirectWindow::Show();
|
||||
}
|
||||
_shown = true;
|
||||
|
||||
BMessage msg(BAPP_SHOW);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
virtual void Hide() {
|
||||
BDirectWindow::Hide();
|
||||
_shown = false;
|
||||
|
||||
BMessage msg(BAPP_HIDE);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
virtual void Minimize(bool minimize) {
|
||||
BDirectWindow::Minimize(minimize);
|
||||
int32 minState = (minimize ? BAPP_MINIMIZE : BAPP_RESTORE);
|
||||
|
||||
BMessage msg(minState);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
|
||||
/* BView message interruption */
|
||||
virtual void DispatchMessage(BMessage * msg, BHandler * target)
|
||||
{
|
||||
BPoint where; /* Used by mouse moved */
|
||||
int32 buttons; /* Used for mouse button events */
|
||||
int32 key; /* Used for key events */
|
||||
|
||||
switch (msg->what) {
|
||||
case B_MOUSE_MOVED:
|
||||
int32 transit;
|
||||
if (msg->FindPoint("where", &where) == B_OK
|
||||
&& msg->FindInt32("be:transit", &transit) == B_OK) {
|
||||
_MouseMotionEvent(where, transit);
|
||||
}
|
||||
|
||||
/* FIXME: Apparently a button press/release event might be dropped
|
||||
if made before before a different button is released. Does
|
||||
B_MOUSE_MOVED have the data needed to check if a mouse button
|
||||
state has changed? */
|
||||
if (msg->FindInt32("buttons", &buttons) == B_OK) {
|
||||
_MouseButtonEvent(buttons);
|
||||
}
|
||||
break;
|
||||
|
||||
case B_MOUSE_DOWN:
|
||||
case B_MOUSE_UP:
|
||||
/* _MouseButtonEvent() detects any and all buttons that may have
|
||||
changed state, as well as that button's new state */
|
||||
if (msg->FindInt32("buttons", &buttons) == B_OK) {
|
||||
_MouseButtonEvent(buttons);
|
||||
}
|
||||
break;
|
||||
|
||||
case B_MOUSE_WHEEL_CHANGED:
|
||||
float x, y;
|
||||
if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK
|
||||
&& msg->FindFloat("be:wheel_delta_y", &y) == B_OK) {
|
||||
_MouseWheelEvent((int)x, (int)y);
|
||||
}
|
||||
break;
|
||||
|
||||
case B_KEY_DOWN:
|
||||
case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */
|
||||
if (msg->FindInt32("key", &key) == B_OK) {
|
||||
_KeyEvent((SDL_Scancode)key, SDL_PRESSED);
|
||||
}
|
||||
break;
|
||||
|
||||
case B_KEY_UP:
|
||||
case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */
|
||||
if (msg->FindInt32("key", &key) == B_OK) {
|
||||
_KeyEvent(key, SDL_RELEASED);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* move it after switch{} so it's always handled
|
||||
that way we keep Haiku features like:
|
||||
- CTRL+Q to close window (and other shortcuts)
|
||||
- PrintScreen to make screenshot into /boot/home
|
||||
- etc.. */
|
||||
/* BDirectWindow::DispatchMessage(msg, target); */
|
||||
break;
|
||||
}
|
||||
|
||||
BDirectWindow::DispatchMessage(msg, target);
|
||||
}
|
||||
|
||||
/* Handle command messages */
|
||||
virtual void MessageReceived(BMessage* message) {
|
||||
switch (message->what) {
|
||||
/* Handle commands from SDL */
|
||||
case BWIN_SET_TITLE:
|
||||
_SetTitle(message);
|
||||
break;
|
||||
case BWIN_MOVE_WINDOW:
|
||||
_MoveTo(message);
|
||||
break;
|
||||
case BWIN_RESIZE_WINDOW:
|
||||
_ResizeTo(message);
|
||||
break;
|
||||
case BWIN_SET_BORDERED:
|
||||
_SetBordered(message);
|
||||
break;
|
||||
case BWIN_SHOW_WINDOW:
|
||||
Show();
|
||||
break;
|
||||
case BWIN_HIDE_WINDOW:
|
||||
Hide();
|
||||
break;
|
||||
case BWIN_MAXIMIZE_WINDOW:
|
||||
BWindow::Zoom();
|
||||
break;
|
||||
case BWIN_MINIMIZE_WINDOW:
|
||||
Minimize(true);
|
||||
break;
|
||||
case BWIN_RESTORE_WINDOW:
|
||||
_Restore();
|
||||
break;
|
||||
case BWIN_FULLSCREEN:
|
||||
_SetFullScreen(message);
|
||||
break;
|
||||
default:
|
||||
/* Perform normal message handling */
|
||||
BDirectWindow::MessageReceived(message);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Accessor methods */
|
||||
bool IsShown() { return _shown; }
|
||||
int32 GetID() { return _id; }
|
||||
uint32 GetRowBytes() { return _row_bytes; }
|
||||
int32 GetFbX() { return _bounds.left; }
|
||||
int32 GetFbY() { return _bounds.top; }
|
||||
bool ConnectionEnabled() { return !_connection_disabled; }
|
||||
bool Connected() { return _connected; }
|
||||
clipping_rect *GetClips() { return _clips; }
|
||||
int32 GetNumClips() { return _num_clips; }
|
||||
uint8* GetBufferPx() { return _bits; }
|
||||
int32 GetBytesPerPx() { return _bytes_per_px; }
|
||||
bool CanTrashWindowBuffer() { return _trash_window_buffer; }
|
||||
bool BufferExists() { return _buffer_created; }
|
||||
bool BufferIsDirty() { return _buffer_dirty; }
|
||||
BBitmap *GetBitmap() { return _bitmap; }
|
||||
#if SDL_VIDEO_OPENGL
|
||||
BGLView *GetGLView() { return _SDL_GLView; }
|
||||
#endif
|
||||
|
||||
/* Setter methods */
|
||||
void SetID(int32 id) { _id = id; }
|
||||
void SetBufferExists(bool bufferExists) { _buffer_created = bufferExists; }
|
||||
void LockBuffer() { _buffer_locker->Lock(); }
|
||||
void UnlockBuffer() { _buffer_locker->Unlock(); }
|
||||
void SetBufferDirty(bool bufferDirty) { _buffer_dirty = bufferDirty; }
|
||||
void SetTrashBuffer(bool trash) { _trash_window_buffer = trash; }
|
||||
void SetBitmap(BBitmap *bitmap) { _bitmap = bitmap; }
|
||||
|
||||
|
||||
private:
|
||||
/* Event redirection */
|
||||
void _MouseMotionEvent(BPoint &where, int32 transit) {
|
||||
if(transit == B_EXITED_VIEW) {
|
||||
/* Change mouse focus */
|
||||
if(_mouse_focused) {
|
||||
_MouseFocusEvent(false);
|
||||
}
|
||||
} else {
|
||||
/* Change mouse focus */
|
||||
if (!_mouse_focused) {
|
||||
_MouseFocusEvent(true);
|
||||
}
|
||||
BMessage msg(BAPP_MOUSE_MOVED);
|
||||
msg.AddInt32("x", (int)where.x);
|
||||
msg.AddInt32("y", (int)where.y);
|
||||
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
}
|
||||
|
||||
void _MouseFocusEvent(bool focusGained) {
|
||||
_mouse_focused = focusGained;
|
||||
BMessage msg(BAPP_MOUSE_FOCUS);
|
||||
msg.AddBool("focusGained", focusGained);
|
||||
_PostWindowEvent(msg);
|
||||
|
||||
/* FIXME: Why were these here?
|
||||
if false: be_app->SetCursor(B_HAND_CURSOR);
|
||||
if true: SDL_SetCursor(NULL); */
|
||||
}
|
||||
|
||||
void _MouseButtonEvent(int32 buttons) {
|
||||
int32 buttonStateChange = buttons ^ _last_buttons;
|
||||
|
||||
/* Make sure at least one button has changed state */
|
||||
if( !(buttonStateChange) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Add any mouse button events */
|
||||
if(buttonStateChange & B_PRIMARY_MOUSE_BUTTON) {
|
||||
_SendMouseButton(SDL_BUTTON_LEFT, buttons &
|
||||
B_PRIMARY_MOUSE_BUTTON);
|
||||
}
|
||||
if(buttonStateChange & B_SECONDARY_MOUSE_BUTTON) {
|
||||
_SendMouseButton(SDL_BUTTON_RIGHT, buttons &
|
||||
B_PRIMARY_MOUSE_BUTTON);
|
||||
}
|
||||
if(buttonStateChange & B_TERTIARY_MOUSE_BUTTON) {
|
||||
_SendMouseButton(SDL_BUTTON_MIDDLE, buttons &
|
||||
B_PRIMARY_MOUSE_BUTTON);
|
||||
}
|
||||
|
||||
_last_buttons = buttons;
|
||||
}
|
||||
|
||||
void _SendMouseButton(int32 button, int32 state) {
|
||||
BMessage msg(BAPP_MOUSE_BUTTON);
|
||||
msg.AddInt32("button-id", button);
|
||||
msg.AddInt32("button-state", state);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
void _MouseWheelEvent(int32 x, int32 y) {
|
||||
/* Create a message to pass along to the BeApp thread */
|
||||
BMessage msg(BAPP_MOUSE_WHEEL);
|
||||
msg.AddInt32("xticks", x);
|
||||
msg.AddInt32("yticks", y);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
|
||||
void _KeyEvent(int32 keyCode, int32 keyState) {
|
||||
/* Create a message to pass along to the BeApp thread */
|
||||
BMessage msg(BAPP_KEY);
|
||||
msg.AddInt32("key-state", keyState);
|
||||
msg.AddInt32("key-scancode", keyCode);
|
||||
be_app->PostMessage(&msg);
|
||||
/* Apparently SDL only uses the scancode */
|
||||
}
|
||||
|
||||
void _RepaintEvent() {
|
||||
/* Force a repaint: Call the SDL exposed event */
|
||||
BMessage msg(BAPP_REPAINT);
|
||||
_PostWindowEvent(msg);
|
||||
}
|
||||
void _PostWindowEvent(BMessage &msg) {
|
||||
msg.AddInt32("window-id", _id);
|
||||
be_app->PostMessage(&msg);
|
||||
}
|
||||
|
||||
/* Command methods (functions called upon by SDL) */
|
||||
void _SetTitle(BMessage *msg) {
|
||||
const char *title;
|
||||
if(
|
||||
msg->FindString("window-title", &title) != B_OK
|
||||
) {
|
||||
return;
|
||||
}
|
||||
SetTitle(title);
|
||||
}
|
||||
|
||||
void _MoveTo(BMessage *msg) {
|
||||
int32 x, y;
|
||||
if(
|
||||
msg->FindInt32("window-x", &x) != B_OK ||
|
||||
msg->FindInt32("window-y", &y) != B_OK
|
||||
) {
|
||||
return;
|
||||
}
|
||||
MoveTo(x, y);
|
||||
}
|
||||
|
||||
void _ResizeTo(BMessage *msg) {
|
||||
int32 w, h;
|
||||
if(
|
||||
msg->FindInt32("window-w", &w) != B_OK ||
|
||||
msg->FindInt32("window-h", &h) != B_OK
|
||||
) {
|
||||
return;
|
||||
}
|
||||
ResizeTo(w, h);
|
||||
}
|
||||
|
||||
void _SetBordered(BMessage *msg) {
|
||||
bool bEnabled;
|
||||
if(msg->FindBool("window-border", &bEnabled) != B_OK) {
|
||||
return;
|
||||
}
|
||||
SetLook(bEnabled ? B_BORDERED_WINDOW_LOOK : B_NO_BORDER_WINDOW_LOOK);
|
||||
}
|
||||
|
||||
void _Restore() {
|
||||
if(IsMinimized()) {
|
||||
Minimize(false);
|
||||
} else if(IsHidden()) {
|
||||
Show();
|
||||
} else if(_prev_frame != NULL) { /* Zoomed */
|
||||
MoveTo(_prev_frame->left, _prev_frame->top);
|
||||
ResizeTo(_prev_frame->Width(), _prev_frame->Height());
|
||||
}
|
||||
}
|
||||
|
||||
void _SetFullScreen(BMessage *msg) {
|
||||
bool fullscreen;
|
||||
if(
|
||||
msg->FindBool("fullscreen", &fullscreen) != B_OK
|
||||
) {
|
||||
return;
|
||||
}
|
||||
SetFullScreen(fullscreen);
|
||||
}
|
||||
|
||||
/* Members */
|
||||
#if SDL_VIDEO_OPENGL
|
||||
BGLView * _SDL_GLView;
|
||||
#endif
|
||||
|
||||
int32 _last_buttons;
|
||||
int32 _id; /* Window id used by SDL_BApp */
|
||||
bool _mouse_focused; /* Does this window have mouse focus? */
|
||||
bool _shown;
|
||||
bool _inhibit_resize;
|
||||
|
||||
BRect *_prev_frame; /* Previous position and size of the window */
|
||||
|
||||
/* Framebuffer members */
|
||||
bool _connected,
|
||||
_connection_disabled,
|
||||
_buffer_created,
|
||||
_buffer_dirty,
|
||||
_trash_window_buffer;
|
||||
uint8 *_bits;
|
||||
uint32 _row_bytes;
|
||||
clipping_rect _bounds;
|
||||
BLocker *_buffer_locker;
|
||||
clipping_rect *_clips;
|
||||
int32 _num_clips;
|
||||
int32 _bytes_per_px;
|
||||
thread_id _draw_thread_id;
|
||||
|
||||
BBitmap *_bitmap;
|
||||
};
|
||||
|
||||
|
||||
/* FIXME:
|
||||
* An explanation of framebuffer flags.
|
||||
*
|
||||
* _connected - Original variable used to let the drawing thread know
|
||||
* when changes are being made to the other framebuffer
|
||||
* members.
|
||||
* _connection_disabled - Used to signal to the drawing thread that the window
|
||||
* is closing, and the thread should exit.
|
||||
* _buffer_created - True if the current buffer is valid
|
||||
* _buffer_dirty - True if the window should be redrawn.
|
||||
* _trash_window_buffer - True if the window buffer needs to be trashed partway
|
||||
* through a draw cycle. Occurs when the previous
|
||||
* buffer provided by DirectConnected() is invalidated.
|
||||
*/
|
||||
#endif
|
||||
95
Engine/lib/sdl/src/video/haiku/SDL_bclipboard.cc
Normal file
95
Engine/lib/sdl/src/video/haiku/SDL_bclipboard.cc
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
|
||||
/* BWindow based framebuffer implementation */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <TypeConstants.h>
|
||||
|
||||
#include "SDL_BWin.h"
|
||||
#include "SDL_timer.h"
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int BE_SetClipboardText(_THIS, const char *text) {
|
||||
BMessage *clip = NULL;
|
||||
if(be_clipboard->Lock()) {
|
||||
be_clipboard->Clear();
|
||||
if((clip = be_clipboard->Data())) {
|
||||
/* Presumably the string of characters is ascii-format */
|
||||
ssize_t asciiLength = 0;
|
||||
for(; text[asciiLength] != 0; ++asciiLength) {}
|
||||
clip->AddData("text/plain", B_MIME_TYPE, &text, asciiLength);
|
||||
be_clipboard->Commit();
|
||||
}
|
||||
be_clipboard->Unlock();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *BE_GetClipboardText(_THIS) {
|
||||
BMessage *clip = NULL;
|
||||
const char *text = NULL;
|
||||
ssize_t length;
|
||||
char *result;
|
||||
if(be_clipboard->Lock()) {
|
||||
if((clip = be_clipboard->Data())) {
|
||||
/* Presumably the string of characters is ascii-format */
|
||||
clip->FindData("text/plain", B_MIME_TYPE, (const void**)&text,
|
||||
&length);
|
||||
} else {
|
||||
be_clipboard->Unlock();
|
||||
}
|
||||
be_clipboard->Unlock();
|
||||
}
|
||||
|
||||
if (!text) {
|
||||
result = SDL_strdup("");
|
||||
} else {
|
||||
/* Copy the data and pass on to SDL */
|
||||
result = (char*)SDL_calloc(1, sizeof(char*)*length);
|
||||
SDL_strlcpy(result, text, length);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
SDL_bool BE_HasClipboardText(_THIS) {
|
||||
SDL_bool result = SDL_FALSE;
|
||||
char *text = BE_GetClipboardText(_this);
|
||||
if (text) {
|
||||
result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE;
|
||||
SDL_free(text);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_HAIKU */
|
||||
31
Engine/lib/sdl/src/video/haiku/SDL_bclipboard.h
Normal file
31
Engine/lib/sdl/src/video/haiku/SDL_bclipboard.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#ifndef SDL_BCLIPBOARD_H
|
||||
#define SDL_BCLIPBOARD_H
|
||||
|
||||
extern int BE_SetClipboardText(_THIS, const char *text);
|
||||
extern char *BE_GetClipboardText(_THIS);
|
||||
extern SDL_bool BE_HasClipboardText(_THIS);
|
||||
|
||||
#endif
|
||||
39
Engine/lib/sdl/src/video/haiku/SDL_bevents.cc
Normal file
39
Engine/lib/sdl/src/video/haiku/SDL_bevents.cc
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
|
||||
#include "SDL_bevents.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void BE_PumpEvents(_THIS) {
|
||||
/* Since the event thread is its own thread, this isn't really necessary */
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_HAIKU */
|
||||
37
Engine/lib/sdl/src/video/haiku/SDL_bevents.h
Normal file
37
Engine/lib/sdl/src/video/haiku/SDL_bevents.h
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef SDL_BEVENTS_H
|
||||
#define SDL_BEVENTS_H
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void BE_PumpEvents(_THIS);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
254
Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.cc
Normal file
254
Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.cc
Normal file
|
|
@ -0,0 +1,254 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
|
||||
#include "SDL_bframebuffer.h"
|
||||
|
||||
#include <AppKit.h>
|
||||
#include <InterfaceKit.h>
|
||||
#include "SDL_bmodes.h"
|
||||
#include "SDL_BWin.h"
|
||||
|
||||
#include "../../main/haiku/SDL_BApp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int32 BE_UpdateOnce(SDL_Window *window);
|
||||
|
||||
static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
|
||||
return ((SDL_BWin*)(window->driverdata));
|
||||
}
|
||||
|
||||
static SDL_INLINE SDL_BApp *_GetBeApp() {
|
||||
return ((SDL_BApp*)be_app);
|
||||
}
|
||||
|
||||
int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window,
|
||||
Uint32 * format,
|
||||
void ** pixels, int *pitch) {
|
||||
SDL_BWin *bwin = _ToBeWin(window);
|
||||
BScreen bscreen;
|
||||
if(!bscreen.IsValid()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
while(!bwin->Connected()) { snooze(100); }
|
||||
|
||||
/* Make sure we have exclusive access to frame buffer data */
|
||||
bwin->LockBuffer();
|
||||
|
||||
/* format */
|
||||
display_mode bmode;
|
||||
bscreen.GetMode(&bmode);
|
||||
int32 bpp = BE_ColorSpaceToBitsPerPixel(bmode.space);
|
||||
*format = BE_BPPToSDLPxFormat(bpp);
|
||||
|
||||
/* Create the new bitmap object */
|
||||
BBitmap *bitmap = bwin->GetBitmap();
|
||||
|
||||
if(bitmap) {
|
||||
delete bitmap;
|
||||
}
|
||||
bitmap = new BBitmap(bwin->Bounds(), (color_space)bmode.space,
|
||||
false, /* Views not accepted */
|
||||
true); /* Contiguous memory required */
|
||||
|
||||
if(bitmap->InitCheck() != B_OK) {
|
||||
return SDL_SetError("Could not initialize back buffer!\n");
|
||||
}
|
||||
|
||||
|
||||
bwin->SetBitmap(bitmap);
|
||||
|
||||
/* Set the pixel pointer */
|
||||
*pixels = bitmap->Bits();
|
||||
|
||||
/* pitch = width of window, in bytes */
|
||||
*pitch = bitmap->BytesPerRow();
|
||||
|
||||
bwin->SetBufferExists(true);
|
||||
bwin->SetTrashBuffer(false);
|
||||
bwin->UnlockBuffer();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
|
||||
const SDL_Rect * rects, int numrects) {
|
||||
if(!window)
|
||||
return 0;
|
||||
|
||||
SDL_BWin *bwin = _ToBeWin(window);
|
||||
|
||||
#ifdef DRAWTHREAD
|
||||
bwin->LockBuffer();
|
||||
bwin->SetBufferDirty(true);
|
||||
bwin->UnlockBuffer();
|
||||
#else
|
||||
bwin->SetBufferDirty(true);
|
||||
BE_UpdateOnce(window);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32 BE_DrawThread(void *data) {
|
||||
SDL_BWin *bwin = (SDL_BWin*)data;
|
||||
|
||||
BScreen bscreen;
|
||||
if(!bscreen.IsValid()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
while(bwin->ConnectionEnabled()) {
|
||||
if( bwin->Connected() && bwin->BufferExists() && bwin->BufferIsDirty() ) {
|
||||
bwin->LockBuffer();
|
||||
BBitmap *bitmap = NULL;
|
||||
bitmap = bwin->GetBitmap();
|
||||
int32 windowPitch = bitmap->BytesPerRow();
|
||||
int32 bufferPitch = bwin->GetRowBytes();
|
||||
uint8 *windowpx;
|
||||
uint8 *bufferpx;
|
||||
|
||||
int32 BPP = bwin->GetBytesPerPx();
|
||||
int32 windowSub = bwin->GetFbX() * BPP +
|
||||
bwin->GetFbY() * windowPitch;
|
||||
clipping_rect *clips = bwin->GetClips();
|
||||
int32 numClips = bwin->GetNumClips();
|
||||
int i, y;
|
||||
|
||||
/* Blit each clipping rectangle */
|
||||
bscreen.WaitForRetrace();
|
||||
for(i = 0; i < numClips; ++i) {
|
||||
clipping_rect rc = clips[i];
|
||||
/* Get addresses of the start of each clipping rectangle */
|
||||
int32 width = clips[i].right - clips[i].left + 1;
|
||||
int32 height = clips[i].bottom - clips[i].top + 1;
|
||||
bufferpx = bwin->GetBufferPx() +
|
||||
clips[i].top * bufferPitch + clips[i].left * BPP;
|
||||
windowpx = (uint8*)bitmap->Bits() +
|
||||
clips[i].top * windowPitch + clips[i].left * BPP -
|
||||
windowSub;
|
||||
|
||||
/* Copy each row of pixels from the window buffer into the frame
|
||||
buffer */
|
||||
for(y = 0; y < height; ++y)
|
||||
{
|
||||
|
||||
if(bwin->CanTrashWindowBuffer()) {
|
||||
goto escape; /* Break out before the buffer is killed */
|
||||
}
|
||||
|
||||
memcpy(bufferpx, windowpx, width * BPP);
|
||||
bufferpx += bufferPitch;
|
||||
windowpx += windowPitch;
|
||||
}
|
||||
}
|
||||
|
||||
bwin->SetBufferDirty(false);
|
||||
escape:
|
||||
bwin->UnlockBuffer();
|
||||
} else {
|
||||
snooze(16000);
|
||||
}
|
||||
}
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window) {
|
||||
SDL_BWin *bwin = _ToBeWin(window);
|
||||
|
||||
bwin->LockBuffer();
|
||||
|
||||
/* Free and clear the window buffer */
|
||||
BBitmap *bitmap = bwin->GetBitmap();
|
||||
delete bitmap;
|
||||
bwin->SetBitmap(NULL);
|
||||
bwin->SetBufferExists(false);
|
||||
bwin->UnlockBuffer();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* This was written to test if certain errors were caused by threading issues.
|
||||
* The specific issues have since become rare enough that they may have been
|
||||
* solved, but I doubt it- they were pretty sporadic before now.
|
||||
*/
|
||||
int32 BE_UpdateOnce(SDL_Window *window) {
|
||||
SDL_BWin *bwin = _ToBeWin(window);
|
||||
BScreen bscreen;
|
||||
if(!bscreen.IsValid()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(bwin->ConnectionEnabled() && bwin->Connected()) {
|
||||
bwin->LockBuffer();
|
||||
int32 windowPitch = window->surface->pitch;
|
||||
int32 bufferPitch = bwin->GetRowBytes();
|
||||
uint8 *windowpx;
|
||||
uint8 *bufferpx;
|
||||
|
||||
int32 BPP = bwin->GetBytesPerPx();
|
||||
uint8 *windowBaseAddress = (uint8*)window->surface->pixels;
|
||||
int32 windowSub = bwin->GetFbX() * BPP +
|
||||
bwin->GetFbY() * windowPitch;
|
||||
clipping_rect *clips = bwin->GetClips();
|
||||
int32 numClips = bwin->GetNumClips();
|
||||
int i, y;
|
||||
|
||||
/* Blit each clipping rectangle */
|
||||
bscreen.WaitForRetrace();
|
||||
for(i = 0; i < numClips; ++i) {
|
||||
clipping_rect rc = clips[i];
|
||||
/* Get addresses of the start of each clipping rectangle */
|
||||
int32 width = clips[i].right - clips[i].left + 1;
|
||||
int32 height = clips[i].bottom - clips[i].top + 1;
|
||||
bufferpx = bwin->GetBufferPx() +
|
||||
clips[i].top * bufferPitch + clips[i].left * BPP;
|
||||
windowpx = windowBaseAddress +
|
||||
clips[i].top * windowPitch + clips[i].left * BPP - windowSub;
|
||||
|
||||
/* Copy each row of pixels from the window buffer into the frame
|
||||
buffer */
|
||||
for(y = 0; y < height; ++y)
|
||||
{
|
||||
memcpy(bufferpx, windowpx, width * BPP);
|
||||
bufferpx += bufferPitch;
|
||||
windowpx += windowPitch;
|
||||
}
|
||||
}
|
||||
bwin->UnlockBuffer();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_HAIKU */
|
||||
45
Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.h
Normal file
45
Engine/lib/sdl/src/video/haiku/SDL_bframebuffer.h
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef SDL_BFRAMEBUFFER_H
|
||||
#define SDL_BFRAMEBUFFER_H
|
||||
#include <SupportDefs.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define DRAWTHREAD
|
||||
|
||||
#include "../SDL_sysvideo.h"
|
||||
|
||||
extern int BE_CreateWindowFramebuffer(_THIS, SDL_Window * window,
|
||||
Uint32 * format,
|
||||
void ** pixels, int *pitch);
|
||||
extern int BE_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
|
||||
const SDL_Rect * rects, int numrects);
|
||||
extern void BE_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
|
||||
extern int32 BE_DrawThread(void *data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
188
Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.cc
Normal file
188
Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.cc
Normal file
|
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
|
||||
#include <SupportDefs.h>
|
||||
#include <support/UTF8.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "SDL_events.h"
|
||||
#include "SDL_keycode.h"
|
||||
|
||||
#include "SDL_bkeyboard.h"
|
||||
|
||||
|
||||
#define KEYMAP_SIZE 128
|
||||
|
||||
|
||||
static SDL_Scancode keymap[KEYMAP_SIZE];
|
||||
static int8 keystate[KEYMAP_SIZE];
|
||||
|
||||
void BE_InitOSKeymap() {
|
||||
for( uint i = 0; i < SDL_TABLESIZE(keymap); ++i ) {
|
||||
keymap[i] = SDL_SCANCODE_UNKNOWN;
|
||||
}
|
||||
|
||||
for( uint i = 0; i < KEYMAP_SIZE; ++i ) {
|
||||
keystate[i] = SDL_RELEASED;
|
||||
}
|
||||
|
||||
keymap[0x01] = SDL_GetScancodeFromKey(SDLK_ESCAPE);
|
||||
keymap[B_F1_KEY] = SDL_GetScancodeFromKey(SDLK_F1);
|
||||
keymap[B_F2_KEY] = SDL_GetScancodeFromKey(SDLK_F2);
|
||||
keymap[B_F3_KEY] = SDL_GetScancodeFromKey(SDLK_F3);
|
||||
keymap[B_F4_KEY] = SDL_GetScancodeFromKey(SDLK_F4);
|
||||
keymap[B_F5_KEY] = SDL_GetScancodeFromKey(SDLK_F5);
|
||||
keymap[B_F6_KEY] = SDL_GetScancodeFromKey(SDLK_F6);
|
||||
keymap[B_F7_KEY] = SDL_GetScancodeFromKey(SDLK_F7);
|
||||
keymap[B_F8_KEY] = SDL_GetScancodeFromKey(SDLK_F8);
|
||||
keymap[B_F9_KEY] = SDL_GetScancodeFromKey(SDLK_F9);
|
||||
keymap[B_F10_KEY] = SDL_GetScancodeFromKey(SDLK_F10);
|
||||
keymap[B_F11_KEY] = SDL_GetScancodeFromKey(SDLK_F11);
|
||||
keymap[B_F12_KEY] = SDL_GetScancodeFromKey(SDLK_F12);
|
||||
keymap[B_PRINT_KEY] = SDL_GetScancodeFromKey(SDLK_PRINTSCREEN);
|
||||
keymap[B_SCROLL_KEY] = SDL_GetScancodeFromKey(SDLK_SCROLLLOCK);
|
||||
keymap[B_PAUSE_KEY] = SDL_GetScancodeFromKey(SDLK_PAUSE);
|
||||
keymap[0x11] = SDL_GetScancodeFromKey(SDLK_BACKQUOTE);
|
||||
keymap[0x12] = SDL_GetScancodeFromKey(SDLK_1);
|
||||
keymap[0x13] = SDL_GetScancodeFromKey(SDLK_2);
|
||||
keymap[0x14] = SDL_GetScancodeFromKey(SDLK_3);
|
||||
keymap[0x15] = SDL_GetScancodeFromKey(SDLK_4);
|
||||
keymap[0x16] = SDL_GetScancodeFromKey(SDLK_5);
|
||||
keymap[0x17] = SDL_GetScancodeFromKey(SDLK_6);
|
||||
keymap[0x18] = SDL_GetScancodeFromKey(SDLK_7);
|
||||
keymap[0x19] = SDL_GetScancodeFromKey(SDLK_8);
|
||||
keymap[0x1a] = SDL_GetScancodeFromKey(SDLK_9);
|
||||
keymap[0x1b] = SDL_GetScancodeFromKey(SDLK_0);
|
||||
keymap[0x1c] = SDL_GetScancodeFromKey(SDLK_MINUS);
|
||||
keymap[0x1d] = SDL_GetScancodeFromKey(SDLK_EQUALS);
|
||||
keymap[0x1e] = SDL_GetScancodeFromKey(SDLK_BACKSPACE);
|
||||
keymap[0x1f] = SDL_GetScancodeFromKey(SDLK_INSERT);
|
||||
keymap[0x20] = SDL_GetScancodeFromKey(SDLK_HOME);
|
||||
keymap[0x21] = SDL_GetScancodeFromKey(SDLK_PAGEUP);
|
||||
keymap[0x22] = SDL_GetScancodeFromKey(SDLK_NUMLOCKCLEAR);
|
||||
keymap[0x23] = SDL_GetScancodeFromKey(SDLK_KP_DIVIDE);
|
||||
keymap[0x24] = SDL_GetScancodeFromKey(SDLK_KP_MULTIPLY);
|
||||
keymap[0x25] = SDL_GetScancodeFromKey(SDLK_KP_MINUS);
|
||||
keymap[0x26] = SDL_GetScancodeFromKey(SDLK_TAB);
|
||||
keymap[0x27] = SDL_GetScancodeFromKey(SDLK_q);
|
||||
keymap[0x28] = SDL_GetScancodeFromKey(SDLK_w);
|
||||
keymap[0x29] = SDL_GetScancodeFromKey(SDLK_e);
|
||||
keymap[0x2a] = SDL_GetScancodeFromKey(SDLK_r);
|
||||
keymap[0x2b] = SDL_GetScancodeFromKey(SDLK_t);
|
||||
keymap[0x2c] = SDL_GetScancodeFromKey(SDLK_y);
|
||||
keymap[0x2d] = SDL_GetScancodeFromKey(SDLK_u);
|
||||
keymap[0x2e] = SDL_GetScancodeFromKey(SDLK_i);
|
||||
keymap[0x2f] = SDL_GetScancodeFromKey(SDLK_o);
|
||||
keymap[0x30] = SDL_GetScancodeFromKey(SDLK_p);
|
||||
keymap[0x31] = SDL_GetScancodeFromKey(SDLK_LEFTBRACKET);
|
||||
keymap[0x32] = SDL_GetScancodeFromKey(SDLK_RIGHTBRACKET);
|
||||
keymap[0x33] = SDL_GetScancodeFromKey(SDLK_BACKSLASH);
|
||||
keymap[0x34] = SDL_GetScancodeFromKey(SDLK_DELETE);
|
||||
keymap[0x35] = SDL_GetScancodeFromKey(SDLK_END);
|
||||
keymap[0x36] = SDL_GetScancodeFromKey(SDLK_PAGEDOWN);
|
||||
keymap[0x37] = SDL_GetScancodeFromKey(SDLK_KP_7);
|
||||
keymap[0x38] = SDL_GetScancodeFromKey(SDLK_KP_8);
|
||||
keymap[0x39] = SDL_GetScancodeFromKey(SDLK_KP_9);
|
||||
keymap[0x3a] = SDL_GetScancodeFromKey(SDLK_KP_PLUS);
|
||||
keymap[0x3b] = SDL_GetScancodeFromKey(SDLK_CAPSLOCK);
|
||||
keymap[0x3c] = SDL_GetScancodeFromKey(SDLK_a);
|
||||
keymap[0x3d] = SDL_GetScancodeFromKey(SDLK_s);
|
||||
keymap[0x3e] = SDL_GetScancodeFromKey(SDLK_d);
|
||||
keymap[0x3f] = SDL_GetScancodeFromKey(SDLK_f);
|
||||
keymap[0x40] = SDL_GetScancodeFromKey(SDLK_g);
|
||||
keymap[0x41] = SDL_GetScancodeFromKey(SDLK_h);
|
||||
keymap[0x42] = SDL_GetScancodeFromKey(SDLK_j);
|
||||
keymap[0x43] = SDL_GetScancodeFromKey(SDLK_k);
|
||||
keymap[0x44] = SDL_GetScancodeFromKey(SDLK_l);
|
||||
keymap[0x45] = SDL_GetScancodeFromKey(SDLK_SEMICOLON);
|
||||
keymap[0x46] = SDL_GetScancodeFromKey(SDLK_QUOTE);
|
||||
keymap[0x47] = SDL_GetScancodeFromKey(SDLK_RETURN);
|
||||
keymap[0x48] = SDL_GetScancodeFromKey(SDLK_KP_4);
|
||||
keymap[0x49] = SDL_GetScancodeFromKey(SDLK_KP_5);
|
||||
keymap[0x4a] = SDL_GetScancodeFromKey(SDLK_KP_6);
|
||||
keymap[0x4b] = SDL_GetScancodeFromKey(SDLK_LSHIFT);
|
||||
keymap[0x4c] = SDL_GetScancodeFromKey(SDLK_z);
|
||||
keymap[0x4d] = SDL_GetScancodeFromKey(SDLK_x);
|
||||
keymap[0x4e] = SDL_GetScancodeFromKey(SDLK_c);
|
||||
keymap[0x4f] = SDL_GetScancodeFromKey(SDLK_v);
|
||||
keymap[0x50] = SDL_GetScancodeFromKey(SDLK_b);
|
||||
keymap[0x51] = SDL_GetScancodeFromKey(SDLK_n);
|
||||
keymap[0x52] = SDL_GetScancodeFromKey(SDLK_m);
|
||||
keymap[0x53] = SDL_GetScancodeFromKey(SDLK_COMMA);
|
||||
keymap[0x54] = SDL_GetScancodeFromKey(SDLK_PERIOD);
|
||||
keymap[0x55] = SDL_GetScancodeFromKey(SDLK_SLASH);
|
||||
keymap[0x56] = SDL_GetScancodeFromKey(SDLK_RSHIFT);
|
||||
keymap[0x57] = SDL_GetScancodeFromKey(SDLK_UP);
|
||||
keymap[0x58] = SDL_GetScancodeFromKey(SDLK_KP_1);
|
||||
keymap[0x59] = SDL_GetScancodeFromKey(SDLK_KP_2);
|
||||
keymap[0x5a] = SDL_GetScancodeFromKey(SDLK_KP_3);
|
||||
keymap[0x5b] = SDL_GetScancodeFromKey(SDLK_KP_ENTER);
|
||||
keymap[0x5c] = SDL_GetScancodeFromKey(SDLK_LCTRL);
|
||||
keymap[0x5d] = SDL_GetScancodeFromKey(SDLK_LALT);
|
||||
keymap[0x5e] = SDL_GetScancodeFromKey(SDLK_SPACE);
|
||||
keymap[0x5f] = SDL_GetScancodeFromKey(SDLK_RALT);
|
||||
keymap[0x60] = SDL_GetScancodeFromKey(SDLK_RCTRL);
|
||||
keymap[0x61] = SDL_GetScancodeFromKey(SDLK_LEFT);
|
||||
keymap[0x62] = SDL_GetScancodeFromKey(SDLK_DOWN);
|
||||
keymap[0x63] = SDL_GetScancodeFromKey(SDLK_RIGHT);
|
||||
keymap[0x64] = SDL_GetScancodeFromKey(SDLK_KP_0);
|
||||
keymap[0x65] = SDL_GetScancodeFromKey(SDLK_KP_PERIOD);
|
||||
keymap[0x66] = SDL_GetScancodeFromKey(SDLK_LGUI);
|
||||
keymap[0x67] = SDL_GetScancodeFromKey(SDLK_RGUI);
|
||||
keymap[0x68] = SDL_GetScancodeFromKey(SDLK_MENU);
|
||||
keymap[0x69] = SDL_GetScancodeFromKey(SDLK_2); /* SDLK_EURO */
|
||||
keymap[0x6a] = SDL_GetScancodeFromKey(SDLK_KP_EQUALS);
|
||||
keymap[0x6b] = SDL_GetScancodeFromKey(SDLK_POWER);
|
||||
}
|
||||
|
||||
SDL_Scancode BE_GetScancodeFromBeKey(int32 bkey) {
|
||||
if(bkey > 0 && bkey < (int32)SDL_TABLESIZE(keymap)) {
|
||||
return keymap[bkey];
|
||||
} else {
|
||||
return SDL_SCANCODE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
int8 BE_GetKeyState(int32 bkey) {
|
||||
if(bkey > 0 && bkey < KEYMAP_SIZE) {
|
||||
return keystate[bkey];
|
||||
} else {
|
||||
return SDL_RELEASED;
|
||||
}
|
||||
}
|
||||
|
||||
void BE_SetKeyState(int32 bkey, int8 state) {
|
||||
if(bkey > 0 && bkey < KEYMAP_SIZE) {
|
||||
keystate[bkey] = state;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_HAIKU */
|
||||
42
Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.h
Normal file
42
Engine/lib/sdl/src/video/haiku/SDL_bkeyboard.h
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef SDL_BKEYBOARD_H
|
||||
#define SDL_BKEYBOARD_H
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../../../include/SDL_keyboard.h"
|
||||
|
||||
extern void BE_InitOSKeymap();
|
||||
extern SDL_Scancode BE_GetScancodeFromBeKey(int32 bkey);
|
||||
extern int8 BE_GetKeyState(int32 bkey);
|
||||
extern void BE_SetKeyState(int32 bkey, int8 state);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
331
Engine/lib/sdl/src/video/haiku/SDL_bmodes.cc
Normal file
331
Engine/lib/sdl/src/video/haiku/SDL_bmodes.cc
Normal file
|
|
@ -0,0 +1,331 @@
|
|||
/*
|
||||
Simple DirectMedia Layer
|
||||
Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
#include "../../SDL_internal.h"
|
||||
|
||||
#if SDL_VIDEO_DRIVER_HAIKU
|
||||
|
||||
#include <AppKit.h>
|
||||
#include <InterfaceKit.h>
|
||||
#include "SDL_bmodes.h"
|
||||
#include "SDL_BWin.h"
|
||||
|
||||
#if SDL_VIDEO_OPENGL
|
||||
#include "SDL_bopengl.h"
|
||||
#endif
|
||||
|
||||
#include "../../main/haiku/SDL_BApp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define WRAP_BMODE 1 /* FIXME: Some debate as to whether this is necessary */
|
||||
|
||||
#if WRAP_BMODE
|
||||
/* This wrapper is here so that the driverdata can be freed without freeing
|
||||
the display_mode structure */
|
||||
typedef struct SDL_DisplayModeData {
|
||||
display_mode *bmode;
|
||||
};
|
||||
#endif
|
||||
|
||||
static SDL_INLINE SDL_BWin *_ToBeWin(SDL_Window *window) {
|
||||
return ((SDL_BWin*)(window->driverdata));
|
||||
}
|
||||
|
||||
static SDL_INLINE SDL_BApp *_GetBeApp() {
|
||||
return ((SDL_BApp*)be_app);
|
||||
}
|
||||
|
||||
static SDL_INLINE display_mode * _ExtractBMode(SDL_DisplayMode *mode) {
|
||||
#if WRAP_BMODE
|
||||
return ((SDL_DisplayModeData*)mode->driverdata)->bmode;
|
||||
#else
|
||||
return (display_mode*)(mode->driverdata);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Copied from haiku/trunk/src/preferences/screen/ScreenMode.cpp */
|
||||
static float get_refresh_rate(display_mode &mode) {
|
||||
return float(mode.timing.pixel_clock * 1000)
|
||||
/ float(mode.timing.h_total * mode.timing.v_total);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/* TODO:
|
||||
* This is a useful debugging tool. Uncomment and insert into code as needed.
|
||||
*/
|
||||
void _SpoutModeData(display_mode *bmode) {
|
||||
printf("BMode:\n");
|
||||
printf("\tw,h = (%i,%i)\n", bmode->virtual_width, bmode->virtual_height);
|
||||
printf("\th,v = (%i,%i)\n", bmode->h_display_start,
|
||||
bmode->v_display_start);
|
||||
if(bmode->flags) {
|
||||
printf("\tFlags:\n");
|
||||
if(bmode->flags & B_SCROLL) {
|
||||
printf("\t\tB_SCROLL\n");
|
||||
}
|
||||
if(bmode->flags & B_8_BIT_DAC) {
|
||||
printf("\t\tB_8_BIT_DAC\n");
|
||||
}
|
||||
if(bmode->flags & B_HARDWARE_CURSOR) {
|
||||
printf("\t\tB_HARDWARE_CURSOR\n");
|
||||
}
|
||||
if(bmode->flags & B_PARALLEL_ACCESS) {
|
||||
printf("\t\tB_PARALLEL_ACCESS\n");
|
||||
}
|
||||
if(bmode->flags & B_DPMS) {
|
||||
printf("\t\tB_DPMS\n");
|
||||
}
|
||||
if(bmode->flags & B_IO_FB_NA) {
|
||||
printf("\t\tB_IO_FB_NA\n");
|
||||
}
|
||||
}
|
||||
printf("\tTiming:\n");
|
||||
printf("\t\tpx clock: %i\n", bmode->timing.pixel_clock);
|
||||
printf("\t\th - display: %i sync start: %i sync end: %i total: %i\n",
|
||||
bmode->timing.h_display, bmode->timing.h_sync_start,
|
||||
bmode->timing.h_sync_end, bmode->timing.h_total);
|
||||
printf("\t\tv - display: %i sync start: %i sync end: %i total: %i\n",
|
||||
bmode->timing.v_display, bmode->timing.v_sync_start,
|
||||
bmode->timing.v_sync_end, bmode->timing.v_total);
|
||||
if(bmode->timing.flags) {
|
||||
printf("\t\tFlags:\n");
|
||||
if(bmode->timing.flags & B_BLANK_PEDESTAL) {
|
||||
printf("\t\t\tB_BLANK_PEDESTAL\n");
|
||||
}
|
||||
if(bmode->timing.flags & B_TIMING_INTERLACED) {
|
||||
printf("\t\t\tB_TIMING_INTERLACED\n");
|
||||
}
|
||||
if(bmode->timing.flags & B_POSITIVE_HSYNC) {
|
||||
printf("\t\t\tB_POSITIVE_HSYNC\n");
|
||||
}
|
||||
if(bmode->timing.flags & B_POSITIVE_VSYNC) {
|
||||
printf("\t\t\tB_POSITIVE_VSYNC\n");
|
||||
}
|
||||
if(bmode->timing.flags & B_SYNC_ON_GREEN) {
|
||||
printf("\t\t\tB_SYNC_ON_GREEN\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int32 BE_ColorSpaceToBitsPerPixel(uint32 colorspace)
|
||||
{
|
||||
int bitsperpixel;
|
||||
|
||||
bitsperpixel = 0;
|
||||
switch (colorspace) {
|
||||
case B_CMAP8:
|
||||
bitsperpixel = 8;
|
||||
break;
|
||||
case B_RGB15:
|
||||
case B_RGBA15:
|
||||
case B_RGB15_BIG:
|
||||
case B_RGBA15_BIG:
|
||||
bitsperpixel = 15;
|
||||
break;
|
||||
case B_RGB16:
|
||||
case B_RGB16_BIG:
|
||||
bitsperpixel = 16;
|
||||
break;
|
||||
case B_RGB32:
|
||||
case B_RGBA32:
|
||||
case B_RGB32_BIG:
|
||||
case B_RGBA32_BIG:
|
||||
bitsperpixel = 32;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return(bitsperpixel);
|
||||
}
|
||||
|
||||
int32 BE_BPPToSDLPxFormat(int32 bpp) {
|
||||
/* Translation taken from SDL_windowsmodes.c */
|
||||
switch (bpp) {
|
||||
case 32:
|
||||
return SDL_PIXELFORMAT_RGB888;
|
||||
break;
|
||||
case 24: /* May not be supported by Haiku */
|
||||
return SDL_PIXELFORMAT_RGB24;
|
||||
break;
|
||||
case 16:
|
||||
return SDL_PIXELFORMAT_RGB565;
|
||||
break;
|
||||
case 15:
|
||||
return SDL_PIXELFORMAT_RGB555;
|
||||
break;
|
||||
case 8:
|
||||
return SDL_PIXELFORMAT_INDEX8;
|
||||
break;
|
||||
case 4: /* May not be supported by Haiku */
|
||||
return SDL_PIXELFORMAT_INDEX4LSB;
|
||||
break;
|
||||
}
|
||||
|
||||
/* May never get here, but safer and needed to shut up compiler */
|
||||
SDL_SetError("Invalid bpp value");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _BDisplayModeToSdlDisplayMode(display_mode *bmode,
|
||||
SDL_DisplayMode *mode) {
|
||||
mode->w = bmode->virtual_width;
|
||||
mode->h = bmode->virtual_height;
|
||||
mode->refresh_rate = (int)get_refresh_rate(*bmode);
|
||||
|
||||
#if WRAP_BMODE
|
||||
SDL_DisplayModeData *data = (SDL_DisplayModeData*)SDL_calloc(1,
|
||||
sizeof(SDL_DisplayModeData));
|
||||
data->bmode = bmode;
|
||||
|
||||
mode->driverdata = data;
|
||||
|
||||
#else
|
||||
|
||||
mode->driverdata = bmode;
|
||||
#endif
|
||||
|
||||
/* Set the format */
|
||||
int32 bpp = BE_ColorSpaceToBitsPerPixel(bmode->space);
|
||||
mode->format = BE_BPPToSDLPxFormat(bpp);
|
||||
}
|
||||
|
||||
/* Later, there may be more than one monitor available */
|
||||
static void _AddDisplay(BScreen *screen) {
|
||||
SDL_VideoDisplay display;
|
||||
SDL_DisplayMode *mode = (SDL_DisplayMode*)SDL_calloc(1,
|
||||
sizeof(SDL_DisplayMode));
|
||||
display_mode *bmode = (display_mode*)SDL_calloc(1, sizeof(display_mode));
|
||||
screen->GetMode(bmode);
|
||||
|
||||
_BDisplayModeToSdlDisplayMode(bmode, mode);
|
||||
|
||||
SDL_zero(display);
|
||||
display.desktop_mode = *mode;
|
||||
display.current_mode = *mode;
|
||||
|
||||
SDL_AddVideoDisplay(&display);
|
||||
}
|
||||
|
||||
/*
|
||||
* Functions called by SDL
|
||||
*/
|
||||
|
||||
int BE_InitModes(_THIS) {
|
||||
BScreen screen;
|
||||
|
||||
/* TODO: When Haiku supports multiple display screens, call
|
||||
_AddDisplayScreen() for each of them. */
|
||||
_AddDisplay(&screen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BE_QuitModes(_THIS) {
|
||||
/* FIXME: Nothing really needs to be done here at the moment? */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int BE_GetDisplayBounds(_THIS, SDL_VideoDisplay *display, SDL_Rect *rect) {
|
||||
BScreen bscreen;
|
||||
BRect rc = bscreen.Frame();
|
||||
rect->x = (int)rc.left;
|
||||
rect->y = (int)rc.top;
|
||||
rect->w = (int)rc.Width() + 1;
|
||||
rect->h = (int)rc.Height() + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void BE_GetDisplayModes(_THIS, SDL_VideoDisplay *display) {
|
||||
/* Get the current screen */
|
||||
BScreen bscreen;
|
||||
|
||||
/* Iterate through all of the modes */
|
||||
SDL_DisplayMode mode;
|
||||
display_mode this_bmode;
|
||||
display_mode *bmodes;
|
||||
uint32 count, i;
|
||||
|
||||
/* Get graphics-hardware supported modes */
|
||||
bscreen.GetModeList(&bmodes, &count);
|
||||
bscreen.GetMode(&this_bmode);
|
||||
|
||||
for(i = 0; i < count; ++i) {
|
||||
// FIXME: Apparently there are errors with colorspace changes
|
||||
if (bmodes[i].space == this_bmode.space) {
|
||||
_BDisplayModeToSdlDisplayMode(&bmodes[i], &mode);
|
||||
SDL_AddDisplayMode(display, &mode);
|
||||
}
|
||||
}
|
||||
free(bmodes);
|
||||
}
|
||||
|
||||
|
||||
int BE_SetDisplayMode(_THIS, SDL_VideoDisplay *display, SDL_DisplayMode *mode){
|
||||
/* Get the current screen */
|
||||
BScreen bscreen;
|
||||
if(!bscreen.IsValid()) {
|
||||
printf(__FILE__": %d - ERROR: BAD SCREEN\n", __LINE__);
|
||||
}
|
||||
|
||||
/* Set the mode using the driver data */
|
||||
display_mode *bmode = _ExtractBMode(mode);
|
||||
|
||||
|
||||
/* FIXME: Is the first option always going to be the right one? */
|
||||
uint32 c = 0, i;
|
||||
display_mode *bmode_list;
|
||||
bscreen.GetModeList(&bmode_list, &c);
|
||||
for(i = 0; i < c; ++i) {
|
||||
if( bmode_list[i].space == bmode->space &&
|
||||
bmode_list[i].virtual_width == bmode->virtual_width &&
|
||||
bmode_list[i].virtual_height == bmode->virtual_height ) {
|
||||
bmode = &bmode_list[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(bscreen.SetMode(bmode) != B_OK) {
|
||||
return SDL_SetError("Bad video mode\n");
|
||||
}
|
||||
|
||||
free(bmode_list);
|
||||
|
||||
#if SDL_VIDEO_OPENGL
|
||||
/* FIXME: Is there some way to reboot the OpenGL context? This doesn't
|
||||
help */
|
||||
// BE_GL_RebootContexts(_this);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SDL_VIDEO_DRIVER_HAIKU */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue