Make loading/saving dollar gesture templates endian clean (thanks, Martin!).

Fixes Bugzilla #2674.
This commit is contained in:
Ryan C. Gordon 2015-04-05 18:59:52 -04:00
parent 05a9206a4f
commit 2f3f328714
1 changed files with 44 additions and 7 deletions

View File

@ -24,6 +24,7 @@
/* General mouse handling code for SDL */ /* General mouse handling code for SDL */
#include "SDL_events.h" #include "SDL_events.h"
#include "SDL_endian.h"
#include "SDL_events_c.h" #include "SDL_events_c.h"
#include "SDL_gesture_c.h" #include "SDL_gesture_c.h"
@ -114,14 +115,34 @@ static unsigned long SDL_HashDollar(SDL_FloatPoint* points)
static int SaveTemplate(SDL_DollarTemplate *templ, SDL_RWops *dst) static int SaveTemplate(SDL_DollarTemplate *templ, SDL_RWops *dst)
{ {
if (dst == NULL) return 0; if (dst == NULL) {
return 0;
}
/* No Longer storing the Hash, rehash on load */ /* No Longer storing the Hash, rehash on load */
/* if (SDL_RWops.write(dst, &(templ->hash), sizeof(templ->hash), 1) != 1) return 0; */ /* if (SDL_RWops.write(dst, &(templ->hash), sizeof(templ->hash), 1) != 1) return 0; */
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
if (SDL_RWwrite(dst, templ->path, if (SDL_RWwrite(dst, templ->path,
sizeof(templ->path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) sizeof(templ->path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) {
return 0; return 0;
}
#else
{
SDL_DollarTemplate copy = *templ;
SDL_FloatPoint *p = copy.path;
int i;
for (i = 0; i < DOLLARNPOINTS; i++, p++) {
p->x = SDL_SwapFloatLE(p->x);
p->y = SDL_SwapFloatLE(p->y);
}
if (SDL_RWwrite(dst, copy.path,
sizeof(copy.path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) {
return 0;
}
}
#endif
return 1; return 1;
} }
@ -203,17 +224,33 @@ int SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src)
SDL_GestureTouch *touch = NULL; SDL_GestureTouch *touch = NULL;
if (src == NULL) return 0; if (src == NULL) return 0;
if (touchId >= 0) { if (touchId >= 0) {
for (i = 0; i < SDL_numGestureTouches; i++) for (i = 0; i < SDL_numGestureTouches; i++) {
if (SDL_gestureTouch[i].id == touchId) if (SDL_gestureTouch[i].id == touchId) {
touch = &SDL_gestureTouch[i]; touch = &SDL_gestureTouch[i];
if (touch == NULL) return SDL_SetError("given touch id not found"); }
}
if (touch == NULL) {
return SDL_SetError("given touch id not found");
}
} }
while (1) { while (1) {
SDL_DollarTemplate templ; SDL_DollarTemplate templ;
if (SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < if (SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < DOLLARNPOINTS) {
DOLLARNPOINTS) break; if (loaded == 0) {
return SDL_SetError("could not read any dollar gesture from rwops");
}
break;
}
#if SDL_BYTEORDER != SDL_LIL_ENDIAN
for (i = 0; i < DOLLARNPOINTS; i++) {
SDL_FloatPoint *p = &templ.path[i];
p->x = SDL_SwapFloatLE(p->x);
p->y = SDL_SwapFloatLE(p->y);
}
#endif
if (touchId >= 0) { if (touchId >= 0) {
/* printf("Adding loaded gesture to 1 touch\n"); */ /* printf("Adding loaded gesture to 1 touch\n"); */