[Scummvm-cvs-logs] CVS: scummvm/bs2/driver driver96.h,1.19,1.20 render.cpp,1.8,1.9 sprite.cpp,1.3,1.4

Jonathan Gray khalek at users.sourceforge.net
Tue Aug 19 01:48:02 CEST 2003


Update of /cvsroot/scummvm/scummvm/bs2/driver
In directory sc8-pr-cvs1:/tmp/cvs-serv19579

Modified Files:
	driver96.h render.cpp sprite.cpp 
Log Message:
patch #791032 from erik SWORD2: Sprite drawing (incomplete)

Index: driver96.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/driver96.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- driver96.h	18 Aug 2003 07:46:46 -0000	1.19
+++ driver96.h	19 Aug 2003 08:47:09 -0000	1.20
@@ -1278,6 +1278,7 @@
 	void clear();
 	void blit(Surface *s, ScummVM::Rect *r);
 	void blit(Surface *s, ScummVM::Rect *r, ScummVM::Rect *clip_rect);
+	void upload(ScummVM::Rect *r);
 	void setColorKey(int colorKey) {
 		_colorKey = colorKey;
 	};

Index: render.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/render.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- render.cpp	18 Aug 2003 07:46:46 -0000	1.8
+++ render.cpp	19 Aug 2003 08:47:09 -0000	1.9
@@ -343,10 +343,12 @@
 		}
 	}
 
-	g_sword2->_system->copy_rect(_pixels + r->top * _width + r->left, _width, r->left, r->top, r->right - r->left, r->bottom - r->top);
+	upload(r);
 }
 
-
+void Surface::upload(ScummVM::Rect *r) {
+	g_sword2->_system->copy_rect(_pixels + r->top * _width + r->left, _width, r->left, r->top, r->right - r->left, r->bottom - r->top);
+}
 
 int32 RestoreBackgroundLayer(_parallax *p, int16 l)
 {

Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/driver/sprite.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- sprite.cpp	28 Jul 2003 08:08:42 -0000	1.3
+++ sprite.cpp	19 Aug 2003 08:47:09 -0000	1.4
@@ -1495,7 +1495,226 @@
 int32 DrawSprite(_spriteInfo *s)
 
 {
-	warning("stub DrawSprite");
+	//warning("stub DrawSprite");
+	debug(2, "semi-stub DrawSprite");
+
+	uint8 *src, *dst;
+	uint8 *sprite, *newSprite;
+	uint8 pixel, red, green, blue;
+	int16 i, j;
+	int16 freeSprite = 0;
+	ScummVM::Rect rd, rs;
+
+	if (!(s->type & RDSPR_DISPLAYALIGN)) {
+		s->x += parallaxScrollx;
+		s->y += parallaxScrolly;
+	}
+
+	// The topmost 40 pixels are reserved by the GUI.
+
+	s->y += 40;
+
+	if (s->type & RDSPR_NOCOMPRESSION)
+		sprite = s->data;
+	else {
+		sprite = (uint8 *) malloc(s->w * s->h);
+		if (!sprite)
+			return RDERR_OUTOFMEMORY;
+		freeSprite = 1;
+		if (s->type >> 8 == RDSPR_RLE16 >> 8) {
+			if (DecompressRLE16(sprite, s->data, s->w * s->h, s->colourTable))
+				return RDERR_DECOMPRESSION;
+		} else {
+			if (DecompressRLE256(sprite, s->data, s->w * s->h))
+				return RDERR_DECOMPRESSION;
+		}
+
+		if (s->type & RDSPR_FLIP) {
+			newSprite = (uint8 *) malloc(s->w * s->h);
+			if (newSprite == NULL) {
+				free(sprite);
+				return RDERR_OUTOFMEMORY;
+			}
+			MirrorSprite(newSprite, sprite, s->w, s->h);
+			free(sprite);
+			sprite = newSprite;
+		}
+	}
+
+
+	if (s->type & RDSPR_BLEND) {
+		// We want to blend the sprite FROM the RECT rs.
+		// We want to blend the sprite TO   the RECT rd.
+		rd.left = s->x - scrollx;
+		rd.right = rd.left + s->w;
+		rd.top = s->y - scrolly;
+		rd.bottom = rd.top + s->h;
+
+		rs.top = 0;
+		rs.bottom = s->h;
+		rs.left = 0;
+		rs.right = s->w;
+
+		//Now do the clipping - top
+		if (rd.top < 40) {
+			rs.top = (40 - rd.top);
+			rd.top = 40;
+		}
+		//Clip the bottom
+		if (rd.bottom > RENDERDEEP) {
+			rs.bottom -= (rd.bottom - RENDERDEEP);
+			rd.bottom = RENDERDEEP;
+		}
+		//Clip the left
+		if (rd.left < 0) {
+			rs.left -= rd.left;
+			rd.left = 0;
+		}
+		//Clip the right
+		if (rd.right > RENDERWIDE) {
+			rs.right -= (rd.right - RENDERWIDE);
+			rd.right = RENDERWIDE;
+		}
+
+		if (s->blend & 0x01) {
+			red = s->blend >> 8;
+			for (i = 0; i < rs.bottom - rs.top; i++) {
+				src = sprite + (rs.top + i) * s->w + rs.left;
+				dst = (uint8 *) lpBackBuffer->_pixels + lpBackBuffer->_width * (rd.top + i) + rd.left;
+				for (j = 0; j < rs.right - rs.left; j++) {
+					if (*src) {
+						pixel = *dst;
+						*dst = paletteMatch[(((palCopy[*src][0] * red + palCopy[pixel][0] * (8 - red)) >> 5) << 12) +
+							(((palCopy[*src][1] * red + palCopy[pixel][1] * (8 - red)) >> 5) << 6) +
+							(((palCopy[*src][2] * red + palCopy[pixel][2] * (8 - red)) >> 5))];
+					}
+					src++;
+					dst++;
+				}
+			}
+		} else if (s->blend & 0x02) {
+			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++) {
+				src = sprite + (rs.top + i) * s->w + rs.left;
+				dst = (uint8 *) lpBackBuffer->_pixels + lpBackBuffer->_width * (rd.top + i) + rd.left;
+				for (j = 0; j < rs.right - rs.left; j++) {
+					if (*src) {
+						pixel = *dst;
+						*dst = paletteMatch[((((*src * red + (16 - *src) * palCopy[pixel][0]) >> 4) >> 2) << 12) +
+							((((*src * green + (16 - *src) * palCopy[pixel][1]) >> 4) >> 2) << 6) +
+							(((*src * blue + (16 - *src) * palCopy[pixel][2]) >> 4) >> 2)];
+					}
+					src++;
+					dst++;
+				}
+			}
+		} else {
+			if (freeSprite)
+				free(sprite);
+			warning("DrawSprite: Invalid blended sprite");
+			return RDERR_UNKNOWNTYPE;
+		}
+
+		// Upload the sprite area to the backend.
+		lpBackBuffer->upload(&rd);
+	} else {
+		// Set startx and starty for the screen buffer
+
+		if (s->type & RDSPR_DISPLAYALIGN)
+			rd.top = s->y;
+		else
+			rd.top = s->y - scrolly;
+				
+		if (s->type & RDSPR_DISPLAYALIGN)
+			rd.left = s->x;
+		else
+			rd.left = s->x - scrollx;
+
+		rs.left = 0;
+		rs.right = s->w;
+		rs.top = 0;
+		rs.bottom = s->h;
+
+		if (s->scale & 0xFF) {
+			// FIXME: For now, turn scaling off.
+			warning("FIXME: DrawSprite: Implement scaling");
+			s->scale &= ~0xFF;
+		}
+
+		if (s->scale & 0xff) {
+			rd.right = rd.left + s->scaledWidth;
+			rd.bottom = rd.top + s->scaledHeight;
+			// 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;
+			}
+		} else {
+			rd.right = rd.left + s->w;
+			rd.bottom = rd.top + s->h;
+
+			// Do clipping
+			if (rd.top < 40) {
+				rs.top = 40 - rd.top;
+				rd.top = 40;
+			}
+			if (rd.bottom > 440) {
+				rs.bottom -= (rd.bottom - 440);
+				rd.bottom = 440;
+			}
+			if (rd.left < 0) {
+				rs.left = 0 - rd.left;
+				rd.left = 0;
+			}
+			if (rd.right > 640) {
+				rs.right -= (rd.right - 640);
+				rd.right = 640;
+			}
+		}
+
+		src = sprite + rs.top * s->w + rs.left;
+		dst = (uint8 *) lpBackBuffer->_pixels + lpBackBuffer->_width * rd.top + rd.left;
+		if (s->type & RDSPR_TRANS) {
+			for (i = 0; i < rs.bottom - rs.top; i++) {
+				for (j = 0; j < rs.right - rs.left; j++) {
+					if (src[j])
+						dst[j] = src[j];
+				}
+				src += s->w;
+				dst += lpBackBuffer->_width;
+			}
+		} else {
+			for (i = 0; i < rs.bottom - rs.top; i++) {
+				memcpy(dst, src, rs.right - rs.left);
+				src += s->w;
+				dst += lpBackBuffer->_width;
+			}
+		}
+
+		lpBackBuffer->upload(&rd);
+
+		if (freeSprite)
+			free(sprite);
+	}
+
+	// I'm guessing that the rest of the original code is simply to draw
+	// the sprite in "software mode" at different quality setting. If so,
+	// we should probably adapt some of it. Later.
+
 /*
 
 #if PROFILING == 1





More information about the Scummvm-git-logs mailing list