aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25
diff options
context:
space:
mode:
authorjohndoe1232013-04-20 00:34:32 +0200
committerjohndoe1232013-04-20 00:34:32 +0200
commit4fc57dac8fd6865494d21acfddeb69ab7fb1ad5c (patch)
treeb94c1c72f00b06a44a78751f9a13a8528df2fb84 /engines/sword25
parent176a3babc553d1d6eb2a57fddb0a9665fc4aaa71 (diff)
downloadscummvm-rg350-4fc57dac8fd6865494d21acfddeb69ab7fb1ad5c.tar.gz
scummvm-rg350-4fc57dac8fd6865494d21acfddeb69ab7fb1ad5c.tar.bz2
scummvm-rg350-4fc57dac8fd6865494d21acfddeb69ab7fb1ad5c.zip
SWORD25: Fix blitting code
- Rename collectRenderQueue to preRender - Only do forceRefresh() in Panel::setColor() and Text::setText() if the new values are different - Move child object resorting from RenderObject::render() into RenderObject::preRender()
Diffstat (limited to 'engines/sword25')
-rw-r--r--engines/sword25/gfx/image/renderedimage.cpp27
-rw-r--r--engines/sword25/gfx/panel.h6
-rw-r--r--engines/sword25/gfx/renderobject.cpp32
-rw-r--r--engines/sword25/gfx/renderobject.h5
-rw-r--r--engines/sword25/gfx/renderobjectmanager.cpp10
-rw-r--r--engines/sword25/gfx/text.cpp8
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) {