private void DrawSprite(byte[] spriteInfo, Compact sprCompact)
{
if (spriteInfo == null)
{
// TODO: warning("Screen::drawSprite Can't draw sprite. Data %d was not loaded", sprCompact.frame >> 6);
sprCompact.Core.status = 0;
return;
}
var sprDataFile = ServiceLocator.Platform.ToStructure<DataFileHeader>(spriteInfo, 0);
_sprWidth = sprDataFile.s_width;
_sprHeight = sprDataFile.s_height;
_maskX1 = _maskX2 = 0;
var spriteData = (sprCompact.Core.frame & 0x3F) * sprDataFile.s_sp_size;
spriteData += ServiceLocator.Platform.SizeOf<DataFileHeader>();
var spriteY = sprCompact.Core.ycood + sprDataFile.s_offset_y - TopLeftY;
if (spriteY < 0)
{
spriteY = -spriteY;
if (_sprHeight <= (uint)spriteY)
{
_sprWidth = 0;
return;
}
_sprHeight -= (ushort)spriteY;
spriteData += sprDataFile.s_width * spriteY;
spriteY = 0;
}
else
{
var botClip = GameScreenHeight - sprDataFile.s_height - spriteY;
if (botClip < 0)
{
botClip = -botClip;
if (_sprHeight <= (uint)botClip)
{
_sprWidth = 0;
return;
}
_sprHeight -= (ushort)botClip;
}
}
_sprY = (uint)spriteY;
var spriteX = sprCompact.Core.xcood + sprDataFile.s_offset_x - TopLeftX;
if (spriteX < 0)
{
spriteX = -spriteX;
if (_sprWidth <= (uint)spriteX)
{
_sprWidth = 0;
return;
}
_sprWidth -= (ushort)spriteX;
_maskX1 = spriteX;
spriteX = 0;
}
else
{
var rightClip = GameScreenWidth - (sprDataFile.s_width + spriteX);
if (rightClip < 0)
{
rightClip = -rightClip + 1;
if (_sprWidth <= (uint)rightClip)
{
_sprWidth = 0;
return;
}
_sprWidth -= (ushort)rightClip;
_maskX2 = rightClip;
}
}
_sprX = (uint)spriteX;
var screenPtr = _sprY * GameScreenWidth + _sprX;
if ((_sprHeight > 192) || (_sprY > 192))
{
_sprWidth = 0;
return;
}
if ((_sprX + _sprWidth > 320) || (_sprY + _sprHeight > 192))
{
// TODO: warning("Screen::drawSprite fatal error: got x = %d, y = %d, w = %d, h = %d", _sprX, _sprY, _sprWidth, _sprHeight);
_sprWidth = 0;
return;
}
for (ushort cnty = 0; cnty < _sprHeight; cnty++)
{
for (ushort cntx = 0; cntx < _sprWidth; cntx++)
if (spriteInfo[spriteData + cntx + _maskX1] != 0)
Current[screenPtr + cntx] = spriteInfo[spriteData + cntx + _maskX1];
spriteData += _sprWidth + _maskX2 + _maskX1;
screenPtr += GameScreenWidth;
}
// Convert the sprite coordinate/size values to blocks for vertical mask and/or vector to game
_sprWidth += (ushort)(_sprX + GridW - 1);
_sprHeight += (ushort)(_sprY + GridH - 1);
_sprX >>= GridWShift;
_sprWidth >>= GridWShift;
_sprY >>= GridHShift;
_sprHeight >>= GridHShift;
_sprWidth -= (ushort)_sprX;
_sprHeight -= (ushort)_sprY;
}