converted internal representation of palette from 6-bit to 8-bit

yazoo implemented remapActor

svn-id: r3526
This commit is contained in:
Ludvig Strigeus 2001-12-11 13:34:15 +00:00
parent a117505403
commit 083d9204c3
9 changed files with 114 additions and 70 deletions

View file

@ -1045,6 +1045,57 @@ bool Scumm::isCostumeInUse(int cost) {
return false;
}
void Scumm::remapActor(Actor *a, int b, int c, int d, int e) {
warning("stub remapActor(%d,%d,%d,%d,%d)", a->number, b, c, d, e);
void Scumm::remapActor(Actor *a, int r_fact, int g_fact, int b_fact, int threshold) {
byte *akos, *rgbs,*akpl;
int akpl_size, i;
int r,g,b;
byte akpl_color;
if (a->room != _currentRoom) {
warning("Remap actor %d not in current room",a->number);
return;
}
if (a->costume < 1 || a->costume >= _numCostumes-1){
warning("Remap actor %d invalid costume",a->number,a->costume);
return;
}
akos = getResourceAddress(rtCostume, a->costume);
akpl = findResource(MKID('AKPL'), akos);
//get num palette entries
akpl_size=RES_SIZE(akpl) - 8;
//skip resource header
akpl = RES_DATA(akpl);
rgbs = findResource(MKID('RGBS'), akos);
if (!rgbs) {
warning("Can't remap actor %d costume %d doesn't contain an RGB block",a->number,a->costume);
return;
}
// skip resource header
rgbs = RES_DATA(rgbs);
for(i=0; i<akpl_size; i++) {
r=*rgbs++;
g=*rgbs++;
b=*rgbs++;
akpl_color=*akpl++;
// allow remap of generic palette entry?
if (!a->unk1 || akpl_color>=16) {
if (r_fact!=256) r = (r*r_fact) >> 8;
if (r_fact!=256) g = (g*g_fact) >> 8;
if (r_fact!=256) b = (b*b_fact) >> 8;
a->palette[i]=remapPaletteColor(r,g,b,threshold);
}
}
}
void Scumm::setupShadowPalette(int slot,int rfact,int gfact,int bfact,int from,int to) {
warning("stub setupShadowPalette(%d,%d,%d,%d,%d,%d)", slot,rfact,gfact,bfact,from,to);
}

80
gfx.cpp
View file

@ -343,24 +343,14 @@ void Scumm::setPaletteFromPtr(byte *ptr) {
g = *ptr++;
b = *ptr++;
if (i<=15 || r<252 || g<252 || b<252) {
*dest++ = r>>2;
*dest++ = g>>2;
*dest++ = b>>2;
*dest++ = r;
*dest++ = g;
*dest++ = b;
} else {
dest += 3;
}
}
#if 0
if (_videoMode==0xE) {
epal = getResourceAddress(rtRoom, _roomResource) + _EPAL_offs + 8;
for (i=0; i<256; i++,epal++) {
_currentPalette[i] = *epal&0xF;
_currentPalette[i+256] = *epal>>4;
}
}
#endif
setDirtyColors(0, numcolor-1);
}
@ -1689,9 +1679,9 @@ void Gdi::resetBackground(byte top, byte bottom, int strip) {
}
void Scumm::setPalColor(int index, int r, int g, int b) {
_currentPalette[index*3+0] = r>>2;
_currentPalette[index*3+1] = g>>2;
_currentPalette[index*3+2] = b>>2;
_currentPalette[index*3+0] = r;
_currentPalette[index*3+1] = g;
_currentPalette[index*3+2] = b;
setDirtyColors(index,index);
}
@ -1796,7 +1786,7 @@ byte *Scumm::getPalettePtr() {
void Scumm::darkenPalette(int a, int b, int c, int d, int e) {
byte *cptr, *cur;
int num;
byte color;
int color;
cptr = getPalettePtr();
cptr += 8 + a*3;
@ -1805,28 +1795,22 @@ void Scumm::darkenPalette(int a, int b, int c, int d, int e) {
num = b - a + 1;
do {
if (c != 0xFF) {
color = *cptr++ * (c>>2) / 0xFF;
} else {
color = *cptr++ >> 2;
}
if(color>63) color = 63;
color = *cptr++;
if (c != 0xFF)
color = color * c / 0xFF;
if(color>255) color = 255;
*cur++=color;
if (d != 0xFF) {
color = *cptr++ * (d>>2) / 0xFF;
} else {
color = *cptr++ >> 2;
}
if(color>63) color = 63;
color = *cptr++;
if (d != 0xFF)
color = color * d / 0xFF;
if(color>255) color = 255;
*cur++=color;
if (e != 0xFF) {
color = *cptr++ * (e>>2) / 0xFF;
} else {
color = *cptr++ >> 2;
}
if(color>63) color = 63;
color = *cptr++;
if (e != 0xFF)
color = color * e / 0xFF;
if(color>255) color = 255;
*cur++=color;
} while (--num);
}
@ -1951,12 +1935,16 @@ void Scumm::decompressDefaultCursor(int index) {
}
int Scumm::remapPaletteColor(byte r, byte g, byte b, uint threshold) {
int Scumm::remapPaletteColor(int r, int g, int b, uint threshold) {
int i;
byte ar,ag,ab;
int ar,ag,ab;
uint sum,j,bestsum,bestitem;
byte *pal = _currentPalette;
if (r>255) r=255;
if (g>255) g=255;
if (b>255) b=255;
bestsum = (uint)-1;
r &= ~3;
@ -1970,12 +1958,12 @@ int Scumm::remapPaletteColor(byte r, byte g, byte b, uint threshold) {
if (ar==r && ag==g && ab==b)
return i;
j=abs(ar-r)*3;
sum = j*j;
j=abs(ag-g)*6;
sum += j*j;
j=abs(ab-b)*2;
sum += j*j;
j=abs(ar-r);
sum = j*j*3;
j=abs(ag-g);
sum += j*j*6;
j=abs(ab-b);
sum += j*j*2;
if (sum < bestsum) {
bestsum = sum;
@ -1983,7 +1971,7 @@ int Scumm::remapPaletteColor(byte r, byte g, byte b, uint threshold) {
}
}
if (threshold != -1 && bestsum > threshold*threshold*(2+3+6)) {
if (threshold != (uint)-1 && bestsum > threshold*threshold*(2+3+6)) {
pal = _currentPalette + (256-2)*3;
for(i=254; i>48; i--,pal-=3) {
if (pal[0]>=252 && pal[1]>=252 && pal[2]>=252) {
@ -1996,10 +1984,6 @@ int Scumm::remapPaletteColor(byte r, byte g, byte b, uint threshold) {
return bestitem;
}
void Scumm::setupShadowPalette(int slot,int rfact,int gfact,int bfact,int from,int to) {
}
void Scumm::drawBomp(BompDrawData *bd) {
byte *dest = bd->out + bd->y * bd->outwidth, *src;
int h = bd->srcheight;

View file

@ -537,7 +537,7 @@ byte *Scumm::getResourceAddress(int type, int index) {
setResourceCounter(type, index, 1);
return ptr + sizeof(ResHeader);
return ptr + sizeof(MemBlkHeader);
}
byte *Scumm::getStringAddress(int i) {
@ -575,7 +575,7 @@ byte *Scumm::createResource(int type, int index, uint32 size) {
CHECK_HEAP
ptr = (byte*)alloc(size + sizeof(ResHeader) + SAFETY_AREA);
ptr = (byte*)alloc(size + sizeof(MemBlkHeader) + SAFETY_AREA);
if (ptr==NULL) {
error("Out of memory while allocating %d", size);
}
@ -583,9 +583,9 @@ byte *Scumm::createResource(int type, int index, uint32 size) {
_allocatedSize += size;
res.address[type][index] = ptr;
((ResHeader*)ptr)->size = size;
((MemBlkHeader*)ptr)->size = size;
setResourceCounter(type, index, 1);
return ptr + sizeof(ResHeader); /* skip header */
return ptr + sizeof(MemBlkHeader); /* skip header */
}
void Scumm::validateResource(const char *str, int type, int index) {
@ -606,7 +606,7 @@ void Scumm::nukeResource(int type, int index) {
if ((ptr = res.address[type][index]) != NULL) {
res.address[type][index] = 0;
res.flags[type][index] = 0;
_allocatedSize -= ((ResHeader*)ptr)->size;
_allocatedSize -= ((MemBlkHeader*)ptr)->size;
free(ptr);
}
}
@ -823,7 +823,7 @@ void Scumm::resourceStats() {
for(j=res.num[i]; --j>=0;) {
flag = res.flags[i][j];
if (flag&0x80 && res.address[i][j]) {
lockedSize += ((ResHeader*)res.address[i][j])->size;
lockedSize += ((MemBlkHeader*)res.address[i][j])->size;
lockedNum++;
}
}

View file

@ -520,10 +520,10 @@ void Scumm::saveLoadResource(Serializer *ser, int type, int index) {
return;
}
size = ((ResHeader*)ptr)->size;
size = ((MemBlkHeader*)ptr)->size;
ser->saveUint32(size);
ser->saveLoadBytes(ptr+sizeof(ResHeader),size);
ser->saveLoadBytes(ptr+sizeof(MemBlkHeader),size);
if (type==rtInventory) {
ser->saveWord(_inventory[index]);

View file

@ -266,7 +266,7 @@ void Scumm::executeScript() {
}
byte Scumm::fetchScriptByte() {
if (*_lastCodePtr + sizeof(ResHeader) != _scriptOrgPointer) {
if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) {
uint32 oldoffs = _scriptPointer - _scriptOrgPointer;
getScriptBaseAddress();
_scriptPointer = _scriptOrgPointer + oldoffs;
@ -276,7 +276,7 @@ byte Scumm::fetchScriptByte() {
int Scumm::fetchScriptWord() {
int a;
if (*_lastCodePtr + sizeof(ResHeader) != _scriptOrgPointer) {
if (*_lastCodePtr + sizeof(MemBlkHeader) != _scriptOrgPointer) {
uint32 oldoffs = _scriptPointer - _scriptOrgPointer;
getScriptBaseAddress();
_scriptPointer = _scriptOrgPointer + oldoffs;

15
scumm.h
View file

@ -49,6 +49,11 @@ struct Point {
int x,y;
};
struct MemBlkHeader {
uint32 size;
};
#pragma START_PACK_STRUCTS
#define SIZEOF_BOX 20
@ -62,10 +67,14 @@ struct Box { /* file format */
uint16 scale;
} GCC_PACK;
struct ResHeader {
uint32 size;
struct ResHdr {
uint32 tag, size;
} GCC_PACK;
#define RES_DATA(x) (((byte*)x) + sizeof(ResHdr))
#define RES_SIZE(x) ( READ_BE_UINT32(&((ResHdr*)x)->size) )
struct RoomHeader {
uint32 tag, size;
#ifdef FULL_THROTTLE
@ -1960,7 +1969,7 @@ struct Scumm {
void runTalkScript(int frame);
int remapPaletteColor(byte r, byte g, byte b, uint threshold);
int remapPaletteColor(int r, int g, int b, uint threshold);
void remapActor(Actor *a, int b, int c, int d, int e);
byte *findResourceData(uint32 tag, byte *ptr);

View file

@ -50,9 +50,9 @@ void updatePalette(Scumm *s) {
data += first*3;
for (i=0; i<num; i++,data+=3) {
colors[i].r = data[0]<<2;
colors[i].g = data[1]<<2;
colors[i].b = data[2]<<2;
colors[i].r = data[0];
colors[i].g = data[1];
colors[i].b = data[2];
colors[i].unused = 0;
}

View file

@ -241,7 +241,7 @@ void WndMan::setPalette(byte *ctab, int first, int num) {
int i;
for (i=0; i<256; i++)
SetPalEntry(i, ctab[i*3+0]<<2, ctab[i*3+1]<<2, ctab[i*3+2]<<2);
SetPalEntry(i, ctab[i*3+0], ctab[i*3+1], ctab[i*3+2]);
}

View file

@ -331,9 +331,9 @@ void WndMan::setPalette(byte *ctab, int first, int num) {
#if 1
for (i=0; i<256; i++) {
dib.pal[i].rgbRed = ctab[i*3+0]<<2;
dib.pal[i].rgbGreen = ctab[i*3+1]<<2;
dib.pal[i].rgbBlue = ctab[i*3+2]<<2;
dib.pal[i].rgbRed = ctab[i*3+0];
dib.pal[i].rgbGreen = ctab[i*3+1];
dib.pal[i].rgbBlue = ctab[i*3+2];
}
#else
for (i=0; i<256; i++) {