X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2FDDSpriteBuffer.c;h=7572c919d2e415d6d8e0aecd4c89ba21af02da79;hb=572a4bab20b6f36ef1a4782094b27ac5a703a476;hp=e7412265cfde796c41926c6280793321eef035cd;hpb=70e95507923cc6cfb20d9e9a74e8f5cc5f6e44de;p=rocksndiamonds.git diff --git a/src/game_sp/DDSpriteBuffer.c b/src/game_sp/DDSpriteBuffer.c index e7412265..7572c919 100644 --- a/src/game_sp/DDSpriteBuffer.c +++ b/src/game_sp/DDSpriteBuffer.c @@ -177,13 +177,109 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY) long Tmp; #endif + int sx1 = mScrollX - TILEX; + int sy1 = mScrollY - TILEY; + int sx2 = mScrollX + SXSIZE + TILEX; + int sy2 = mScrollY + SYSIZE + TILEY; + int x1 = sx1 / TILEX; + int y1 = sy1 / TILEY; + int x2 = sx2 / TILEX; + int y2 = sy2 / TILEY; + + int sx = pX - x1 * TILEX; + int sy = pY - y1 * TILEY; + +#if 0 + printf(":1: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n", + pX, pY, mScrollX, mScrollY); +#endif + + if (NoDisplayFlag) + return; + + /* do not draw fields that are outside the visible screen area */ + if (pX < sx1 || pX >= sx2 || pY < sy1 || pY >= sy2) + return; + +#if 0 + printf(":2: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld]\n", + pX, pY, mScrollX, mScrollY); +#endif + + { + DR.left = pX + mDestXOff; + DR.top = pY + mDestYOff; + DR.right = pX + mSpriteWidth + mDestXOff; + DR.bottom = pY + mSpriteHeight + mDestYOff; + } + { + SR.left = mSpriteWidth * (SpriteX - 1); + SR.top = mSpriteHeight * (SpriteY - 1); + SR.right = SR.left + mSpriteWidth; + SR.bottom = SR.top + mSpriteHeight; + } + +#if 0 + printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", DR.left, DR.top); +#endif + +#if 0 + if (pX == 0 * StretchWidth && pY == 0 * StretchWidth) + printf("::: TEST: drawing topleft corner ...\n"); + if (pX == 59 * StretchWidth && pY == 23 * StretchWidth) + printf("::: TEST: drawing bottomright corner ...\n"); +#endif + +#if 1 + +#if 1 + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + sx, sy); +#else + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + DR.left, DR.top); +#endif + +#else + Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT); +#endif +} + +static void OLD_Blt(int pX, int pY, int SpriteX, int SpriteY) +{ + RECT DR, SR; +#if 0 + long Tmp; +#endif + +#if 1 + int left = mScrollX; + int top = mScrollY; +#else + int left = mScrollX / TILEX; + int top = mScrollY / TILEY; +#endif + + int sx = pX % (MAX_BUF_XSIZE * TILEX); + int sy = pY % (MAX_BUF_YSIZE * TILEY); + #if 0 - printf("::: DDSpriteBuffer.c: Blt(): %d, %d\n", pX, pY); + printf("::: DDSpriteBuffer.c: Blt(): %d, %d [%ld, %ld] [%d, %d]\n", + pX, pY, mScrollX, mScrollY, left, top); #endif if (NoDisplayFlag) return; + /* do not draw fields that are outside the visible screen area */ + if (pX < left || pX >= left + MAX_BUF_XSIZE * TILEX || + pY < top || pY >= top + MAX_BUF_YSIZE * TILEY) + return; + { DR.left = pX + mDestXOff; DR.top = pY + mDestYOff; @@ -208,11 +304,20 @@ static void Blt(int pX, int pY, int SpriteX, int SpriteY) printf("::: TEST: drawing bottomright corner ...\n"); #endif +#if 1 + #if 1 + BlitBitmap(sp_objects, screenBitmap, + SR.left, SR.top, + mSpriteWidth, mSpriteHeight, + sx, sy); +#else BlitBitmap(sp_objects, screenBitmap, SR.left, SR.top, mSpriteWidth, mSpriteHeight, DR.left, DR.top); +#endif + #else Tmp = mDest.Blt(DR, &Buffer, SR, DDBLT_WAIT); #endif @@ -227,6 +332,7 @@ void DDSpriteBuffer_BltEx(int pX, int pY, int SpritePos) XPos = (SpritePos % mXSpriteCount) + 1; YPos = (SpritePos / mXSpriteCount) + 1; + Blt(pX, pY, XPos, YPos); }