aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2003-08-18 07:46:46 +0000
committerTorbjörn Andersson2003-08-18 07:46:46 +0000
commitc6118886062a46d04d4c7576e8daef7bc99b45a6 (patch)
tree8e59f48773204e9bc68e6882f815296e5a375841
parent311eb2678fbcfbd57606331bd88ff2cb24edde64 (diff)
downloadscummvm-rg350-c6118886062a46d04d4c7576e8daef7bc99b45a6.tar.gz
scummvm-rg350-c6118886062a46d04d4c7576e8daef7bc99b45a6.tar.bz2
scummvm-rg350-c6118886062a46d04d4c7576e8daef7bc99b45a6.zip
Added support for opaque surfaces (it's the default now, actually) since it
looks like the sprite renderer may need them. svn-id: r9753
-rw-r--r--sword2/driver/driver96.h5
-rw-r--r--sword2/driver/render.cpp21
2 files changed, 20 insertions, 6 deletions
diff --git a/sword2/driver/driver96.h b/sword2/driver/driver96.h
index 476ed1245e..45ef77f239 100644
--- a/sword2/driver/driver96.h
+++ b/sword2/driver/driver96.h
@@ -1262,11 +1262,13 @@ public:
uint16 _width, _height;
uint16 _pitch;
byte *_pixels;
+ int _colorKey;
Surface(uint width, uint height) {
_width = width;
_height = height;
_pixels = (byte *) calloc(_width, _height);
+ _colorKey = -1;
};
~Surface() {
@@ -1276,6 +1278,9 @@ public:
void clear();
void blit(Surface *s, ScummVM::Rect *r);
void blit(Surface *s, ScummVM::Rect *r, ScummVM::Rect *clip_rect);
+ void setColorKey(int colorKey) {
+ _colorKey = colorKey;
+ };
};
//
diff --git a/sword2/driver/render.cpp b/sword2/driver/render.cpp
index 9e56a3bee0..63d3c84562 100644
--- a/sword2/driver/render.cpp
+++ b/sword2/driver/render.cpp
@@ -326,13 +326,21 @@ void Surface::blit(Surface *s, ScummVM::Rect *r, ScummVM::Rect *clip_rect) {
// several times, as each new parallax layer is rendered, this may be
// a bit inefficient.
- for (i = 0; i < r->bottom - r->top; i++) {
- for (j = 0; j < r->right - r->left; j++) {
- if (src[j])
- dst[j] = src[j];
+ if (s->_colorKey >= 0) {
+ for (i = 0; i < r->bottom - r->top; i++) {
+ for (j = 0; j < r->right - r->left; j++) {
+ if (src[j] != s->_colorKey)
+ dst[j] = src[j];
+ }
+ src += s->_width;
+ dst += _width;
+ }
+ } else {
+ for (i = 0; i < r->bottom - r->top; i++) {
+ memcpy(dst, src, r->right - r->left);
+ src += s->_width;
+ dst += _width;
}
- src += s->_width;
- dst += _width;
}
g_sword2->_system->copy_rect(_pixels + r->top * _width + r->left, _width, r->left, r->top, r->right - r->left, r->bottom - r->top);
@@ -1292,6 +1300,7 @@ bailout:
if (block_has_data) {
blockSurfaces[layer][i] = new Surface(BLOCKWIDTH, BLOCKHEIGHT);
+ blockSurfaces[layer][i]->setColorKey(0);
// Copy the data into the surfaces.
dst = blockSurfaces[layer][i]->_pixels;