diff options
-rw-r--r-- | engines/sword25/gfx/image/renderedimage.cpp | 27 | ||||
-rw-r--r-- | engines/sword25/gfx/panel.h | 6 | ||||
-rw-r--r-- | engines/sword25/gfx/renderobject.cpp | 32 | ||||
-rw-r--r-- | engines/sword25/gfx/renderobject.h | 5 | ||||
-rw-r--r-- | engines/sword25/gfx/renderobjectmanager.cpp | 10 | ||||
-rw-r--r-- | engines/sword25/gfx/text.cpp | 8 |
6 files changed, 46 insertions, 42 deletions
diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index 1de7a04471..c8a6666046 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -145,7 +145,10 @@ RenderedImage::RenderedImage(const Common::String &filename, bool &result) : _doCleanup = true; +#if defined(SCUMM_LITTLE_ENDIAN) + // Makes sense for LE only at the moment checkForTransparency(); +#endif return; } @@ -295,20 +298,20 @@ bool RenderedImage::blit(int posX, int posY, int flipping, Common::Rect *pPartRe int drawX = posX, drawY = posY; int drawWidth = img->w; int drawHeight = img->h; - + // Handle clipping - if (drawY < clipRect.top) { - skipTop = clipRect.top - drawY; - drawHeight = MAX(0, (int)drawHeight - (clipRect.top - drawY)); - drawY = clipRect.top; - } - if (drawX < clipRect.left) { skipLeft = clipRect.left - drawX; - drawWidth = MAX(0, (int)drawWidth - skipLeft); + drawWidth -= skipLeft; drawX = clipRect.left; } + if (drawY < clipRect.top) { + skipTop = clipRect.top - drawY; + drawHeight -= skipTop; + drawY = clipRect.top; + } + if (drawX + drawWidth >= clipRect.right) drawWidth = clipRect.right - drawX; @@ -358,16 +361,16 @@ bool RenderedImage::blit(int posX, int posY, int flipping, Common::Rect *pPartRe int a = (pix >> 24) & 0xff; in += inStep; + if (ca != 255) { + a = a * ca >> 8; + } + if (a == 0) { // Full transparency out += 4; continue; } - if (ca != 255) { - a = a * ca >> 8; - } - int b = (pix >> 0) & 0xff; int g = (pix >> 8) & 0xff; int r = (pix >> 16) & 0xff; diff --git a/engines/sword25/gfx/panel.h b/engines/sword25/gfx/panel.h index cb94048360..74a93247b6 100644 --- a/engines/sword25/gfx/panel.h +++ b/engines/sword25/gfx/panel.h @@ -51,8 +51,10 @@ public: return _color; } void setColor(uint color) { - _color = color; - forceRefresh(); + if (_color != color) { + _color = color; + forceRefresh(); + } } virtual bool persist(OutputPersistenceBlock &writer); diff --git a/engines/sword25/gfx/renderobject.cpp b/engines/sword25/gfx/renderobject.cpp index d1381513fd..807c1eb64b 100644 --- a/engines/sword25/gfx/renderobject.cpp +++ b/engines/sword25/gfx/renderobject.cpp @@ -110,13 +110,12 @@ RenderObject::~RenderObject() { RenderObjectRegistry::instance().deregisterObject(this); } -bool RenderObject::render(RectangleList *updateRects, const Common::Array<int> &updateRectsMinZ) { +void RenderObject::preRender(RenderObjectQueue *renderQueue) { // Objektänderungen validieren validateObject(); - // Falls das Objekt nicht sichtbar ist, muss gar nichts gezeichnet werden if (!_visible) - return true; + return; // Falls notwendig, wird die Renderreihenfolge der Kinderobjekte aktualisiert. if (_childChanged) { @@ -124,6 +123,20 @@ bool RenderObject::render(RectangleList *updateRects, const Common::Array<int> & _childChanged = false; } + renderQueue->add(this); + + RENDEROBJECT_ITER it = _children.begin(); + for (; it != _children.end(); ++it) + (*it)->preRender(renderQueue); + +} + +bool RenderObject::render(RectangleList *updateRects, const Common::Array<int> &updateRectsMinZ) { + + // Falls das Objekt nicht sichtbar ist, muss gar nichts gezeichnet werden + if (!_visible) + return true; + // Objekt zeichnen. bool needRender = false; int index = 0; @@ -145,19 +158,6 @@ bool RenderObject::render(RectangleList *updateRects, const Common::Array<int> & return true; } -void RenderObject::collectRenderQueue(RenderObjectQueue *renderQueue) { - - if (!_visible) - return; - - renderQueue->add(this); - - RENDEROBJECT_ITER it = _children.begin(); - for (; it != _children.end(); ++it) - (*it)->collectRenderQueue(renderQueue); - -} - void RenderObject::validateObject() { // Die Veränderungen in den Objektvariablen aufheben _oldBbox = _bbox; diff --git a/engines/sword25/gfx/renderobject.h b/engines/sword25/gfx/renderobject.h index 48cbf8ea65..7e0334ee88 100644 --- a/engines/sword25/gfx/renderobject.h +++ b/engines/sword25/gfx/renderobject.h @@ -213,6 +213,9 @@ public: // Interface // --------- + + void preRender(RenderObjectQueue *renderQueue); + /** @brief Rendert des Objekt und alle seine Unterobjekte. @return Gibt false zurück, falls beim Rendern ein Fehler aufgetreten ist. @@ -222,8 +225,6 @@ public: */ bool render(RectangleList *updateRects, const Common::Array<int> &updateRectsMinZ); - void collectRenderQueue(RenderObjectQueue *renderQueue); - /** @brief Bereitet das Objekt und alle seine Unterobjekte auf einen Rendervorgang vor. Hierbei werden alle Dirty-Rectangles berechnet und die Renderreihenfolge aktualisiert. diff --git a/engines/sword25/gfx/renderobjectmanager.cpp b/engines/sword25/gfx/renderobjectmanager.cpp index a8f8c3682c..994d9367ab 100644 --- a/engines/sword25/gfx/renderobjectmanager.cpp +++ b/engines/sword25/gfx/renderobjectmanager.cpp @@ -97,12 +97,11 @@ bool RenderObjectManager::render() { // Die Render-Methode der Wurzel aufrufen. Dadurch wird das rekursive Rendern der Baumelemente angestoßen. - uint32 renderDuration = g_system->getMillis(); - _currQueue->clear(); - _rootPtr->collectRenderQueue(_currQueue); + _rootPtr->preRender(_currQueue); _uta->clear(); + // Add rectangles of objects which don't exist in this frame any more for (RenderObjectQueue::iterator it = _prevQueue->begin(); it != _prevQueue->end(); ++it) if (!_currQueue->exists(*it)) @@ -111,7 +110,7 @@ bool RenderObjectManager::render() { for (RenderObjectQueue::iterator it = _currQueue->begin(); it != _currQueue->end(); ++it) if (!_prevQueue->exists(*it)) _uta->addRect((*it)._bbox); - + RectangleList *updateRects = _uta->getRectangles(); Common::Array<int> updateRectsMinZ; @@ -148,9 +147,6 @@ bool RenderObjectManager::render() { SWAP(_currQueue, _prevQueue); - renderDuration = g_system->getMillis() - renderDuration; - //debug("renderDuration: %3.5f", renderDuration / 1000.0f); - return true; } diff --git a/engines/sword25/gfx/text.cpp b/engines/sword25/gfx/text.cpp index a5cfb0b0b5..d4aaa90682 100644 --- a/engines/sword25/gfx/text.cpp +++ b/engines/sword25/gfx/text.cpp @@ -91,9 +91,11 @@ bool Text::setFont(const Common::String &font) { } void Text::setText(const Common::String &text) { - _text = text; - updateFormat(); - forceRefresh(); + if (_text != text) { + _text = text; + updateFormat(); + forceRefresh(); + } } void Text::setColor(uint modulationColor) { |