[Scummvm-cvs-logs] CVS: scummvm/bs2/driver driver96.h,1.29,1.30 sprite.cpp,1.14,1.15
Torbj?rn Andersson
eriktorbjorn at users.sourceforge.net
Sun Sep 7 23:39:02 CEST 2003
Update of /cvsroot/scummvm/scummvm/bs2/driver
In directory sc8-pr-cvs1:/tmp/cvs-serv9595/driver
Modified Files:
driver96.h sprite.cpp
Log Message:
Complete rewrite of the in-game dialogs (quit, restart, settings, save and
load). The new code is smaller, hopefully a bit easier to read and doesn't
use up all the CPU time.
Of course, it may some new and exciting bugs too. ;-)
Index: driver96.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/driver96.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- driver96.h 3 Sep 2003 03:57:23 -0000 1.29
+++ driver96.h 8 Sep 2003 06:38:16 -0000 1.30
@@ -604,14 +604,13 @@
//
// ---------------------------------------------------------------------------
//
-// int32 DrawSurface(_spriteInfo *s, uint32 surface)
+// void DrawSurface(_spriteInfo *s, uint32 surface, ScummVM::Rect *clipRect)
//
-// Draws the sprite surface created earlier. If the surface has been lost,
-// it is recreated.
+// Draws the sprite surface created earlier.
//
// ---------------------------------------------------------------------------
//
-// int32 DeleteSurface(uint32 surface)
+// void DeleteSurface(uint32 surface)
//
// Deletes a surface from video memory.
//
@@ -1448,8 +1447,8 @@
//-----------------------------------------------------------------------------
extern int32 DrawSprite(_spriteInfo *s);
extern int32 CreateSurface(_spriteInfo *s, uint8 **surface);
-extern int32 DrawSurface(_spriteInfo *s, uint8 *surface);
-extern int32 DeleteSurface(uint8 *surface);
+extern void DrawSurface(_spriteInfo *s, uint8 *surface, ScummVM::Rect *clipRect = NULL);
+extern void DeleteSurface(uint8 *surface);
extern int32 OpenLightMask(_spriteInfo *s);
extern int32 CloseLightMask(void);
//-----------------------------------------------------------------------------
Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/sprite.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- sprite.cpp 30 Aug 2003 10:23:40 -0000 1.14
+++ sprite.cpp 8 Sep 2003 06:38:16 -0000 1.15
@@ -235,7 +235,7 @@
//
// ---------------------------------------------------------------------------
//
-// int32 DrawSurface(_spriteInfo *s, uint32 surface)
+// int32 DrawSurface(_spriteInfo *s, uint32 surface, ScummVM::Rect *clipRect)
//
// Draws the sprite surface created earlier. If the surface has been lost,
// it is recreated.
@@ -1197,9 +1197,8 @@
return 0;
}
-
-// The purpose of this function seems to be to decode a sprite to its
-// simplest form in advance.
+// The surface functions are only used by the in-game dialogs. Everything
+// that isn't needed for them (blending, scaling, etc.) has been removed.
int32 CreateSurface(_spriteInfo *s, uint8 **sprite) {
uint8 *newSprite;
@@ -1211,7 +1210,7 @@
if (s->type & RDSPR_NOCOMPRESSION) {
memcpy(*sprite, s->data, s->w * s->h);
} else {
- if (s->type >> 8 == RDSPR_RLE16 >> 8) {
+ if ((s->type >> 8) == (RDSPR_RLE16 >> 8)) {
if (DecompressRLE16(*sprite, s->data, s->w * s->h, s->colourTable)) {
free(*sprite);
return RDERR_DECOMPRESSION;
@@ -1234,112 +1233,70 @@
*sprite = newSprite;
}
}
+
return RD_OK;
}
-
-int32 DrawSurface(_spriteInfo *s, uint8 *surface) {
+void DrawSurface(_spriteInfo *s, uint8 *surface, ScummVM::Rect *clipRect) {
ScummVM::Rect rd, rs;
- uint16 x, y, srcPitch, scale;
- uint8 *sprite, *src, *dst;
- bool freeSprite = false;
-
- // FIXME: It should be possible to implement this in terms of the
- // DrawSprite() function.
-
- if (s->type & RDSPR_DISPLAYALIGN) {
- rd.top = s->y;
- rd.left = s->x;
- } else {
- rd.top = s->y - scrolly;
- rd.left = s->x - scrollx;
- }
+ uint16 x, y, srcPitch;
+ uint8 *src, *dst;
rs.left = 0;
rs.right = s->w;
rs.top = 0;
rs.bottom = s->h;
- scale = (s->scale == 0) ? 256 : s->scale;
-
- if (scale != 256) {
- rs.right = s->scaledWidth;
- rs.bottom = s->scaledHeight;
- srcPitch = s->scaledWidth;
- } else {
- rs.right = s->w;
- rs.bottom = s->h;
- srcPitch = s->w;
- }
+ srcPitch = s->w;
+ rd.top = rs.top + s->y - scrolly;
+ rd.left = rs.left + s->x - scrollx;
rd.right = rd.left + rs.right;
rd.bottom = rd.top + rs.bottom;
- // Do clipping
- if (rd.top < 40) {
- rs.top = (40 - rd.top) * 256 / s->scale;
- rd.top = 40;
- }
- if (rd.bottom > 440) {
- rs.bottom -= ((rd.bottom - 440) * 256 / s->scale);
- rd.bottom = 440;
- }
- if (rd.left < 0) {
- rs.left = (0 - rd.left) * 256 / s->scale;
- rd.left = 0;
- }
- if (rd.right > 640) {
- rs.right -= ((rd.right - 640) * 256 / s->scale);
- rd.right = 640;
- }
+ if (clipRect) {
+ if (clipRect->left > rd.left) {
+ rs.left += (clipRect->left - rd.left);
+ rd.left = clipRect->left;
+ }
- if (scale != 256) {
- sprite = (uint8 *) malloc(s->scaledWidth * s->scaledHeight);
- if (!sprite)
- return RDERR_OUTOFMEMORY;
-
- if (scale < 256) {
- SquashImage(sprite, s->scaledWidth, s->scaledWidth, s->scaledHeight, surface, s->w, s->w, s->h, NULL);
- } else {
- StretchImage(sprite, s->scaledWidth, s->scaledWidth, s->scaledHeight, surface, s->w, s->w, s->h, NULL);
+ if (clipRect->top > rd.top) {
+ rs.top += (clipRect->top - rd.top);
+ rd.top = clipRect->top;
}
- freeSprite = true;
- } else
- sprite = surface;
+ if (clipRect->right < rd.right) {
+ rd.right = clipRect->right;
+ }
- src = sprite + rs.top * srcPitch + rs.left;
+ if (clipRect->bottom < rd.bottom) {
+ rd.bottom = clipRect->bottom;
+ }
+
+ if (rd.width() <= 0 || rd.height() <= 0)
+ return;
+ }
+
+ src = surface + rs.top * srcPitch + rs.left;
dst = lpBackBuffer + screenWide * rd.top + rd.left;
- if (s->type & RDSPR_TRANS) {
- for (y = 0; y < rd.bottom - rd.top; y++) {
- for (x = 0; x < rd.right - rd.left; x++) {
- if (src[x])
- dst[x] = src[x];
- }
- src += srcPitch;
- dst += screenWide;
+ // Surfaces are always transparent.
+
+ for (y = 0; y < rd.height(); y++) {
+ for (x = 0; x < rd.width(); x++) {
+ if (src[x])
+ dst[x] = src[x];
}
- } else {
- for (y = 0; y < rd.bottom - rd.top; y++)
- memcpy(dst, src, screenWide);
src += srcPitch;
dst += screenWide;
}
- if (freeSprite)
- free(sprite);
-
- // UploadRect(&rd);
+ UploadRect(&rd);
SetNeedRedraw();
-
- return 0;
}
-
-int32 DeleteSurface(uint8 *surface) {
+void DeleteSurface(uint8 *surface) {
free(surface);
- return 0;
}
#define SCALE_MAXWIDTH 512
@@ -1371,7 +1328,7 @@
freeSprite = true;
if (!sprite)
return RDERR_OUTOFMEMORY;
- if (s->type >> 8 == RDSPR_RLE16 >> 8) {
+ if ((s->type >> 8) == (RDSPR_RLE16 >> 8)) {
if (DecompressRLE16(sprite, s->data, s->w * s->h, s->colourTable)) {
free(sprite);
return RDERR_DECOMPRESSION;
@@ -1528,8 +1485,8 @@
src = sprite + rs.top * srcPitch + rs.left;
lightMap = lightMask + (rd.top + scrolly - 40) * locationWide + rd.left + scrollx;
- for (i = 0; i < rs.bottom - rs.top; i++) {
- for (j = 0; j < rs.right - rs.left; j++) {
+ for (i = 0; i < rs.height(); i++) {
+ for (j = 0; j < rs.width(); j++) {
if (src[j] && lightMap[j]) {
uint8 r = ((32 - lightMap[j]) * palCopy[src[j]][0]) >> 5;
uint8 g = ((32 - lightMap[j]) * palCopy[src[j]][1]) >> 5;
@@ -1551,8 +1508,8 @@
if (s->type & RDSPR_BLEND) {
if (renderCaps & RDBLTFX_ALLHARDWARE) {
- for (i = 0; i < rs.bottom - rs.top; i++) {
- for (j = 0; j < rs.right - rs.left; j++) {
+ for (i = 0; i < rs.height(); i++) {
+ for (j = 0; j < rs.width(); j++) {
if (src[j] && ((i & 1) == (j & 1)))
dst[j] = src[j];
}
@@ -1562,8 +1519,8 @@
} else {
if (s->blend & 0x01) {
red = s->blend >> 8;
- for (i = 0; i < rs.bottom - rs.top; i++) {
- for (j = 0; j < rs.right - rs.left; j++) {
+ for (i = 0; i < rs.height(); i++) {
+ for (j = 0; j < rs.width(); j++) {
if (src[j]) {
uint8 r = (palCopy[src[j]][0] * red + palCopy[dst[j]][0] * (8 - red)) >> 3;
uint8 g = (palCopy[src[j]][1] * red + palCopy[dst[j]][1] * (8 - red)) >> 3;
@@ -1591,8 +1548,8 @@
red = palCopy[s->blend >> 8][0];
green = palCopy[s->blend >> 8][0];
blue = palCopy[s->blend >> 8][0];
- for (i = 0; i < rs.bottom - rs.top; i++) {
- for (j = 0; j < rs.right - rs.left; j++) {
+ for (i = 0; i < rs.height(); i++) {
+ for (j = 0; j < rs.width(); j++) {
if (src[j]) {
uint8 r = (src[j] * red + (16 - src[j]) * palCopy[dst[j]][0]) >> 4;
uint8 g = (src[j] * green + (16 - src[j]) * palCopy[dst[j]][1]) >> 4;
@@ -1612,8 +1569,8 @@
}
} else {
if (s->type & RDSPR_TRANS) {
- for (i = 0; i < rs.bottom - rs.top; i++) {
- for (j = 0; j < rs.right - rs.left; j++) {
+ for (i = 0; i < rs.height(); i++) {
+ for (j = 0; j < rs.width(); j++) {
if (src[j])
dst[j] = src[j];
}
@@ -1621,8 +1578,8 @@
dst += screenWide;
}
} else {
- for (i = 0; i < rs.bottom - rs.top; i++) {
- memcpy(dst, src, rs.right - rs.left);
+ for (i = 0; i < rs.height(); i++) {
+ memcpy(dst, src, rs.width());
src += srcPitch;
dst += screenWide;
}
More information about the Scummvm-git-logs
mailing list