From 1d02a7168ef044def361bcca055c643e39345fbe Mon Sep 17 00:00:00 2001 From: Darren Alton Date: Thu, 10 Jul 2008 23:35:01 +0000 Subject: [PATCH] Removed old touchscreen system, starting to implement mouse-based touchscreen. Also, more work on a non-software-rendering video driver --- Makefile.ds | 3 - include/SDL.h | 1 - include/SDL_config_nintendods.h | 2 - include/SDL_events.h | 25 - include/SDL_touchscreen.h | 153 ------ src/SDL.c | 25 - src/events/SDL_events.c | 15 - src/touchscreen/SDL_systouchscreen.h | 78 --- src/touchscreen/SDL_touchscreen.c | 546 --------------------- src/touchscreen/SDL_touchscreen_c.h | 53 -- src/touchscreen/dummy/SDL_systouchscreen.c | 90 ---- src/touchscreen/nds/SDL_systouchscreen.c | 126 ----- src/video/nds/SDL_ndsevents.c | 10 + src/video/nds/SDL_ndsrender.c | 235 ++++++++- 14 files changed, 233 insertions(+), 1129 deletions(-) delete mode 100644 include/SDL_touchscreen.h delete mode 100644 src/touchscreen/SDL_systouchscreen.h delete mode 100644 src/touchscreen/SDL_touchscreen.c delete mode 100644 src/touchscreen/SDL_touchscreen_c.h delete mode 100644 src/touchscreen/dummy/SDL_systouchscreen.c delete mode 100644 src/touchscreen/nds/SDL_systouchscreen.c diff --git a/Makefile.ds b/Makefile.ds index 2c3a4e9e6..47dfa481a 100644 --- a/Makefile.ds +++ b/Makefile.ds @@ -51,9 +51,6 @@ src/events/SDL_windowevents.c \ src/file/SDL_rwops.c \ src/joystick/nds/SDL_sysjoystick.c \ src/joystick/SDL_joystick.c \ -src/touchscreen/nds/SDL_systouchscreen.c \ -src/touchscreen/dummy/SDL_systouchscreen.c \ -src/touchscreen/SDL_touchscreen.c \ src/stdlib/SDL_getenv.c \ src/stdlib/SDL_iconv.c \ src/stdlib/SDL_malloc.c \ diff --git a/include/SDL.h b/include/SDL.h index 7c5fce48a..e079d2882 100644 --- a/include/SDL.h +++ b/include/SDL.h @@ -109,7 +109,6 @@ extern "C" { #define SDL_INIT_VIDEO 0x00000020 #define SDL_INIT_CDROM 0x00000100 #define SDL_INIT_JOYSTICK 0x00000200 -#define SDL_INIT_TOUCHSCREEN 0x00000400 #define SDL_INIT_NOPARACHUTE 0x00100000 /* Don't catch fatal signals */ #define SDL_INIT_EVENTTHREAD 0x01000000 /* Not supported on all OS's */ #define SDL_INIT_EVERYTHING 0x0000FFFF diff --git a/include/SDL_config_nintendods.h b/include/SDL_config_nintendods.h index 5e1628396..79e1e79c6 100644 --- a/include/SDL_config_nintendods.h +++ b/include/SDL_config_nintendods.h @@ -100,8 +100,6 @@ typedef unsigned __PTRDIFF_TYPE__ uintptr_t; /* Enable various input drivers */ #define SDL_JOYSTICK_NDS 1 /*#define SDL_JOYSTICK_DUMMY 1*/ -#define SDL_TOUCHSCREEN_NDS 1 -/*#define SDL_TOUCHSCREEN_DUMMY 1*/ /* DS has no dynamic linking afaik */ #define SDL_LOADSO_DISABLED 1 diff --git a/include/SDL_events.h b/include/SDL_events.h index a84a53b5f..d26cf09d3 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -35,7 +35,6 @@ #include "SDL_keyboard.h" #include "SDL_mouse.h" #include "SDL_joystick.h" -#include "SDL_touchscreen.h" #include "SDL_quit.h" #include "begin_code.h" @@ -71,9 +70,6 @@ typedef enum SDL_JOYHATMOTION, /**< Joystick hat position change */ SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ SDL_JOYBUTTONUP, /**< Joystick button released */ - SDL_TOUCHPRESSED, /**< Touchscreen pressed */ - SDL_TOUCHRELEASED, /**< Touchscreen no longer pressed */ - SDL_TOUCHMOTION, /**< Touchscreen point motion */ SDL_QUIT, /**< User-requested quit */ SDL_SYSWMEVENT, /**< System specific event */ SDL_EVENT_RESERVED1, /**< Reserved for future use... */ @@ -115,11 +111,6 @@ typedef enum SDL_EVENTMASK(SDL_JOYBALLMOTION) | SDL_EVENTMASK(SDL_JOYHATMOTION) | SDL_EVENTMASK(SDL_JOYBUTTONDOWN) | SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_TOUCHPRESSEDMASK = SDL_EVENTMASK(SDL_TOUCHPRESSED), - SDL_TOUCHRELEASEDMASK = SDL_EVENTMASK(SDL_TOUCHRELEASED), - SDL_TOUCHMOTIONMASK = SDL_EVENTMASK(SDL_TOUCHMOTION), - SDL_TOUCHEVENTMASK = SDL_EVENTMASK(SDL_TOUCHPRESSED) | - SDL_EVENTMASK(SDL_TOUCHRELEASED) | SDL_EVENTMASK(SDL_TOUCHMOTION), SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) } SDL_EventMask; @@ -272,21 +263,6 @@ typedef struct SDL_JoyButtonEvent Uint8 state; /**< SDL_PRESSED or SDL_RELEASED */ } SDL_JoyButtonEvent; -/** - * \struct SDL_TouchEvent - * - * \brief Touchscreen motion event structure (event.touch.*) - */ -typedef struct SDL_TouchEvent -{ - Uint8 type; /**< SDL_TOUCHMOTION, SDL_TOUCHPRESS, SDL_TOUCHRELEASED */ - Uint8 which; /**< The touchscreen device index */ - int point; /**< The touch point index, relevant for multitouch. */ - int xpos; /**< The X coordinate of the touch point. */ - int ypos; /**< The Y coordinate of the touch point. */ - int pressure; /**< The pressure of the touch */ -} SDL_TouchEvent; - /** * \struct SDL_QuitEvent * @@ -358,7 +334,6 @@ typedef union SDL_Event SDL_JoyBallEvent jball; /**< Joystick ball event data */ SDL_JoyHatEvent jhat; /**< Joystick hat event data */ SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ - SDL_TouchEvent touch; /**< Touchscreen event data */ SDL_QuitEvent quit; /**< Quit request event data */ SDL_UserEvent user; /**< Custom event data */ SDL_SysWMEvent syswm; /**< System dependent window event data */ diff --git a/include/SDL_touchscreen.h b/include/SDL_touchscreen.h deleted file mode 100644 index 8fccb22a1..000000000 --- a/include/SDL_touchscreen.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ - -/** - * \file SDL_touchscreen.h - * - * Include file for SDL touchscreen event handling - */ - -#ifndef _SDL_touchscreen_h -#define _SDL_touchscreen_h - -#include "SDL_stdinc.h" -#include "SDL_error.h" - -#include "begin_code.h" -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -#endif - -/* In order to use these functions, SDL_Init() must have been called - with the SDL_INIT_TOUCHSCREEN flag. This causes SDL to scan the system - for touchscreens, and load appropriate drivers. -*/ - -/* The touchscreen structure used to identify an SDL touchscreen */ -struct _SDL_Touchscreen; -typedef struct _SDL_Touchscreen SDL_Touchscreen; - - -/* Function prototypes */ -/* - * Count the number of touchscreens attached to the system - */ -extern DECLSPEC int SDLCALL SDL_NumTouchscreens(void); - -/* - * Get the implementation dependent name of a touchscreen. - * This can be called before any touchscreens are opened. - * If no name can be found, this function returns NULL. - */ -extern DECLSPEC const char *SDLCALL SDL_TouchscreenName(int device_index); - -/* - * Open a touchscreen for use - the index passed as an argument refers to - * the N'th touchscreen on the system. This index is the value which will - * identify this touchscreen in future touchscreen events. - * - * This function returns a touchscreen identifier, or NULL if an error occurred. - */ -extern DECLSPEC SDL_Touchscreen *SDLCALL SDL_TouchscreenOpen(int device_index); - -/* - * Returns 1 if the touchscreen has been opened, or 0 if it has not. - */ -extern DECLSPEC int SDLCALL SDL_TouchscreenOpened(int device_index); - -/* - * Get the device index of an opened touchscreen. - */ -extern DECLSPEC int SDLCALL SDL_TouchscreenIndex(SDL_Touchscreen * touchscreen); - -/* - * Get the number of points a touchscreen can register at a time - * (single or multi-touch.) - */ -extern DECLSPEC int SDLCALL SDL_TouchscreenMaxPoints(SDL_Touchscreen * touchscreen); - -/* - * Update the current state of the open touchscreens. - * This is called automatically by the event loop if any touchscreen - * events are enabled. - */ -extern DECLSPEC void SDLCALL SDL_TouchscreenUpdate(void); - -/* - * Enable/disable touchscreen event polling. - * If touchscreen events are disabled, you must call SDL_TouchscreenUpdate() - * yourself and check the state of the touchscreen when you want touchscreen - * information. - * The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. - */ -extern DECLSPEC int SDLCALL SDL_TouchscreenEventState(int state); - -/* - * Get the current X,Y position of the indicated point on the touchscreen. - * - * If not NULL, *x is set to an unsigned integer in the range [1,65535] - * where 1 is the left edge, 32768 is roughly center, 65535 is right edge. - * Similarly with *y, for the top, center, and bottom, respectively. - * The returned value is an unsigned integer in the range [1,65535], - * which represents the pressure of the touch. This should be 32767 in - * non-pressure-sensitive driver implementations. - * If not being touched, 0 is returned and *x and *y are unmodified. - * - * The touch point indices start at index 0. - * If given a negative value for point, all the X,Y, and pressures - * for all the currently touched points on a multitouch device - * should be averaged and used for *x, *y, and the return value. - * If the value of point exceeds the number of points currently touched, - * 0 should be returned, and *x, *y should be left unmodified. - * - * On error, -1 is returned. - */ -extern DECLSPEC Uint16 SDLCALL SDL_TouchscreenGetXY(SDL_Touchscreen *touchscreen, - int point, Uint16 *x, Uint16 *y); - -/* - * Get the number of currently touched points on a touchscreen. - * This is either 0 or 1 for a single-touch device. - * On error, -1 is returned. - */ -extern DECLSPEC int SDLCALL SDL_TouchscreenGetPoints(SDL_Touchscreen * touchscreen); - -/* - * Close a touchscreen previously opened with SDL_TouchscreenOpen() - */ -extern DECLSPEC void SDLCALL SDL_TouchscreenClose(SDL_Touchscreen * touchscreen); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -#endif -#include "close_code.h" - -#endif /* _SDL_touchscreen_h */ - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/SDL.c b/src/SDL.c index d20d7ac32..d2858673b 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -38,10 +38,6 @@ extern int SDL_JoystickInit(void); extern void SDL_JoystickQuit(void); #endif -#if !SDL_TOUCHSCREEN_DISABLED -extern int SDL_TouchscreenInit(void); -extern void SDL_TouchscreenQuit(void); -#endif #if !SDL_CDROM_DISABLED extern int SDL_CDROMInit(void); extern void SDL_CDROMQuit(void); @@ -127,21 +123,6 @@ SDL_InitSubSystem(Uint32 flags) } #endif -#if !SDL_TOUCHSCREEN_DISABLED - /* Initialize the touchscreen subsystem */ - if ((flags & SDL_INIT_TOUCHSCREEN) && !(SDL_initialized & SDL_INIT_TOUCHSCREEN)) { - if (SDL_TouchscreenInit() < 0) { - return (-1); - } - SDL_initialized |= SDL_INIT_TOUCHSCREEN; - } -#else - if (flags & SDL_INIT_TOUCHSCREEN) { - SDL_SetError("SDL not built with touchscreen support"); - return (-1); - } -#endif - #if !SDL_CDROM_DISABLED /* Initialize the CD-ROM subsystem */ if ((flags & SDL_INIT_CDROM) && !(SDL_initialized & SDL_INIT_CDROM)) { @@ -199,12 +180,6 @@ SDL_QuitSubSystem(Uint32 flags) SDL_initialized &= ~SDL_INIT_JOYSTICK; } #endif -#if !SDL_TOUCHSCREEN_DISABLED - if ((flags & SDL_initialized & SDL_INIT_TOUCHSCREEN)) { - SDL_TouchscreenQuit(); - SDL_initialized &= ~SDL_INIT_TOUCHSCREEN; - } -#endif #if !SDL_TIMERS_DISABLED if ((flags & SDL_initialized & SDL_INIT_TIMER)) { SDL_TimerQuit(); diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index 4aa73cc54..364182eb3 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -31,9 +31,6 @@ #if !SDL_JOYSTICK_DISABLED #include "../joystick/SDL_joystick_c.h" #endif -#if !SDL_TOUCHSCREEN_DISABLED -#include "../touchscreen/SDL_touchscreen_c.h" -#endif /* Public data -- the event filter */ SDL_EventFilter SDL_EventOK = NULL; @@ -120,12 +117,6 @@ SDL_GobbleEvents(void *unused) SDL_JoystickUpdate(); } #endif -#if !SDL_TOUCHSCREEN_DISABLED - /* Similarly, check for touchscreen state change */ - if (SDL_numtouchscreens && (SDL_eventstate & SDL_TOUCHEVENTMASK)) { - SDL_TouchscreenUpdate(); - } -#endif /* Give up the CPU for the rest of our timeslice */ SDL_EventLock.safe = 1; @@ -396,12 +387,6 @@ SDL_PumpEvents(void) if (SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK)) { SDL_JoystickUpdate(); } -#endif -#if !SDL_TOUCHSCREEN_DISABLED - /* Check for touchscreen state change */ - if (SDL_numtouchscreens && (SDL_eventstate & SDL_TOUCHEVENTMASK)) { - SDL_TouchscreenUpdate(); - } #endif } } diff --git a/src/touchscreen/SDL_systouchscreen.h b/src/touchscreen/SDL_systouchscreen.h deleted file mode 100644 index ec1d73074..000000000 --- a/src/touchscreen/SDL_systouchscreen.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is SDL_free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* This is the system specific header for the SDL touchscreen API */ - -#include "SDL_touchscreen.h" - -/* The SDL touchscreen structure */ -struct _SDL_Touchscreen -{ - Uint8 index; /* Device index */ - const char *name; /* Touchscreen name - system dependent */ - - int maxpoints; /* Max # multi-touch points, -1 if unlimited. */ - int npoints; /* Number of points currently touched */ - struct touchpoint - { - Uint16 x; - Uint16 y; - Uint16 pressure; - } *points; /* Current ball motion deltas */ - - struct touchscreen_hwdata *hwdata; /* Driver dependent information */ - - int ref_count; /* Reference count for multiple opens */ -}; - -/* Function to scan the system for touchscreens. - * Touchscreen 0 should be the system default touchscreen. - * This function should return the number of available touchscreens, or -1 - * on an unrecoverable fatal error. - */ -extern int SDL_SYS_TouchscreenInit(void); - -/* Function to get the device-dependent name of a touchscreen */ -extern const char *SDL_SYS_TouchscreenName(int index); - -/* Function to open a touchscreen for use. - The touchscreen to open is specified by the index field of the touchscreen. - This should fill the maxpoints field of the touchscreen structure. - It returns 0, or -1 if there is an error. - */ -extern int SDL_SYS_TouchscreenOpen(SDL_Touchscreen * touchscreen); - -/* Function to update the state of a touchscreen - called as a device poll. - * This function shouldn't update the touchscreen structure directly, - * but instead should call SDL_PrivateTouchscreen*() to deliver events - * and update touchscreen device state. - */ -extern void SDL_SYS_TouchscreenUpdate(SDL_Touchscreen * touchscreen); - -/* Function to close a touchscreen after use */ -extern void SDL_SYS_TouchscreenClose(SDL_Touchscreen * touchscreen); - -/* Function to perform any system-specific touchscreen related cleanup */ -extern void SDL_SYS_TouchscreenQuit(void); - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/touchscreen/SDL_touchscreen.c b/src/touchscreen/SDL_touchscreen.c deleted file mode 100644 index 0e75ea186..000000000 --- a/src/touchscreen/SDL_touchscreen.c +++ /dev/null @@ -1,546 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* This is the touchscreen API for Simple DirectMedia Layer */ - -#include "SDL_events.h" -#include "SDL_systouchscreen.h" -#include "SDL_touchscreen_c.h" -#if !SDL_EVENTS_DISABLED -#include "../events/SDL_events_c.h" -#endif - -/* This is used for Quake III Arena */ -#if SDL_EVENTS_DISABLED -#define SDL_Lock_EventThread() -#define SDL_Unlock_EventThread() -#endif - -Uint8 SDL_numtouchscreens = 0; -SDL_Touchscreen **SDL_touchscreens = NULL; -static SDL_Touchscreen *default_touchscreen = NULL; - -int -SDL_TouchscreenInit(void) -{ - int arraylen; - int status; - - SDL_numtouchscreens = 0; - status = SDL_SYS_TouchscreenInit(); - if (status >= 0) { - arraylen = (status + 1) * sizeof(*SDL_touchscreens); - SDL_touchscreens = (SDL_Touchscreen **) SDL_malloc(arraylen); - if (SDL_touchscreens == NULL) { - SDL_numtouchscreens = 0; - } else { - SDL_memset(SDL_touchscreens, 0, arraylen); - SDL_numtouchscreens = status; - } - status = 0; - } - default_touchscreen = NULL; - return (status); -} - -/* - * Count the number of touchscreens attached to the system - */ -int -SDL_NumTouchscreens(void) -{ - return SDL_numtouchscreens; -} - -/* - * Get the implementation dependent name of a touchscreen - */ -const char * -SDL_TouchscreenName(int device_index) -{ - if ((device_index < 0) || (device_index >= SDL_numtouchscreens)) { - SDL_SetError("There are %d touchscreens available", SDL_numtouchscreens); - return (NULL); - } - return (SDL_SYS_TouchscreenName(device_index)); -} - -/* - * Open a touchscreen for use - the index passed as an argument refers to - * the N'th touchscreen on the system. This index is the value which will - * identify this touchscreen in future touchscreen events. - * - * This function returns a touchscreen identifier, or NULL if an error occurred. - */ -SDL_Touchscreen * -SDL_TouchscreenOpen(int device_index) -{ - int i; - SDL_Touchscreen *touchscreen; - - if ((device_index < 0) || (device_index >= SDL_numtouchscreens)) { - SDL_SetError("There are %d touchscreens available", SDL_numtouchscreens); - return (NULL); - } - - /* If the touchscreen is already open, return it */ - for (i = 0; SDL_touchscreens[i]; ++i) { - if (device_index == SDL_touchscreens[i]->index) { - touchscreen = SDL_touchscreens[i]; - ++touchscreen->ref_count; - return (touchscreen); - } - } - - /* Create and initialize the touchscreen */ - touchscreen = (SDL_Touchscreen *) SDL_malloc((sizeof *touchscreen)); - if (touchscreen != NULL) { - SDL_memset(touchscreen, 0, (sizeof *touchscreen)); - touchscreen->index = device_index; - if (SDL_SYS_TouchscreenOpen(touchscreen) < 0) { - SDL_free(touchscreen); - touchscreen = NULL; - } else { - if (touchscreen->maxpoints > 0) { - touchscreen->points = (struct touchpoint *) SDL_malloc - (touchscreen->maxpoints * sizeof(*touchscreen->points)); - } - if ((touchscreen->maxpoints > 0) && !touchscreen->points) { - SDL_OutOfMemory(); - SDL_TouchscreenClose(touchscreen); - touchscreen = NULL; - } - if (touchscreen->points) { - SDL_memset(touchscreen->points, 0, - touchscreen->maxpoints * sizeof(*touchscreen->points)); - } - } - } - if (touchscreen) { - /* Add touchscreen to list */ - ++touchscreen->ref_count; - SDL_Lock_EventThread(); - for (i = 0; SDL_touchscreens[i]; ++i) - /* Skip to next touchscreen */ ; - SDL_touchscreens[i] = touchscreen; - SDL_Unlock_EventThread(); - } - return (touchscreen); -} - -/* - * Returns 1 if the touchscreen has been opened, or 0 if it has not. - */ -int -SDL_TouchscreenOpened(int device_index) -{ - int i, opened; - - opened = 0; - for (i = 0; SDL_touchscreens[i]; ++i) { - if (SDL_touchscreens[i]->index == (Uint8) device_index) { - opened = 1; - break; - } - } - return (opened); -} - -static int -ValidTouchscreen(SDL_Touchscreen ** touchscreen) -{ - int valid; - - if (*touchscreen == NULL) { - *touchscreen = default_touchscreen; - } - if (*touchscreen == NULL) { - SDL_SetError("Touchscreen hasn't been opened yet"); - valid = 0; - } else { - valid = 1; - } - return valid; -} - -/* - * Get the device index of an opened touchscreen. - */ -int -SDL_TouchscreenIndex(SDL_Touchscreen * touchscreen) -{ - if (!ValidTouchscreen(&touchscreen)) { - return (-1); - } - return (touchscreen->index); -} - -/* - * Get the max number of points on a multi-touch screen (or 1 on a single-touch) - */ -int -SDL_TouchscreenMaxPoints(SDL_Touchscreen * touchscreen) -{ - if (!ValidTouchscreen(&touchscreen)) { - return (-1); - } - return (touchscreen->maxpoints); -} - -/* - * Get the current X,Y position of the indicated point on the touchscreen - */ -Uint16 -SDL_TouchscreenGetXY(SDL_Touchscreen *touchscreen, int point, Uint16 *x, Uint16 *y) -{ - int retval; - - if (!ValidTouchscreen(&touchscreen)) { - return (-1); - } - - retval = 0; - if (point < 0) { - int i; long avg; - if(x) { - avg = 0; - for(i = 0; i < touchscreen->npoints; ++i) { - avg += touchscreen->points[i].x; - } - *x = avg; - } - if(y) { - avg = 0; - for(i = 0; i < touchscreen->npoints; ++i) { - avg += touchscreen->points[i].y; - } - *y = avg; - } - avg = 0; - for(i = 0; i < touchscreen->npoints; ++i) { - avg += touchscreen->points[i].pressure; - } - return (int)avg; - } else if (point < touchscreen->maxpoints) { - if (x) { - *x = touchscreen->points[point].x; - } - if (y) { - *y = touchscreen->points[point].y; - } - retval = touchscreen->points[point].pressure; - } else { - SDL_SetError("Touchscreen only can have %d points", touchscreen->maxpoints); - retval = -1; - } - return (retval); -} - -int -SDL_TouchscreenGetPoints(SDL_Touchscreen *touchscreen) { - if (!ValidTouchscreen(&touchscreen)) { - return (-1); - } - - return touchscreen->npoints; -} - -/* - * Close a touchscreen previously opened with SDL_TouchscreenOpen() - */ -void -SDL_TouchscreenClose(SDL_Touchscreen * touchscreen) -{ - int i; - - if (!ValidTouchscreen(&touchscreen)) { - return; - } - - /* First decrement ref count */ - if (--touchscreen->ref_count > 0) { - return; - } - - /* Lock the event queue - prevent touchscreen polling */ - SDL_Lock_EventThread(); - - if (touchscreen == default_touchscreen) { - default_touchscreen = NULL; - } - SDL_SYS_TouchscreenClose(touchscreen); - - /* Remove touchscreen from list */ - for (i = 0; SDL_touchscreens[i]; ++i) { - if (touchscreen == SDL_touchscreens[i]) { - SDL_memcpy(&SDL_touchscreens[i], &SDL_touchscreens[i + 1], - (SDL_numtouchscreens - i) * sizeof(touchscreen)); - break; - } - } - - /* Let the event thread keep running */ - SDL_Unlock_EventThread(); - - /* Free the data associated with this touchscreen */ - if (touchscreen->points) { - SDL_free(touchscreen->points); - } - SDL_free(touchscreen); -} - -void -SDL_TouchscreenQuit(void) -{ - /* Stop the event polling */ - SDL_Lock_EventThread(); - SDL_numtouchscreens = 0; - SDL_Unlock_EventThread(); - - /* Quit the touchscreen setup */ - SDL_SYS_TouchscreenQuit(); - if (SDL_touchscreens) { - SDL_free(SDL_touchscreens); - SDL_touchscreens = NULL; - } -} - - -/* These are global for SDL_systouchscreen.c and SDL_events.c */ -int -SDL_PrivateTouchPress(SDL_Touchscreen * touchscreen, int point, Uint16 x, Uint16 y, Uint16 pressure) { - int posted; - - if (!ValidTouchscreen(&touchscreen)) { - return -1; - } - - if(point >= touchscreen->maxpoints) { - SDL_SetError("Touchscreen only can have %d points", touchscreen->maxpoints); - return -1; - } - - /* on neg. point, set the given args as the *only* point. - so set the struct to have no points pressed, then continue as normal. */ - if(point < 0) { - point = 0; - touchscreen->npoints = 0; - SDL_memset(touchscreen->points, 0, - touchscreen->maxpoints * sizeof(touchscreen->points[0])); - } - - /* new touch point! that means a TOUCHPRESSED event is due. */ - if(point >= touchscreen->npoints) { - point = touchscreen->npoints; - ++touchscreen->npoints; - } - - /* no motion, no change, don't report an event. */ - if(touchscreen->points[point].pressure > 0) { - SDL_SetError("Warning: touch point %d was already pressed", point); - return -1; - } - - /* Update internal touchscreen point state */ - touchscreen->points[point].x = x; - touchscreen->points[point].y = y; - touchscreen->points[point].pressure = pressure; - - /* Post the event, if desired */ - posted = 0; -#if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_TOUCHPRESSED] == SDL_ENABLE) { - SDL_Event event; - event.touch.type = SDL_TOUCHPRESSED; - event.touch.which = touchscreen->index; - event.touch.point = point; - event.touch.xpos = x; - event.touch.ypos = y; - event.touch.pressure = pressure; - if ((SDL_EventOK == NULL) - || (*SDL_EventOK) (SDL_EventOKParam, &event)) { - posted = 1; - SDL_PushEvent(&event); - } - } -#endif /* !SDL_EVENTS_DISABLED */ - return (posted); -} - -int -SDL_PrivateTouchMove(SDL_Touchscreen * touchscreen, int point, - Uint16 x, Uint16 y, Uint16 pressure) { - int posted; - - if (!ValidTouchscreen(&touchscreen)) { - return -1; - } - - if(point >= touchscreen->maxpoints) { - SDL_SetError("Touchscreen only can have %d points", touchscreen->maxpoints); - return -1; - } - - /* on neg. point, set the given args as the *only* point. - so set the struct to have no points pressed, then continue as normal. */ - if(point < 0) { - point = 0; - touchscreen->npoints = 0; - SDL_memset(touchscreen->points, 0, - touchscreen->maxpoints * sizeof(touchscreen->points[0])); - } - - /* new touch point! that means a TOUCHPRESSED event is due. */ - if(point >= touchscreen->npoints || touchscreen->points[point].pressure == 0) { - SDL_SetError("Touch point %d shouldn't move before it's pressed.", point); - return -1; - } - - /* no motion, no change, don't report an event. */ - if(touchscreen->points[point].x == x && - touchscreen->points[point].y == y && - touchscreen->points[point].pressure == pressure) { - return 0; - } - - /* Update internal touchscreen point state */ - touchscreen->points[point].x = x; - touchscreen->points[point].y = y; - touchscreen->points[point].pressure = pressure; - - /* Post the event, if desired */ - posted = 0; -#if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_TOUCHMOTION] == SDL_ENABLE) { - SDL_Event event; - event.touch.type = SDL_TOUCHMOTION; - event.touch.which = touchscreen->index; - event.touch.point = point; - event.touch.xpos = x; - event.touch.ypos = y; - event.touch.pressure = pressure; - if ((SDL_EventOK == NULL) - || (*SDL_EventOK) (SDL_EventOKParam, &event)) { - posted = 1; - SDL_PushEvent(&event); - } - } -#endif /* !SDL_EVENTS_DISABLED */ - return (posted); -} - -int -SDL_PrivateTouchRelease(SDL_Touchscreen * touchscreen, int point) { - int posted; - int i; - - if (!ValidTouchscreen(&touchscreen)) { - return -1; - } - - if(point >= touchscreen->maxpoints) { - SDL_SetError("Touchscreen only can have %d points", touchscreen->maxpoints); - return -1; - } else if(point >= touchscreen->npoints) { - SDL_SetError("Point %d up when only %d were down", point, touchscreen->npoints); - return -1; - } - - /* on neg. point, clear all points. so set the struct to have one point - pressed, then continue as normal. */ - if(point < 0) { - point = 0; - touchscreen->npoints = 1; - SDL_memset(&(touchscreen->points[1]), 0, - (touchscreen->maxpoints-1) * sizeof(touchscreen->points[0])); - } - - /* Update internal touchscreen point state */ - touchscreen->points[point].pressure = 0; - touchscreen->points[point].x = 0; - touchscreen->points[point].y = 0; - if(touchscreen->npoints >= 0) --touchscreen->npoints; - for(i = point; i < touchscreen->npoints; ++i) { - touchscreen->points[i] = touchscreen->points[i+1]; - } - - /* Post the event, if desired */ - posted = 0; -#if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_TOUCHRELEASED] == SDL_ENABLE) { - SDL_Event event; - event.touch.type = SDL_TOUCHRELEASED; - event.touch.which = touchscreen->index; - event.touch.point = point; - if ((SDL_EventOK == NULL) - || (*SDL_EventOK) (SDL_EventOKParam, &event)) { - posted = 1; - SDL_PushEvent(&event); - } - } -#endif /* !SDL_EVENTS_DISABLED */ - return (posted); -} - -void -SDL_TouchscreenUpdate(void) -{ - int i; - - for (i = 0; SDL_touchscreens[i]; ++i) { - SDL_SYS_TouchscreenUpdate(SDL_touchscreens[i]); - } -} - -int -SDL_TouchscreenEventState(int state) -{ -#if SDL_EVENTS_DISABLED - return SDL_IGNORE; -#else - const Uint8 event_list[] = { - SDL_TOUCHPRESSED, SDL_TOUCHRELEASED, SDL_TOUCHMOTION - }; - unsigned int i; - - switch (state) { - case SDL_QUERY: - state = SDL_IGNORE; - for (i = 0; i < SDL_arraysize(event_list); ++i) { - state = SDL_EventState(event_list[i], SDL_QUERY); - if (state == SDL_ENABLE) { - break; - } - } - break; - default: - for (i = 0; i < SDL_arraysize(event_list); ++i) { - SDL_EventState(event_list[i], state); - } - break; - } - return (state); -#endif /* SDL_EVENTS_DISABLED */ -} - -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/touchscreen/SDL_touchscreen_c.h b/src/touchscreen/SDL_touchscreen_c.h deleted file mode 100644 index 70792f2e7..000000000 --- a/src/touchscreen/SDL_touchscreen_c.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* Useful functions and variables from SDL_touchscreen.c */ -#include "SDL_touchscreen.h" - -/* The number of available touchscreens on the system */ -extern Uint8 SDL_numtouchscreens; - -/* Internal event queueing functions */ - -/* the point index starts at 0 - * if point < 0, release all points and set this to be the first (only) point. - * if point >= touchscreen->maxpoints, error. - * otherwise, add a point with the given coordinates. - * return < 0 if fatal error, >= 0 on success - */ -extern int SDL_PrivateTouchPress(SDL_Touchscreen * touchscreen, int point, - Uint16 x, Uint16 y, Uint16 pressure); -/* if point < 0, release all points and set this to be the first (only) point. - * if point >= touchscreen->maxpoints, error. - * otherwise, update the coordinates for the given point. - * return < 0 if fatal error, >= 0 on success - */ -extern int SDL_PrivateTouchMove(SDL_Touchscreen * touchscreen, int point, - Uint16 x, Uint16 y, Uint16 pressure); -/* if point < 0, release all points. - * if point >= touchscreen->npoints, error. - * otherwise, remove the given point. - * return < 0 if fatal error, >= 0 on success - */ -extern int SDL_PrivateTouchRelease(SDL_Touchscreen * touchscreen, int point); -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/touchscreen/dummy/SDL_systouchscreen.c b/src/touchscreen/dummy/SDL_systouchscreen.c deleted file mode 100644 index 366302c13..000000000 --- a/src/touchscreen/dummy/SDL_systouchscreen.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -#if defined(SDL_TOUCHSCREEN_DUMMY) || defined(SDL_TOUCHSCREEN_DISABLED) - -/* This is the system specific header for the SDL touchscreen API */ - -#include "SDL_touchscreen.h" -#include "../SDL_systouchscreen.h" -#include "../SDL_touchscreen_c.h" - -/* Function to scan the system for touchscreen. - * This function should set SDL_numtouchscreens to the number of available - * touchscreens. Touchscreen 0 should be the system default touchscreen. - * It should return 0, or -1 on an unrecoverable fatal error. - */ -int -SDL_SYS_TouchscreenInit(void) -{ - SDL_numtouchscreens = 0; - return (0); -} - -/* Function to get the device-dependent name of a touchscreen */ -const char * -SDL_SYS_TouchscreenName(int index) -{ - SDL_SetError("Logic error: No touchscreens available"); - return (NULL); -} - -/* Function to open a touchscreen for use. - The touchscreen to open is specified by the index field of the touchscreen. - This should fill the maxpoints field of the touchscreen structure. - It returns 0, or -1 if there is an error. - */ -int -SDL_SYS_TouchscreenOpen(SDL_Touchscreen * touchscreen) -{ - SDL_SetError("Logic error: No touchscreens available"); - return (-1); -} - -/* Function to update the state of a touchscreen - called as a device poll. - * This function shouldn't update the touchscreen structure directly, - * but instead should call SDL_PrivateTouchscreen*() to deliver events - * and update touchscreen device state. - */ -void -SDL_SYS_TouchscreenUpdate(SDL_Touchscreen * touchscreen) -{ - return; -} - -/* Function to close a touchscreen after use */ -void -SDL_SYS_TouchscreenClose(SDL_Touchscreen * touchscreen) -{ - return; -} - -/* Function to perform any system-specific touchscreen related cleanup */ -void -SDL_SYS_TouchscreenQuit(void) -{ - return; -} - -#endif /* SDL_TOUCHSCREEN_DUMMY || SDL_TOUCHSCREEN_DISABLED */ -/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/touchscreen/nds/SDL_systouchscreen.c b/src/touchscreen/nds/SDL_systouchscreen.c deleted file mode 100644 index 67c716a46..000000000 --- a/src/touchscreen/nds/SDL_systouchscreen.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Sam Lantinga - slouken@devolution.com -*/ - -#include "SDL_config.h" - -#ifdef SDL_TOUCHSCREEN_NDS - -/* This is the system specific header for the SDL touchscreen API */ -#include -#include /* For the definition of NULL */ - -#include "SDL_error.h" -#include "SDL_events.h" -#include "SDL_touchscreen.h" -#include "../SDL_systouchscreen.h" -#include "../SDL_touchscreen_c.h" - -#include "../../video/nds/SDL_ndsevents_c.h" - -/* Function to scan the system for touchscreen. - * This function should set SDL_numtouchscreens to the number of available - * touchscreen. Touchscreen 0 should be the system default touchscreen. - * It should return 0, or -1 on an unrecoverable fatal error. - */ -int -SDL_SYS_TouchscreenInit(void) -{ - SDL_numtouchscreens = 1; - return (1); -} - -/* Function to get the device-dependent name of a touchscreen */ -const char * -SDL_SYS_TouchscreenName(int index) -{ - if (!index) - return "NDS builtin touchscreen"; - SDL_SetError("No touchscreen available with that index"); - return (NULL); -} - -/* Function to open a touchscreen for use. - The touchscreen to open is specified by the index field of the touchscreen. - This should fill the maxpoints field of the touchscreen structure. - It returns 0, or -1 if there is an error. - */ -int -SDL_SYS_TouchscreenOpen(SDL_Touchscreen * touchscreen) -{ - touchscreen->maxpoints = 1; - touchscreen->npoints = 0; - /* do I call SDL_TouchscreenOpen here? */ - return 0; -} - - -/* Function to update the state of a touchscreen - called as a device poll. - * This function shouldn't update the touchscreen structure directly, - * but instead should call SDL_PrivateTouch*() to deliver events - * and update touchscreen device state. - */ -void -SDL_SYS_TouchscreenUpdate(SDL_Touchscreen * touchscreen) -{ - u32 keysd, keysu, keysh; - Uint16 xpos=0, ypos=0, pressure = 32767; - touchPosition touch; - - /*scanKeys();*/ - keysd = keysDown(); - keysh = keysHeld(); - keysu = keysUp(); - touch=touchReadXY(); - xpos = (touch.px << 8) + 1; - ypos = (touch.py << 16) / 192 + 1; - /* TODO uses touch.x and touch.y for something. - we discussed in the mailing list having both "hardware x/y" and - "screen x/y" coordinates. maybe modify structs for that too - also, find out how Colors! gets pressure and see if it's practical here - */ - - if ((keysd & KEY_TOUCH)) { - SDL_PrivateTouchPress(touchscreen, 0, xpos, ypos, pressure); - } - if ((keysh & KEY_TOUCH)) { - /* sometimes the touch jumps to y=1 before it reports as keysUp */ - if(ypos > 1) { - SDL_PrivateTouchMove(touchscreen, 0, xpos, ypos, pressure); - } - } - if ((keysu & KEY_TOUCH)) { - SDL_PrivateTouchRelease(touchscreen, 0); - } } - -/* Function to close a touchscreen after use */ -void -SDL_SYS_TouchscreenClose(SDL_Touchscreen * touchscreen) -{ -} - -/* Function to perform any system-specific touchscreen related cleanup */ -void -SDL_SYS_TouchscreenQuit(void) -{ -} -#endif /* SDL_TOUCHSCREEN_NDS */ - diff --git a/src/video/nds/SDL_ndsevents.c b/src/video/nds/SDL_ndsevents.c index e605425fb..ac43e8d4c 100644 --- a/src/video/nds/SDL_ndsevents.c +++ b/src/video/nds/SDL_ndsevents.c @@ -39,6 +39,16 @@ void NDS_PumpEvents(_THIS) { scanKeys(); + /* TODO: defer click-age */ + if(keysDown() & KEY_TOUCH) { + SDL_SendMouseButton(0, SDL_PRESSED, 0); + } else if(keysUp() & KEY_TOUCH) { + SDL_SendMouseButton(0, SDL_RELEASED, 0); + } + if(keysHeld() & KEY_TOUCH) { + touchPosition t = touchReadXY(); + SDL_SendMouseMotion(0, 0, t.px, t.py); + } } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/nds/SDL_ndsrender.c b/src/video/nds/SDL_ndsrender.c index 830d91677..cc5f55cce 100644 --- a/src/video/nds/SDL_ndsrender.c +++ b/src/video/nds/SDL_ndsrender.c @@ -79,10 +79,16 @@ static void NDS_DestroyRenderer(SDL_Renderer * renderer); SDL_RenderDriver NDS_RenderDriver = { NDS_CreateRenderer, - {"nds", SDL_RENDERER_PRESENTCOPY} -/* (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | - SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | - SDL_RENDERER_PRESENTDISCARD),*/ + {"nds", SDL_RENDERER_SINGLEBUFFER} +/*SDL_RENDERER_ values +SINGLEBUFFER Render directly to the window, if possible +PRESENTCOPY Present uses a copy from back buffer to the front buffer +PRESENTFLIP2 Present uses a flip, swapping back buffer and front buffer +PRESENTFLIP3 Present uses a flip, rotating two back buf.s and a front buf. +PRESENTDISCARD Present leaves the contents of the backbuffer undefined +PRESENTVSYNC Present is synchronized with the refresh rate +ACCELERATED The renderer uses hardware acceleration +*/ }; typedef struct @@ -91,6 +97,12 @@ typedef struct u16* fb; } NDS_RenderData; +typedef struct +{ + enum { NDSTX_BG, NDSTX_SPR } type; + struct { int w, h, pitch, bpp; } dim; + u16 *vram; +} NDS_TextureData; /* this is mainly hackish testing/debugging stuff to get cleaned up soon @@ -143,7 +155,7 @@ sdlds_print_surface_info(SDL_Surface * s) sdlds_print_pixfmt_info(s->format); } - +/* again the above shouldn't make it into the stable version */ SDL_Renderer * NDS_CreateRenderer(SDL_Window * window, Uint32 flags) @@ -199,7 +211,8 @@ NDS_CreateRenderer(SDL_Window * window, Uint32 flags) } else { renderer->info.flags |= SDL_RENDERER_PRESENTCOPY; n = 1; - }/* + } + /* for (i = 0; i < n; ++i) { data->screens[i] = SDL_CreateRGBSurface(0, 256, 192, bpp, Rmask, Gmask, Bmask, @@ -217,6 +230,182 @@ NDS_CreateRenderer(SDL_Window * window, Uint32 flags) return renderer; } +static int +NDS_ActivateRenderer(SDL_Renderer * renderer) +{ + NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; + /* stub. TODO: figure out what needs to be done, if anything. */ + return 0; +} + +static int +NDS_DisplayModeChanged(SDL_Renderer * renderer) +{ + NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; + /* stub. TODO: figure out what needs to be done */ + return 0; +} + +static int +NDS_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) +{ + NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; + + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + return -1; + } else { + int bpp; + Uint32 Rmask, Gmask, Bmask, Amask; + + if (!SDL_PixelFormatEnumToMasks + (texture->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { + SDL_SetError("Unknown texture format"); + return -1; + } + /* TODO: appropriate checks for ABGR1555 */ + texture->driverdata = SDL_calloc(1, sizeof(NDS_TextureData)); + /* TODO: conditional statements on w/h to place it as bg/sprite */ + } + + if (!texture->driverdata) { + return -1; + } + return 0; +} + +static int +NDS_QueryTexturePixels(SDL_Renderer * renderer, SDL_Texture * texture, + void **pixels, int *pitch) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + return -1; + } else { + NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; + + *pixels = txdat->vram; + *pitch = txdat->dim.pitch; + return 0; + } +} + +static int +NDS_SetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Color * colors, int firstcolor, int ncolors) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("YUV textures don't have a palette"); + return -1; + } else { + NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; + /* TODO: mess with 8-bit modes and/or 16-color palette modes */ + return 0; + } +} + +static int +NDS_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture, + SDL_Color * colors, int firstcolor, int ncolors) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("YUV textures don't have a palette"); + return -1; + } else { + NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; + /* TODO: mess with 8-bit modes and/or 16-color palette modes */ + return 0; + } +} + +static int +NDS_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture) +{ + /* stub. TODO: figure out what needs to be done, if anything */ + return 0; +} + +static int +NDS_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture) +{ + /* stub. TODO: figure out what needs to be done, if anything */ + return 0; +} + +static int +NDS_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) +{ + /* stub. TODO: figure out what needs to be done, if anything */ + return 0; +} + +static int +NDS_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) +{ + /* stub. TODO: figure out what needs to be done. + (NDS hardware scaling is nearest neighbor.) */ + return 0; +} + +static int +NDS_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * rect, const void *pixels, int pitch) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + return -1; + } else { + NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; + Uint8 *src, *dst; + int row; + size_t length; + /* IMPORTANT! copy the new pixels into the sprite or bg. */ + src = (Uint8 *) pixels; + dst = + (Uint8 *) txdat->vram + rect->y * txdat->dim.pitch + + rect->x * (txdat->dim.bpp/8); + length = rect->w * (txdat->dim.bpp/8); + for (row = 0; row < rect->h; ++row) { + SDL_memcpy(dst, src, length); + src += pitch; + dst += surface->pitch; + } + return 0; + } +} + +static int +NDS_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, + const SDL_Rect * rect, int markDirty, void **pixels, + int *pitch) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + return -1; + } else { + NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata; + + *pixels = (void *) ((u8 *)txdat->vram + rect->y * txdat->dim.pitch + + rect->x * (txdat->dim.bpp/8)); + *pitch = txdat->dim.pitch; + return 0; + } +} + +static void +NDS_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + } +} + +static void +NDS_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, + int numrects, const SDL_Rect * rects) +{ /* stub */ +} + static int NDS_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect) @@ -235,6 +424,7 @@ NDS_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, } return 0; } + static int NDS_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) @@ -296,20 +486,41 @@ NDS_RenderPresent(SDL_Renderer * renderer) } } +static void +NDS_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture) +{ + if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { + SDL_SetError("Unsupported texture format"); + } else { + /* TODO: free anything allocated for texture */ + /*SDL_Surface *surface = (SDL_Surface *) texture->driverdata; + SDL_FreeSurface(surface);*/ + } +} + static void NDS_DestroyRenderer(SDL_Renderer * renderer) { NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata; + /*SDL_Window *window = SDL_GetWindowFromID(renderer->window); + SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);*/ int i; - printf("NDS_DestroyRenderer(renderer)\n"); - printf(" renderer: %s\n", renderer->info.name); if (data) { - /*for (i = 0; i < SDL_arraysize(data->screens); ++i) { - if (data->screens[i]) { - SDL_FreeSurface(data->screens[i]); + for (i = 0; i < SDL_arraysize(data->texture); ++i) { + if (data->texture[i]) { + DestroyTexture(data->renderer, data->texture[i]); } - }*/ + } + if (data->surface.format) { + SDL_SetSurfacePalette(&data->surface, NULL); + SDL_FreeFormat(data->surface.format); + } + if (display->palette) { + SDL_DelPaletteWatch(display->palette, DisplayPaletteChanged, + data); + } + SDL_FreeDirtyRects(&data->dirty); SDL_free(data); } SDL_free(renderer);