diff options
Diffstat (limited to 'engines/pink/director.cpp')
-rw-r--r-- | engines/pink/director.cpp | 44 |
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 |