diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-05-22 20:51:58 +0300 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-22 20:51:58 +0300 | 
| commit | 6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a (patch) | |
| tree | fab23811a5cedc1ebf01479c852ee92ff62b636c /indra/newview/llthumbnailctrl.cpp | |
| parent | ef8f4819822288e044ea719feb6af7a1f4df4c4e (diff) | |
| parent | 7bb5afc11ee5a6af78302a8d76a9a619e2baaab2 (diff) | |
Merge pull request #1545 from Ansariel/DRTVWR-600-maint-A
Merge main into DRTVWR-600-maint-a
Diffstat (limited to 'indra/newview/llthumbnailctrl.cpp')
| -rw-r--r-- | indra/newview/llthumbnailctrl.cpp | 542 | 
1 files changed, 271 insertions, 271 deletions
diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp index 787f242565..c86ce7ba4d 100644 --- a/indra/newview/llthumbnailctrl.cpp +++ b/indra/newview/llthumbnailctrl.cpp @@ -1,271 +1,271 @@ -/**  - * @file llthumbnailctrl.cpp - * @brief LLThumbnailCtrl base class - * - * $LicenseInfo:firstyear=2023&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2023, 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$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llthumbnailctrl.h" - -#include "linden_common.h" -#include "llagent.h" -#include "lluictrlfactory.h" -#include "lluuid.h" -#include "lltrans.h" -#include "llviewborder.h" -#include "llviewertexture.h" -#include "llviewertexturelist.h" -#include "llwindow.h" - -static LLDefaultChildRegistry::Register<LLThumbnailCtrl> r("thumbnail"); - -LLThumbnailCtrl::Params::Params() -: border("border") -, border_color("border_color") -, fallback_image("fallback_image") -, image_name("image_name") -, border_visible("show_visible", false) -, interactable("interactable", false) -, show_loading("show_loading", true) -{} - -LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p) -:	LLUICtrl(p) -,   mBorderColor(p.border_color()) -,   mBorderVisible(p.border_visible()) -,   mFallbackImagep(p.fallback_image) -,   mInteractable(p.interactable()) -,   mShowLoadingPlaceholder(p.show_loading()) -,   mInited(false) -,   mInitImmediately(true) -{ -    mLoadingPlaceholderString = LLTrans::getString("texture_loading"); -     -    LLRect border_rect = getLocalRect(); -    LLViewBorder::Params vbparams(p.border); -    vbparams.name("border"); -    vbparams.rect(border_rect); -    mBorder = LLUICtrlFactory::create<LLViewBorder> (vbparams); -    addChild(mBorder); -     -    if (p.image_name.isProvided()) -    { -        setValue(p.image_name()); -    } -} - -LLThumbnailCtrl::~LLThumbnailCtrl() -{ -	mTexturep = nullptr; -    mImagep = nullptr; -    mFallbackImagep = nullptr; -} - - -void LLThumbnailCtrl::draw() -{ -    if (!mInited) -    { -        initImage(); -    } -    LLRect draw_rect = getLocalRect(); -     -    if (mBorderVisible) -    { -        mBorder->setKeyboardFocusHighlight(hasFocus()); -         -        gl_rect_2d( draw_rect, mBorderColor.get(), false ); -        draw_rect.stretch( -1 ); -    } - -    // If we're in a focused floater, don't apply the floater's alpha to the texture. -    const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); -    if( mTexturep ) -    { -        if( mTexturep->getComponents() == 4 ) -        { -            const LLColor4 color(.098f, .098f, .098f); -            gl_rect_2d( draw_rect, color, true); -        } -         -        gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); -         -        mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight()); -    } -    else if( mImagep.notNull() ) -    { -        mImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha ); -    } -    else if (mFallbackImagep.notNull()) -    { -        if (draw_rect.getWidth() > mFallbackImagep->getWidth() -            && draw_rect.getHeight() > mFallbackImagep->getHeight()) -        { -            S32 img_width = mFallbackImagep->getWidth(); -            S32 img_height = mFallbackImagep->getHeight(); -            S32 rect_width = draw_rect.getWidth(); -            S32 rect_height = draw_rect.getHeight(); - -            LLRect fallback_rect; -            fallback_rect.mLeft = draw_rect.mLeft + (rect_width - img_width) / 2; -            fallback_rect.mRight = fallback_rect.mLeft + img_width; -            fallback_rect.mBottom = draw_rect.mBottom + (rect_height - img_height) / 2; -            fallback_rect.mTop = fallback_rect.mBottom + img_height; - -            mFallbackImagep->draw(fallback_rect, UI_VERTEX_COLOR % alpha); -        } -        else -        { -            mFallbackImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha); -        } -    } -    else -    { -        gl_rect_2d( draw_rect, LLColor4::grey % alpha, true ); - -        // Draw X -        gl_draw_x( draw_rect, LLColor4::black ); -    } - -    // Show "Loading..." string on the top left corner while this texture is loading. -    // Using the discard level, do not show the string if the texture is almost but not -    // fully loaded. -    if (mTexturep.notNull() -        && mShowLoadingPlaceholder -        && !mTexturep->isFullyLoaded()) -    { -        U32 v_offset = 25; -        LLFontGL* font = LLFontGL::getFontSansSerif(); - -        // Don't show as loaded if the texture is almost fully loaded (i.e. discard1) unless god -        if ((mTexturep->getDiscardLevel() > 1) || gAgent.isGodlike()) -        { -            font->renderUTF8( -                mLoadingPlaceholderString, -                0, -                llfloor(draw_rect.mLeft+3), -                llfloor(draw_rect.mTop-v_offset), -                LLColor4::white, -                LLFontGL::LEFT, -                LLFontGL::BASELINE, -                LLFontGL::DROP_SHADOW); -        } -    } - -    LLUICtrl::draw(); -} - -void LLThumbnailCtrl::setVisible(bool visible) -{ -    if (!visible && mInited) -    { -        unloadImage(); -    } -    LLUICtrl::setVisible(visible); -} - -void LLThumbnailCtrl::clearTexture() -{ -    setValue(LLSD()); -    mInited = true; // nothing to do -} - -// virtual -// value might be a string or a UUID -void LLThumbnailCtrl::setValue(const LLSD& value) -{ -	LLSD tvalue(value); -	if (value.isString() && LLUUID::validate(value.asString())) -	{ -		//RN: support UUIDs masquerading as strings -		tvalue = LLSD(LLUUID(value.asString())); -	} -     -	LLUICtrl::setValue(tvalue); -     -    unloadImage(); - -    if (mInitImmediately) -    { -        initImage(); -    } -} - -bool LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask) -{ -    if (mInteractable && getEnabled()) -    { -        getWindow()->setCursor(UI_CURSOR_HAND); -        return true; -    } -    return LLUICtrl::handleHover(x, y, mask); -} - -void LLThumbnailCtrl::initImage() -{ -    if (mInited) -    { -        return; -    } -    mInited = true; -    LLSD tvalue = getValue(); - -    if (tvalue.isUUID()) -    { -        mImageAssetID = tvalue.asUUID(); -        if (mImageAssetID.notNull()) -        { -            // Should it support baked textures? -            mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL); - -            mTexturep->forceToSaveRawImage(0); - -            S32 desired_draw_width = MAX_IMAGE_SIZE; -            S32 desired_draw_height = MAX_IMAGE_SIZE; -            mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height); -        } -    } -    else if (tvalue.isString()) -    { -        mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI); -        if (mImagep) -        { -            LLViewerFetchedTexture* texture = dynamic_cast<LLViewerFetchedTexture*>(mImagep->getImage().get()); -            if (texture) -            { -                mImageAssetID = texture->getID(); -            } -        } -    } -} - -void LLThumbnailCtrl::unloadImage() -{ -    mImageAssetID = LLUUID::null; -    mTexturep = nullptr; -    mImagep = nullptr; -    mInited = false; -} - - +/**
 + * @file llthumbnailctrl.cpp
 + * @brief LLThumbnailCtrl base class
 + *
 + * $LicenseInfo:firstyear=2023&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2023, 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$
 + */
 +
 +#include "llviewerprecompiledheaders.h"
 +
 +#include "llthumbnailctrl.h"
 +
 +#include "linden_common.h"
 +#include "llagent.h"
 +#include "lluictrlfactory.h"
 +#include "lluuid.h"
 +#include "lltrans.h"
 +#include "llviewborder.h"
 +#include "llviewertexture.h"
 +#include "llviewertexturelist.h"
 +#include "llwindow.h"
 +
 +static LLDefaultChildRegistry::Register<LLThumbnailCtrl> r("thumbnail");
 +
 +LLThumbnailCtrl::Params::Params()
 +: border("border")
 +, border_color("border_color")
 +, fallback_image("fallback_image")
 +, image_name("image_name")
 +, border_visible("show_visible", false)
 +, interactable("interactable", false)
 +, show_loading("show_loading", true)
 +{}
 +
 +LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p)
 +:   LLUICtrl(p)
 +,   mBorderColor(p.border_color())
 +,   mBorderVisible(p.border_visible())
 +,   mFallbackImagep(p.fallback_image)
 +,   mInteractable(p.interactable())
 +,   mShowLoadingPlaceholder(p.show_loading())
 +,   mInited(false)
 +,   mInitImmediately(true)
 +{
 +    mLoadingPlaceholderString = LLTrans::getString("texture_loading");
 +
 +    LLRect border_rect = getLocalRect();
 +    LLViewBorder::Params vbparams(p.border);
 +    vbparams.name("border");
 +    vbparams.rect(border_rect);
 +    mBorder = LLUICtrlFactory::create<LLViewBorder> (vbparams);
 +    addChild(mBorder);
 +
 +    if (p.image_name.isProvided())
 +    {
 +        setValue(p.image_name());
 +    }
 +}
 +
 +LLThumbnailCtrl::~LLThumbnailCtrl()
 +{
 +    mTexturep = nullptr;
 +    mImagep = nullptr;
 +    mFallbackImagep = nullptr;
 +}
 +
 +
 +void LLThumbnailCtrl::draw()
 +{
 +    if (!mInited)
 +    {
 +        initImage();
 +    }
 +    LLRect draw_rect = getLocalRect();
 +
 +    if (mBorderVisible)
 +    {
 +        mBorder->setKeyboardFocusHighlight(hasFocus());
 +
 +        gl_rect_2d( draw_rect, mBorderColor.get(), false );
 +        draw_rect.stretch( -1 );
 +    }
 +
 +    // If we're in a focused floater, don't apply the floater's alpha to the texture.
 +    const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
 +    if( mTexturep )
 +    {
 +        if( mTexturep->getComponents() == 4 )
 +        {
 +            const LLColor4 color(.098f, .098f, .098f);
 +            gl_rect_2d( draw_rect, color, true);
 +        }
 +
 +        gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
 +
 +        mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight());
 +    }
 +    else if( mImagep.notNull() )
 +    {
 +        mImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha );
 +    }
 +    else if (mFallbackImagep.notNull())
 +    {
 +        if (draw_rect.getWidth() > mFallbackImagep->getWidth()
 +            && draw_rect.getHeight() > mFallbackImagep->getHeight())
 +        {
 +            S32 img_width = mFallbackImagep->getWidth();
 +            S32 img_height = mFallbackImagep->getHeight();
 +            S32 rect_width = draw_rect.getWidth();
 +            S32 rect_height = draw_rect.getHeight();
 +
 +            LLRect fallback_rect;
 +            fallback_rect.mLeft = draw_rect.mLeft + (rect_width - img_width) / 2;
 +            fallback_rect.mRight = fallback_rect.mLeft + img_width;
 +            fallback_rect.mBottom = draw_rect.mBottom + (rect_height - img_height) / 2;
 +            fallback_rect.mTop = fallback_rect.mBottom + img_height;
 +
 +            mFallbackImagep->draw(fallback_rect, UI_VERTEX_COLOR % alpha);
 +        }
 +        else
 +        {
 +            mFallbackImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha);
 +        }
 +    }
 +    else
 +    {
 +        gl_rect_2d( draw_rect, LLColor4::grey % alpha, true );
 +
 +        // Draw X
 +        gl_draw_x( draw_rect, LLColor4::black );
 +    }
 +
 +    // Show "Loading..." string on the top left corner while this texture is loading.
 +    // Using the discard level, do not show the string if the texture is almost but not
 +    // fully loaded.
 +    if (mTexturep.notNull()
 +        && mShowLoadingPlaceholder
 +        && !mTexturep->isFullyLoaded())
 +    {
 +        U32 v_offset = 25;
 +        LLFontGL* font = LLFontGL::getFontSansSerif();
 +
 +        // Don't show as loaded if the texture is almost fully loaded (i.e. discard1) unless god
 +        if ((mTexturep->getDiscardLevel() > 1) || gAgent.isGodlike())
 +        {
 +            font->renderUTF8(
 +                mLoadingPlaceholderString,
 +                0,
 +                llfloor(draw_rect.mLeft+3),
 +                llfloor(draw_rect.mTop-v_offset),
 +                LLColor4::white,
 +                LLFontGL::LEFT,
 +                LLFontGL::BASELINE,
 +                LLFontGL::DROP_SHADOW);
 +        }
 +    }
 +
 +    LLUICtrl::draw();
 +}
 +
 +void LLThumbnailCtrl::setVisible(bool visible)
 +{
 +    if (!visible && mInited)
 +    {
 +        unloadImage();
 +    }
 +    LLUICtrl::setVisible(visible);
 +}
 +
 +void LLThumbnailCtrl::clearTexture()
 +{
 +    setValue(LLSD());
 +    mInited = true; // nothing to do
 +}
 +
 +// virtual
 +// value might be a string or a UUID
 +void LLThumbnailCtrl::setValue(const LLSD& value)
 +{
 +    LLSD tvalue(value);
 +    if (value.isString() && LLUUID::validate(value.asString()))
 +    {
 +        //RN: support UUIDs masquerading as strings
 +        tvalue = LLSD(LLUUID(value.asString()));
 +    }
 +
 +    LLUICtrl::setValue(tvalue);
 +
 +    unloadImage();
 +
 +    if (mInitImmediately)
 +    {
 +        initImage();
 +    }
 +}
 +
 +bool LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask)
 +{
 +    if (mInteractable && getEnabled())
 +    {
 +        getWindow()->setCursor(UI_CURSOR_HAND);
 +        return true;
 +    }
 +    return LLUICtrl::handleHover(x, y, mask);
 +}
 +
 +void LLThumbnailCtrl::initImage()
 +{
 +    if (mInited)
 +    {
 +        return;
 +    }
 +    mInited = true;
 +    LLSD tvalue = getValue();
 +
 +    if (tvalue.isUUID())
 +    {
 +        mImageAssetID = tvalue.asUUID();
 +        if (mImageAssetID.notNull())
 +        {
 +            // Should it support baked textures?
 +            mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_THUMBNAIL);
 +
 +            mTexturep->forceToSaveRawImage(0);
 +
 +            S32 desired_draw_width = MAX_IMAGE_SIZE;
 +            S32 desired_draw_height = MAX_IMAGE_SIZE;
 +            mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height);
 +        }
 +    }
 +    else if (tvalue.isString())
 +    {
 +        mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI);
 +        if (mImagep)
 +        {
 +            LLViewerFetchedTexture* texture = dynamic_cast<LLViewerFetchedTexture*>(mImagep->getImage().get());
 +            if (texture)
 +            {
 +                mImageAssetID = texture->getID();
 +            }
 +        }
 +    }
 +}
 +
 +void LLThumbnailCtrl::unloadImage()
 +{
 +    mImageAssetID = LLUUID::null;
 +    mTexturep = nullptr;
 +    mImagep = nullptr;
 +    mInited = false;
 +}
 +
 +
  | 
