regen patches

This commit is contained in:
naddy 2004-03-05 22:56:42 +00:00
parent 3e4e4f565a
commit 07f0e962cc
10 changed files with 420 additions and 431 deletions

View File

@ -1,5 +1,6 @@
--- Imakefile.orig Fri Nov 22 02:28:46 1996
+++ Imakefile Thu Mar 8 02:21:42 2001
$OpenBSD: patch-Imakefile,v 1.3 2004/03/05 22:56:42 naddy Exp $
--- Imakefile.orig 1996-11-22 02:28:46.000000000 +0100
+++ Imakefile 2004-03-05 23:30:39.000000000 +0100
@@ -24,23 +24,22 @@ XCOMM ==================================
XCOMM This is the directory where the highscore, level & sound data will be
XCOMM placed. Default will be the current directory.

View File

@ -1,29 +0,0 @@
*** editor.c.orig Wed Jan 13 22:23:04 1999
--- editor.c Wed Jan 13 22:27:18 1999
***************
*** 652,660 ****
Display *display;
#endif
{
EditState = EDIT_TEST;
! strcpy(tempName, tempnam("/tmp", "xboing-"));
if (SaveLevelDataFile(display, tempName) == False)
ShutDown(display, 1, "Sorry, cannot save test play level.");
--- 652,666 ----
Display *display;
#endif
{
+ int fd;
+
EditState = EDIT_TEST;
! sprintf(tempName, "/tmp/xboing-XXXXXXXXXX");
! if ((fd = mkstemp(tempName)) < 0)
! ShutDown(display, 1, "Sorry, cannot save test play level.");
!
! close(fd);
if (SaveLevelDataFile(display, tempName) == False)
ShutDown(display, 1, "Sorry, cannot save test play level.");

View File

@ -1,20 +1,13 @@
*** audio/LINUXaudio.c.orig Thu Nov 20 03:04:17 1997
--- audio/LINUXaudio.c Thu Nov 20 03:04:31 1997
***************
*** 55,61 ****
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
! #include <linux/soundcard.h>
#include "include/error.h"
#include "include/audio.h"
--- 55,61 ----
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
+ #include <sys/ioctl.h>
! #include <soundcard.h>
#include "include/error.h"
#include "include/audio.h"
$OpenBSD: patch-audio-LINUXaudio.c,v 1.2 2004/03/05 22:56:42 naddy Exp $
--- audio/LINUXaudio.c.orig 1996-11-22 02:28:33.000000000 +0100
+++ audio/LINUXaudio.c 2004-03-05 23:30:39.000000000 +0100
@@ -55,7 +55,8 @@
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
-#include <linux/soundcard.h>
+#include <sys/ioctl.h>
+#include <soundcard.h>
#include "include/error.h"
#include "include/audio.h"

View File

@ -1,12 +1,11 @@
*** ball.c.orig Wed Jan 13 22:16:23 1999
--- ball.c Wed Jan 13 22:16:29 1999
***************
*** 50,56 ****
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
- #include <values.h>
#include <xpm.h>
#include <X11/Xos.h>
--- 50,55 ----
$OpenBSD: patch-ball.c,v 1.2 2004/03/05 22:56:42 naddy Exp $
--- ball.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ ball.c 2004-03-05 23:30:39.000000000 +0100
@@ -50,7 +50,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
-#include <values.h>
#include <xpm.h>
#include <X11/Xos.h>

View File

@ -1,6 +1,7 @@
--- bonus.c.orig Thu Nov 20 03:12:56 1997
+++ bonus.c Thu Nov 20 03:15:32 1997
@@ -311,7 +311,7 @@
$OpenBSD: patch-bonus.c,v 1.2 2004/03/05 22:56:42 naddy Exp $
--- bonus.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ bonus.c 2004-03-05 23:30:39.000000000 +0100
@@ -311,7 +311,7 @@ void DrawTitleText(display, window)
XFlush(display);
SetBonusWait(BONUS_SCORE, frame + 5);
@ -9,7 +10,7 @@
DEBUG("set bonus mode to BONUS_SCORE.")
}
@@ -326,7 +326,7 @@
@@ -326,7 +326,7 @@ static void DoScore(display, window)
{
DEBUG("in function DoScore() in bonus.c")
@ -18,7 +19,7 @@
/* Nice message rewarding you for your efforts */
strcpy(string, "Congratulations on finishing this level.");
@@ -336,7 +336,7 @@
@@ -336,7 +336,7 @@ static void DoScore(display, window)
ypos += (35 + GAP);
SetBonusWait(BONUS_BONUS, frame + LINE_DELAY);
@ -27,7 +28,7 @@
DEBUG("set bonus mode to BONUS_BONUS.")
}
@@ -387,7 +387,7 @@
@@ -387,7 +387,7 @@ static void DoBonuses(display, window)
DrawShadowCentredText(display, window, textFont,
string, ypos, blue, TOTAL_WIDTH);
@ -36,7 +37,7 @@
/* Now skip to the next sequence */
SetBonusWait(BONUS_LEVEL, frame + LINE_DELAY);
@@ -411,7 +411,7 @@
@@ -411,7 +411,7 @@ static void DoBonuses(display, window)
bonusScore += ComputeScore(SUPER_BONUS_SCORE);
DisplayScore(display, scoreWindow, bonusScore);
@ -45,7 +46,7 @@
/* Now skip to the next sequence */
SetBonusWait(BONUS_LEVEL, frame + LINE_DELAY);
@@ -454,7 +454,7 @@
@@ -454,7 +454,7 @@ static void DoBonuses(display, window)
ypos += (int) (textFont->ascent + GAP * 1.5);
firstTime = True;
@ -54,7 +55,7 @@
}
}
@@ -468,7 +468,7 @@
@@ -468,7 +468,7 @@ static void DoLevel(display, window)
{
int secs, theLevel;
@ -63,7 +64,7 @@
/* Get the number of seconds left on the clock */
secs = GetLevelTimeBonus();
@@ -533,7 +533,7 @@
@@ -533,7 +533,7 @@ static void DoBullets(display, window)
/* Play the sound for the super bonus */
if (noSound == False) playSoundFile("Doh3", 80);
@ -72,7 +73,7 @@
/* Get ready for the next sequence */
SetBonusWait(BONUS_TIME, frame + LINE_DELAY);
@@ -569,7 +569,7 @@
@@ -569,7 +569,7 @@ static void DoBullets(display, window)
SetBonusWait(BONUS_TIME, frame + LINE_DELAY);
ypos += (textFont->ascent + GAP/2);
firstTime = True;
@ -81,7 +82,7 @@
}
}
@@ -583,7 +583,7 @@
@@ -583,7 +583,7 @@ static void DoTimeBonus(display, window)
{
int secs = 0;
@ -90,7 +91,7 @@
/* Get the number of seconds left on the clock */
secs = GetLevelTimeBonus();
@@ -627,7 +627,7 @@
@@ -627,7 +627,7 @@ static void DoHighScore(display, window)
int myrank = 0;
char str[5];
@ -99,7 +100,7 @@
/* Obtain current ranking for this score */
myrank = GetHighScoreRanking(score);
@@ -680,7 +680,7 @@
@@ -680,7 +680,7 @@ static void DoEndText(display, window)
{
DEBUG("DoEndText in bonus screen.")
@ -108,349 +109,3 @@
/* Finishing sentence - so you know what level to do */
sprintf(string, "Prepare for level %ld", level+1);
--- main.c.orig Thu Nov 20 03:15:34 1997
+++ main.c Thu Nov 20 03:15:54 1997
@@ -156,7 +156,7 @@
/* Set an entire game speedup or slowdown speed */
temp = (speed / (long) userDelay);
- userDelay = delay;
+ userDelay = delay/2 + 3;
speed = (long) (temp * userDelay);
speedLevel = 10 - delay;
}
--- misc.c.orig Fri Nov 22 09:28:46 1996
+++ misc.c Thu Nov 20 03:18:15 1997
@@ -89,8 +89,8 @@
#ifdef SYSV
#ifdef __clipper__
struct timeval tv;
- tv.tv_sec=((usec)/1000);
- tv.tv_usec=(((usec)%1000)*1000);
+ tv.tv_sec=((usec)/1000000);
+ tv.tv_usec=((usec)%1000000);
select(1,NULL,NULL,NULL,&tv);
#else
poll((struct poll *) 0, (size_t) 0, usec / 1000); /* ms resolution */
@@ -105,6 +105,68 @@
#endif
#if NeedFunctionPrototypes
+static int kudelay(unsigned long count)
+#else
+static int kudelay(count)
+unsigned long count;
+#endif
+{
+ unsigned int bluff = 1;
+
+ while( count-- != 0 ) /* this can hardly be "optimised out" */
+ bluff = (bluff ^ ((bluff & 1) * 0x6110)) >> 1;
+
+ return( bluff );
+}
+
+#if NeedFunctionPrototypes
+static void kusleep(unsigned long usec)
+#else
+static void kusleep(usec)
+ unsigned long usec;
+#endif
+{
+ static float kuliber_time = 0.0;
+ static float kuliber_count = 0.0;
+ static unsigned long kutimerswap = (1000000 / 15);
+ struct timeval st, et;
+ long gap;
+ unsigned long count;
+
+ if( kuliber_time == 0.0 )
+ {
+ count = 0x1000; /* calibrate delay loop */
+ gettimeofday(&st, NULL);
+
+ while( True )
+ {
+ kudelay( count );
+ count = (count << 1);
+ gettimeofday(&et, NULL);
+ gap = (((et.tv_sec - st.tv_sec) * 1000000) +
+ (et.tv_usec - st.tv_usec) );
+
+ if( gap > 400*1000 )
+ break;
+ }
+
+ kuliber_time = (float)(gap/4);
+ kuliber_count = (float)(((count-1)&~0xFFF)>>2);
+ }
+
+ if( usec > kutimerswap )
+ {
+ kutimerswap = (1000000 / 30);
+ usleep( usec ); /* using usleep() for low resolution only */
+ }
+ else
+ {
+ kutimerswap = (1000000 / 15);
+ kudelay( (unsigned long)(kuliber_count*((float)usec/kuliber_time)) );
+ }
+}
+
+#if NeedFunctionPrototypes
void sleepSync(Display *display, unsigned long ms)
#else
void sleepSync(display, ms)
@@ -112,27 +174,85 @@
unsigned long ms;
#endif
{
- struct timeval st, et;
- long SyncTime;
- static unsigned long accu;
+ static long Expected_time = 0;
+ static long Ref_sec = 0;
+ static long Ref_usec = 0;
+ static long Sleeping_time = 0;
+ static int PLL_filter = 0;
+ struct timeval st;
+ long elapsed;
+ long dodelay;
+ float x;
- gettimeofday(&st, NULL);
XSync(display, False);
- gettimeofday(&et, NULL);
- SyncTime = (((et.tv_sec - st.tv_sec) * 1000) +
- ((et.tv_usec - st.tv_usec) / 1000) );
+ gettimeofday(&st, NULL);
+
+ if( Ref_sec == 0 )
+ {
+ Ref_sec = st.tv_sec; /* take the initial reference point */
+ Ref_usec = st.tv_usec;
+ Sleeping_time = ms * 1000;
+ }
+
+ elapsed = (st.tv_sec - Ref_sec) * 1000000 + (st.tv_usec - Ref_usec);
+ dodelay = Sleeping_time;
+
+ if( PLL_filter > 0 && elapsed != 0 ) /* Phase lock loop */
+ {
+ dodelay = Expected_time + Sleeping_time - elapsed;
+
+ if( dodelay < 0 )
+ {
+ dodelay = 0; PLL_filter--;
+ }
+ else
+ if( dodelay > 2*Sleeping_time )
+ {
+ dodelay = 2*Sleeping_time; PLL_filter--;
+ }
+ else
+ PLL_filter = 3;
+
+ if( elapsed > 40*Sleeping_time && Expected_time > 40*Sleeping_time )
+ {
+ elapsed -= 20*Sleeping_time; /* Ref. point shouldn't be far away*/
+ Expected_time -= 20*Sleeping_time;
+ Ref_usec += 20*Sleeping_time;
+ Ref_sec += Ref_usec/1000000; Ref_usec %= 1000000;
+ }
+ }
-/* if ((ms) > ((1000 / 60) + SyncTime))
- usleep(ms - SyncTime);
-*/
- if ((ms + accu) > ((1000 / 30) + SyncTime))
+ if( PLL_filter <= 0 && elapsed > 40000 ) /* Frequency lock loop */
{
- usleep(ms +accu - SyncTime);
- accu = 0;
+ /* feedback filter */
+ x = 0.5 + 0.5 * (float)Expected_time / (float)elapsed;
+
+ if( x < 0.966 ) /* Acceleration must be strongly limited */
+ x = 0.966;
+
+ if( x > 2.0 )
+ x = 2.0;
+
+ Sleeping_time = (long)((float)Sleeping_time * x);
+
+ if( Sleeping_time < 500 )
+ Sleeping_time = 500;
+
+ if( x > 0.99 && x < 1.01 && Sleeping_time > ms*500 )
+ PLL_filter = -1 - 4*PLL_filter; /* locked - it's time to try PLL */
+ else
+ PLL_filter = 0;
+
+ Ref_sec = st.tv_sec;
+ Ref_usec = st.tv_usec;
+ Expected_time = 0;
+ dodelay = Sleeping_time;
}
- else if (ms > SyncTime)
- accu += (ms - SyncTime);
+
+ kusleep( dodelay );
+
+ Expected_time += ms * 1000;
}
#if NeedFunctionPrototypes
--- presents.c.orig Thu Nov 20 03:18:42 1997
+++ presents.c Thu Nov 20 03:21:38 1997
@@ -287,7 +287,7 @@
}
#endif
- SetPresentWait(PRESENT_TEXT1, frame + 800);
+ SetPresentWait(PRESENT_TEXT1, frame + 200);
}
#if NeedFunctionPrototypes
@@ -309,7 +309,7 @@
RenderShape(display, window, justin, justinM,
x, y, 285, 44, True);
- SetPresentWait(PRESENT_TEXT2, frame + 300);
+ SetPresentWait(PRESENT_TEXT2, frame + 100);
}
#if NeedFunctionPrototypes
@@ -331,7 +331,7 @@
RenderShape(display, window, kibell, kibellM,
x, y, 260, 40, True);
- SetPresentWait(PRESENT_TEXT3, frame + 500);
+ SetPresentWait(PRESENT_TEXT3, frame + 200);
}
#if NeedFunctionPrototypes
@@ -355,7 +355,7 @@
RenderShape(display, window, presents, presentsM,
x, y, 410, 44, True);
- SetPresentWait(PRESENT_TEXT_CLEAR, frame + 750);
+ SetPresentWait(PRESENT_TEXT_CLEAR, frame + 250);
}
#if NeedFunctionPrototypes
@@ -375,7 +375,7 @@
FadeAwayArea(display, window, x, y, 410, 44);
- SetPresentWait(PRESENT_LETTERS, frame + 10);
+ SetPresentWait(PRESENT_LETTERS, frame + 5);
}
/* The distances for the gap inbetwen blocks */
@@ -404,7 +404,7 @@
DrawLetter(display, window, i, x, y);
x += 10 + dists[i];
- SetPresentWait(PRESENT_LETTERS, frame + 300);
+ SetPresentWait(PRESENT_LETTERS, frame + 100);
}
else
{
@@ -416,7 +416,7 @@
x += dists[3];
DrawLetter(display, window, 3, x, y);
- SetPresentWait(PRESENT_SHINE, frame + 200);
+ SetPresentWait(PRESENT_SHINE, frame + 100);
}
i++;
@@ -463,7 +463,7 @@
if (in == 11)
{
XCopyArea(display, store, window, gc, 0, 0, 20, 20, x, y);
- SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 500);
+ SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 100);
}
}
}
@@ -499,7 +499,7 @@
len = strlen(wisdom);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -508,11 +508,11 @@
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 700);
+ SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 150);
}
}
@@ -542,7 +542,7 @@
len = strlen(wisdom2);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom2, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -551,11 +551,11 @@
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom2, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 700);
+ SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 150);
}
}
@@ -584,7 +584,7 @@
len = strlen(wisdom3);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom3, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -593,11 +593,11 @@
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom3, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_CLEAR, frame + 800);
+ SetPresentWait(PRESENT_CLEAR, frame + 200);
}
}
@@ -642,7 +642,7 @@
yb -= 10;
if (yt > ((PLAY_HEIGHT + MAIN_HEIGHT) / 2))
- SetPresentWait(PRESENT_FINISH, frame + 20);
+ SetPresentWait(PRESENT_FINISH, frame + 10);
nextFrame = frame + 20;
}

View File

@ -0,0 +1,20 @@
$OpenBSD: patch-editor_c,v 1.1 2004/03/05 22:56:42 naddy Exp $
--- editor.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ editor.c 2004-03-05 23:30:39.000000000 +0100
@@ -652,9 +652,15 @@ static void SetupPlayTest(display)
Display *display;
#endif
{
+ int fd;
+
EditState = EDIT_TEST;
- strcpy(tempName, tempnam("/tmp", "xboing-"));
+ sprintf(tempName, "/tmp/xboing-XXXXXXXXXX");
+ if ((fd = mkstemp(tempName)) < 0)
+ ShutDown(display, 1, "Sorry, cannot save test play level.");
+
+ close(fd);
if (SaveLevelDataFile(display, tempName) == False)
ShutDown(display, 1, "Sorry, cannot save test play level.");

View File

@ -1,5 +1,6 @@
--- highscore.c.orig Thu Nov 20 03:07:35 1997
+++ highscore.c Thu Nov 20 03:12:23 1997
$OpenBSD: patch-highscore.c,v 1.2 2004/03/05 22:56:42 naddy Exp $
--- highscore.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ highscore.c 2004-03-05 23:30:39.000000000 +0100
@@ -55,6 +55,7 @@
#include <time.h>
#include <file.h>
@ -8,7 +9,7 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
@@ -119,7 +120,7 @@
@@ -119,7 +120,7 @@ static void SetHighScoreWait(enum HighSc
static void InitialiseHighScores(void);
static void SortHighScores(void);
static void DeleteScore(int i);
@ -17,7 +18,7 @@
#else
static int LockUnlock();
static void DeleteScore();
@@ -844,7 +845,7 @@
@@ -844,7 +845,7 @@ int CheckAndAddScoreToHighScore(score, l
/* Lock the file for me only */
if (type == GLOBAL)
@ -26,7 +27,7 @@
/* Read in the lastest scores */
if (ReadHighScoreTable(type) == False)
@@ -875,8 +876,8 @@
@@ -875,8 +876,8 @@ int CheckAndAddScoreToHighScore(score, l
{
/* Don't add as score is smaller */
if (id != -1)
@ -37,7 +38,7 @@
}
}
} /* for */
@@ -898,16 +899,17 @@
@@ -898,16 +899,17 @@ int CheckAndAddScoreToHighScore(score, l
/* Unlock the file now thanks */
if (id != -1)
@ -57,7 +58,7 @@
/* Not even a highscore - loser! */
return False;
@@ -1185,10 +1187,10 @@
@@ -1185,10 +1187,10 @@ void ResetHighScore(type)
}
#if NeedFunctionPrototypes
@ -70,7 +71,7 @@
#endif
{
static int inter = -1;
@@ -1225,6 +1227,9 @@
@@ -1225,6 +1227,9 @@ static int LockUnlock(cmd)
/* Open the highscore file for both read & write */
if (cmd == LOCK_FILE)
inter = open(filename, O_CREAT | O_RDWR, 0666);

View File

@ -0,0 +1,12 @@
$OpenBSD: patch-main_c,v 1.1 2004/03/05 22:56:42 naddy Exp $
--- main.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ main.c 2004-03-05 23:30:39.000000000 +0100
@@ -156,7 +156,7 @@ void SetUserSpeed(delay)
/* Set an entire game speedup or slowdown speed */
temp = (speed / (long) userDelay);
- userDelay = delay;
+ userDelay = delay/2 + 3;
speed = (long) (temp * userDelay);
speedLevel = 10 - delay;
}

View File

@ -0,0 +1,184 @@
$OpenBSD: patch-misc_c,v 1.1 2004/03/05 22:56:42 naddy Exp $
--- misc.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ misc.c 2004-03-05 23:30:39.000000000 +0100
@@ -89,8 +89,8 @@ void usleep(usec)
#ifdef SYSV
#ifdef __clipper__
struct timeval tv;
- tv.tv_sec=((usec)/1000);
- tv.tv_usec=(((usec)%1000)*1000);
+ tv.tv_sec=((usec)/1000000);
+ tv.tv_usec=((usec)%1000000);
select(1,NULL,NULL,NULL,&tv);
#else
poll((struct poll *) 0, (size_t) 0, usec / 1000); /* ms resolution */
@@ -105,6 +105,68 @@ void usleep(usec)
#endif
#if NeedFunctionPrototypes
+static int kudelay(unsigned long count)
+#else
+static int kudelay(count)
+unsigned long count;
+#endif
+{
+ unsigned int bluff = 1;
+
+ while( count-- != 0 ) /* this can hardly be "optimised out" */
+ bluff = (bluff ^ ((bluff & 1) * 0x6110)) >> 1;
+
+ return( bluff );
+}
+
+#if NeedFunctionPrototypes
+static void kusleep(unsigned long usec)
+#else
+static void kusleep(usec)
+ unsigned long usec;
+#endif
+{
+ static float kuliber_time = 0.0;
+ static float kuliber_count = 0.0;
+ static unsigned long kutimerswap = (1000000 / 15);
+ struct timeval st, et;
+ long gap;
+ unsigned long count;
+
+ if( kuliber_time == 0.0 )
+ {
+ count = 0x1000; /* calibrate delay loop */
+ gettimeofday(&st, NULL);
+
+ while( True )
+ {
+ kudelay( count );
+ count = (count << 1);
+ gettimeofday(&et, NULL);
+ gap = (((et.tv_sec - st.tv_sec) * 1000000) +
+ (et.tv_usec - st.tv_usec) );
+
+ if( gap > 400*1000 )
+ break;
+ }
+
+ kuliber_time = (float)(gap/4);
+ kuliber_count = (float)(((count-1)&~0xFFF)>>2);
+ }
+
+ if( usec > kutimerswap )
+ {
+ kutimerswap = (1000000 / 30);
+ usleep( usec ); /* using usleep() for low resolution only */
+ }
+ else
+ {
+ kutimerswap = (1000000 / 15);
+ kudelay( (unsigned long)(kuliber_count*((float)usec/kuliber_time)) );
+ }
+}
+
+#if NeedFunctionPrototypes
void sleepSync(Display *display, unsigned long ms)
#else
void sleepSync(display, ms)
@@ -112,27 +174,85 @@ void sleepSync(display, ms)
unsigned long ms;
#endif
{
- struct timeval st, et;
- long SyncTime;
- static unsigned long accu;
+ static long Expected_time = 0;
+ static long Ref_sec = 0;
+ static long Ref_usec = 0;
+ static long Sleeping_time = 0;
+ static int PLL_filter = 0;
+ struct timeval st;
+ long elapsed;
+ long dodelay;
+ float x;
- gettimeofday(&st, NULL);
XSync(display, False);
- gettimeofday(&et, NULL);
- SyncTime = (((et.tv_sec - st.tv_sec) * 1000) +
- ((et.tv_usec - st.tv_usec) / 1000) );
+ gettimeofday(&st, NULL);
-/* if ((ms) > ((1000 / 60) + SyncTime))
- usleep(ms - SyncTime);
-*/
- if ((ms + accu) > ((1000 / 30) + SyncTime))
+ if( Ref_sec == 0 )
{
- usleep(ms +accu - SyncTime);
- accu = 0;
+ Ref_sec = st.tv_sec; /* take the initial reference point */
+ Ref_usec = st.tv_usec;
+ Sleeping_time = ms * 1000;
}
- else if (ms > SyncTime)
- accu += (ms - SyncTime);
+
+ elapsed = (st.tv_sec - Ref_sec) * 1000000 + (st.tv_usec - Ref_usec);
+ dodelay = Sleeping_time;
+
+ if( PLL_filter > 0 && elapsed != 0 ) /* Phase lock loop */
+ {
+ dodelay = Expected_time + Sleeping_time - elapsed;
+
+ if( dodelay < 0 )
+ {
+ dodelay = 0; PLL_filter--;
+ }
+ else
+ if( dodelay > 2*Sleeping_time )
+ {
+ dodelay = 2*Sleeping_time; PLL_filter--;
+ }
+ else
+ PLL_filter = 3;
+
+ if( elapsed > 40*Sleeping_time && Expected_time > 40*Sleeping_time )
+ {
+ elapsed -= 20*Sleeping_time; /* Ref. point shouldn't be far away*/
+ Expected_time -= 20*Sleeping_time;
+ Ref_usec += 20*Sleeping_time;
+ Ref_sec += Ref_usec/1000000; Ref_usec %= 1000000;
+ }
+ }
+
+ if( PLL_filter <= 0 && elapsed > 40000 ) /* Frequency lock loop */
+ {
+ /* feedback filter */
+ x = 0.5 + 0.5 * (float)Expected_time / (float)elapsed;
+
+ if( x < 0.966 ) /* Acceleration must be strongly limited */
+ x = 0.966;
+
+ if( x > 2.0 )
+ x = 2.0;
+
+ Sleeping_time = (long)((float)Sleeping_time * x);
+
+ if( Sleeping_time < 500 )
+ Sleeping_time = 500;
+
+ if( x > 0.99 && x < 1.01 && Sleeping_time > ms*500 )
+ PLL_filter = -1 - 4*PLL_filter; /* locked - it's time to try PLL */
+ else
+ PLL_filter = 0;
+
+ Ref_sec = st.tv_sec;
+ Ref_usec = st.tv_usec;
+ Expected_time = 0;
+ dodelay = Sleeping_time;
+ }
+
+ kusleep( dodelay );
+
+ Expected_time += ms * 1000;
}
#if NeedFunctionPrototypes

View File

@ -0,0 +1,153 @@
$OpenBSD: patch-presents_c,v 1.1 2004/03/05 22:56:42 naddy Exp $
--- presents.c.orig 1996-11-22 02:28:46.000000000 +0100
+++ presents.c 2004-03-05 23:30:39.000000000 +0100
@@ -287,7 +287,7 @@ void DoPresentFlag(display, window)
}
#endif
- SetPresentWait(PRESENT_TEXT1, frame + 800);
+ SetPresentWait(PRESENT_TEXT1, frame + 200);
}
#if NeedFunctionPrototypes
@@ -309,7 +309,7 @@ static void DoText1(display, window)
RenderShape(display, window, justin, justinM,
x, y, 285, 44, True);
- SetPresentWait(PRESENT_TEXT2, frame + 300);
+ SetPresentWait(PRESENT_TEXT2, frame + 100);
}
#if NeedFunctionPrototypes
@@ -331,7 +331,7 @@ static void DoText2(display, window)
RenderShape(display, window, kibell, kibellM,
x, y, 260, 40, True);
- SetPresentWait(PRESENT_TEXT3, frame + 500);
+ SetPresentWait(PRESENT_TEXT3, frame + 200);
}
#if NeedFunctionPrototypes
@@ -355,7 +355,7 @@ static void DoText3(display, window)
RenderShape(display, window, presents, presentsM,
x, y, 410, 44, True);
- SetPresentWait(PRESENT_TEXT_CLEAR, frame + 750);
+ SetPresentWait(PRESENT_TEXT_CLEAR, frame + 250);
}
#if NeedFunctionPrototypes
@@ -375,7 +375,7 @@ static void DoTextClear(display, window)
FadeAwayArea(display, window, x, y, 410, 44);
- SetPresentWait(PRESENT_LETTERS, frame + 10);
+ SetPresentWait(PRESENT_LETTERS, frame + 5);
}
/* The distances for the gap inbetwen blocks */
@@ -404,7 +404,7 @@ static void DoLetters(display, window)
DrawLetter(display, window, i, x, y);
x += 10 + dists[i];
- SetPresentWait(PRESENT_LETTERS, frame + 300);
+ SetPresentWait(PRESENT_LETTERS, frame + 100);
}
else
{
@@ -416,7 +416,7 @@ static void DoLetters(display, window)
x += dists[3];
DrawLetter(display, window, 3, x, y);
- SetPresentWait(PRESENT_SHINE, frame + 200);
+ SetPresentWait(PRESENT_SHINE, frame + 100);
}
i++;
@@ -463,7 +463,7 @@ static void DoSparkle(display, window)
if (in == 11)
{
XCopyArea(display, store, window, gc, 0, 0, 20, 20, x, y);
- SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 500);
+ SetPresentWait(PRESENT_SPECIAL_TEXT1, frame + 100);
}
}
}
@@ -499,7 +499,7 @@ static void DoSpecialText1(display, wind
len = strlen(wisdom);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -508,11 +508,11 @@ static void DoSpecialText1(display, wind
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 700);
+ SetPresentWait(PRESENT_SPECIAL_TEXT2, frame + 150);
}
}
@@ -542,7 +542,7 @@ static void DoSpecialText2(display, wind
len = strlen(wisdom2);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom2, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -551,11 +551,11 @@ static void DoSpecialText2(display, wind
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom2, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 700);
+ SetPresentWait(PRESENT_SPECIAL_TEXT3, frame + 150);
}
}
@@ -584,7 +584,7 @@ static void DoSpecialText3(display, wind
len = strlen(wisdom3);
x = ((PLAY_WIDTH + MAIN_WIDTH) / 2) -
(XTextWidth(dataFont, wisdom3, len) / 2);
- nextFrame = frame + 10;
+ nextFrame = frame + 5;
first = False;
}
@@ -593,11 +593,11 @@ static void DoSpecialText3(display, wind
if (noSound == False) playSoundFile("key", 60);
DrawText(display, window, x, y, dataFont, red, wisdom3, i);
- nextFrame = frame + 30;
+ nextFrame = frame + 15;
i++;
if (i > len)
- SetPresentWait(PRESENT_CLEAR, frame + 800);
+ SetPresentWait(PRESENT_CLEAR, frame + 200);
}
}
@@ -642,7 +642,7 @@ static void DoClear(display, window)
yb -= 10;
if (yt > ((PLAY_HEIGHT + MAIN_HEIGHT) / 2))
- SetPresentWait(PRESENT_FINISH, frame + 20);
+ SetPresentWait(PRESENT_FINISH, frame + 10);
nextFrame = frame + 20;
}