shithub: ft²

Download patch

ref: 4cb9cdc4475ea90ba9eb591cf00628ec60230f74
parent: c8e0c5efe33319eb553525fbbde851cd0c625111
author: Olav Sørensen <olav.sorensen@live.no>
date: Fri Apr 3 13:28:43 EDT 2020

Pushed v1.17 code

- Fixed some bugs with sample data marking/hand-drawing and sample loop pin
  dragging, which appeared in v1.16.

--- a/src/ft2_header.h
+++ b/src/ft2_header.h
@@ -12,7 +12,7 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "1.16"
+#define PROG_VER_STR "1.17"
 
 // do NOT change these! It will only mess things up...
 
--- a/src/ft2_main.c
+++ b/src/ft2_main.c
@@ -420,7 +420,7 @@
 	dFrac = modf(editor.dPerfFreq / VBLANK_HZ, &dInt);
 
 	// integer part
-	video.vblankTimeLen = (uint32_t)dInt;
+	video.vblankTimeLen = (int32_t)dInt;
 
 	// fractional part scaled to 0..2^32-1
 	dFrac *= UINT32_MAX;
--- a/src/ft2_mouse.c
+++ b/src/ft2_mouse.c
@@ -718,6 +718,18 @@
 #endif
 }
 
+static void sendMouseButtonUpEvent(uint8_t button)
+{
+	SDL_Event event;
+
+	memset(&event, 0, sizeof (event));
+
+	event.type = SDL_MOUSEBUTTONUP;
+	event.button.button = button;
+
+	SDL_PushEvent(&event);
+}
+
 void handleLastGUIObjectDown(void)
 {
 	if (mouse.lastUsedObjectType == OBJECT_NONE)
@@ -771,18 +783,6 @@
 {
 	if (video.renderW > 0.0) video.dMouseXMul = (double)SCREEN_W / video.renderW;
 	if (video.renderH > 0.0) video.dMouseYMul = (double)SCREEN_H / video.renderH;
-}
-
-void sendMouseButtonUpEvent(uint8_t button)
-{
-	SDL_Event event;
-
-	memset(&event, 0, sizeof (event));
-
-	event.type = SDL_MOUSEBUTTONUP;
-	event.button.button = button;
-
-	SDL_PushEvent(&event);
 }
 
 void readMouseXY(void)
--- a/src/ft2_mouse.h
+++ b/src/ft2_mouse.h
@@ -31,7 +31,6 @@
 #define MOUSE_GLASS_ANI_FRAMES 22
 #define MOUSE_CLOCK_ANI_FRAMES 5
 
-void sendMouseButtonUpEvent(uint8_t button);
 void freeMouseCursors(void);
 bool createMouseCursors(void);
 void setMousePosToCenter(void);
--- a/src/ft2_replayer.c
+++ b/src/ft2_replayer.c
@@ -334,7 +334,7 @@
 	dVal = dMul * (256.0 * 65536.0 * 8363.0);
 	frequenceMulFactor = (int32_t)(dVal + 0.5);
 
-	audio.dScopeFreqMul = rate * (1.0 / SCOPE_HZ);
+	audio.dScopeFreqMul = rate / SCOPE_HZ;
 
 	// for volume ramping (FT2 doesn't round here)
 	audio.quickVolSizeVal = rate / 200;
--- a/src/ft2_sample_ed.c
+++ b/src/ft2_sample_ed.c
@@ -1180,16 +1180,6 @@
 	if (end < 0)
 		end = 0;
 
-	// kludge so that you can mark the last sample of what we see
-	// XXX: This doesn't seem to work properly!
-	if (end == SCREEN_W-1)
-	{
-		if (smpEd_ViewSize < SAMPLE_AREA_WIDTH) // zoomed in
-			end += 2;
-		else if (smpEd_ScrPos+smpEd_ViewSize >= s->len)
-			end++;
-	}
-
 	smpEd_Rx1 = scr2SmpPos(start);
 	smpEd_Rx2 = scr2SmpPos(end);
 
@@ -3095,12 +3085,30 @@
 	updateLoopsOnMouseUp = true;
 }
 
+static int32_t mouseYToSampleY(int32_t my)
+{
+	int32_t tmp32;
+
+	if (my == 250) // center
+	{
+		return 128;
+	}
+	else
+	{
+		tmp32 = my - 174;
+		tmp32 = ((tmp32 << 8) + (SAMPLE_AREA_HEIGHT/2)) / SAMPLE_AREA_HEIGHT;
+		tmp32 = CLAMP(tmp32, 0, 255);
+		tmp32 ^= 0xFF;
+	}
+
+	return tmp32;
+}
+
 static void editSampleData(bool mouseButtonHeld)
 {
 	int8_t *ptr8;
 	int16_t *ptr16;
 	int32_t mx, my, tmp32, p, vl, tvl, r, rl, rvl, start, end;
-	double dVal;
 	sampleTyp *s = getCurSample();
 
 	if (s == NULL || s->pek == NULL || s->len <= 0)
@@ -3109,6 +3117,9 @@
 	// ported directly from FT2 and slightly modified
 
 	mx = mouse.x;
+	if (mx > SCREEN_W)
+		mx = SCREEN_W;
+
 	my = mouse.y;
 
 	if (!mouseButtonHeld)
@@ -3121,17 +3132,7 @@
 		if (s->typ & 16)
 			lastDrawX >>= 1;
 
-		if (my == 250) // center
-		{
-			lastDrawY = 128;
-		}
-		else
-		{
-			dVal = (my - 174) * (256.0 / SAMPLE_AREA_HEIGHT);
-			lastDrawY = (int32_t)(dVal + 0.5);
-			lastDrawY = CLAMP(lastDrawY, 0, 255);
-			lastDrawY ^= 0xFF;
-		}
+		lastDrawY = mouseYToSampleY(my);
 
 		lastMouseX = mx;
 		lastMouseY = my;
@@ -3141,10 +3142,6 @@
 		return; // don't continue if we didn't move the mouse
 	}
 
-	// kludge so that you can edit the very end of the sample
-	if (mx == SCREEN_W-1 && smpEd_ScrPos+smpEd_ViewSize >= s->len)
-		mx++;
-
 	if (mx != lastMouseX)
 	{
 		p = scr2SmpPos(mx);
@@ -3157,23 +3154,9 @@
 	}
 
 	if (!keyb.leftShiftPressed && my != lastMouseY)
-	{
-		if (my == 250) // center
-		{
-			vl = 128;
-		}
-		else
-		{
-			dVal = (my - 174) * (256.0 / SAMPLE_AREA_HEIGHT);
-			vl = (int32_t)(dVal + 0.5);
-			vl = CLAMP(vl, 0, 255);
-			vl ^= 0xFF;
-		}
-	}
+		vl = mouseYToSampleY(my);
 	else
-	{
 		vl = lastDrawY;
-	}
 
 	lastMouseX = mx;
 	lastMouseY = my;
@@ -3213,7 +3196,7 @@
 
 		if (p == lastDrawX)
 		{
-			int16_t smpVal = (int16_t)((vl << 8) ^ 0x8000);
+			const int16_t smpVal = (int16_t)((vl << 8) ^ 0x8000);
 			for (rl = start; rl < end; rl++)
 				ptr16[rl] = smpVal;
 		}
@@ -3220,23 +3203,24 @@
 		else
 		{
 			int32_t y = lastDrawY - vl;
-			uint32_t x = lastDrawX - p;
+			int32_t x = lastDrawX - p;
 
-			int32_t xMul = 0xFFFFFFFF;
 			if (x != 0)
-				xMul /= x;
-
-			int32_t i = 0;
-			for (rl = start; rl < end; rl++)
 			{
-				tvl = y * i;
-				tvl = ((int64_t)tvl * xMul) >> 32; // tvl /= x;
-				tvl += vl;
-				tvl <<= 8;
-				tvl ^= 0x8000;
+				double dMul = 1.0 / x;
+				int32_t i = 0;
 
-				ptr16[rl] = (int16_t)tvl;
-				i++;
+				for (rl = start; rl < end; rl++)
+				{
+					tvl = y * i;
+					tvl = (int32_t)(tvl * dMul); // tvl /= x
+					tvl += vl;
+					tvl <<= 8;
+					tvl ^= 0x8000;
+
+					ptr16[rl] = (int16_t)tvl;
+					i++;
+				}
 			}
 		}
 	}
@@ -3256,7 +3240,7 @@
 
 		if (p == lastDrawX)
 		{
-			int8_t smpVal = (int8_t)(vl ^ 0x80);
+			const int8_t smpVal = (int8_t)(vl ^ 0x80);
 			for (rl = start; rl < end; rl++)
 				ptr8[rl] = smpVal;
 		}
@@ -3263,22 +3247,23 @@
 		else
 		{
 			int32_t y = lastDrawY - vl;
-			uint32_t x = lastDrawX - p;
+			int32_t x = lastDrawX - p;
 
-			int32_t xMul = 0xFFFFFFFF;
 			if (x != 0)
-				xMul /= x;
-
-			int32_t i = 0;
-			for (rl = start; rl < end; rl++)
 			{
-				tvl = y * i;
-				tvl = ((int64_t)tvl * xMul) >> 32; // tvl /= x;
-				tvl += vl;
-				tvl ^= 0x80;
+				double dMul = 1.0 / x;
+				int32_t i = 0;
 
-				ptr8[rl] = (int8_t)tvl;
-				i++;
+				for (rl = start; rl < end; rl++)
+				{
+					tvl = y * i;
+					tvl = (int32_t)(tvl * dMul); // tvl /= x
+					tvl += vl;
+					tvl ^= 0x80;
+
+					ptr8[rl] = (int8_t)tvl;
+					i++;
+				}
 			}
 		}
 	}
@@ -3291,11 +3276,14 @@
 
 void handleSampleDataMouseDown(bool mouseButtonHeld)
 {
-	int32_t tmp, leftLoopPinPos, rightLoopPinPos;
+	int32_t mx, my, leftLoopPinPos, rightLoopPinPos;
 
 	if (editor.curInstr == 0)
 		return;
 
+	mx = CLAMP(mouse.x, 0, SCREEN_W+8); // allow some pixels outside of the screen
+	my = CLAMP(mouse.y, 0, SCREEN_H-1);
+
 	if (!mouseButtonHeld)
 	{
 		editor.ui.rightLoopPinMoving  = false;
@@ -3303,8 +3291,8 @@
 		editor.ui.sampleDataOrLoopDrag = -1;
 
 		mouseXOffs = 0;
-		lastMouseX = mouse.x;
-		lastMouseY = mouse.y;
+		lastMouseX = mx;
+		lastMouseY = my;
 
 		mouse.lastUsedObjectType = OBJECT_SMPDATA;
 
@@ -3311,33 +3299,33 @@
 		if (mouse.leftButtonPressed)
 		{
 			// move loop pins
-			if (mouse.y < 183)
+			if (my < 183)
 			{
 				leftLoopPinPos = getSpritePosX(SPRITE_LEFT_LOOP_PIN);
-				if (mouse.x >= leftLoopPinPos && mouse.x <= leftLoopPinPos+16)
+				if (mx >= leftLoopPinPos && mx <= leftLoopPinPos+16)
 				{
-					mouseXOffs = (leftLoopPinPos + 8) - mouse.x;
+					mouseXOffs = (leftLoopPinPos + 8) - mx;
 
 					editor.ui.sampleDataOrLoopDrag = true;
 
 					setLeftLoopPinState(true);
-					lastMouseX = mouse.x;
+					lastMouseX = mx;
 
 					editor.ui.leftLoopPinMoving = true;
 					return;
 				}
 			}
-			else if (mouse.y > 318)
+			else if (my > 318)
 			{
 				rightLoopPinPos = getSpritePosX(SPRITE_RIGHT_LOOP_PIN);
-				if (mouse.x >= rightLoopPinPos && mouse.x <= rightLoopPinPos+16)
+				if (mx >= rightLoopPinPos && mx <= rightLoopPinPos+16)
 				{
-					mouseXOffs = (rightLoopPinPos + 8) - mouse.x;
+					mouseXOffs = (rightLoopPinPos + 8) - mx;
 
 					editor.ui.sampleDataOrLoopDrag = true;
 
 					setRightLoopPinState(true);
-					lastMouseX = mouse.x;
+					lastMouseX = mx;
 
 					editor.ui.rightLoopPinMoving = true;
 					return;
@@ -3345,9 +3333,10 @@
 			}
 
 			// mark data
-			editor.ui.sampleDataOrLoopDrag = mouse.x;
-			lastMouseX = editor.ui.sampleDataOrLoopDrag;
-			setSampleRange(editor.ui.sampleDataOrLoopDrag, editor.ui.sampleDataOrLoopDrag);
+			lastMouseX = mx;
+			editor.ui.sampleDataOrLoopDrag = mx;
+
+			setSampleRange(mx, mx);
 		}
 		else if (mouse.rightButtonPressed)
 		{
@@ -3365,33 +3354,31 @@
 		return;
 	}
 
-	if (mouse.x != lastMouseX)
+	if (mx != lastMouseX)
 	{
 		if (mouse.leftButtonPressed)
 		{
 			if (editor.ui.leftLoopPinMoving)
 			{
-				lastMouseX = mouse.x;
-				setLeftLoopPinPos(mouseXOffs + lastMouseX);
+				lastMouseX = mx;
+				setLeftLoopPinPos(mouseXOffs + mx);
 			}
 			else if (editor.ui.rightLoopPinMoving)
 			{
-				lastMouseX = mouse.x;
-				setRightLoopPinPos(mouseXOffs + lastMouseX);
+				lastMouseX = mx;
+				setRightLoopPinPos(mouseXOffs + mx);
 			}
 			else if (editor.ui.sampleDataOrLoopDrag >= 0)
 			{
 				// mark data
+				lastMouseX = mx;
 
-				lastMouseX = mouse.x;
-				tmp = lastMouseX;
-
-				if (lastMouseX  > editor.ui.sampleDataOrLoopDrag)
-					setSampleRange(editor.ui.sampleDataOrLoopDrag, tmp);
+				if (lastMouseX > editor.ui.sampleDataOrLoopDrag)
+					setSampleRange(editor.ui.sampleDataOrLoopDrag, mx);
 				else if (lastMouseX == editor.ui.sampleDataOrLoopDrag)
 					setSampleRange(editor.ui.sampleDataOrLoopDrag, editor.ui.sampleDataOrLoopDrag);
-				else if (lastMouseX  < editor.ui.sampleDataOrLoopDrag)
-					setSampleRange(tmp, editor.ui.sampleDataOrLoopDrag);
+				else if (lastMouseX < editor.ui.sampleDataOrLoopDrag)
+					setSampleRange(mx, editor.ui.sampleDataOrLoopDrag);
 			}
 		}
 	}
--- a/src/ft2_video.c
+++ b/src/ft2_video.c
@@ -260,8 +260,8 @@
 			if (dXUpscale != 0.0) video.renderW = (int32_t)(video.renderW / dXUpscale);
 			if (dYUpscale != 0.0) video.renderH = (int32_t)(video.renderH / dYUpscale);
 #endif
-			video.renderX = (video.displayW - video.renderW) / 2;
-			video.renderY = (video.displayH - video.renderH) / 2;
+			video.renderX = (video.displayW - video.renderW) >> 1;
+			video.renderY = (video.displayH - video.renderH) >> 1;
 		}
 	}
 	else
@@ -273,8 +273,8 @@
 	}
 
 	// for mouse cursor creation
-	video.xScale = (uint32_t)round(video.renderW / (double)SCREEN_W);
-	video.yScale = (uint32_t)round(video.renderH / (double)SCREEN_H);
+	video.xScale = (uint32_t)round(video.renderW * (1.0 / SCREEN_W));
+	video.yScale = (uint32_t)round(video.renderH * (1.0 / SCREEN_H));
 	createMouseCursors();
 }