diff options
Diffstat (limited to 'indra/newview/llfloaterprofiletexture.cpp')
| -rw-r--r-- | indra/newview/llfloaterprofiletexture.cpp | 289 | 
1 files changed, 176 insertions, 113 deletions
diff --git a/indra/newview/llfloaterprofiletexture.cpp b/indra/newview/llfloaterprofiletexture.cpp index 2217e81302..47b3aa015b 100644 --- a/indra/newview/llfloaterprofiletexture.cpp +++ b/indra/newview/llfloaterprofiletexture.cpp @@ -1,25 +1,25 @@ -/**  +/**   * @file llfloaterprofiletexture.cpp   * @brief LLFloaterProfileTexture class implementation   *   * $LicenseInfo:firstyear=2022&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2022, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -33,105 +33,225 @@  #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;      } +} -    LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList); +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(); +} + +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); -	return true; +    return true;  }  // virtual  void LLFloaterProfileTexture::reshape(S32 width, S32 height, bool called_from_parent)  { -	LLFloater::reshape(width, height, called_from_parent); +    LLFloater::reshape(width, height, called_from_parent);  }  // It takes a while until we get height and width information.  // 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();      }  }  | 
