mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-19 16:33:50 +00:00
TOLTECS: Fixed clipping (the clipping of the right border with flipped sprites was buggy)
This commit is contained in:
parent
c82349c1b8
commit
59bbad2ac8
@ -136,8 +136,6 @@ void Screen::drawGuiImage(int16 x, int16 y, uint resIndex) {
|
||||
|
||||
debug(0, "Screen::drawGuiImage() x = %d; y = %d; w = %d; h = %d; resIndex = %d", x, y, width, height, resIndex);
|
||||
|
||||
//_vm->_arc->dump(resIndex, "gui");
|
||||
|
||||
while (workHeight > 0) {
|
||||
int count = 1;
|
||||
byte pixel = *imageData++;
|
||||
@ -435,43 +433,38 @@ void Screen::addDrawRequest(const DrawRequest &drawRequest) {
|
||||
if (sprite.height <= 0)
|
||||
return;
|
||||
|
||||
sprite.value1 = 0;
|
||||
|
||||
sprite.skipX = 0;
|
||||
|
||||
if (drawRequest.flags & 0x1000) {
|
||||
// Left border
|
||||
if (sprite.x - _vm->_cameraX < 0) {
|
||||
sprite.width -= ABS(sprite.x - _vm->_cameraX);
|
||||
if (sprite.width <= 0)
|
||||
return;
|
||||
sprite.x = _vm->_cameraX;
|
||||
}
|
||||
// Right border
|
||||
if (sprite.x + sprite.width - _vm->_cameraX - 640 > 0) {
|
||||
sprite.flags |= 8;
|
||||
sprite.width -= sprite.x + sprite.width - _vm->_cameraX - 640;
|
||||
if (sprite.width <= 0)
|
||||
return;
|
||||
sprite.value1 = sprite.x + sprite.width - _vm->_cameraX - 640;
|
||||
sprite.skipX = sprite.x + sprite.width - _vm->_cameraX - 640;
|
||||
sprite.width -= sprite.skipX;
|
||||
}
|
||||
} else {
|
||||
// Left border
|
||||
if (sprite.x - _vm->_cameraX < 0) {
|
||||
sprite.flags |= 8;
|
||||
sprite.width -= ABS(sprite.x - _vm->_cameraX);
|
||||
if (sprite.width <= 0)
|
||||
return;
|
||||
sprite.value1 = ABS(sprite.x - _vm->_cameraX);
|
||||
sprite.skipX = ABS(sprite.x - _vm->_cameraX);
|
||||
sprite.width -= sprite.skipX;
|
||||
sprite.x = _vm->_cameraX;
|
||||
}
|
||||
// Right border
|
||||
if (sprite.x + sprite.width - _vm->_cameraX - 640 > 0) {
|
||||
sprite.flags |= 8;
|
||||
sprite.width -= sprite.x + sprite.width - _vm->_cameraX - 640;
|
||||
if (sprite.width <= 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (sprite.width <= 0)
|
||||
return;
|
||||
|
||||
// Add sprite sorted by priority
|
||||
Common::List<SpriteDrawItem>::iterator iter = _spriteDrawList.begin();
|
||||
while (iter != _spriteDrawList.end() && (*iter).ybottom <= sprite.ybottom) {
|
||||
@ -492,13 +485,6 @@ void Screen::drawSprite(SpriteDrawItem *sprite) {
|
||||
byte *source = _vm->_res->load(sprite->resIndex) + sprite->offset;
|
||||
byte *dest = _frontScreen + (sprite->x - _vm->_cameraX) + (sprite->y - _vm->_cameraY) * 640;
|
||||
|
||||
// FIXME: Temporary hack until proper clipping is implemented
|
||||
/*
|
||||
int16 dx = sprite->x - _vm->_cameraX, dy = sprite->y - _vm->_cameraY;
|
||||
if (dx < 0 || dy < 0 || dx + sprite->width >= 640 || dy + sprite->height >= 400)
|
||||
return;
|
||||
*/
|
||||
|
||||
SpriteReader spriteReader(source, sprite);
|
||||
|
||||
if (sprite->flags & 0x40) {
|
||||
@ -536,23 +522,18 @@ void Screen::drawSpriteCore(byte *dest, SpriteFilter &reader, SpriteDrawItem *sp
|
||||
|
||||
int16 destInc;
|
||||
|
||||
/*
|
||||
if ((sprite->flags & 8))
|
||||
return;
|
||||
*/
|
||||
|
||||
if (sprite->flags & 4) {
|
||||
destInc = -1;
|
||||
dest += sprite->width;
|
||||
} else {
|
||||
destInc = 1;
|
||||
}
|
||||
|
||||
|
||||
SpriteReaderStatus status;
|
||||
PixelPacket packet;
|
||||
|
||||
byte *destp = dest;
|
||||
int16 skipX = sprite->value1;
|
||||
int16 skipX = sprite->skipX;
|
||||
|
||||
int16 w = sprite->width;
|
||||
int16 h = sprite->height;
|
||||
@ -600,15 +581,15 @@ void Screen::drawSpriteCore(byte *dest, SpriteFilter &reader, SpriteDrawItem *sp
|
||||
dest += packet.count * destInc;
|
||||
}
|
||||
|
||||
if (status == kSrsEndOfLine || w == 0) {
|
||||
if (w == 0) {
|
||||
while (status != kSrsEndOfLine) {
|
||||
if (status == kSrsEndOfLine || w <= 0) {
|
||||
if (w <= 0) {
|
||||
while (status == kSrsPixelsLeft) {
|
||||
status = reader.readPacket(packet);
|
||||
}
|
||||
}
|
||||
dest = destp + 640;
|
||||
destp = dest;
|
||||
skipX = sprite->value1;
|
||||
skipX = sprite->skipX;
|
||||
w = sprite->width;
|
||||
h--;
|
||||
}
|
||||
@ -708,8 +689,6 @@ void Screen::updateTalkText(int16 slotIndex, int16 slotOffset) {
|
||||
item->fontNum = 0;
|
||||
item->color = _talkTextFontColor;
|
||||
|
||||
//debug(0, "## _talkTextMaxWidth = %d", _talkTextMaxWidth);
|
||||
|
||||
x = CLIP<int16>(_talkTextX - _vm->_cameraX, 120, _talkTextMaxWidth);
|
||||
y = CLIP<int16>(_talkTextY - _vm->_cameraY, 4, _vm->_cameraHeight - 16);
|
||||
|
||||
|
@ -63,7 +63,7 @@ struct SpriteDrawItem {
|
||||
uint32 offset;
|
||||
int16 xdelta, ydelta;
|
||||
uint16 flags;
|
||||
int16 value1, yerror;
|
||||
int16 skipX, yerror;
|
||||
int16 ybottom;
|
||||
int16 baseColor;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user