aboutsummaryrefslogtreecommitdiff
path: root/engines/pink/director.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/pink/director.cpp')
-rw-r--r--engines/pink/director.cpp44
1 files changed, 34 insertions, 10 deletions
diff --git a/engines/pink/director.cpp b/engines/pink/director.cpp
index 18ec0b2a00..a7ed2f83d9 100644
--- a/engines/pink/director.cpp
+++ b/engines/pink/director.cpp
@@ -23,7 +23,7 @@
#include "director.h"
#include <engines/pink/objects/actions/action_sound.h>
#include <engines/pink/objects/actions/action_cel.h>
-#include "graphics/surface.h"
+#include <graphics/managed_surface.h>
#include "graphics/palette.h"
#include "cel_decoder.h"
@@ -32,21 +32,41 @@ Director::Director(OSystem *system)
: _system(system) {}
void Director::draw() {
- bool needUpdate = 0;
for (int i = 0; i < _sprites.size(); ++i) {
CelDecoder *decoder = _sprites[i]->getDecoder();
- if (decoder->needsUpdate()) {
- const Graphics::Surface *surface = decoder->decodeNextFrame();
- _system->copyRectToScreen(surface->getPixels(), surface->pitch,
- decoder->getX(), decoder->getY(),
- surface->w, surface->h);
- needUpdate = 1;
+ drawSprite(decoder);
+ }
+ _system->updateScreen();
+}
+
+void Director::drawSprite(CelDecoder *decoder) {
+ const Graphics::Surface *surface;
+ if (decoder->needsUpdate())
+ surface = decoder->decodeNextFrame();
+ else surface = decoder->getCurrentFrame();
+
+
+
+ uint16 colourIndex = decoder->getTransparentColourIndex();
+ if (colourIndex != 0) {
+ Graphics::Surface *screen = _system->lockScreen();
+ for (int y = 0; y < decoder->getHeight(); ++y) {
+ for (int x = 0; x < decoder->getWidth(); ++x) {
+ byte spritePixelColourIndex = *(byte*)surface->getBasePtr(x, y);
+ if (spritePixelColourIndex != colourIndex || spritePixelColourIndex == 1) {
+ *(byte *) screen->getBasePtr(decoder->getX() + x, decoder->getY() + y) = spritePixelColourIndex;
+ }
+ }
}
+ _system->unlockScreen();
}
- if (needUpdate)
- _system->updateScreen();
+ else _system->copyRectToScreen(surface->getPixels(), surface->pitch,
+ decoder->getX(), decoder->getY(),
+ surface->w, surface->h);
+
}
+
void Director::addSprite(ActionCEL *sprite) {
_sprites.push_back(sprite);
int i;
@@ -91,4 +111,8 @@ void Director::removeSound(ActionSound *sound) {
}
}
+void Director::clear() {
+ _sprites.clear();
+}
+
} \ No newline at end of file