SDL: Cleanup touch. Fix back touchscreen

From f61b9e7653bd6c02061c1dbcc7c8ac165e38bcf4 Mon Sep 17 00:00:00 2001
From: Ivan Epifanov <[EMAIL REDACTED]>
Date: Wed, 9 Dec 2020 00:37:46 +0300
Subject: [PATCH] Cleanup touch. Fix back touchscreen

---
 src/video/vita/SDL_vitatouch.c | 70 +++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git a/src/video/vita/SDL_vitatouch.c b/src/video/vita/SDL_vitatouch.c
index f101d35ea..47770dbfd 100644
--- a/src/video/vita/SDL_vitatouch.c
+++ b/src/video/vita/SDL_vitatouch.c
@@ -35,13 +35,13 @@
 SceTouchData touch_old[SCE_TOUCH_PORT_MAX_NUM];
 SceTouchData touch[SCE_TOUCH_PORT_MAX_NUM];
 
-SceTouchPanelInfo panelinfo[SCE_TOUCH_PORT_MAX_NUM];
+SDL_FRect area_info[SCE_TOUCH_PORT_MAX_NUM];
+SDL_FRect display_info[SCE_TOUCH_PORT_MAX_NUM];
 
-float aAWidth[SCE_TOUCH_PORT_MAX_NUM];
-float aAHeight[SCE_TOUCH_PORT_MAX_NUM];
-float dispWidth[SCE_TOUCH_PORT_MAX_NUM];
-float dispHeight[SCE_TOUCH_PORT_MAX_NUM];
-float forcerange[SCE_TOUCH_PORT_MAX_NUM];
+struct{
+    float min;
+    float range;
+} force_info[SCE_TOUCH_PORT_MAX_NUM];
 
 void 
 VITA_InitTouch(void)
@@ -51,14 +51,22 @@ VITA_InitTouch(void)
 	sceTouchEnableTouchForce(SCE_TOUCH_PORT_FRONT);
 	sceTouchEnableTouchForce(SCE_TOUCH_PORT_BACK);
 
-	SceTouchPanelInfo panelinfo[SCE_TOUCH_PORT_MAX_NUM];
 	for(int port = 0; port < SCE_TOUCH_PORT_MAX_NUM; port++) {
-		sceTouchGetPanelInfo(port, &panelinfo[port]);
-		aAWidth[port] = (float)(panelinfo[port].maxAaX - panelinfo[port].minAaX);
-		aAHeight[port] = (float)(panelinfo[port].maxAaY - panelinfo[port].minAaY);
-		dispWidth[port] = (float)(panelinfo[port].maxDispX - panelinfo[port].minDispX);
-		dispHeight[port] = (float)(panelinfo[port].maxDispY - panelinfo[port].minDispY);
-		forcerange[port] = (float)(panelinfo[port].maxForce - panelinfo[port].minForce);
+		SceTouchPanelInfo panelinfo;
+		sceTouchGetPanelInfo(port, &panelinfo);
+
+		area_info[port].x  = (float)panelinfo.minAaX;
+		area_info[port].y  = (float)panelinfo.minAaY;
+		area_info[port].w  = (float)(panelinfo.maxAaX - panelinfo.minAaX);
+		area_info[port].h  = (float)(panelinfo.maxAaY - panelinfo.minAaY);
+
+		display_info[port].x = (float)panelinfo.minDispX;
+		display_info[port].y = (float)panelinfo.minDispY;
+		display_info[port].w = (float)(panelinfo.maxDispX - panelinfo.minDispX);
+		display_info[port].h = (float)(panelinfo.maxDispY - panelinfo.minDispY);
+
+		force_info[port].min = (float)panelinfo.minForce;
+		force_info[port].range = (float)(panelinfo.maxForce - panelinfo.minForce);
 	}
 
 	// Support passing both front and back touch devices in events
@@ -96,7 +104,7 @@ VITA_PollTouch(void)
 				float x = 0;
 				float y = 0;
 				VITA_ConvertTouchXYToSDLXY(&x, &y, touch[port].report[i].x, touch[port].report[i].y, port);
-				float force = (touch[port].report[i].force - panelinfo[port].minForce) / forcerange[port];
+				float force = (touch[port].report[i].force - force_info[port].min) / force_info[port].range;
 				finger_id = (SDL_FingerID) touch[port].report[i].id;
 
 				// Send an initial touch
@@ -133,7 +141,7 @@ VITA_PollTouch(void)
 					float x = 0;
 					float y = 0;
 					VITA_ConvertTouchXYToSDLXY(&x, &y, touch_old[port].report[i].x, touch_old[port].report[i].y, port);
-					float force = (touch_old[port].report[i].force - panelinfo[port].minForce) / forcerange[port];
+					float force = (touch_old[port].report[i].force - force_info[port].min) / force_info[port].range;
 					finger_id = (SDL_FingerID) touch_old[port].report[i].id;
 					// Finger released from screen
 					SDL_SendTouch((SDL_TouchID)port,
@@ -150,25 +158,25 @@ VITA_PollTouch(void)
 }
 
 void VITA_ConvertTouchXYToSDLXY(float *sdl_x, float *sdl_y, int vita_x, int vita_y, int port) {
-	float x = 0;
-	float y = 0;
+	float x = 0.f;
+	float y = 0.f;
+	SDL_FRect rect;
+
 	if (port == SCE_TOUCH_PORT_FRONT) {
-		x = (vita_x - panelinfo[port].minDispX) / dispWidth[port];
-		y = (vita_y - panelinfo[port].minDispY) / dispHeight[port];
+		rect = display_info[port];
 	} else {
-		x = (vita_x - panelinfo[port].minAaX) / aAWidth[port];
-		y = (vita_y - panelinfo[port].minAaY) / aAHeight[port];				
-	}
-	if (x < 0.0) {
-		x = 0.0;
-	} else if (x > 1.0) {
-		x = 1.0;
-	}
-	if (y < 0.0) {
-		y = 0.0;
-	} else if (y > 1.0) {
-		y = 1.0;
+		rect = area_info[port];
 	}
+
+	x = (vita_x - rect.x) / rect.w;
+	y = (vita_y - rect.y) / rect.h;
+
+	x = SDL_max(x, 0.0);
+	x = SDL_min(x, 1.0);
+
+	y = SDL_max(y, 0.0);
+	y = SDL_min(y, 1.0);
+
 	*sdl_x = x;
 	*sdl_y = y;
 }