mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
Rename 'Standard Gaming Platform' to 'sgp' (#246)
* rename 'Standard Gaming Platform' to 'sgp' * Adapt CMakeLists.txt files to renamed SGP directory * Lowercase it
This commit is contained in:
+283
@@ -0,0 +1,283 @@
|
||||
#include "DirectDraw Calls.h"
|
||||
#include <stdio.h>
|
||||
#include "debug.h"
|
||||
#include "video.h"
|
||||
#include "himage.h"
|
||||
#include "vobject.h"
|
||||
#include "vobject_blitters.h"
|
||||
#include "shading.h"
|
||||
|
||||
BOOLEAN ShadesCalculateTables(SGPPaletteEntry *p8BPPPalette);
|
||||
BOOLEAN ShadesCalculatePalette(SGPPaletteEntry *pSrcPalette, SGPPaletteEntry *pDestPalette, UINT16 usRed, UINT16 usGreen, UINT16 usBlue, BOOLEAN fMono);
|
||||
void FindIndecies(SGPPaletteEntry *pSrcPalette, SGPPaletteEntry *pMapPalette, UINT8 *pTable);
|
||||
void FindMaskIndecies(UINT8 *, UINT8 *, UINT8 *);
|
||||
|
||||
SGPPaletteEntry Shaded8BPPPalettes[HVOBJECT_SHADE_TABLES+3][256];
|
||||
UINT8 ubColorTables[HVOBJECT_SHADE_TABLES+3][256];
|
||||
|
||||
UINT16 IntensityTable[65536];
|
||||
UINT16 ShadeTable[65536];
|
||||
UINT16 White16BPPPalette[ 256 ];
|
||||
FLOAT guiShadePercent = (FLOAT)0.48;
|
||||
FLOAT guiBrightPercent = (FLOAT)1.1;
|
||||
|
||||
BOOLEAN ShadesCalculateTables(SGPPaletteEntry *p8BPPPalette)
|
||||
{
|
||||
UINT32 uiCount;
|
||||
|
||||
// Green palette
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[0], 0, 255, 0, TRUE);
|
||||
// Blue palette
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[HVOBJECT_SHADE_TABLES], 0, 0, 255, TRUE);
|
||||
// Yellow palette
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[HVOBJECT_SHADE_TABLES+1], 255, 255, 0, TRUE);
|
||||
// Red palette
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[HVOBJECT_SHADE_TABLES+2], 255, 0, 0, TRUE);
|
||||
|
||||
// these are the brightening tables, 115%-150% brighter than original
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[1], 293, 293, 293, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[2], 281, 281, 281, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[3], 268, 268, 268, FALSE);
|
||||
|
||||
// palette 4 is the non-modified palette.
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[4], 255, 255, 255, FALSE);
|
||||
|
||||
// the rest are darkening tables, right down to all-black.
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[5], 195, 195, 195, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[6], 165, 165, 165, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[7], 135, 135, 135, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[8], 105, 105, 105, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[9], 75, 75, 75, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[10], 45, 45, 45, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[11], 36, 36, 36, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[12], 27, 27, 27, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[13], 18, 18, 18, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[14], 9, 9, 9, FALSE);
|
||||
ShadesCalculatePalette(p8BPPPalette, Shaded8BPPPalettes[15], 0, 0, 0, FALSE);
|
||||
|
||||
|
||||
// Remap the shade colors to the original palette
|
||||
for(uiCount=0; uiCount < (HVOBJECT_SHADE_TABLES+3); uiCount++)
|
||||
{
|
||||
FindIndecies(Shaded8BPPPalettes[uiCount], p8BPPPalette, ubColorTables[uiCount]);
|
||||
ubColorTables[uiCount][0]=0;
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
BOOLEAN ShadesCalculatePalette(SGPPaletteEntry *pSrcPalette, SGPPaletteEntry *pDestPalette, UINT16 usRed, UINT16 usGreen, UINT16 usBlue, BOOLEAN fMono)
|
||||
{
|
||||
UINT32 cnt, lumin;
|
||||
UINT32 rmod, gmod, bmod;
|
||||
|
||||
Assert( pSrcPalette != NULL );
|
||||
Assert( pDestPalette != NULL );
|
||||
|
||||
for ( cnt = 0; cnt < 256; cnt++ )
|
||||
{
|
||||
if(fMono)
|
||||
{
|
||||
lumin=(pSrcPalette[ cnt ].peRed*299/1000)+ (pSrcPalette[ cnt ].peGreen*587/1000)+(pSrcPalette[ cnt ].peBlue*114/1000);
|
||||
rmod=usRed*lumin/255;
|
||||
gmod=usGreen*lumin/255;
|
||||
bmod=usBlue*lumin/255;
|
||||
}
|
||||
else
|
||||
{
|
||||
rmod = (usRed*pSrcPalette[ cnt ].peRed/255);
|
||||
gmod = (usGreen*pSrcPalette[ cnt ].peGreen/255);
|
||||
bmod = (usBlue*pSrcPalette[ cnt ].peBlue/255);
|
||||
}
|
||||
|
||||
pDestPalette[ cnt ].peRed = (UINT8)__min(rmod, 255);
|
||||
pDestPalette[ cnt ].peGreen = (UINT8)__min(gmod, 255);
|
||||
pDestPalette[ cnt ].peBlue = (UINT8)__min(bmod, 255);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void FindIndecies(SGPPaletteEntry *pSrcPalette, SGPPaletteEntry *pMapPalette, UINT8 *pTable)
|
||||
{
|
||||
UINT16 usCurIndex, usCurDelta, usCurCount;
|
||||
UINT32 *pSavedPtr;
|
||||
|
||||
__asm {
|
||||
|
||||
// Assumes:
|
||||
// ESI = Pointer to source palette (shaded values)
|
||||
// EDI = Pointer to original palette (palette we'll end up using!)
|
||||
// EBX = Pointer to array of indecies
|
||||
|
||||
mov esi, pSrcPalette
|
||||
mov edi, pMapPalette
|
||||
mov ebx, pTable
|
||||
|
||||
mov BYTE PTR [ebx],0 ; Index 0 is always 0, for trans col
|
||||
inc ebx
|
||||
|
||||
add esi,4 ; Goto next color entry
|
||||
add edi,4
|
||||
mov pSavedPtr, edi ; Save pointer to original pal
|
||||
|
||||
mov usCurCount, 255 ; We'll check cols 1-255
|
||||
|
||||
DoNextIndex:
|
||||
|
||||
mov edi, pSavedPtr ; Restore saved ptr
|
||||
mov usCurIndex, 256 ; Set found index & delta to some
|
||||
mov usCurDelta, 0ffffh ; val so we get at least 1 col.
|
||||
|
||||
mov ecx,255 ; Check cols 1-255 of orig pal
|
||||
push ebx
|
||||
xor bx,bx
|
||||
|
||||
NextColor:
|
||||
xor ah,ah ; Calc delta between shaded color
|
||||
mov al,[edi] ; and a color in the orig palette.
|
||||
mov bl,[esi] ; Formula:
|
||||
sub ax,bx ; Delta = abs(red-origred) +
|
||||
or ax,ax ; abs(green-origgreen) +
|
||||
jns NC1
|
||||
neg ax
|
||||
NC1:mov dx,ax ; abs(blue-origblue)
|
||||
xor ah,ah
|
||||
mov al,[edi+1]
|
||||
mov bl,[esi+1]
|
||||
sub ax,bx
|
||||
or ax,ax ; abs(green-origgreen) +
|
||||
jns NC2
|
||||
neg ax
|
||||
NC2:add dx,ax
|
||||
xor ah,ah
|
||||
mov al,[edi+2]
|
||||
mov bl,[esi+2]
|
||||
sub ax,bx
|
||||
or ax,ax ; abs(green-origgreen) +
|
||||
jns NC3
|
||||
neg ax
|
||||
NC3:add dx,ax
|
||||
|
||||
cmp dx,usCurDelta ; If delta < old delta
|
||||
jae NotThisCol ; Save this delta and it's
|
||||
mov ax,256 ; palette index
|
||||
mov [usCurDelta],dx
|
||||
sub ax,cx
|
||||
mov [usCurIndex],ax
|
||||
NotThisCol:
|
||||
add edi,4 ; Try next color in orginal pal
|
||||
dec cx
|
||||
jnz NextColor
|
||||
|
||||
pop ebx
|
||||
mov ax,usCurIndex ; By now, usCurIndex holds pal index
|
||||
mov [ebx],al ; of closest color in orig pal
|
||||
inc ebx ; so save it, then repeat above
|
||||
add esi,4 ; for the other cols in shade pal
|
||||
dec usCurCount
|
||||
jnz DoNextIndex
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************************************
|
||||
BuildShadeTable
|
||||
|
||||
Builds a 16-bit color shading table. This function should be called only after the current
|
||||
video adapter's pixel format is known (IE: GetRgbDistribution() has been called, and the
|
||||
globals for masks and shifts have been initialized by that function), and before any
|
||||
blitting is done.
|
||||
|
||||
Using the table is a straight lookup. The pixel to be shaded down is used as the index into
|
||||
the table and the entry at that point will be a pixel that is 25% darker.
|
||||
|
||||
**********************************************************************************************/
|
||||
void BuildShadeTable(void)
|
||||
{
|
||||
UINT16 red, green, blue;
|
||||
UINT16 index = 0;
|
||||
|
||||
|
||||
for(red=0; red < 256; red+=4)
|
||||
for(green=0; green < 256; green+=4)
|
||||
for(blue=0; blue < 256; blue+=4)
|
||||
{
|
||||
index=Get16BPPColor(FROMRGB(red, green, blue));
|
||||
ShadeTable[index]=Get16BPPColor(FROMRGB(red*guiShadePercent, green*guiShadePercent, blue*guiShadePercent));
|
||||
}
|
||||
|
||||
memset( White16BPPPalette, 65535, sizeof( White16BPPPalette ) );
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
BuildIntensityTable
|
||||
|
||||
Builds a 16-bit color shading table. This function should be called only after the current
|
||||
video adapter's pixel format is known (IE: GetRgbDistribution() has been called, and the
|
||||
globals for masks and shifts have been initialized by that function), and before any
|
||||
blitting is done.
|
||||
|
||||
|
||||
|
||||
**********************************************************************************************/
|
||||
void BuildIntensityTable(void)
|
||||
{
|
||||
UINT16 red, green, blue = 0;
|
||||
UINT16 index = 0;
|
||||
FLOAT dShadedPercent = (FLOAT)0.80;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
for(red=0; red < 256; red+=4)
|
||||
for(green=0; green < 256; green+=4)
|
||||
for(blue=0; blue < 256; blue+=4)
|
||||
{
|
||||
index=Get16BPPColor(FROMRGB(red, green, blue));
|
||||
IntensityTable[index]=Get16BPPColor(FROMRGB(red*dShadedPercent, green*dShadedPercent, blue*dShadedPercent));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SetShadeTablePercent( FLOAT uiShadePercent )
|
||||
{
|
||||
guiShadePercent = uiShadePercent;
|
||||
BuildShadeTable( );
|
||||
}
|
||||
|
||||
|
||||
void Init8BitTables(void)
|
||||
{
|
||||
SGPPaletteEntry Pal[256];
|
||||
UINT32 uiCount;
|
||||
|
||||
// calculate a grey-scale table for the default palette
|
||||
for(uiCount=0; uiCount < 256; uiCount++)
|
||||
{
|
||||
Pal[uiCount].peRed=(UINT8)(uiCount%128)+128;
|
||||
Pal[uiCount].peGreen=(UINT8)(uiCount%128)+128;
|
||||
Pal[uiCount].peBlue=(UINT8)(uiCount%128)+128;
|
||||
}
|
||||
|
||||
Pal[0].peRed=0;
|
||||
Pal[0].peGreen=0;
|
||||
Pal[0].peBlue=0;
|
||||
|
||||
Set8BPPPalette(Shaded8BPPPalettes[4]);
|
||||
}
|
||||
|
||||
BOOLEAN Set8BitModePalette(SGPPaletteEntry *pPal)
|
||||
{
|
||||
ShadesCalculateTables(pPal);
|
||||
Set8BPPPalette(pPal);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user