Palette transitions are now smooth

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@128 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
gewlitys
2002-10-15 21:51:16 +00:00
parent b65f06144b
commit 72fbba7d4d
+64 -46
View File
@@ -368,7 +368,7 @@ static BOOLEAN ColorChange;
static BOOLEAN volatile XFormFlush; static BOOLEAN volatile XFormFlush;
static COUNT volatile NumXFormTasks; static COUNT volatile NumXFormTasks;
int xform_PLUT_task(void* data) int xform_PLUT_task (void* data)
{ {
COLORMAPPTR CurMapPtr; COLORMAPPTR CurMapPtr;
Task task = (Task) data; Task task = (Task) data;
@@ -379,21 +379,23 @@ int xform_PLUT_task(void* data)
CurMapPtr = TaskControl.CMapPtr; CurMapPtr = TaskControl.CMapPtr;
{ {
SIZE TDelta, TTotal; BYTE i;
SIZE TDelta, TTotal, TTotalOrig;
DWORD CurTime; DWORD CurTime;
DWORD OldCMap[NUMBER_OF_PLUT_UINT32s], *pOldCMap, *pCurCMap;
TTotal = TaskControl.Ticks; pCurCMap = (DWORD *)((BYTE *)_varPLUTs + (*CurMapPtr * PLUT_BYTE_SIZE));
pOldCMap = OldCMap;
for (i = 0; i < NUMBER_OF_PLUT_UINT32s; ++i)
*pOldCMap++ = *pCurCMap++;
TTotal = TTotalOrig = TaskControl.Ticks;
TaskControl.CMapPtr = 0; TaskControl.CMapPtr = 0;
CurTime = GetTimeCounter (); CurTime = GetTimeCounter ();
do do
{ {
//#define NUMBER_OF_PLUTVALS 32
//#define NUMBER_OF_PLUT_UINT32s (NUMBER_OF_PLUTVALS >> 1)
BYTE i;
DWORD StartTime; DWORD StartTime;
DWORD *pCurCMap;
COLORMAPPTR ColorMapPtr; COLORMAPPTR ColorMapPtr;
extern DWORD *_varPLUTs;
StartTime = CurTime; StartTime = CurTime;
SleepThread (2); SleepThread (2);
@@ -403,55 +405,73 @@ int xform_PLUT_task(void* data)
ColorMapPtr = CurMapPtr; ColorMapPtr = CurMapPtr;
pCurCMap = (DWORD *)((BYTE *)_varPLUTs + (*ColorMapPtr * PLUT_BYTE_SIZE)); pCurCMap = (DWORD *)((BYTE *)_varPLUTs + (*ColorMapPtr * PLUT_BYTE_SIZE));
pOldCMap = OldCMap;
ColorMapPtr += 2; ColorMapPtr += 2;
i = NUMBER_OF_PLUT_UINT32s; i = NUMBER_OF_PLUT_UINT32s;
if (_varPLUTs) if (_varPLUTs)
do do
{ {
SIZE c0, c1; SIZE c0, c1;
DWORD v0, v1, val; DWORD v0, v1, val;
float f = (TTotalOrig - TTotal) / (float)TTotalOrig;
COLORMAPPTR oldmap = (COLORMAPPTR) pOldCMap;
v0 = *pCurCMap; v0 = MAKE_DWORD
v1 = MAKE_DWORD ( (
MAKE_WORD (oldmap[3], oldmap[2]),
MAKE_WORD (oldmap[1], oldmap[0])
);
v1 = MAKE_DWORD
(
MAKE_WORD (ColorMapPtr[3], ColorMapPtr[2]), MAKE_WORD (ColorMapPtr[3], ColorMapPtr[2]),
MAKE_WORD (ColorMapPtr[1], ColorMapPtr[0]) MAKE_WORD (ColorMapPtr[1], ColorMapPtr[0])
); );
ColorMapPtr += sizeof (DWORD);
c0 = (v0 >> (10 + 16)) & 0x1F; ColorMapPtr += sizeof (DWORD);
c1 = (v1 >> (10 + 16)) & 0x1F;
c0 += ((c1 - c0) * TDelta) / TTotal;
val = (c0 & 0x1F) | (1 << 5);
c0 = (v0 >> (5 + 16)) & 0x1F; c0 = (SIZE)((v0 >> (10 + 16)) & 0x1F);
c1 = (v1 >> (5 + 16)) & 0x1F; c1 = (SIZE)((v1 >> (10 + 16)) & 0x1F);
c0 += ((c1 - c0) * TDelta) / TTotal; c0 += (SIZE)((c1 - c0) * f);
val = (val << 5) | (c0 & 0x1F); val = (c0 & 0x1F) | (1 << 5);
c0 = (v0 >> (0 + 16)) & 0x1F; c0 = (SIZE)((v0 >> (5 + 16)) & 0x1F);
c1 = (v1 >> (0 + 16)) & 0x1F; c1 = (SIZE)((v1 >> (5 + 16)) & 0x1F);
c0 += ((c1 - c0) * TDelta) / TTotal; c0 += (SIZE)((c1 - c0) * f);
val = (val << 5) | (c0 & 0x1F); val = (val << 5) | (c0 & 0x1F);
c0 = (v0 >> 10) & 0x1F; c0 = (SIZE)((v0 >> (0 + 16)) & 0x1F);
c1 = (v1 >> 10) & 0x1F; c1 = (SIZE)((v1 >> (0 + 16)) & 0x1F);
c0 += ((c1 - c0) * TDelta) / TTotal; c0 += (SIZE)((c1 - c0) * f);
val = (val << (5 + 1)) | (c0 & 0x1F) | (1 << 5); val = (val << 5) | (c0 & 0x1F);
c0 = (v0 >> 5) & 0x1F; c0 = (SIZE)((v0 >> 10) & 0x1F);
c1 = (v1 >> 5) & 0x1F; c1 = (SIZE)((v1 >> 10) & 0x1F);
c0 += ((c1 - c0) * TDelta) / TTotal; c0 += (SIZE)((c1 - c0) * f);
val = (val << 5) | (c0 & 0x1F); val = (val << (5 + 1)) | (c0 & 0x1F) | (1 << 5);
c0 = (v0 >> 0) & 0x1F; c0 = (SIZE)((v0 >> 5) & 0x1F);
c1 = (v1 >> 0) & 0x1F; c1 = (SIZE)((v1 >> 5) & 0x1F);
c0 += ((c1 - c0) * TDelta) / TTotal; c0 += (SIZE)((c1 - c0) * f);
val = (val << 5) | (c0 & 0x1F); val = (val << 5) | (c0 & 0x1F);
*pCurCMap++ = val; c0 = (SIZE)((v0 >> 0) & 0x1F);
} while (--i); c1 = (SIZE)((v1 >> 0) & 0x1F);
c0 += (SIZE)((c1 - c0) * f);
val = (val << 5) | (c0 & 0x1F);
ColorChange = TRUE; *pOldCMap++;
*pCurCMap++ = MAKE_DWORD
(
MAKE_WORD ((val >> 24 ) & 0xff, (val >> 16) & 0xff),
MAKE_WORD ((val >> 8 ) & 0xff, (val >> 0 ) & 0xff)
);
} while (--i);
ColorChange = TRUE;
} while (TTotal -= TDelta && !Task_ReadState (task, TASK_EXIT)); } while (TTotal -= TDelta && !Task_ReadState (task, TASK_EXIT));
} }
@@ -482,8 +502,6 @@ XFormPLUT (COLORMAPPTR ColorMapPtr, SIZE TimeInterval)
{ {
DWORD TimeOut; DWORD TimeOut;
TimeInterval = 0; // added by Mika
FlushPLUTXForms (); FlushPLUTXForms ();
TaskControl.CMapPtr = ColorMapPtr; TaskControl.CMapPtr = ColorMapPtr;