diff options
author | Matthew Hoops | 2012-06-24 09:37:53 -0400 |
---|---|---|
committer | Matthew Hoops | 2012-06-24 09:37:53 -0400 |
commit | 91efe792d5b231752dd16888729a94f323363fa0 (patch) | |
tree | e7346f83d4966ff4f3cf7e593a7f0cfa16c45b20 /common | |
parent | 915a8399c910fb5c8e35de58857ce1577c1a0151 (diff) | |
parent | 20b677080881580706652b17dd5a4c3ed3e36c07 (diff) | |
download | scummvm-rg350-91efe792d5b231752dd16888729a94f323363fa0.tar.gz scummvm-rg350-91efe792d5b231752dd16888729a94f323363fa0.tar.bz2 scummvm-rg350-91efe792d5b231752dd16888729a94f323363fa0.zip |
Merge remote branch 'upstream/master' into pegasus
Diffstat (limited to 'common')
-rw-r--r-- | common/coroutines.cpp | 58 | ||||
-rw-r--r-- | common/coroutines.h | 1 | ||||
-rw-r--r-- | common/system.h | 17 |
3 files changed, 24 insertions, 52 deletions
diff --git a/common/coroutines.cpp b/common/coroutines.cpp index 241d31e0d7..042b15b5d7 100644 --- a/common/coroutines.cpp +++ b/common/coroutines.cpp @@ -245,6 +245,15 @@ void CoroutineScheduler::schedule() { pProc = pNext; } + + // Disable any events that were pulsed + Common::List<EVENT *>::iterator i; + for (i = _events.begin(); i != _events.end(); ++i) { + EVENT *evt = *i; + if (evt->pulsing) { + evt->pulsing = evt->signalled = false; + } + } } void CoroutineScheduler::rescheduleAll() { @@ -678,6 +687,7 @@ uint32 CoroutineScheduler::createEvent(bool bManualReset, bool bInitialState) { evt->pid = ++pidCounter; evt->manualReset = bManualReset; evt->signalled = bInitialState; + evt->pulsing = false; _events.push_back(evt); return evt->pid; @@ -707,49 +717,15 @@ void CoroutineScheduler::pulseEvent(uint32 pidEvent) { EVENT *evt = getEvent(pidEvent); if (!evt) return; - - // Set the event as true + + // Set the event as signalled and pulsing evt->signalled = true; + evt->pulsing = true; - // start dispatching active process list for any processes that are currently waiting - PROCESS *pOriginal = pCurrent; - PROCESS *pNext; - PROCESS *pProc = active->pNext; - while (pProc != NULL) { - pNext = pProc->pNext; - - // Only call processes that are currently waiting (either in waitForSingleObject or - // waitForMultipleObjects) for the given event Pid - for (int i = 0; i < CORO_MAX_PID_WAITING; ++i) { - if (pProc->pidWaiting[i] == pidEvent) { - // Dispatch the process - pCurrent = pProc; - pProc->coroAddr(pProc->state, pProc->param); - - if (!pProc->state || pProc->state->_sleep <= 0) { - // Coroutine finished - pCurrent = pCurrent->pPrevious; - killProcess(pProc); - } else { - pProc->sleepTime = pProc->state->_sleep; - } - - // pCurrent may have been changed - pNext = pCurrent->pNext; - pCurrent = NULL; - - break; - } - } - - pProc = pNext; - } - - // Restore the original current process (if one was active) - pCurrent = pOriginal; - - // Reset the event back to non-signalled - evt->signalled = false; + // If there's an active process, and it's not the first in the queue, then reschedule all + // the other prcoesses in the queue to run again this frame + if (pCurrent && pCurrent != active->pNext) + rescheduleAll(); } } // end of namespace Common diff --git a/common/coroutines.h b/common/coroutines.h index 64eabbf8f4..834c67f6e4 100644 --- a/common/coroutines.h +++ b/common/coroutines.h @@ -316,6 +316,7 @@ struct EVENT { uint32 pid; bool manualReset; bool signalled; + bool pulsing; }; diff --git a/common/system.h b/common/system.h index 94bf7f01eb..99b947d7f3 100644 --- a/common/system.h +++ b/common/system.h @@ -78,6 +78,7 @@ struct TimeDate { int tm_mday; ///< day of month (1 - 31) int tm_mon; ///< month of year (0 - 11) int tm_year; ///< year - 1900 + int tm_wday; ///< days since Sunday (0 - 6) }; namespace LogMessageType { @@ -657,7 +658,7 @@ public: * @see updateScreen * @see getScreenFormat */ - virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) = 0; + virtual void copyRectToScreen(const void *buf, int pitch, int x, int y, int w, int h) = 0; /** * Lock the active screen framebuffer and return a Graphics::Surface @@ -790,20 +791,14 @@ public: * Copy the content of the overlay into a buffer provided by the caller. * This is only used to implement fake alpha blending. */ - virtual void grabOverlay(OverlayColor *buf, int pitch) = 0; + virtual void grabOverlay(void *buf, int pitch) = 0; /** * Blit a graphics buffer to the overlay. * In a sense, this is the reverse of grabOverlay. * - * @note The pitch parameter actually contains the 'pixel pitch', i.e., - * the number of pixels per scanline, and not as usual the number of bytes - * per scanline. - * - * @todo Change 'pitch' to be byte and not pixel based - * * @param buf the buffer containing the graphics data source - * @param pitch the pixel pitch of the buffer (number of pixels in a scanline) + * @param pitch the pitch of the buffer (number of bytes in a scanline) * @param x the x coordinate of the destination rectangle * @param y the y coordinate of the destination rectangle * @param w the width of the destination rectangle @@ -812,7 +807,7 @@ public: * @see copyRectToScreen * @see grabOverlay */ - virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) = 0; + virtual void copyRectToOverlay(const void *buf, int pitch, int x, int y, int w, int h) = 0; /** * Return the height of the overlay. @@ -874,7 +869,7 @@ public: * would be too small to notice otherwise, these are allowed to scale the cursor anyway. * @param format pointer to the pixel format which cursor graphic uses (0 means CLUT8) */ - virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale = false, const Graphics::PixelFormat *format = NULL) = 0; + virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, bool dontScale = false, const Graphics::PixelFormat *format = NULL) = 0; /** * Replace the specified range of cursor the palette with new colors. |