diff options
Diffstat (limited to 'indra/newview/llfloaterprofiletexture.cpp')
-rw-r--r-- | indra/newview/llfloaterprofiletexture.cpp | 275 |
1 files changed, 169 insertions, 106 deletions
diff --git a/indra/newview/llfloaterprofiletexture.cpp b/indra/newview/llfloaterprofiletexture.cpp index 8b36072034..7108047a6b 100644 --- a/indra/newview/llfloaterprofiletexture.cpp +++ b/indra/newview/llfloaterprofiletexture.cpp @@ -33,39 +33,173 @@ #include "llpreview.h" // fors constants #include "lltrans.h" #include "llviewercontrol.h" -#include "lltextureview.h" #include "llviewertexture.h" #include "llviewertexturelist.h" + ////////////////////////////////////////////////////////////////////////// + // LLProfileImageCtrl + ////////////////////////////////////////////////////////////////////////// -LLFloaterProfileTexture::LLFloaterProfileTexture(LLView* owner) - : LLFloater(LLSD()) - , mUpdateDimensions(TRUE) - , mLastHeight(0) - , mLastWidth(0) +static LLDefaultChildRegistry::Register<LLProfileImageCtrl> r("profile_image"); + +LLProfileImageCtrl::LLProfileImageCtrl(const LLProfileImageCtrl::Params& p) + : LLIconCtrl(p) , mImage(NULL) , mImageOldBoostLevel(LLGLTexture::BOOST_NONE) - , mOwnerHandle(owner->getHandle()) + , mWasNoDelete(false) + , mImageLoadedSignal(NULL) { - buildFromFile("floater_profile_texture.xml"); } -LLFloaterProfileTexture::~LLFloaterProfileTexture() +LLProfileImageCtrl::~LLProfileImageCtrl() +{ + LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList); + releaseTexture(); + + delete mImageLoadedSignal; +} + +void LLProfileImageCtrl::releaseTexture() { if (mImage.notNull()) { mImage->setBoostLevel(mImageOldBoostLevel); + if (!mWasNoDelete) + { + // In most cases setBoostLevel marks images as NO_DELETE + mImage->forceActive(); + } mImage = NULL; } +} + +void LLProfileImageCtrl::setValue(const LLSD& value) +{ + LLUUID id = value.asUUID(); + setImageAssetId(id); + if (id.isNull()) + { + LLIconCtrl::setValue("Generic_Person_Large", LLGLTexture::BOOST_UI); + } + else + { + // called second to not change priority before it gets saved to mImageOldBoostLevel + LLIconCtrl::setValue(value, LLGLTexture::BOOST_PREVIEW); + } +} + +void LLProfileImageCtrl::draw() +{ + if (mImage.notNull()) + { + // Pump the texture priority + mImage->addTextureStats(MAX_IMAGE_AREA); + mImage->setKnownDrawSize(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT, LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + } + LLIconCtrl::draw(); +} - LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList); +boost::signals2::connection LLProfileImageCtrl::setImageLoadedCallback(const image_loaded_signal_t::slot_type& cb) +{ + if (!mImageLoadedSignal) mImageLoadedSignal = new image_loaded_signal_t(); + + return mImageLoadedSignal->connect(cb); +} + +void LLProfileImageCtrl::setImageAssetId(const LLUUID& asset_id) +{ + if (mImageID == asset_id) + { + return; + } + + releaseTexture(); + + mImageID = asset_id; + if (mImageID.notNull()) + { + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mWasNoDelete = mImage->getTextureState() == LLGLTexture::NO_DELETE; + mImageOldBoostLevel = mImage->getBoostLevel(); + mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + mImage->setKnownDrawSize(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT, LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + mImage->forceToSaveRawImage(0); + + if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) + { + mImage->setLoadedCallback(LLProfileImageCtrl::onImageLoaded, + 0, TRUE, FALSE, new LLHandle<LLUICtrl>(getHandle()), &mCallbackTextureList); + } + else + { + onImageLoaded(true, mImage); + } + } +} + +void LLProfileImageCtrl::onImageLoaded(bool success, LLViewerFetchedTexture* img) +{ + if (mImageLoadedSignal) + { + (*mImageLoadedSignal)(success, img); + } +} + +// static +void LLProfileImageCtrl::onImageLoaded(BOOL success, + LLViewerFetchedTexture* src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata) +{ + if (!userdata) return; + + LLHandle<LLUICtrl>* handle = (LLHandle<LLUICtrl>*)userdata; + + if (!handle->isDead()) + { + LLProfileImageCtrl* caller = static_cast<LLProfileImageCtrl*>(handle->get()); + if (caller && caller->mImageLoadedSignal) + { + (*caller->mImageLoadedSignal)(success, src_vi); + } + } + + if (final || !success) + { + delete handle; + } +} + + +////////////////////////////////////////////////////////////////////////// +// LLFloaterProfileTexture + ////////////////////////////////////////////////////////////////////////// + +LLFloaterProfileTexture::LLFloaterProfileTexture(LLView* owner) + : LLFloater(LLSD()) + , mLastHeight(0) + , mLastWidth(0) + , mOwnerHandle(owner->getHandle()) + , mContextConeOpacity(0.f) + , mCloseButton(NULL) + , mProfileIcon(NULL) +{ + buildFromFile("floater_profile_texture.xml"); +} + +LLFloaterProfileTexture::~LLFloaterProfileTexture() +{ } // virtual BOOL LLFloaterProfileTexture::postBuild() { - mProfileIcon = getChild<LLIconCtrl>("profile_pic"); + mProfileIcon = getChild<LLProfileImageCtrl>("profile_pic"); + mProfileIcon->setImageLoadedCallback([this](BOOL success, LLViewerFetchedTexture* imagep) {onImageLoaded(success, imagep); }); mCloseButton = getChild<LLButton>("close_btn"); mCloseButton->setCommitCallback([this](LLUICtrl*, void*) { closeFloater(); }, nullptr); @@ -83,55 +217,41 @@ void LLFloaterProfileTexture::reshape(S32 width, S32 height, BOOL called_from_pa // When we receive it, reshape the window accordingly. void LLFloaterProfileTexture::updateDimensions() { - if (mImage.isNull()) + LLPointer<LLViewerFetchedTexture> image = mProfileIcon->getImage(); + if (image.isNull()) { return; } - if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) + if ((image->getFullWidth() * image->getFullHeight()) == 0) { return; } - S32 img_width = mImage->getFullWidth(); - S32 img_height = mImage->getFullHeight(); - - if (mAssetStatus != LLPreview::PREVIEW_ASSET_LOADED - || mLastWidth != img_width - || mLastHeight != img_height) - { - mAssetStatus = LLPreview::PREVIEW_ASSET_LOADED; - // Asset has been fully loaded - mUpdateDimensions = TRUE; - } + S32 img_width = image->getFullWidth(); + S32 img_height = image->getFullHeight(); mLastHeight = img_height; mLastWidth = img_width; - // Reshape the floater only when required - if (mUpdateDimensions) - { - mUpdateDimensions = FALSE; - - LLRect old_floater_rect = getRect(); - LLRect old_image_rect = mProfileIcon->getRect(); - S32 width = old_floater_rect.getWidth() - old_image_rect.getWidth() + mLastWidth; - S32 height = old_floater_rect.getHeight() - old_image_rect.getHeight() + mLastHeight; + LLRect old_floater_rect = getRect(); + LLRect old_image_rect = mProfileIcon->getRect(); + S32 width = old_floater_rect.getWidth() - old_image_rect.getWidth() + mLastWidth; + S32 height = old_floater_rect.getHeight() - old_image_rect.getHeight() + mLastHeight; - const F32 MAX_DIMENTIONS = 512; // most profiles are supposed to be 256x256 + const F32 MAX_DIMENTIONS = 512; // most profiles are supposed to be 256x256 - S32 biggest_dim = llmax(width, height); - if (biggest_dim > MAX_DIMENTIONS) - { - F32 scale_down = MAX_DIMENTIONS / (F32)biggest_dim; - width *= scale_down; - height *= scale_down; - } + S32 biggest_dim = llmax(width, height); + if (biggest_dim > MAX_DIMENTIONS) + { + F32 scale_down = MAX_DIMENTIONS / (F32)biggest_dim; + width *= scale_down; + height *= scale_down; + } - //reshape floater - reshape(width, height); + //reshape floater + reshape(width, height); - gFloaterView->adjustToFitScreen(this, FALSE); - } + gFloaterView->adjustToFitScreen(this, FALSE); } void LLFloaterProfileTexture::draw() @@ -151,75 +271,18 @@ void LLFloaterProfileTexture::onOpen(const LLSD& key) void LLFloaterProfileTexture::resetAsset() { - mProfileIcon->setValue("Generic_Person_Large"); - mImageID = LLUUID::null; - if (mImage.notNull()) - { - mImage->setBoostLevel(mImageOldBoostLevel); - mImage = NULL; - } + mProfileIcon->setValue(LLUUID::null); } void LLFloaterProfileTexture::loadAsset(const LLUUID &image_id) { - if (mImageID != image_id) - { - if (mImage.notNull()) - { - mImage->setBoostLevel(mImageOldBoostLevel); - mImage = NULL; - } - } - else - { - return; - } - mProfileIcon->setValue(image_id); - mImageID = image_id; - mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - mImageOldBoostLevel = mImage->getBoostLevel(); - - if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) - { - mImage->setLoadedCallback(LLFloaterProfileTexture::onTextureLoaded, - 0, TRUE, FALSE, new LLHandle<LLFloater>(getHandle()), &mCallbackTextureList); - - mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); - mAssetStatus = LLPreview::PREVIEW_ASSET_LOADING; - } - else - { - mAssetStatus = LLPreview::PREVIEW_ASSET_LOADED; - } - - mUpdateDimensions = TRUE; updateDimensions(); } -// static -void LLFloaterProfileTexture::onTextureLoaded( - BOOL success, - LLViewerFetchedTexture *src_vi, - LLImageRaw* src, - LLImageRaw* aux_src, - S32 discard_level, - BOOL final, - void* userdata) +void LLFloaterProfileTexture::onImageLoaded(BOOL success, LLViewerFetchedTexture* imagep) { - LLHandle<LLFloater>* handle = (LLHandle<LLFloater>*)userdata; - - if (!handle->isDead()) - { - LLFloaterProfileTexture* floater = static_cast<LLFloaterProfileTexture*>(handle->get()); - if (floater && success) - { - floater->mUpdateDimensions = TRUE; - floater->updateDimensions(); - } - } - - if (final || !success) + if (success) { - delete handle; + updateDimensions(); } } |