diff options
Diffstat (limited to 'indra/llimage')
-rw-r--r-- | indra/llimage/llimageworker.cpp | 330 | ||||
-rw-r--r-- | indra/llimage/llimageworker.h | 114 |
2 files changed, 222 insertions, 222 deletions
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index b44bf19227..297482a222 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -1,165 +1,165 @@ -/**
- * @file llimage.cpp
- * @brief Base class for images.
- *
- * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
- * $License$
- */
-
-#include "linden_common.h"
-
-#include "llimageworker.h"
-#include "llimagedxt.h"
-
-//----------------------------------------------------------------------------
-
-//static
-LLWorkerThread* LLImageWorker::sWorkerThread = NULL;
-S32 LLImageWorker::sCount = 0;
-
-//static
-void LLImageWorker::initClass(LLWorkerThread* workerthread)
-{
- sWorkerThread = workerthread;
-}
-
-//static
-void LLImageWorker::cleanupClass()
-{
-}
-
-//----------------------------------------------------------------------------
-
-LLImageWorker::LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard, LLResponder* responder)
- : LLWorkerClass(sWorkerThread, "Image"),
- mFormattedImage(image),
- mDecodedType(-1),
- mDiscardLevel(discard),
- mPriority(priority),
- mResponder(responder)
-{
- ++sCount;
-}
-
-LLImageWorker::~LLImageWorker()
-{
- mDecodedImage = NULL;
- mFormattedImage = NULL;
- --sCount;
-}
-
-//----------------------------------------------------------------------------
-
-//virtual, main thread
-void LLImageWorker::startWork(S32 param)
-{
- llassert_always(mDecodedImage.isNull());
- mDecodedType = -1;
-}
-
-bool LLImageWorker::doWork(S32 param)
-{
- bool decoded = false;
- if(mDecodedImage.isNull())
- {
- if (!mFormattedImage->updateData())
- {
- mDecodedType = -2; // failed
- return true;
- }
- if (mDiscardLevel >= 0)
- {
- mFormattedImage->setDiscardLevel(mDiscardLevel);
- }
- if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents()))
- {
- decoded = true; // failed
- }
- else
- {
- S32 nc = param ? 1 : mFormattedImage->getComponents();
- mDecodedImage = new LLImageRaw(mFormattedImage->getWidth(),
- mFormattedImage->getHeight(),
- nc);
- }
- }
- if (!decoded)
- {
- if (param == 0)
- {
- // Decode primary channels
- decoded = mFormattedImage->decode(mDecodedImage, .1f); // 1ms
- }
- else
- {
- // Decode aux channel
- decoded = mFormattedImage->decode(mDecodedImage, .1f, param, param); // 1ms
- }
- }
- if (decoded)
- {
- // Call the callback immediately; endWork doesn't get called until ckeckWork
- if (mResponder.notNull())
- {
- bool success = (!wasAborted() && mDecodedImage.notNull() && mDecodedImage->getDataSize() != 0);
- mResponder->completed(success);
- }
- }
- return decoded;
-}
-
-void LLImageWorker::endWork(S32 param, bool aborted)
-{
- if (mDecodedType != -2)
- {
- mDecodedType = aborted ? -2 : param;
- }
-}
-
-//----------------------------------------------------------------------------
-
-
-BOOL LLImageWorker::requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard)
-{
- // For most codecs, only mDiscardLevel data is available.
- // (see LLImageDXT for exception)
- if (discard >= 0 && discard != mFormattedImage->getDiscardLevel())
- {
- llerrs << "Request for invalid discard level" << llendl;
- }
- checkWork();
- if (mDecodedType == -2)
- {
- return TRUE; // aborted, done
- }
- if (mDecodedType != channel)
- {
- if (!haveWork())
- {
- addWork(channel, mPriority);
- }
- return FALSE;
- }
- else
- {
- llassert_always(!haveWork());
- llassert_always(mDecodedType == channel);
- raw = mDecodedImage; // smart pointer acquires ownership of data
- mDecodedImage = NULL;
- return TRUE;
- }
-}
-
-BOOL LLImageWorker::requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard)
-{
- if (mFormattedImage->getCodec() == IMG_CODEC_DXT)
- {
- // special case
- LLImageDXT* imagedxt = (LLImageDXT*)((LLImageFormatted*)mFormattedImage);
- return imagedxt->getMipData(raw, discard);
- }
- else
- {
- return requestDecodedAuxData(raw, 0, discard);
- }
-}
+/** + * @file llimage.cpp + * @brief Base class for images. + * + * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "linden_common.h" + +#include "llimageworker.h" +#include "llimagedxt.h" + +//---------------------------------------------------------------------------- + +//static +LLWorkerThread* LLImageWorker::sWorkerThread = NULL; +S32 LLImageWorker::sCount = 0; + +//static +void LLImageWorker::initClass(LLWorkerThread* workerthread) +{ + sWorkerThread = workerthread; +} + +//static +void LLImageWorker::cleanupClass() +{ +} + +//---------------------------------------------------------------------------- + +LLImageWorker::LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard, LLResponder* responder) + : LLWorkerClass(sWorkerThread, "Image"), + mFormattedImage(image), + mDecodedType(-1), + mDiscardLevel(discard), + mPriority(priority), + mResponder(responder) +{ + ++sCount; +} + +LLImageWorker::~LLImageWorker() +{ + mDecodedImage = NULL; + mFormattedImage = NULL; + --sCount; +} + +//---------------------------------------------------------------------------- + +//virtual, main thread +void LLImageWorker::startWork(S32 param) +{ + llassert_always(mDecodedImage.isNull()); + mDecodedType = -1; +} + +bool LLImageWorker::doWork(S32 param) +{ + bool decoded = false; + if(mDecodedImage.isNull()) + { + if (!mFormattedImage->updateData()) + { + mDecodedType = -2; // failed + return true; + } + if (mDiscardLevel >= 0) + { + mFormattedImage->setDiscardLevel(mDiscardLevel); + } + if (!(mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents())) + { + decoded = true; // failed + } + else + { + S32 nc = param ? 1 : mFormattedImage->getComponents(); + mDecodedImage = new LLImageRaw(mFormattedImage->getWidth(), + mFormattedImage->getHeight(), + nc); + } + } + if (!decoded) + { + if (param == 0) + { + // Decode primary channels + decoded = mFormattedImage->decode(mDecodedImage, .1f); // 1ms + } + else + { + // Decode aux channel + decoded = mFormattedImage->decode(mDecodedImage, .1f, param, param); // 1ms + } + } + if (decoded) + { + // Call the callback immediately; endWork doesn't get called until ckeckWork + if (mResponder.notNull()) + { + bool success = (!wasAborted() && mDecodedImage.notNull() && mDecodedImage->getDataSize() != 0); + mResponder->completed(success); + } + } + return decoded; +} + +void LLImageWorker::endWork(S32 param, bool aborted) +{ + if (mDecodedType != -2) + { + mDecodedType = aborted ? -2 : param; + } +} + +//---------------------------------------------------------------------------- + + +BOOL LLImageWorker::requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard) +{ + // For most codecs, only mDiscardLevel data is available. + // (see LLImageDXT for exception) + if (discard >= 0 && discard != mFormattedImage->getDiscardLevel()) + { + llerrs << "Request for invalid discard level" << llendl; + } + checkWork(); + if (mDecodedType == -2) + { + return TRUE; // aborted, done + } + if (mDecodedType != channel) + { + if (!haveWork()) + { + addWork(channel, mPriority); + } + return FALSE; + } + else + { + llassert_always(!haveWork()); + llassert_always(mDecodedType == channel); + raw = mDecodedImage; // smart pointer acquires ownership of data + mDecodedImage = NULL; + return TRUE; + } +} + +BOOL LLImageWorker::requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard) +{ + if (mFormattedImage->getCodec() == IMG_CODEC_DXT) + { + // special case + LLImageDXT* imagedxt = (LLImageDXT*)((LLImageFormatted*)mFormattedImage); + return imagedxt->getMipData(raw, discard); + } + else + { + return requestDecodedAuxData(raw, 0, discard); + } +} diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h index cdd30417ce..6e9ecacc89 100644 --- a/indra/llimage/llimageworker.h +++ b/indra/llimage/llimageworker.h @@ -1,57 +1,57 @@ -/**
- * @file llimageworker.h
- * @brief Object for managing images and their textures.
- *
- * Copyright (c) 2000-$CurrentYear$, Linden Research, Inc.
- * $License$
- */
-
-#ifndef LL_LLIMAGEWORKER_H
-#define LL_LLIMAGEWORKER_H
-
-#include "llimage.h"
-#include "llworkerthread.h"
-
-class LLImageWorker : public LLWorkerClass
-{
-public:
- static void initClass(LLWorkerThread* workerthread);
- static void cleanupClass();
- static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
-
- // LLWorkerThread
-public:
- LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard, LLResponder* responder = NULL);
- ~LLImageWorker();
-
- // called from WORKER THREAD, returns TRUE if done
- /*virtual*/ bool doWork(S32 param);
-
- BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1);
- BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1);
- void releaseDecodedData();
- void cancelDecode();
-
-private:
- // called from MAIN THREAD
- /*virtual*/ void startWork(S32 param); // called from addWork()
- /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork()
-
-protected:
- LLPointer<LLImageFormatted> mFormattedImage;
- LLPointer<LLImageRaw> mDecodedImage;
- S32 mDecodedType;
- S32 mDiscardLevel;
-
-private:
- U32 mPriority;
- LLPointer<LLResponder> mResponder;
-
-protected:
- static LLWorkerThread* sWorkerThread;
-
-public:
- static S32 sCount;
-};
-
-#endif
+/** + * @file llimageworker.h + * @brief Object for managing images and their textures. + * + * Copyright (c) 2000-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#ifndef LL_LLIMAGEWORKER_H +#define LL_LLIMAGEWORKER_H + +#include "llimage.h" +#include "llworkerthread.h" + +class LLImageWorker : public LLWorkerClass +{ +public: + static void initClass(LLWorkerThread* workerthread); + static void cleanupClass(); + static LLWorkerThread* getWorkerThread() { return sWorkerThread; } + + // LLWorkerThread +public: + LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard, LLResponder* responder = NULL); + ~LLImageWorker(); + + // called from WORKER THREAD, returns TRUE if done + /*virtual*/ bool doWork(S32 param); + + BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1); + BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1); + void releaseDecodedData(); + void cancelDecode(); + +private: + // called from MAIN THREAD + /*virtual*/ void startWork(S32 param); // called from addWork() + /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork() + +protected: + LLPointer<LLImageFormatted> mFormattedImage; + LLPointer<LLImageRaw> mDecodedImage; + S32 mDecodedType; + S32 mDiscardLevel; + +private: + U32 mPriority; + LLPointer<LLResponder> mResponder; + +protected: + static LLWorkerThread* sWorkerThread; + +public: + static S32 sCount; +}; + +#endif |