From 4e2b2f662ad3f7b2e09f9451227bbf7018d91708 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 20 Oct 2019 23:45:52 +0200 Subject: Update freetype to 2.10.1 and move viewer fonts to their own package --- .hgignore | 1 + autobuild.xml | 38 +++++++++- indra/cmake/ViewerMiscLibs.cmake | 1 + indra/newview/CMakeLists.txt | 6 ++ indra/newview/fonts/DejaVu-license.txt | 99 ------------------------- indra/newview/fonts/DejaVuSans-Bold.ttf | Bin 573136 -> 0 bytes indra/newview/fonts/DejaVuSans-BoldOblique.ttf | Bin 524056 -> 0 bytes indra/newview/fonts/DejaVuSans-Oblique.ttf | Bin 523804 -> 0 bytes indra/newview/fonts/DejaVuSans.ttf | Bin 622280 -> 0 bytes indra/newview/fonts/DejaVuSansMono.ttf | Bin 321524 -> 0 bytes indra/newview/viewer_manifest.py | 2 +- 11 files changed, 43 insertions(+), 104 deletions(-) delete mode 100644 indra/newview/fonts/DejaVu-license.txt delete mode 100644 indra/newview/fonts/DejaVuSans-Bold.ttf delete mode 100644 indra/newview/fonts/DejaVuSans-BoldOblique.ttf delete mode 100644 indra/newview/fonts/DejaVuSans-Oblique.ttf delete mode 100644 indra/newview/fonts/DejaVuSans.ttf delete mode 100644 indra/newview/fonts/DejaVuSansMono.ttf diff --git a/.hgignore b/.hgignore index 0d672e6ebc..3a5cbe4d94 100755 --- a/.hgignore +++ b/.hgignore @@ -36,6 +36,7 @@ indra/newview/browser_profile indra/newview/character indra/newview/fmod.dll indra/newview/fmod.log +indra/newview/fonts indra/newview/mozilla-theme indra/newview/mozilla-universal-darwin.tgz indra/newview/res/ll_icon.* diff --git a/autobuild.xml b/autobuild.xml index 3983e12313..8bd6491edd 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -817,6 +817,36 @@ version 4.44.64.501533 + fonts + + copyright + Copyright various + description + Viewer fonts + license + Various open source + license_file + LICENSES/fonts.txt + name + fonts + platforms + + common + + archive + + hash + 65b89f06d9b698b376e1736216dd5623 + url + viewer_fonts-1.0-1.tar.bz2 + + name + common + + + version + 1.0 + fontconfig copyright @@ -926,9 +956,9 @@ archive hash - b7a8df22cfc910180c66bb1c1ed89cd4 + d8f5b352176d5c582d91ce936a700b2c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/876/1922/freetype-2.4.4.500865-windows-500865.tar.bz2 + freetype-2.10.1.0-windows-72.tar.bz2 name windows @@ -938,9 +968,9 @@ archive hash - ff72a895012ed603935083496b0a7bc9 + aa8be83cdfcd5cda0343ea72e7d662ca url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/877/1925/freetype-2.4.4.500865-windows64-500865.tar.bz2 + freetype-2.10.1.0-windows64-72.tar.bz2 name windows64 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index fc5bdedb5a..f213de100c 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -10,3 +10,4 @@ if (NOT USESYSTEMLIBS) use_prebuilt_binary(slvoice) endif(NOT USESYSTEMLIBS) +use_prebuilt_binary(fonts) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b8789da66b..b83d3afadd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1470,6 +1470,12 @@ if (WINDOWS) set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp) endif(USE_PRECOMPILED_HEADERS) + message("Copying fonts") + file(GLOB FONT_FILE_GLOB_LIST + "${AUTOBUILD_INSTALL_DIR}/fonts/*" + ) + file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") + # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") diff --git a/indra/newview/fonts/DejaVu-license.txt b/indra/newview/fonts/DejaVu-license.txt deleted file mode 100644 index 254e2cc42a..0000000000 --- a/indra/newview/fonts/DejaVu-license.txt +++ /dev/null @@ -1,99 +0,0 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. -Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) - -Bitstream Vera Fonts Copyright ------------------------------- - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is -a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute the -Font Software, including without limitation the rights to use, copy, merge, -publish, distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to the -following conditions: - -The above copyright and trademark notices and this permission notice shall -be included in all copies of one or more of the Font Software typefaces. - -The Font Software may be modified, altered, or added to, and in particular -the designs of glyphs or characters in the Fonts may be modified and -additional glyphs or characters may be added to the Fonts, only if the fonts -are renamed to names not containing either the words "Bitstream" or the word -"Vera". - -This License becomes null and void to the extent applicable to Fonts or Font -Software that has been modified and is distributed under the "Bitstream -Vera" names. - -The Font Software may be sold as part of a larger software package but no -copy of one or more of the Font Software typefaces may be sold by itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, -TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME -FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING -ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE -FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font Software -without prior written authorization from the Gnome Foundation or Bitstream -Inc., respectively. For further information, contact: fonts at gnome dot -org. - -Arev Fonts Copyright ------------------------------- - -Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and -associated documentation files (the "Font Software"), to reproduce -and distribute the modifications to the Bitstream Vera Font Software, -including without limitation the rights to use, copy, merge, publish, -distribute, and/or sell copies of the Font Software, and to permit -persons to whom the Font Software is furnished to do so, subject to -the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Tavmjong Bah" or the word "Arev". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Tavmjong Bah Arev" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the name of Tavmjong Bah shall not -be used in advertising or otherwise to promote the sale, use or other -dealings in this Font Software without prior written authorization -from Tavmjong Bah. For further information, contact: tavmjong @ free -. fr. - -$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/indra/newview/fonts/DejaVuSans-Bold.ttf b/indra/newview/fonts/DejaVuSans-Bold.ttf deleted file mode 100644 index ec1a2ebaf2..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-Bold.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans-BoldOblique.ttf b/indra/newview/fonts/DejaVuSans-BoldOblique.ttf deleted file mode 100644 index 1a5576460d..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-BoldOblique.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans-Oblique.ttf b/indra/newview/fonts/DejaVuSans-Oblique.ttf deleted file mode 100644 index becc549927..0000000000 Binary files a/indra/newview/fonts/DejaVuSans-Oblique.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSans.ttf b/indra/newview/fonts/DejaVuSans.ttf deleted file mode 100644 index c1b19d8705..0000000000 Binary files a/indra/newview/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/indra/newview/fonts/DejaVuSansMono.ttf b/indra/newview/fonts/DejaVuSansMono.ttf deleted file mode 100644 index 6bc854ddae..0000000000 Binary files a/indra/newview/fonts/DejaVuSansMono.ttf and /dev/null differ diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index fcb97ded8f..d5526bf5fd 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -137,7 +137,7 @@ class ViewerManifest(LLManifest): self.path("*.tga") # Include our fonts - with self.prefix(src_dst="fonts"): + with self.prefix(src="../packages/fonts"): self.path("*.ttf") self.path("*.txt") -- cgit v1.2.3 From 05566ce7a7e1895a5b3ab2f9df2587dac63429e1 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 27 Oct 2019 16:41:38 +0200 Subject: Font debugging aid to dump descriptors + individual textures --- indra/llrender/llfontbitmapcache.h | 1 + indra/llrender/llfontfreetype.cpp | 33 ++++++++++++++++++++++ indra/llrender/llfontfreetype.h | 1 + indra/llrender/llfontgl.cpp | 20 +++++++++++++ indra/llrender/llfontgl.h | 4 +++ indra/llrender/llfontregistry.cpp | 11 ++++++++ indra/llrender/llfontregistry.h | 1 + indra/newview/llviewermenu.cpp | 4 +++ indra/newview/skins/default/xui/en/menu_login.xml | 26 +++++++++++++++++ indra/newview/skins/default/xui/en/menu_viewer.xml | 12 ++++++++ 10 files changed, 113 insertions(+) diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index 75df3a94a7..7e0e905756 100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h @@ -53,6 +53,7 @@ public: LLImageGL *getImageGL(U32 bitmapNum = 0) const; S32 getMaxCharWidth() const { return mMaxCharWidth; } + S32 getNumBitmaps() const { return mImageRawVec.size(); } S32 getNumComponents() const { return mNumComponents; } S32 getBitmapWidth() const { return mBitmapWidth; } S32 getBitmapHeight() const { return mBitmapHeight; } diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index c41730ebaa..78bc6ac433 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -40,8 +40,10 @@ #include FT_FREETYPE_H #endif +#include "lldir.h" #include "llerror.h" #include "llimage.h" +#include "llimagepng.h" //#include "llimagej2c.h" #include "llmath.h" // Linden math #include "llstring.h" @@ -657,6 +659,37 @@ const std::string &LLFontFreetype::getName() const return mName; } +static void dumpFontBitmap(const LLImageRaw* image_raw, const std::string& file_name) +{ + LLPointer tmpImage = new LLImagePNG(); + if ( (tmpImage->encode(image_raw, 0.0f)) && (tmpImage->save(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_name))) ) + { + LL_INFOS("Font") << "Successfully saved " << file_name << LL_ENDL; + } + else + { + LL_WARNS("Font") << "Failed to save " << file_name << LL_ENDL; + } +} + +void LLFontFreetype::dumpFontBitmaps() const +{ + // Dump all the regular bitmaps + for (int idx = 0, cnt = mFontBitmapCachep->getNumBitmaps(); idx < cnt; idx++) + { + dumpFontBitmap(mFontBitmapCachep->getImageRaw(idx), llformat("%s_%d_%d_%d.png", mFTFace->family_name, (int)(mPointSize * 10), mStyle, idx)); + } + +// // Dump all the color bitmaps (if any) +// if (mFontColorBitmapCachep) +// { +// for (int idxBitmap = 0, cntBitmap = mFontColorBitmapCachep->getNumBitmaps(); idxBitmap < cntBitmap; idxBitmap++) +// { +// dumpFontBitmap(mFontColorBitmapCachep->getImageRaw(idxBitmap), llformat("%s_%d_%d_clr_%d.png", mFTFace->family_name, (int)mPointSize, mStyle, idxBitmap)); +// } +// } +} + const LLFontBitmapCache* LLFontFreetype::getFontBitmapCache() const { return mFontBitmapCachep; diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 1afe84e770..a25cc18fcf 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -143,6 +143,7 @@ public: const std::string& getName() const; + void dumpFontBitmaps() const; const LLFontBitmapCache* getFontBitmapCache() const; void setStyle(U8 style); diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 86a4c35e6d..990a3e8281 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -831,6 +831,26 @@ void LLFontGL::initClass(F32 screen_dpi, F32 x_scale, F32 y_scale, const std::st } } +void LLFontGL::dumpTextures() +{ + if (mFontFreetype.notNull()) + { + mFontFreetype->dumpFontBitmaps(); + } +} + +// static +void LLFontGL::dumpFonts() +{ + sFontRegistry->dump(); +} + +// static +void LLFontGL::dumpFontTextures() +{ + sFontRegistry->dumpTextures(); +} + // Force standard fonts to get generated up front. // This is primarily for error detection purposes. // Don't do this during initClass because it can be slow and we want to get diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 10891faed9..b1a433f97d 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -163,6 +163,10 @@ public: static void initClass(F32 screen_dpi, F32 x_scale, F32 y_scale, const std::string& app_dir, bool create_gl_textures = true); + void dumpTextures(); + static void dumpFonts(); + static void dumpFontTextures(); + // Load sans-serif, sans-serif-small, etc. // Slow, requires multiple seconds to load fonts. static bool loadDefaultFonts(); diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index dbe71e2882..5ab2ab046e 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -721,6 +721,17 @@ void LLFontRegistry::dump() } } +void LLFontRegistry::dumpTextures() +{ + for (const auto& fontEntry : mFontMap) + { + if (fontEntry.second) + { + fontEntry.second->dumpTextures(); + } + } +} + const string_vec_t& LLFontRegistry::getUltimateFallbackList() const { return mUltimateFallbackList; diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h index e30c81c630..b1259ef4e7 100644 --- a/indra/llrender/llfontregistry.h +++ b/indra/llrender/llfontregistry.h @@ -94,6 +94,7 @@ public: bool nameToSize(const std::string& size_name, F32& size); void dump(); + void dumpTextures(); const string_vec_t& getUltimateFallbackList() const; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 52b2c631fa..f99cbedcbe 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -9121,6 +9121,10 @@ void initialize_menus() //Develop (clear cache immediately) commit.add("Develop.ClearCache", boost::bind(&handle_cache_clear_immediately) ); + // Develop (Fonts debugging) + commit.add("Develop.Fonts.Dump", boost::bind(&LLFontGL::dumpFonts)); + commit.add("Develop.Fonts.DumpTextures", boost::bind(&LLFontGL::dumpFontTextures)); + // Admin >Object view_listener_t::addMenu(new LLAdminForceTakeCopy(), "Admin.ForceTakeCopy"); view_listener_t::addMenu(new LLAdminHandleObjectOwnerSelf(), "Admin.HandleObjectOwnerSelf"); diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 07b3cc3bd8..93795be474 100644 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -166,6 +166,32 @@ parameter="ui_preview" /> + + + + + + + + + + + + + + + + + + -- cgit v1.2.3 From 9cfdb278de30e4a22d5d38fd08305fd40a905d80 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 28 Oct 2019 23:40:41 +0200 Subject: Support for COLR/CPAL fonts --- indra/llrender/llfontbitmapcache.cpp | 175 +++++++++++++++++++---------------- indra/llrender/llfontbitmapcache.h | 34 ++++--- indra/llrender/llfontfreetype.cpp | 148 ++++++++++++++++++----------- indra/llrender/llfontfreetype.h | 8 +- indra/llrender/llfontgl.cpp | 16 ++-- indra/llrender/llfontgl.h | 2 +- indra/llrender/llfontregistry.cpp | 2 +- 7 files changed, 222 insertions(+), 163 deletions(-) diff --git a/indra/llrender/llfontbitmapcache.cpp b/indra/llrender/llfontbitmapcache.cpp index f128636ab2..754adb14cb 100644 --- a/indra/llrender/llfontbitmapcache.cpp +++ b/indra/llrender/llfontbitmapcache.cpp @@ -30,152 +30,165 @@ #include "llfontbitmapcache.h" LLFontBitmapCache::LLFontBitmapCache() -: LLTrace::MemTrackable("LLFontBitmapCache"), - mNumComponents(0), - mBitmapWidth(0), - mBitmapHeight(0), - mBitmapNum(-1), - mMaxCharWidth(0), - mMaxCharHeight(0), - mCurrentOffsetX(1), - mCurrentOffsetY(1) + : LLTrace::MemTrackable("LLFontBitmapCache") + , mBitmapWidth(0) + , mBitmapHeight(0) + , mMaxCharWidth(0) + , mMaxCharHeight(0) { + // *TODO: simplify with initializer after VS2017 + for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) + { + mCurrentOffsetX[idx] = 1; + mCurrentOffsetY[idx] = 1; + } } LLFontBitmapCache::~LLFontBitmapCache() { } -void LLFontBitmapCache::init(S32 num_components, - S32 max_char_width, +void LLFontBitmapCache::init(S32 max_char_width, S32 max_char_height) { reset(); - mNumComponents = num_components; mMaxCharWidth = max_char_width; mMaxCharHeight = max_char_height; + + S32 image_width = mMaxCharWidth * 20; + S32 pow_iw = 2; + while (pow_iw < image_width) + { + pow_iw <<= 1; + } + image_width = pow_iw; + image_width = llmin(512, image_width); // Don't make bigger than 512x512, ever. + + mBitmapWidth = image_width; + mBitmapHeight = image_width; } -LLImageRaw *LLFontBitmapCache::getImageRaw(U32 bitmap_num) const +LLImageRaw *LLFontBitmapCache::getImageRaw(EFontGlyphType bitmap_type, U32 bitmap_num) const { - if (bitmap_num >= mImageRawVec.size()) - return NULL; + const U32 bitmap_idx = static_cast(bitmap_type); + if (bitmap_type >= EFontGlyphType::Count || bitmap_num >= mImageRawVec[bitmap_idx].size()) + return nullptr; - return mImageRawVec[bitmap_num]; + return mImageRawVec[bitmap_idx][bitmap_num]; } -LLImageGL *LLFontBitmapCache::getImageGL(U32 bitmap_num) const +LLImageGL *LLFontBitmapCache::getImageGL(EFontGlyphType bitmap_type, U32 bitmap_num) const { - if (bitmap_num >= mImageGLVec.size()) - return NULL; + const U32 bitmap_idx = static_cast(bitmap_type); + if (bitmap_type >= EFontGlyphType::Count || bitmap_num >= mImageGLVec[bitmap_idx].size()) + return nullptr; - return mImageGLVec[bitmap_num]; + return mImageGLVec[bitmap_idx][bitmap_num]; } -BOOL LLFontBitmapCache::nextOpenPos(S32 width, S32 &pos_x, S32 &pos_y, S32& bitmap_num) +BOOL LLFontBitmapCache::nextOpenPos(S32 width, S32& pos_x, S32& pos_y, EFontGlyphType bitmap_type, U32& bitmap_num) { - if ((mBitmapNum<0) || (mCurrentOffsetX + width + 1) > mBitmapWidth) + if (bitmap_type >= EFontGlyphType::Count) { - if ((mBitmapNum<0) || (mCurrentOffsetY + 2*mMaxCharHeight + 2) > mBitmapHeight) + return FALSE; + } + + const U32 bitmap_idx = static_cast(bitmap_type); + if (mImageRawVec[bitmap_idx].empty() || (mCurrentOffsetX[bitmap_idx] + width + 1) > mBitmapWidth) + { + if ((mImageRawVec[bitmap_idx].empty()) || (mCurrentOffsetY[bitmap_idx] + 2*mMaxCharHeight + 2) > mBitmapHeight) { // We're out of space in the current image, or no image // has been allocated yet. Make a new one. - - mImageRawVec.push_back(new LLImageRaw); - mBitmapNum = mImageRawVec.size()-1; - LLImageRaw *image_raw = getImageRaw(mBitmapNum); + S32 num_components = getNumComponents(bitmap_type); + mImageRawVec[bitmap_idx].push_back(new LLImageRaw(mBitmapWidth, mBitmapHeight, num_components)); + bitmap_num = mImageRawVec[bitmap_idx].size() - 1; - // Make corresponding GL image. - mImageGLVec.push_back(new LLImageGL(FALSE)); - LLImageGL *image_gl = getImageGL(mBitmapNum); - - S32 image_width = mMaxCharWidth * 20; - S32 pow_iw = 2; - while (pow_iw < image_width) + LLImageRaw* image_raw = getImageRaw(bitmap_type, bitmap_num); + if (EFontGlyphType::Grayscale == bitmap_type) { - pow_iw *= 2; + image_raw->clear(255, 0); } - image_width = pow_iw; - image_width = llmin(512, image_width); // Don't make bigger than 512x512, ever. - S32 image_height = image_width; - image_raw->resize(image_width, image_height, mNumComponents); - - mBitmapWidth = image_width; - mBitmapHeight = image_height; - - switch (mNumComponents) - { - case 1: - image_raw->clear(); - break; - case 2: - image_raw->clear(255, 0); - break; - } + // Make corresponding GL image. + mImageGLVec[bitmap_idx].push_back(new LLImageGL(image_raw, false)); + LLImageGL* image_gl = getImageGL(bitmap_type, bitmap_num); // Start at beginning of the new image. - mCurrentOffsetX = 1; - mCurrentOffsetY = 1; + mCurrentOffsetX[bitmap_idx] = 1; + mCurrentOffsetY[bitmap_idx] = 1; - // Attach corresponding GL texture. - image_gl->createGLTexture(0, image_raw); + // Attach corresponding GL texture. (*TODO: is this needed?) gGL.getTexUnit(0)->bind(image_gl); image_gl->setFilteringOption(LLTexUnit::TFO_POINT); // was setMipFilterNearest(TRUE, TRUE); - - claimMem(image_raw); - claimMem(image_gl); } else { // Move to next row in current image. - mCurrentOffsetX = 1; - mCurrentOffsetY += mMaxCharHeight + 1; + mCurrentOffsetX[bitmap_idx] = 1; + mCurrentOffsetY[bitmap_idx] += mMaxCharHeight + 1; } } - pos_x = mCurrentOffsetX; - pos_y = mCurrentOffsetY; - bitmap_num = mBitmapNum; + pos_x = mCurrentOffsetX[bitmap_idx]; + pos_y = mCurrentOffsetY[bitmap_idx]; + bitmap_num = getNumBitmaps(bitmap_type) - 1; - mCurrentOffsetX += width + 1; + mCurrentOffsetX[bitmap_idx] += width + 1; return TRUE; } void LLFontBitmapCache::destroyGL() { - for (std::vector >::iterator it = mImageGLVec.begin(); - it != mImageGLVec.end(); ++it) + for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) { - (*it)->destroyGLTexture(); + for (std::vector >::iterator it = mImageGLVec[idx].begin(); it != mImageGLVec[idx].end(); ++it) + { + (*it)->destroyGLTexture(); + } } } void LLFontBitmapCache::reset() { - for (std::vector >::iterator it = mImageRawVec.begin(), end_it = mImageRawVec.end(); - it != end_it; - ++it) + for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) { - disclaimMem(**it); + for (std::vector >::iterator it = mImageRawVec[idx].begin(), end_it = mImageRawVec[idx].end(); it != end_it; ++it) + { + disclaimMem(**it); + } + mImageRawVec[idx].clear(); } - mImageRawVec.clear(); - for (std::vector >::iterator it = mImageGLVec.begin(), end_it = mImageGLVec.end(); - it != end_it; - ++it) + for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) { - disclaimMem(**it); + for (std::vector >::iterator it = mImageGLVec[idx].begin(), end_it = mImageGLVec[idx].end(); it != end_it; ++it) + { + disclaimMem(**it); + } + mImageGLVec[idx].clear(); + mCurrentOffsetX[idx] = 1; + mCurrentOffsetY[idx] = 1; } - mImageGLVec.clear(); mBitmapWidth = 0; mBitmapHeight = 0; - mBitmapNum = -1; - mCurrentOffsetX = 1; - mCurrentOffsetY = 1; } +//static +U32 LLFontBitmapCache::getNumComponents(EFontGlyphType bitmap_type) +{ + switch (bitmap_type) + { + case EFontGlyphType::Grayscale: + return 2; + case EFontGlyphType::Color: + return 4; + default: + llassert(false); + return 2; + } +} diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index 7e0e905756..f68af0d2b6 100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h @@ -30,6 +30,13 @@ #include #include "lltrace.h" +enum class EFontGlyphType : U32 +{ + Grayscale = 0, + Color, + Count +}; + // Maintain a collection of bitmaps containing rendered glyphs. // Generalizes the single-bitmap logic from LLFontFreetype and LLFontGL. class LLFontBitmapCache : public LLTrace::MemTrackable @@ -39,36 +46,35 @@ public: ~LLFontBitmapCache(); // Need to call this once, before caching any glyphs. - void init(S32 num_components, - S32 max_char_width, + void init(S32 max_char_width, S32 max_char_height); void reset(); - BOOL nextOpenPos(S32 width, S32 &posX, S32 &posY, S32 &bitmapNum); + BOOL nextOpenPos(S32 width, S32& posX, S32& posY, EFontGlyphType bitmapType, U32& bitmapNum); void destroyGL(); - LLImageRaw *getImageRaw(U32 bitmapNum = 0) const; - LLImageGL *getImageGL(U32 bitmapNum = 0) const; - + LLImageRaw* getImageRaw(EFontGlyphType bitmapType, U32 bitmapNum) const; + LLImageGL* getImageGL(EFontGlyphType bitmapType, U32 bitmapNum) const; + S32 getMaxCharWidth() const { return mMaxCharWidth; } - S32 getNumBitmaps() const { return mImageRawVec.size(); } - S32 getNumComponents() const { return mNumComponents; } + U32 getNumBitmaps(EFontGlyphType bitmapType) const { return (bitmapType < EFontGlyphType::Count) ? mImageRawVec[static_cast(bitmapType)].size() : 0; } S32 getBitmapWidth() const { return mBitmapWidth; } S32 getBitmapHeight() const { return mBitmapHeight; } +protected: + static U32 getNumComponents(EFontGlyphType bitmap_type); + private: - S32 mNumComponents; S32 mBitmapWidth; S32 mBitmapHeight; - S32 mBitmapNum; + S32 mCurrentOffsetX[static_cast(EFontGlyphType::Count)]; + S32 mCurrentOffsetY[static_cast(EFontGlyphType::Count)]; S32 mMaxCharWidth; S32 mMaxCharHeight; - S32 mCurrentOffsetX; - S32 mCurrentOffsetY; - std::vector > mImageRawVec; - std::vector > mImageGLVec; + std::vector> mImageRawVec[static_cast(EFontGlyphType::Count)]; + std::vector> mImageGLVec[static_cast(EFontGlyphType::Count)]; }; #endif //LL_LLFONTBITMAPCACHE_H diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 78bc6ac433..57154feeec 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -101,6 +101,7 @@ LLFontGlyphInfo::LLFontGlyphInfo(U32 index) mYBitmapOffset(0), // Offset to the origin in the bitmap mXBearing(0), // Distance from baseline to left in pixels mYBearing(0), // Distance from baseline to top in pixels + mBitmapType(EFontGlyphType::Grayscale), mBitmapNum(0) // Which bitmap in the bitmap cache contains this glyph { } @@ -159,7 +160,7 @@ void ft_close_cb(FT_Stream stream) { } #endif -BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n) +BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n) { // Don't leak face objects. This is also needed to deal with // changed font file names. @@ -223,7 +224,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v S32 max_char_width = ll_round(0.5f + (x_max - x_min)); S32 max_char_height = ll_round(0.5f + (y_max - y_min)); - mFontBitmapCachep->init(components, max_char_width, max_char_height); + mFontBitmapCachep->init(max_char_width, max_char_height); claimMem(mFontBitmapCachep); @@ -236,7 +237,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v if (!mIsFallback) { // Add the default glyph - addGlyphFromFont(this, 0, 0); + addGlyphFromFont(this, 0, 0, EFontGlyphType::Grayscale); } mName = filename; @@ -447,7 +448,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const glyph_index = FT_Get_Char_Index((*iter)->mFTFace, wch); if (glyph_index) { - return addGlyphFromFont(*iter, wch, glyph_index); + return addGlyphFromFont(*iter, wch, glyph_index, EFontGlyphType::Color); } } } @@ -455,29 +456,43 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); if (iter == mCharGlyphInfoMap.end()) { - return addGlyphFromFont(this, wch, glyph_index); + return addGlyphFromFont(this, wch, glyph_index, EFontGlyphType::Color); } return NULL; } -LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index) const +LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const { if (mFTFace == NULL) return NULL; llassert(!mIsFallback); - fontp->renderGlyph(glyph_index); + fontp->renderGlyph(bitmap_type, glyph_index); + switch (fontp->mFTFace->glyph->bitmap.pixel_mode) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + bitmap_type = EFontGlyphType::Grayscale; + break; + case FT_PIXEL_MODE_BGRA: + bitmap_type = EFontGlyphType::Color; + break; + default: + llassert_always(true); + break; + } S32 width = fontp->mFTFace->glyph->bitmap.width; S32 height = fontp->mFTFace->glyph->bitmap.rows; S32 pos_x, pos_y; - S32 bitmap_num; - mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_num); + U32 bitmap_num; + mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_type, bitmap_num); mAddGlyphCount++; LLFontGlyphInfo* gi = new LLFontGlyphInfo(glyph_index); gi->mXBitmapOffset = pos_x; gi->mYBitmapOffset = pos_y; + gi->mBitmapType = bitmap_type; gi->mBitmapNum = bitmap_num; gi->mWidth = width; gi->mHeight = height; @@ -489,9 +504,6 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l insertGlyphInfo(wch, gi); - llassert(fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO - || fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY); - if (fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO || fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { @@ -525,39 +537,32 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l buffer_row_stride = width; } - switch (mFontBitmapCachep->getNumComponents()) - { - case 1: - mFontBitmapCachep->getImageRaw(bitmap_num)->setSubImage(pos_x, - pos_y, - width, - height, - buffer_data, - buffer_row_stride, - TRUE); - break; - case 2: - setSubImageLuminanceAlpha(pos_x, - pos_y, - bitmap_num, - width, - height, - buffer_data, - buffer_row_stride); - break; - default: - break; - } + setSubImageLuminanceAlpha(pos_x, + pos_y, + bitmap_num, + width, + height, + buffer_data, + buffer_row_stride); if (tmp_graydata) delete[] tmp_graydata; + } + else if (fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) + { + setSubImageBGRA(pos_x, + pos_y, + bitmap_num, + fontp->mFTFace->glyph->bitmap.width, + fontp->mFTFace->glyph->bitmap.rows, + fontp->mFTFace->glyph->bitmap.buffer, + llabs(fontp->mFTFace->glyph->bitmap.pitch)); } else { - // we don't know how to handle this pixel format from FreeType; - // omit it from the font-image. + llassert(false); } - LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_num); - LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_num); + LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_type, bitmap_num); + LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_type, bitmap_num); image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); return gi; @@ -592,12 +597,19 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const } } -void LLFontFreetype::renderGlyph(U32 glyph_index) const +void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const { if (mFTFace == NULL) return; - llassert_always(! FT_Load_Glyph(mFTFace, glyph_index, FT_LOAD_FORCE_AUTOHINT) ); + FT_Int32 load_flags = FT_LOAD_FORCE_AUTOHINT; + if (EFontGlyphType::Color == bitmap_type) + { + // We may not actually get a color render so our caller should always examine mFTFace->glyph->bitmap.pixel_mode + load_flags |= FT_LOAD_COLOR; + } + + llassert_always(! FT_Load_Glyph(mFTFace, glyph_index, load_flags) ); llassert_always(! FT_Render_Glyph(mFTFace->glyph, gFontRenderMode) ); @@ -607,7 +619,7 @@ void LLFontFreetype::renderGlyph(U32 glyph_index) const void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi) { resetBitmapCache(); - loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mFontBitmapCachep->getNumComponents(), mIsFallback); + loadFace(mName, mPointSize, vert_dpi ,horz_dpi, true, mIsFallback, 0); if (!mIsFallback) { // This is the head of the list - need to rebuild ourself and all fallbacks. @@ -645,7 +657,7 @@ void LLFontFreetype::resetBitmapCache() if(!mIsFallback) { // Add the empty glyph - addGlyphFromFont(this, 0, 0); + addGlyphFromFont(this, 0, 0, EFontGlyphType::Grayscale); } } @@ -674,20 +686,17 @@ static void dumpFontBitmap(const LLImageRaw* image_raw, const std::string& file_ void LLFontFreetype::dumpFontBitmaps() const { - // Dump all the regular bitmaps - for (int idx = 0, cnt = mFontBitmapCachep->getNumBitmaps(); idx < cnt; idx++) + // Dump all the regular bitmaps (if any) + for (int idx = 0, cnt = mFontBitmapCachep->getNumBitmaps(EFontGlyphType::Grayscale); idx < cnt; idx++) { - dumpFontBitmap(mFontBitmapCachep->getImageRaw(idx), llformat("%s_%d_%d_%d.png", mFTFace->family_name, (int)(mPointSize * 10), mStyle, idx)); + dumpFontBitmap(mFontBitmapCachep->getImageRaw(EFontGlyphType::Grayscale, idx), llformat("%s_%d_%d_%d.png", mFTFace->family_name, (int)(mPointSize * 10), mStyle, idx)); } -// // Dump all the color bitmaps (if any) -// if (mFontColorBitmapCachep) -// { -// for (int idxBitmap = 0, cntBitmap = mFontColorBitmapCachep->getNumBitmaps(); idxBitmap < cntBitmap; idxBitmap++) -// { -// dumpFontBitmap(mFontColorBitmapCachep->getImageRaw(idxBitmap), llformat("%s_%d_%d_clr_%d.png", mFTFace->family_name, (int)mPointSize, mStyle, idxBitmap)); -// } -// } + // Dump all the color bitmaps (if any) + for (int idx = 0, cnt = mFontBitmapCachep->getNumBitmaps(EFontGlyphType::Color); idx < cnt; idx++) + { + dumpFontBitmap(mFontBitmapCachep->getImageRaw(EFontGlyphType::Color, idx), llformat("%s_%d_%d_%d_clr.png", mFTFace->family_name, (int)(mPointSize * 10), mStyle, idx)); + } } const LLFontBitmapCache* LLFontFreetype::getFontBitmapCache() const @@ -705,9 +714,38 @@ U8 LLFontFreetype::getStyle() const return mStyle; } +bool LLFontFreetype::setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const +{ + LLImageRaw* image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Color, bitmap_num); + llassert(!mIsFallback); + llassert(image_raw && (image_raw->getComponents() == 4)); + + // NOTE: inspired by LLImageRaw::setSubImage() + U32* image_data = (U32*)image_raw->getData(); + if (!image_data) + { + return false; + } + + for (U32 idxRow = 0; idxRow < height; idxRow++) + { + const U32 nSrcRow = height - 1 - idxRow; + const U32 nSrcOffset = nSrcRow * width * image_raw->getComponents(); + const U32 nDstOffset = (y + idxRow) * image_raw->getWidth() + x; + + for (U32 idxCol = 0; idxCol < width; idxCol++) + { + U32 nTemp = nSrcOffset + idxCol * 4; + image_data[nDstOffset + idxCol] = data[nTemp + 3] << 24 | data[nTemp] << 16 | data[nTemp + 1] << 8 | data[nTemp + 2]; + } + } + + return true; +} + void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride) const { - LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_num); + LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(EFontGlyphType::Grayscale, bitmap_num); llassert(!mIsFallback); llassert(image_raw && (image_raw->getComponents() == 2)); diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index a25cc18fcf..7b7b3faaf0 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -71,6 +71,7 @@ struct LLFontGlyphInfo S32 mYBitmapOffset; // Offset to the origin in the bitmap S32 mXBearing; // Distance from baseline to left in pixels S32 mYBearing; // Distance from baseline to top in pixels + EFontGlyphType mBitmapType; // Specifies the bitmap type in the bitmap cache S32 mBitmapNum; // Which bitmap in the bitmap cache contains this glyph }; @@ -84,7 +85,7 @@ public: // is_fallback should be true for fallback fonts that aren't used // to render directly (Unicode backup, primarily) - BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n = 0); + BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n); S32 getNumFaces(const std::string& filename); @@ -152,10 +153,11 @@ public: private: void resetBitmapCache(); void setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride = 0) const; + bool setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const; BOOL hasGlyph(llwchar wch) const; // Has a glyph for this character LLFontGlyphInfo* addGlyph(llwchar wch) const; // Add a new character to the font if necessary - LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) - void renderGlyph(U32 glyph_index) const; + LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) + void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const; void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const; std::string mName; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 990a3e8281..6fee34d3eb 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -89,14 +89,14 @@ void LLFontGL::destroyGL() mFontFreetype->destroyGL(); } -BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n) +BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n) { if(mFontFreetype == reinterpret_cast(NULL)) { mFontFreetype = new LLFontFreetype; } - return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, components, is_fallback, face_n); + return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, use_color, is_fallback, face_n); } S32 LLFontGL::getNumFaces(const std::string& filename) @@ -280,7 +280,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons LLColor4U text_color(color); - S32 bitmap_num = -1; + std::pair bitmap_entry = std::make_pair(EFontGlyphType::Grayscale, -1); S32 glyph_count = 0; for (i = begin_offset; i < begin_offset + length; i++) { @@ -298,8 +298,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons break; } // Per-glyph bitmap texture. - S32 next_bitmap_num = fgi->mBitmapNum; - if (next_bitmap_num != bitmap_num) + std::pair next_bitmap_entry = std::make_pair(fgi->mBitmapType, fgi->mBitmapNum); + if (next_bitmap_entry != bitmap_entry) { // Actually draw the queued glyphs before switching their texture; // otherwise the queued glyphs will be taken from wrong textures. @@ -313,8 +313,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons glyph_count = 0; } - bitmap_num = next_bitmap_num; - LLImageGL *font_image = font_bitmap_cache->getImageGL(bitmap_num); + bitmap_entry = next_bitmap_entry; + LLImageGL* font_image = font_bitmap_cache->getImageGL(fgi->mBitmapType, bitmap_entry.second); gGL.getTexUnit(0)->bind(font_image); } @@ -347,7 +347,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons glyph_count = 0; } - drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, text_color, style_to_add, shadow, drop_shadow_strength); + drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, (fgi->mBitmapType == EFontGlyphType::Grayscale) ? text_color : LLColor4U::white, style_to_add, shadow, drop_shadow_strength); chars_drawn++; cur_x += fgi->mXAdvance; diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index b1a433f97d..5028ccc770 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -87,7 +87,7 @@ public: void destroyGL(); - BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, const S32 components, BOOL is_fallback, S32 face_n = 0); + BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n); S32 getNumFaces(const std::string& filename); diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 5ab2ab046e..426b10b016 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -495,7 +495,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) fontp = new LLFontGL; } if (fontp->loadFace(*font_paths_it, point_size_scale, - LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback, i)) + LLFontGL::sVertDPI, LLFontGL::sHorizDPI, true, is_fallback, i)) { is_font_loaded = true; if (is_first_found) -- cgit v1.2.3 From 418308bc7ce4e9924d6280f784222ba45172eea4 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 6 Nov 2019 12:34:26 +0100 Subject: Characters can have more than one representation in LLFontFreetype * By default all viewer text will use B/W glyphs * Added temporary use_color attribute to LLTextBase for testing --- indra/llrender/llfontbitmapcache.h | 3 +- indra/llrender/llfontfreetype.cpp | 90 ++++++++++++++++++++++++----------- indra/llrender/llfontfreetype.h | 14 +++--- indra/llrender/llfontgl.cpp | 45 +++++++++--------- indra/llrender/llfontgl.h | 11 +++-- indra/llui/llfolderviewitem.cpp | 6 +-- indra/llui/lltextbase.cpp | 11 +++-- indra/llui/lltextbase.h | 3 ++ indra/llui/llview.cpp | 2 +- indra/newview/llexpandabletextbox.cpp | 2 +- indra/newview/llfloateruipreview.cpp | 8 ++-- indra/newview/lltextureview.cpp | 2 +- indra/newview/llviewerwindow.cpp | 2 +- indra/newview/llworldmapview.cpp | 3 +- 14 files changed, 126 insertions(+), 76 deletions(-) diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index f68af0d2b6..5d0094fd69 100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h @@ -34,7 +34,8 @@ enum class EFontGlyphType : U32 { Grayscale = 0, Color, - Count + Count, + Unspecified, }; // Maintain a collection of bitmaps containing rendered glyphs. diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 57154feeec..7d66965e57 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -91,8 +91,9 @@ LLFontManager::~LLFontManager() } -LLFontGlyphInfo::LLFontGlyphInfo(U32 index) +LLFontGlyphInfo::LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type) : mGlyphIndex(index), + mGlyphType(glyph_type), mWidth(0), // In pixels mHeight(0), // In pixels mXAdvance(0.f), // In pixels @@ -101,11 +102,25 @@ LLFontGlyphInfo::LLFontGlyphInfo(U32 index) mYBitmapOffset(0), // Offset to the origin in the bitmap mXBearing(0), // Distance from baseline to left in pixels mYBearing(0), // Distance from baseline to top in pixels - mBitmapType(EFontGlyphType::Grayscale), - mBitmapNum(0) // Which bitmap in the bitmap cache contains this glyph + mBitmapEntry(std::make_pair(EFontGlyphType::Unspecified, -1)) // Which bitmap in the bitmap cache contains this glyph { } +LLFontGlyphInfo::LLFontGlyphInfo(const LLFontGlyphInfo& fgi) + : mGlyphIndex(fgi.mGlyphIndex) + , mGlyphType(fgi.mGlyphType) + , mWidth(fgi.mWidth) + , mHeight(fgi.mHeight) + , mXAdvance(fgi.mXAdvance) + , mYAdvance(fgi.mYAdvance) + , mXBitmapOffset(fgi.mXBitmapOffset) + , mYBitmapOffset(fgi.mYBitmapOffset) + , mXBearing(fgi.mXBearing) + , mYBearing(fgi.mYBearing) +{ + mBitmapEntry = fgi.mBitmapEntry; +} + LLFontFreetype::LLFontFreetype() : LLTrace::MemTrackable("LLFontFreetype"), mFontBitmapCachep(new LLFontBitmapCache), @@ -361,7 +376,7 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const return 0.0; // Return existing info only if it is current - LLFontGlyphInfo* gi = getGlyphInfo(wch); + LLFontGlyphInfo* gi = getGlyphInfo(wch, EFontGlyphType::Unspecified); if (gi) { return gi->mXAdvance; @@ -393,10 +408,10 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const return 0.0; //llassert(!mIsFallback); - LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left);; + LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left, EFontGlyphType::Unspecified);; U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0; // Kern this puppy. - LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right); + LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right, EFontGlyphType::Unspecified); U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0; FT_Vector delta; @@ -427,12 +442,13 @@ BOOL LLFontFreetype::hasGlyph(llwchar wch) const return(mCharGlyphInfoMap.find(wch) != mCharGlyphInfoMap.end()); } -LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const +LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type) const { if (mFTFace == NULL) return FALSE; llassert(!mIsFallback); + llassert(glyph_type < EFontGlyphType::Count); //LL_DEBUGS() << "Adding new glyph for " << wch << " to font" << LL_ENDL; FT_UInt glyph_index; @@ -448,34 +464,38 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const glyph_index = FT_Get_Char_Index((*iter)->mFTFace, wch); if (glyph_index) { - return addGlyphFromFont(*iter, wch, glyph_index, EFontGlyphType::Color); + return addGlyphFromFont(*iter, wch, glyph_index, glyph_type); } } } - char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); - if (iter == mCharGlyphInfoMap.end()) + std::pair range_it = mCharGlyphInfoMap.equal_range(wch); + char_glyph_info_map_t::iterator iter = + std::find_if(range_it.first, range_it.second, [&glyph_type](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == glyph_type; }); + if (iter == range_it.second) { - return addGlyphFromFont(this, wch, glyph_index, EFontGlyphType::Color); + return addGlyphFromFont(this, wch, glyph_index, glyph_type); } return NULL; } -LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const +LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType requested_glyph_type) const { if (mFTFace == NULL) return NULL; llassert(!mIsFallback); - fontp->renderGlyph(bitmap_type, glyph_index); + fontp->renderGlyph(requested_glyph_type, glyph_index); + + EFontGlyphType bitmap_glyph_type = EFontGlyphType::Unspecified; switch (fontp->mFTFace->glyph->bitmap.pixel_mode) { case FT_PIXEL_MODE_MONO: case FT_PIXEL_MODE_GRAY: - bitmap_type = EFontGlyphType::Grayscale; + bitmap_glyph_type = EFontGlyphType::Grayscale; break; case FT_PIXEL_MODE_BGRA: - bitmap_type = EFontGlyphType::Color; + bitmap_glyph_type = EFontGlyphType::Color; break; default: llassert_always(true); @@ -486,14 +506,13 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l S32 pos_x, pos_y; U32 bitmap_num; - mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_type, bitmap_num); + mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_glyph_type, bitmap_num); mAddGlyphCount++; - LLFontGlyphInfo* gi = new LLFontGlyphInfo(glyph_index); + LLFontGlyphInfo* gi = new LLFontGlyphInfo(glyph_index, requested_glyph_type); gi->mXBitmapOffset = pos_x; gi->mYBitmapOffset = pos_y; - gi->mBitmapType = bitmap_type; - gi->mBitmapNum = bitmap_num; + gi->mBitmapEntry = std::make_pair(bitmap_glyph_type, bitmap_num); gi->mWidth = width; gi->mHeight = height; gi->mXBearing = fontp->mFTFace->glyph->bitmap_left; @@ -504,6 +523,13 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l insertGlyphInfo(wch, gi); + if (requested_glyph_type != bitmap_glyph_type) + { + LLFontGlyphInfo* gi_temp = new LLFontGlyphInfo(*gi); + gi_temp->mGlyphType = bitmap_glyph_type; + insertGlyphInfo(wch, gi_temp); + } + if (fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO || fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY) { @@ -561,31 +587,39 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l llassert(false); } - LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_type, bitmap_num); - LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_type, bitmap_num); + LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_glyph_type, bitmap_num); + LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_glyph_type, bitmap_num); image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight()); return gi; } -LLFontGlyphInfo* LLFontFreetype::getGlyphInfo(llwchar wch) const +LLFontGlyphInfo* LLFontFreetype::getGlyphInfo(llwchar wch, EFontGlyphType glyph_type) const { - char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); - if (iter != mCharGlyphInfoMap.end()) + std::pair range_it = mCharGlyphInfoMap.equal_range(wch); + + char_glyph_info_map_t::iterator iter = (EFontGlyphType::Unspecified != glyph_type) + ? std::find_if(range_it.first, range_it.second, [&glyph_type](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == glyph_type; }) + : range_it.first; + if (iter != range_it.second) { return iter->second; } else { // this glyph doesn't yet exist, so render it and return the result - return addGlyph(wch); + return addGlyph(wch, (EFontGlyphType::Unspecified != glyph_type) ? glyph_type : EFontGlyphType::Grayscale); } } void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const { - char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); - if (iter != mCharGlyphInfoMap.end()) + llassert(gi->mGlyphType < EFontGlyphType::Count); + std::pair range_it = mCharGlyphInfoMap.equal_range(wch); + + char_glyph_info_map_t::iterator iter = + std::find_if(range_it.first, range_it.second, [&gi](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == gi->mGlyphType; }); + if (iter != range_it.second) { delete iter->second; iter->second = gi; @@ -593,7 +627,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const else { claimMem(gi); - mCharGlyphInfoMap[wch] = gi; + mCharGlyphInfoMap.insert(std::make_pair(wch, gi)); } } diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 7b7b3faaf0..8c2d2bc491 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -56,9 +56,11 @@ private: struct LLFontGlyphInfo { - LLFontGlyphInfo(U32 index); + LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type); + LLFontGlyphInfo(const LLFontGlyphInfo& fgi); U32 mGlyphIndex; + EFontGlyphType mGlyphType; // Metrics S32 mWidth; // In pixels @@ -71,8 +73,7 @@ struct LLFontGlyphInfo S32 mYBitmapOffset; // Offset to the origin in the bitmap S32 mXBearing; // Distance from baseline to left in pixels S32 mYBearing; // Distance from baseline to top in pixels - EFontGlyphType mBitmapType; // Specifies the bitmap type in the bitmap cache - S32 mBitmapNum; // Which bitmap in the bitmap cache contains this glyph + std::pair mBitmapEntry; // Which bitmap in the bitmap cache contains this glyph }; extern LLFontManager *gFontManagerp; @@ -136,7 +137,7 @@ public: F32 getXKerning(llwchar char_left, llwchar char_right) const; // Get the kerning between the two characters F32 getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const; // Get the kerning between the two characters - LLFontGlyphInfo* getGlyphInfo(llwchar wch) const; + LLFontGlyphInfo* getGlyphInfo(llwchar wch, EFontGlyphType glyph_type) const; void reset(F32 vert_dpi, F32 horz_dpi); @@ -155,7 +156,7 @@ private: void setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride = 0) const; bool setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const; BOOL hasGlyph(llwchar wch) const; // Has a glyph for this character - LLFontGlyphInfo* addGlyph(llwchar wch) const; // Add a new character to the font if necessary + LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const; // Add a new character to the font if necessary LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const; void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const; @@ -179,7 +180,8 @@ private: BOOL mIsFallback; font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars) - typedef boost::unordered_map char_glyph_info_map_t; + // *NOTE: the same glyph can be present with multiple representations (but the pointer is always unique) + typedef boost::unordered_multimap char_glyph_info_map_t; mutable char_glyph_info_map_t mCharGlyphInfoMap; // Information about glyph location in bitmap mutable LLFontBitmapCache* mFontBitmapCachep; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 6fee34d3eb..78017ecb3d 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -112,14 +112,14 @@ S32 LLFontGL::getNumFaces(const std::string& filename) static LLTrace::BlockTimerStatHandle FTM_RENDER_FONTS("Fonts"); S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, - ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const + ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses, BOOL use_color) const { LLRectf rect_float(rect.mLeft, rect.mTop, rect.mRight, rect.mBottom); - return render(wstr, begin_offset, rect_float, color, halign, valign, style, shadow, max_chars, right_x, use_ellipses); + return render(wstr, begin_offset, rect_float, color, halign, valign, style, shadow, max_chars, right_x, use_ellipses, use_color); } S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, - ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const + ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses, BOOL use_color) const { F32 x = rect.mLeft; F32 y = 0.f; @@ -140,12 +140,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rec y = rect.mBottom; break; } - return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses); + return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses, use_color); } S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, - ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses) const + ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const { LL_RECORD_BLOCK_TIME(FTM_RENDER_FONTS); @@ -290,7 +290,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons next_glyph = NULL; if(!fgi) { - fgi = mFontFreetype->getGlyphInfo(wch); + fgi = mFontFreetype->getGlyphInfo(wch, (!use_color) ? EFontGlyphType::Grayscale : EFontGlyphType::Color); } if (!fgi) { @@ -298,7 +298,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons break; } // Per-glyph bitmap texture. - std::pair next_bitmap_entry = std::make_pair(fgi->mBitmapType, fgi->mBitmapNum); + std::pair next_bitmap_entry = fgi->mBitmapEntry; if (next_bitmap_entry != bitmap_entry) { // Actually draw the queued glyphs before switching their texture; @@ -314,7 +314,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons } bitmap_entry = next_bitmap_entry; - LLImageGL* font_image = font_bitmap_cache->getImageGL(fgi->mBitmapType, bitmap_entry.second); + LLImageGL* font_image = font_bitmap_cache->getImageGL(bitmap_entry.first, bitmap_entry.second); gGL.getTexUnit(0)->bind(font_image); } @@ -347,7 +347,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons glyph_count = 0; } - drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, (fgi->mBitmapType == EFontGlyphType::Grayscale) ? text_color : LLColor4U::white, style_to_add, shadow, drop_shadow_strength); + drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, (bitmap_entry.first == EFontGlyphType::Grayscale) ? text_color : LLColor4U::white, style_to_add, shadow, drop_shadow_strength); chars_drawn++; cur_x += fgi->mXAdvance; @@ -357,7 +357,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons if (next_char && (next_char < LAST_CHARACTER)) { // Kern this puppy. - next_glyph = mFontFreetype->getGlyphInfo(next_char); + next_glyph = mFontFreetype->getGlyphInfo(next_char, (!use_color) ? EFontGlyphType::Grayscale : EFontGlyphType::Color); cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } @@ -411,7 +411,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons shadow, S32_MAX, max_pixels, right_x, - FALSE); + FALSE, + use_color); gGL.popUIMatrix(); } @@ -425,19 +426,19 @@ S32 LLFontGL::render(const LLWString &text, S32 begin_offset, F32 x, F32 y, cons return render(text, begin_offset, x, y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); } -S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses) const +S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const { - return render(utf8str_to_wstring(text), begin_offset, x, y, color, halign, valign, style, shadow, max_chars, max_pixels, right_x, use_ellipses); + return render(utf8str_to_wstring(text), begin_offset, x, y, color, halign, valign, style, shadow, max_chars, max_pixels, right_x, use_ellipses, use_color); } S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const { - return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE, FALSE); } S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow) const { - return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow, S32_MAX, S32_MAX, NULL, FALSE); + return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow, S32_MAX, S32_MAX, NULL, FALSE, FALSE); } // font metrics - override for LLFontFreetype that returns units of virtual pixels @@ -514,7 +515,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars next_glyph = NULL; if(!fgi) { - fgi = mFontFreetype->getGlyphInfo(wch); + fgi = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified); } F32 advance = mFontFreetype->getXAdvance(fgi); @@ -534,7 +535,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars && (next_char < LAST_CHARACTER)) { // Kern this puppy. - next_glyph = mFontFreetype->getGlyphInfo(next_char); + next_glyph = mFontFreetype->getGlyphInfo(next_char, EFontGlyphType::Unspecified); cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } // Round after kerning. @@ -616,7 +617,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch next_glyph = NULL; if(!fgi) { - fgi = mFontFreetype->getGlyphInfo(wch); + fgi = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified); if (NULL == fgi) { @@ -641,7 +642,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch if (((i+1) < max_chars) && wchars[i+1]) { // Kern this puppy. - next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1]); + next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1], EFontGlyphType::Unspecified); cur_x += mFontFreetype->getXKerning(fgi, next_glyph); } @@ -688,7 +689,7 @@ S32 LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_ { llwchar wch = wchars[i]; - const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); + const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified); // last character uses character width, since the whole character needs to be visible // other characters just use advance @@ -763,7 +764,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t next_glyph = NULL; if(!glyph) { - glyph = mFontFreetype->getGlyphInfo(wch); + glyph = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified); } F32 char_width = mFontFreetype->getXAdvance(glyph); @@ -793,7 +794,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t && (wchars[(pos + 1)])) { // Kern this puppy. - next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1]); + next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1], EFontGlyphType::Unspecified); cur_x += mFontFreetype->getXKerning(glyph, next_glyph); } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 5028ccc770..68bf5db668 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -98,7 +98,8 @@ public: U8 style = NORMAL, ShadowType shadow = NO_SHADOW, S32 max_chars = S32_MAX, F32* right_x=NULL, - BOOL use_ellipses = FALSE) const; + BOOL use_ellipses = FALSE, + BOOL use_color = FALSE) const; S32 render(const LLWString &text, S32 begin_offset, const LLRectf& rect, @@ -107,7 +108,8 @@ public: U8 style = NORMAL, ShadowType shadow = NO_SHADOW, S32 max_chars = S32_MAX, F32* right_x=NULL, - BOOL use_ellipses = FALSE) const; + BOOL use_ellipses = FALSE, + BOOL use_color = FALSE) const; S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, @@ -116,12 +118,13 @@ public: U8 style = NORMAL, ShadowType shadow = NO_SHADOW, S32 max_chars = S32_MAX, S32 max_pixels = S32_MAX, F32* right_x=NULL, - BOOL use_ellipses = FALSE) const; + BOOL use_ellipses = FALSE, + BOOL use_color = FALSE) const; S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color) const; // renderUTF8 does a conversion, so is slower! - S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses) const; + S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const; S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const; S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const; diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 0510e472c5..0c1c3c40ec 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -826,7 +826,7 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y // font->renderUTF8(mLabel, 0, x, y, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, TRUE); + S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/TRUE, /*use_color*/FALSE); } void LLFolderViewItem::draw() @@ -905,7 +905,7 @@ void LLFolderViewItem::draw() { font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, &right_x, FALSE ); + S32_MAX, S32_MAX, &right_x, /*use_ellipses*/FALSE, /*use_color*/FALSE ); } //--------------------------------------------------------------------------------// @@ -917,7 +917,7 @@ void LLFolderViewItem::draw() F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD; font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - filter_string_length, S32_MAX, &right_x, FALSE ); + filter_string_length, S32_MAX, &right_x, /*use_ellipses*/FALSE, /*use_color*/FALSE ); } //Gilbert Linden 9-20-2012: Although this should be legal, removing it because it causes the mLabelSuffix rendering to diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index a23741b6dd..64b3a0ddcc 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -163,6 +163,7 @@ LLTextBase::Params::Params() wrap("wrap"), trusted_content("trusted_content", true), use_ellipses("use_ellipses", false), + use_color("use_color", false), parse_urls("parse_urls", false), force_urls_external("force_urls_external", false), parse_highlights("parse_highlights", false) @@ -217,6 +218,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mPlainText ( p.plain_text ), mWordWrap(p.wrap), mUseEllipses( p.use_ellipses ), + mUseColor(p.use_color), mParseHTML(p.parse_urls), mForceUrlsExternal(p.force_urls_external), mParseHighlights(p.parse_highlights), @@ -3198,7 +3200,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele mStyle->getShadowType(), length, &right_x, - mEditor.getUseEllipses()); + mEditor.getUseEllipses(), + mEditor.getUseColor()); } rect.mLeft = right_x; @@ -3217,7 +3220,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele LLFontGL::NO_SHADOW, length, &right_x, - mEditor.getUseEllipses()); + mEditor.getUseEllipses(), + mEditor.getUseColor()); } rect.mLeft = right_x; if( selection_end < seg_end ) @@ -3234,7 +3238,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele mStyle->getShadowType(), length, &right_x, - mEditor.getUseEllipses()); + mEditor.getUseEllipses(), + mEditor.getUseColor()); } return right_x; } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 9831c35858..6f1e178e36 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -314,6 +314,7 @@ public: plain_text, wrap, use_ellipses, + use_color, parse_urls, force_urls_external, parse_highlights, @@ -389,6 +390,7 @@ public: // used by LLTextSegment layout code bool getWordWrap() { return mWordWrap; } bool getUseEllipses() { return mUseEllipses; } + bool getUseColor() { return mUseColor; } bool truncate(); // returns true of truncation occurred bool isContentTrusted() {return mTrustedContent;} @@ -681,6 +683,7 @@ protected: bool mParseHighlights; // highlight user-defined keywords bool mWordWrap; bool mUseEllipses; + bool mUseColor; bool mTrackEnd; // if true, keeps scroll position at end of document during resize bool mReadOnly; bool mBGVisible; // render background? diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 89ad8138d8..40537e6c4a 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1282,7 +1282,7 @@ void LLView::drawDebugRect() debug_rect.getWidth(), debug_rect.getHeight()); LLFontGL::getFontSansSerifSmall()->renderUTF8(debug_text, 0, (F32)x, (F32)y, border_color, LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, NULL, FALSE); + S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); } } LLUI::popMatrix(); diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index d657f04457..a03b84daa5 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -88,7 +88,7 @@ public: mStyle->getShadowType(), end - start, draw_rect.getWidth(), &right_x, - mEditor.getUseEllipses()); + mEditor.getUseEllipses(), mEditor.getUseColor()); return right_x; } /*virtual*/ bool canEdit() const { return false; } diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index db5a192287..211371571d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1601,7 +1601,7 @@ void LLOverlapPanel::draw() LLUI::translate(5,getRect().getHeight()-20); // translate to top-5,left-5 LLView::sDrawPreviewHighlights = FALSE; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); } else { @@ -1619,7 +1619,7 @@ void LLOverlapPanel::draw() std::string current_selection = std::string(current_selection_text + LLView::sPreviewClickedElement->getName() + " (no elements overlap)"); S32 text_width = LLFontGL::getFontSansSerifSmall()->getWidth(current_selection) + 10; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); // widen panel enough to fit this text LLRect rect = getRect(); setRect(LLRect(rect.mLeft,rect.mTop,rect.getWidth() < text_width ? rect.mLeft + text_width : rect.mRight,rect.mTop)); @@ -1685,7 +1685,7 @@ void LLOverlapPanel::draw() // draw currently-selected element at top of overlappers LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text + LLView::sPreviewClickedElement->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); LLUI::translate(0,-mSpacing-LLView::sPreviewClickedElement->getRect().getHeight()); // skip spacing distance + height LLView::sPreviewClickedElement->draw(); @@ -1700,7 +1700,7 @@ void LLOverlapPanel::draw() // draw name LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(overlapper_text + viewp->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); // draw element LLUI::translate(0,-mSpacing-viewp->getRect().getHeight()); // skip spacing distance + height diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 0d2edc0268..9ec6b99416 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -612,7 +612,7 @@ void LLGLTexMemBar::draw() LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, text_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, - &x_right, FALSE); + &x_right, /*use_ellipses*/FALSE, /*use_color*/FALSE); F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c3cf07e9c7..e4d445b95c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -867,7 +867,7 @@ public: const Line& line = *iter; LLFontGL::getFontMonospace()->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor, LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); } mLineList.clear(); } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 86249badaa..ff1f95526e 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -469,7 +469,8 @@ void LLWorldMapView::draw() S32_MAX, //max_chars sMapScale, //max_pixels NULL, - TRUE); //use ellipses + /*use_ellipses*/TRUE, + /*use_color*/FALSE); } } } -- cgit v1.2.3 From 5a6ddb2ea666e895890d3cb690cce5101cf12652 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Nov 2019 17:15:21 +0100 Subject: Fallback fonts can have first crack at adding an unknown character + set Twemoji as the viewer's fallback for all emoji blocks --- autobuild.xml | 90 ++++++++++++++++ indra/cmake/CMakeLists.txt | 2 + indra/cmake/FindICU4C.cmake | 33 ++++++ indra/cmake/ICU4C.cmake | 22 ++++ indra/llcommon/CMakeLists.txt | 2 + indra/llcommon/llstring.cpp | 26 +++++ indra/llcommon/llstring.h | 2 + indra/llrender/llfontfreetype.cpp | 42 +++++--- indra/llrender/llfontfreetype.h | 12 +-- indra/llrender/llfontgl.cpp | 4 +- indra/llrender/llfontgl.h | 2 +- indra/llrender/llfontregistry.cpp | 150 +++++++++++++++------------ indra/llrender/llfontregistry.h | 42 ++++++-- indra/newview/CMakeLists.txt | 2 + indra/newview/skins/default/xui/en/fonts.xml | 1 + indra/win_crash_logger/CMakeLists.txt | 2 + 16 files changed, 333 insertions(+), 101 deletions(-) create mode 100644 indra/cmake/FindICU4C.cmake create mode 100644 indra/cmake/ICU4C.cmake diff --git a/autobuild.xml b/autobuild.xml index 8bd6491edd..131c7614c0 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1519,6 +1519,96 @@ version 2012.1-2 + icu4c + + copyright + Copyright (c) 1995-2011 International Business Machines Corporation and others <http://source.icu-project.org> + description + ICU is a mature, widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications. ICU is widely portable and gives applications the same results on all platforms and between C/C++ and Java software. + license + ICU, permissive non-copyleft free software license + license_file + LICENSES/icu.txt + name + icu4c + platforms + + darwin + + archive + + hash + 910edfc0b936389bc8804c42d1008aa8 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/icu4c_3p-update-icu4c/rev/295486/arch/Darwin/installer/icu4c-4.8.1-darwin-295486.tar.bz2 + + name + windows64 + + darwin64 + + archive + + hash + 2c34cb4e62d1f155d5dad798e69d03c8 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/466/1005/icu4c-4.8.1-darwin64-500388.tar.bz2 + + name + windows64 + + linux + + archive + + hash + 0a4423cfd26409f33ae81fb9806a9972 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-icu4c/rev/314152/arch/Linux/installer/icu4c-4.8.1-linux-314152.tar.bz2 + + name + windows64 + + linux64 + + archive + + hash + b327031733c36efe2eee4582aefb2d66 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/462/995/icu4c-4.8.1-linux64-500388.tar.bz2 + + name + windows64 + + windows + + archive + + hash + af354f6ab6d2cecf266c79031977e3e0 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/492/1078/icu4c-4.8.1-windows-500388.tar.bz2 + + name + windows64 + + windows64 + + archive + + hash + e8b20cea748b90ea18bb63dfba06e059 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/491/1075/icu4c-4.8.1-windows64-500388.tar.bz2 + + name + windows64 + + + version + 4.8.1 + jpeglib copyright diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 84e1c5d6fd..d64c38b1b3 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -32,6 +32,7 @@ set(cmake_SOURCE_FILES FindGLH.cmake FindGoogleBreakpad.cmake FindHUNSPELL.cmake + FindICU4C.cmake FindJsonCpp.cmake FindNDOF.cmake FindOpenJPEG.cmake @@ -49,6 +50,7 @@ set(cmake_SOURCE_FILES GoogleMock.cmake Havok.cmake Hunspell.cmake + ICU4C.cmake JPEG.cmake JsonCpp.cmake LLAddBuildTest.cmake diff --git a/indra/cmake/FindICU4C.cmake b/indra/cmake/FindICU4C.cmake new file mode 100644 index 0000000000..327d761a88 --- /dev/null +++ b/indra/cmake/FindICU4C.cmake @@ -0,0 +1,33 @@ +# -*- cmake -*- + +# - Find ICU4C +# This module defines +# ICU4C_INCLUDE_DIR, where to find headers +# ICU4C_LIBRARY, the library needed to use ICU4C. +# ICU4C_FOUND, If false, do not try to use ICU4C. + +find_path(ICU4C_INCLUDE_DIR uchar.h + PATH_SUFFIXES unicode + ) + +set(ICU4C_NAMES ${ICU4C_NAMES} icuuc) +find_library(ICU4C_LIBRARY + NAMES ${ICU4C_NAMES} + ) + +if (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) + set(ICU4C_FOUND "YES") +else (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) + set(ICU4C_FOUND "NO") +endif (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) + +if (ICU4C_FOUND) + message(STATUS "Found ICU4C: Library in '${ICU4C_LIBRARY}' and header in '${ICU4C_INCLUDE_DIR}' ") +else (ICU4C_FOUND) + message(FATAL_ERROR " * * *\nCould not find ICU4C library! * * *") +endif (ICU4C_FOUND) + +mark_as_advanced( + ICU4C_LIBRARY + ICU4C_INCLUDE_DIR + ) diff --git a/indra/cmake/ICU4C.cmake b/indra/cmake/ICU4C.cmake new file mode 100644 index 0000000000..007a9b6937 --- /dev/null +++ b/indra/cmake/ICU4C.cmake @@ -0,0 +1,22 @@ +# -*- cmake -*- +include(Prebuilt) + +set(ICU4C_FIND_QUIETLY ON) +set(ICU4C_FIND_REQUIRED ON) + +if (USESYSTEMLIBS) + include(FindICU4C) +else (USESYSTEMLIBS) + use_prebuilt_binary(icu4c) + if (WINDOWS) + set(ICU4C_LIBRARY icuuc) + #elseif(DARWIN) + # set(ICU4C_LIBRARY ...) + #elseif(LINUX) + # set(ICU4C_LIBRARY ...) + else() + message(FATAL_ERROR "Invalid platform") + endif() + set(ICU4C_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/unicode) + use_prebuilt_binary(dictionaries) +endif (USESYSTEMLIBS) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index af41b9e460..ba87d93fec 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -4,6 +4,7 @@ project(llcommon) include(00-Common) +include(ICU4C) include(LLCommon) include(Linking) include(Boost) @@ -288,6 +289,7 @@ target_link_libraries( ${APRUTIL_LIBRARIES} ${APR_LIBRARIES} ${EXPAT_LIBRARIES} + ${ICU4C_LIBRARY} ${JSONCPP_LIBRARIES} ${ZLIB_LIBRARIES} ${WINDOWS_LIBRARIES} diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 0174c411b4..b272728200 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -30,6 +30,7 @@ #include "llerror.h" #include "llfasttimer.h" #include "llsd.h" +#include #include #if LL_WINDOWS @@ -888,6 +889,31 @@ std::string LLStringOps::sDayFormat; std::string LLStringOps::sAM; std::string LLStringOps::sPM; +// static +bool LLStringOps::isEmoji(llwchar wch) +{ + switch (ublock_getCode(wch)) + { + case UBLOCK_MISCELLANEOUS_SYMBOLS: + case UBLOCK_DINGBATS: + case UBLOCK_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS: + case UBLOCK_EMOTICONS: + case UBLOCK_TRANSPORT_AND_MAP_SYMBOLS: +#if U_ICU_VERSION_MAJOR_NUM > 56 + // Boost uses ICU so we can't update it independently + case UBLOCK_SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS: +#endif // U_ICU_VERSION_MAJOR_NUM > 56 + return true; + default: +#if U_ICU_VERSION_MAJOR_NUM > 56 + return false; +#else + // See https://en.wikipedia.org/wiki/Supplemental_Symbols_and_Pictographs + return wch >= 0x1F900 && wch <= 0x1F9FF; +#endif // U_ICU_VERSION_MAJOR_NUM > 56 + } +} + S32 LLStringOps::collate(const llwchar* a, const llwchar* b) { diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index b619a9e48c..d31d0cafc7 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -193,6 +193,8 @@ public: static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; } static bool isAlnum(llwchar a) { return iswalnum(a) != 0; } + static bool isEmoji(llwchar wch); + static S32 collate(const char* a, const char* b) { return strcoll(a, b); } static S32 collate(const llwchar* a, const llwchar* b); diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 7d66965e57..25740a5f87 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -175,7 +175,7 @@ void ft_close_cb(FT_Stream stream) { } #endif -BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n) +BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n) { // Don't leak face objects. This is also needed to deal with // changed font file names. @@ -345,14 +345,11 @@ void LLFontFreetype::clearFontStreams() } #endif -void LLFontFreetype::setFallbackFonts(const font_vector_t &font) +void LLFontFreetype::addFallbackFont(const LLPointer& fallback_font, const char_functor_t& functor) { - mFallbackFonts = font; -} - -const LLFontFreetype::font_vector_t &LLFontFreetype::getFallbackFonts() const -{ - return mFallbackFonts; + // Insert functor fallbacks before generic fallbacks + mFallbackFonts.insert((functor) ? std::find_if(mFallbackFonts.begin(), mFallbackFonts.end(), [](const fallback_font_t& fe) { return !fe.second; }) : mFallbackFonts.end(), + std::make_pair(fallback_font, functor)); } F32 LLFontFreetype::getLineHeight() const @@ -453,18 +450,31 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type FT_UInt glyph_index; + // Fallback fonts with a functor have precedence over everything else + fallback_font_vector_t::const_iterator it_fallback = mFallbackFonts.cbegin(); + for (; it_fallback != mFallbackFonts.cend() && it_fallback->second; ++it_fallback) + { + if (it_fallback->second(wch)) + { + glyph_index = FT_Get_Char_Index(it_fallback->first->mFTFace, wch); + if (glyph_index) + { + return addGlyphFromFont(it_fallback->first, wch, glyph_index, glyph_type); + } + } + } + // Initialize char to glyph map glyph_index = FT_Get_Char_Index(mFTFace, wch); if (glyph_index == 0) { //LL_INFOS() << "Trying to add glyph from fallback font!" << LL_ENDL; - font_vector_t::const_iterator iter; - for(iter = mFallbackFonts.begin(); iter != mFallbackFonts.end(); iter++) + for (; it_fallback != mFallbackFonts.cend(); ++it_fallback) { - glyph_index = FT_Get_Char_Index((*iter)->mFTFace, wch); + glyph_index = FT_Get_Char_Index(it_fallback->first->mFTFace, wch); if (glyph_index) { - return addGlyphFromFont(*iter, wch, glyph_index, glyph_type); + return addGlyphFromFont(it_fallback->first, wch, glyph_index, glyph_type); } } } @@ -653,7 +663,7 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) co void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi) { resetBitmapCache(); - loadFace(mName, mPointSize, vert_dpi ,horz_dpi, true, mIsFallback, 0); + loadFace(mName, mPointSize, vert_dpi ,horz_dpi, mIsFallback, 0); if (!mIsFallback) { // This is the head of the list - need to rebuild ourself and all fallbacks. @@ -663,11 +673,9 @@ void LLFontFreetype::reset(F32 vert_dpi, F32 horz_dpi) } else { - for(font_vector_t::iterator it = mFallbackFonts.begin(); - it != mFallbackFonts.end(); - ++it) + for (fallback_font_vector_t::iterator it = mFallbackFonts.begin(); it != mFallbackFonts.end(); ++it) { - (*it)->reset(vert_dpi, horz_dpi); + it->first->reset(vert_dpi, horz_dpi); } } } diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 8c2d2bc491..8afc5e3ed5 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -86,7 +86,7 @@ public: // is_fallback should be true for fallback fonts that aren't used // to render directly (Unicode backup, primarily) - BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n); + BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n); S32 getNumFaces(const std::string& filename); @@ -95,10 +95,8 @@ public: void clearFontStreams(); #endif - typedef std::vector > font_vector_t; - - void setFallbackFonts(const font_vector_t &font); - const font_vector_t &getFallbackFonts() const; + typedef std::function char_functor_t; + void addFallbackFont(const LLPointer& fallback_font, const char_functor_t& functor = nullptr); // Global font metrics - in units of pixels F32 getLineHeight() const; @@ -178,7 +176,9 @@ private: #endif BOOL mIsFallback; - font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars) + typedef std::pair, char_functor_t> fallback_font_t; + typedef std::vector fallback_font_vector_t; + fallback_font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars) // *NOTE: the same glyph can be present with multiple representations (but the pointer is always unique) typedef boost::unordered_multimap char_glyph_info_map_t; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 78017ecb3d..4770f79395 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -89,14 +89,14 @@ void LLFontGL::destroyGL() mFontFreetype->destroyGL(); } -BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n) +BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n) { if(mFontFreetype == reinterpret_cast(NULL)) { mFontFreetype = new LLFontFreetype; } - return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, use_color, is_fallback, face_n); + return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, is_fallback, face_n); } S32 LLFontGL::getNumFaces(const std::string& filename) diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 68bf5db668..a60feb87cb 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -87,7 +87,7 @@ public: void destroyGL(); - BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool use_color, bool is_fallback, S32 face_n); + BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, bool is_fallback, S32 face_n); S32 getNumFaces(const std::string& filename); diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 426b10b016..ac2b695a3e 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -46,6 +46,10 @@ bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node); const std::string MACOSX_FONT_PATH_LIBRARY = "/Library/Fonts/"; +LLFontDescriptor::char_functor_map_t LLFontDescriptor::mCharFunctors({ + { "is_emoji", LLStringOps::isEmoji } +}); + LLFontDescriptor::LLFontDescriptor(): mStyle(0) { @@ -54,22 +58,22 @@ LLFontDescriptor::LLFontDescriptor(): LLFontDescriptor::LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, - const string_vec_t& file_names): + const font_file_info_vec_t& font_files): mName(name), mSize(size), mStyle(style), - mFileNames(file_names) + mFontFiles(font_files) { } LLFontDescriptor::LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, - const string_vec_t& file_names, - const string_vec_t& ft_collection_listections) : - LLFontDescriptor(name, size, style, file_names) + const font_file_info_vec_t& font_list, + const font_file_info_vec_t& font_collection_files) : + LLFontDescriptor(name, size, style, font_list) { - mFontCollectionsList = ft_collection_listections; + mFontCollectionFiles = font_collection_files; } LLFontDescriptor::LLFontDescriptor(const std::string& name, @@ -81,7 +85,6 @@ LLFontDescriptor::LLFontDescriptor(const std::string& name, { } - bool LLFontDescriptor::operator<(const LLFontDescriptor& b) const { if (mName < b.mName) @@ -174,7 +177,19 @@ LLFontDescriptor LLFontDescriptor::normalize() const if (removeSubString(new_name,"Italic")) new_style |= LLFontGL::ITALIC; - return LLFontDescriptor(new_name,new_size,new_style,getFileNames(),getFontCollectionsList()); + return LLFontDescriptor(new_name,new_size,new_style, getFontFiles(), getFontCollectionFiles()); +} + +void LLFontDescriptor::addFontFile(const std::string& file_name, const std::string& char_functor) +{ + char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor); + mFontFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr)); +} + +void LLFontDescriptor::addFontCollectionFile(const std::string& file_name, const std::string& char_functor) +{ + char_functor_map_t::const_iterator it = mCharFunctors.find(char_functor); + mFontCollectionFiles.push_back(LLFontFileInfo(file_name, (mCharFunctors.end() != it) ? it->second : nullptr)); } LLFontRegistry::LLFontRegistry(bool create_gl_textures) @@ -272,17 +287,24 @@ bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc) if (child->hasName("file")) { std::string font_file_name = child->getTextContents(); - desc.getFileNames().push_back(font_file_name); - + std::string char_functor; + + if (child->hasAttribute("functor")) + { + child->getAttributeString("functor", char_functor); + } + if (child->hasAttribute("load_collection")) { BOOL col = FALSE; child->getAttributeBOOL("load_collection", col); if (col) { - desc.getFontCollectionsList().push_back(font_file_name); + desc.addFontCollectionFile(font_file_name, char_functor); } } + + desc.addFontFile(font_file_name, char_functor); } else if (child->hasName("os")) { @@ -325,19 +347,19 @@ bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node) // A little roundabout because the map key is const, // so we have to fetch it, make a new map key, and // replace the old entry. - string_vec_t match_file_names = match_desc->getFileNames(); - match_file_names.insert(match_file_names.begin(), - desc.getFileNames().begin(), - desc.getFileNames().end()); + font_file_info_vec_t font_files = match_desc->getFontFiles(); + font_files.insert(font_files.begin(), + desc.getFontFiles().begin(), + desc.getFontFiles().end()); - string_vec_t collections_list = match_desc->getFontCollectionsList(); - collections_list.insert(collections_list.begin(), - desc.getFontCollectionsList().begin(), - desc.getFontCollectionsList().end()); + font_file_info_vec_t font_collection_files = match_desc->getFontCollectionFiles(); + font_collection_files.insert(font_collection_files.begin(), + desc.getFontCollectionFiles().begin(), + desc.getFontCollectionFiles().end()); LLFontDescriptor new_desc = *match_desc; - new_desc.getFileNames() = match_file_names; - new_desc.getFontCollectionsList() = collections_list; + new_desc.setFontFiles(font_files); + new_desc.setFontCollectionFiles(font_collection_files); registry->mFontMap.erase(*match_desc); registry->mFontMap[new_desc] = NULL; } @@ -422,80 +444,78 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) // Build list of font names to look for. // Files specified for this font come first, followed by those from the default descriptor. - string_vec_t file_names = match_desc->getFileNames(); - string_vec_t ft_collection_list = match_desc->getFontCollectionsList(); - string_vec_t default_file_names; + font_file_info_vec_t font_files = match_desc->getFontFiles(); + font_file_info_vec_t font_collection_files = match_desc->getFontCollectionFiles(); LLFontDescriptor default_desc("default",s_template_string,0); const LLFontDescriptor *match_default_desc = getMatchingFontDesc(default_desc); if (match_default_desc) { - file_names.insert(file_names.end(), - match_default_desc->getFileNames().begin(), - match_default_desc->getFileNames().end()); - ft_collection_list.insert(ft_collection_list.end(), - match_default_desc->getFontCollectionsList().begin(), - match_default_desc->getFontCollectionsList().end()); + font_files.insert(font_files.end(), + match_default_desc->getFontFiles().begin(), + match_default_desc->getFontFiles().end()); + font_collection_files.insert(font_collection_files.end(), + match_default_desc->getFontCollectionFiles().begin(), + match_default_desc->getFontCollectionFiles().end()); } // Add ultimate fallback list - generated dynamically on linux, // null elsewhere. - file_names.insert(file_names.end(), - getUltimateFallbackList().begin(), - getUltimateFallbackList().end()); + std::transform(getUltimateFallbackList().begin(), getUltimateFallbackList().end(), std::back_inserter(font_files), + [](const std::string& file_name) { return LLFontFileInfo(file_name); }); // Load fonts based on names. - if (file_names.empty()) + if (font_files.empty()) { LL_WARNS() << "createFont failed, no file names specified" << LL_ENDL; return NULL; } - LLFontFreetype::font_vector_t fontlist; LLFontGL *result = NULL; - // Snarf all fonts we can into fontlist. First will get pulled - // off the list and become the "head" font, set to non-fallback. + // The first font will get pulled will be the "head" font, set to non-fallback. // Rest will consitute the fallback list. BOOL is_first_found = TRUE; - std::string local_path = LLFontGL::getFontPathLocal(); - std::string sys_path = LLFontGL::getFontPathSystem(); - + string_vec_t font_search_paths; + font_search_paths.push_back(LLFontGL::getFontPathLocal()); + font_search_paths.push_back(LLFontGL::getFontPathSystem()); +#if LL_DARWIN + font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY); +#endif + // The fontname string may contain multiple font file names separated by semicolons. // Break it apart and try loading each one, in order. - for(string_vec_t::iterator file_name_it = file_names.begin(); - file_name_it != file_names.end(); - ++file_name_it) + for(font_file_info_vec_t::iterator font_file_it = font_files.begin(); + font_file_it != font_files.end(); + ++font_file_it) { LLFontGL *fontp = NULL; - string_vec_t font_paths; - font_paths.push_back(local_path + *file_name_it); - font_paths.push_back(sys_path + *file_name_it); -#if LL_DARWIN - font_paths.push_back(MACOSX_FONT_PATH_LIBRARY + *file_name_it); -#endif - - bool is_ft_collection = (std::find(ft_collection_list.begin(), ft_collection_list.end(), *file_name_it) != ft_collection_list.end()); + + bool is_ft_collection = (std::find_if(font_collection_files.begin(), font_collection_files.end(), + [&font_file_it](const LLFontFileInfo& ffi) { return font_file_it->FileName == ffi.FileName; }) != font_collection_files.end()); + // *HACK: Fallback fonts don't render, so we can use that to suppress // creation of OpenGL textures for test apps. JC BOOL is_fallback = !is_first_found || !mCreateGLTextures; F32 extra_scale = (is_fallback)?fallback_scale:1.0; F32 point_size_scale = extra_scale * point_size; bool is_font_loaded = false; - for(string_vec_t::iterator font_paths_it = font_paths.begin(); - font_paths_it != font_paths.end(); - ++font_paths_it) + for(string_vec_t::iterator font_search_path_it = font_search_paths.begin(); + font_search_path_it != font_search_paths.end(); + ++font_search_path_it) { + const std::string font_path = *font_search_path_it + font_file_it->FileName; + fontp = new LLFontGL; - S32 num_faces = is_ft_collection ? fontp->getNumFaces(*font_paths_it) : 1; + S32 num_faces = is_ft_collection ? fontp->getNumFaces(font_path) : 1; for (S32 i = 0; i < num_faces; i++) { if (fontp == NULL) { fontp = new LLFontGL; } - if (fontp->loadFace(*font_paths_it, point_size_scale, - LLFontGL::sVertDPI, LLFontGL::sHorizDPI, true, is_fallback, i)) + if (fontp->loadFace(font_path, point_size_scale, + LLFontGL::sVertDPI, LLFontGL::sHorizDPI, is_fallback, i)) { is_font_loaded = true; if (is_first_found) @@ -505,7 +525,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) } else { - fontlist.push_back(fontp->mFontFreetype); + result->mFontFreetype->addFallbackFont(fontp->mFontFreetype, font_file_it->CharFunctor); + delete fontp; fontp = NULL; } @@ -520,17 +541,12 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) } if(!is_font_loaded) { - LL_INFOS_ONCE("LLFontRegistry") << "Couldn't load font " << *file_name_it << LL_ENDL; + LL_INFOS_ONCE("LLFontRegistry") << "Couldn't load font " << font_file_it->FileName << LL_ENDL; delete fontp; fontp = NULL; } } - if (result && !fontlist.empty()) - { - result->mFontFreetype->setFallbackFonts(fontlist); - } - if (result) { result->mFontDescriptor = desc; @@ -712,11 +728,11 @@ void LLFontRegistry::dump() << " size=[" << desc.getSize() << "]" << " fileNames=" << LL_ENDL; - for (string_vec_t::const_iterator file_it=desc.getFileNames().begin(); - file_it != desc.getFileNames().end(); + for (font_file_info_vec_t::const_iterator file_it=desc.getFontFiles().begin(); + file_it != desc.getFontFiles().end(); ++file_it) { - LL_INFOS() << " file: " << *file_it <FileName << LL_ENDL; } } } diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h index b1259ef4e7..b0ef72c5de 100644 --- a/indra/llrender/llfontregistry.h +++ b/indra/llrender/llfontregistry.h @@ -34,13 +34,32 @@ class LLFontGL; typedef std::vector string_vec_t; +struct LLFontFileInfo +{ + LLFontFileInfo(const std::string& file_name, const std::function& char_functor = nullptr) + : FileName(file_name) + , CharFunctor(char_functor) + { + } + + LLFontFileInfo(const LLFontFileInfo& ffi) + : FileName(ffi.FileName) + , CharFunctor(ffi.CharFunctor) + { + } + + std::string FileName; + std::function CharFunctor; +}; +typedef std::vector font_file_info_vec_t; + class LLFontDescriptor { public: LLFontDescriptor(); LLFontDescriptor(const std::string& name, const std::string& size, const U8 style); - LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const string_vec_t& file_names); - LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const string_vec_t& file_names, const string_vec_t& font_collections); + LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const font_file_info_vec_t& font_list); + LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const font_file_info_vec_t& font_list, const font_file_info_vec_t& font_collection_list); LLFontDescriptor normalize() const; bool operator<(const LLFontDescriptor& b) const; @@ -51,19 +70,26 @@ public: void setName(const std::string& name) { mName = name; } const std::string& getSize() const { return mSize; } void setSize(const std::string& size) { mSize = size; } - const std::vector& getFileNames() const { return mFileNames; } - std::vector& getFileNames() { return mFileNames; } - const std::vector& getFontCollectionsList() const { return mFontCollectionsList; } - std::vector& getFontCollectionsList() { return mFontCollectionsList; } + + void addFontFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null); + const font_file_info_vec_t & getFontFiles() const { return mFontFiles; } + void setFontFiles(const font_file_info_vec_t& font_files) { mFontFiles = font_files; } + void addFontCollectionFile(const std::string& file_name, const std::string& char_functor = LLStringUtil::null); + const font_file_info_vec_t& getFontCollectionFiles() const { return mFontCollectionFiles; } + void setFontCollectionFiles(const font_file_info_vec_t& font_collection_files) { mFontCollectionFiles = font_collection_files; } + const U8 getStyle() const { return mStyle; } void setStyle(U8 style) { mStyle = style; } private: std::string mName; std::string mSize; - string_vec_t mFileNames; - string_vec_t mFontCollectionsList; + font_file_info_vec_t mFontFiles; + font_file_info_vec_t mFontCollectionFiles; U8 mStyle; + + typedef std::map> char_functor_map_t; + static char_functor_map_t mCharFunctors; }; class LLFontRegistry diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b83d3afadd..f03dcb4066 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -21,6 +21,7 @@ include(EXPAT) include(FMODEX) include(GLOD) include(Hunspell) +include(ICU4C) include(JsonCpp) include(LLAppearance) include(LLAudio) @@ -2003,6 +2004,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${NDOF_LIBRARY} ${NVAPI_LIBRARY} ${HUNSPELL_LIBRARY} + ${ICU4C_LIBRARY} ${viewer_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 2d5263b78f..6df666a700 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -3,6 +3,7 @@ DejaVuSans.ttf + Twemoji.ttf meiryo.TTC MSGOTHIC.TTC diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt index 4fba26ab2f..d1de20a6a0 100644 --- a/indra/win_crash_logger/CMakeLists.txt +++ b/indra/win_crash_logger/CMakeLists.txt @@ -3,6 +3,7 @@ project(win_crash_logger) include(00-Common) +include(ICU4C) include(LLCommon) include(LLCoreHttp) include(LLCrashLogger) @@ -74,6 +75,7 @@ add_executable(windows-crash-logger WIN32 ${win_crash_logger_SOURCE_FILES}) target_link_libraries(windows-crash-logger ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} + ${ICU4C_LIBRARY} ${LLCRASHLOGGER_LIBRARIES} ${LLWINDOW_LIBRARIES} ${LLVFS_LIBRARIES} -- cgit v1.2.3 From b44ade68e6eea656dc0e31738f9603caffe4d659 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Nov 2019 20:33:53 +0100 Subject: FIXED Calling LLTextBase::insertStringNoUndo() with more than one segment results in overlapping segment ranges Text is only inserted into the view model *after* the segments are added so if seg1_pos_start is the current EOF: -> 1st segment: getSegIterContaining(seg1_pos_start) returns the last segment and insertSegment() ends up properly adjusting its start/end position -> 2nd segment: getSegIterContaining(seg2_pos_start) returns mSegments.end() since its position is beyond the available and insertSegment() leaves the last 2 segments with overlapping ranges After the fix: -> if index runs past the end of all segments then mSegments.end() is returned (no change) -> if index is a position past the length of text but claimed by a segment then that segment is returned (change) -> if index specifies a position in the middle of the document unclaimed by any segment then the first segment after that position is returned (no change) (this does break the assertion that segment->mStart <= index <= segment->mEnd?) --- indra/llui/lltextbase.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 64b3a0ddcc..ecceb289f0 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1889,8 +1889,6 @@ LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index) text_len = mLabel.getWString().length(); } - if (index > text_len) { return mSegments.end(); } - // when there are no segments, we return the end iterator, which must be checked by caller if (mSegments.size() <= 1) { return mSegments.begin(); } @@ -1914,8 +1912,6 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i text_len = mLabel.getWString().length(); } - if (index > text_len) { return mSegments.end(); } - // when there are no segments, we return the end iterator, which must be checked by caller if (mSegments.size() <= 1) { return mSegments.begin(); } -- cgit v1.2.3 From d58b530e805e2b3c943b1ff446ac84a10c500b32 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Nov 2019 20:48:20 +0100 Subject: Add text_valign to LLTextBase to specify the vertical alignment within a single document line The existing font_valign property is used as to position the entire document so it's impossible to top align a text editor with each line's text centered within that line's extents --- indra/llui/lltextbase.cpp | 10 ++++++---- indra/llui/lltextbase.h | 7 +++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index ecceb289f0..cc44f46706 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -160,6 +160,7 @@ LLTextBase::Params::Params() line_spacing("line_spacing"), max_text_length("max_length", 255), font_shadow("font_shadow"), + text_valign("text_valign"), wrap("wrap"), trusted_content("trusted_content", true), use_ellipses("use_ellipses", false), @@ -205,6 +206,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mVPad(p.v_pad), mHAlign(p.font_halign), mVAlign(p.font_valign), + mTextVAlign(p.text_valign.isProvided() ? p.text_valign : p.font_valign), mLineSpacingMult(p.line_spacing.multiple), mLineSpacingPixels(p.line_spacing.pixels), mClip(p.clip), @@ -515,7 +517,7 @@ void LLTextBase::drawCursor() fontp = segmentp->getStyle()->getFont(); fontp->render(text, mCursorPos, cursor_rect, LLColor4(1.f - text_color.mV[VRED], 1.f - text_color.mV[VGREEN], 1.f - text_color.mV[VBLUE], alpha), - LLFontGL::LEFT, mVAlign, + LLFontGL::LEFT, mTextVAlign, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 1); @@ -3191,7 +3193,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele font->render(text, start, rect, color, - LLFontGL::LEFT, mEditor.mVAlign, + LLFontGL::LEFT, mEditor.mTextVAlign, LLFontGL::NORMAL, mStyle->getShadowType(), length, @@ -3211,7 +3213,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele font->render(text, start, rect, mStyle->getSelectedColor().get(), - LLFontGL::LEFT, mEditor.mVAlign, + LLFontGL::LEFT, mEditor.mTextVAlign, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, length, @@ -3229,7 +3231,7 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele font->render(text, start, rect, color, - LLFontGL::LEFT, mEditor.mVAlign, + LLFontGL::LEFT, mEditor.mTextVAlign, LLFontGL::NORMAL, mStyle->getShadowType(), length, diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 6f1e178e36..99c243a346 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -333,6 +333,8 @@ public: Optional font_shadow; + Optional text_valign; + Params(); }; @@ -673,8 +675,9 @@ protected: // configuration S32 mHPad; // padding on left of text S32 mVPad; // padding above text - LLFontGL::HAlign mHAlign; - LLFontGL::VAlign mVAlign; + LLFontGL::HAlign mHAlign; // horizontal alignment of the document in its entirety + LLFontGL::VAlign mVAlign; // vertical alignment of the document in its entirety + LLFontGL::VAlign mTextVAlign; // vertical alignment of a text segment within a single line of text F32 mLineSpacingMult; // multiple of line height used as space for a single line of text (e.g. 1.5 to get 50% padding) S32 mLineSpacingPixels; // padding between lines bool mBorderVisible; -- cgit v1.2.3 From bab70f6f152952ce755188d29bea1cfd8821a4be Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 29 Aug 2022 00:00:31 +0200 Subject: Review + resolve minor issues --- autobuild.xml | 8 ++++---- indra/llrender/llfontbitmapcache.cpp | 29 +++++++++++------------------ indra/llrender/llfontbitmapcache.h | 12 ++++++------ indra/llrender/llfontregistry.cpp | 4 ++-- indra/llui/lltextbase.cpp | 2 +- indra/newview/viewer_manifest.py | 2 +- 6 files changed, 25 insertions(+), 32 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index ac7459ddca..babc7d73bc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -958,9 +958,9 @@ archive hash - aa8be83cdfcd5cda0343ea72e7d662ca + f3e63d80bd80da03aa7f87f7bd7c5f8b url - freetype-2.10.1.0-windows64-72.tar.bz2 + freetype-2.10.1.0-windows64-222392239.tar.bz2 name windows64 @@ -1510,9 +1510,9 @@ archive hash - e8b20cea748b90ea18bb63dfba06e059 + 340980c10153446b678625ec7af047c2 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/491/1075/icu4c-4.8.1-windows64-500388.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55243/513658/icu4c-4.8.1-windows64-539138.tar.bz2 name windows64 diff --git a/indra/llrender/llfontbitmapcache.cpp b/indra/llrender/llfontbitmapcache.cpp index 754adb14cb..2d65ec47c6 100644 --- a/indra/llrender/llfontbitmapcache.cpp +++ b/indra/llrender/llfontbitmapcache.cpp @@ -31,17 +31,7 @@ LLFontBitmapCache::LLFontBitmapCache() : LLTrace::MemTrackable("LLFontBitmapCache") - , mBitmapWidth(0) - , mBitmapHeight(0) - , mMaxCharWidth(0) - , mMaxCharHeight(0) { - // *TODO: simplify with initializer after VS2017 - for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) - { - mCurrentOffsetX[idx] = 1; - mCurrentOffsetY[idx] = 1; - } } LLFontBitmapCache::~LLFontBitmapCache() @@ -123,6 +113,9 @@ BOOL LLFontBitmapCache::nextOpenPos(S32 width, S32& pos_x, S32& pos_y, EFontGlyp // Attach corresponding GL texture. (*TODO: is this needed?) gGL.getTexUnit(0)->bind(image_gl); image_gl->setFilteringOption(LLTexUnit::TFO_POINT); // was setMipFilterNearest(TRUE, TRUE); + + claimMem(image_raw); + claimMem(image_gl); } else { @@ -145,29 +138,29 @@ void LLFontBitmapCache::destroyGL() { for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) { - for (std::vector >::iterator it = mImageGLVec[idx].begin(); it != mImageGLVec[idx].end(); ++it) + for (LLImageGL* image_gl : mImageGLVec[idx]) { - (*it)->destroyGLTexture(); + image_gl->destroyGLTexture(); } } } void LLFontBitmapCache::reset() { - for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) + for (U32 kitty = 0, cnt = static_cast(EFontGlyphType::Count); kitty < cnt; kitty++) { - for (std::vector >::iterator it = mImageRawVec[idx].begin(), end_it = mImageRawVec[idx].end(); it != end_it; ++it) + for (LLImageRaw* image_raw : mImageRawVec[kitty]) { - disclaimMem(**it); + disclaimMem(image_raw); } - mImageRawVec[idx].clear(); + mImageRawVec[kitty].clear(); } for (U32 idx = 0, cnt = static_cast(EFontGlyphType::Count); idx < cnt; idx++) { - for (std::vector >::iterator it = mImageGLVec[idx].begin(), end_it = mImageGLVec[idx].end(); it != end_it; ++it) + for (LLImageGL* image_gl : mImageGLVec[idx]) { - disclaimMem(**it); + disclaimMem(image_gl); } mImageGLVec[idx].clear(); mCurrentOffsetX[idx] = 1; diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index 5d0094fd69..6b339e9afd 100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h @@ -68,12 +68,12 @@ protected: static U32 getNumComponents(EFontGlyphType bitmap_type); private: - S32 mBitmapWidth; - S32 mBitmapHeight; - S32 mCurrentOffsetX[static_cast(EFontGlyphType::Count)]; - S32 mCurrentOffsetY[static_cast(EFontGlyphType::Count)]; - S32 mMaxCharWidth; - S32 mMaxCharHeight; + S32 mBitmapWidth = 0; + S32 mBitmapHeight = 0; + S32 mCurrentOffsetX[static_cast(EFontGlyphType::Count)] = { 1 }; + S32 mCurrentOffsetY[static_cast(EFontGlyphType::Count)] = { 1 }; + S32 mMaxCharWidth = 0; + S32 mMaxCharHeight = 0; std::vector> mImageRawVec[static_cast(EFontGlyphType::Count)]; std::vector> mImageGLVec[static_cast(EFontGlyphType::Count)]; }; diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index f2dc5771e9..1d7d930e6f 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -482,6 +482,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) font_search_paths.push_back(LLFontGL::getFontPathSystem()); #if LL_DARWIN font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY); + font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY + MACOSX_FONT_SUPPLEMENTAL); + font_search_paths.push_back(sys_path + MACOSX_FONT_SUPPLEMENTAL); #endif // The fontname string may contain multiple font file names separated by semicolons. @@ -491,8 +493,6 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) ++font_file_it) { LLFontGL *fontp = NULL; - font_paths.push_back(MACOSX_FONT_PATH_LIBRARY + MACOSX_FONT_SUPPLEMENTAL + *file_name_it); - font_paths.push_back(sys_path + MACOSX_FONT_SUPPLEMENTAL + *file_name_it); bool is_ft_collection = (std::find_if(font_collection_files.begin(), font_collection_files.end(), [&font_file_it](const LLFontFileInfo& ffi) { return font_file_it->FileName == ffi.FileName; }) != font_collection_files.end()); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 9005d70b2e..0447e7070c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -208,7 +208,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mVPad(p.v_pad), mHAlign(p.font_halign), mVAlign(p.font_valign), - mTextVAlign(p.text_valign.isProvided() ? p.text_valign : p.font_valign), + mTextVAlign(p.text_valign.isProvided() ? p.text_valign.getValue() : p.font_valign.getValue()), mLineSpacingMult(p.line_spacing.multiple), mLineSpacingPixels(p.line_spacing.pixels), mClip(p.clip), diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 281777e492..85c9318b8a 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -140,7 +140,7 @@ class ViewerManifest(LLManifest): self.path("*.tga") # Include our fonts - with self.prefix(src="../packages/fonts"): + with self.prefix(src="../packages/fonts",src_dst="fonts"): self.path("*.ttf") self.path("*.txt") -- cgit v1.2.3 From aa6f1ca698f1b8955843a11b91e2ec3623ccc948 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 3 Oct 2022 16:37:17 -0400 Subject: DRTVWR-489: Update to freetype build 575484 --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5a5ffa2898..db7eb7f6d7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -698,9 +698,9 @@ archive hash - 8865739d8e530199dacb3c3042c1bc01 + 73c70c9e29b805b25d1df551e2c4f751 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87777/805782/freetype-2.4.4.563848-darwin64-563848.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105443/922863/freetype-2.12.1.575484-darwin64-575484.tar.bz2 name darwin64 @@ -722,9 +722,9 @@ archive hash - c0b3601e997553931cadc7d7ee94168b + 2fbb9e2b35d38676d9cea5dd4b659609 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87779/805814/freetype-2.4.4.563848-windows-563848.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105444/922870/freetype-2.12.1.575484-windows-575484.tar.bz2 name windows @@ -734,16 +734,16 @@ archive hash - e98e1e088cdcd20442e05e9abecdadf9 + dc7f61388f375ead1395fd0189214ab3 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87778/805815/freetype-2.4.4.563848-windows64-563848.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105441/922858/freetype-2.12.1.575484-windows64-575484.tar.bz2 name windows64 version - 2.4.4.563848 + 2.12.1.575484 glext -- cgit v1.2.3 From 0cdb792d904198131187d6ead102f951b2894bd0 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Thu, 6 Oct 2022 15:06:06 -0700 Subject: SL-18230: PUll in new version of FreeType that turns off zlib requirment to avoid linker dupe errors in the Viewer against zlib --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index db7eb7f6d7..759f17f75d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -698,9 +698,9 @@ archive hash - 73c70c9e29b805b25d1df551e2c4f751 + 6cc4791cda8bd22b31a7a5c6d6096444 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105443/922863/freetype-2.12.1.575484-darwin64-575484.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105572/923689/freetype-2.12.1.575556-darwin64-575556.tar.bz2 name darwin64 @@ -722,9 +722,9 @@ archive hash - 2fbb9e2b35d38676d9cea5dd4b659609 + 89bfcc2fb628187cf6730a81f43c513e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105444/922870/freetype-2.12.1.575484-windows-575484.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105574/923703/freetype-2.12.1.575556-windows-575556.tar.bz2 name windows @@ -734,16 +734,16 @@ archive hash - dc7f61388f375ead1395fd0189214ab3 + cd2fb236e24aa912939c5e87b8a42ec7 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105441/922858/freetype-2.12.1.575484-windows64-575484.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105573/923695/freetype-2.12.1.575556-windows64-575556.tar.bz2 name windows64 version - 2.12.1.575484 + 2.12.1.575556 glext -- cgit v1.2.3 From cf2afdc541b540582650f89c6b95aacfeaef516f Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 11 Sep 2022 21:44:00 +0100 Subject: Add emoji as its own font to promote character reuse --- indra/llrender/llfontgl.cpp | 7 +++++++ indra/llrender/llfontgl.h | 1 + indra/newview/skins/default/xui/en/fonts.xml | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 4770f79395..e9899c9567 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -1005,6 +1005,13 @@ LLFontGL::VAlign LLFontGL::vAlignFromName(const std::string& name) return gl_vfont_align; } + //static +LLFontGL* LLFontGL::getFontEmoji() +{ + static LLFontGL* fontp = getFont(LLFontDescriptor("Emoji", "Large", 0)); + return fontp;; +} + //static LLFontGL* LLFontGL::getFontMonospace() { diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index a60feb87cb..29bdb798e1 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -191,6 +191,7 @@ public: static void setFontDisplay(BOOL flag) { sDisplayFont = flag; } + static LLFontGL* getFontEmoji(); static LLFontGL* getFontMonospace(); static LLFontGL* getFontSansSerifSmall(); static LLFontGL* getFontSansSerif(); diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index ed35546322..681f670f08 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -70,6 +70,11 @@ DejaVuSans-BoldOblique.ttf + + Twemoji.ttf + + DejaVuSansMono.ttf -- cgit v1.2.3 From 063fe5953ada75177c1668f8b805cd9b79724581 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 2 Nov 2022 14:25:27 +0100 Subject: Create a separate segment for emoji characters so that we can display them in a slightly larger font size than the surrounding text --- indra/llui/lltextbase.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++++--- indra/llui/lltextbase.h | 12 ++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 0447e7070c..2a6e6901e4 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2302,6 +2302,36 @@ void LLTextBase::appendWidget(const LLInlineViewSegment::Params& params, const s insertStringNoUndo(getLength(), widget_wide_text, &segments); } +void LLTextBase::createTextWithEmojiSegment(const LLWString& text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments) +{ + LLStyleSP emoji_style; + + S32 text_start = 0, text_kitty = 0, text_len = text.size(); + for (; text_kitty < text_len; text_kitty++) + { + if (LLStringOps::isEmoji(text[text_kitty])) + { + if (text_kitty > text_start) + { + segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_kitty, *this)); + } + + if (!emoji_style) + { + emoji_style = new LLStyle(*style); + emoji_style->setFont(LLFontGL::getFontEmoji()); + } + segments.push_back(new LLEmojiTextSegment(emoji_style, segment_start + text_kitty, segment_start + text_kitty + 1, *this)); + text_start = text_kitty + 1; + } + } + + if (text_start < text_len) + { + segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_len, *this)); + } +} + void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only) { // Save old state @@ -2334,6 +2364,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig S32 cur_length = getLength(); LLStyleConstSP sp(new LLStyle(highlight_params)); LLTextSegmentPtr segmentp; + segment_vec_t segments; if (underline_on_hover_only || mSkipLinkUnderline) { highlight_params.font.style("NORMAL"); @@ -2342,9 +2373,8 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig } else { - segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this); + createTextWithEmojiSegment(wide_text, cur_length, sp, segments); } - segment_vec_t segments; segments.push_back(segmentp); insertStringNoUndo(cur_length, wide_text, &segments); } @@ -2367,7 +2397,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig } else { - segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this )); + createTextWithEmojiSegment(wide_text, segment_start, sp, segments); } insertStringNoUndo(getLength(), wide_text, &segments); @@ -3514,6 +3544,19 @@ const S32 LLLabelTextSegment::getLength() const return mEditor.getWlabel().length(); } +// +// LLEmojiTextSegment +// +LLEmojiTextSegment::LLEmojiTextSegment(LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor) + : LLNormalTextSegment(style, start, end, editor) +{ +} + +LLEmojiTextSegment::LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible) + : LLNormalTextSegment(color, start, end, editor, is_visible) +{ +} + // // LLOnHoverChangeableTextSegment // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 590e7c9dbb..fc999c4cca 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -178,6 +178,17 @@ protected: /*virtual*/ const S32 getLength() const; }; +// Text segment that represents a single emoji character that has a different style (=font size) than the rest of +// the document it belongs to +class LLEmojiTextSegment : public LLNormalTextSegment +{ +public: + LLEmojiTextSegment(LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor); + LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE); + + bool canEdit() const override { return false; } +}; + // Text segment that changes it's style depending of mouse pointer position ( is it inside or outside segment) class LLOnHoverChangeableTextSegment : public LLNormalTextSegment { @@ -629,6 +640,7 @@ protected: void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); + void createTextWithEmojiSegment(const LLWString& wide_text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments); S32 normalizeUri(std::string& uri); protected: -- cgit v1.2.3 From 8694f055b64eb7ce13897e49afe73c4d3295a29a Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:09:30 +0200 Subject: Add emoji helper support to LLTextEditor --- indra/llui/lltexteditor.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ indra/llui/lltexteditor.h | 5 +++++ 2 files changed, 45 insertions(+) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index b1f8b00cab..889940cf9a 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -43,6 +43,7 @@ #include "llmath.h" #include "llclipboard.h" +#include "llemojihelper.h" #include "llscrollbar.h" #include "llstl.h" #include "llstring.h" @@ -238,6 +239,7 @@ LLTextEditor::Params::Params() default_color("default_color"), commit_on_focus_lost("commit_on_focus_lost", false), show_context_menu("show_context_menu"), + show_emoji_helper("show_emoji_helper"), enable_tooltip_paste("enable_tooltip_paste") { addSynonym(prevalidate_callback, "text_type"); @@ -259,6 +261,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) : mPrevalidateFunc(p.prevalidate_callback()), mContextMenu(NULL), mShowContextMenu(p.show_context_menu), + mShowEmojiHelper(p.show_emoji_helper), mEnableTooltipPaste(p.enable_tooltip_paste), mPassDelete(FALSE), mKeepSelectionOnReturn(false) @@ -501,6 +504,15 @@ void LLTextEditor::getSegmentsInRange(LLTextEditor::segment_vec_t& segments_out, } } +void LLTextEditor::setShowEmojiHelper(bool show) { + if (!mShowEmojiHelper) + { + LLEmojiHelper::instance().hideHelper(this); + } + + mShowEmojiHelper = show; +} + BOOL LLTextEditor::selectionContainsLineBreaks() { if (hasSelection()) @@ -930,6 +942,12 @@ BOOL LLTextEditor::handleDoubleClick(S32 x, S32 y, MASK mask) S32 LLTextEditor::execute( TextCmd* cmd ) { + if (!mReadOnly && mShowEmojiHelper) + { + // Any change to our contents should always hide the helper + LLEmojiHelper::instance().hideHelper(this); + } + S32 delta = 0; if( cmd->execute(this, &delta) ) { @@ -1124,6 +1142,17 @@ void LLTextEditor::addChar(llwchar wc) setCursorPos(mCursorPos + addChar( mCursorPos, wc )); + if (!mReadOnly && mShowEmojiHelper) + { + LLWString wtext(getWText()); S32 shortCodePos; + if (LLEmojiHelper::isCursorInEmojiCode(wtext, mCursorPos, &shortCodePos)) + { + const LLRect cursorRect = getLocalRectFromDocIndex(mCursorPos); + const LLWString shortCode = wtext.substr(shortCodePos, mCursorPos); + LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, wstring_to_utf8str(shortCode)); + } + } + if (!mReadOnly && mAutoreplaceCallback != NULL) { // autoreplace the text, if necessary @@ -1774,6 +1803,11 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) } else { + if (!mReadOnly && mShowEmojiHelper && LLEmojiHelper::instance().handleKey(this, key, mask)) + { + return TRUE; + } + if (mEnableTooltipPaste && LLToolTipMgr::instance().toolTipVisible() && KEY_TAB == key) @@ -1815,6 +1849,12 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask ) { resetCursorBlink(); needsScroll(); + + if (mShowEmojiHelper) + { + // Dismiss the helper whenever we handled a key that it didn't + LLEmojiHelper::instance().hideHelper(this); + } } return handled; diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 26702b2412..04910b6f68 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -60,6 +60,7 @@ public: ignore_tab, commit_on_focus_lost, show_context_menu, + show_emoji_helper, enable_tooltip_paste, auto_indent; @@ -201,6 +202,9 @@ public: void setShowContextMenu(bool show) { mShowContextMenu = show; } bool getShowContextMenu() const { return mShowContextMenu; } + void setShowEmojiHelper(bool show); + bool getShowEmojiHelper() const { return mShowEmojiHelper; } + void setPassDelete(BOOL b) { mPassDelete = b; } protected: @@ -317,6 +321,7 @@ private: BOOL mAllowEmbeddedItems; bool mShowContextMenu; + bool mShowEmojiHelper; bool mEnableTooltipPaste; bool mPassDelete; bool mKeepSelectionOnReturn; // disabling of removing selected text after pressing of Enter -- cgit v1.2.3 From d95571cf7cd319e17338bc509d46ab5eab4eb968 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:10:06 +0200 Subject: Add mini emoji (auto-)complete helper --- indra/newview/CMakeLists.txt | 2 + indra/newview/llpanelemojicomplete.cpp | 210 +++++++++++++++++++++ indra/newview/llpanelemojicomplete.h | 99 ++++++++++ indra/newview/llviewerfloaterreg.cpp | 2 + .../default/xui/en/floater_emoji_complete.xml | 26 +++ .../default/xui/en/widgets/emoji_complete.xml | 7 + 6 files changed, 346 insertions(+) create mode 100644 indra/newview/llpanelemojicomplete.cpp create mode 100644 indra/newview/llpanelemojicomplete.h create mode 100644 indra/newview/skins/default/xui/en/floater_emoji_complete.xml create mode 100644 indra/newview/skins/default/xui/en/widgets/emoji_complete.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8d902ce618..0bb1814322 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -441,6 +441,7 @@ set(viewer_SOURCE_FILES llpaneleditsky.cpp llpaneleditwater.cpp llpaneleditwearable.cpp + llpanelemojicomplete.cpp llpanelenvironment.cpp llpanelexperiencelisteditor.cpp llpanelexperiencelog.cpp @@ -1072,6 +1073,7 @@ set(viewer_HEADER_FILES llpaneleditsky.h llpaneleditwater.h llpaneleditwearable.h + llpanelemojicomplete.h llpanelenvironment.h llpanelexperiencelisteditor.h llpanelexperiencelog.h diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp new file mode 100644 index 0000000000..e1d80b62e2 --- /dev/null +++ b/indra/newview/llpanelemojicomplete.cpp @@ -0,0 +1,210 @@ +/** +* @file llpanelemojicomplete.h +* @brief Header file for LLPanelEmojiComplete +* +* $LicenseInfo:firstyear=2012&license=lgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2011, 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 "llemojidictionary.h" +#include "llpanelemojicomplete.h" +#include "lluictrlfactory.h" + +constexpr U32 MIN_MOUSE_MOVE_DELTA = 4; + +// ============================================================================ +// LLPanelEmojiComplete +// + +static LLDefaultChildRegistry::Register r("emoji_complete"); + +LLPanelEmojiComplete::Params::Params() + : selected_image("selected_image") +{ +} + +LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) + : LLUICtrl(p) + , mSelectedImage(p.selected_image) +{ + setFont(p.font); +} + +LLPanelEmojiComplete::~LLPanelEmojiComplete() +{ +} + +void LLPanelEmojiComplete::draw() +{ + if (!mEmojis.empty()) + { + const S32 centerY = mRenderRect.getCenterY(); + const size_t firstVisibleIdx = mScrollPos, lastVisibleIdx = llmin(mScrollPos + mVisibleEmojis, mEmojis.size()) - 1; + + if (mCurSelected >= firstVisibleIdx && mCurSelected <= lastVisibleIdx) + { + const S32 emoji_left = mRenderRect.mLeft + (mCurSelected - firstVisibleIdx) * mEmojiWidth; + const S32 emoji_height = mFont->getLineHeight() + mPadding; + mSelectedImage->draw(emoji_left, centerY - emoji_height / 2, mEmojiWidth, emoji_height); + } + + U32 left = mRenderRect.mLeft + mPadding; + for (U32 curIdx = firstVisibleIdx; curIdx <= lastVisibleIdx; curIdx++) + { + mFont->render( + mEmojis, curIdx, + left, centerY, + LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW_SOFT, + 1, S32_MAX, nullptr, false, true); + left += mEmojiWidth; + } + } +} + +BOOL LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask) +{ + LLVector2 curHover(x, y); + if ((mLastHover - curHover).lengthSquared() > MIN_MOUSE_MOVE_DELTA) + { + mCurSelected = posToIndex(x, y); + mLastHover = curHover; + } + + return TRUE; +} + +BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) +{ + if (MASK_NONE == mask) + { + bool handled = false; + switch (key) + { + case KEY_LEFT: + case KEY_UP: + selectPrevious(); + handled = true; + break; + case KEY_RIGHT: + case KEY_DOWN: + selectNext(); + handled = true; + break; + } + return handled; + } + + return false; +} + +void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLUICtrl::reshape(width, height, called_from_parent); + updateConstraints(); +} + +void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) +{ + mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + mScrollPos = llmin(mScrollPos, mEmojis.size()); + updateConstraints(); +} + +size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const +{ + if (mRenderRect.pointInRect(x, y)) + { + return llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); + } + return npos; +} + +void LLPanelEmojiComplete::select(size_t emoji_idx) +{ + mCurSelected = llclamp(emoji_idx, 0, mEmojis.size()); + updateScrollPos(); +} + +void LLPanelEmojiComplete::selectNext() +{ + select(mCurSelected + 1 < mEmojis.size() ? mCurSelected + 1 : 0); +} + +void LLPanelEmojiComplete::selectPrevious() +{ + select(mCurSelected - 1 >= 0 ? mCurSelected - 1 : mEmojis.size() - 1); +} + +void LLPanelEmojiComplete::setFont(const LLFontGL* fontp) +{ + mFont = fontp; + updateConstraints(); +} + +void LLPanelEmojiComplete::updateConstraints() +{ + const S32 ctrlWidth = getLocalRect().getWidth(); + + mEmojiWidth = mFont->getWidthF32(u8"\U0001F431") + mPadding * 2; + mVisibleEmojis = ctrlWidth / mEmojiWidth; + mRenderRect = getLocalRect().stretch((ctrlWidth - mVisibleEmojis * mEmojiWidth) / -2, 0); + + updateScrollPos(); +} + +void LLPanelEmojiComplete::updateScrollPos() +{ + const size_t cntEmoji = mEmojis.size(); + if (0 == cntEmoji || cntEmoji < mVisibleEmojis || 0 == mCurSelected) + { + mScrollPos = 0; + } + else if (cntEmoji - 1 == mCurSelected) + { + mScrollPos = mCurSelected - mVisibleEmojis + 1; + } + else + { + mScrollPos = mCurSelected - ((float)mCurSelected / (cntEmoji - 2) * (mVisibleEmojis - 2)); + } +} + +// ============================================================================ +// LLFloaterEmojiComplete +// + +LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) + : LLFloater(sdKey) +{ + // This floater should hover on top of our dependent (with the dependent having the focus) + setFocusStealsFrontmost(false); + setAutoFocus(false); + setBackgroundVisible(false); +} + +void LLFloaterEmojiComplete::onOpen(const LLSD& key) +{ + findChild("emoji_complete_ctrl")->setEmojiHint(key["hint"].asString()); +} + +// ============================================================================ diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h new file mode 100644 index 0000000000..85b0609ae9 --- /dev/null +++ b/indra/newview/llpanelemojicomplete.h @@ -0,0 +1,99 @@ +/** +* @file llpanelemojicomplete.h +* @brief Header file for LLPanelEmojiComplete +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, 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$ +*/ + +#pragma once + +#include "llfloater.h" +#include "lluictrl.h" + +// ============================================================================ +// LLPanelEmojiComplete +// + +class LLPanelEmojiComplete : public LLUICtrl +{ + friend class LLUICtrlFactory; +public: + struct Params : public LLInitParam::Block + { + Optional selected_image; + + Params(); + }; + +protected: + LLPanelEmojiComplete(const LLPanelEmojiComplete::Params&); +public: + virtual ~LLPanelEmojiComplete(); + + void draw() override; + BOOL handleHover(S32 x, S32 y, MASK mask) override; + BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + void reshape(S32 width, S32 height, BOOL called_from_parent) override; + +public: + void setEmojiHint(const std::string& hint); +protected: + size_t posToIndex(S32 x, S32 y) const; + void select(size_t emoji_idx); + void selectNext(); + void selectPrevious(); + void setFont(const LLFontGL* fontp); + void updateConstraints(); + void updateScrollPos(); + +protected: + static constexpr auto npos = std::numeric_limits::max(); + + const LLFontGL* mFont; + U16 mEmojiWidth = 0; + LLUIImagePtr mSelectedImage; + + LLWString mEmojis; + U16 mVisibleEmojis = 0; + size_t mFirstVisible = 0; + size_t mScrollPos = 0; + size_t mCurSelected = 0; + LLVector2 mLastHover; + + S32 mPadding = 8; + LLRect mRenderRect; +}; + +// ============================================================================ +// LLFloaterEmojiComplete +// + +class LLFloaterEmojiComplete : public LLFloater +{ +public: + LLFloaterEmojiComplete(const LLSD& sdKey); + +public: + void onOpen(const LLSD& key) override; +}; + +// ============================================================================ diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 5a05f89758..a54b91030e 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -155,6 +155,7 @@ #include "llfloaterimnearbychat.h" #include "llpanelblockedlist.h" #include "llpanelclassified.h" +#include "llpanelemojicomplete.h" #include "llpreviewanim.h" #include "llpreviewgesture.h" #include "llpreviewnotecard.h" @@ -229,6 +230,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("emoji_complete", "floater_emoji_complete.xml", &LLFloaterReg::build); LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("env_fixed_environmentent_water", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml new file mode 100644 index 0000000000..eb666bc32c --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml new file mode 100644 index 0000000000..f35105ff7e --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml @@ -0,0 +1,7 @@ + + + -- cgit v1.2.3 From ec23b4bc633b853223d8442f60e769d44a25fe2d Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:06:41 +0200 Subject: Add the basic emoji dictionary class (responsible for loading them from disk and providing helpful lookup functions) --- indra/llui/CMakeLists.txt | 2 + indra/llui/llemojidictionary.cpp | 177 +++++++++++++++++++++++++++++++++++++++ indra/llui/llemojidictionary.h | 71 ++++++++++++++++ 3 files changed, 250 insertions(+) create mode 100644 indra/llui/llemojidictionary.cpp create mode 100644 indra/llui/llemojidictionary.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index f781ff4110..4e007e429a 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -53,6 +53,7 @@ set(llui_SOURCE_FILES lldockcontrol.cpp lldraghandle.cpp lleditmenuhandler.cpp + llemojidictionary.cpp llf32uictrl.cpp llfiltereditor.cpp llflashtimer.cpp @@ -163,6 +164,7 @@ set(llui_HEADER_FILES lldockablefloater.h lldockcontrol.h lleditmenuhandler.h + llemojidictionary.h llf32uictrl.h llfiltereditor.h llflashtimer.h diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp new file mode 100644 index 0000000000..e149832a8b --- /dev/null +++ b/indra/llui/llemojidictionary.cpp @@ -0,0 +1,177 @@ +/** +* @file llemojidictionary.cpp +* @brief Implementation of LLEmojiDictionary +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, 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 "linden_common.h" + +#include "lldir.h" +#include "llemojidictionary.h" +#include "llsdserialize.h" + +#include + +// ============================================================================ +// Constants +// + +constexpr char SKINNED_EMOJI_FILENAME[] = "emoji_characters.xml"; + +// ============================================================================ +// Helper functions +// + +template +std::list llsd_array_to_list(const LLSD& sd, std::function mutator = {}); + +template<> +std::list llsd_array_to_list(const LLSD& sd, std::function mutator) +{ + std::list result; + for (LLSD::array_const_iterator it = sd.beginArray(), end = sd.endArray(); it != end; ++it) + { + const LLSD& entry = *it; + if (!entry.isString()) + continue; + + result.push_back(entry.asStringRef()); + if (mutator) + { + mutator(result.back()); + } + } + return result; +} + +LLEmojiDescriptor::LLEmojiDescriptor(const LLSD& descriptor_sd) +{ + Name = descriptor_sd["Name"].asStringRef(); + + const LLWString emoji_string = utf8str_to_wstring(descriptor_sd["Character"].asString()); + Character = (1 == emoji_string.size()) ? emoji_string[0] : L'\0'; // We don't currently support character composition + + auto toLower = [](std::string& str) { LLStringUtil::toLower(str); }; + ShortCodes = llsd_array_to_list(descriptor_sd["ShortCodes"], toLower); + Categories = llsd_array_to_list(descriptor_sd["Categories"], toLower); + + if (Name.empty()) + { + Name = ShortCodes.front(); + } +} + +bool LLEmojiDescriptor::isValid() const +{ + return + Character && + !ShortCodes.empty() && + !Categories.empty(); +} + +// ============================================================================ +// LLEmojiDictionary class +// + +LLEmojiDictionary::LLEmojiDictionary() +{ +} + +// static +void LLEmojiDictionary::initClass() +{ + LLEmojiDictionary* pThis = &LLEmojiDictionary::initParamSingleton(); + + LLSD data; + + const std::string filename = gDirUtilp->findSkinnedFilenames(LLDir::XUI, SKINNED_EMOJI_FILENAME, LLDir::CURRENT_SKIN).front(); + llifstream file(filename.c_str()); + if (file.is_open()) + { + LL_DEBUGS() << "Loading emoji characters file at " << filename << LL_ENDL; + LLSDSerialize::fromXML(data, file); + } + + if (data.isUndefined()) + { + LL_WARNS() << "Emoji file characters missing or ill-formed" << LL_ENDL; + return; + } + + for (LLSD::array_const_iterator descriptor_it = data.beginArray(), descriptor_end = data.endArray(); descriptor_it != descriptor_end; ++descriptor_it) + { + LLEmojiDescriptor descriptor(*descriptor_it); + if (!descriptor.isValid()) + { + LL_WARNS() << "Skipping invalid emoji descriptor " << descriptor.Character << LL_ENDL; + continue; + } + pThis->addEmoji(std::move(descriptor)); + } +} + +LLWString LLEmojiDictionary::findMatchingEmojis(std::string needle) +{ + // Search without the colon (if present) so the user can type ':food' and see all emojis in the 'Food' category + LLStringUtil::toLower(needle); + const auto kitty_needle = boost::make_iterator_range((boost::starts_with(needle, ":")) ? needle.begin() + 1 : needle.begin(), needle.end()); + + LLWString wstr; + for (const auto& descr : mEmojis) + { + for (const auto& short_code : descr.ShortCodes) + { + if (boost::icontains(short_code, kitty_needle)) + { + wstr.push_back(descr.Character); + continue; + } + } + + for (const auto& category : descr.Categories) + { + if (boost::icontains(category, kitty_needle)) + { + wstr.push_back(descr.Character); + continue; + } + } + } + + return wstr; +} + +std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) +{ + const auto it = mEmoji2Descr.find(ch); + return (mEmoji2Descr.end() != it) ? it->second->Name : LLStringUtil::null; +} + +void LLEmojiDictionary::addEmoji(LLEmojiDescriptor&& descr) +{ + mEmojis.push_back(descr); + const LLEmojiDescriptor& back = mEmojis.back(); + mEmoji2Descr.insert(std::make_pair(descr.Character, &back)); +} + +// ============================================================================ diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h new file mode 100644 index 0000000000..87ea4a5aef --- /dev/null +++ b/indra/llui/llemojidictionary.h @@ -0,0 +1,71 @@ +/** +* @file llemojidictionary.h +* @brief Header file for LLEmojiDictionary +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, 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$ +*/ + +#pragma once + +#include "lldictionary.h" +#include "llinitdestroyclass.h" +#include "llsingleton.h" + +// ============================================================================ +// LLEmojiDescriptor class +// + +struct LLEmojiDescriptor +{ + LLEmojiDescriptor(const LLSD& descriptor_sd); + + bool isValid() const; + + std::string Name; + llwchar Character; + std::list ShortCodes; + std::list Categories; +}; + +// ============================================================================ +// LLEmojiDictionary class +// + +class LLEmojiDictionary : public LLParamSingleton, public LLInitClass +{ + LLSINGLETON(LLEmojiDictionary); + ~LLEmojiDictionary() override {}; + +public: + static void initClass(); + LLWString findMatchingEmojis(std::string needle); + std::string getNameFromEmoji(llwchar ch); + +private: + void addEmoji(LLEmojiDescriptor&& descr); + +private: + std::list mEmojis; + std::map mEmoji2Descr; +}; + +// ============================================================================ -- cgit v1.2.3 From dad25bcb1e17e3dc384a9fb35d21b669bc3bbacd Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:17:02 +0200 Subject: Add the emoji helper class which can be used by text-input controls to provide emoji picker support --- indra/llui/CMakeLists.txt | 2 + indra/llui/llemojihelper.cpp | 142 +++++++++++++++++++++++++++++++++++++++++++ indra/llui/llemojihelper.h | 64 +++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 indra/llui/llemojihelper.cpp create mode 100644 indra/llui/llemojihelper.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 4e007e429a..68019734ab 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -54,6 +54,7 @@ set(llui_SOURCE_FILES lldraghandle.cpp lleditmenuhandler.cpp llemojidictionary.cpp + llemojihelper.cpp llf32uictrl.cpp llfiltereditor.cpp llflashtimer.cpp @@ -165,6 +166,7 @@ set(llui_HEADER_FILES lldockcontrol.h lleditmenuhandler.h llemojidictionary.h + llemojihelper.h llf32uictrl.h llfiltereditor.h llflashtimer.h diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp new file mode 100644 index 0000000000..d4c31ee986 --- /dev/null +++ b/indra/llui/llemojihelper.cpp @@ -0,0 +1,142 @@ +/** +* @file llemojihelper.h +* @brief Header file for LLEmojiHelper +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, 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 "linden_common.h" + +#include "llemojidictionary.h" +#include "llemojihelper.h" +#include "llfloater.h" +#include "llfloaterreg.h" +#include "lluictrl.h" + +// ============================================================================ +// Constants +// + +constexpr char DEFAULT_EMOJI_HELPER_FLOATER[] = "emoji_complete"; +constexpr S32 HELPER_FLOATER_OFFSET_X = 20; +constexpr S32 HELPER_FLOATER_OFFSET_Y = 0; + +// ============================================================================ +// LLEmojiHelper +// + +std::string LLEmojiHelper::getToolTip(llwchar ch) const +{ + return LLEmojiDictionary::instance().getNameFromEmoji(ch); +} + +bool LLEmojiHelper::isActive(const LLUICtrl* ctrl_p) const +{ + return mHostHandle.get() == ctrl_p; +} + +// static +bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos) +{ + S32 shortCodePos = cursorPos; + + while (shortCodePos > 1 && + (LLStringOps::isAlnum(wtext[shortCodePos - 1]) || wtext[shortCodePos - 1] == L'-' || wtext[shortCodePos - 1] == L'_') ) + { + shortCodePos--; + } + + bool isShortCode = (L':' == wtext[shortCodePos - 1]) && (cursorPos - shortCodePos >= 2); + if (pShortCodePos) + *pShortCodePos = (isShortCode) ? shortCodePos - 1 : -1; + return isShortCode; +} + +void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function cb) +{ + if (mHelperHandle.isDead()) + { + LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER); + mHelperHandle = pHelperFloater->getHandle(); + mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())); }, std::placeholders::_2)); + } + setHostCtrl(hostctrl_p); + mEmojiCommitCb = cb; + + S32 floater_x, floater_y; + if (!hostctrl_p->localPointToOtherView(local_x, local_y, &floater_x, &floater_y, gFloaterView)) + { + LL_ERRS() << "Cannot show emoji helper for non-floater controls." << LL_ENDL; + return; + } + + LLFloater* pHelperFloater = mHelperHandle.get(); + LLRect rct = pHelperFloater->getRect(); + rct.setLeftTopAndSize(floater_x - HELPER_FLOATER_OFFSET_X, floater_y - HELPER_FLOATER_OFFSET_Y + rct.getHeight(), rct.getWidth(), rct.getHeight()); + pHelperFloater->setRect(rct); + pHelperFloater->openFloater(LLSD().with("hint", short_code)); +} + +void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p) +{ + setHostCtrl(nullptr); +} + +bool LLEmojiHelper::handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask) +{ + if (mHelperHandle.isDead() || !isActive(ctrl_p)) + { + return false; + } + + return mHelperHandle.get()->handleKey(key, mask, true); +} + +void LLEmojiHelper::onCommitEmoji(const LLWString& wstr) +{ + if (!mHostHandle.isDead() && mEmojiCommitCb) + { + mEmojiCommitCb(wstr); + } +} + +void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p) +{ + const LLUICtrl* pCurHostCtrl = mHostHandle.get(); + if (pCurHostCtrl != hostctrl_p) + { + mHostCtrlFocusLostConn.disconnect(); + mHostHandle.markDead(); + mEmojiCommitCb = {}; + + if (!mHelperHandle.isDead()) + { + mHelperHandle.get()->closeFloater(); + } + + if (hostctrl_p) + { + mHostHandle = hostctrl_p->getHandle(); + mHostCtrlFocusLostConn = hostctrl_p->setFocusLostCallback(std::bind([&]() { hideHelper(getHostCtrl()); })); + } + } +} diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h new file mode 100644 index 0000000000..7ed042fc5f --- /dev/null +++ b/indra/llui/llemojihelper.h @@ -0,0 +1,64 @@ +/** +* @file llemojihelper.h +* @brief Header file for LLEmojiHelper +* +* $LicenseInfo:firstyear=2014&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2014, 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$ +*/ + +#pragma once + +#include "llhandle.h" +#include "llsingleton.h" + +#include + +class LLFloater; +class LLUICtrl; + +class LLEmojiHelper : public LLSingleton +{ + LLSINGLETON(LLEmojiHelper) {} + ~LLEmojiHelper() override {} + +public: + // General + std::string getToolTip(llwchar ch) const; + bool isActive(const LLUICtrl* ctrl_p) const; + static bool isCursorInEmojiCode(const LLWString& wtext, S32 cursor_pos, S32* short_code_pos_p = nullptr); + void showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function commit_cb); + void hideHelper(const LLUICtrl* ctrl_p); + + // Eventing + bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); + void onCommitEmoji(const LLWString& wstr); + +protected: + LLUICtrl* getHostCtrl() const { return mHostHandle.get(); } + void setHostCtrl(LLUICtrl* hostctrl_p); + +private: + LLHandle mHostHandle; + LLHandle mHelperHandle; + boost::signals2::connection mHostCtrlFocusLostConn; + boost::signals2::connection mHelperCommitConn; + std::function mEmojiCommitCb; +}; -- cgit v1.2.3 From 3acb4caa0fb9d381be6cfbe1693ace389d90a16c Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:18:22 +0200 Subject: Add emoji helper support to LLTextEditor --- indra/llui/lltexteditor.cpp | 21 ++++++++++++++++++--- indra/llui/lltexteditor.h | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 889940cf9a..168c260c7d 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -676,6 +676,21 @@ void LLTextEditor::selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_p endSelection(); } +void LLTextEditor::handleEmojiCommit(const LLWString& wstr) +{ + LLWString wtext(getWText()); S32 shortCodePos; + if (LLEmojiHelper::isCursorInEmojiCode(wtext, mCursorPos, &shortCodePos)) + { + remove(shortCodePos, mCursorPos - shortCodePos, true); + + auto styleParams = LLStyle::Params(); + styleParams.font = LLFontGL::getFontEmoji(); + insert(shortCodePos, wstr, false, new LLEmojiTextSegment(new LLStyle(styleParams), shortCodePos, shortCodePos + wstr.size(), *this)); + + setCursorPos(shortCodePos + 1); + } +} + BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -1147,9 +1162,9 @@ void LLTextEditor::addChar(llwchar wc) LLWString wtext(getWText()); S32 shortCodePos; if (LLEmojiHelper::isCursorInEmojiCode(wtext, mCursorPos, &shortCodePos)) { - const LLRect cursorRect = getLocalRectFromDocIndex(mCursorPos); - const LLWString shortCode = wtext.substr(shortCodePos, mCursorPos); - LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, wstring_to_utf8str(shortCode)); + const LLRect cursorRect = getLocalRectFromDocIndex(mCursorPos - 1); + const LLWString shortCode = wtext.substr(shortCodePos, mCursorPos - shortCodePos); + LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, wstring_to_utf8str(shortCode), std::bind(&LLTextEditor::handleEmojiCommit, this, std::placeholders::_1)); } } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 04910b6f68..4c8175a286 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -92,6 +92,8 @@ public: static S32 spacesPerTab(); + void handleEmojiCommit(const LLWString& wstr); + // mousehandler overrides virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); -- cgit v1.2.3 From 90e272993bb4c591fd2a98772d7fe1104dbff921 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:24:25 +0200 Subject: Autosize the mini emoji helper to fit the number of shown emojis --- indra/newview/llpanelemojicomplete.cpp | 49 ++++++++++++++++++++-- indra/newview/llpanelemojicomplete.h | 17 ++++++-- .../default/xui/en/floater_emoji_complete.xml | 22 +++++----- 3 files changed, 72 insertions(+), 16 deletions(-) diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index e1d80b62e2..f6823befac 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -39,12 +39,18 @@ constexpr U32 MIN_MOUSE_MOVE_DELTA = 4; static LLDefaultChildRegistry::Register r("emoji_complete"); LLPanelEmojiComplete::Params::Params() - : selected_image("selected_image") + : autosize("autosize") + , max_emoji("max_emoji") + , padding("padding") + , selected_image("selected_image") { } LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) : LLUICtrl(p) + , mAutoSize(p.autosize) + , mMaxVisible(p.max_emoji) + , mPadding(p.padding) , mSelectedImage(p.selected_image) { setFont(p.font); @@ -125,9 +131,23 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) { + llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; + size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; + mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; + + if (mAutoSize) + { + mVisibleEmojis = std::min(mEmojis.size(), mMaxVisible); + reshape(mVisibleEmojis * mEmojiWidth, getRect().getHeight(), false); + } + else + { + updateConstraints(); + } + mScrollPos = llmin(mScrollPos, mEmojis.size()); - updateConstraints(); } size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const @@ -200,11 +220,34 @@ LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) setFocusStealsFrontmost(false); setAutoFocus(false); setBackgroundVisible(false); + setIsChrome(true); } void LLFloaterEmojiComplete::onOpen(const LLSD& key) { - findChild("emoji_complete_ctrl")->setEmojiHint(key["hint"].asString()); + mEmojiCtrl->setEmojiHint(key["hint"].asString()); +} + +BOOL LLFloaterEmojiComplete::postBuild() +{ + mEmojiCtrl = findChild("emoji_complete_ctrl"); + mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); + + return TRUE; +} + +void LLFloaterEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + if (!called_from_parent) + { + LLRect rctFloater = getRect(), rctCtrl = mEmojiCtrl->getRect(); + rctFloater.mRight = rctFloater.mLeft + rctCtrl.getWidth() + mEmojiCtrlHorz; + setRect(rctFloater); + + return; + } + + LLFloater::reshape(width, height, called_from_parent); } // ============================================================================ diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 85b0609ae9..b389ac9d53 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -39,6 +39,10 @@ class LLPanelEmojiComplete : public LLUICtrl public: struct Params : public LLInitParam::Block { + Optional autosize; + Optional max_emoji, + padding; + Optional selected_image; Params(); @@ -68,8 +72,12 @@ protected: protected: static constexpr auto npos = std::numeric_limits::max(); + bool mAutoSize = false; const LLFontGL* mFont; U16 mEmojiWidth = 0; + size_t mMaxVisible = 0; + S32 mPadding = 8; + LLRect mRenderRect; LLUIImagePtr mSelectedImage; LLWString mEmojis; @@ -78,9 +86,6 @@ protected: size_t mScrollPos = 0; size_t mCurSelected = 0; LLVector2 mLastHover; - - S32 mPadding = 8; - LLRect mRenderRect; }; // ============================================================================ @@ -94,6 +99,12 @@ public: public: void onOpen(const LLSD& key) override; + BOOL postBuild() override; + void reshape(S32 width, S32 height, BOOL called_from_parent) override; + +protected: + LLPanelEmojiComplete* mEmojiCtrl = nullptr; + S32 mEmojiCtrlHorz = 0; }; // ============================================================================ diff --git a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml index eb666bc32c..e9ea8f4de7 100644 --- a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml @@ -13,14 +13,16 @@ single_instance="true" width="240" > - - + + -- cgit v1.2.3 From f6f52d327be5f03265d66a95df6fc0716f91ca07 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:35:44 +0200 Subject: Provide a way for a floater to remain the topmost floater, even when focus is given to a different floater --- indra/llui/llfloater.cpp | 24 +++++++++++++++++++++++- indra/llui/llfloater.h | 4 ++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 0e42922543..04f6b11b7c 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -3039,7 +3039,29 @@ void LLFloaterView::syncFloaterTabOrder() LLFloater* floaterp = dynamic_cast(*child_it); if (gFocusMgr.childHasKeyboardFocus(floaterp)) { - bringToFront(floaterp, FALSE); + if (mFrontChild != floaterp) + { + // Grab a list of the top floaters that want to stay on top of the focused floater + std::list listTop; + if (mFrontChild && !mFrontChild->canFocusStealFrontmost()) + { + for (LLView* childfloaterp : *getChildList()) + { + if (static_cast(childfloaterp)->canFocusStealFrontmost()) + break; + listTop.push_back(childfloaterp); + } + } + + bringToFront(floaterp, FALSE); + + // Restore top floaters + for (LLView* childp :listTop) + { + sendChildToFront(childp); + } + } + break; } } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 2672d600c6..1d4aff31eb 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -313,6 +313,9 @@ public: /*virtual*/ void setVisible(BOOL visible); // do not override /*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override + bool canFocusStealFrontmost() const { return mFocusStealsFrontmost; } + void setFocusStealsFrontmost(bool wants_frontmost) { mFocusStealsFrontmost = wants_frontmost; } + void setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE); virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD()); @@ -478,6 +481,7 @@ private: BOOL mCanTearOff; BOOL mCanMinimize; BOOL mCanClose; + bool mFocusStealsFrontmost = true; // FALSE if we don't want the currently focused floater to cover this floater without user interaction BOOL mDragOnLeft; BOOL mResizable; -- cgit v1.2.3 From 8d08f417dc1f5b2681774f000951993e0f0cf79f Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 16:37:10 +0200 Subject: Show tooltip when hovering over an emoji text segment (currently will show its shortcode) --- indra/llui/lltextbase.cpp | 14 ++++++++++++++ indra/llui/lltextbase.h | 1 + 2 files changed, 15 insertions(+) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 2a6e6901e4..693dcb7b8d 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -3557,6 +3557,20 @@ LLEmojiTextSegment::LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end { } +BOOL LLEmojiTextSegment::handleToolTip(S32 x, S32 y, MASK mask) +{ + if (mTooltip.empty()) + { + LLWString emoji = getWText().substr(getStart(), getEnd() - getStart()); + if (!emoji.empty()) + { + mTooltip = LLEmojiHelper::instance().getToolTip(emoji[0]); + } + } + + return LLNormalTextSegment::handleToolTip(x, y, mask); +} + // // LLOnHoverChangeableTextSegment // diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index fc999c4cca..31e9f16110 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -187,6 +187,7 @@ public: LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE); bool canEdit() const override { return false; } + BOOL handleToolTip(S32 x, S32 y, MASK mask); }; // Text segment that changes it's style depending of mouse pointer position ( is it inside or outside segment) -- cgit v1.2.3 From 58cdcd5dd23778c6fad9fa0da31b670ceff8eeeb Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 17:47:51 +0200 Subject: Handle return and escape in the mini emoji helper --- indra/llui/llemojihelper.cpp | 5 ++++ indra/llui/llemojihelper.h | 2 +- indra/newview/llpanelemojicomplete.cpp | 48 +++++++++++++++++++++++++++++++--- indra/newview/llpanelemojicomplete.h | 1 + 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index d4c31ee986..54c801ab7b 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -98,6 +98,11 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p) { + if (ctrl_p && !isActive(ctrl_p)) + { + return; + } + setHostCtrl(nullptr); } diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h index 7ed042fc5f..63f5c640c9 100644 --- a/indra/llui/llemojihelper.h +++ b/indra/llui/llemojihelper.h @@ -45,7 +45,7 @@ public: bool isActive(const LLUICtrl* ctrl_p) const; static bool isCursorInEmojiCode(const LLWString& wtext, S32 cursor_pos, S32* short_code_pos_p = nullptr); void showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function commit_cb); - void hideHelper(const LLUICtrl* ctrl_p); + void hideHelper(const LLUICtrl* ctrl_p = nullptr); // Eventing bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index f6823befac..61b08ad48d 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llemojidictionary.h" +#include "llemojihelper.h" #include "llpanelemojicomplete.h" #include "lluictrlfactory.h" @@ -101,9 +102,9 @@ BOOL LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask) BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) { + bool handled = false; if (MASK_NONE == mask) { - bool handled = false; switch (key) { case KEY_LEFT: @@ -116,11 +117,24 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent selectNext(); handled = true; break; + case KEY_RETURN: + if (!mEmojis.empty()) + { + LLWString wstr; + wstr.push_back(mEmojis.at(mCurSelected)); + setValue(wstring_to_utf8str(wstr)); + onCommit(); + handled = true; + } + break; } - return handled; } - return false; + if (handled) + { + return TRUE; + } + return LLUICtrl::handleKey(key, mask, called_from_parent); } void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -223,6 +237,26 @@ LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) setIsChrome(true); } +BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent) +{ + bool handled = false; + if (MASK_NONE == mask) + { + switch (key) + { + case KEY_ESCAPE: + LLEmojiHelper::instance().hideHelper(); + handled = true; + break; + } + + } + + if (handled) + return TRUE; + return LLFloater::handleKey(key, mask, called_from_parent); +} + void LLFloaterEmojiComplete::onOpen(const LLSD& key) { mEmojiCtrl->setEmojiHint(key["hint"].asString()); @@ -231,9 +265,15 @@ void LLFloaterEmojiComplete::onOpen(const LLSD& key) BOOL LLFloaterEmojiComplete::postBuild() { mEmojiCtrl = findChild("emoji_complete_ctrl"); + mEmojiCtrl->setCommitCallback( + std::bind([&](const LLSD& sdValue) + { + setValue(sdValue); + onCommit(); + }, std::placeholders::_2)); mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); - return TRUE; + return LLFloater::postBuild(); } void LLFloaterEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index b389ac9d53..361a2dc9b7 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -98,6 +98,7 @@ public: LLFloaterEmojiComplete(const LLSD& sdKey); public: + BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; void onOpen(const LLSD& key) override; BOOL postBuild() override; void reshape(S32 width, S32 height, BOOL called_from_parent) override; -- cgit v1.2.3 From cb0bb91108b628e1134f1f655eaca9d305961cda Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 17:51:22 +0200 Subject: Mini emoji helper shows as a small slice when there are no matching emojis --- indra/newview/llpanelemojicomplete.cpp | 4 ++++ indra/newview/llpanelemojicomplete.h | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 61b08ad48d..a7058a6724 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -260,6 +260,10 @@ BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_pare void LLFloaterEmojiComplete::onOpen(const LLSD& key) { mEmojiCtrl->setEmojiHint(key["hint"].asString()); + if (0 == mEmojiCtrl->getEmojiCount()) + { + LLEmojiHelper::instance().hideHelper(); + } } BOOL LLFloaterEmojiComplete::postBuild() diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 361a2dc9b7..138cc465ba 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -59,7 +59,8 @@ public: void reshape(S32 width, S32 height, BOOL called_from_parent) override; public: - void setEmojiHint(const std::string& hint); + size_t getEmojiCount() const { return mEmojis.size(); } + void setEmojiHint(const std::string& hint); protected: size_t posToIndex(S32 x, S32 y) const; void select(size_t emoji_idx); -- cgit v1.2.3 From fb1553d8cf704eeb222de7ebd520a81fa242b317 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 17:55:13 +0200 Subject: Cannot use the :+1 emoji shortcode --- indra/llui/llemojihelper.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index 54c801ab7b..551f0331e7 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -59,8 +59,18 @@ bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S { S32 shortCodePos = cursorPos; - while (shortCodePos > 1 && - (LLStringOps::isAlnum(wtext[shortCodePos - 1]) || wtext[shortCodePos - 1] == L'-' || wtext[shortCodePos - 1] == L'_') ) + auto isPartOfShortcode = [](llwchar ch) { + switch (ch) + { + case L'-': + case L'_': + case L'+': + return true; + default: + return LLStringOps::isAlnum(ch); + } + }; + while (shortCodePos > 1 && isPartOfShortcode(wtext[shortCodePos - 1])) { shortCodePos--; } -- cgit v1.2.3 From d1dbefc09b77990563d22aaf08d0c5708cc6cbbe Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 23 Oct 2022 19:05:19 +0200 Subject: Refactor emoji matching --- indra/llui/llemojidictionary.cpp | 70 ++++++++++++++++++++++++---------------- indra/llui/llemojidictionary.h | 2 +- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp index e149832a8b..eefa4047a2 100644 --- a/indra/llui/llemojidictionary.cpp +++ b/indra/llui/llemojidictionary.cpp @@ -31,6 +31,8 @@ #include "llsdserialize.h" #include +#include +#include // ============================================================================ // Constants @@ -89,6 +91,41 @@ bool LLEmojiDescriptor::isValid() const !Categories.empty(); } +struct emoji_filter_base +{ + emoji_filter_base(const std::string& needle) + { + // Search without the colon (if present) so the user can type ':food' and see all emojis in the 'Food' category + mNeedle = (boost::starts_with(needle, ":")) ? needle.substr(1) : needle; + LLStringUtil::toLower(mNeedle); + } + +protected: + std::string mNeedle; +}; + +struct emoji_filter_shortcode_or_category_contains : public emoji_filter_base +{ + emoji_filter_shortcode_or_category_contains(const std::string& needle) : emoji_filter_base(needle) {} + + bool operator()(const LLEmojiDescriptor& descr) const + { + for (const auto& short_code : descr.ShortCodes) + { + if (boost::icontains(short_code, mNeedle)) + return true; + } + + for (const auto& category : descr.Categories) + { + if (boost::icontains(category, mNeedle)) + return true; + } + + return false; + } +}; + // ============================================================================ // LLEmojiDictionary class // @@ -130,35 +167,12 @@ void LLEmojiDictionary::initClass() } } -LLWString LLEmojiDictionary::findMatchingEmojis(std::string needle) +LLWString LLEmojiDictionary::findMatchingEmojis(const std::string& needle) const { - // Search without the colon (if present) so the user can type ':food' and see all emojis in the 'Food' category - LLStringUtil::toLower(needle); - const auto kitty_needle = boost::make_iterator_range((boost::starts_with(needle, ":")) ? needle.begin() + 1 : needle.begin(), needle.end()); - - LLWString wstr; - for (const auto& descr : mEmojis) - { - for (const auto& short_code : descr.ShortCodes) - { - if (boost::icontains(short_code, kitty_needle)) - { - wstr.push_back(descr.Character); - continue; - } - } - - for (const auto& category : descr.Categories) - { - if (boost::icontains(category, kitty_needle)) - { - wstr.push_back(descr.Character); - continue; - } - } - } - - return wstr; + LLWString result; + boost::transform(mEmojis | boost::adaptors::filtered(emoji_filter_shortcode_or_category_contains(needle)), + std::back_inserter(result), [](const auto& descr) { return descr.Character; }); + return result; } std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h index 87ea4a5aef..3fa55cd417 100644 --- a/indra/llui/llemojidictionary.h +++ b/indra/llui/llemojidictionary.h @@ -57,7 +57,7 @@ class LLEmojiDictionary : public LLParamSingleton, public LLI public: static void initClass(); - LLWString findMatchingEmojis(std::string needle); + LLWString findMatchingEmojis(const std::string& needle) const; std::string getNameFromEmoji(llwchar ch); private: -- cgit v1.2.3 From 12433b11fce9f9e19ea7c2831096038a4a807d6d Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Wed, 26 Oct 2022 16:10:39 -0700 Subject: SL-18232 Library changes needed for emoji support from Kitty Barnett (updates for FreeType and ICU4C --- autobuild.xml | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 759f17f75d..837e40d895 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -698,9 +698,9 @@ archive hash - 6cc4791cda8bd22b31a7a5c6d6096444 + 66c308642234797ef82b1e22b96b5ae6 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105572/923689/freetype-2.12.1.575556-darwin64-575556.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106497/930538/freetype-2.12.1.576084-darwin64-576084.tar.bz2 name darwin64 @@ -722,9 +722,9 @@ archive hash - 89bfcc2fb628187cf6730a81f43c513e + fb161e641d4f4bfdeefed6021c192331 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105574/923703/freetype-2.12.1.575556-windows-575556.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106496/930532/freetype-2.12.1.576084-windows-576084.tar.bz2 name windows @@ -734,16 +734,16 @@ archive hash - cd2fb236e24aa912939c5e87b8a42ec7 + fe29d0aa898b534f3083ad53f04afd40 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105573/923695/freetype-2.12.1.575556-windows64-575556.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106495/930523/freetype-2.12.1.576084-windows64-576084.tar.bz2 name windows64 version - 2.12.1.575556 + 2.12.1.576084 glext @@ -1029,6 +1029,62 @@ version 2012.1-2 + icu4c + + canonical_repo + https://bitbucket.org/lindenlab/3p-icu4c + copyright + Copyright (c) 1995-2011 International Business Machines Corporation and others <http://source.icu-project.org> + description + ICU is a mature, widely used set of C/C++ and Java libraries providing Unicode and Globalization support for software applications. ICU is widely portable and gives applications the same results on all platforms and between C/C++ and Java software. + license + ICU, permissive non-copyleft free software license + license_file + LICENSES/icu.txt + name + icu4c + platforms + + darwin64 + + archive + + hash + 8fc61ee230e63db756e14415573f604d + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106176/928492/icu4c-4.8.1-darwin64-575914.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + 9898b1f45bc92d4fc75b1d1a68c59514 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106438/930144/icu4c-4.8.1-windows-575914.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 8ad662698b5d99ce169517ce11cf2bef + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106439/930151/icu4c-4.8.1-windows64-575914.tar.bz2 + + name + windows64 + + + version + 4.8.1 + jpegencoderbasic copyright -- cgit v1.2.3 From b52d54c8ca971872839f3595bc5cccd87ba2a7b4 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Wed, 26 Oct 2022 17:30:48 -0700 Subject: SL-18468 - pull in the (new) 3P package containing the Viewer fonts that are required for Kitty's work --- autobuild.xml | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 837e40d895..c9820ecedd 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2708,6 +2708,60 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors version 0.9.4 + viewer-fonts + + copyright + Copyright various + description + Viewer fonts + license + Various open source + license_file + LICENSES/fonts.txt + name + viewer-fonts + platforms + + darwin64 + + archive + + hash + 9655e501340262e1feea9e71543d3eab + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106526/930682/viewer_fonts-1.576098-darwin64-576098.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + eb98887e363854810e03861f258e534d + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106533/930714/viewer_fonts-1.576098-windows-576098.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 365c0d38cde826c3c1e31bc68b5d1194 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106527/930690/viewer_fonts-1.576098-windows64-576098.tar.bz2 + + name + windows64 + + + version + 1.576098 + viewer-manager copyright -- cgit v1.2.3 From b0a3381b2f1c11299a8166ab94170d8f8151927a Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 27 Oct 2022 12:46:32 -0700 Subject: SL-18230 - pull in updated 3p-freetype package for macOS/Darwin to build to prevent linker errors in Viewer --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c9820ecedd..09c6bf3522 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -698,9 +698,9 @@ archive hash - 66c308642234797ef82b1e22b96b5ae6 + 4390c5182b5d6c397ef0396828093600 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106497/930538/freetype-2.12.1.576084-darwin64-576084.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106585/931193/freetype-2.12.1.576132-darwin64-576132.tar.bz2 name darwin64 @@ -722,9 +722,9 @@ archive hash - fb161e641d4f4bfdeefed6021c192331 + 6ad01c23db703cd6ad2a491aae937379 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106496/930532/freetype-2.12.1.576084-windows-576084.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106586/931203/freetype-2.12.1.576132-windows-576132.tar.bz2 name windows @@ -734,16 +734,16 @@ archive hash - fe29d0aa898b534f3083ad53f04afd40 + db5f433b65a268a1ea601d7e29766cb1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106495/930523/freetype-2.12.1.576084-windows64-576084.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106587/931202/freetype-2.12.1.576132-windows64-576132.tar.bz2 name windows64 version - 2.12.1.576084 + 2.12.1.576132 glext -- cgit v1.2.3 From c40d3351d511b19f4468f7467be38499bf16588f Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 2 Nov 2022 19:05:24 +0100 Subject: Commit immediately if the user already typed a full shortcode --- indra/llui/llemojidictionary.cpp | 17 +++++++++++++---- indra/llui/llemojidictionary.h | 6 ++++-- indra/llui/llemojihelper.cpp | 8 ++++++++ indra/llui/lltextbase.cpp | 1 + 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp index eefa4047a2..c31638b0bf 100644 --- a/indra/llui/llemojidictionary.cpp +++ b/indra/llui/llemojidictionary.cpp @@ -175,17 +175,26 @@ LLWString LLEmojiDictionary::findMatchingEmojis(const std::string& needle) const return result; } -std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) +const LLEmojiDescriptor* LLEmojiDictionary::getDescriptorFromShortCode(const std::string& short_code) const +{ + const auto it = mShortCode2Descr.find(short_code); + return (mShortCode2Descr.end() != it) ? &it->second : nullptr; +} + +std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) const { const auto it = mEmoji2Descr.find(ch); - return (mEmoji2Descr.end() != it) ? it->second->Name : LLStringUtil::null; + return (mEmoji2Descr.end() != it) ? it->second.Name : LLStringUtil::null; } void LLEmojiDictionary::addEmoji(LLEmojiDescriptor&& descr) { mEmojis.push_back(descr); - const LLEmojiDescriptor& back = mEmojis.back(); - mEmoji2Descr.insert(std::make_pair(descr.Character, &back)); + mEmoji2Descr.insert(std::make_pair(descr.Character, mEmojis.back())); + for (const std::string& shortCode : descr.ShortCodes) + { + mShortCode2Descr.insert(std::make_pair(shortCode, mEmojis.back())); + } } // ============================================================================ diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h index 3fa55cd417..0cde663719 100644 --- a/indra/llui/llemojidictionary.h +++ b/indra/llui/llemojidictionary.h @@ -58,14 +58,16 @@ class LLEmojiDictionary : public LLParamSingleton, public LLI public: static void initClass(); LLWString findMatchingEmojis(const std::string& needle) const; - std::string getNameFromEmoji(llwchar ch); + const LLEmojiDescriptor* getDescriptorFromShortCode(const std::string& short_code) const; + std::string getNameFromEmoji(llwchar ch) const; private: void addEmoji(LLEmojiDescriptor&& descr); private: std::list mEmojis; - std::map mEmoji2Descr; + std::map mEmoji2Descr; + std::map mShortCode2Descr; }; // ============================================================================ diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index 551f0331e7..32471e59a8 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -83,6 +83,14 @@ bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function cb) { + // Commit immediately if the user already typed a full shortcode + if (const auto* emojiDescrp = LLEmojiDictionary::instance().getDescriptorFromShortCode(short_code)) + { + cb(LLWString(1, emojiDescrp->Character)); + hideHelper(); + return; + } + if (mHelperHandle.isDead()) { LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 693dcb7b8d..b88c7ced40 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -29,6 +29,7 @@ #include "lltextbase.h" +#include "llemojihelper.h" #include "lllocalcliprect.h" #include "llmenugl.h" #include "llscrollcontainer.h" -- cgit v1.2.3 From 97300c608153d21a441ed34b0a5b9a2ea815df2e Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 2 Nov 2022 19:11:20 +0100 Subject: Add (partial) emoji set descriptors --- .../skins/default/xui/en/emoji_characters.xml | 10955 +++++++++++++++++++ 1 file changed, 10955 insertions(+) create mode 100644 indra/newview/skins/default/xui/en/emoji_characters.xml diff --git a/indra/newview/skins/default/xui/en/emoji_characters.xml b/indra/newview/skins/default/xui/en/emoji_characters.xml new file mode 100644 index 0000000000..55aefe6745 --- /dev/null +++ b/indra/newview/skins/default/xui/en/emoji_characters.xml @@ -0,0 +1,10955 @@ + + + + + Character + 😀 + ShortCodes + + :grinning: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😄 + ShortCodes + + :smile: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😆 + ShortCodes + + :laughing: + + + + Categories + + Smiley + Face Smiling + + + + Character + 🤣 + ShortCodes + + :rofl: + :satisfied: + + + Categories + + Smiley + Face Smiling + + + + Character + 🙂 + ShortCodes + + :slightly_smiling_face: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😉 + ShortCodes + + :wink: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😇 + ShortCodes + + :innocent: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😃 + ShortCodes + + :smiley: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😁 + ShortCodes + + :grin: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😅 + ShortCodes + + :sweat_smile: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😂 + ShortCodes + + :joy: + + + + Categories + + Smiley + Face Smiling + + + + Character + 🙃 + ShortCodes + + :upside_down_face: + + + + Categories + + Smiley + Face Smiling + + + + Character + 😊 + ShortCodes + + :blush: + + + + Categories + + Smiley + Face Smiling + + + + Character + 🥰 + ShortCodes + + :smiling_face_with_three_hearts: + + + + Categories + + Smiley + Face Affection + + + + Character + 🤩 + ShortCodes + + :star_struck: + + + + Categories + + Smiley + Face Affection + + + + Character + 😗 + ShortCodes + + :kissing: + + + + Categories + + Smiley + Face Affection + + + + Character + 😚 + ShortCodes + + :kissing_closed_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + 🥲 + ShortCodes + + :smiling_face_with_tear: + + + + Categories + + Smiley + Face Affection + + + + Character + 😍 + ShortCodes + + :heart_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + 😘 + ShortCodes + + :kissing_heart: + + + + Categories + + Smiley + Face Affection + + + + Character + ☺️ + ShortCodes + + :relaxed: + + + + Categories + + Smiley + Face Affection + + + + Character + 😙 + ShortCodes + + :kissing_smiling_eyes: + + + + Categories + + Smiley + Face Affection + + + + Character + 😋 + ShortCodes + + :yum: + + + + Categories + + Smiley + Face Tongue + + + + Character + 😜 + ShortCodes + + :stuck_out_tongue_winking_eye: + + + + Categories + + Smiley + Face Tongue + + + + Character + 😝 + ShortCodes + + :stuck_out_tongue_closed_eyes: + + + + Categories + + Smiley + Face Tongue + + + + Character + 😛 + ShortCodes + + :stuck_out_tongue: + + + + Categories + + Smiley + Face Tongue + + + + Character + 🤪 + ShortCodes + + :zany_face: + + + + Categories + + Smiley + Face Tongue + + + + Character + 🤑 + ShortCodes + + :money_mouth_face: + + + + Categories + + Smiley + Face Tongue + + + + Character + 🤗 + ShortCodes + + :hugs: + + + + Categories + + Smiley + Face Hand + + + + Character + 🤫 + ShortCodes + + :shushing_face: + + + + Categories + + Smiley + Face Hand + + + + Character + 🤭 + ShortCodes + + :hand_over_mouth: + + + + Categories + + Smiley + Face Hand + + + + Character + 🤔 + ShortCodes + + :thinking: + + + + Categories + + Smiley + Face Hand + + + + Character + 🤐 + ShortCodes + + :zipper_mouth_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😐 + ShortCodes + + :neutral_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😶 + ShortCodes + + :no_mouth: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😏 + ShortCodes + + :smirk: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 🙄 + ShortCodes + + :roll_eyes: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😮‍💨 + ShortCodes + + :face_exhaling: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 🤨 + ShortCodes + + :raised_eyebrow: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😑 + ShortCodes + + :expressionless: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😶‍🌫️ + ShortCodes + + :face_in_clouds: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😒 + ShortCodes + + :unamused: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😬 + ShortCodes + + :grimacing: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 🤥 + ShortCodes + + :lying_face: + + + + Categories + + Smiley + Face Neutral Skeptical + + + + Character + 😌 + ShortCodes + + :relieved: + + + + Categories + + Smiley + Face Sleepy + + + + Character + 😪 + ShortCodes + + :sleepy: + + + + Categories + + Smiley + Face Sleepy + + + + Character + 😴 + ShortCodes + + :sleeping: + + + + Categories + + Smiley + Face Sleepy + + + + Character + 😔 + ShortCodes + + :pensive: + + + + Categories + + Smiley + Face Sleepy + + + + Character + 🤤 + ShortCodes + + :drooling_face: + + + + Categories + + Smiley + Face Sleepy + + + + Character + 😷 + ShortCodes + + :mask: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤕 + ShortCodes + + :face_with_head_bandage: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤮 + ShortCodes + + :vomiting_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🥵 + ShortCodes + + :hot_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🥴 + ShortCodes + + :woozy_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 😵‍💫 + ShortCodes + + :face_with_spiral_eyes: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤒 + ShortCodes + + :face_with_thermometer: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤢 + ShortCodes + + :nauseated_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤧 + ShortCodes + + :sneezing_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🥶 + ShortCodes + + :cold_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 😵 + ShortCodes + + :dizzy_face: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤯 + ShortCodes + + :exploding_head: + + + + Categories + + Smiley + Face Unwell + + + + Character + 🤠 + ShortCodes + + :cowboy_hat_face: + + + + Categories + + Smiley + Face Hat + + + + Character + 🥸 + ShortCodes + + :disguised_face: + + + + Categories + + Smiley + Face Hat + + + + Character + 🥳 + ShortCodes + + :partying_face: + + + + Categories + + Smiley + Face Hat + + + + Character + 😎 + ShortCodes + + :sunglasses: + + + + Categories + + Smiley + Face Glasses + + + + Character + 🧐 + ShortCodes + + :monocle_face: + + + + Categories + + Smiley + Face Glasses + + + + Character + 🤓 + ShortCodes + + :nerd_face: + + + + Categories + + Smiley + Face Glasses + + + + Character + 😕 + ShortCodes + + :confused: + + + + Categories + + Smiley + Face Concerned + + + + Character + 🙁 + ShortCodes + + :slightly_frowning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😮 + ShortCodes + + :open_mouth: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😲 + ShortCodes + + :astonished: + + + + Categories + + Smiley + Face Concerned + + + + Character + 🥺 + ShortCodes + + :pleading_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😧 + ShortCodes + + :anguished: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😰 + ShortCodes + + :cold_sweat: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😢 + ShortCodes + + :cry: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😱 + ShortCodes + + :scream: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😣 + ShortCodes + + :persevere: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😓 + ShortCodes + + :sweat: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😫 + ShortCodes + + :tired_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😟 + ShortCodes + + :worried: + + + + Categories + + Smiley + Face Concerned + + + + Character + ☹️ + ShortCodes + + :frowning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😯 + ShortCodes + + :hushed: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😳 + ShortCodes + + :flushed: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😦 + ShortCodes + + :frowning: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😨 + ShortCodes + + :fearful: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😥 + ShortCodes + + :disappointed_relieved: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😭 + ShortCodes + + :sob: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😖 + ShortCodes + + :confounded: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😞 + ShortCodes + + :disappointed: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😩 + ShortCodes + + :weary: + + + + Categories + + Smiley + Face Concerned + + + + Character + 🥱 + ShortCodes + + :yawning_face: + + + + Categories + + Smiley + Face Concerned + + + + Character + 😤 + ShortCodes + + :triumph: + + + + Categories + + Smiley + Face Negative + + + + Character + 😠 + ShortCodes + + :angry: + + + + Categories + + Smiley + Face Negative + + + + Character + 😈 + ShortCodes + + :smiling_imp: + + + + Categories + + Smiley + Face Negative + + + + Character + 💀 + ShortCodes + + :skull: + + + + Categories + + Smiley + Face Negative + + + + Character + 😡 + ShortCodes + + :pout: + :rage: + + + Categories + + Smiley + Face Negative + + + + Character + 🤬 + ShortCodes + + :cursing_face: + + + + Categories + + Smiley + Face Negative + + + + Character + 👿 + ShortCodes + + :imp: + + + + Categories + + Smiley + Face Negative + + + + Character + ☠️ + ShortCodes + + :skull_and_crossbones: + + + + Categories + + Smiley + Face Negative + + + + Character + 💩 + ShortCodes + + :hankey: + :poop: + :shit: + + Categories + + Smiley + Face Costume + + + + Character + 👹 + ShortCodes + + :japanese_ogre: + + + + Categories + + Smiley + Face Costume + + + + Character + 👻 + ShortCodes + + :ghost: + + + + Categories + + Smiley + Face Costume + + + + Character + 👾 + ShortCodes + + :space_invader: + + + + Categories + + Smiley + Face Costume + + + + Character + 🤡 + ShortCodes + + :clown_face: + + + + Categories + + Smiley + Face Costume + + + + Character + 👺 + ShortCodes + + :japanese_goblin: + + + + Categories + + Smiley + Face Costume + + + + Character + 👽 + ShortCodes + + :alien: + + + + Categories + + Smiley + Face Costume + + + + Character + 🤖 + ShortCodes + + :robot: + + + + Categories + + Smiley + Face Costume + + + + Character + 😺 + ShortCodes + + :smiley_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😹 + ShortCodes + + :joy_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😼 + ShortCodes + + :smirk_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 🙀 + ShortCodes + + :scream_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😾 + ShortCodes + + :pouting_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😸 + ShortCodes + + :smile_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😻 + ShortCodes + + :heart_eyes_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😽 + ShortCodes + + :kissing_cat: + + + + Categories + + Smiley + Cat Face + + + + Character + 😿 + ShortCodes + + :crying_cat_face: + + + + Categories + + Smiley + Cat Face + + + + Character + 🙈 + ShortCodes + + :see_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + 🙊 + ShortCodes + + :speak_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + 🙉 + ShortCodes + + :hear_no_evil: + + + + Categories + + Smiley + Monkey Face + + + + Character + 💋 + ShortCodes + + :kiss: + + + + Categories + + Emotion + + + + + Character + 💘 + ShortCodes + + :cupid: + + + + Categories + + Emotion + + + + + Character + 💖 + ShortCodes + + :sparkling_heart: + + + + Categories + + Emotion + + + + + Character + 💓 + ShortCodes + + :heartbeat: + + + + Categories + + Emotion + + + + + Character + 💕 + ShortCodes + + :two_hearts: + + + + Categories + + Emotion + + + + + Character + ❣️ + ShortCodes + + :heavy_heart_exclamation: + + + + Categories + + Emotion + + + + + Character + ❤️‍🔥 + ShortCodes + + :heart_on_fire: + + + + Categories + + Emotion + + + + + Character + ❤️ + ShortCodes + + :heart: + + + + Categories + + Emotion + + + + + Character + 💛 + ShortCodes + + :yellow_heart: + + + + Categories + + Emotion + + + + + Character + 💙 + ShortCodes + + :blue_heart: + + + + Categories + + Emotion + + + + + Character + 🤎 + ShortCodes + + :brown_heart: + + + + Categories + + Emotion + + + + + Character + 🤍 + ShortCodes + + :white_heart: + + + + Categories + + Emotion + + + + + Character + 💢 + ShortCodes + + :anger: + + + + Categories + + Emotion + + + + + Character + 💫 + ShortCodes + + :dizzy: + + + + Categories + + Emotion + + + + + Character + 💨 + ShortCodes + + :dash: + + + + Categories + + Emotion + + + + + Character + 💣 + ShortCodes + + :bomb: + + + + Categories + + Emotion + + + + + Character + 👁️‍🗨️ + ShortCodes + + :eye_speech_bubble: + + + + Categories + + Emotion + + + + + Character + 🗯️ + ShortCodes + + :right_anger_bubble: + + + + Categories + + Emotion + + + + + Character + 💤 + ShortCodes + + :zzz: + + + + Categories + + Emotion + + + + + Character + 💌 + ShortCodes + + :love_letter: + + + + Categories + + Emotion + + + + + Character + 💝 + ShortCodes + + :gift_heart: + + + + Categories + + Emotion + + + + + Character + 💗 + ShortCodes + + :heartpulse: + + + + Categories + + Emotion + + + + + Character + 💞 + ShortCodes + + :revolving_hearts: + + + + Categories + + Emotion + + + + + Character + 💟 + ShortCodes + + :heart_decoration: + + + + Categories + + Emotion + + + + + Character + 💔 + ShortCodes + + :broken_heart: + + + + Categories + + Emotion + + + + + Character + ❤️‍🩹 + ShortCodes + + :mending_heart: + + + + Categories + + Emotion + + + + + Character + 🧡 + ShortCodes + + :orange_heart: + + + + Categories + + Emotion + + + + + Character + 💚 + ShortCodes + + :green_heart: + + + + Categories + + Emotion + + + + + Character + 💜 + ShortCodes + + :purple_heart: + + + + Categories + + Emotion + + + + + Character + 🖤 + ShortCodes + + :black_heart: + + + + Categories + + Emotion + + + + + Character + 💯 + ShortCodes + + :100: + + + + Categories + + Emotion + + + + + Character + 💥 + ShortCodes + + :boom: + :collision: + + + Categories + + Emotion + + + + + Character + 💦 + ShortCodes + + :sweat_drops: + + + + Categories + + Emotion + + + + + Character + 🕳️ + ShortCodes + + :hole: + + + + Categories + + Emotion + + + + + Character + 💬 + ShortCodes + + :speech_balloon: + + + + Categories + + Emotion + + + + + Character + 🗨️ + ShortCodes + + :left_speech_bubble: + + + + Categories + + Emotion + + + + + Character + 💭 + ShortCodes + + :thought_balloon: + + + + Categories + + Emotion + + + + + Character + 👋 + ShortCodes + + :wave: + + + + Categories + + Body + Hand Fingers Open + + + + Character + 🖐️ + ShortCodes + + :raised_hand_with_fingers_splayed: + + + + Categories + + Body + Hand Fingers Open + + + + Character + 🖖 + ShortCodes + + :vulcan_salute: + + + + Categories + + Body + Hand Fingers Open + + + + Character + 🤚 + ShortCodes + + :raised_back_of_hand: + + + + Categories + + Body + Hand Fingers Open + + + + Character + + ShortCodes + + :hand: + :raised_hand: + + + Categories + + Body + Hand Fingers Open + + + + Character + 👌 + ShortCodes + + :ok_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤏 + ShortCodes + + :pinching_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤞 + ShortCodes + + :crossed_fingers: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤘 + ShortCodes + + :metal: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤌 + ShortCodes + + :pinched_fingers: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + ✌️ + ShortCodes + + :v: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤟 + ShortCodes + + :love_you_gesture: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 🤙 + ShortCodes + + :call_me_hand: + + + + Categories + + Body + Hand Fingers Partial + + + + Character + 👈 + ShortCodes + + :point_left: + + + + Categories + + Body + Hand Single Finger + + + + Character + 👆 + ShortCodes + + :point_up_2: + + + + Categories + + Body + Hand Single Finger + + + + Character + 👇 + ShortCodes + + :point_down: + + + + Categories + + Body + Hand Single Finger + + + + Character + 👉 + ShortCodes + + :point_right: + + + + Categories + + Body + Hand Single Finger + + + + Character + 🖕 + ShortCodes + + :fu: + :middle_finger: + + + Categories + + Body + Hand Single Finger + + + + Character + ☝️ + ShortCodes + + :point_up: + + + + Categories + + Body + Hand Single Finger + + + + Character + 👍 + ShortCodes + + :+1: + :thumbsup: + + + Categories + + Body + Hand Fingers Closed + + + + Character + + ShortCodes + + :fist: + :fist_raised: + + + Categories + + Body + Hand Fingers Closed + + + + Character + 🤛 + ShortCodes + + :fist_left: + + + + Categories + + Body + Hand Fingers Closed + + + + Character + 👎 + ShortCodes + + :-1: + :thumbsdown: + + + Categories + + Body + Hand Fingers Closed + + + + Character + 👊 + ShortCodes + + :facepunch: + :fist_oncoming: + :punch: + + Categories + + Body + Hand Fingers Closed + + + + Character + 🤜 + ShortCodes + + :fist_right: + + + + Categories + + Body + Hand Fingers Closed + + + + Character + 👏 + ShortCodes + + :clap: + + + + Categories + + Body + Hands + + + + Character + 👐 + ShortCodes + + :open_hands: + + + + Categories + + Body + Hands + + + + Character + 🤝 + ShortCodes + + :handshake: + + + + Categories + + Body + Hands + + + + Character + 🙌 + ShortCodes + + :raised_hands: + + + + Categories + + Body + Hands + + + + Character + 🤲 + ShortCodes + + :palms_up_together: + + + + Categories + + Body + Hands + + + + Character + 🙏 + ShortCodes + + :pray: + + + + Categories + + Body + Hands + + + + Character + ✍️ + ShortCodes + + :writing_hand: + + + + Categories + + Body + Hand Prop + + + + Character + 🤳 + ShortCodes + + :selfie: + + + + Categories + + Body + Hand Prop + + + + Character + 💅 + ShortCodes + + :nail_care: + + + + Categories + + Body + Hand Prop + + + + Character + 💪 + ShortCodes + + :muscle: + + + + Categories + + Body + Body Parts + + + + Character + 🦿 + ShortCodes + + :mechanical_leg: + + + + Categories + + Body + Body Parts + + + + Character + 🦶 + ShortCodes + + :foot: + + + + Categories + + Body + Body Parts + + + + Character + 🦻 + ShortCodes + + :ear_with_hearing_aid: + + + + Categories + + Body + Body Parts + + + + Character + 🧠 + ShortCodes + + :brain: + + + + Categories + + Body + Body Parts + + + + Character + 🫁 + ShortCodes + + :lungs: + + + + Categories + + Body + Body Parts + + + + Character + 🦴 + ShortCodes + + :bone: + + + + Categories + + Body + Body Parts + + + + Character + 👁️ + ShortCodes + + :eye: + + + + Categories + + Body + Body Parts + + + + Character + 👄 + ShortCodes + + :lips: + + + + Categories + + Body + Body Parts + + + + Character + 🦾 + ShortCodes + + :mechanical_arm: + + + + Categories + + Body + Body Parts + + + + Character + 🦵 + ShortCodes + + :leg: + + + + Categories + + Body + Body Parts + + + + Character + 👂 + ShortCodes + + :ear: + + + + Categories + + Body + Body Parts + + + + Character + 👃 + ShortCodes + + :nose: + + + + Categories + + Body + Body Parts + + + + Character + 🫀 + ShortCodes + + :anatomical_heart: + + + + Categories + + Body + Body Parts + + + + Character + 🦷 + ShortCodes + + :tooth: + + + + Categories + + Body + Body Parts + + + + Character + 👀 + ShortCodes + + :eyes: + + + + Categories + + Body + Body Parts + + + + Character + 👅 + ShortCodes + + :tongue: + + + + Categories + + Body + Body Parts + + + + Character + 👶 + ShortCodes + + :baby: + + + + Categories + + Person + + + + + Character + 👦 + ShortCodes + + :boy: + + + + Categories + + Person + + + + + Character + 🧑 + ShortCodes + + :adult: + + + + Categories + + Person + + + + + Character + 👨 + ShortCodes + + :man: + + + + Categories + + Person + + + + + Character + 🧔‍♂️ + ShortCodes + + :man_beard: + + + + Categories + + Person + + + + + Character + 👨‍🦰 + ShortCodes + + :red_haired_man: + + + + Categories + + Person + + + + + Character + 👨‍🦳 + ShortCodes + + :white_haired_man: + + + + Categories + + Person + + + + + Character + 👩 + ShortCodes + + :woman: + + + + Categories + + Person + + + + + Character + 🧑‍🦰 + ShortCodes + + :person_red_hair: + + + + Categories + + Person + + + + + Character + 🧑‍🦱 + ShortCodes + + :person_curly_hair: + + + + Categories + + Person + + + + + Character + 🧑‍🦳 + ShortCodes + + :person_white_hair: + + + + Categories + + Person + + + + + Character + 🧑‍🦲 + ShortCodes + + :person_bald: + + + + Categories + + Person + + + + + Character + 👱‍♂️ + ShortCodes + + :blond_haired_man: + + + + Categories + + Person + + + + + Character + 👴 + ShortCodes + + :older_man: + + + + Categories + + Person + + + + + Character + 🧒 + ShortCodes + + :child: + + + + Categories + + Person + + + + + Character + 👧 + ShortCodes + + :girl: + + + + Categories + + Person + + + + + Character + 👱 + ShortCodes + + :blond_haired_person: + + + + Categories + + Person + + + + + Character + 🧔 + ShortCodes + + :bearded_person: + + + + Categories + + Person + + + + + Character + 🧔‍♀️ + ShortCodes + + :woman_beard: + + + + Categories + + Person + + + + + Character + 👨‍🦱 + ShortCodes + + :curly_haired_man: + + + + Categories + + Person + + + + + Character + 👨‍🦲 + ShortCodes + + :bald_man: + + + + Categories + + Person + + + + + Character + 👩‍🦰 + ShortCodes + + :red_haired_woman: + + + + Categories + + Person + + + + + Character + 👩‍🦱 + ShortCodes + + :curly_haired_woman: + + + + Categories + + Person + + + + + Character + 👩‍🦳 + ShortCodes + + :white_haired_woman: + + + + Categories + + Person + + + + + Character + 👩‍🦲 + ShortCodes + + :bald_woman: + + + + Categories + + Person + + + + + Character + 👱‍♀️ + ShortCodes + + :blond_haired_woman: + :blonde_woman: + + + Categories + + Person + + + + + Character + 🧓 + ShortCodes + + :older_adult: + + + + Categories + + Person + + + + + Character + 👵 + ShortCodes + + :older_woman: + + + + Categories + + Person + + + + + Character + 🙍 + ShortCodes + + :frowning_person: + + + + Categories + + Person Gesture + + + + + Character + 🙍‍♀️ + ShortCodes + + :frowning_woman: + + + + Categories + + Person Gesture + + + + + Character + 🙎‍♂️ + ShortCodes + + :pouting_man: + + + + Categories + + Person Gesture + + + + + Character + 🙅 + ShortCodes + + :no_good: + + + + Categories + + Person Gesture + + + + + Character + 🙅‍♀️ + ShortCodes + + :ng_woman: + :no_good_woman: + + + Categories + + Person Gesture + + + + + Character + 🙆‍♂️ + ShortCodes + + :ok_man: + + + + Categories + + Person Gesture + + + + + Character + 💁 + ShortCodes + + :information_desk_person: + :tipping_hand_person: + + + Categories + + Person Gesture + + + + + Character + 💁‍♀️ + ShortCodes + + :sassy_woman: + :tipping_hand_woman: + + + Categories + + Person Gesture + + + + + Character + 🙋‍♂️ + ShortCodes + + :raising_hand_man: + + + + Categories + + Person Gesture + + + + + Character + 🧏 + ShortCodes + + :deaf_person: + + + + Categories + + Person Gesture + + + + + Character + 🧏‍♀️ + ShortCodes + + :deaf_woman: + + + + Categories + + Person Gesture + + + + + Character + 🙇‍♂️ + ShortCodes + + :bowing_man: + + + + Categories + + Person Gesture + + + + + Character + 🤦 + ShortCodes + + :facepalm: + + + + Categories + + Person Gesture + + + + + Character + 🤦‍♀️ + ShortCodes + + :woman_facepalming: + + + + Categories + + Person Gesture + + + + + Character + 🤷‍♂️ + ShortCodes + + :man_shrugging: + + + + Categories + + Person Gesture + + + + + Character + 🙍‍♂️ + ShortCodes + + :frowning_man: + + + + Categories + + Person Gesture + + + + + Character + 🙎 + ShortCodes + + :pouting_face: + + + + Categories + + Person Gesture + + + + + Character + 🙎‍♀️ + ShortCodes + + :pouting_woman: + + + + Categories + + Person Gesture + + + + + Character + 🙅‍♂️ + ShortCodes + + :ng_man: + :no_good_man: + + + Categories + + Person Gesture + + + + + Character + 🙆 + ShortCodes + + :ok_person: + + + + Categories + + Person Gesture + + + + + Character + 🙆‍♀️ + ShortCodes + + :ok_woman: + + + + Categories + + Person Gesture + + + + + Character + 💁‍♂️ + ShortCodes + + :sassy_man: + :tipping_hand_man: + + + Categories + + Person Gesture + + + + + Character + 🙋 + ShortCodes + + :raising_hand: + + + + Categories + + Person Gesture + + + + + Character + 🙋‍♀️ + ShortCodes + + :raising_hand_woman: + + + + Categories + + Person Gesture + + + + + Character + 🧏‍♂️ + ShortCodes + + :deaf_man: + + + + Categories + + Person Gesture + + + + + Character + 🙇 + ShortCodes + + :bow: + + + + Categories + + Person Gesture + + + + + Character + 🙇‍♀️ + ShortCodes + + :bowing_woman: + + + + Categories + + Person Gesture + + + + + Character + 🤦‍♂️ + ShortCodes + + :man_facepalming: + + + + Categories + + Person Gesture + + + + + Character + 🤷 + ShortCodes + + :shrug: + + + + Categories + + Person Gesture + + + + + Character + 🤷‍♀️ + ShortCodes + + :woman_shrugging: + + + + Categories + + Person Gesture + + + + + Character + 🧑‍⚕️ + ShortCodes + + :health_worker: + + + + Categories + + Person Role + + + + + Character + 👩‍⚕️ + ShortCodes + + :woman_health_worker: + + + + Categories + + Person Role + + + + + Character + 👨‍🎓 + ShortCodes + + :man_student: + + + + Categories + + Person Role + + + + + Character + 🧑‍🏫 + ShortCodes + + :teacher: + + + + Categories + + Person Role + + + + + Character + 👩‍🏫 + ShortCodes + + :woman_teacher: + + + + Categories + + Person Role + + + + + Character + 👨‍⚖️ + ShortCodes + + :man_judge: + + + + Categories + + Person Role + + + + + Character + 🧑‍🌾 + ShortCodes + + :farmer: + + + + Categories + + Person Role + + + + + Character + 👩‍🌾 + ShortCodes + + :woman_farmer: + + + + Categories + + Person Role + + + + + Character + 👨‍🍳 + ShortCodes + + :man_cook: + + + + Categories + + Person Role + + + + + Character + 🧑‍🔧 + ShortCodes + + :mechanic: + + + + Categories + + Person Role + + + + + Character + 👩‍🔧 + ShortCodes + + :woman_mechanic: + + + + Categories + + Person Role + + + + + Character + 👨‍🏭 + ShortCodes + + :man_factory_worker: + + + + Categories + + Person Role + + + + + Character + 🧑‍💼 + ShortCodes + + :office_worker: + + + + Categories + + Person Role + + + + + Character + 👩‍💼 + ShortCodes + + :woman_office_worker: + + + + Categories + + Person Role + + + + + Character + 👨‍🔬 + ShortCodes + + :man_scientist: + + + + Categories + + Person Role + + + + + Character + 🧑‍💻 + ShortCodes + + :technologist: + + + + Categories + + Person Role + + + + + Character + 👩‍💻 + ShortCodes + + :woman_technologist: + + + + Categories + + Person Role + + + + + Character + 👨‍🎤 + ShortCodes + + :man_singer: + + + + Categories + + Person Role + + + + + Character + 🧑‍🎨 + ShortCodes + + :artist: + + + + Categories + + Person Role + + + + + Character + 👩‍🎨 + ShortCodes + + :woman_artist: + + + + Categories + + Person Role + + + + + Character + 👨‍✈️ + ShortCodes + + :man_pilot: + + + + Categories + + Person Role + + + + + Character + 🧑‍🚀 + ShortCodes + + :astronaut: + + + + Categories + + Person Role + + + + + Character + 👩‍🚀 + ShortCodes + + :woman_astronaut: + + + + Categories + + Person Role + + + + + Character + 👨‍🚒 + ShortCodes + + :man_firefighter: + + + + Categories + + Person Role + + + + + Character + 👮 + ShortCodes + + :cop: + :police_officer: + + + Categories + + Person Role + + + + + Character + 👮‍♀️ + ShortCodes + + :policewoman: + + + + Categories + + Person Role + + + + + Character + 🕵️‍♂️ + ShortCodes + + :male_detective: + + + + Categories + + Person Role + + + + + Character + 💂 + ShortCodes + + :guard: + + + + Categories + + Person Role + + + + + Character + 💂‍♀️ + ShortCodes + + :guardswoman: + + + + Categories + + Person Role + + + + + Character + 👷 + ShortCodes + + :construction_worker: + + + + Categories + + Person Role + + + + + Character + 👷‍♀️ + ShortCodes + + :construction_worker_woman: + + + + Categories + + Person Role + + + + + Character + 👸 + ShortCodes + + :princess: + + + + Categories + + Person Role + + + + + Character + 👳‍♂️ + ShortCodes + + :man_with_turban: + + + + Categories + + Person Role + + + + + Character + 👲 + ShortCodes + + :man_with_gua_pi_mao: + + + + Categories + + Person Role + + + + + Character + 🤵 + ShortCodes + + :person_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + 🤵‍♀️ + ShortCodes + + :woman_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + 👰‍♂️ + ShortCodes + + :man_with_veil: + + + + Categories + + Person Role + + + + + Character + 🤰 + ShortCodes + + :pregnant_woman: + + + + Categories + + Person Role + + + + + Character + 👩‍🍼 + ShortCodes + + :woman_feeding_baby: + + + + Categories + + Person Role + + + + + Character + 🧑‍🍼 + ShortCodes + + :person_feeding_baby: + + + + Categories + + Person Role + + + + + Character + 👨‍⚕️ + ShortCodes + + :man_health_worker: + + + + Categories + + Person Role + + + + + Character + 🧑‍🎓 + ShortCodes + + :student: + + + + Categories + + Person Role + + + + + Character + 👩‍🎓 + ShortCodes + + :woman_student: + + + + Categories + + Person Role + + + + + Character + 👨‍🏫 + ShortCodes + + :man_teacher: + + + + Categories + + Person Role + + + + + Character + 🧑‍⚖️ + ShortCodes + + :judge: + + + + Categories + + Person Role + + + + + Character + 👩‍⚖️ + ShortCodes + + :woman_judge: + + + + Categories + + Person Role + + + + + Character + 👨‍🌾 + ShortCodes + + :man_farmer: + + + + Categories + + Person Role + + + + + Character + 🧑‍🍳 + ShortCodes + + :cook: + + + + Categories + + Person Role + + + + + Character + 👩‍🍳 + ShortCodes + + :woman_cook: + + + + Categories + + Person Role + + + + + Character + 👨‍🔧 + ShortCodes + + :man_mechanic: + + + + Categories + + Person Role + + + + + Character + 🧑‍🏭 + ShortCodes + + :factory_worker: + + + + Categories + + Person Role + + + + + Character + 👩‍🏭 + ShortCodes + + :woman_factory_worker: + + + + Categories + + Person Role + + + + + Character + 👨‍💼 + ShortCodes + + :man_office_worker: + + + + Categories + + Person Role + + + + + Character + 🧑‍🔬 + ShortCodes + + :scientist: + + + + Categories + + Person Role + + + + + Character + 👩‍🔬 + ShortCodes + + :woman_scientist: + + + + Categories + + Person Role + + + + + Character + 👨‍💻 + ShortCodes + + :man_technologist: + + + + Categories + + Person Role + + + + + Character + 🧑‍🎤 + ShortCodes + + :singer: + + + + Categories + + Person Role + + + + + Character + 👩‍🎤 + ShortCodes + + :woman_singer: + + + + Categories + + Person Role + + + + + Character + 👨‍🎨 + ShortCodes + + :man_artist: + + + + Categories + + Person Role + + + + + Character + 🧑‍✈️ + ShortCodes + + :pilot: + + + + Categories + + Person Role + + + + + Character + 👩‍✈️ + ShortCodes + + :woman_pilot: + + + + Categories + + Person Role + + + + + Character + 👨‍🚀 + ShortCodes + + :man_astronaut: + + + + Categories + + Person Role + + + + + Character + 🧑‍🚒 + ShortCodes + + :firefighter: + + + + Categories + + Person Role + + + + + Character + 👩‍🚒 + ShortCodes + + :woman_firefighter: + + + + Categories + + Person Role + + + + + Character + 👮‍♂️ + ShortCodes + + :policeman: + + + + Categories + + Person Role + + + + + Character + 🕵️ + ShortCodes + + :detective: + + + + Categories + + Person Role + + + + + Character + 🕵️‍♀️ + ShortCodes + + :female_detective: + + + + Categories + + Person Role + + + + + Character + 💂‍♂️ + ShortCodes + + :guardsman: + + + + Categories + + Person Role + + + + + Character + 🥷 + ShortCodes + + :ninja: + + + + Categories + + Person Role + + + + + Character + 👷‍♂️ + ShortCodes + + :construction_worker_man: + + + + Categories + + Person Role + + + + + Character + 🤴 + ShortCodes + + :prince: + + + + Categories + + Person Role + + + + + Character + 👳 + ShortCodes + + :person_with_turban: + + + + Categories + + Person Role + + + + + Character + 👳‍♀️ + ShortCodes + + :woman_with_turban: + + + + Categories + + Person Role + + + + + Character + 🧕 + ShortCodes + + :woman_with_headscarf: + + + + Categories + + Person Role + + + + + Character + 🤵‍♂️ + ShortCodes + + :man_in_tuxedo: + + + + Categories + + Person Role + + + + + Character + 👰 + ShortCodes + + :person_with_veil: + + + + Categories + + Person Role + + + + + Character + 👰‍♀️ + ShortCodes + + :bride_with_veil: + :woman_with_veil: + + + Categories + + Person Role + + + + + Character + 🤱 + ShortCodes + + :breast_feeding: + + + + Categories + + Person Role + + + + + Character + 👨‍🍼 + ShortCodes + + :man_feeding_baby: + + + + Categories + + Person Role + + + + + Character + 👼 + ShortCodes + + :angel: + + + + Categories + + Person Fantasy + + + + + Character + 🤶 + ShortCodes + + :mrs_claus: + + + + Categories + + Person Fantasy + + + + + Character + 🦸 + ShortCodes + + :superhero: + + + + Categories + + Person Fantasy + + + + + Character + 🦸‍♀️ + ShortCodes + + :superhero_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🦹‍♂️ + ShortCodes + + :supervillain_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧙 + ShortCodes + + :mage: + + + + Categories + + Person Fantasy + + + + + Character + 🧙‍♀️ + ShortCodes + + :mage_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧚‍♂️ + ShortCodes + + :fairy_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧛 + ShortCodes + + :vampire: + + + + Categories + + Person Fantasy + + + + + Character + 🧛‍♀️ + ShortCodes + + :vampire_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧜‍♂️ + ShortCodes + + :merman: + + + + Categories + + Person Fantasy + + + + + Character + 🧝 + ShortCodes + + :elf: + + + + Categories + + Person Fantasy + + + + + Character + 🧝‍♀️ + ShortCodes + + :elf_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧞‍♂️ + ShortCodes + + :genie_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧟 + ShortCodes + + :zombie: + + + + Categories + + Person Fantasy + + + + + Character + 🧟‍♀️ + ShortCodes + + :zombie_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🎅 + ShortCodes + + :santa: + + + + Categories + + Person Fantasy + + + + + Character + 🧑‍🎄 + ShortCodes + + :mx_claus: + + + + Categories + + Person Fantasy + + + + + Character + 🦸‍♂️ + ShortCodes + + :superhero_man: + + + + Categories + + Person Fantasy + + + + + Character + 🦹 + ShortCodes + + :supervillain: + + + + Categories + + Person Fantasy + + + + + Character + 🦹‍♀️ + ShortCodes + + :supervillain_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧙‍♂️ + ShortCodes + + :mage_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧚 + ShortCodes + + :fairy: + + + + Categories + + Person Fantasy + + + + + Character + 🧚‍♀️ + ShortCodes + + :fairy_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧛‍♂️ + ShortCodes + + :vampire_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧜 + ShortCodes + + :merperson: + + + + Categories + + Person Fantasy + + + + + Character + 🧜‍♀️ + ShortCodes + + :mermaid: + + + + Categories + + Person Fantasy + + + + + Character + 🧝‍♂️ + ShortCodes + + :elf_man: + + + + Categories + + Person Fantasy + + + + + Character + 🧞 + ShortCodes + + :genie: + + + + Categories + + Person Fantasy + + + + + Character + 🧞‍♀️ + ShortCodes + + :genie_woman: + + + + Categories + + Person Fantasy + + + + + Character + 🧟‍♂️ + ShortCodes + + :zombie_man: + + + + Categories + + Person Fantasy + + + + + Character + 💆 + ShortCodes + + :massage: + + + + Categories + + Person Activity + + + + + Character + 💆‍♀️ + ShortCodes + + :massage_woman: + + + + Categories + + Person Activity + + + + + Character + 💇‍♂️ + ShortCodes + + :haircut_man: + + + + Categories + + Person Activity + + + + + Character + 🚶 + ShortCodes + + :walking: + + + + Categories + + Person Activity + + + + + Character + 🚶‍♀️ + ShortCodes + + :walking_woman: + + + + Categories + + Person Activity + + + + + Character + 🧍‍♂️ + ShortCodes + + :standing_man: + + + + Categories + + Person Activity + + + + + Character + 🧎 + ShortCodes + + :kneeling_person: + + + + Categories + + Person Activity + + + + + Character + 🧎‍♀️ + ShortCodes + + :kneeling_woman: + + + + Categories + + Person Activity + + + + + Character + 👨‍🦯 + ShortCodes + + :man_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + 🧑‍🦼 + ShortCodes + + :person_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 👩‍🦼 + ShortCodes + + :woman_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 👨‍🦽 + ShortCodes + + :man_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 🏃 + ShortCodes + + :runner: + :running: + + + Categories + + Person Activity + + + + + Character + 🏃‍♀️ + ShortCodes + + :running_woman: + + + + Categories + + Person Activity + + + + + Character + 🕺 + ShortCodes + + :man_dancing: + + + + Categories + + Person Activity + + + + + Character + 👯 + ShortCodes + + :dancers: + + + + Categories + + Person Activity + + + + + Character + 👯‍♀️ + ShortCodes + + :dancing_women: + + + + Categories + + Person Activity + + + + + Character + 🧖‍♂️ + ShortCodes + + :sauna_man: + + + + Categories + + Person Activity + + + + + Character + 🧗 + ShortCodes + + :climbing: + + + + Categories + + Person Activity + + + + + Character + 🧗‍♀️ + ShortCodes + + :climbing_woman: + + + + Categories + + Person Activity + + + + + Character + 💆‍♂️ + ShortCodes + + :massage_man: + + + + Categories + + Person Activity + + + + + Character + 💇 + ShortCodes + + :haircut: + + + + Categories + + Person Activity + + + + + Character + 💇‍♀️ + ShortCodes + + :haircut_woman: + + + + Categories + + Person Activity + + + + + Character + 🚶‍♂️ + ShortCodes + + :walking_man: + + + + Categories + + Person Activity + + + + + Character + 🧍 + ShortCodes + + :standing_person: + + + + Categories + + Person Activity + + + + + Character + 🧍‍♀️ + ShortCodes + + :standing_woman: + + + + Categories + + Person Activity + + + + + Character + 🧎‍♂️ + ShortCodes + + :kneeling_man: + + + + Categories + + Person Activity + + + + + Character + 🧑‍🦯 + ShortCodes + + :person_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + 👩‍🦯 + ShortCodes + + :woman_with_probing_cane: + + + + Categories + + Person Activity + + + + + Character + 👨‍🦼 + ShortCodes + + :man_in_motorized_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 🧑‍🦽 + ShortCodes + + :person_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 👩‍🦽 + ShortCodes + + :woman_in_manual_wheelchair: + + + + Categories + + Person Activity + + + + + Character + 🏃‍♂️ + ShortCodes + + :running_man: + + + + Categories + + Person Activity + + + + + Character + 💃 + ShortCodes + + :dancer: + :woman_dancing: + + + Categories + + Person Activity + + + + + Character + 🕴️ + ShortCodes + + :business_suit_levitating: + + + + Categories + + Person Activity + + + + + Character + 👯‍♂️ + ShortCodes + + :dancing_men: + + + + Categories + + Person Activity + + + + + Character + 🧖 + ShortCodes + + :sauna_person: + + + + Categories + + Person Activity + + + + + Character + 🧖‍♀️ + ShortCodes + + :sauna_woman: + + + + Categories + + Person Activity + + + + + Character + 🧗‍♂️ + ShortCodes + + :climbing_man: + + + + Categories + + Person Activity + + + + + Character + 🤺 + ShortCodes + + :person_fencing: + + + + Categories + + Person Sport + + + + + Character + ⛷️ + ShortCodes + + :skier: + + + + Categories + + Person Sport + + + + + Character + 🏌️ + ShortCodes + + :golfing: + + + + Categories + + Person Sport + + + + + Character + 🏌️‍♀️ + ShortCodes + + :golfing_woman: + + + + Categories + + Person Sport + + + + + Character + 🏄‍♂️ + ShortCodes + + :surfing_man: + + + + Categories + + Person Sport + + + + + Character + 🚣 + ShortCodes + + :rowboat: + + + + Categories + + Person Sport + + + + + Character + 🚣‍♀️ + ShortCodes + + :rowing_woman: + + + + Categories + + Person Sport + + + + + Character + 🏊‍♂️ + ShortCodes + + :swimming_man: + + + + Categories + + Person Sport + + + + + Character + ⛹️ + ShortCodes + + :bouncing_ball_person: + + + + Categories + + Person Sport + + + + + Character + ⛹️‍♀️ + ShortCodes + + :basketball_woman: + :bouncing_ball_woman: + + + Categories + + Person Sport + + + + + Character + 🏋️‍♂️ + ShortCodes + + :weight_lifting_man: + + + + Categories + + Person Sport + + + + + Character + 🚴 + ShortCodes + + :bicyclist: + + + + Categories + + Person Sport + + + + + Character + 🚴‍♀️ + ShortCodes + + :biking_woman: + + + + Categories + + Person Sport + + + + + Character + 🚵‍♂️ + ShortCodes + + :mountain_biking_man: + + + + Categories + + Person Sport + + + + + Character + 🤸 + ShortCodes + + :cartwheeling: + + + + Categories + + Person Sport + + + + + Character + 🤸‍♀️ + ShortCodes + + :woman_cartwheeling: + + + + Categories + + Person Sport + + + + + Character + 🤼‍♂️ + ShortCodes + + :men_wrestling: + + + + Categories + + Person Sport + + + + + Character + 🤽 + ShortCodes + + :water_polo: + + + + Categories + + Person Sport + + + + + Character + 🤽‍♀️ + ShortCodes + + :woman_playing_water_polo: + + + + Categories + + Person Sport + + + + + Character + 🤾‍♂️ + ShortCodes + + :man_playing_handball: + + + + Categories + + Person Sport + + + + + Character + 🤹 + ShortCodes + + :juggling_person: + + + + Categories + + Person Sport + + + + + Character + 🤹‍♀️ + ShortCodes + + :woman_juggling: + + + + Categories + + Person Sport + + + + + Character + 🏇 + ShortCodes + + :horse_racing: + + + + Categories + + Person Sport + + + + + Character + 🏂 + ShortCodes + + :snowboarder: + + + + Categories + + Person Sport + + + + + Character + 🏌️‍♂️ + ShortCodes + + :golfing_man: + + + + Categories + + Person Sport + + + + + Character + 🏄 + ShortCodes + + :surfer: + + + + Categories + + Person Sport + + + + + Character + 🏄‍♀️ + ShortCodes + + :surfing_woman: + + + + Categories + + Person Sport + + + + + Character + 🚣‍♂️ + ShortCodes + + :rowing_man: + + + + Categories + + Person Sport + + + + + Character + 🏊 + ShortCodes + + :swimmer: + + + + Categories + + Person Sport + + + + + Character + 🏊‍♀️ + ShortCodes + + :swimming_woman: + + + + Categories + + Person Sport + + + + + Character + ⛹️‍♂️ + ShortCodes + + :basketball_man: + :bouncing_ball_man: + + + Categories + + Person Sport + + + + + Character + 🏋️ + ShortCodes + + :weight_lifting: + + + + Categories + + Person Sport + + + + + Character + 🏋️‍♀️ + ShortCodes + + :weight_lifting_woman: + + + + Categories + + Person Sport + + + + + Character + 🚴‍♂️ + ShortCodes + + :biking_man: + + + + Categories + + Person Sport + + + + + Character + 🚵 + ShortCodes + + :mountain_bicyclist: + + + + Categories + + Person Sport + + + + + Character + 🚵‍♀️ + ShortCodes + + :mountain_biking_woman: + + + + Categories + + Person Sport + + + + + Character + 🤸‍♂️ + ShortCodes + + :man_cartwheeling: + + + + Categories + + Person Sport + + + + + Character + 🤼 + ShortCodes + + :wrestling: + + + + Categories + + Person Sport + + + + + Character + 🤼‍♀️ + ShortCodes + + :women_wrestling: + + + + Categories + + Person Sport + + + + + Character + 🤽‍♂️ + ShortCodes + + :man_playing_water_polo: + + + + Categories + + Person Sport + + + + + Character + 🤾 + ShortCodes + + :handball_person: + + + + Categories + + Person Sport + + + + + Character + 🤾‍♀️ + ShortCodes + + :woman_playing_handball: + + + + Categories + + Person Sport + + + + + Character + 🤹‍♂️ + ShortCodes + + :man_juggling: + + + + Categories + + Person Sport + + + + + Character + 🧘 + ShortCodes + + :lotus_position: + + + + Categories + + Person Resting + + + + + Character + 🧘‍♀️ + ShortCodes + + :lotus_position_woman: + + + + Categories + + Person Resting + + + + + Character + 🛌 + ShortCodes + + :sleeping_bed: + + + + Categories + + Person Resting + + + + + Character + 🧘‍♂️ + ShortCodes + + :lotus_position_man: + + + + Categories + + Person Resting + + + + + Character + 🛀 + ShortCodes + + :bath: + + + + Categories + + Person Resting + + + + + Character + 🧑‍🤝‍🧑 + ShortCodes + + :people_holding_hands: + + + + Categories + + Person + Family + + + + Character + 👫 + ShortCodes + + :couple: + + + + Categories + + Person + Family + + + + Character + 💏 + ShortCodes + + :couplekiss: + + + + Categories + + Person + Family + + + + Character + 👨‍❤️‍💋‍👨 + ShortCodes + + :couplekiss_man_man: + + + + Categories + + Person + Family + + + + Character + 💑 + ShortCodes + + :couple_with_heart: + + + + Categories + + Person + Family + + + + Character + 👨‍❤️‍👨 + ShortCodes + + :couple_with_heart_man_man: + + + + Categories + + Person + Family + + + + Character + 👪 + ShortCodes + + :family: + + + + Categories + + Person + Family + + + + Character + 👨‍👩‍👧 + ShortCodes + + :family_man_woman_girl: + + + + Categories + + Person + Family + + + + Character + 👨‍👩‍👦‍👦 + ShortCodes + + :family_man_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👨‍👦 + ShortCodes + + :family_man_man_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👨‍👧‍👦 + ShortCodes + + :family_man_man_girl_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👨‍👧‍👧 + ShortCodes + + :family_man_man_girl_girl: + + + + Categories + + Person + Family + + + + Character + 👩‍👩‍👧 + ShortCodes + + :family_woman_woman_girl: + + + + Categories + + Person + Family + + + + Character + 👩‍👩‍👦‍👦 + ShortCodes + + :family_woman_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👦 + ShortCodes + + :family_man_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👧 + ShortCodes + + :family_man_girl: + + + + Categories + + Person + Family + + + + Character + 👨‍👧‍👧 + ShortCodes + + :family_man_girl_girl: + + + + Categories + + Person + Family + + + + Character + 👩‍👦‍👦 + ShortCodes + + :family_woman_boy_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👧‍👦 + ShortCodes + + :family_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + 👭 + ShortCodes + + :two_women_holding_hands: + + + + Categories + + Person + Family + + + + Character + 👬 + ShortCodes + + :two_men_holding_hands: + + + + Categories + + Person + Family + + + + Character + 👩‍❤️‍💋‍👨 + ShortCodes + + :couplekiss_man_woman: + + + + Categories + + Person + Family + + + + Character + 👩‍❤️‍💋‍👩 + ShortCodes + + :couplekiss_woman_woman: + + + + Categories + + Person + Family + + + + Character + 👩‍❤️‍👨 + ShortCodes + + :couple_with_heart_woman_man: + + + + Categories + + Person + Family + + + + Character + 👩‍❤️‍👩 + ShortCodes + + :couple_with_heart_woman_woman: + + + + Categories + + Person + Family + + + + Character + 👨‍👩‍👦 + ShortCodes + + :family_man_woman_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👩‍👧‍👦 + ShortCodes + + :family_man_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👩‍👧‍👧 + ShortCodes + + :family_man_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + 👨‍👨‍👧 + ShortCodes + + :family_man_man_girl: + + + + Categories + + Person + Family + + + + Character + 👨‍👨‍👦‍👦 + ShortCodes + + :family_man_man_boy_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👩‍👦 + ShortCodes + + :family_woman_woman_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👩‍👧‍👦 + ShortCodes + + :family_woman_woman_girl_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👩‍👧‍👧 + ShortCodes + + :family_woman_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + 👨‍👦‍👦 + ShortCodes + + :family_man_boy_boy: + + + + Categories + + Person + Family + + + + Character + 👨‍👧‍👦 + ShortCodes + + :family_man_girl_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👦 + ShortCodes + + :family_woman_boy: + + + + Categories + + Person + Family + + + + Character + 👩‍👧 + ShortCodes + + :family_woman_girl: + + + + Categories + + Person + Family + + + + Character + 👩‍👧‍👧 + ShortCodes + + :family_woman_girl_girl: + + + + Categories + + Person + Family + + + + Character + 🗣️ + ShortCodes + + :speaking_head: + + + + Categories + + Person Symbol + + + + + Character + 👥 + ShortCodes + + :busts_in_silhouette: + + + + Categories + + Person Symbol + + + + + Character + 👣 + ShortCodes + + :footprints: + + + + Categories + + Person Symbol + + + + + Character + 👤 + ShortCodes + + :bust_in_silhouette: + + + + Categories + + Person Symbol + + + + + Character + 🫂 + ShortCodes + + :people_hugging: + + + + Categories + + Person Symbol + + + + + Character + 🐵 + ShortCodes + + :monkey_face: + + + + Categories + + Animal Mammal + + + + + Character + 🦍 + ShortCodes + + :gorilla: + + + + Categories + + Animal Mammal + + + + + Character + 🐶 + ShortCodes + + :dog: + + + + Categories + + Animal Mammal + + + + + Character + 🦮 + ShortCodes + + :guide_dog: + + + + Categories + + Animal Mammal + + + + + Character + 🐩 + ShortCodes + + :poodle: + + + + Categories + + Animal Mammal + + + + + Character + 🦊 + ShortCodes + + :fox_face: + + + + Categories + + Animal Mammal + + + + + Character + 🐱 + ShortCodes + + :cat: + + + + Categories + + Animal Mammal + + + + + Character + 🐈‍⬛ + ShortCodes + + :black_cat: + + + + Categories + + Animal Mammal + + + + + Character + 🐯 + ShortCodes + + :tiger: + + + + Categories + + Animal Mammal + + + + + Character + 🐆 + ShortCodes + + :leopard: + + + + Categories + + Animal Mammal + + + + + Character + 🐎 + ShortCodes + + :racehorse: + + + + Categories + + Animal Mammal + + + + + Character + 🦓 + ShortCodes + + :zebra: + + + + Categories + + Animal Mammal + + + + + Character + 🦬 + ShortCodes + + :bison: + + + + Categories + + Animal Mammal + + + + + Character + 🐂 + ShortCodes + + :ox: + + + + Categories + + Animal Mammal + + + + + Character + 🐄 + ShortCodes + + :cow2: + + + + Categories + + Animal Mammal + + + + + Character + 🐖 + ShortCodes + + :pig2: + + + + Categories + + Animal Mammal + + + + + Character + 🐽 + ShortCodes + + :pig_nose: + + + + Categories + + Animal Mammal + + + + + Character + 🐑 + ShortCodes + + :sheep: + + + + Categories + + Animal Mammal + + + + + Character + 🐪 + ShortCodes + + :dromedary_camel: + + + + Categories + + Animal Mammal + + + + + Character + 🦙 + ShortCodes + + :llama: + + + + Categories + + Animal Mammal + + + + + Character + 🐘 + ShortCodes + + :elephant: + + + + Categories + + Animal Mammal + + + + + Character + 🦏 + ShortCodes + + :rhinoceros: + + + + Categories + + Animal Mammal + + + + + Character + 🐭 + ShortCodes + + :mouse: + + + + Categories + + Animal Mammal + + + + + Character + 🐀 + ShortCodes + + :rat: + + + + Categories + + Animal Mammal + + + + + Character + 🐰 + ShortCodes + + :rabbit: + + + + Categories + + Animal Mammal + + + + + Character + 🐿️ + ShortCodes + + :chipmunk: + + + + Categories + + Animal Mammal + + + + + Character + 🦔 + ShortCodes + + :hedgehog: + + + + Categories + + Animal Mammal + + + + + Character + 🐻 + ShortCodes + + :bear: + + + + Categories + + Animal Mammal + + + + + Character + 🐨 + ShortCodes + + :koala: + + + + Categories + + Animal Mammal + + + + + Character + 🦥 + ShortCodes + + :sloth: + + + + Categories + + Animal Mammal + + + + + Character + 🦨 + ShortCodes + + :skunk: + + + + Categories + + Animal Mammal + + + + + Character + 🦡 + ShortCodes + + :badger: + + + + Categories + + Animal Mammal + + + + + Character + 🐒 + ShortCodes + + :monkey: + + + + Categories + + Animal Mammal + + + + + Character + 🦧 + ShortCodes + + :orangutan: + + + + Categories + + Animal Mammal + + + + + Character + 🐕 + ShortCodes + + :dog2: + + + + Categories + + Animal Mammal + + + + + Character + 🐕‍🦺 + ShortCodes + + :service_dog: + + + + Categories + + Animal Mammal + + + + + Character + 🐺 + ShortCodes + + :wolf: + + + + Categories + + Animal Mammal + + + + + Character + 🦝 + ShortCodes + + :raccoon: + + + + Categories + + Animal Mammal + + + + + Character + 🐈 + ShortCodes + + :cat2: + + + + Categories + + Animal Mammal + + + + + Character + 🦁 + ShortCodes + + :lion: + + + + Categories + + Animal Mammal + + + + + Character + 🐅 + ShortCodes + + :tiger2: + + + + Categories + + Animal Mammal + + + + + Character + 🐴 + ShortCodes + + :horse: + + + + Categories + + Animal Mammal + + + + + Character + 🦄 + ShortCodes + + :unicorn: + + + + Categories + + Animal Mammal + + + + + Character + 🦌 + ShortCodes + + :deer: + + + + Categories + + Animal Mammal + + + + + Character + 🐮 + ShortCodes + + :cow: + + + + Categories + + Animal Mammal + + + + + Character + 🐃 + ShortCodes + + :water_buffalo: + + + + Categories + + Animal Mammal + + + + + Character + 🐷 + ShortCodes + + :pig: + + + + Categories + + Animal Mammal + + + + + Character + 🐗 + ShortCodes + + :boar: + + + + Categories + + Animal Mammal + + + + + Character + 🐏 + ShortCodes + + :ram: + + + + Categories + + Animal Mammal + + + + + Character + 🐐 + ShortCodes + + :goat: + + + + Categories + + Animal Mammal + + + + + Character + 🐫 + ShortCodes + + :camel: + + + + Categories + + Animal Mammal + + + + + Character + 🦒 + ShortCodes + + :giraffe: + + + + Categories + + Animal Mammal + + + + + Character + 🦣 + ShortCodes + + :mammoth: + + + + Categories + + Animal Mammal + + + + + Character + 🦛 + ShortCodes + + :hippopotamus: + + + + Categories + + Animal Mammal + + + + + Character + 🐁 + ShortCodes + + :mouse2: + + + + Categories + + Animal Mammal + + + + + Character + 🐹 + ShortCodes + + :hamster: + + + + Categories + + Animal Mammal + + + + + Character + 🐇 + ShortCodes + + :rabbit2: + + + + Categories + + Animal Mammal + + + + + Character + 🦫 + ShortCodes + + :beaver: + + + + Categories + + Animal Mammal + + + + + Character + 🦇 + ShortCodes + + :bat: + + + + Categories + + Animal Mammal + + + + + Character + 🐻‍❄️ + ShortCodes + + :polar_bear: + + + + Categories + + Animal Mammal + + + + + Character + 🐼 + ShortCodes + + :panda_face: + + + + Categories + + Animal Mammal + + + + + Character + 🦦 + ShortCodes + + :otter: + + + + Categories + + Animal Mammal + + + + + Character + 🦘 + ShortCodes + + :kangaroo: + + + + Categories + + Animal Mammal + + + + + Character + 🐾 + ShortCodes + + :feet: + :paw_prints: + + + Categories + + Animal Mammal + + + + + Character + 🦃 + ShortCodes + + :turkey: + + + + Categories + + Animal Bird + + + + + Character + 🐓 + ShortCodes + + :rooster: + + + + Categories + + Animal Bird + + + + + Character + 🐤 + ShortCodes + + :baby_chick: + + + + Categories + + Animal Bird + + + + + Character + 🐦 + ShortCodes + + :bird: + + + + Categories + + Animal Bird + + + + + Character + 🕊️ + ShortCodes + + :dove: + + + + Categories + + Animal Bird + + + + + Character + 🦆 + ShortCodes + + :duck: + + + + Categories + + Animal Bird + + + + + Character + 🦉 + ShortCodes + + :owl: + + + + Categories + + Animal Bird + + + + + Character + 🪶 + ShortCodes + + :feather: + + + + Categories + + Animal Bird + + + + + Character + 🦚 + ShortCodes + + :peacock: + + + + Categories + + Animal Bird + + + + + Character + 🐔 + ShortCodes + + :chicken: + + + + Categories + + Animal Bird + + + + + Character + 🐣 + ShortCodes + + :hatching_chick: + + + + Categories + + Animal Bird + + + + + Character + 🐥 + ShortCodes + + :hatched_chick: + + + + Categories + + Animal Bird + + + + + Character + 🐧 + ShortCodes + + :penguin: + + + + Categories + + Animal Bird + + + + + Character + 🦅 + ShortCodes + + :eagle: + + + + Categories + + Animal Bird + + + + + Character + 🦢 + ShortCodes + + :swan: + + + + Categories + + Animal Bird + + + + + Character + 🦤 + ShortCodes + + :dodo: + + + + Categories + + Animal Bird + + + + + Character + 🦩 + ShortCodes + + :flamingo: + + + + Categories + + Animal Bird + + + + + Character + 🦜 + ShortCodes + + :parrot: + + + + Categories + + Animal Bird + + + + + Character + 🐸 + ShortCodes + + :frog: + + + + Categories + + Animal Amphibian + + + + + Character + 🐊 + ShortCodes + + :crocodile: + + + + Categories + + Animal Reptile + + + + + Character + 🦎 + ShortCodes + + :lizard: + + + + Categories + + Animal Reptile + + + + + Character + 🐲 + ShortCodes + + :dragon_face: + + + + Categories + + Animal Reptile + + + + + Character + 🦕 + ShortCodes + + :sauropod: + + + + Categories + + Animal Reptile + + + + + Character + 🐢 + ShortCodes + + :turtle: + + + + Categories + + Animal Reptile + + + + + Character + 🐍 + ShortCodes + + :snake: + + + + Categories + + Animal Reptile + + + + + Character + 🐉 + ShortCodes + + :dragon: + + + + Categories + + Animal Reptile + + + + + Character + 🦖 + ShortCodes + + :t-rex: + + + + Categories + + Animal Reptile + + + + + Character + 🐳 + ShortCodes + + :whale: + + + + Categories + + Animal Marine + + + + + Character + 🐬 + ShortCodes + + :dolphin: + :flipper: + + + Categories + + Animal Marine + + + + + Character + 🐟 + ShortCodes + + :fish: + + + + Categories + + Animal Marine + + + + + Character + 🐡 + ShortCodes + + :blowfish: + + + + Categories + + Animal Marine + + + + + Character + 🐙 + ShortCodes + + :octopus: + + + + Categories + + Animal Marine + + + + + Character + 🐋 + ShortCodes + + :whale2: + + + + Categories + + Animal Marine + + + + + Character + 🦭 + ShortCodes + + :seal: + + + + Categories + + Animal Marine + + + + + Character + 🐠 + ShortCodes + + :tropical_fish: + + + + Categories + + Animal Marine + + + + + Character + 🦈 + ShortCodes + + :shark: + + + + Categories + + Animal Marine + + + + + Character + 🐚 + ShortCodes + + :shell: + + + + Categories + + Animal Marine + + + + + Character + 🐌 + ShortCodes + + :snail: + + + + Categories + + Animal Bug + + + + + Character + 🐛 + ShortCodes + + :bug: + + + + Categories + + Animal Bug + + + + + Character + 🐝 + ShortCodes + + :bee: + :honeybee: + + + Categories + + Animal Bug + + + + + Character + 🐞 + ShortCodes + + :lady_beetle: + + + + Categories + + Animal Bug + + + + + Character + 🪳 + ShortCodes + + :cockroach: + + + + Categories + + Animal Bug + + + + + Character + 🕸️ + ShortCodes + + :spider_web: + + + + Categories + + Animal Bug + + + + + Character + 🦟 + ShortCodes + + :mosquito: + + + + Categories + + Animal Bug + + + + + Character + 🪱 + ShortCodes + + :worm: + + + + Categories + + Animal Bug + + + + + Character + 🦋 + ShortCodes + + :butterfly: + + + + Categories + + Animal Bug + + + + + Character + 🐜 + ShortCodes + + :ant: + + + + Categories + + Animal Bug + + + + + Character + 🪲 + ShortCodes + + :beetle: + + + + Categories + + Animal Bug + + + + + Character + 🦗 + ShortCodes + + :cricket: + + + + Categories + + Animal Bug + + + + + Character + 🕷️ + ShortCodes + + :spider: + + + + Categories + + Animal Bug + + + + + Character + 🦂 + ShortCodes + + :scorpion: + + + + Categories + + Animal Bug + + + + + Character + 🪰 + ShortCodes + + :fly: + + + + Categories + + Animal Bug + + + + + Character + 🦠 + ShortCodes + + :microbe: + + + + Categories + + Animal Bug + + + + + Character + 💐 + ShortCodes + + :bouquet: + + + + Categories + + Plant Flower + + + + + Character + 💮 + ShortCodes + + :white_flower: + + + + Categories + + Plant Flower + + + + + Character + 🌹 + ShortCodes + + :rose: + + + + Categories + + Plant Flower + + + + + Character + 🌺 + ShortCodes + + :hibiscus: + + + + Categories + + Plant Flower + + + + + Character + 🌼 + ShortCodes + + :blossom: + + + + Categories + + Plant Flower + + + + + Character + 🌸 + ShortCodes + + :cherry_blossom: + + + + Categories + + Plant Flower + + + + + Character + 🏵️ + ShortCodes + + :rosette: + + + + Categories + + Plant Flower + + + + + Character + 🥀 + ShortCodes + + :wilted_flower: + + + + Categories + + Plant Flower + + + + + Character + 🌻 + ShortCodes + + :sunflower: + + + + Categories + + Plant Flower + + + + + Character + 🌷 + ShortCodes + + :tulip: + + + + Categories + + Plant Flower + + + + + Character + 🌱 + ShortCodes + + :seedling: + + + + Categories + + Plant Other + + + + + Character + 🌲 + ShortCodes + + :evergreen_tree: + + + + Categories + + Plant Other + + + + + Character + 🌴 + ShortCodes + + :palm_tree: + + + + Categories + + Plant Other + + + + + Character + 🌾 + ShortCodes + + :ear_of_rice: + + + + Categories + + Plant Other + + + + + Character + ☘️ + ShortCodes + + :shamrock: + + + + Categories + + Plant Other + + + + + Character + 🍁 + ShortCodes + + :maple_leaf: + + + + Categories + + Plant Other + + + + + Character + 🍃 + ShortCodes + + :leaves: + + + + Categories + + Plant Other + + + + + Character + 🪴 + ShortCodes + + :potted_plant: + + + + Categories + + Plant Other + + + + + Character + 🌳 + ShortCodes + + :deciduous_tree: + + + + Categories + + Plant Other + + + + + Character + 🌵 + ShortCodes + + :cactus: + + + + Categories + + Plant Other + + + + + Character + 🌿 + ShortCodes + + :herb: + + + + Categories + + Plant Other + + + + + Character + 🍀 + ShortCodes + + :four_leaf_clover: + + + + Categories + + Plant Other + + + + + Character + 🍂 + ShortCodes + + :fallen_leaf: + + + + Categories + + Plant Other + + + + + Character + 🍇 + ShortCodes + + :grapes: + + + + Categories + + Food Fruit + + + + + Character + 🍉 + ShortCodes + + :watermelon: + + + + Categories + + Food Fruit + + + + + Character + 🍋 + ShortCodes + + :lemon: + + + + Categories + + Food Fruit + + + + + Character + 🍍 + ShortCodes + + :pineapple: + + + + Categories + + Food Fruit + + + + + Character + 🍎 + ShortCodes + + :apple: + + + + Categories + + Food Fruit + + + + + Character + 🍐 + ShortCodes + + :pear: + + + + Categories + + Food Fruit + + + + + Character + 🍒 + ShortCodes + + :cherries: + + + + Categories + + Food Fruit + + + + + Character + 🫐 + ShortCodes + + :blueberries: + + + + Categories + + Food Fruit + + + + + Character + 🍅 + ShortCodes + + :tomato: + + + + Categories + + Food Fruit + + + + + Character + 🥥 + ShortCodes + + :coconut: + + + + Categories + + Food Fruit + + + + + Character + 🍈 + ShortCodes + + :melon: + + + + Categories + + Food Fruit + + + + + Character + 🍊 + ShortCodes + + :mandarin: + :orange: + :tangerine: + + Categories + + Food Fruit + + + + + Character + 🍌 + ShortCodes + + :banana: + + + + Categories + + Food Fruit + + + + + Character + 🥭 + ShortCodes + + :mango: + + + + Categories + + Food Fruit + + + + + Character + 🍏 + ShortCodes + + :green_apple: + + + + Categories + + Food Fruit + + + + + Character + 🍑 + ShortCodes + + :peach: + + + + Categories + + Food Fruit + + + + + Character + 🍓 + ShortCodes + + :strawberry: + + + + Categories + + Food Fruit + + + + + Character + 🥝 + ShortCodes + + :kiwi_fruit: + + + + Categories + + Food Fruit + + + + + Character + 🫒 + ShortCodes + + :olive: + + + + Categories + + Food Fruit + + + + + Character + 🥑 + ShortCodes + + :avocado: + + + + Categories + + Food Vegetable + + + + + Character + 🥔 + ShortCodes + + :potato: + + + + Categories + + Food Vegetable + + + + + Character + 🌽 + ShortCodes + + :corn: + + + + Categories + + Food Vegetable + + + + + Character + 🫑 + ShortCodes + + :bell_pepper: + + + + Categories + + Food Vegetable + + + + + Character + 🥬 + ShortCodes + + :leafy_green: + + + + Categories + + Food Vegetable + + + + + Character + 🧄 + ShortCodes + + :garlic: + + + + Categories + + Food Vegetable + + + + + Character + 🍄 + ShortCodes + + :mushroom: + + + + Categories + + Food Vegetable + + + + + Character + 🌰 + ShortCodes + + :chestnut: + + + + Categories + + Food Vegetable + + + + + Character + 🍆 + ShortCodes + + :eggplant: + + + + Categories + + Food Vegetable + + + + + Character + 🥕 + ShortCodes + + :carrot: + + + + Categories + + Food Vegetable + + + + + Character + 🌶️ + ShortCodes + + :hot_pepper: + + + + Categories + + Food Vegetable + + + + + Character + 🥒 + ShortCodes + + :cucumber: + + + + Categories + + Food Vegetable + + + + + Character + 🥦 + ShortCodes + + :broccoli: + + + + Categories + + Food Vegetable + + + + + Character + 🧅 + ShortCodes + + :onion: + + + + Categories + + Food Vegetable + + + + + Character + 🥜 + ShortCodes + + :peanuts: + + + + Categories + + Food Vegetable + + + + + Character + 🍞 + ShortCodes + + :bread: + + + + Categories + + Food Prepared + + + + + Character + 🥖 + ShortCodes + + :baguette_bread: + + + + Categories + + Food Prepared + + + + + Character + 🥨 + ShortCodes + + :pretzel: + + + + Categories + + Food Prepared + + + + + Character + 🥞 + ShortCodes + + :pancakes: + + + + Categories + + Food Prepared + + + + + Character + 🧀 + ShortCodes + + :cheese: + + + + Categories + + Food Prepared + + + + + Character + 🍗 + ShortCodes + + :poultry_leg: + + + + Categories + + Food Prepared + + + + + Character + 🥓 + ShortCodes + + :bacon: + + + + Categories + + Food Prepared + + + + + Character + 🍟 + ShortCodes + + :fries: + + + + Categories + + Food Prepared + + + + + Character + 🌭 + ShortCodes + + :hotdog: + + + + Categories + + Food Prepared + + + + + Character + 🌮 + ShortCodes + + :taco: + + + + Categories + + Food Prepared + + + + + Character + 🫔 + ShortCodes + + :tamale: + + + + Categories + + Food Prepared + + + + + Character + 🧆 + ShortCodes + + :falafel: + + + + Categories + + Food Prepared + + + + + Character + 🍳 + ShortCodes + + :fried_egg: + + + + Categories + + Food Prepared + + + + + Character + 🍲 + ShortCodes + + :stew: + + + + Categories + + Food Prepared + + + + + Character + 🥣 + ShortCodes + + :bowl_with_spoon: + + + + Categories + + Food Prepared + + + + + Character + 🍿 + ShortCodes + + :popcorn: + + + + Categories + + Food Prepared + + + + + Character + 🧂 + ShortCodes + + :salt: + + + + Categories + + Food Prepared + + + + + Character + 🥐 + ShortCodes + + :croissant: + + + + Categories + + Food Prepared + + + + + Character + 🫓 + ShortCodes + + :flatbread: + + + + Categories + + Food Prepared + + + + + Character + 🥯 + ShortCodes + + :bagel: + + + + Categories + + Food Prepared + + + + + Character + 🧇 + ShortCodes + + :waffle: + + + + Categories + + Food Prepared + + + + + Character + 🍖 + ShortCodes + + :meat_on_bone: + + + + Categories + + Food Prepared + + + + + Character + 🥩 + ShortCodes + + :cut_of_meat: + + + + Categories + + Food Prepared + + + + + Character + 🍔 + ShortCodes + + :hamburger: + + + + Categories + + Food Prepared + + + + + Character + 🍕 + ShortCodes + + :pizza: + + + + Categories + + Food Prepared + + + + + Character + 🥪 + ShortCodes + + :sandwich: + + + + Categories + + Food Prepared + + + + + Character + 🌯 + ShortCodes + + :burrito: + + + + Categories + + Food Prepared + + + + + Character + 🥙 + ShortCodes + + :stuffed_flatbread: + + + + Categories + + Food Prepared + + + + + Character + 🥚 + ShortCodes + + :egg: + + + + Categories + + Food Prepared + + + + + Character + 🥘 + ShortCodes + + :shallow_pan_of_food: + + + + Categories + + Food Prepared + + + + + Character + 🫕 + ShortCodes + + :fondue: + + + + Categories + + Food Prepared + + + + + Character + 🥗 + ShortCodes + + :green_salad: + + + + Categories + + Food Prepared + + + + + Character + 🧈 + ShortCodes + + :butter: + + + + Categories + + Food Prepared + + + + + Character + 🥫 + ShortCodes + + :canned_food: + + + + Categories + + Food Prepared + + + + + Character + 🍱 + ShortCodes + + :bento: + + + + Categories + + Food Asian + + + + + Character + 🍙 + ShortCodes + + :rice_ball: + + + + Categories + + Food Asian + + + + + Character + 🍛 + ShortCodes + + :curry: + + + + Categories + + Food Asian + + + + + Character + 🍝 + ShortCodes + + :spaghetti: + + + + Categories + + Food Asian + + + + + Character + 🍢 + ShortCodes + + :oden: + + + + Categories + + Food Asian + + + + + Character + 🍤 + ShortCodes + + :fried_shrimp: + + + + Categories + + Food Asian + + + + + Character + 🥮 + ShortCodes + + :moon_cake: + + + + Categories + + Food Asian + + + + + Character + 🥟 + ShortCodes + + :dumpling: + + + + Categories + + Food Asian + + + + + Character + 🥡 + ShortCodes + + :takeout_box: + + + + Categories + + Food Asian + + + + + Character + 🍘 + ShortCodes + + :rice_cracker: + + + + Categories + + Food Asian + + + + + Character + 🍚 + ShortCodes + + :rice: + + + + Categories + + Food Asian + + + + + Character + 🍜 + ShortCodes + + :ramen: + + + + Categories + + Food Asian + + + + + Character + 🍠 + ShortCodes + + :sweet_potato: + + + + Categories + + Food Asian + + + + + Character + 🍣 + ShortCodes + + :sushi: + + + + Categories + + Food Asian + + + + + Character + 🍥 + ShortCodes + + :fish_cake: + + + + Categories + + Food Asian + + + + + Character + 🍡 + ShortCodes + + :dango: + + + + Categories + + Food Asian + + + + + Character + 🥠 + ShortCodes + + :fortune_cookie: + + + + Categories + + Food Asian + + + + + -- cgit v1.2.3 From 24bd7b2311e6fdd8bcf0a223d6dafaf4266ca4c7 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 6 Nov 2022 16:25:35 +0100 Subject: Add support for OT-SVG fonts --- autobuild.xml | 34 +++++- indra/cmake/ViewerMiscLibs.cmake | 1 + indra/llrender/CMakeLists.txt | 2 + indra/llrender/llfontfreetype.cpp | 13 +++ indra/llrender/llfontfreetypesvg.cpp | 205 +++++++++++++++++++++++++++++++++++ indra/llrender/llfontfreetypesvg.h | 54 +++++++++ 6 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 indra/llrender/llfontfreetypesvg.cpp create mode 100644 indra/llrender/llfontfreetypesvg.h diff --git a/autobuild.xml b/autobuild.xml index babc7d73bc..6fe7620112 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -958,9 +958,9 @@ archive hash - f3e63d80bd80da03aa7f87f7bd7c5f8b + 2fee8d8320ab6bd180f0acf4d2b24bff url - freetype-2.10.1.0-windows64-222392239.tar.bz2 + freetype-2.12.1.0-windows64-223091759.tar.bz2 name windows64 @@ -2423,6 +2423,36 @@ version 7.11.1.297294 + + nanosvg + + copyright + Copyright (c) 2013-14 Mikko Mononen + description + NanoSVG is a simple single-header-file SVG parser and rasterizer + license + Zlib + license_file + LICENSES/nanosvg.txt + name + nanosvg + platforms + + common + + archive + + hash + aa73d8b6c45168b74e2cc4640ec01f95 + url + nanosvg-2022.09.27-common-223101446.tar.bz2 + + name + common + + + version + 2022.09.27 nghttp2 diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index f213de100c..aa204a7406 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -11,3 +11,4 @@ if (NOT USESYSTEMLIBS) endif(NOT USESYSTEMLIBS) use_prebuilt_binary(fonts) +use_prebuilt_binary(nanosvg) \ No newline at end of file diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 47e7ad915b..282a5c70ad 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -35,6 +35,7 @@ set(llrender_SOURCE_FILES llcubemap.cpp llfontbitmapcache.cpp llfontfreetype.cpp + llfontfreetypesvg.cpp llfontgl.cpp llfontregistry.cpp llgl.cpp @@ -62,6 +63,7 @@ set(llrender_HEADER_FILES llcubemap.h llfontgl.h llfontfreetype.h + llfontfreetypesvg.h llfontbitmapcache.h llfontregistry.h llgl.h diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 25740a5f87..d3a49339da 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -34,6 +34,7 @@ #ifdef LL_WINDOWS #include #endif +#include "llfontfreetypesvg.h" // For some reason, this won't work if it's not wrapped in the ifdef #ifdef FT_FREETYPE_H @@ -51,6 +52,8 @@ #include "llfontbitmapcache.h" #include "llgl.h" +#define ENABLE_OT_SVG_SUPPORT + FT_Render_Mode gFontRenderMode = FT_RENDER_MODE_NORMAL; LLFontManager *gFontManagerp = NULL; @@ -83,6 +86,16 @@ LLFontManager::LLFontManager() LL_ERRS() << "Freetype initialization failure!" << LL_ENDL; FT_Done_FreeType(gFTLibrary); } + +#ifdef ENABLE_OT_SVG_SUPPORT + SVG_RendererHooks hooks = { + LLFontFreeTypeSvgRenderer::OnInit, + LLFontFreeTypeSvgRenderer::OnFree, + LLFontFreeTypeSvgRenderer::OnRender, + LLFontFreeTypeSvgRenderer::OnPresetGlypthSlot, + }; + FT_Property_Set(gFTLibrary, "ot-svg", "svg-hooks", &hooks); +#endif } LLFontManager::~LLFontManager() diff --git a/indra/llrender/llfontfreetypesvg.cpp b/indra/llrender/llfontfreetypesvg.cpp new file mode 100644 index 0000000000..19d327a4c9 --- /dev/null +++ b/indra/llrender/llfontfreetypesvg.cpp @@ -0,0 +1,205 @@ +/** + * @file llfontfreetypesvg.cpp + * @brief Freetype font library SVG glyph rendering + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "linden_common.h" + +#include "llfontfreetypesvg.h" + +#if LL_WINDOWS +#pragma warning (push) +#pragma warning (disable : 4702) +#endif + +#define NANOSVG_IMPLEMENTATION +#include +#define NANOSVGRAST_IMPLEMENTATION +#include + +#if LL_WINDOWS +#pragma warning (pop) +#endif + +struct LLSvgRenderData +{ + FT_UInt GlyphIndex = 0; + FT_Error Error = FT_Err_Ok; // FreeType currently (@2.12.1) ignores the error value returned by the preset glyph slot callback so we return it at render time + // (See https://github.com/freetype/freetype/blob/5faa1df8b93ebecf0f8fd5fe8fda7b9082eddced/src/base/ftobjs.c#L1170) + NSVGimage* pNSvgImage = nullptr; + float Scale = 0.f; +}; + +// static +FT_Error LLFontFreeTypeSvgRenderer::OnInit(FT_Pointer* state) +{ + // The SVG driver hook state is shared across all callback invocations; since our state is lightweight + // we store it in the glyph instead. + *state = nullptr; + + return FT_Err_Ok; +} + +// static +void LLFontFreeTypeSvgRenderer::OnFree(FT_Pointer* state) +{ +} + +// static +void LLFontFreeTypeSvgRenderer::OnDataFinalizer(void* objectp) +{ + FT_GlyphSlot glyph_slot = static_cast(objectp); + + LLSvgRenderData* pData = static_cast(glyph_slot->generic.data); + glyph_slot->generic.data = nullptr; + glyph_slot->generic.finalizer = nullptr; + delete(pData); +} + +//static +FT_Error LLFontFreeTypeSvgRenderer::OnPresetGlypthSlot(FT_GlyphSlot glyph_slot, FT_Bool cache, FT_Pointer*) +{ + FT_SVG_Document document = static_cast(glyph_slot->other); + + llassert(!glyph_slot->generic.data || !cache || glyph_slot->glyph_index == ((LLSvgRenderData*)glyph_slot->generic.data)->GlyphIndex); + if (!glyph_slot->generic.data) + { + glyph_slot->generic.data = new LLSvgRenderData(); + glyph_slot->generic.finalizer = LLFontFreeTypeSvgRenderer::OnDataFinalizer; + } + LLSvgRenderData* datap = static_cast(glyph_slot->generic.data); + if (!cache) + { + datap->GlyphIndex = glyph_slot->glyph_index; + datap->Error = FT_Err_Ok; + } + + // NOTE: nsvgParse modifies the input string so we need a temporary copy + llassert(!datap->pNSvgImage || cache); + if (!datap->pNSvgImage) + { + char* document_buffer = new char[document->svg_document_length + 1]; + memcpy(document_buffer, document->svg_document, document->svg_document_length); + document_buffer[document->svg_document_length] = '\0'; + + datap->pNSvgImage = nsvgParse(document_buffer, "px", 0.); + + delete[] document_buffer; + } + + if (!datap->pNSvgImage) + { + datap->Error = FT_Err_Invalid_SVG_Document; + return FT_Err_Invalid_SVG_Document; + } + + // We don't (currently) support transformations so test for an identity rotation matrix + zero translation + if (document->transform.xx != 1 << 16 || document->transform.yx != 0 || + document->transform.xy != 0 || document->transform.yy != 1 << 16 || + document->delta.x > 0 || document->delta.y > 0) + { + datap->Error = FT_Err_Unimplemented_Feature; + return FT_Err_Unimplemented_Feature; + } + + float svg_width = datap->pNSvgImage->width; + float svg_height = datap->pNSvgImage->height; + if (svg_width == 0.f || svg_height == 0.f) + { + svg_width = document->units_per_EM; + svg_height = document->units_per_EM; + } + + float svg_x_scale = (float)document->metrics.x_ppem / floorf(svg_width); + float svg_y_scale = (float)document->metrics.y_ppem / floorf(svg_height); + float svg_scale = llmin(svg_x_scale, svg_y_scale); + datap->Scale = svg_scale; + + glyph_slot->bitmap.width = floorf(svg_width) * svg_scale; + glyph_slot->bitmap.rows = floorf(svg_height) * svg_scale; + glyph_slot->bitmap_left = (document->metrics.x_ppem - glyph_slot->bitmap.width) / 2; + glyph_slot->bitmap_top = glyph_slot->face->size->metrics.ascender / 64.f; + glyph_slot->bitmap.pitch = glyph_slot->bitmap.width * 4; + glyph_slot->bitmap.pixel_mode = FT_PIXEL_MODE_BGRA; + + /* Copied as-is from fcft (MIT license) */ + + // Compute all the bearings and set them correctly. The outline is scaled already, we just need to use the bounding box. + float horiBearingX = 0.; + float horiBearingY = -glyph_slot->bitmap_top; + + // XXX parentheses correct? + float vertBearingX = glyph_slot->metrics.horiBearingX / 64.0f - glyph_slot->metrics.horiAdvance / 64.0f / 2; + float vertBearingY = (glyph_slot->metrics.vertAdvance / 64.0f - glyph_slot->metrics.height / 64.0f) / 2; + + // Do conversion in two steps to avoid 'bad function cast' warning + glyph_slot->metrics.width = glyph_slot->bitmap.width * 64; + glyph_slot->metrics.height = glyph_slot->bitmap.rows * 64; + glyph_slot->metrics.horiBearingX = horiBearingX * 64; + glyph_slot->metrics.horiBearingY = horiBearingY * 64; + glyph_slot->metrics.vertBearingX = vertBearingX * 64; + glyph_slot->metrics.vertBearingY = vertBearingY * 64; + if (glyph_slot->metrics.vertAdvance == 0) + { + glyph_slot->metrics.vertAdvance = glyph_slot->bitmap.rows * 1.2f * 64; + } + + return FT_Err_Ok; +} + +// static +FT_Error LLFontFreeTypeSvgRenderer::OnRender(FT_GlyphSlot glyph_slot, FT_Pointer*) +{ + LLSvgRenderData* datap = static_cast(glyph_slot->generic.data); + llassert(FT_Err_Ok == datap->Error); + if (FT_Err_Ok != datap->Error) + { + return datap->Error; + } + + // Render to glyph bitmap + NSVGrasterizer* nsvgRasterizer = nsvgCreateRasterizer(); + nsvgRasterize(nsvgRasterizer, datap->pNSvgImage, 0, 0, datap->Scale, glyph_slot->bitmap.buffer, glyph_slot->bitmap.width, glyph_slot->bitmap.rows, glyph_slot->bitmap.pitch); + nsvgDeleteRasterizer(nsvgRasterizer); + nsvgDelete(datap->pNSvgImage); + datap->pNSvgImage = nullptr; + + // Convert from RGBA to BGRA + U32* pixel_buffer = (U32*)glyph_slot->bitmap.buffer; U8* byte_buffer = glyph_slot->bitmap.buffer; + for (size_t y = 0, h = glyph_slot->bitmap.rows; y < h; y++) + { + for (size_t x = 0, w = glyph_slot->bitmap.pitch / 4; x < w; x++) + { + size_t pixel_idx = y * w + x; + size_t byte_idx = pixel_idx * 4; + U8 alpha = byte_buffer[byte_idx + 3]; + // Store as ARGB (*TODO - do we still have to care about endianness?) + pixel_buffer[y * w + x] = alpha << 24 | (byte_buffer[byte_idx] * alpha / 0xFF) << 16 | (byte_buffer[byte_idx + 1] * alpha / 0xFF) << 8 | (byte_buffer[byte_idx + 2] * alpha / 0xFF); + } + } + + glyph_slot->format = FT_GLYPH_FORMAT_BITMAP; + glyph_slot->bitmap.pixel_mode = FT_PIXEL_MODE_BGRA; + return FT_Err_Ok; +} diff --git a/indra/llrender/llfontfreetypesvg.h b/indra/llrender/llfontfreetypesvg.h new file mode 100644 index 0000000000..b5f541991a --- /dev/null +++ b/indra/llrender/llfontfreetypesvg.h @@ -0,0 +1,54 @@ +/** + * @file llfontfreetypesvg.h + * @brief Freetype font library SVG glyph rendering + * + * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +#pragma once + +#include +#include FT_TYPES_H +#include FT_MODULE_H +#include FT_OTSVG_H + + // See https://freetype.org/freetype2/docs/reference/ft2-svg_fonts.html +class LLFontFreeTypeSvgRenderer +{ +public: + // Called when the very first OT-SVG glyph is rendered (across the entire lifetime of our FT_Library object) + static FT_Error OnInit(FT_Pointer* state); + + // Called when the ot-svg module is being freed (but only called if the init hook was called previously) + static void OnFree(FT_Pointer* state); + + // Called to preset the glyph slot, twice per glyph: + // - when FT_Load_Glyph needs to preset the glyph slot (with cache == false) + // - right before the svg module calls the render callback hook. (with cache == true) + static FT_Error OnPresetGlypthSlot(FT_GlyphSlot glyph_slot, FT_Bool cache, FT_Pointer* state); + + // Called to render an OT-SVG glyph (right after the preset hook OnPresetGlypthSlot was called with cache set to TRUE) + static FT_Error OnRender(FT_GlyphSlot glyph_slot, FT_Pointer* state); + + // Called to deallocate our per glyph slot data + static void OnDataFinalizer(void* objectp); +}; -- cgit v1.2.3 From ec6c4f102f8b23e0c79dd2c1c0ecbad54f019566 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 6 Nov 2022 16:30:44 +0100 Subject: Switch to using the Twemoji OT-SVG font --- indra/newview/skins/default/xui/en/fonts.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 681f670f08..40045625fd 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -3,7 +3,7 @@ DejaVuSans.ttf - Twemoji.ttf + TwemojiSVG.ttf meiryo.TTC MSGOTHIC.TTC @@ -72,7 +72,7 @@ - Twemoji.ttf + TwemojiSVG.ttf Date: Tue, 8 Nov 2022 00:16:58 +0100 Subject: [FIXED] Various minor issues - Typing :+1: doesn't replace the short code with the thumbs-up emoji - Moving the mouse over the emoji complete panel highlights the wrong emoji when mScrollPos > 0 - Emoji complete panel is missing attributes - Crash when attempting to show the tooltip for an emoji text segment - Emoji autocomplete panel can sometimes show empty (type ':cat', select the heart eyed one, Ctrl-Z and then type 2 which should show the emoji for :cat2 but shows an empty square instead) --- indra/llui/llemojidictionary.cpp | 8 ++++---- indra/llui/llemojidictionary.h | 4 ++-- indra/llui/llemojihelper.cpp | 3 ++- indra/newview/llpanelemojicomplete.cpp | 4 ++-- indra/newview/skins/default/xui/en/widgets/emoji_complete.xml | 3 +++ 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp index c31638b0bf..b70a9b2e7a 100644 --- a/indra/llui/llemojidictionary.cpp +++ b/indra/llui/llemojidictionary.cpp @@ -178,22 +178,22 @@ LLWString LLEmojiDictionary::findMatchingEmojis(const std::string& needle) const const LLEmojiDescriptor* LLEmojiDictionary::getDescriptorFromShortCode(const std::string& short_code) const { const auto it = mShortCode2Descr.find(short_code); - return (mShortCode2Descr.end() != it) ? &it->second : nullptr; + return (mShortCode2Descr.end() != it) ? it->second : nullptr; } std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) const { const auto it = mEmoji2Descr.find(ch); - return (mEmoji2Descr.end() != it) ? it->second.Name : LLStringUtil::null; + return (mEmoji2Descr.end() != it) ? it->second->Name : LLStringUtil::null; } void LLEmojiDictionary::addEmoji(LLEmojiDescriptor&& descr) { mEmojis.push_back(descr); - mEmoji2Descr.insert(std::make_pair(descr.Character, mEmojis.back())); + mEmoji2Descr.insert(std::make_pair(descr.Character, &mEmojis.back())); for (const std::string& shortCode : descr.ShortCodes) { - mShortCode2Descr.insert(std::make_pair(shortCode, mEmojis.back())); + mShortCode2Descr.insert(std::make_pair(shortCode, &mEmojis.back())); } } diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h index 0cde663719..46a61f1cd7 100644 --- a/indra/llui/llemojidictionary.h +++ b/indra/llui/llemojidictionary.h @@ -66,8 +66,8 @@ private: private: std::list mEmojis; - std::map mEmoji2Descr; - std::map mShortCode2Descr; + std::map mEmoji2Descr; + std::map mShortCode2Descr; }; // ============================================================================ diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index 32471e59a8..1e4c19a183 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -57,7 +57,8 @@ bool LLEmojiHelper::isActive(const LLUICtrl* ctrl_p) const // static bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos) { - S32 shortCodePos = cursorPos; + // If the cursor is currently on a colon start the check one character further back + S32 shortCodePos = (cursorPos == 0 || L':' != wtext[cursorPos - 1]) ? cursorPos : cursorPos - 1; auto isPartOfShortcode = [](llwchar ch) { switch (ch) diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index a7058a6724..f890a14e8e 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -146,9 +146,9 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) { llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; - size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); + size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; if (mAutoSize) @@ -168,7 +168,7 @@ size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const { if (mRenderRect.pointInRect(x, y)) { - return llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); + return mScrollPos + llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1); } return npos; } diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml index f35105ff7e..370f1d174e 100644 --- a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml @@ -1,7 +1,10 @@ -- cgit v1.2.3 From 17a3924a28770e6910022ad8f627bb8e2b667730 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 8 Nov 2022 01:10:09 +0100 Subject: Add proper mouse down handler to the emoji complete panel -> the previous commit didn't properly set mFrontChild after restoring the topmost floaters -> additionally we don't want mouse clicks in "can't steal focus from frontmost" floaters to set focus to them --- indra/llui/llfloater.cpp | 23 ++++++++++++++--------- indra/newview/llpanelemojicomplete.cpp | 30 +++++++++++++++++++++++++++--- indra/newview/llpanelemojicomplete.h | 3 +++ 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 04f6b11b7c..6f341bc0cd 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2486,7 +2486,7 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore if (mFrontChild == child) { - if (give_focus && !gFocusMgr.childHasKeyboardFocus(child)) + if (give_focus && child->canFocusStealFrontmost() && !gFocusMgr.childHasKeyboardFocus(child)) { child->setFocus(TRUE); } @@ -3042,24 +3042,29 @@ void LLFloaterView::syncFloaterTabOrder() if (mFrontChild != floaterp) { // Grab a list of the top floaters that want to stay on top of the focused floater - std::list listTop; + std::list listTop; if (mFrontChild && !mFrontChild->canFocusStealFrontmost()) { - for (LLView* childfloaterp : *getChildList()) + for (LLView* childp : *getChildList()) { - if (static_cast(childfloaterp)->canFocusStealFrontmost()) + LLFloater* child_floaterp = static_cast(childp); + if (child_floaterp->canFocusStealFrontmost()) break; - listTop.push_back(childfloaterp); + listTop.push_back(child_floaterp); } } bringToFront(floaterp, FALSE); // Restore top floaters - for (LLView* childp :listTop) - { - sendChildToFront(childp); - } + if (!listTop.empty()) + { + for (LLView* childp : listTop) + { + sendChildToFront(childp); + } + mFrontChild = listTop.back(); + } } break; diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index f890a14e8e..8b89e3aa14 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -120,9 +120,6 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent case KEY_RETURN: if (!mEmojis.empty()) { - LLWString wstr; - wstr.push_back(mEmojis.at(mCurSelected)); - setValue(wstring_to_utf8str(wstr)); onCommit(); handled = true; } @@ -137,6 +134,33 @@ BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent return LLUICtrl::handleKey(key, mask, called_from_parent); } +BOOL LLPanelEmojiComplete::handleMouseDown(S32 x, S32 y, MASK mask) +{ + mCurSelected = posToIndex(x, y); + mLastHover = LLVector2(x, y); + + return TRUE; +} + +BOOL LLPanelEmojiComplete::handleMouseUp(S32 x, S32 y, MASK mask) +{ + mCurSelected = posToIndex(x, y); + onCommit(); + + return TRUE; +} + +void LLPanelEmojiComplete::onCommit() +{ + if (npos != mCurSelected) + { + LLWString wstr; + wstr.push_back(mEmojis.at(mCurSelected)); + setValue(wstring_to_utf8str(wstr)); + LLUICtrl::onCommit(); + } +} + void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent) { LLUICtrl::reshape(width, height, called_from_parent); diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 138cc465ba..2116b350be 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -56,6 +56,9 @@ public: void draw() override; BOOL handleHover(S32 x, S32 y, MASK mask) override; BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + void onCommit() override; void reshape(S32 width, S32 height, BOOL called_from_parent) override; public: -- cgit v1.2.3 From f3e7c7454f6647aa09f220baa20c9bbc7480a37b Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 8 Nov 2022 01:14:10 +0100 Subject: Enable color emojis (and the emoji helper) on the chat history and editor --- indra/newview/llchathistory.cpp | 2 ++ indra/newview/skins/default/xui/en/widgets/chat_editor.xml | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index c110e0d815..f07d4658f9 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -1010,6 +1010,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) editor_params.enabled = false; // read only editor_params.show_context_menu = "true"; editor_params.trusted_content = false; + editor_params.text_valign = LLFontGL::VAlign::VCENTER; + editor_params.use_color = true; mEditor = LLUICtrlFactory::create(editor_params, this); mEditor->setIsFriendCallback(LLAvatarActions::isFriend); mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0)); diff --git a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml index f9facb593a..c550f634e5 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_editor.xml @@ -1,4 +1,7 @@ + show_context_menu="true" + show_emoji_helper="true" + use_color="true" + /> -- cgit v1.2.3 From 62d62abe9c35066bb7bb29155046311245854563 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 00:08:43 +0100 Subject: [FIXED] Using the Windows emoji picker or pasting text containing emojis doesn't create emoji segments (=emoji size is same size as the text size) -> Partial revert of 063fe59 --- indra/llui/lltextbase.cpp | 55 +++++++++++++++++++---------------------------- indra/llui/lltextbase.h | 1 - 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index b88c7ced40..28165aa1ef 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -834,6 +834,25 @@ S32 LLTextBase::insertStringNoUndo(S32 pos, const LLWString &wstr, LLTextBase::s } } + // Insert special segments where necessary (insertSegment takes care of splitting normal text segments around them for us) + { + LLStyleSP emoji_style; + for (S32 text_kitty = 0, text_len = wstr.size(); text_kitty < text_len; text_kitty++) + { + if (LLStringOps::isEmoji(wstr[text_kitty])) + { + if (!emoji_style) + { + emoji_style = new LLStyle(getStyleParams()); + emoji_style->setFont(LLFontGL::getFontEmoji()); + } + + S32 new_seg_start = pos + text_kitty; + insertSegment(new LLEmojiTextSegment(emoji_style, new_seg_start, new_seg_start + 1, *this)); + } + } + } + getViewModel()->getEditableDisplay().insert(pos, wstr); if ( truncate() ) @@ -2303,36 +2322,6 @@ void LLTextBase::appendWidget(const LLInlineViewSegment::Params& params, const s insertStringNoUndo(getLength(), widget_wide_text, &segments); } -void LLTextBase::createTextWithEmojiSegment(const LLWString& text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments) -{ - LLStyleSP emoji_style; - - S32 text_start = 0, text_kitty = 0, text_len = text.size(); - for (; text_kitty < text_len; text_kitty++) - { - if (LLStringOps::isEmoji(text[text_kitty])) - { - if (text_kitty > text_start) - { - segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_kitty, *this)); - } - - if (!emoji_style) - { - emoji_style = new LLStyle(*style); - emoji_style->setFont(LLFontGL::getFontEmoji()); - } - segments.push_back(new LLEmojiTextSegment(emoji_style, segment_start + text_kitty, segment_start + text_kitty + 1, *this)); - text_start = text_kitty + 1; - } - } - - if (text_start < text_len) - { - segments.push_back(new LLNormalTextSegment(style, segment_start + text_start, segment_start + text_len, *this)); - } -} - void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only) { // Save old state @@ -2365,7 +2354,6 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig S32 cur_length = getLength(); LLStyleConstSP sp(new LLStyle(highlight_params)); LLTextSegmentPtr segmentp; - segment_vec_t segments; if (underline_on_hover_only || mSkipLinkUnderline) { highlight_params.font.style("NORMAL"); @@ -2374,8 +2362,9 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig } else { - createTextWithEmojiSegment(wide_text, cur_length, sp, segments); + segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this); } + segment_vec_t segments; segments.push_back(segmentp); insertStringNoUndo(cur_length, wide_text, &segments); } @@ -2398,7 +2387,7 @@ void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 hig } else { - createTextWithEmojiSegment(wide_text, segment_start, sp, segments); + segments.push_back(new LLNormalTextSegment(sp, segment_start, segment_end, *this )); } insertStringNoUndo(getLength(), wide_text, &segments); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 31e9f16110..a047db25b2 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -641,7 +641,6 @@ protected: void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); - void createTextWithEmojiSegment(const LLWString& wide_text, S32 segment_start, LLStyleConstSP style, segment_vec_t& segments); S32 normalizeUri(std::string& uri); protected: -- cgit v1.2.3 From 1727a31db0e3434adec087d6442fc5eca0ea68cf Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 00:11:22 +0100 Subject: Show color emojis and emoji helper in notecards --- indra/newview/skins/default/xui/en/floater_preview_notecard.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index dcbdfa8794..ac5467c036 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -73,6 +73,8 @@ spellcheck="true" tab_group="1" top="46" + use_color="true" + show_emoji_helper="true" width="392" word_wrap="true"> Loading... -- cgit v1.2.3 From b5033a8859b38df045cc74e074aaee864985f145 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 00:14:51 +0100 Subject: Enable color on HUD text --- indra/newview/llhudrender.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index dff310ecf9..c1f17c9d33 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -138,7 +138,7 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent, LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f)); F32 right_x; - font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x); + font.render(wstr, 0, 0, 1, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x, /*use_ellipses*/false, /*use_color*/true); LLUI::popMatrix(); gGL.popMatrix(); -- cgit v1.2.3 From bf5a5948b2e03b71954b1e6e66b32624afc79b3c Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 9 Nov 2022 23:25:21 +0100 Subject: [FIXED] Viewer's ICU4C package must match the one used to build boost --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 4581d078ca..aeea64fc12 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1080,9 +1080,9 @@ archive hash - 8fc61ee230e63db756e14415573f604d + e60373858787f9939f2128fc24b2f84e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106176/928492/icu4c-4.8.1-darwin64-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55242/513651/icu4c-4.8.1-darwin64-539138.tar.bz2 name darwin64 @@ -1092,9 +1092,9 @@ archive hash - 9898b1f45bc92d4fc75b1d1a68c59514 + 984bef5ad98e2fdd8592c6075aee78ab url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106438/930144/icu4c-4.8.1-windows-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55244/513665/icu4c-4.8.1-windows-539138.tar.bz2 name windows @@ -1104,9 +1104,9 @@ archive hash - 8ad662698b5d99ce169517ce11cf2bef + 340980c10153446b678625ec7af047c2 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106439/930151/icu4c-4.8.1-windows64-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55243/513658/icu4c-4.8.1-windows64-539138.tar.bz2 name windows64 -- cgit v1.2.3 From b6066a1b1630c432e757afb99de583ae6ff19f1d Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Wed, 9 Nov 2022 17:19:42 -0800 Subject: Add support for the 3p-nanosvg SVG library that will be used to rfender the emoji glyphs --- autobuild.xml | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index c9820ecedd..aca22f576f 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1984,6 +1984,74 @@ version 3.0.2.569217 + nanosvg + + canonical_repo + https://bitbucket.org/lindenlab/3p-nanosvg + copyright + Copyright (c) 2013-14 Mikko Mononen + description + NanoSVG is a simple single-header-file SVG parser and rasterizer + license + Zlib + license_file + LICENSES/LICENSE.txt + name + nanosvg + platforms + + darwin64 + + archive + + hash + 94b8670d171700f24af2fcfc8bf7d608 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107183/935568/nanosvg-2022.09.27-darwin64-576467.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + c5a2ae5ecc8ade5a85b674e4426d6403 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107186/935576/nanosvg-2022.09.27-linux-576467.tar.bz2 + + name + linux + + windows + + archive + + hash + 8fa416e04ca768c1d8fa4ad3a0104b24 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107184/935580/nanosvg-2022.09.27-windows-576467.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 08ea3f1d23cf78d1eb65597cef5913b4 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107182/935563/nanosvg-2022.09.27-windows64-576467.tar.bz2 + + name + windows64 + + + version + 2022.09.27 + nghttp2 copyright -- cgit v1.2.3 From a849c51837c9fad2a6929564f4b3a3446a2f4e9a Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Wed, 9 Nov 2022 17:28:47 -0800 Subject: Pull in latest version of the fonts used in kitty catznip's emoji contribution --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 723b0bf6c1..dcf503c455 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2795,9 +2795,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 9655e501340262e1feea9e71543d3eab + 64dfdcfb6f5c98f134c128ed64fe810c url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106526/930682/viewer_fonts-1.576098-darwin64-576098.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107187/935585/viewer_fonts-1.576468-darwin64-576468.tar.bz2 name darwin64 @@ -2807,9 +2807,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - eb98887e363854810e03861f258e534d + 50f83d09145601df7f0f51e503f071d7 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106533/930714/viewer_fonts-1.576098-windows-576098.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107188/935596/viewer_fonts-1.576468-windows-576468.tar.bz2 name windows @@ -2819,16 +2819,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 365c0d38cde826c3c1e31bc68b5d1194 + 212833fe0e054874cceaec567a46a851 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106527/930690/viewer_fonts-1.576098-windows64-576098.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107189/935597/viewer_fonts-1.576468-windows64-576468.tar.bz2 name windows64 version - 1.576098 + 1.576468 viewer-manager -- cgit v1.2.3 From 0dd7b362a6e77d8f3dff450376ddf2d4ffaf752c Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 30 Nov 2022 17:26:14 -0500 Subject: DRTVWR-575: In a new build tree, first make the parent directory before trying to create symlink. --- indra/cmake/Copy3rdPartyLibs.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index c2e1bb4b85..30a33c948c 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -151,6 +151,7 @@ elseif(DARWIN) set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug/Resources") set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources") set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources") + file(MAKE_DIRECTORY "${SHARED_LIB_STAGING_DIR}") # Support our "@executable_path/../Resources" load path for executables # that end up in any of the above SHARED_LIB_STAGING_DIR_MUMBLE # directories. -- cgit v1.2.3 From 7a3ef9e5acd2b219b21234117dd18ae3e92b05df Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Thu, 19 Jan 2023 17:40:16 -0800 Subject: DRTVWR-489-emoji: following kitty's recipe for emoji viewer - this pulls in 3p library changes for steps 1-5 (boost, colladom, googlemock, nanosvg, viewer-fonts) - final 3p change (ICU4C) coming later --- autobuild.xml | 64 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 707c3d9b82..9c1124d391 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -118,9 +118,9 @@ archive hash - fedc8d63856f534b6098102e059dc548 + cae490999f05151e3a048b00d64237bb url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87776/805857/boost-1.72-darwin64-563847.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109513/952781/boost-1.72-darwin64-577704.tar.bz2 name darwin64 @@ -142,9 +142,9 @@ archive hash - 6cc9fb4ca21365c4470a3e516544ba71 + aa0f955996442b8d7097447de1f5a9fe url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87784/805850/boost-1.72-windows-563847.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109516/952793/boost-1.72-windows-577704.tar.bz2 name windows @@ -154,9 +154,9 @@ archive hash - 0c526efc3f8825cd25cdf635e238fab3 + d3738a7ea84e2569017ae0237526da36 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87783/805851/boost-1.72-windows64-563847.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109515/952797/boost-1.72-windows64-577704.tar.bz2 name windows64 @@ -236,9 +236,9 @@ archive hash - 4699b8389dfb754da0393ddb5d325722 + b923ca041271446592b3b10e678b93b6 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95882/856117/colladadom-2.3.569219-darwin64-569219.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109517/952832/colladadom-2.3.577706-darwin64-577706.tar.bz2 name darwin64 @@ -260,9 +260,9 @@ archive hash - 343e46ea49a08ad6596d3dc702d5b812 + 2b3c9c1fe86c2b5bad6619c021bb11a8 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95883/856128/colladadom-2.3.569219-windows-569219.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109518/952846/colladadom-2.3.577706-windows-577706.tar.bz2 name windows @@ -272,16 +272,16 @@ archive hash - de5bdfb61b31db56c5fe7d0962ad11e2 + 8ece469892029506759420ac531bd675 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/95884/856129/colladadom-2.3.569219-windows64-569219.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109519/952847/colladadom-2.3.577706-windows64-577706.tar.bz2 name windows64 version - 2.3.569219 + 2.3.577706 cubemaptoequirectangular @@ -884,9 +884,9 @@ archive hash - 7d267050970ec6e28749178597bc8af0 + 47303c9bb9a06c6f488f9d7b2b2282c4 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87793/805930/googlemock-1.7.0.563853-windows-563853.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109524/952870/googlemock-1.7.0.577708-windows-577708.tar.bz2 name windows @@ -896,16 +896,16 @@ archive hash - 27638c692f0ec6121e54bf75f2d45e49 + c166bbd8787a68c1a4ba75179c58dda6 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87792/805936/googlemock-1.7.0.563853-windows64-563853.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109525/952878/googlemock-1.7.0.577708-windows64-577708.tar.bz2 name windows64 version - 1.7.0.563853 + 1.7.0.577708 gstreamer @@ -1995,7 +1995,7 @@ license Zlib license_file - LICENSES/LICENSE.txt + LICENSES/nanosvg.txt name nanosvg platforms @@ -2005,9 +2005,9 @@ archive hash - 94b8670d171700f24af2fcfc8bf7d608 + bee6bf71cec184ab26c89c486fc5f427 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107183/935568/nanosvg-2022.09.27-darwin64-576467.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109526/952883/nanosvg-2022.09.27-darwin64-577709.tar.bz2 name darwin64 @@ -2029,9 +2029,9 @@ archive hash - 8fa416e04ca768c1d8fa4ad3a0104b24 + b7d1baa8003f64bed4efc2c163ee7e26 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107184/935580/nanosvg-2022.09.27-windows-576467.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109529/952902/nanosvg-2022.09.27-windows-577709.tar.bz2 name windows @@ -2041,9 +2041,9 @@ archive hash - 08ea3f1d23cf78d1eb65597cef5913b4 + b8b51ad6b65be5bbc1470ee939c6bfae url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107182/935563/nanosvg-2022.09.27-windows64-576467.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109528/952895/nanosvg-2022.09.27-windows64-577709.tar.bz2 name windows64 @@ -2795,9 +2795,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 64dfdcfb6f5c98f134c128ed64fe810c + 7846ea2be3ee6f991f181ec451b02ef5 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107187/935585/viewer_fonts-1.576468-darwin64-576468.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109530/952907/viewer_fonts-1.577710-darwin64-577710.tar.bz2 name darwin64 @@ -2807,9 +2807,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 50f83d09145601df7f0f51e503f071d7 + 6c41e98423d0fdc29b80f5c2d9ccd8bf url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107188/935596/viewer_fonts-1.576468-windows-576468.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109532/952921/viewer_fonts-1.577710-windows-577710.tar.bz2 name windows @@ -2819,16 +2819,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 212833fe0e054874cceaec567a46a851 + 48e4986d8c61e80d672439507602cbba url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107189/935597/viewer_fonts-1.576468-windows64-576468.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109531/952914/viewer_fonts-1.577710-windows64-577710.tar.bz2 name windows64 version - 1.576468 + 1.577710 viewer-manager -- cgit v1.2.3 From 80bc32c3efe77b49adcd4cc00320ce5523f90fb9 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Fri, 20 Jan 2023 15:17:45 -0800 Subject: Pull in (a) version of ICU4C - this one was built with VS 2019 and not VS 2017 like everything else. The work to do this is large and we are switching soon to VS 2022 so this will do for now --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 9c1124d391..b8351e5c3a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1050,9 +1050,9 @@ archive hash - 8fc61ee230e63db756e14415573f604d + 544273564b480d24ead8e3ab35b64f47 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106176/928492/icu4c-4.8.1-darwin64-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109563/953191/icu4c-4.8.1-darwin64-577732.tar.bz2 name darwin64 @@ -1062,9 +1062,9 @@ archive hash - 9898b1f45bc92d4fc75b1d1a68c59514 + 740b11e15eb3d908b18c547c43cd507e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106438/930144/icu4c-4.8.1-windows-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109565/953208/icu4c-4.8.1-windows-577732.tar.bz2 name windows @@ -1074,9 +1074,9 @@ archive hash - 8ad662698b5d99ce169517ce11cf2bef + 8d6668733a098a74e89d3c69fa11cada url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106439/930151/icu4c-4.8.1-windows64-575914.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109564/953209/icu4c-4.8.1-windows64-577732.tar.bz2 name windows64 -- cgit v1.2.3 From 44a5519fb0fa433dd926ae7fe1deea83b02a6390 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Fri, 20 Jan 2023 17:18:13 -0800 Subject: DRTVWR-489-emoji: Pull in an updated version of 3p-icu4c that correctly copies over the Windows DLLs as part of the build process --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index b8351e5c3a..bda67de60a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1050,9 +1050,9 @@ archive hash - 544273564b480d24ead8e3ab35b64f47 + 635f18fa4de7f38308d10da0cb645a4d url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109563/953191/icu4c-4.8.1-darwin64-577732.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109596/953629/icu4c-4.8.1-darwin64-577750.tar.bz2 name darwin64 @@ -1062,9 +1062,9 @@ archive hash - 740b11e15eb3d908b18c547c43cd507e + 2a2cc981da2565d0e797c7af19891a9b url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109565/953208/icu4c-4.8.1-windows-577732.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109597/953636/icu4c-4.8.1-windows-577750.tar.bz2 name windows @@ -1074,9 +1074,9 @@ archive hash - 8d6668733a098a74e89d3c69fa11cada + d30663c985b40a638a9a58ba21745fe2 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109564/953209/icu4c-4.8.1-windows64-577732.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109598/953645/icu4c-4.8.1-windows64-577750.tar.bz2 name windows64 -- cgit v1.2.3 From 64e84924d43b64fd799e619cc3c5c9aac2d23ce1 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Mon, 23 Jan 2023 12:36:37 -0800 Subject: DRTVWR-489-emoji: Pull in updated viewer-fonts package that includes 'missing' Tweenmoji SVG font --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index bda67de60a..1b3365cc81 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2795,9 +2795,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 7846ea2be3ee6f991f181ec451b02ef5 + d47e0ed35dad11f0a5dc821758e2ae46 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109530/952907/viewer_fonts-1.577710-darwin64-577710.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109658/953998/viewer_fonts-1.577782-darwin64-577782.tar.bz2 name darwin64 @@ -2807,9 +2807,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 6c41e98423d0fdc29b80f5c2d9ccd8bf + 7dc39bb7cd8133d251eaff9c9e16bdfd url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109532/952921/viewer_fonts-1.577710-windows-577710.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109660/954010/viewer_fonts-1.577782-windows-577782.tar.bz2 name windows @@ -2819,16 +2819,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 48e4986d8c61e80d672439507602cbba + 86134368c16c7d685156403e15a7cbcd url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109531/952914/viewer_fonts-1.577710-windows64-577710.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109659/954009/viewer_fonts-1.577782-windows64-577782.tar.bz2 name windows64 version - 1.577710 + 1.577782 viewer-manager -- cgit v1.2.3 From f9fbd0333abb474ed265e1be67b2c5b1a4174444 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Mon, 23 Jan 2023 15:10:17 -0800 Subject: DRTVWR-489-emoji: Update the machinery that copies over the ICU4C DLLs into the right place in Windows builds --- indra/cmake/Copy3rdPartyLibs.cmake | 9 +++++++++ indra/newview/viewer_manifest.py | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index ff705101de..439bec865c 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -61,6 +61,15 @@ if(WINDOWS) uriparser.dll ) + # ICU4C (same filenames for 32 and 64 bit builds) + set(release_files ${release_files} icudt48.dll) + set(release_files ${release_files} icuin48.dll) + set(release_files ${release_files} icuio48.dll) + set(release_files ${release_files} icule48.dll) + set(release_files ${release_files} iculx48.dll) + set(release_files ${release_files} icutu48.dll) + set(release_files ${release_files} icuuc48.dll) + # OpenSSL if(ADDRESS_SIZE EQUAL 64) set(release_files ${release_files} libcrypto-1_1-x64.dll) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8cc1cc5bb4..26983bbba8 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -517,6 +517,16 @@ class WindowsManifest(ViewerManifest): self.path("OpenAL32.dll") self.path("alut.dll") + # For ICU4C + self.path("") + self.path("icudt48.dll") + self.path("icuin48.dll") + self.path("icuio48.dll") + self.path("icule48.dll") + self.path("iculx48.dll") + self.path("icutu48.dll") + self.path("icuuc48.dll") + # For textures self.path("openjpeg.dll") -- cgit v1.2.3 From 68b59629c421cfce760d9a57ec053b95e6987d40 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Mon, 23 Jan 2023 17:21:52 -0800 Subject: DRTVWR-489-emoji: Pull in the updated ICU4C package that puts the libs and dlls in the right place for the Windows builds --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 1b3365cc81..6d874b3bdc 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1050,9 +1050,9 @@ archive hash - 635f18fa4de7f38308d10da0cb645a4d + dc09e870c8419979d748855c2d956711 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109596/953629/icu4c-4.8.1-darwin64-577750.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109675/954163/icu4c-4.8.1-darwin64-577789.tar.bz2 name darwin64 @@ -1062,9 +1062,9 @@ archive hash - 2a2cc981da2565d0e797c7af19891a9b + 08749d1f7f0a96b1951eecdae5dc11ba url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109597/953636/icu4c-4.8.1-windows-577750.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109679/954178/icu4c-4.8.1-windows-577789.tar.bz2 name windows @@ -1074,9 +1074,9 @@ archive hash - d30663c985b40a638a9a58ba21745fe2 + 98bca5c137e6d47c5b57827e156b1857 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109598/953645/icu4c-4.8.1-windows64-577750.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109678/954182/icu4c-4.8.1-windows64-577789.tar.bz2 name windows64 -- cgit v1.2.3 From a3e80762f1724388fc6e892a337895966cf942e8 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Tue, 24 Jan 2023 11:07:56 -0800 Subject: DRTVWR-489-emoji: Fix a warning when packaging Viewer installer. TeamCity builds fail because of 'compiler error' in NSIS - wondering if this warning triggers the error (it doesn't locally) - yes, grasphing at straws --- indra/newview/installers/windows/lang_zh.nsi | Bin 10144 -> 10154 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi index 7922d9df52..0985663041 100755 Binary files a/indra/newview/installers/windows/lang_zh.nsi and b/indra/newview/installers/windows/lang_zh.nsi differ -- cgit v1.2.3 From 054f57151541654ab8b68fc935e184377747ab75 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Tue, 24 Jan 2023 13:14:25 -0800 Subject: DRTVWR-489-emoji: Trying to get to the bottom of a TeamCity build failure with access to TeramCity - one theory is that the extra size of these DLLs consumes too much disk space and results in the NSIS internal compiler error we observe - removing these tempoorarily to see what difference that makes --- indra/newview/viewer_manifest.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 26983bbba8..76cd4ce049 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -518,14 +518,13 @@ class WindowsManifest(ViewerManifest): self.path("alut.dll") # For ICU4C - self.path("") - self.path("icudt48.dll") - self.path("icuin48.dll") - self.path("icuio48.dll") - self.path("icule48.dll") - self.path("iculx48.dll") - self.path("icutu48.dll") - self.path("icuuc48.dll") + # self.path("icudt48.dll") + # self.path("icuin48.dll") + # self.path("icuio48.dll") + # self.path("icule48.dll") + # self.path("iculx48.dll") + # self.path("icutu48.dll") + # self.path("icuuc48.dll") # For textures self.path("openjpeg.dll") -- cgit v1.2.3 From 5dcdf8330409779591d35c05888efd02e412cf50 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Tue, 24 Jan 2023 16:00:53 -0800 Subject: DRTVWR-489-emoji: Trying to get to the bottom of a TeamCity build failure with access to TeramCity - with all the ICU4C DLLs removed, the viewer builds fine which does suggest a size/disk space issue. Trying with the (porposed) minimum set to see if this helps. Likely it won't because the main one (icudt48.dll) is much, much bigger than the others combined - but we shall see --- indra/newview/viewer_manifest.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 76cd4ce049..60f8cfc26b 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -518,13 +518,8 @@ class WindowsManifest(ViewerManifest): self.path("alut.dll") # For ICU4C - # self.path("icudt48.dll") - # self.path("icuin48.dll") - # self.path("icuio48.dll") - # self.path("icule48.dll") - # self.path("iculx48.dll") - # self.path("icutu48.dll") - # self.path("icuuc48.dll") + self.path("icudt48.dll") + self.path("icuuc48.dll") # For textures self.path("openjpeg.dll") -- cgit v1.2.3 From 66f59478d09122ddf43c4ba3445754d1698bf016 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Wed, 25 Jan 2023 10:57:29 -0800 Subject: DRTVWR-489-emoji: declaring this variable as a U16 leads to a warning (and therefore an error) but only on 32bit Windows builds - 64bit is fine. I don't know why that's the case (should be both surely) but in any case, I think the variable should be declared as a size_t --- indra/newview/llpanelemojicomplete.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 2116b350be..aa0f806525 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -85,7 +85,7 @@ protected: LLUIImagePtr mSelectedImage; LLWString mEmojis; - U16 mVisibleEmojis = 0; + size_t mVisibleEmojis = 0; size_t mFirstVisible = 0; size_t mScrollPos = 0; size_t mCurSelected = 0; -- cgit v1.2.3 From da0335c864477036ba996fbab4db2194535466d7 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 25 Jan 2023 20:31:04 +0100 Subject: Fix Mac build - Link against ICU4C - Font files were only copied on Windows builds - Replace missing variable --- indra/cmake/ICU4C.cmake | 4 ++-- indra/llrender/llfontregistry.cpp | 2 +- indra/newview/CMakeLists.txt | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/cmake/ICU4C.cmake b/indra/cmake/ICU4C.cmake index 007a9b6937..b51087e0e7 100644 --- a/indra/cmake/ICU4C.cmake +++ b/indra/cmake/ICU4C.cmake @@ -10,8 +10,8 @@ else (USESYSTEMLIBS) use_prebuilt_binary(icu4c) if (WINDOWS) set(ICU4C_LIBRARY icuuc) - #elseif(DARWIN) - # set(ICU4C_LIBRARY ...) + elseif(DARWIN) + set(ICU4C_LIBRARY icuuc) #elseif(LINUX) # set(ICU4C_LIBRARY ...) else() diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 44f2bd4cc5..c9a9ee3a03 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -483,7 +483,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) #if LL_DARWIN font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY); font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY + MACOSX_FONT_SUPPLEMENTAL); - font_search_paths.push_back(sys_path + MACOSX_FONT_SUPPLEMENTAL); + font_search_paths.push_back(LLFontGL::getFontPathSystem() + MACOSX_FONT_SUPPLEMENTAL); #endif // The fontname string may contain multiple font file names separated by semicolons. diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 36f4680c44..bca8e98c87 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1506,12 +1506,6 @@ if (WINDOWS) set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp) endif(USE_PRECOMPILED_HEADERS) - message("Copying fonts") - file(GLOB FONT_FILE_GLOB_LIST - "${AUTOBUILD_INSTALL_DIR}/fonts/*" - ) - file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") - # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") @@ -2087,6 +2081,12 @@ endif (USE_BUGSPLAT) set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Path to artwork files.") +message("Copying fonts") +file(GLOB FONT_FILE_GLOB_LIST + "${AUTOBUILD_INSTALL_DIR}/fonts/*" +) +file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") + if (LINUX) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) -- cgit v1.2.3 From 3185bdea27b19e155c2ccc03c80624e113d312a6 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 14:45:45 -0800 Subject: DRTVWR-489-emoji: As part of the work to get macOS version of the Viewer working, the flag was introduced to warn (and therefore error out) when a virtual override was not marked with the 'override' keyword. Fixing this up involved a large number of changes and this commit represents just those changes - nothing specially from the DRTVWR-489 viewer --- indra/llappearance/llwearabletype.h | 2 +- indra/llcommon/llcoros.h | 2 +- indra/llcommon/llsingleton.h | 2 +- indra/llinventory/llfoldertype.cpp | 2 +- indra/llinventory/llinventorysettings.cpp | 2 +- indra/llmessage/llexperiencecache.h | 2 +- indra/llmessage/llproxy.h | 2 +- indra/llui/llnotifications.h | 6 +- indra/llui/llspellcheck.h | 2 +- indra/llui/lltextbase.cpp | 21 ---- indra/llui/lltextbase.h | 2 +- indra/llui/lluictrl.h | 2 +- indra/llui/llview.cpp | 4 +- indra/llui/llviewquery.h | 12 +-- indra/newview/llautoreplace.h | 2 +- indra/newview/llchannelmanager.h | 2 +- indra/newview/llchicletbar.h | 4 +- indra/newview/llconversationlog.h | 10 +- indra/newview/llfeaturemanager.h | 2 +- indra/newview/llfriendcard.h | 2 +- indra/newview/llgesturemgr.h | 4 +- indra/newview/llimagefiltersmanager.h | 2 +- indra/newview/llimview.h | 2 +- indra/newview/llmutelist.h | 2 +- indra/newview/llnavigationbar.h | 8 +- indra/newview/lloutfitobserver.h | 2 +- indra/newview/llpaneltopinfobar.h | 6 +- indra/newview/llpathfindingpathtool.h | 18 ++-- indra/newview/llproductinforequest.h | 2 +- indra/newview/llrecentpeople.h | 2 +- indra/newview/llspeakers.h | 4 +- indra/newview/llspeakingindicatormanager.cpp | 2 +- indra/newview/lltoolbrush.h | 20 ++-- indra/newview/lltoolcomp.h | 72 ++++++------- indra/newview/lltooldraganddrop.h | 12 +-- indra/newview/lltoolface.h | 10 +- indra/newview/lltoolfocus.h | 14 +-- indra/newview/lltoolindividual.h | 8 +- indra/newview/lltoolobjpicker.h | 14 +-- indra/newview/lltoolpie.h | 32 +++--- indra/newview/lltoolpipette.h | 8 +- indra/newview/lltoolselectland.h | 16 +-- indra/newview/llversioninfo.h | 2 +- indra/newview/llviewerhelp.h | 10 +- indra/newview/llviewermedia.h | 2 +- indra/newview/llviewermediafocus.h | 16 +-- indra/newview/llviewerparcelaskplay.h | 4 +- indra/newview/llviewerparcelmedia.h | 2 +- indra/newview/llviewerparcelmediaautoplay.h | 2 +- indra/newview/llviewertexturelist.h | 6 +- indra/newview/llvoicechannel.h | 22 ++-- indra/newview/llvoicevivox.h | 146 +++++++++++++-------------- indra/newview/llwearableitemslist.h | 6 +- indra/newview/llwindebug.h | 4 +- 54 files changed, 272 insertions(+), 295 deletions(-) diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h index 793a33cc87..1fbe19ddd1 100644 --- a/indra/llappearance/llwearabletype.h +++ b/indra/llappearance/llwearabletype.h @@ -37,7 +37,7 @@ class LLWearableType : public LLParamSingleton { LLSINGLETON(LLWearableType, LLTranslationBridge::ptr_t &trans); ~LLWearableType(); - void initSingleton(); + void initSingleton() override; public: enum EType { diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index dbff921f16..a6da94005b 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -92,7 +92,7 @@ class LL_COMMON_API LLCoros: public LLSingleton LLSINGLETON(LLCoros); ~LLCoros(); - void cleanupSingleton(); + void cleanupSingleton() override; public: /// The viewer's use of the term "coroutine" became deeply embedded before /// the industry term "fiber" emerged to distinguish userland threads from diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 51ef514cf7..cbe5ab6406 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -802,7 +802,7 @@ public: private: \ /* implement LLSingleton pure virtual method whose sole purpose */ \ /* is to remind people to use this macro */ \ - virtual void you_must_use_LLSINGLETON_macro() {} \ + virtual void you_must_use_LLSINGLETON_macro() override {} \ friend class LLSingleton; \ DERIVED_CLASS(__VA_ARGS__) diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp index 675da65af2..818a8b5cc3 100644 --- a/indra/llinventory/llfoldertype.cpp +++ b/indra/llinventory/llfoldertype.cpp @@ -60,7 +60,7 @@ class LLFolderDictionary : public LLSingleton, { LLSINGLETON(LLFolderDictionary); protected: - virtual LLFolderType::EType notFound() const + virtual LLFolderType::EType notFound() const override { return LLFolderType::FT_NONE; } diff --git a/indra/llinventory/llinventorysettings.cpp b/indra/llinventory/llinventorysettings.cpp index 81485b3a97..bc604097da 100644 --- a/indra/llinventory/llinventorysettings.cpp +++ b/indra/llinventory/llinventorysettings.cpp @@ -62,7 +62,7 @@ class LLSettingsDictionary : public LLSingleton, { LLSINGLETON(LLSettingsDictionary); - void initSingleton(); + void initSingleton() override; }; LLSettingsDictionary::LLSettingsDictionary() diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h index 1c97133723..8be4c64dfc 100644 --- a/indra/llmessage/llexperiencecache.h +++ b/indra/llmessage/llexperiencecache.h @@ -106,7 +106,7 @@ public: private: virtual ~LLExperienceCache(); - virtual void initSingleton(); + virtual void initSingleton() override; typedef boost::function permissionInvoker_fn; diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h index 25f6977e14..8a64cdbfaa 100644 --- a/indra/llmessage/llproxy.h +++ b/indra/llmessage/llproxy.h @@ -226,7 +226,7 @@ class LLProxy: public LLSingleton LLSINGLETON(LLProxy); LOG_CLASS(LLProxy); - /*virtual*/ void initSingleton(); + /*virtual*/ void initSingleton() override; public: // Static check for enabled status for UDP packets. Call from main thread only. diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 921398a693..4d9a33f1d7 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -913,7 +913,7 @@ public: /* virtual */ LLNotificationPtr add(const std::string& name, const LLSD& substitutions, const LLSD& payload, - LLNotificationFunctorRegistry::ResponseFunctor functor); + LLNotificationFunctorRegistry::ResponseFunctor functor) override; LLNotificationPtr add(const LLNotification::Params& p); void add(const LLNotificationPtr pNotif); @@ -964,8 +964,8 @@ public: bool isVisibleByRules(LLNotificationPtr pNotification); private: - /*virtual*/ void initSingleton(); - /*virtual*/ void cleanupSingleton(); + /*virtual*/ void initSingleton() override; + /*virtual*/ void cleanupSingleton() override; void loadPersistentNotifications(); diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h index 3da5e30955..14f9b44fe4 100644 --- a/indra/llui/llspellcheck.h +++ b/indra/llui/llspellcheck.h @@ -47,7 +47,7 @@ public: protected: void addToDictFile(const std::string& dict_path, const std::string& word); void initHunspell(const std::string& dict_language); - void initSingleton(); + void initSingleton() override; public: typedef std::list dict_list_t; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index b2c0577604..dff4bf9617 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1997,19 +1997,8 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getEditableSegIterContaini LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index) { - static LLPointer index_segment = new LLIndexSegment(); - S32 text_len = 0; - if (!useLabel()) - { - text_len = getLength(); - } - else - { - text_len = mLabel.getWString().length(); - } - // when there are no segments, we return the end iterator, which must be checked by caller if (mSegments.size() <= 1) { return mSegments.begin(); } @@ -2023,16 +2012,6 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i { static LLPointer index_segment = new LLIndexSegment(); - S32 text_len = 0; - if (!useLabel()) - { - text_len = getLength(); - } - else - { - text_len = mLabel.getWString().length(); - } - // when there are no segments, we return the end iterator, which must be checked by caller if (mSegments.size() <= 1) { return mSegments.begin(); } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 7e1f727607..9b3691e404 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -187,7 +187,7 @@ public: LLEmojiTextSegment(const LLColor4& color, S32 start, S32 end, LLTextBase& editor, BOOL is_visible = TRUE); bool canEdit() const override { return false; } - BOOL handleToolTip(S32 x, S32 y, MASK mask); + BOOL handleToolTip(S32 x, S32 y, MASK mask) override; }; // Text segment that changes it's style depending of mouse pointer position ( is it inside or outside segment) diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 67dd24341c..d71dc8d859 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -263,7 +263,7 @@ public: class LLTextInputFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLTextInputFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override { return filterResult_t(view->isCtrl() && static_cast(view)->acceptsTextInput(), TRUE); } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 74abe54690..2b7f05dcda 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1953,7 +1953,7 @@ private: class SortByTabOrder : public LLQuerySorter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(SortByTabOrder); - /*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const + /*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const override { children.sort(CompareByTabOrder(parent->getTabOrder(), parent->getDefaultTabGroup())); } @@ -1977,7 +1977,7 @@ const LLViewQuery & LLView::getTabOrderQuery() class LLFocusRootsFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLFocusRootsFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override { return filterResult_t(view->isCtrl() && view->isFocusRoot(), !view->isFocusRoot()); } diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h index 21bb1be26f..4bc9c4a08e 100644 --- a/indra/llui/llviewquery.h +++ b/indra/llui/llviewquery.h @@ -55,37 +55,37 @@ public: class LLLeavesFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLLeavesFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLRootsFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLRootsFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLVisibleFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLVisibleFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLEnabledFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLEnabledFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLTabStopFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLTabStopFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLCtrlFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLCtrlFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; template diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h index 23cc313646..a1eebf9dcb 100644 --- a/indra/newview/llautoreplace.h +++ b/indra/newview/llautoreplace.h @@ -203,7 +203,7 @@ public: void setSettings(const LLAutoReplaceSettings& settings); private: - /*virtual*/ void initSingleton(); + /*virtual*/ void initSingleton() override; LLAutoReplaceSettings mSettings; ///< configuration information diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index 8abe350196..22ae595d66 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -46,7 +46,7 @@ class LLChannelManager : public LLSingleton LLSINGLETON(LLChannelManager); virtual ~LLChannelManager(); - void cleanupSingleton(); + void cleanupSingleton() override; public: diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h index 6c521dc1d5..c295b99962 100644 --- a/indra/newview/llchicletbar.h +++ b/indra/newview/llchicletbar.h @@ -43,11 +43,11 @@ class LLChicletBar public: - BOOL postBuild(); + BOOL postBuild() override; LLChicletPanel* getChicletPanel() { return mChicletPanel; } - /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent) override; /** diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h index 820a5db491..54aeedcf9a 100644 --- a/indra/newview/llconversationlog.h +++ b/indra/newview/llconversationlog.h @@ -125,11 +125,11 @@ public: void removeObserver(LLConversationLogObserver* observer); // LLIMSessionObserver triggers - virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg); - virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}; // Stub - virtual void sessionRemoved(const LLUUID& session_id){} // Stub - virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){}; // Stub - virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){}; // Stub + virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg) override; + virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) override {}; // Stub + virtual void sessionRemoved(const LLUUID& session_id) override{} // Stub + virtual void sessionVoiceOrIMStarted(const LLUUID& session_id) override{}; // Stub + virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) override{}; // Stub void notifyObservers(); diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 42a226cd18..d9269224af 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -101,7 +101,7 @@ class LLFeatureManager : public LLFeatureList, public LLSingleton mFiltersList; diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 326e8f22e3..353373f3b4 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -506,7 +506,7 @@ public: static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); private: - void initSingleton(); + void initSingleton() override; void onVoiceChannelChangedInt(const LLUUID &session_id); void onVoiceChannelStateChangedInt(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 0d426fbd48..f86c2acd10 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -73,7 +73,7 @@ class LLMuteList : public LLSingleton { LLSINGLETON(LLMuteList); ~LLMuteList(); - /*virtual*/ void cleanupSingleton(); + /*virtual*/ void cleanupSingleton() override; public: // reasons for auto-unmuting a resident enum EAutoReason diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 11c671294a..4649f5bcb0 100755 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -92,10 +92,10 @@ class LLNavigationBar public: - /*virtual*/ void draw(); - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL postBuild(); - /*virtual*/ void setVisible(BOOL visible); + /*virtual*/ void draw() override; + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL postBuild() override; + /*virtual*/ void setVisible(BOOL visible) override; void handleLoginComplete(); void clearHistoryCache(); diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h index 77041db68d..77bb3543aa 100644 --- a/indra/newview/lloutfitobserver.h +++ b/indra/newview/lloutfitobserver.h @@ -41,7 +41,7 @@ class LLOutfitObserver: public LLInventoryObserver, public LLSingleton, public: typedef boost::signals2::signal resize_signal_t; - /*virtual*/ BOOL postBuild(); - /*virtual*/ void draw(); + /*virtual*/ BOOL postBuild() override; + /*virtual*/ void draw() override; /** * Updates location and parcel icons on login complete @@ -83,7 +83,7 @@ private: */ void initParcelIcons(); - BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; /** * Handles clicks on the parcel icons. diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h index 88cb3a15f8..f98624e30d 100644 --- a/indra/newview/llpathfindingpathtool.h +++ b/indra/newview/llpathfindingpathtool.h @@ -66,17 +66,17 @@ public: typedef boost::signals2::signal path_event_signal_t; typedef boost::signals2::connection path_event_slot_t; - virtual BOOL handleMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleRightMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleRightMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleRightMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleRightMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; - virtual BOOL handleHover(S32 pX, S32 pY, MASK pMask); + virtual BOOL handleHover(S32 pX, S32 pY, MASK pMask) override; - virtual BOOL handleKey(KEY pKey, MASK pMask); + virtual BOOL handleKey(KEY pKey, MASK pMask) override; EPathStatus getPathStatus() const; diff --git a/indra/newview/llproductinforequest.h b/indra/newview/llproductinforequest.h index d1036374e8..0b94c39d11 100644 --- a/indra/newview/llproductinforequest.h +++ b/indra/newview/llproductinforequest.h @@ -46,7 +46,7 @@ public: std::string getDescriptionForSku(const std::string& sku); private: - /* virtual */ void initSingleton(); + /* virtual */ void initSingleton() override; void getLandDescriptionsCoro(std::string url); LLSD mSkuDescriptions; diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h index 1b322f2c0a..0c04222a9f 100644 --- a/indra/newview/llrecentpeople.h +++ b/indra/newview/llrecentpeople.h @@ -106,7 +106,7 @@ public: /** * LLSimpleListener interface. */ - /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata) override; void updateAvatarsArrivalTime(uuid_vec_t& uuids); F32 getArrivalTimeByID(const LLUUID& id); diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index ed795b5155..22c9481687 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -338,7 +338,7 @@ class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton @@ -347,7 +347,7 @@ class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton speaker_ids_t; diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h index c108d83256..6545ee3611 100644 --- a/indra/newview/lltoolbrush.h +++ b/indra/newview/lltoolbrush.h @@ -49,27 +49,27 @@ class LLToolBrushLand : public LLTool, public LLEditMenuHandler, public LLSingle public: // x,y in window coords, 0,0 = left,bot - virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask ); - virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask ); - virtual BOOL handleHover( S32 x, S32 y, MASK mask ); - virtual void handleSelect(); - virtual void handleDeselect(); + virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask ) override; + virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask ) override; + virtual BOOL handleHover( S32 x, S32 y, MASK mask ) override; + virtual void handleSelect() override; + virtual void handleDeselect() override; // isAlwaysRendered() - return true if this is a tool that should // always be rendered regardless of selection. - virtual BOOL isAlwaysRendered() { return TRUE; } + virtual BOOL isAlwaysRendered() override { return TRUE; } // Draw the area that will be affected. - virtual void render(); + virtual void render() override; // on Idle is where the land modification actually occurs static void onIdle(void* brush_tool); - void onMouseCaptureLost(); + void onMouseCaptureLost() override; void modifyLandInSelectionGlobal(); - virtual void undo(); - virtual BOOL canUndo() const { return TRUE; } + virtual void undo() override; + virtual BOOL canUndo() const override { return TRUE; } protected: void brush( void ); diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h index 86506f725e..f539a045b7 100644 --- a/indra/newview/lltoolcomp.h +++ b/indra/newview/lltoolcomp.h @@ -108,11 +108,11 @@ class LLToolCompInspect : public LLToolComposite, public LLSingleton public: // Overridden from LLToolComposite - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - virtual void onMouseCaptureLost(); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual LLTool* getOverrideTool(MASK mask) { return NULL; } + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) override; + virtual void onMouseCaptureLost() override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual LLTool* getOverrideTool(MASK mask) override { return NULL; } protected: LLToolGun* mGun; diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 4537d73332..8ec027cb0e 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -48,12 +48,12 @@ public: typedef boost::signals2::signal enddrag_signal_t; // overridden from LLTool - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleKey(KEY key, MASK mask); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); - virtual void onMouseCaptureLost(); - virtual void handleDeselect(); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleKey(KEY key, MASK mask) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; + virtual void onMouseCaptureLost() override; + virtual void handleDeselect() override; void setDragStart( S32 x, S32 y ); // In screen space BOOL isOverThreshold( S32 x, S32 y ); // In screen space diff --git a/indra/newview/lltoolface.h b/indra/newview/lltoolface.h index e4b8ae12b8..7c8ff20480 100644 --- a/indra/newview/lltoolface.h +++ b/indra/newview/lltoolface.h @@ -39,11 +39,11 @@ class LLToolFace virtual ~LLToolFace(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual void render(); // draw face highlights + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual void render() override; // draw face highlights static void pickCallback(const LLPickInfo& pick_info); }; diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index cfc235b6c2..c9dd39ff4b 100644 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -38,16 +38,16 @@ class LLToolCamera virtual ~LLToolCamera(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; - virtual void onMouseCaptureLost(); + virtual void onMouseCaptureLost() override; - virtual void handleSelect(); - virtual void handleDeselect(); + virtual void handleSelect() override; + virtual void handleDeselect() override; - virtual LLTool* getOverrideTool(MASK mask) { return NULL; } + virtual LLTool* getOverrideTool(MASK mask) override { return NULL; } static void pickCallback(const LLPickInfo& pick_info); BOOL mouseSteerMode() { return mMouseSteering; } diff --git a/indra/newview/lltoolindividual.h b/indra/newview/lltoolindividual.h index e7c2060fba..89dd9d9796 100644 --- a/indra/newview/lltoolindividual.h +++ b/indra/newview/lltoolindividual.h @@ -43,11 +43,9 @@ class LLToolIndividual : public LLTool, public LLSingleton virtual ~LLToolIndividual(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual void handleSelect(); - //virtual void handleDeselect(); - //virtual void render(); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual void handleSelect() override; static void pickCallback(const LLPickInfo& pick_info); diff --git a/indra/newview/lltoolobjpicker.h b/indra/newview/lltoolobjpicker.h index 5ad9b67e21..a55cd223de 100644 --- a/indra/newview/lltoolobjpicker.h +++ b/indra/newview/lltoolobjpicker.h @@ -38,16 +38,16 @@ class LLToolObjPicker : public LLTool, public LLSingleton LLSINGLETON(LLToolObjPicker); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; - virtual void handleSelect(); - virtual void handleDeselect(); + virtual void handleSelect() override; + virtual void handleDeselect() override; - virtual void onMouseCaptureLost(); + virtual void onMouseCaptureLost() override; - virtual void setExitCallback(void (*callback)(void *), void *callback_data); + void setExitCallback(void (*callback)(void *), void *callback_data); LLUUID getObjectID() const { return mHitObjectID; } diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 8f6100e4b4..dca0d12cf6 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -42,26 +42,26 @@ class LLToolPie : public LLTool, public LLSingleton public: // Virtual functions inherited from LLMouseHandler - virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down) override; + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; BOOL handleScrollWheelAny(S32 x, S32 y, S32 clicks_x, S32 clicks_y); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - virtual BOOL handleScrollHWheel(S32 x, S32 y, S32 clicks); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) override; + virtual BOOL handleScrollHWheel(S32 x, S32 y, S32 clicks) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; - virtual void render(); + virtual void render() override; - virtual void stopEditing(); + virtual void stopEditing() override; - virtual void onMouseCaptureLost(); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual LLTool* getOverrideTool(MASK mask); + virtual void onMouseCaptureLost() override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual LLTool* getOverrideTool(MASK mask) override; LLPickInfo& getPick() { return mPick; } U8 getClickAction() { return mClickAction; } diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h index 7575d8ad18..2636811c66 100644 --- a/indra/newview/lltoolpipette.h +++ b/indra/newview/lltoolpipette.h @@ -47,10 +47,10 @@ class LLToolPipette virtual ~LLToolPipette(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; // Note: Don't return connection; use boost::bind + boost::signals2::trackable to disconnect slots typedef boost::signals2::signal signal_t; diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h index b5ba72f16d..88bc4e2e3d 100644 --- a/indra/newview/lltoolselectland.h +++ b/indra/newview/lltoolselectland.h @@ -39,15 +39,15 @@ class LLToolSelectLand virtual ~LLToolSelectLand(); public: - /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); - /*virtual*/ void render(); // draw the select rectangle - /*virtual*/ BOOL isAlwaysRendered() { return TRUE; } + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) override; + /*virtual*/ void render() override; // draw the select rectangle + /*virtual*/ BOOL isAlwaysRendered() override { return TRUE; } - /*virtual*/ void handleSelect(); - /*virtual*/ void handleDeselect(); + /*virtual*/ void handleSelect() override; + /*virtual*/ void handleDeselect() override; protected: BOOL outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y); diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index 02ff0c094a..37382243f6 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -47,7 +47,7 @@ class LLStoreListener; class LLVersionInfo: public LLSingleton { LLSINGLETON(LLVersionInfo); - void initSingleton(); + void initSingleton() override; public: ~LLVersionInfo(); diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h index da50e07a43..bbd20bc07e 100644 --- a/indra/newview/llviewerhelp.h +++ b/indra/newview/llviewerhelp.h @@ -43,21 +43,21 @@ class LLViewerHelp : public LLHelp, public LLSingleton public: /// display the specified help topic in the help viewer - /*virtual*/ void showTopic(const std::string &topic); + /*virtual*/ void showTopic(const std::string &topic) override; - std::string getURL(const std::string& topic); + std::string getURL(const std::string& topic) override; // return topic derived from viewer UI focus, else default topic std::string getTopicFromFocus(); /// return default (fallback) topic name suitable for showTopic() - /*virtual*/ std::string defaultTopic(); + /*virtual*/ std::string defaultTopic() override; // return topic to use before the user logs in - /*virtual*/ std::string preLoginTopic(); + /*virtual*/ std::string preLoginTopic() override; // return topic to use for the top-level help, invoked by F1 - /*virtual*/ std::string f1HelpTopic(); + /*virtual*/ std::string f1HelpTopic() override; }; #endif // header guard diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index f1f42afd81..ad7c4bcefa 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -74,7 +74,7 @@ class LLViewerMedia: public LLSingleton { LLSINGLETON(LLViewerMedia); ~LLViewerMedia(); - void initSingleton(); + void initSingleton() override; LOG_CLASS(LLViewerMedia); public: diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index effd08a559..2310e4dbfc 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -54,10 +54,10 @@ public: void setHoverFace(LLPointer objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero); void clearHover(); - /*virtual*/ bool getFocus(); - /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); - /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent); - /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); + bool getFocus(); + /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) override; + /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) override; BOOL handleScrollWheel(const LLVector2& texture_coords, S32 clicks_x, S32 clicks_y); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks_x, S32 clicks_y); @@ -92,12 +92,12 @@ public: LLUUID getControlsMediaID(); // The MoaP object wants keyup and keydown events. Overridden to return true. - virtual bool wantsKeyUpKeyDown() const; - virtual bool wantsReturnKey() const; + virtual bool wantsKeyUpKeyDown() const override; + virtual bool wantsReturnKey() const override; protected: - /*virtual*/ void onFocusReceived(); - /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived() override; + /*virtual*/ void onFocusLost() override; private: diff --git a/indra/newview/llviewerparcelaskplay.h b/indra/newview/llviewerparcelaskplay.h index dc711917d2..56faddae66 100644 --- a/indra/newview/llviewerparcelaskplay.h +++ b/indra/newview/llviewerparcelaskplay.h @@ -34,8 +34,8 @@ class LLViewerParcelAskPlay : public LLSingleton { LLSINGLETON(LLViewerParcelAskPlay); ~LLViewerParcelAskPlay(); - void initSingleton(); - void cleanupSingleton(); + void initSingleton() override; + void cleanupSingleton() override; public: // functor expects functor(region_id, parcel_id, url, play/stop) typedef boost::function ask_callback; diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h index 779a65bdf8..790b2b71fc 100644 --- a/indra/newview/llviewerparcelmedia.h +++ b/indra/newview/llviewerparcelmedia.h @@ -74,7 +74,7 @@ public: void sendMediaNavigateMessage(const std::string& url); // inherited from LLViewerMediaObserver - virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); + virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override; private: void processParcelMediaCommandMessage(LLMessageSystem *msg); diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h index d71fd4c075..e83085dee0 100644 --- a/indra/newview/llviewerparcelmediaautoplay.h +++ b/indra/newview/llviewerparcelmediaautoplay.h @@ -35,7 +35,7 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer, public LLSingleton getUIImageByID(const LLUUID& id, S32 priority); - /*virtual*/ LLPointer getUIImage(const std::string& name, S32 priority); - void cleanUp(); + /*virtual*/ LLPointer getUIImageByID(const LLUUID& id, S32 priority) override; + /*virtual*/ LLPointer getUIImage(const std::string& name, S32 priority) override; + void cleanUp() override; bool initFromFile(); diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 309c3eebdd..e68bfbe1ff 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -170,12 +170,12 @@ class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton &participants); - virtual bool isParticipant(const LLUUID& speaker_id); + virtual void getParticipantList(std::set &participants) override; + virtual bool isParticipant(const LLUUID& speaker_id) override; // Send a text message to the specified user, initiating the session if necessary. // virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return false;}; // close any existing text IM session with the specified user - virtual void endUserIMSession(const LLUUID &uuid); + virtual void endUserIMSession(const LLUUID &uuid) override; // Returns true if calling back the session URI after the session has closed is possible. // Currently this will be false only for PSTN P2P calls. // NOTE: this will return true if the session can't be found. - virtual BOOL isSessionCallBackPossible(const LLUUID &session_id); + virtual BOOL isSessionCallBackPossible(const LLUUID &session_id) override; // Returns true if the session can accepte text IM's. // Currently this will be false only for PSTN P2P calls. // NOTE: this will return true if the session can't be found. - virtual BOOL isSessionTextIMPossible(const LLUUID &session_id); + virtual BOOL isSessionTextIMPossible(const LLUUID &session_id) override; //////////////////////////// @@ -134,21 +134,21 @@ public: //@{ // returns true iff the user is currently in a proximal (local spatial) channel. // Note that gestures should only fire if this returns true. - virtual bool inProximalChannel(); + virtual bool inProximalChannel() override; virtual void setNonSpatialChannel(const std::string &uri, - const std::string &credentials); + const std::string &credentials) override; virtual bool setSpatialChannel(const std::string &uri, - const std::string &credentials); + const std::string &credentials) override; - virtual void leaveNonSpatialChannel(); + virtual void leaveNonSpatialChannel() override; - virtual void leaveChannel(void); + virtual void leaveChannel(void) override; // Returns the URI of the current channel, or an empty string if not currently in a channel. // NOTE that it will return an empty string if it's in the process of joining a channel. - virtual std::string getCurrentChannel(); + virtual std::string getCurrentChannel() override; //@} @@ -156,59 +156,59 @@ public: /// @name invitations //@{ // start a voice channel with the specified user - virtual void callUser(const LLUUID &uuid); - virtual bool isValidChannel(std::string &channelHandle); - virtual bool answerInvite(std::string &channelHandle); - virtual void declineInvite(std::string &channelHandle); + virtual void callUser(const LLUUID &uuid) override; + virtual bool isValidChannel(std::string &channelHandle) override; + virtual bool answerInvite(std::string &channelHandle) override; + virtual void declineInvite(std::string &channelHandle) override; //@} ///////////////////////// /// @name Volume/gain //@{ - virtual void setVoiceVolume(F32 volume); - virtual void setMicGain(F32 volume); + virtual void setVoiceVolume(F32 volume) override; + virtual void setMicGain(F32 volume) override; //@} ///////////////////////// /// @name enable disable voice and features //@{ - virtual bool voiceEnabled(); - virtual void setVoiceEnabled(bool enabled); - virtual BOOL lipSyncEnabled(); - virtual void setLipSyncEnabled(BOOL enabled); - virtual void setMuteMic(bool muted); // Set the mute state of the local mic. + virtual bool voiceEnabled() override; + virtual void setVoiceEnabled(bool enabled) override; + virtual BOOL lipSyncEnabled() override; + virtual void setLipSyncEnabled(BOOL enabled) override; + virtual void setMuteMic(bool muted) override; // Set the mute state of the local mic. //@} ////////////////////////// /// @name nearby speaker accessors //@{ - virtual BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar - virtual std::string getDisplayName(const LLUUID& id); - virtual BOOL isParticipantAvatar(const LLUUID &id); - virtual BOOL getIsSpeaking(const LLUUID& id); - virtual BOOL getIsModeratorMuted(const LLUUID& id); - virtual F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... - virtual BOOL getOnMuteList(const LLUUID& id); - virtual F32 getUserVolume(const LLUUID& id); - virtual void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal) + virtual BOOL getVoiceEnabled(const LLUUID& id) override; // true if we've received data for this avatar + virtual std::string getDisplayName(const LLUUID& id) override; + virtual BOOL isParticipantAvatar(const LLUUID &id) override; + virtual BOOL getIsSpeaking(const LLUUID& id) override; + virtual BOOL getIsModeratorMuted(const LLUUID& id) override; + virtual F32 getCurrentPower(const LLUUID& id) override; // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... + virtual BOOL getOnMuteList(const LLUUID& id) override; + virtual F32 getUserVolume(const LLUUID& id) override; + virtual void setUserVolume(const LLUUID& id, F32 volume) override; // set's volume for specified agent, from 0-1 (where .5 is nominal) //@} // authorize the user virtual void userAuthorized(const std::string& user_id, - const LLUUID &agentID); + const LLUUID &agentID) override; ////////////////////////////// /// @name Status notification //@{ - virtual void addObserver(LLVoiceClientStatusObserver* observer); - virtual void removeObserver(LLVoiceClientStatusObserver* observer); - virtual void addObserver(LLFriendObserver* observer); - virtual void removeObserver(LLFriendObserver* observer); - virtual void addObserver(LLVoiceClientParticipantObserver* observer); - virtual void removeObserver(LLVoiceClientParticipantObserver* observer); + virtual void addObserver(LLVoiceClientStatusObserver* observer) override; + virtual void removeObserver(LLVoiceClientStatusObserver* observer) override; + virtual void addObserver(LLFriendObserver* observer) override; + virtual void removeObserver(LLFriendObserver* observer) override; + virtual void addObserver(LLVoiceClientParticipantObserver* observer) override; + virtual void removeObserver(LLVoiceClientParticipantObserver* observer) override; //@} - virtual std::string sipURIFromID(const LLUUID &id); + virtual std::string sipURIFromID(const LLUUID &id) override; //@} /// @name LLVoiceEffectInterface virtual implementations @@ -218,32 +218,32 @@ public: ////////////////////////// /// @name Accessors //@{ - virtual bool setVoiceEffect(const LLUUID& id); - virtual const LLUUID getVoiceEffect(); - virtual LLSD getVoiceEffectProperties(const LLUUID& id); + virtual bool setVoiceEffect(const LLUUID& id) override; + virtual const LLUUID getVoiceEffect() override; + virtual LLSD getVoiceEffectProperties(const LLUUID& id) override; - virtual void refreshVoiceEffectLists(bool clear_lists); - virtual const voice_effect_list_t& getVoiceEffectList() const; - virtual const voice_effect_list_t& getVoiceEffectTemplateList() const; + virtual void refreshVoiceEffectLists(bool clear_lists) override; + virtual const voice_effect_list_t& getVoiceEffectList() const override; + virtual const voice_effect_list_t& getVoiceEffectTemplateList() const override; //@} ////////////////////////////// /// @name Status notification //@{ - virtual void addObserver(LLVoiceEffectObserver* observer); - virtual void removeObserver(LLVoiceEffectObserver* observer); + virtual void addObserver(LLVoiceEffectObserver* observer) override; + virtual void removeObserver(LLVoiceEffectObserver* observer) override; //@} ////////////////////////////// /// @name Effect preview buffer //@{ - virtual void enablePreviewBuffer(bool enable); - virtual void recordPreviewBuffer(); - virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null); - virtual void stopPreviewBuffer(); + virtual void enablePreviewBuffer(bool enable) override; + virtual void recordPreviewBuffer() override; + virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null) override; + virtual void stopPreviewBuffer() override; - virtual bool isPreviewRecording(); - virtual bool isPreviewPlaying(); + virtual bool isPreviewRecording() override; + virtual bool isPreviewPlaying() override; //@} //@} @@ -754,7 +754,7 @@ private: std::string getAudioSessionURI(); std::string getAudioSessionHandle(); - void setHidden(bool hidden); //virtual + void setHidden(bool hidden) override; //virtual void sendPositionAndVolumeUpdate(void); void sendCaptureAndRenderDevices(); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index ba8488b237..602e8f0711 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -413,7 +413,7 @@ public: { LLSINGLETON(ContextMenu); public: - /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); + /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) override; void show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y); @@ -426,7 +426,7 @@ public: MASK_UNKNOWN = 0x10, }; - /* virtual */ LLContextMenu* createMenu(); + /* virtual */ LLContextMenu* createMenu() override; void updateItemsVisibility(LLContextMenu* menu); void updateItemsLabels(LLContextMenu* menu); static void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val); @@ -456,7 +456,7 @@ public: virtual ~LLWearableItemsList(); - /*virtual*/ LLPanel* createNewItem(LLViewerInventoryItem* item); + /*virtual*/ LLPanel* createNewItem(LLViewerInventoryItem* item) override; void updateList(const LLUUID& category_id); diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h index 524adba652..31dbfb8ffd 100644 --- a/indra/newview/llwindebug.h +++ b/indra/newview/llwindebug.h @@ -40,9 +40,9 @@ class LLWinDebug: { LLSINGLETON_EMPTY_CTOR(LLWinDebug); public: - void initSingleton(); + void initSingleton() override; static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); - void cleanupSingleton(); + void cleanupSingleton() override; private: static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); }; -- cgit v1.2.3 From a804b98e4ed127ce1a11f639babb82574f2e5204 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 17:03:58 -0800 Subject: DRTVWR-489-emoji: A couple of tabs slipped into this file and our new no-tabs coding policy caught it and failed the build --- indra/llui/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 44c61dcdbc..4fc3836248 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -53,8 +53,8 @@ set(llui_SOURCE_FILES lldockcontrol.cpp lldraghandle.cpp lleditmenuhandler.cpp - llemojidictionary.cpp - llemojihelper.cpp + llemojidictionary.cpp + llemojihelper.cpp llf32uictrl.cpp llfiltereditor.cpp llflashtimer.cpp @@ -165,8 +165,8 @@ set(llui_HEADER_FILES lldockablefloater.h lldockcontrol.h lleditmenuhandler.h - llemojidictionary.h - llemojihelper.h + llemojidictionary.h + llemojihelper.h llf32uictrl.h llfiltereditor.h llflashtimer.h -- cgit v1.2.3 From d9e82ab14aaa3e0daceacda8cf72ade379e9caf1 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 17:04:35 -0800 Subject: DRTVWR-489-emoji: Pull in some small changes from Kitty's work to move the macOS build forwards --- indra/cmake/ICU4C.cmake | 4 ++-- indra/llrender/llfontregistry.cpp | 2 +- indra/newview/CMakeLists.txt | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/indra/cmake/ICU4C.cmake b/indra/cmake/ICU4C.cmake index 007a9b6937..b51087e0e7 100644 --- a/indra/cmake/ICU4C.cmake +++ b/indra/cmake/ICU4C.cmake @@ -10,8 +10,8 @@ else (USESYSTEMLIBS) use_prebuilt_binary(icu4c) if (WINDOWS) set(ICU4C_LIBRARY icuuc) - #elseif(DARWIN) - # set(ICU4C_LIBRARY ...) + elseif(DARWIN) + set(ICU4C_LIBRARY icuuc) #elseif(LINUX) # set(ICU4C_LIBRARY ...) else() diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 44f2bd4cc5..c9a9ee3a03 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -483,7 +483,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) #if LL_DARWIN font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY); font_search_paths.push_back(MACOSX_FONT_PATH_LIBRARY + MACOSX_FONT_SUPPLEMENTAL); - font_search_paths.push_back(sys_path + MACOSX_FONT_SUPPLEMENTAL); + font_search_paths.push_back(LLFontGL::getFontPathSystem() + MACOSX_FONT_SUPPLEMENTAL); #endif // The fontname string may contain multiple font file names separated by semicolons. diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 36f4680c44..ee55657dd8 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -449,7 +449,7 @@ set(viewer_SOURCE_FILES llpaneleditsky.cpp llpaneleditwater.cpp llpaneleditwearable.cpp - llpanelemojicomplete.cpp + llpanelemojicomplete.cpp llpanelenvironment.cpp llpanelexperiencelisteditor.cpp llpanelexperiencelog.cpp @@ -1081,7 +1081,7 @@ set(viewer_HEADER_FILES llpaneleditsky.h llpaneleditwater.h llpaneleditwearable.h - llpanelemojicomplete.h + llpanelemojicomplete.h llpanelenvironment.h llpanelexperiencelisteditor.h llpanelexperiencelog.h @@ -1506,12 +1506,6 @@ if (WINDOWS) set(viewer_SOURCE_FILES "${viewer_SOURCE_FILES}" llviewerprecompiledheaders.cpp) endif(USE_PRECOMPILED_HEADERS) - message("Copying fonts") - file(GLOB FONT_FILE_GLOB_LIST - "${AUTOBUILD_INSTALL_DIR}/fonts/*" - ) - file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") - # Replace the icons with the appropriate ones for the channel # ('test' is the default) set(ICON_PATH "test") @@ -2087,6 +2081,12 @@ endif (USE_BUGSPLAT) set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Path to artwork files.") +message("Copying fonts") +file(GLOB FONT_FILE_GLOB_LIST + "${AUTOBUILD_INSTALL_DIR}/fonts/*" +) +file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") + if (LINUX) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) -- cgit v1.2.3 From 99779d97f1e4650c7d46f1d97d5d70e2aacfbdb8 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 17:46:56 -0800 Subject: DRTVWR-489-emoji: Pull in the updated version of GoogleMock that was updated to Python3 so that it builds on macOS in TeamCity --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 6d874b3bdc..c14c37753c 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -860,9 +860,9 @@ archive hash - 11d0794582e91a57f6524ad345f2399d + 772d3ae9d4a1d3e36eadcfb4b81ca47f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87791/805924/googlemock-1.7.0.563853-darwin64-563853.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109950/956085/googlemock-1.7.0.577943-darwin64-577943.tar.bz2 name darwin64 @@ -884,9 +884,9 @@ archive hash - 47303c9bb9a06c6f488f9d7b2b2282c4 + 61df276991917f710d27cb578d9df25b url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109524/952870/googlemock-1.7.0.577708-windows-577708.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109953/956105/googlemock-1.7.0.577943-windows-577943.tar.bz2 name windows @@ -896,16 +896,16 @@ archive hash - c166bbd8787a68c1a4ba75179c58dda6 + cc1307e11133755eac29ab04ef240092 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109525/952878/googlemock-1.7.0.577708-windows64-577708.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109952/956106/googlemock-1.7.0.577943-windows64-577943.tar.bz2 name windows64 version - 1.7.0.577708 + 1.7.0.577943 gstreamer -- cgit v1.2.3 From 923733e591eb547ad5dfec395ce7d3e8f0468c16 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 18:01:25 -0800 Subject: DRTVWR-489-emoji: missed the override warning/error in the tests... grr... --- indra/llcommon/tests/llsingleton_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp index 15ffe68e67..49cf76b07e 100644 --- a/indra/llcommon/tests/llsingleton_test.cpp +++ b/indra/llcommon/tests/llsingleton_test.cpp @@ -47,8 +47,8 @@ public: \ DEP_INIT /* dependency in initSingleton */ \ } sDepFlag; \ \ - void initSingleton(); \ - void cleanupSingleton(); \ + void initSingleton() override; \ + void cleanupSingleton() override; \ }; \ \ CLS::dep_flag CLS::sDepFlag = DEP_NONE -- cgit v1.2.3 From 6f31fabbc2d082b77c8f09bce30234ec9c506e33 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 19:17:21 -0800 Subject: DRTVWR-489-emoji: less haste. more speed. Missed another test issue. Rebuilt locally with tests and confirmed it works now --- indra/llcommon/tests/llsingleton_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp index 49cf76b07e..6f8aaaa0cb 100644 --- a/indra/llcommon/tests/llsingleton_test.cpp +++ b/indra/llcommon/tests/llsingleton_test.cpp @@ -300,7 +300,7 @@ namespace tut { LLSINGLETON_EMPTY_CTOR(CircularPInit); public: - virtual void initSingleton() + virtual void initSingleton() override { // never mind indirection, just go straight for the circularity CircularPInit *pt = getInstance(); -- cgit v1.2.3 From b2f890408e2dc63a0f842273c41c0efed770cb9a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 2 Feb 2023 00:34:24 +0200 Subject: SL-19089 Changing UI scale crashes viewer This makes no sense, trying to add a glyph now will have no width or height set, neither character width or heigh, yet release viewer does that. Fixed code to match release and set width and height despite char width not being up to date. --- indra/llrender/llfontbitmapcache.cpp | 14 ++++++++++++++ indra/llrender/llfontfreetype.cpp | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llfontbitmapcache.cpp b/indra/llrender/llfontbitmapcache.cpp index 8809f9f475..42b0045cf3 100644 --- a/indra/llrender/llfontbitmapcache.cpp +++ b/indra/llrender/llfontbitmapcache.cpp @@ -92,6 +92,20 @@ BOOL LLFontBitmapCache::nextOpenPos(S32 width, S32& pos_x, S32& pos_y, EFontGlyp { // We're out of space in the current image, or no image // has been allocated yet. Make a new one. + + S32 image_width = mMaxCharWidth * 20; + S32 pow_iw = 2; + while (pow_iw < image_width) + { + pow_iw *= 2; + } + image_width = pow_iw; + image_width = llmin(512, image_width); // Don't make bigger than 512x512, ever. + S32 image_height = image_width; + + mBitmapWidth = image_width; + mBitmapHeight = image_height; + S32 num_components = getNumComponents(bitmap_type); mImageRawVec[bitmap_idx].push_back(new LLImageRaw(mBitmapWidth, mBitmapHeight, num_components)); bitmap_num = mImageRawVec[bitmap_idx].size() - 1; diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 5535c07615..e4010579b3 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -798,11 +798,11 @@ void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 llassert(!mIsFallback); llassert(image_raw && (image_raw->getComponents() == 2)); - U8 *target = image_raw->getData(); + llassert(target); - if (!data) + if (!data || !target) { return; } -- cgit v1.2.3 From 4df2c0b8d67af267d3c9c6d58d63df3ed063a89e Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 8 Feb 2023 17:17:47 +0100 Subject: Post-merge fix for xcode-14.1 branch --- indra/llcommon/llsdserialize.cpp | 2 +- indra/llcommon/llsdserialize.h | 2 +- indra/newview/llmeshrepository.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 73206f3d40..f66c4ff843 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -2388,7 +2388,7 @@ U8* unzip_llsdNavMesh( bool& valid, size_t& outsize, std::istream& is, S32 size return result; } -char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size) +char* strip_deprecated_header(char* in, llssize& cur_size, U32* header_size) { const char* deprecated_header = ""; constexpr size_t deprecated_header_size = 17; diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h index 2f12c6d1ff..5ddf0ff552 100644 --- a/indra/llcommon/llsdserialize.h +++ b/indra/llcommon/llsdserialize.h @@ -873,5 +873,5 @@ LL_COMMON_API std::string zip_llsd(LLSD& data); LL_COMMON_API U8* unzip_llsdNavMesh( bool& valid, size_t& outsize,std::istream& is, S32 size); // returns a pointer to the array or past the array if the deprecated header exists -LL_COMMON_API char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size = nullptr); +LL_COMMON_API char* strip_deprecated_header(char* in, llssize& cur_size, U32* header_size = nullptr); #endif // LL_LLSDSERIALIZE_H diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index f937754368..18420a2356 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1865,7 +1865,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes U32 header_size = 0; if (data_size > 0) { - U32 dsize = data_size; + llssize dsize = data_size; char* result_ptr = strip_deprecated_header((char*)data, dsize, &header_size); data_size = dsize; -- cgit v1.2.3 From 547c0665eaa19b6a2b5112faeae75e3a270b7a36 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 26 Jan 2023 14:45:45 -0800 Subject: DRTVWR-489-emoji: As part of the work to get macOS version of the Viewer working, the flag was introduced to warn (and therefore error out) when a virtual override was not marked with the 'override' keyword. Fixing this up involved a large number of changes and this commit represents just those changes - nothing specially from the DRTVWR-489 viewer (Cherry pick of 3 commits from Callum to declutter the emoji PR: 3185bdea27b19e155c2ccc03c80624e113d312a6, 923733e591eb547ad5dfec395ce7d3e8f0468c16 and 6f31fabbc2d082b77c8f09bce30234ec9c506e33) --- indra/llappearance/llwearabletype.h | 2 +- indra/llcommon/llcoros.h | 2 +- indra/llcommon/llsingleton.h | 2 +- indra/llcommon/tests/llsingleton_test.cpp | 6 +- indra/llinventory/llfoldertype.cpp | 2 +- indra/llinventory/llinventorysettings.cpp | 2 +- indra/llmessage/llexperiencecache.h | 2 +- indra/llmessage/llproxy.h | 2 +- indra/llui/llnotifications.h | 6 +- indra/llui/llspellcheck.h | 2 +- indra/llui/lltextbase.cpp | 21 ---- indra/llui/lluictrl.h | 2 +- indra/llui/llview.cpp | 4 +- indra/llui/llviewquery.h | 12 +-- indra/newview/llautoreplace.h | 2 +- indra/newview/llchannelmanager.h | 2 +- indra/newview/llchicletbar.h | 4 +- indra/newview/llconversationlog.h | 10 +- indra/newview/llfeaturemanager.h | 2 +- indra/newview/llfriendcard.h | 2 +- indra/newview/llgesturemgr.h | 4 +- indra/newview/llimagefiltersmanager.h | 2 +- indra/newview/llimview.h | 2 +- indra/newview/llmutelist.h | 2 +- indra/newview/llnavigationbar.h | 8 +- indra/newview/lloutfitobserver.h | 2 +- indra/newview/llpaneltopinfobar.h | 6 +- indra/newview/llpathfindingpathtool.h | 18 ++-- indra/newview/llproductinforequest.h | 2 +- indra/newview/llrecentpeople.h | 2 +- indra/newview/llspeakers.h | 4 +- indra/newview/llspeakingindicatormanager.cpp | 2 +- indra/newview/lltoolbrush.h | 20 ++-- indra/newview/lltoolcomp.h | 72 +++++++------- indra/newview/lltooldraganddrop.h | 12 +-- indra/newview/lltoolface.h | 10 +- indra/newview/lltoolfocus.h | 14 +-- indra/newview/lltoolindividual.h | 8 +- indra/newview/lltoolobjpicker.h | 14 +-- indra/newview/lltoolpie.h | 32 +++--- indra/newview/lltoolpipette.h | 8 +- indra/newview/lltoolselectland.h | 16 +-- indra/newview/llversioninfo.h | 2 +- indra/newview/llviewerhelp.h | 10 +- indra/newview/llviewermedia.h | 2 +- indra/newview/llviewermediafocus.h | 16 +-- indra/newview/llviewerparcelaskplay.h | 4 +- indra/newview/llviewerparcelmedia.h | 2 +- indra/newview/llviewerparcelmediaautoplay.h | 2 +- indra/newview/llviewertexturelist.h | 6 +- indra/newview/llvoicechannel.h | 22 ++-- indra/newview/llvoicevivox.h | 144 +++++++++++++-------------- indra/newview/llwearableitemslist.h | 6 +- indra/newview/llwindebug.h | 4 +- 54 files changed, 273 insertions(+), 296 deletions(-) diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h index 793a33cc87..1fbe19ddd1 100644 --- a/indra/llappearance/llwearabletype.h +++ b/indra/llappearance/llwearabletype.h @@ -37,7 +37,7 @@ class LLWearableType : public LLParamSingleton { LLSINGLETON(LLWearableType, LLTranslationBridge::ptr_t &trans); ~LLWearableType(); - void initSingleton(); + void initSingleton() override; public: enum EType { diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 966ce03296..fd878f20ad 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -92,7 +92,7 @@ class LL_COMMON_API LLCoros: public LLSingleton LLSINGLETON(LLCoros); ~LLCoros(); - void cleanupSingleton(); + void cleanupSingleton() override; public: /// The viewer's use of the term "coroutine" became deeply embedded before /// the industry term "fiber" emerged to distinguish userland threads from diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 51ef514cf7..cbe5ab6406 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -802,7 +802,7 @@ public: private: \ /* implement LLSingleton pure virtual method whose sole purpose */ \ /* is to remind people to use this macro */ \ - virtual void you_must_use_LLSINGLETON_macro() {} \ + virtual void you_must_use_LLSINGLETON_macro() override {} \ friend class LLSingleton; \ DERIVED_CLASS(__VA_ARGS__) diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp index 15ffe68e67..6f8aaaa0cb 100644 --- a/indra/llcommon/tests/llsingleton_test.cpp +++ b/indra/llcommon/tests/llsingleton_test.cpp @@ -47,8 +47,8 @@ public: \ DEP_INIT /* dependency in initSingleton */ \ } sDepFlag; \ \ - void initSingleton(); \ - void cleanupSingleton(); \ + void initSingleton() override; \ + void cleanupSingleton() override; \ }; \ \ CLS::dep_flag CLS::sDepFlag = DEP_NONE @@ -300,7 +300,7 @@ namespace tut { LLSINGLETON_EMPTY_CTOR(CircularPInit); public: - virtual void initSingleton() + virtual void initSingleton() override { // never mind indirection, just go straight for the circularity CircularPInit *pt = getInstance(); diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp index 675da65af2..818a8b5cc3 100644 --- a/indra/llinventory/llfoldertype.cpp +++ b/indra/llinventory/llfoldertype.cpp @@ -60,7 +60,7 @@ class LLFolderDictionary : public LLSingleton, { LLSINGLETON(LLFolderDictionary); protected: - virtual LLFolderType::EType notFound() const + virtual LLFolderType::EType notFound() const override { return LLFolderType::FT_NONE; } diff --git a/indra/llinventory/llinventorysettings.cpp b/indra/llinventory/llinventorysettings.cpp index 81485b3a97..bc604097da 100644 --- a/indra/llinventory/llinventorysettings.cpp +++ b/indra/llinventory/llinventorysettings.cpp @@ -62,7 +62,7 @@ class LLSettingsDictionary : public LLSingleton, { LLSINGLETON(LLSettingsDictionary); - void initSingleton(); + void initSingleton() override; }; LLSettingsDictionary::LLSettingsDictionary() diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h index 1c97133723..8be4c64dfc 100644 --- a/indra/llmessage/llexperiencecache.h +++ b/indra/llmessage/llexperiencecache.h @@ -106,7 +106,7 @@ public: private: virtual ~LLExperienceCache(); - virtual void initSingleton(); + virtual void initSingleton() override; typedef boost::function permissionInvoker_fn; diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h index 25f6977e14..8a64cdbfaa 100644 --- a/indra/llmessage/llproxy.h +++ b/indra/llmessage/llproxy.h @@ -226,7 +226,7 @@ class LLProxy: public LLSingleton LLSINGLETON(LLProxy); LOG_CLASS(LLProxy); - /*virtual*/ void initSingleton(); + /*virtual*/ void initSingleton() override; public: // Static check for enabled status for UDP packets. Call from main thread only. diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 921398a693..4d9a33f1d7 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -913,7 +913,7 @@ public: /* virtual */ LLNotificationPtr add(const std::string& name, const LLSD& substitutions, const LLSD& payload, - LLNotificationFunctorRegistry::ResponseFunctor functor); + LLNotificationFunctorRegistry::ResponseFunctor functor) override; LLNotificationPtr add(const LLNotification::Params& p); void add(const LLNotificationPtr pNotif); @@ -964,8 +964,8 @@ public: bool isVisibleByRules(LLNotificationPtr pNotification); private: - /*virtual*/ void initSingleton(); - /*virtual*/ void cleanupSingleton(); + /*virtual*/ void initSingleton() override; + /*virtual*/ void cleanupSingleton() override; void loadPersistentNotifications(); diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h index 3da5e30955..14f9b44fe4 100644 --- a/indra/llui/llspellcheck.h +++ b/indra/llui/llspellcheck.h @@ -47,7 +47,7 @@ public: protected: void addToDictFile(const std::string& dict_path, const std::string& word); void initHunspell(const std::string& dict_language); - void initSingleton(); + void initSingleton() override; public: typedef std::list dict_list_t; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 82a3c01c6d..1389fc2a14 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1979,19 +1979,8 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getEditableSegIterContaini LLTextBase::segment_set_t::iterator LLTextBase::getSegIterContaining(S32 index) { - static LLPointer index_segment = new LLIndexSegment(); - S32 text_len = 0; - if (!useLabel()) - { - text_len = getLength(); - } - else - { - text_len = mLabel.getWString().length(); - } - if (index > text_len) { return mSegments.end(); } // when there are no segments, we return the end iterator, which must be checked by caller @@ -2007,16 +1996,6 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i { static LLPointer index_segment = new LLIndexSegment(); - S32 text_len = 0; - if (!useLabel()) - { - text_len = getLength(); - } - else - { - text_len = mLabel.getWString().length(); - } - if (index > text_len) { return mSegments.end(); } // when there are no segments, we return the end iterator, which must be checked by caller diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 67dd24341c..d71dc8d859 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -263,7 +263,7 @@ public: class LLTextInputFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLTextInputFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override { return filterResult_t(view->isCtrl() && static_cast(view)->acceptsTextInput(), TRUE); } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 9ba71913d0..5e74817f1f 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1953,7 +1953,7 @@ private: class SortByTabOrder : public LLQuerySorter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(SortByTabOrder); - /*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const + /*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const override { children.sort(CompareByTabOrder(parent->getTabOrder(), parent->getDefaultTabGroup())); } @@ -1977,7 +1977,7 @@ const LLViewQuery & LLView::getTabOrderQuery() class LLFocusRootsFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLFocusRootsFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override { return filterResult_t(view->isCtrl() && view->isFocusRoot(), !view->isFocusRoot()); } diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h index 21bb1be26f..4bc9c4a08e 100644 --- a/indra/llui/llviewquery.h +++ b/indra/llui/llviewquery.h @@ -55,37 +55,37 @@ public: class LLLeavesFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLLeavesFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLRootsFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLRootsFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLVisibleFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLVisibleFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLEnabledFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLEnabledFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLTabStopFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLTabStopFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; class LLCtrlFilter : public LLQueryFilter, public LLSingleton { LLSINGLETON_EMPTY_CTOR(LLCtrlFilter); - /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const; + /*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const override; }; template diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h index 23cc313646..a1eebf9dcb 100644 --- a/indra/newview/llautoreplace.h +++ b/indra/newview/llautoreplace.h @@ -203,7 +203,7 @@ public: void setSettings(const LLAutoReplaceSettings& settings); private: - /*virtual*/ void initSingleton(); + /*virtual*/ void initSingleton() override; LLAutoReplaceSettings mSettings; ///< configuration information diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h index 8abe350196..22ae595d66 100644 --- a/indra/newview/llchannelmanager.h +++ b/indra/newview/llchannelmanager.h @@ -46,7 +46,7 @@ class LLChannelManager : public LLSingleton LLSINGLETON(LLChannelManager); virtual ~LLChannelManager(); - void cleanupSingleton(); + void cleanupSingleton() override; public: diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h index 6c521dc1d5..c295b99962 100644 --- a/indra/newview/llchicletbar.h +++ b/indra/newview/llchicletbar.h @@ -43,11 +43,11 @@ class LLChicletBar public: - BOOL postBuild(); + BOOL postBuild() override; LLChicletPanel* getChicletPanel() { return mChicletPanel; } - /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent) override; /** diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h index 820a5db491..54aeedcf9a 100644 --- a/indra/newview/llconversationlog.h +++ b/indra/newview/llconversationlog.h @@ -125,11 +125,11 @@ public: void removeObserver(LLConversationLogObserver* observer); // LLIMSessionObserver triggers - virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg); - virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) {}; // Stub - virtual void sessionRemoved(const LLUUID& session_id){} // Stub - virtual void sessionVoiceOrIMStarted(const LLUUID& session_id){}; // Stub - virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id){}; // Stub + virtual void sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id, BOOL has_offline_msg) override; + virtual void sessionActivated(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id) override {}; // Stub + virtual void sessionRemoved(const LLUUID& session_id) override{} // Stub + virtual void sessionVoiceOrIMStarted(const LLUUID& session_id) override{}; // Stub + virtual void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id) override{}; // Stub void notifyObservers(); diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 42a226cd18..d9269224af 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -101,7 +101,7 @@ class LLFeatureManager : public LLFeatureList, public LLSingleton mFiltersList; diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 326e8f22e3..353373f3b4 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -506,7 +506,7 @@ public: static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); private: - void initSingleton(); + void initSingleton() override; void onVoiceChannelChangedInt(const LLUUID &session_id); void onVoiceChannelStateChangedInt(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent); diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 0d426fbd48..f86c2acd10 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -73,7 +73,7 @@ class LLMuteList : public LLSingleton { LLSINGLETON(LLMuteList); ~LLMuteList(); - /*virtual*/ void cleanupSingleton(); + /*virtual*/ void cleanupSingleton() override; public: // reasons for auto-unmuting a resident enum EAutoReason diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 11c671294a..4649f5bcb0 100755 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -92,10 +92,10 @@ class LLNavigationBar public: - /*virtual*/ void draw(); - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL postBuild(); - /*virtual*/ void setVisible(BOOL visible); + /*virtual*/ void draw() override; + /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL postBuild() override; + /*virtual*/ void setVisible(BOOL visible) override; void handleLoginComplete(); void clearHistoryCache(); diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h index 77041db68d..77bb3543aa 100644 --- a/indra/newview/lloutfitobserver.h +++ b/indra/newview/lloutfitobserver.h @@ -41,7 +41,7 @@ class LLOutfitObserver: public LLInventoryObserver, public LLSingleton, public: typedef boost::signals2::signal resize_signal_t; - /*virtual*/ BOOL postBuild(); - /*virtual*/ void draw(); + /*virtual*/ BOOL postBuild() override; + /*virtual*/ void draw() override; /** * Updates location and parcel icons on login complete @@ -83,7 +83,7 @@ private: */ void initParcelIcons(); - BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; /** * Handles clicks on the parcel icons. diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h index 88cb3a15f8..f98624e30d 100644 --- a/indra/newview/llpathfindingpathtool.h +++ b/indra/newview/llpathfindingpathtool.h @@ -66,17 +66,17 @@ public: typedef boost::signals2::signal path_event_signal_t; typedef boost::signals2::connection path_event_slot_t; - virtual BOOL handleMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleRightMouseDown(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleRightMouseUp(S32 pX, S32 pY, MASK pMask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMiddleMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleMiddleMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleRightMouseDown(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleRightMouseUp(S32 pX, S32 pY, MASK pMask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; - virtual BOOL handleHover(S32 pX, S32 pY, MASK pMask); + virtual BOOL handleHover(S32 pX, S32 pY, MASK pMask) override; - virtual BOOL handleKey(KEY pKey, MASK pMask); + virtual BOOL handleKey(KEY pKey, MASK pMask) override; EPathStatus getPathStatus() const; diff --git a/indra/newview/llproductinforequest.h b/indra/newview/llproductinforequest.h index d1036374e8..0b94c39d11 100644 --- a/indra/newview/llproductinforequest.h +++ b/indra/newview/llproductinforequest.h @@ -46,7 +46,7 @@ public: std::string getDescriptionForSku(const std::string& sku); private: - /* virtual */ void initSingleton(); + /* virtual */ void initSingleton() override; void getLandDescriptionsCoro(std::string url); LLSD mSkuDescriptions; diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h index 1b322f2c0a..0c04222a9f 100644 --- a/indra/newview/llrecentpeople.h +++ b/indra/newview/llrecentpeople.h @@ -106,7 +106,7 @@ public: /** * LLSimpleListener interface. */ - /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata) override; void updateAvatarsArrivalTime(uuid_vec_t& uuids); F32 getArrivalTimeByID(const LLUUID& id); diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index ed795b5155..22c9481687 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -338,7 +338,7 @@ class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton @@ -347,7 +347,7 @@ class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton speaker_ids_t; diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h index c108d83256..6545ee3611 100644 --- a/indra/newview/lltoolbrush.h +++ b/indra/newview/lltoolbrush.h @@ -49,27 +49,27 @@ class LLToolBrushLand : public LLTool, public LLEditMenuHandler, public LLSingle public: // x,y in window coords, 0,0 = left,bot - virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask ); - virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask ); - virtual BOOL handleHover( S32 x, S32 y, MASK mask ); - virtual void handleSelect(); - virtual void handleDeselect(); + virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask ) override; + virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask ) override; + virtual BOOL handleHover( S32 x, S32 y, MASK mask ) override; + virtual void handleSelect() override; + virtual void handleDeselect() override; // isAlwaysRendered() - return true if this is a tool that should // always be rendered regardless of selection. - virtual BOOL isAlwaysRendered() { return TRUE; } + virtual BOOL isAlwaysRendered() override { return TRUE; } // Draw the area that will be affected. - virtual void render(); + virtual void render() override; // on Idle is where the land modification actually occurs static void onIdle(void* brush_tool); - void onMouseCaptureLost(); + void onMouseCaptureLost() override; void modifyLandInSelectionGlobal(); - virtual void undo(); - virtual BOOL canUndo() const { return TRUE; } + virtual void undo() override; + virtual BOOL canUndo() const override { return TRUE; } protected: void brush( void ); diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h index 86506f725e..f539a045b7 100644 --- a/indra/newview/lltoolcomp.h +++ b/indra/newview/lltoolcomp.h @@ -108,11 +108,11 @@ class LLToolCompInspect : public LLToolComposite, public LLSingleton public: // Overridden from LLToolComposite - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - virtual void onMouseCaptureLost(); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual LLTool* getOverrideTool(MASK mask) { return NULL; } + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) override; + virtual void onMouseCaptureLost() override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual LLTool* getOverrideTool(MASK mask) override { return NULL; } protected: LLToolGun* mGun; diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 4537d73332..8ec027cb0e 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -48,12 +48,12 @@ public: typedef boost::signals2::signal enddrag_signal_t; // overridden from LLTool - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleKey(KEY key, MASK mask); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); - virtual void onMouseCaptureLost(); - virtual void handleDeselect(); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleKey(KEY key, MASK mask) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; + virtual void onMouseCaptureLost() override; + virtual void handleDeselect() override; void setDragStart( S32 x, S32 y ); // In screen space BOOL isOverThreshold( S32 x, S32 y ); // In screen space diff --git a/indra/newview/lltoolface.h b/indra/newview/lltoolface.h index e4b8ae12b8..7c8ff20480 100644 --- a/indra/newview/lltoolface.h +++ b/indra/newview/lltoolface.h @@ -39,11 +39,11 @@ class LLToolFace virtual ~LLToolFace(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual void render(); // draw face highlights + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual void render() override; // draw face highlights static void pickCallback(const LLPickInfo& pick_info); }; diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index cfc235b6c2..c9dd39ff4b 100644 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -38,16 +38,16 @@ class LLToolCamera virtual ~LLToolCamera(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; - virtual void onMouseCaptureLost(); + virtual void onMouseCaptureLost() override; - virtual void handleSelect(); - virtual void handleDeselect(); + virtual void handleSelect() override; + virtual void handleDeselect() override; - virtual LLTool* getOverrideTool(MASK mask) { return NULL; } + virtual LLTool* getOverrideTool(MASK mask) override { return NULL; } static void pickCallback(const LLPickInfo& pick_info); BOOL mouseSteerMode() { return mMouseSteering; } diff --git a/indra/newview/lltoolindividual.h b/indra/newview/lltoolindividual.h index e7c2060fba..89dd9d9796 100644 --- a/indra/newview/lltoolindividual.h +++ b/indra/newview/lltoolindividual.h @@ -43,11 +43,9 @@ class LLToolIndividual : public LLTool, public LLSingleton virtual ~LLToolIndividual(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual void handleSelect(); - //virtual void handleDeselect(); - //virtual void render(); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + virtual void handleSelect() override; static void pickCallback(const LLPickInfo& pick_info); diff --git a/indra/newview/lltoolobjpicker.h b/indra/newview/lltoolobjpicker.h index 5ad9b67e21..a55cd223de 100644 --- a/indra/newview/lltoolobjpicker.h +++ b/indra/newview/lltoolobjpicker.h @@ -38,16 +38,16 @@ class LLToolObjPicker : public LLTool, public LLSingleton LLSINGLETON(LLToolObjPicker); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; - virtual void handleSelect(); - virtual void handleDeselect(); + virtual void handleSelect() override; + virtual void handleDeselect() override; - virtual void onMouseCaptureLost(); + virtual void onMouseCaptureLost() override; - virtual void setExitCallback(void (*callback)(void *), void *callback_data); + void setExitCallback(void (*callback)(void *), void *callback_data); LLUUID getObjectID() const { return mHitObjectID; } diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 8f6100e4b4..dca0d12cf6 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -42,26 +42,26 @@ class LLToolPie : public LLTool, public LLSingleton public: // Virtual functions inherited from LLMouseHandler - virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EMouseClickType clicktype, BOOL down) override; + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; BOOL handleScrollWheelAny(S32 x, S32 y, S32 clicks_x, S32 clicks_y); - virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); - virtual BOOL handleScrollHWheel(S32 x, S32 y, S32 clicks); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) override; + virtual BOOL handleScrollHWheel(S32 x, S32 y, S32 clicks) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; - virtual void render(); + virtual void render() override; - virtual void stopEditing(); + virtual void stopEditing() override; - virtual void onMouseCaptureLost(); - virtual void handleSelect(); - virtual void handleDeselect(); - virtual LLTool* getOverrideTool(MASK mask); + virtual void onMouseCaptureLost() override; + virtual void handleSelect() override; + virtual void handleDeselect() override; + virtual LLTool* getOverrideTool(MASK mask) override; LLPickInfo& getPick() { return mPick; } U8 getClickAction() { return mClickAction; } diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h index 7575d8ad18..2636811c66 100644 --- a/indra/newview/lltoolpipette.h +++ b/indra/newview/lltoolpipette.h @@ -47,10 +47,10 @@ class LLToolPipette virtual ~LLToolPipette(); public: - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleToolTip(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + virtual BOOL handleHover(S32 x, S32 y, MASK mask) override; + virtual BOOL handleToolTip(S32 x, S32 y, MASK mask) override; // Note: Don't return connection; use boost::bind + boost::signals2::trackable to disconnect slots typedef boost::signals2::signal signal_t; diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h index b5ba72f16d..88bc4e2e3d 100644 --- a/indra/newview/lltoolselectland.h +++ b/indra/newview/lltoolselectland.h @@ -39,15 +39,15 @@ class LLToolSelectLand virtual ~LLToolSelectLand(); public: - /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); - /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); - /*virtual*/ void render(); // draw the select rectangle - /*virtual*/ BOOL isAlwaysRendered() { return TRUE; } + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; + /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask) override; + /*virtual*/ void render() override; // draw the select rectangle + /*virtual*/ BOOL isAlwaysRendered() override { return TRUE; } - /*virtual*/ void handleSelect(); - /*virtual*/ void handleDeselect(); + /*virtual*/ void handleSelect() override; + /*virtual*/ void handleDeselect() override; protected: BOOL outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y); diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index 02ff0c094a..37382243f6 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -47,7 +47,7 @@ class LLStoreListener; class LLVersionInfo: public LLSingleton { LLSINGLETON(LLVersionInfo); - void initSingleton(); + void initSingleton() override; public: ~LLVersionInfo(); diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h index da50e07a43..bbd20bc07e 100644 --- a/indra/newview/llviewerhelp.h +++ b/indra/newview/llviewerhelp.h @@ -43,21 +43,21 @@ class LLViewerHelp : public LLHelp, public LLSingleton public: /// display the specified help topic in the help viewer - /*virtual*/ void showTopic(const std::string &topic); + /*virtual*/ void showTopic(const std::string &topic) override; - std::string getURL(const std::string& topic); + std::string getURL(const std::string& topic) override; // return topic derived from viewer UI focus, else default topic std::string getTopicFromFocus(); /// return default (fallback) topic name suitable for showTopic() - /*virtual*/ std::string defaultTopic(); + /*virtual*/ std::string defaultTopic() override; // return topic to use before the user logs in - /*virtual*/ std::string preLoginTopic(); + /*virtual*/ std::string preLoginTopic() override; // return topic to use for the top-level help, invoked by F1 - /*virtual*/ std::string f1HelpTopic(); + /*virtual*/ std::string f1HelpTopic() override; }; #endif // header guard diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index f1f42afd81..ad7c4bcefa 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -74,7 +74,7 @@ class LLViewerMedia: public LLSingleton { LLSINGLETON(LLViewerMedia); ~LLViewerMedia(); - void initSingleton(); + void initSingleton() override; LOG_CLASS(LLViewerMedia); public: diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index effd08a559..2310e4dbfc 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -54,10 +54,10 @@ public: void setHoverFace(LLPointer objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero); void clearHover(); - /*virtual*/ bool getFocus(); - /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); - /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent); - /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); + bool getFocus(); + /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; + /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) override; + /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) override; BOOL handleScrollWheel(const LLVector2& texture_coords, S32 clicks_x, S32 clicks_y); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks_x, S32 clicks_y); @@ -92,12 +92,12 @@ public: LLUUID getControlsMediaID(); // The MoaP object wants keyup and keydown events. Overridden to return true. - virtual bool wantsKeyUpKeyDown() const; - virtual bool wantsReturnKey() const; + virtual bool wantsKeyUpKeyDown() const override; + virtual bool wantsReturnKey() const override; protected: - /*virtual*/ void onFocusReceived(); - /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived() override; + /*virtual*/ void onFocusLost() override; private: diff --git a/indra/newview/llviewerparcelaskplay.h b/indra/newview/llviewerparcelaskplay.h index dc711917d2..56faddae66 100644 --- a/indra/newview/llviewerparcelaskplay.h +++ b/indra/newview/llviewerparcelaskplay.h @@ -34,8 +34,8 @@ class LLViewerParcelAskPlay : public LLSingleton { LLSINGLETON(LLViewerParcelAskPlay); ~LLViewerParcelAskPlay(); - void initSingleton(); - void cleanupSingleton(); + void initSingleton() override; + void cleanupSingleton() override; public: // functor expects functor(region_id, parcel_id, url, play/stop) typedef boost::function ask_callback; diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h index 779a65bdf8..790b2b71fc 100644 --- a/indra/newview/llviewerparcelmedia.h +++ b/indra/newview/llviewerparcelmedia.h @@ -74,7 +74,7 @@ public: void sendMediaNavigateMessage(const std::string& url); // inherited from LLViewerMediaObserver - virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); + virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override; private: void processParcelMediaCommandMessage(LLMessageSystem *msg); diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h index d71fd4c075..e83085dee0 100644 --- a/indra/newview/llviewerparcelmediaautoplay.h +++ b/indra/newview/llviewerparcelmediaautoplay.h @@ -35,7 +35,7 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer, public LLSingleton getUIImageByID(const LLUUID& id, S32 priority); - /*virtual*/ LLPointer getUIImage(const std::string& name, S32 priority); - void cleanUp(); + /*virtual*/ LLPointer getUIImageByID(const LLUUID& id, S32 priority) override; + /*virtual*/ LLPointer getUIImage(const std::string& name, S32 priority) override; + void cleanUp() override; bool initFromFile(); diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 309c3eebdd..e68bfbe1ff 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -170,12 +170,12 @@ class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton &participants); - virtual bool isParticipant(const LLUUID& speaker_id); + virtual void getParticipantList(std::set &participants) override; + virtual bool isParticipant(const LLUUID& speaker_id) override; // Send a text message to the specified user, initiating the session if necessary. // virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message) const {return false;}; // close any existing text IM session with the specified user - virtual void endUserIMSession(const LLUUID &uuid); + virtual void endUserIMSession(const LLUUID &uuid) override; // Returns true if calling back the session URI after the session has closed is possible. // Currently this will be false only for PSTN P2P calls. // NOTE: this will return true if the session can't be found. - virtual BOOL isSessionCallBackPossible(const LLUUID &session_id); + virtual BOOL isSessionCallBackPossible(const LLUUID &session_id) override; // Returns true if the session can accepte text IM's. // Currently this will be false only for PSTN P2P calls. // NOTE: this will return true if the session can't be found. - virtual BOOL isSessionTextIMPossible(const LLUUID &session_id); + virtual BOOL isSessionTextIMPossible(const LLUUID &session_id) override; //////////////////////////// @@ -132,21 +132,21 @@ public: //@{ // returns true iff the user is currently in a proximal (local spatial) channel. // Note that gestures should only fire if this returns true. - virtual bool inProximalChannel(); + virtual bool inProximalChannel() override; virtual void setNonSpatialChannel(const std::string &uri, - const std::string &credentials); + const std::string &credentials) override; virtual bool setSpatialChannel(const std::string &uri, - const std::string &credentials); + const std::string &credentials) override; - virtual void leaveNonSpatialChannel(); + virtual void leaveNonSpatialChannel() override; - virtual void leaveChannel(void); + virtual void leaveChannel(void) override; // Returns the URI of the current channel, or an empty string if not currently in a channel. // NOTE that it will return an empty string if it's in the process of joining a channel. - virtual std::string getCurrentChannel(); + virtual std::string getCurrentChannel() override; //@} @@ -154,59 +154,59 @@ public: /// @name invitations //@{ // start a voice channel with the specified user - virtual void callUser(const LLUUID &uuid); - virtual bool isValidChannel(std::string &channelHandle); - virtual bool answerInvite(std::string &channelHandle); - virtual void declineInvite(std::string &channelHandle); + virtual void callUser(const LLUUID &uuid) override; + virtual bool isValidChannel(std::string &channelHandle) override; + virtual bool answerInvite(std::string &channelHandle) override; + virtual void declineInvite(std::string &channelHandle) override; //@} ///////////////////////// /// @name Volume/gain //@{ - virtual void setVoiceVolume(F32 volume); - virtual void setMicGain(F32 volume); + virtual void setVoiceVolume(F32 volume) override; + virtual void setMicGain(F32 volume) override; //@} ///////////////////////// /// @name enable disable voice and features //@{ - virtual bool voiceEnabled(); - virtual void setVoiceEnabled(bool enabled); - virtual BOOL lipSyncEnabled(); - virtual void setLipSyncEnabled(BOOL enabled); - virtual void setMuteMic(bool muted); // Set the mute state of the local mic. + virtual bool voiceEnabled() override; + virtual void setVoiceEnabled(bool enabled) override; + virtual BOOL lipSyncEnabled() override; + virtual void setLipSyncEnabled(BOOL enabled) override; + virtual void setMuteMic(bool muted) override; // Set the mute state of the local mic. //@} ////////////////////////// /// @name nearby speaker accessors //@{ - virtual BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar - virtual std::string getDisplayName(const LLUUID& id); - virtual BOOL isParticipantAvatar(const LLUUID &id); - virtual BOOL getIsSpeaking(const LLUUID& id); - virtual BOOL getIsModeratorMuted(const LLUUID& id); - virtual F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... - virtual BOOL getOnMuteList(const LLUUID& id); - virtual F32 getUserVolume(const LLUUID& id); - virtual void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal) + virtual BOOL getVoiceEnabled(const LLUUID& id) override; // true if we've received data for this avatar + virtual std::string getDisplayName(const LLUUID& id) override; + virtual BOOL isParticipantAvatar(const LLUUID &id) override; + virtual BOOL getIsSpeaking(const LLUUID& id) override; + virtual BOOL getIsModeratorMuted(const LLUUID& id) override; + virtual F32 getCurrentPower(const LLUUID& id) override; // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is... + virtual BOOL getOnMuteList(const LLUUID& id) override; + virtual F32 getUserVolume(const LLUUID& id) override; + virtual void setUserVolume(const LLUUID& id, F32 volume) override; // set's volume for specified agent, from 0-1 (where .5 is nominal) //@} // authorize the user virtual void userAuthorized(const std::string& user_id, - const LLUUID &agentID); + const LLUUID &agentID) override; ////////////////////////////// /// @name Status notification //@{ - virtual void addObserver(LLVoiceClientStatusObserver* observer); - virtual void removeObserver(LLVoiceClientStatusObserver* observer); - virtual void addObserver(LLFriendObserver* observer); - virtual void removeObserver(LLFriendObserver* observer); - virtual void addObserver(LLVoiceClientParticipantObserver* observer); - virtual void removeObserver(LLVoiceClientParticipantObserver* observer); + virtual void addObserver(LLVoiceClientStatusObserver* observer) override; + virtual void removeObserver(LLVoiceClientStatusObserver* observer) override; + virtual void addObserver(LLFriendObserver* observer) override; + virtual void removeObserver(LLFriendObserver* observer) override; + virtual void addObserver(LLVoiceClientParticipantObserver* observer) override; + virtual void removeObserver(LLVoiceClientParticipantObserver* observer) override; //@} - virtual std::string sipURIFromID(const LLUUID &id); + virtual std::string sipURIFromID(const LLUUID &id) override; //@} /// @name LLVoiceEffectInterface virtual implementations @@ -216,32 +216,32 @@ public: ////////////////////////// /// @name Accessors //@{ - virtual bool setVoiceEffect(const LLUUID& id); - virtual const LLUUID getVoiceEffect(); - virtual LLSD getVoiceEffectProperties(const LLUUID& id); + virtual bool setVoiceEffect(const LLUUID& id) override; + virtual const LLUUID getVoiceEffect() override; + virtual LLSD getVoiceEffectProperties(const LLUUID& id) override; - virtual void refreshVoiceEffectLists(bool clear_lists); - virtual const voice_effect_list_t& getVoiceEffectList() const; - virtual const voice_effect_list_t& getVoiceEffectTemplateList() const; + virtual void refreshVoiceEffectLists(bool clear_lists) override; + virtual const voice_effect_list_t& getVoiceEffectList() const override; + virtual const voice_effect_list_t& getVoiceEffectTemplateList() const override; //@} ////////////////////////////// /// @name Status notification //@{ - virtual void addObserver(LLVoiceEffectObserver* observer); - virtual void removeObserver(LLVoiceEffectObserver* observer); + virtual void addObserver(LLVoiceEffectObserver* observer) override; + virtual void removeObserver(LLVoiceEffectObserver* observer) override; //@} ////////////////////////////// /// @name Effect preview buffer //@{ - virtual void enablePreviewBuffer(bool enable); - virtual void recordPreviewBuffer(); - virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null); - virtual void stopPreviewBuffer(); + virtual void enablePreviewBuffer(bool enable) override; + virtual void recordPreviewBuffer() override; + virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null) override; + virtual void stopPreviewBuffer() override; - virtual bool isPreviewRecording(); - virtual bool isPreviewPlaying(); + virtual bool isPreviewRecording() override; + virtual bool isPreviewPlaying() override; //@} //@} @@ -752,7 +752,7 @@ private: std::string getAudioSessionURI(); std::string getAudioSessionHandle(); - void setHidden(bool hidden); //virtual + void setHidden(bool hidden) override; //virtual void sendPositionAndVolumeUpdate(void); void sendCaptureAndRenderDevices(); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index f7774a7086..0dbe50d5e4 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -428,7 +428,7 @@ public: { LLSINGLETON(ContextMenu); public: - /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); + /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) override; void show(LLView* spawning_view, LLWearableType::EType w_type, S32 x, S32 y); @@ -441,7 +441,7 @@ public: MASK_UNKNOWN = 0x10, }; - /* virtual */ LLContextMenu* createMenu(); + /* virtual */ LLContextMenu* createMenu() override; void updateItemsVisibility(LLContextMenu* menu); void updateItemsLabels(LLContextMenu* menu); static void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val); @@ -472,7 +472,7 @@ public: virtual ~LLWearableItemsList(); - /*virtual*/ LLPanel* createNewItem(LLViewerInventoryItem* item); + /*virtual*/ LLPanel* createNewItem(LLViewerInventoryItem* item) override; void updateList(const LLUUID& category_id); diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h index 524adba652..31dbfb8ffd 100644 --- a/indra/newview/llwindebug.h +++ b/indra/newview/llwindebug.h @@ -40,9 +40,9 @@ class LLWinDebug: { LLSINGLETON_EMPTY_CTOR(LLWinDebug); public: - void initSingleton(); + void initSingleton() override; static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL); - void cleanupSingleton(); + void cleanupSingleton() override; private: static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename); }; -- cgit v1.2.3 From b54c0f4fc18a25a2e454d3d24f3f2bfc4aff6452 Mon Sep 17 00:00:00 2001 From: Callum Linden Date: Tue, 7 Mar 2023 14:47:10 -0800 Subject: DRTVWR-489: Pull in updated 3p-freetype package with Kitty's latest changes --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index cf18b71b0b..eba62834ca 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -698,9 +698,9 @@ archive hash - 4390c5182b5d6c397ef0396828093600 + 9cbcd452efa877fb8550c8c9b092b465 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106585/931193/freetype-2.12.1.576132-darwin64-576132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/111566/967515/freetype-2.12.1.578664-darwin64-578664.tar.bz2 name darwin64 @@ -722,9 +722,9 @@ archive hash - 6ad01c23db703cd6ad2a491aae937379 + f3d7b72d10c162c9a8aa2ac4443ac52f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106586/931203/freetype-2.12.1.576132-windows-576132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/111571/967545/freetype-2.12.1.578664-windows-578664.tar.bz2 name windows @@ -734,16 +734,16 @@ archive hash - db5f433b65a268a1ea601d7e29766cb1 + 96d3689043e939ae424060a8b498be1f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106587/931202/freetype-2.12.1.576132-windows64-576132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/111570/967535/freetype-2.12.1.578664-windows64-578664.tar.bz2 name windows64 version - 2.12.1.576132 + 2.12.1.578664 glext -- cgit v1.2.3 From abdb4941cf42c405dda433d2e9a6a510d5bc2377 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Tue, 7 Mar 2023 14:49:57 -0800 Subject: DRTVWR-489: Clean up a new warning-as-error failure on macOS --- indra/newview/llspeakingindicatormanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index 37c7ea55ae..c4c9673be3 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -53,7 +53,7 @@ class SpeakingIndicatorManager : public LLSingleton, L LOG_CLASS(SpeakingIndicatorManager); protected: - void cleanupSingleton(); + void cleanupSingleton() override; public: -- cgit v1.2.3 From 7b9866791ac7922f7527811bbc99c090f35e4cfd Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Fri, 31 Mar 2023 16:29:36 -0700 Subject: DRTVWR-489-emoji-PR: Pull in a version of Collada that has std::auto_ptr replaced by std::unique_ptr so it builds on modern mac systems --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index eba62834ca..7a814cd64b 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -236,9 +236,9 @@ archive hash - b923ca041271446592b3b10e678b93b6 + df05eee28649996c78a47dd054de2a47 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109517/952832/colladadom-2.3.577706-darwin64-577706.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112764/977018/colladadom-2.3.579218-darwin64-579218.tar.bz2 name darwin64 @@ -260,9 +260,9 @@ archive hash - 2b3c9c1fe86c2b5bad6619c021bb11a8 + 6752b4f098a522bb22b6334cdfba7614 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109518/952846/colladadom-2.3.577706-windows-577706.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112771/977087/colladadom-2.3.579224-windows-579224.tar.bz2 name windows @@ -272,16 +272,16 @@ archive hash - 8ece469892029506759420ac531bd675 + 81de6dc4a79b547a25d0040370c42fec url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109519/952847/colladadom-2.3.577706-windows64-577706.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112770/977082/colladadom-2.3.579224-windows64-579224.tar.bz2 name windows64 version - 2.3.577706 + 2.3.579218 cubemaptoequirectangular -- cgit v1.2.3 From 337d2f984ff7f448fdbdc8dc2448e2b67cd23572 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 4 Apr 2023 03:32:40 +0200 Subject: Fix CMake files related to ICU4C --- indra/cmake/CMakeLists.txt | 1 + indra/cmake/FindICU4C.cmake | 33 --------------------------------- indra/cmake/ICU4C.cmake | 37 +++++++++++++++++++------------------ indra/llcommon/CMakeLists.txt | 2 +- indra/newview/CMakeLists.txt | 2 +- 5 files changed, 22 insertions(+), 53 deletions(-) delete mode 100644 indra/cmake/FindICU4C.cmake diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index f0b35c08f3..286ef3d411 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -30,6 +30,7 @@ set(cmake_SOURCE_FILES GoogleMock.cmake Havok.cmake Hunspell.cmake + ICU4C.cmake JsonCpp.cmake LLAddBuildTest.cmake LLAppearance.cmake diff --git a/indra/cmake/FindICU4C.cmake b/indra/cmake/FindICU4C.cmake deleted file mode 100644 index 327d761a88..0000000000 --- a/indra/cmake/FindICU4C.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# -*- cmake -*- - -# - Find ICU4C -# This module defines -# ICU4C_INCLUDE_DIR, where to find headers -# ICU4C_LIBRARY, the library needed to use ICU4C. -# ICU4C_FOUND, If false, do not try to use ICU4C. - -find_path(ICU4C_INCLUDE_DIR uchar.h - PATH_SUFFIXES unicode - ) - -set(ICU4C_NAMES ${ICU4C_NAMES} icuuc) -find_library(ICU4C_LIBRARY - NAMES ${ICU4C_NAMES} - ) - -if (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) - set(ICU4C_FOUND "YES") -else (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) - set(ICU4C_FOUND "NO") -endif (ICU4C_LIBRARY AND ICU4C_INCLUDE_DIR) - -if (ICU4C_FOUND) - message(STATUS "Found ICU4C: Library in '${ICU4C_LIBRARY}' and header in '${ICU4C_INCLUDE_DIR}' ") -else (ICU4C_FOUND) - message(FATAL_ERROR " * * *\nCould not find ICU4C library! * * *") -endif (ICU4C_FOUND) - -mark_as_advanced( - ICU4C_LIBRARY - ICU4C_INCLUDE_DIR - ) diff --git a/indra/cmake/ICU4C.cmake b/indra/cmake/ICU4C.cmake index b51087e0e7..7b27665483 100644 --- a/indra/cmake/ICU4C.cmake +++ b/indra/cmake/ICU4C.cmake @@ -1,22 +1,23 @@ # -*- cmake -*- include(Prebuilt) -set(ICU4C_FIND_QUIETLY ON) -set(ICU4C_FIND_REQUIRED ON) +include_guard() -if (USESYSTEMLIBS) - include(FindICU4C) -else (USESYSTEMLIBS) - use_prebuilt_binary(icu4c) - if (WINDOWS) - set(ICU4C_LIBRARY icuuc) - elseif(DARWIN) - set(ICU4C_LIBRARY icuuc) - #elseif(LINUX) - # set(ICU4C_LIBRARY ...) - else() - message(FATAL_ERROR "Invalid platform") - endif() - set(ICU4C_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/unicode) - use_prebuilt_binary(dictionaries) -endif (USESYSTEMLIBS) +add_library( ll::icu4c INTERFACE IMPORTED ) + + +use_system_binary(icu4c) +use_prebuilt_binary(icu4c) +if (WINDOWS) + target_link_libraries( ll::icu4c INTERFACE icuuc) +elseif(DARWIN) + target_link_libraries( ll::icu4c INTERFACE icuuc) +#elseif(LINUX) +## target_link_libraries( ll::icu4c INTERFACE ) +else() + message(FATAL_ERROR "Invalid platform") +endif() + +target_include_directories( ll::icu4c SYSTEM INTERFACE ${LIBS_PREBUILT_DIR}/include/unicode ) + +use_prebuilt_binary(dictionaries) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 620b2c636c..0dcdf7f7cd 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -265,7 +265,6 @@ add_library (llcommon ${llcommon_SOURCE_FILES}) target_link_libraries( llcommon - ${ICU4C_LIBRARY} ll::apr ll::expat ll::jsoncpp @@ -274,6 +273,7 @@ target_link_libraries( ll::uriparser ll::oslibraries ll::tracy + ll::icu4c ) target_include_directories(llcommon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b63100fc2b..f3c601dff5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1897,7 +1897,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${LLPHYSICSEXTENSIONS_LIBRARIES} ll::bugsplat ll::tracy - ${ICU4C_LIBRARY} + ll::icu4u ) if( TARGET ll::intel_memops ) -- cgit v1.2.3 From 68612324b86e20f830e9c4a9ac290a611890f999 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 3 Apr 2023 20:19:07 -0700 Subject: DRTVWR-489: pull in a version of 3p-ICU4C from the branch called DRTVWR-489-emoji (identical to VS 2019) but lines up the branches for the otehr 3P packages this work uses --- autobuild.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index c221fcdb19..73e10769a5 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1060,9 +1060,9 @@ archive hash - 7f147ae0410f705f846b981498898392 + acc2484ff03dfaf7652cac9f42ce198a url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112850/977592/icu4c-4.8.1-darwin64-579264.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112891/977803/icu4c-4.8.1-darwin64-579276.tar.bz2 name darwin64 @@ -1072,9 +1072,9 @@ archive hash - 08749d1f7f0a96b1951eecdae5dc11ba + d88003ff2c3c9145bc2c7d2d2f80f9b1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109679/954178/icu4c-4.8.1-windows-577789.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112892/977809/icu4c-4.8.1-windows-579276.tar.bz2 name windows @@ -1084,9 +1084,9 @@ archive hash - 98bca5c137e6d47c5b57827e156b1857 + 2cdc400727294edcc144558d4f94fd00 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109678/954182/icu4c-4.8.1-windows64-577789.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/112893/977815/icu4c-4.8.1-windows64-579276.tar.bz2 name windows64 -- cgit v1.2.3 From 1bc57d0ae0135d624d0b6ea8dbe460273e1171b5 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 10 Apr 2023 16:57:48 -0700 Subject: SL-19078: the emoji/short-code mappings come in via a 3p package now --- .../skins/default/xui/en/emoji_characters.xml | 10955 ------------------- 1 file changed, 10955 deletions(-) delete mode 100644 indra/newview/skins/default/xui/en/emoji_characters.xml diff --git a/indra/newview/skins/default/xui/en/emoji_characters.xml b/indra/newview/skins/default/xui/en/emoji_characters.xml deleted file mode 100644 index 55aefe6745..0000000000 --- a/indra/newview/skins/default/xui/en/emoji_characters.xml +++ /dev/null @@ -1,10955 +0,0 @@ - - - - - Character - 😀 - ShortCodes - - :grinning: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😄 - ShortCodes - - :smile: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😆 - ShortCodes - - :laughing: - - - - Categories - - Smiley - Face Smiling - - - - Character - 🤣 - ShortCodes - - :rofl: - :satisfied: - - - Categories - - Smiley - Face Smiling - - - - Character - 🙂 - ShortCodes - - :slightly_smiling_face: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😉 - ShortCodes - - :wink: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😇 - ShortCodes - - :innocent: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😃 - ShortCodes - - :smiley: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😁 - ShortCodes - - :grin: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😅 - ShortCodes - - :sweat_smile: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😂 - ShortCodes - - :joy: - - - - Categories - - Smiley - Face Smiling - - - - Character - 🙃 - ShortCodes - - :upside_down_face: - - - - Categories - - Smiley - Face Smiling - - - - Character - 😊 - ShortCodes - - :blush: - - - - Categories - - Smiley - Face Smiling - - - - Character - 🥰 - ShortCodes - - :smiling_face_with_three_hearts: - - - - Categories - - Smiley - Face Affection - - - - Character - 🤩 - ShortCodes - - :star_struck: - - - - Categories - - Smiley - Face Affection - - - - Character - 😗 - ShortCodes - - :kissing: - - - - Categories - - Smiley - Face Affection - - - - Character - 😚 - ShortCodes - - :kissing_closed_eyes: - - - - Categories - - Smiley - Face Affection - - - - Character - 🥲 - ShortCodes - - :smiling_face_with_tear: - - - - Categories - - Smiley - Face Affection - - - - Character - 😍 - ShortCodes - - :heart_eyes: - - - - Categories - - Smiley - Face Affection - - - - Character - 😘 - ShortCodes - - :kissing_heart: - - - - Categories - - Smiley - Face Affection - - - - Character - ☺️ - ShortCodes - - :relaxed: - - - - Categories - - Smiley - Face Affection - - - - Character - 😙 - ShortCodes - - :kissing_smiling_eyes: - - - - Categories - - Smiley - Face Affection - - - - Character - 😋 - ShortCodes - - :yum: - - - - Categories - - Smiley - Face Tongue - - - - Character - 😜 - ShortCodes - - :stuck_out_tongue_winking_eye: - - - - Categories - - Smiley - Face Tongue - - - - Character - 😝 - ShortCodes - - :stuck_out_tongue_closed_eyes: - - - - Categories - - Smiley - Face Tongue - - - - Character - 😛 - ShortCodes - - :stuck_out_tongue: - - - - Categories - - Smiley - Face Tongue - - - - Character - 🤪 - ShortCodes - - :zany_face: - - - - Categories - - Smiley - Face Tongue - - - - Character - 🤑 - ShortCodes - - :money_mouth_face: - - - - Categories - - Smiley - Face Tongue - - - - Character - 🤗 - ShortCodes - - :hugs: - - - - Categories - - Smiley - Face Hand - - - - Character - 🤫 - ShortCodes - - :shushing_face: - - - - Categories - - Smiley - Face Hand - - - - Character - 🤭 - ShortCodes - - :hand_over_mouth: - - - - Categories - - Smiley - Face Hand - - - - Character - 🤔 - ShortCodes - - :thinking: - - - - Categories - - Smiley - Face Hand - - - - Character - 🤐 - ShortCodes - - :zipper_mouth_face: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😐 - ShortCodes - - :neutral_face: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😶 - ShortCodes - - :no_mouth: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😏 - ShortCodes - - :smirk: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 🙄 - ShortCodes - - :roll_eyes: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😮‍💨 - ShortCodes - - :face_exhaling: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 🤨 - ShortCodes - - :raised_eyebrow: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😑 - ShortCodes - - :expressionless: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😶‍🌫️ - ShortCodes - - :face_in_clouds: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😒 - ShortCodes - - :unamused: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😬 - ShortCodes - - :grimacing: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 🤥 - ShortCodes - - :lying_face: - - - - Categories - - Smiley - Face Neutral Skeptical - - - - Character - 😌 - ShortCodes - - :relieved: - - - - Categories - - Smiley - Face Sleepy - - - - Character - 😪 - ShortCodes - - :sleepy: - - - - Categories - - Smiley - Face Sleepy - - - - Character - 😴 - ShortCodes - - :sleeping: - - - - Categories - - Smiley - Face Sleepy - - - - Character - 😔 - ShortCodes - - :pensive: - - - - Categories - - Smiley - Face Sleepy - - - - Character - 🤤 - ShortCodes - - :drooling_face: - - - - Categories - - Smiley - Face Sleepy - - - - Character - 😷 - ShortCodes - - :mask: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤕 - ShortCodes - - :face_with_head_bandage: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤮 - ShortCodes - - :vomiting_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🥵 - ShortCodes - - :hot_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🥴 - ShortCodes - - :woozy_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 😵‍💫 - ShortCodes - - :face_with_spiral_eyes: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤒 - ShortCodes - - :face_with_thermometer: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤢 - ShortCodes - - :nauseated_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤧 - ShortCodes - - :sneezing_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🥶 - ShortCodes - - :cold_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 😵 - ShortCodes - - :dizzy_face: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤯 - ShortCodes - - :exploding_head: - - - - Categories - - Smiley - Face Unwell - - - - Character - 🤠 - ShortCodes - - :cowboy_hat_face: - - - - Categories - - Smiley - Face Hat - - - - Character - 🥸 - ShortCodes - - :disguised_face: - - - - Categories - - Smiley - Face Hat - - - - Character - 🥳 - ShortCodes - - :partying_face: - - - - Categories - - Smiley - Face Hat - - - - Character - 😎 - ShortCodes - - :sunglasses: - - - - Categories - - Smiley - Face Glasses - - - - Character - 🧐 - ShortCodes - - :monocle_face: - - - - Categories - - Smiley - Face Glasses - - - - Character - 🤓 - ShortCodes - - :nerd_face: - - - - Categories - - Smiley - Face Glasses - - - - Character - 😕 - ShortCodes - - :confused: - - - - Categories - - Smiley - Face Concerned - - - - Character - 🙁 - ShortCodes - - :slightly_frowning_face: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😮 - ShortCodes - - :open_mouth: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😲 - ShortCodes - - :astonished: - - - - Categories - - Smiley - Face Concerned - - - - Character - 🥺 - ShortCodes - - :pleading_face: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😧 - ShortCodes - - :anguished: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😰 - ShortCodes - - :cold_sweat: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😢 - ShortCodes - - :cry: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😱 - ShortCodes - - :scream: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😣 - ShortCodes - - :persevere: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😓 - ShortCodes - - :sweat: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😫 - ShortCodes - - :tired_face: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😟 - ShortCodes - - :worried: - - - - Categories - - Smiley - Face Concerned - - - - Character - ☹️ - ShortCodes - - :frowning_face: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😯 - ShortCodes - - :hushed: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😳 - ShortCodes - - :flushed: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😦 - ShortCodes - - :frowning: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😨 - ShortCodes - - :fearful: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😥 - ShortCodes - - :disappointed_relieved: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😭 - ShortCodes - - :sob: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😖 - ShortCodes - - :confounded: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😞 - ShortCodes - - :disappointed: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😩 - ShortCodes - - :weary: - - - - Categories - - Smiley - Face Concerned - - - - Character - 🥱 - ShortCodes - - :yawning_face: - - - - Categories - - Smiley - Face Concerned - - - - Character - 😤 - ShortCodes - - :triumph: - - - - Categories - - Smiley - Face Negative - - - - Character - 😠 - ShortCodes - - :angry: - - - - Categories - - Smiley - Face Negative - - - - Character - 😈 - ShortCodes - - :smiling_imp: - - - - Categories - - Smiley - Face Negative - - - - Character - 💀 - ShortCodes - - :skull: - - - - Categories - - Smiley - Face Negative - - - - Character - 😡 - ShortCodes - - :pout: - :rage: - - - Categories - - Smiley - Face Negative - - - - Character - 🤬 - ShortCodes - - :cursing_face: - - - - Categories - - Smiley - Face Negative - - - - Character - 👿 - ShortCodes - - :imp: - - - - Categories - - Smiley - Face Negative - - - - Character - ☠️ - ShortCodes - - :skull_and_crossbones: - - - - Categories - - Smiley - Face Negative - - - - Character - 💩 - ShortCodes - - :hankey: - :poop: - :shit: - - Categories - - Smiley - Face Costume - - - - Character - 👹 - ShortCodes - - :japanese_ogre: - - - - Categories - - Smiley - Face Costume - - - - Character - 👻 - ShortCodes - - :ghost: - - - - Categories - - Smiley - Face Costume - - - - Character - 👾 - ShortCodes - - :space_invader: - - - - Categories - - Smiley - Face Costume - - - - Character - 🤡 - ShortCodes - - :clown_face: - - - - Categories - - Smiley - Face Costume - - - - Character - 👺 - ShortCodes - - :japanese_goblin: - - - - Categories - - Smiley - Face Costume - - - - Character - 👽 - ShortCodes - - :alien: - - - - Categories - - Smiley - Face Costume - - - - Character - 🤖 - ShortCodes - - :robot: - - - - Categories - - Smiley - Face Costume - - - - Character - 😺 - ShortCodes - - :smiley_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😹 - ShortCodes - - :joy_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😼 - ShortCodes - - :smirk_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 🙀 - ShortCodes - - :scream_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😾 - ShortCodes - - :pouting_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😸 - ShortCodes - - :smile_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😻 - ShortCodes - - :heart_eyes_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😽 - ShortCodes - - :kissing_cat: - - - - Categories - - Smiley - Cat Face - - - - Character - 😿 - ShortCodes - - :crying_cat_face: - - - - Categories - - Smiley - Cat Face - - - - Character - 🙈 - ShortCodes - - :see_no_evil: - - - - Categories - - Smiley - Monkey Face - - - - Character - 🙊 - ShortCodes - - :speak_no_evil: - - - - Categories - - Smiley - Monkey Face - - - - Character - 🙉 - ShortCodes - - :hear_no_evil: - - - - Categories - - Smiley - Monkey Face - - - - Character - 💋 - ShortCodes - - :kiss: - - - - Categories - - Emotion - - - - - Character - 💘 - ShortCodes - - :cupid: - - - - Categories - - Emotion - - - - - Character - 💖 - ShortCodes - - :sparkling_heart: - - - - Categories - - Emotion - - - - - Character - 💓 - ShortCodes - - :heartbeat: - - - - Categories - - Emotion - - - - - Character - 💕 - ShortCodes - - :two_hearts: - - - - Categories - - Emotion - - - - - Character - ❣️ - ShortCodes - - :heavy_heart_exclamation: - - - - Categories - - Emotion - - - - - Character - ❤️‍🔥 - ShortCodes - - :heart_on_fire: - - - - Categories - - Emotion - - - - - Character - ❤️ - ShortCodes - - :heart: - - - - Categories - - Emotion - - - - - Character - 💛 - ShortCodes - - :yellow_heart: - - - - Categories - - Emotion - - - - - Character - 💙 - ShortCodes - - :blue_heart: - - - - Categories - - Emotion - - - - - Character - 🤎 - ShortCodes - - :brown_heart: - - - - Categories - - Emotion - - - - - Character - 🤍 - ShortCodes - - :white_heart: - - - - Categories - - Emotion - - - - - Character - 💢 - ShortCodes - - :anger: - - - - Categories - - Emotion - - - - - Character - 💫 - ShortCodes - - :dizzy: - - - - Categories - - Emotion - - - - - Character - 💨 - ShortCodes - - :dash: - - - - Categories - - Emotion - - - - - Character - 💣 - ShortCodes - - :bomb: - - - - Categories - - Emotion - - - - - Character - 👁️‍🗨️ - ShortCodes - - :eye_speech_bubble: - - - - Categories - - Emotion - - - - - Character - 🗯️ - ShortCodes - - :right_anger_bubble: - - - - Categories - - Emotion - - - - - Character - 💤 - ShortCodes - - :zzz: - - - - Categories - - Emotion - - - - - Character - 💌 - ShortCodes - - :love_letter: - - - - Categories - - Emotion - - - - - Character - 💝 - ShortCodes - - :gift_heart: - - - - Categories - - Emotion - - - - - Character - 💗 - ShortCodes - - :heartpulse: - - - - Categories - - Emotion - - - - - Character - 💞 - ShortCodes - - :revolving_hearts: - - - - Categories - - Emotion - - - - - Character - 💟 - ShortCodes - - :heart_decoration: - - - - Categories - - Emotion - - - - - Character - 💔 - ShortCodes - - :broken_heart: - - - - Categories - - Emotion - - - - - Character - ❤️‍🩹 - ShortCodes - - :mending_heart: - - - - Categories - - Emotion - - - - - Character - 🧡 - ShortCodes - - :orange_heart: - - - - Categories - - Emotion - - - - - Character - 💚 - ShortCodes - - :green_heart: - - - - Categories - - Emotion - - - - - Character - 💜 - ShortCodes - - :purple_heart: - - - - Categories - - Emotion - - - - - Character - 🖤 - ShortCodes - - :black_heart: - - - - Categories - - Emotion - - - - - Character - 💯 - ShortCodes - - :100: - - - - Categories - - Emotion - - - - - Character - 💥 - ShortCodes - - :boom: - :collision: - - - Categories - - Emotion - - - - - Character - 💦 - ShortCodes - - :sweat_drops: - - - - Categories - - Emotion - - - - - Character - 🕳️ - ShortCodes - - :hole: - - - - Categories - - Emotion - - - - - Character - 💬 - ShortCodes - - :speech_balloon: - - - - Categories - - Emotion - - - - - Character - 🗨️ - ShortCodes - - :left_speech_bubble: - - - - Categories - - Emotion - - - - - Character - 💭 - ShortCodes - - :thought_balloon: - - - - Categories - - Emotion - - - - - Character - 👋 - ShortCodes - - :wave: - - - - Categories - - Body - Hand Fingers Open - - - - Character - 🖐️ - ShortCodes - - :raised_hand_with_fingers_splayed: - - - - Categories - - Body - Hand Fingers Open - - - - Character - 🖖 - ShortCodes - - :vulcan_salute: - - - - Categories - - Body - Hand Fingers Open - - - - Character - 🤚 - ShortCodes - - :raised_back_of_hand: - - - - Categories - - Body - Hand Fingers Open - - - - Character - - ShortCodes - - :hand: - :raised_hand: - - - Categories - - Body - Hand Fingers Open - - - - Character - 👌 - ShortCodes - - :ok_hand: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤏 - ShortCodes - - :pinching_hand: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤞 - ShortCodes - - :crossed_fingers: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤘 - ShortCodes - - :metal: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤌 - ShortCodes - - :pinched_fingers: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - ✌️ - ShortCodes - - :v: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤟 - ShortCodes - - :love_you_gesture: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 🤙 - ShortCodes - - :call_me_hand: - - - - Categories - - Body - Hand Fingers Partial - - - - Character - 👈 - ShortCodes - - :point_left: - - - - Categories - - Body - Hand Single Finger - - - - Character - 👆 - ShortCodes - - :point_up_2: - - - - Categories - - Body - Hand Single Finger - - - - Character - 👇 - ShortCodes - - :point_down: - - - - Categories - - Body - Hand Single Finger - - - - Character - 👉 - ShortCodes - - :point_right: - - - - Categories - - Body - Hand Single Finger - - - - Character - 🖕 - ShortCodes - - :fu: - :middle_finger: - - - Categories - - Body - Hand Single Finger - - - - Character - ☝️ - ShortCodes - - :point_up: - - - - Categories - - Body - Hand Single Finger - - - - Character - 👍 - ShortCodes - - :+1: - :thumbsup: - - - Categories - - Body - Hand Fingers Closed - - - - Character - - ShortCodes - - :fist: - :fist_raised: - - - Categories - - Body - Hand Fingers Closed - - - - Character - 🤛 - ShortCodes - - :fist_left: - - - - Categories - - Body - Hand Fingers Closed - - - - Character - 👎 - ShortCodes - - :-1: - :thumbsdown: - - - Categories - - Body - Hand Fingers Closed - - - - Character - 👊 - ShortCodes - - :facepunch: - :fist_oncoming: - :punch: - - Categories - - Body - Hand Fingers Closed - - - - Character - 🤜 - ShortCodes - - :fist_right: - - - - Categories - - Body - Hand Fingers Closed - - - - Character - 👏 - ShortCodes - - :clap: - - - - Categories - - Body - Hands - - - - Character - 👐 - ShortCodes - - :open_hands: - - - - Categories - - Body - Hands - - - - Character - 🤝 - ShortCodes - - :handshake: - - - - Categories - - Body - Hands - - - - Character - 🙌 - ShortCodes - - :raised_hands: - - - - Categories - - Body - Hands - - - - Character - 🤲 - ShortCodes - - :palms_up_together: - - - - Categories - - Body - Hands - - - - Character - 🙏 - ShortCodes - - :pray: - - - - Categories - - Body - Hands - - - - Character - ✍️ - ShortCodes - - :writing_hand: - - - - Categories - - Body - Hand Prop - - - - Character - 🤳 - ShortCodes - - :selfie: - - - - Categories - - Body - Hand Prop - - - - Character - 💅 - ShortCodes - - :nail_care: - - - - Categories - - Body - Hand Prop - - - - Character - 💪 - ShortCodes - - :muscle: - - - - Categories - - Body - Body Parts - - - - Character - 🦿 - ShortCodes - - :mechanical_leg: - - - - Categories - - Body - Body Parts - - - - Character - 🦶 - ShortCodes - - :foot: - - - - Categories - - Body - Body Parts - - - - Character - 🦻 - ShortCodes - - :ear_with_hearing_aid: - - - - Categories - - Body - Body Parts - - - - Character - 🧠 - ShortCodes - - :brain: - - - - Categories - - Body - Body Parts - - - - Character - 🫁 - ShortCodes - - :lungs: - - - - Categories - - Body - Body Parts - - - - Character - 🦴 - ShortCodes - - :bone: - - - - Categories - - Body - Body Parts - - - - Character - 👁️ - ShortCodes - - :eye: - - - - Categories - - Body - Body Parts - - - - Character - 👄 - ShortCodes - - :lips: - - - - Categories - - Body - Body Parts - - - - Character - 🦾 - ShortCodes - - :mechanical_arm: - - - - Categories - - Body - Body Parts - - - - Character - 🦵 - ShortCodes - - :leg: - - - - Categories - - Body - Body Parts - - - - Character - 👂 - ShortCodes - - :ear: - - - - Categories - - Body - Body Parts - - - - Character - 👃 - ShortCodes - - :nose: - - - - Categories - - Body - Body Parts - - - - Character - 🫀 - ShortCodes - - :anatomical_heart: - - - - Categories - - Body - Body Parts - - - - Character - 🦷 - ShortCodes - - :tooth: - - - - Categories - - Body - Body Parts - - - - Character - 👀 - ShortCodes - - :eyes: - - - - Categories - - Body - Body Parts - - - - Character - 👅 - ShortCodes - - :tongue: - - - - Categories - - Body - Body Parts - - - - Character - 👶 - ShortCodes - - :baby: - - - - Categories - - Person - - - - - Character - 👦 - ShortCodes - - :boy: - - - - Categories - - Person - - - - - Character - 🧑 - ShortCodes - - :adult: - - - - Categories - - Person - - - - - Character - 👨 - ShortCodes - - :man: - - - - Categories - - Person - - - - - Character - 🧔‍♂️ - ShortCodes - - :man_beard: - - - - Categories - - Person - - - - - Character - 👨‍🦰 - ShortCodes - - :red_haired_man: - - - - Categories - - Person - - - - - Character - 👨‍🦳 - ShortCodes - - :white_haired_man: - - - - Categories - - Person - - - - - Character - 👩 - ShortCodes - - :woman: - - - - Categories - - Person - - - - - Character - 🧑‍🦰 - ShortCodes - - :person_red_hair: - - - - Categories - - Person - - - - - Character - 🧑‍🦱 - ShortCodes - - :person_curly_hair: - - - - Categories - - Person - - - - - Character - 🧑‍🦳 - ShortCodes - - :person_white_hair: - - - - Categories - - Person - - - - - Character - 🧑‍🦲 - ShortCodes - - :person_bald: - - - - Categories - - Person - - - - - Character - 👱‍♂️ - ShortCodes - - :blond_haired_man: - - - - Categories - - Person - - - - - Character - 👴 - ShortCodes - - :older_man: - - - - Categories - - Person - - - - - Character - 🧒 - ShortCodes - - :child: - - - - Categories - - Person - - - - - Character - 👧 - ShortCodes - - :girl: - - - - Categories - - Person - - - - - Character - 👱 - ShortCodes - - :blond_haired_person: - - - - Categories - - Person - - - - - Character - 🧔 - ShortCodes - - :bearded_person: - - - - Categories - - Person - - - - - Character - 🧔‍♀️ - ShortCodes - - :woman_beard: - - - - Categories - - Person - - - - - Character - 👨‍🦱 - ShortCodes - - :curly_haired_man: - - - - Categories - - Person - - - - - Character - 👨‍🦲 - ShortCodes - - :bald_man: - - - - Categories - - Person - - - - - Character - 👩‍🦰 - ShortCodes - - :red_haired_woman: - - - - Categories - - Person - - - - - Character - 👩‍🦱 - ShortCodes - - :curly_haired_woman: - - - - Categories - - Person - - - - - Character - 👩‍🦳 - ShortCodes - - :white_haired_woman: - - - - Categories - - Person - - - - - Character - 👩‍🦲 - ShortCodes - - :bald_woman: - - - - Categories - - Person - - - - - Character - 👱‍♀️ - ShortCodes - - :blond_haired_woman: - :blonde_woman: - - - Categories - - Person - - - - - Character - 🧓 - ShortCodes - - :older_adult: - - - - Categories - - Person - - - - - Character - 👵 - ShortCodes - - :older_woman: - - - - Categories - - Person - - - - - Character - 🙍 - ShortCodes - - :frowning_person: - - - - Categories - - Person Gesture - - - - - Character - 🙍‍♀️ - ShortCodes - - :frowning_woman: - - - - Categories - - Person Gesture - - - - - Character - 🙎‍♂️ - ShortCodes - - :pouting_man: - - - - Categories - - Person Gesture - - - - - Character - 🙅 - ShortCodes - - :no_good: - - - - Categories - - Person Gesture - - - - - Character - 🙅‍♀️ - ShortCodes - - :ng_woman: - :no_good_woman: - - - Categories - - Person Gesture - - - - - Character - 🙆‍♂️ - ShortCodes - - :ok_man: - - - - Categories - - Person Gesture - - - - - Character - 💁 - ShortCodes - - :information_desk_person: - :tipping_hand_person: - - - Categories - - Person Gesture - - - - - Character - 💁‍♀️ - ShortCodes - - :sassy_woman: - :tipping_hand_woman: - - - Categories - - Person Gesture - - - - - Character - 🙋‍♂️ - ShortCodes - - :raising_hand_man: - - - - Categories - - Person Gesture - - - - - Character - 🧏 - ShortCodes - - :deaf_person: - - - - Categories - - Person Gesture - - - - - Character - 🧏‍♀️ - ShortCodes - - :deaf_woman: - - - - Categories - - Person Gesture - - - - - Character - 🙇‍♂️ - ShortCodes - - :bowing_man: - - - - Categories - - Person Gesture - - - - - Character - 🤦 - ShortCodes - - :facepalm: - - - - Categories - - Person Gesture - - - - - Character - 🤦‍♀️ - ShortCodes - - :woman_facepalming: - - - - Categories - - Person Gesture - - - - - Character - 🤷‍♂️ - ShortCodes - - :man_shrugging: - - - - Categories - - Person Gesture - - - - - Character - 🙍‍♂️ - ShortCodes - - :frowning_man: - - - - Categories - - Person Gesture - - - - - Character - 🙎 - ShortCodes - - :pouting_face: - - - - Categories - - Person Gesture - - - - - Character - 🙎‍♀️ - ShortCodes - - :pouting_woman: - - - - Categories - - Person Gesture - - - - - Character - 🙅‍♂️ - ShortCodes - - :ng_man: - :no_good_man: - - - Categories - - Person Gesture - - - - - Character - 🙆 - ShortCodes - - :ok_person: - - - - Categories - - Person Gesture - - - - - Character - 🙆‍♀️ - ShortCodes - - :ok_woman: - - - - Categories - - Person Gesture - - - - - Character - 💁‍♂️ - ShortCodes - - :sassy_man: - :tipping_hand_man: - - - Categories - - Person Gesture - - - - - Character - 🙋 - ShortCodes - - :raising_hand: - - - - Categories - - Person Gesture - - - - - Character - 🙋‍♀️ - ShortCodes - - :raising_hand_woman: - - - - Categories - - Person Gesture - - - - - Character - 🧏‍♂️ - ShortCodes - - :deaf_man: - - - - Categories - - Person Gesture - - - - - Character - 🙇 - ShortCodes - - :bow: - - - - Categories - - Person Gesture - - - - - Character - 🙇‍♀️ - ShortCodes - - :bowing_woman: - - - - Categories - - Person Gesture - - - - - Character - 🤦‍♂️ - ShortCodes - - :man_facepalming: - - - - Categories - - Person Gesture - - - - - Character - 🤷 - ShortCodes - - :shrug: - - - - Categories - - Person Gesture - - - - - Character - 🤷‍♀️ - ShortCodes - - :woman_shrugging: - - - - Categories - - Person Gesture - - - - - Character - 🧑‍⚕️ - ShortCodes - - :health_worker: - - - - Categories - - Person Role - - - - - Character - 👩‍⚕️ - ShortCodes - - :woman_health_worker: - - - - Categories - - Person Role - - - - - Character - 👨‍🎓 - ShortCodes - - :man_student: - - - - Categories - - Person Role - - - - - Character - 🧑‍🏫 - ShortCodes - - :teacher: - - - - Categories - - Person Role - - - - - Character - 👩‍🏫 - ShortCodes - - :woman_teacher: - - - - Categories - - Person Role - - - - - Character - 👨‍⚖️ - ShortCodes - - :man_judge: - - - - Categories - - Person Role - - - - - Character - 🧑‍🌾 - ShortCodes - - :farmer: - - - - Categories - - Person Role - - - - - Character - 👩‍🌾 - ShortCodes - - :woman_farmer: - - - - Categories - - Person Role - - - - - Character - 👨‍🍳 - ShortCodes - - :man_cook: - - - - Categories - - Person Role - - - - - Character - 🧑‍🔧 - ShortCodes - - :mechanic: - - - - Categories - - Person Role - - - - - Character - 👩‍🔧 - ShortCodes - - :woman_mechanic: - - - - Categories - - Person Role - - - - - Character - 👨‍🏭 - ShortCodes - - :man_factory_worker: - - - - Categories - - Person Role - - - - - Character - 🧑‍💼 - ShortCodes - - :office_worker: - - - - Categories - - Person Role - - - - - Character - 👩‍💼 - ShortCodes - - :woman_office_worker: - - - - Categories - - Person Role - - - - - Character - 👨‍🔬 - ShortCodes - - :man_scientist: - - - - Categories - - Person Role - - - - - Character - 🧑‍💻 - ShortCodes - - :technologist: - - - - Categories - - Person Role - - - - - Character - 👩‍💻 - ShortCodes - - :woman_technologist: - - - - Categories - - Person Role - - - - - Character - 👨‍🎤 - ShortCodes - - :man_singer: - - - - Categories - - Person Role - - - - - Character - 🧑‍🎨 - ShortCodes - - :artist: - - - - Categories - - Person Role - - - - - Character - 👩‍🎨 - ShortCodes - - :woman_artist: - - - - Categories - - Person Role - - - - - Character - 👨‍✈️ - ShortCodes - - :man_pilot: - - - - Categories - - Person Role - - - - - Character - 🧑‍🚀 - ShortCodes - - :astronaut: - - - - Categories - - Person Role - - - - - Character - 👩‍🚀 - ShortCodes - - :woman_astronaut: - - - - Categories - - Person Role - - - - - Character - 👨‍🚒 - ShortCodes - - :man_firefighter: - - - - Categories - - Person Role - - - - - Character - 👮 - ShortCodes - - :cop: - :police_officer: - - - Categories - - Person Role - - - - - Character - 👮‍♀️ - ShortCodes - - :policewoman: - - - - Categories - - Person Role - - - - - Character - 🕵️‍♂️ - ShortCodes - - :male_detective: - - - - Categories - - Person Role - - - - - Character - 💂 - ShortCodes - - :guard: - - - - Categories - - Person Role - - - - - Character - 💂‍♀️ - ShortCodes - - :guardswoman: - - - - Categories - - Person Role - - - - - Character - 👷 - ShortCodes - - :construction_worker: - - - - Categories - - Person Role - - - - - Character - 👷‍♀️ - ShortCodes - - :construction_worker_woman: - - - - Categories - - Person Role - - - - - Character - 👸 - ShortCodes - - :princess: - - - - Categories - - Person Role - - - - - Character - 👳‍♂️ - ShortCodes - - :man_with_turban: - - - - Categories - - Person Role - - - - - Character - 👲 - ShortCodes - - :man_with_gua_pi_mao: - - - - Categories - - Person Role - - - - - Character - 🤵 - ShortCodes - - :person_in_tuxedo: - - - - Categories - - Person Role - - - - - Character - 🤵‍♀️ - ShortCodes - - :woman_in_tuxedo: - - - - Categories - - Person Role - - - - - Character - 👰‍♂️ - ShortCodes - - :man_with_veil: - - - - Categories - - Person Role - - - - - Character - 🤰 - ShortCodes - - :pregnant_woman: - - - - Categories - - Person Role - - - - - Character - 👩‍🍼 - ShortCodes - - :woman_feeding_baby: - - - - Categories - - Person Role - - - - - Character - 🧑‍🍼 - ShortCodes - - :person_feeding_baby: - - - - Categories - - Person Role - - - - - Character - 👨‍⚕️ - ShortCodes - - :man_health_worker: - - - - Categories - - Person Role - - - - - Character - 🧑‍🎓 - ShortCodes - - :student: - - - - Categories - - Person Role - - - - - Character - 👩‍🎓 - ShortCodes - - :woman_student: - - - - Categories - - Person Role - - - - - Character - 👨‍🏫 - ShortCodes - - :man_teacher: - - - - Categories - - Person Role - - - - - Character - 🧑‍⚖️ - ShortCodes - - :judge: - - - - Categories - - Person Role - - - - - Character - 👩‍⚖️ - ShortCodes - - :woman_judge: - - - - Categories - - Person Role - - - - - Character - 👨‍🌾 - ShortCodes - - :man_farmer: - - - - Categories - - Person Role - - - - - Character - 🧑‍🍳 - ShortCodes - - :cook: - - - - Categories - - Person Role - - - - - Character - 👩‍🍳 - ShortCodes - - :woman_cook: - - - - Categories - - Person Role - - - - - Character - 👨‍🔧 - ShortCodes - - :man_mechanic: - - - - Categories - - Person Role - - - - - Character - 🧑‍🏭 - ShortCodes - - :factory_worker: - - - - Categories - - Person Role - - - - - Character - 👩‍🏭 - ShortCodes - - :woman_factory_worker: - - - - Categories - - Person Role - - - - - Character - 👨‍💼 - ShortCodes - - :man_office_worker: - - - - Categories - - Person Role - - - - - Character - 🧑‍🔬 - ShortCodes - - :scientist: - - - - Categories - - Person Role - - - - - Character - 👩‍🔬 - ShortCodes - - :woman_scientist: - - - - Categories - - Person Role - - - - - Character - 👨‍💻 - ShortCodes - - :man_technologist: - - - - Categories - - Person Role - - - - - Character - 🧑‍🎤 - ShortCodes - - :singer: - - - - Categories - - Person Role - - - - - Character - 👩‍🎤 - ShortCodes - - :woman_singer: - - - - Categories - - Person Role - - - - - Character - 👨‍🎨 - ShortCodes - - :man_artist: - - - - Categories - - Person Role - - - - - Character - 🧑‍✈️ - ShortCodes - - :pilot: - - - - Categories - - Person Role - - - - - Character - 👩‍✈️ - ShortCodes - - :woman_pilot: - - - - Categories - - Person Role - - - - - Character - 👨‍🚀 - ShortCodes - - :man_astronaut: - - - - Categories - - Person Role - - - - - Character - 🧑‍🚒 - ShortCodes - - :firefighter: - - - - Categories - - Person Role - - - - - Character - 👩‍🚒 - ShortCodes - - :woman_firefighter: - - - - Categories - - Person Role - - - - - Character - 👮‍♂️ - ShortCodes - - :policeman: - - - - Categories - - Person Role - - - - - Character - 🕵️ - ShortCodes - - :detective: - - - - Categories - - Person Role - - - - - Character - 🕵️‍♀️ - ShortCodes - - :female_detective: - - - - Categories - - Person Role - - - - - Character - 💂‍♂️ - ShortCodes - - :guardsman: - - - - Categories - - Person Role - - - - - Character - 🥷 - ShortCodes - - :ninja: - - - - Categories - - Person Role - - - - - Character - 👷‍♂️ - ShortCodes - - :construction_worker_man: - - - - Categories - - Person Role - - - - - Character - 🤴 - ShortCodes - - :prince: - - - - Categories - - Person Role - - - - - Character - 👳 - ShortCodes - - :person_with_turban: - - - - Categories - - Person Role - - - - - Character - 👳‍♀️ - ShortCodes - - :woman_with_turban: - - - - Categories - - Person Role - - - - - Character - 🧕 - ShortCodes - - :woman_with_headscarf: - - - - Categories - - Person Role - - - - - Character - 🤵‍♂️ - ShortCodes - - :man_in_tuxedo: - - - - Categories - - Person Role - - - - - Character - 👰 - ShortCodes - - :person_with_veil: - - - - Categories - - Person Role - - - - - Character - 👰‍♀️ - ShortCodes - - :bride_with_veil: - :woman_with_veil: - - - Categories - - Person Role - - - - - Character - 🤱 - ShortCodes - - :breast_feeding: - - - - Categories - - Person Role - - - - - Character - 👨‍🍼 - ShortCodes - - :man_feeding_baby: - - - - Categories - - Person Role - - - - - Character - 👼 - ShortCodes - - :angel: - - - - Categories - - Person Fantasy - - - - - Character - 🤶 - ShortCodes - - :mrs_claus: - - - - Categories - - Person Fantasy - - - - - Character - 🦸 - ShortCodes - - :superhero: - - - - Categories - - Person Fantasy - - - - - Character - 🦸‍♀️ - ShortCodes - - :superhero_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🦹‍♂️ - ShortCodes - - :supervillain_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧙 - ShortCodes - - :mage: - - - - Categories - - Person Fantasy - - - - - Character - 🧙‍♀️ - ShortCodes - - :mage_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧚‍♂️ - ShortCodes - - :fairy_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧛 - ShortCodes - - :vampire: - - - - Categories - - Person Fantasy - - - - - Character - 🧛‍♀️ - ShortCodes - - :vampire_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧜‍♂️ - ShortCodes - - :merman: - - - - Categories - - Person Fantasy - - - - - Character - 🧝 - ShortCodes - - :elf: - - - - Categories - - Person Fantasy - - - - - Character - 🧝‍♀️ - ShortCodes - - :elf_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧞‍♂️ - ShortCodes - - :genie_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧟 - ShortCodes - - :zombie: - - - - Categories - - Person Fantasy - - - - - Character - 🧟‍♀️ - ShortCodes - - :zombie_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🎅 - ShortCodes - - :santa: - - - - Categories - - Person Fantasy - - - - - Character - 🧑‍🎄 - ShortCodes - - :mx_claus: - - - - Categories - - Person Fantasy - - - - - Character - 🦸‍♂️ - ShortCodes - - :superhero_man: - - - - Categories - - Person Fantasy - - - - - Character - 🦹 - ShortCodes - - :supervillain: - - - - Categories - - Person Fantasy - - - - - Character - 🦹‍♀️ - ShortCodes - - :supervillain_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧙‍♂️ - ShortCodes - - :mage_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧚 - ShortCodes - - :fairy: - - - - Categories - - Person Fantasy - - - - - Character - 🧚‍♀️ - ShortCodes - - :fairy_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧛‍♂️ - ShortCodes - - :vampire_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧜 - ShortCodes - - :merperson: - - - - Categories - - Person Fantasy - - - - - Character - 🧜‍♀️ - ShortCodes - - :mermaid: - - - - Categories - - Person Fantasy - - - - - Character - 🧝‍♂️ - ShortCodes - - :elf_man: - - - - Categories - - Person Fantasy - - - - - Character - 🧞 - ShortCodes - - :genie: - - - - Categories - - Person Fantasy - - - - - Character - 🧞‍♀️ - ShortCodes - - :genie_woman: - - - - Categories - - Person Fantasy - - - - - Character - 🧟‍♂️ - ShortCodes - - :zombie_man: - - - - Categories - - Person Fantasy - - - - - Character - 💆 - ShortCodes - - :massage: - - - - Categories - - Person Activity - - - - - Character - 💆‍♀️ - ShortCodes - - :massage_woman: - - - - Categories - - Person Activity - - - - - Character - 💇‍♂️ - ShortCodes - - :haircut_man: - - - - Categories - - Person Activity - - - - - Character - 🚶 - ShortCodes - - :walking: - - - - Categories - - Person Activity - - - - - Character - 🚶‍♀️ - ShortCodes - - :walking_woman: - - - - Categories - - Person Activity - - - - - Character - 🧍‍♂️ - ShortCodes - - :standing_man: - - - - Categories - - Person Activity - - - - - Character - 🧎 - ShortCodes - - :kneeling_person: - - - - Categories - - Person Activity - - - - - Character - 🧎‍♀️ - ShortCodes - - :kneeling_woman: - - - - Categories - - Person Activity - - - - - Character - 👨‍🦯 - ShortCodes - - :man_with_probing_cane: - - - - Categories - - Person Activity - - - - - Character - 🧑‍🦼 - ShortCodes - - :person_in_motorized_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 👩‍🦼 - ShortCodes - - :woman_in_motorized_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 👨‍🦽 - ShortCodes - - :man_in_manual_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 🏃 - ShortCodes - - :runner: - :running: - - - Categories - - Person Activity - - - - - Character - 🏃‍♀️ - ShortCodes - - :running_woman: - - - - Categories - - Person Activity - - - - - Character - 🕺 - ShortCodes - - :man_dancing: - - - - Categories - - Person Activity - - - - - Character - 👯 - ShortCodes - - :dancers: - - - - Categories - - Person Activity - - - - - Character - 👯‍♀️ - ShortCodes - - :dancing_women: - - - - Categories - - Person Activity - - - - - Character - 🧖‍♂️ - ShortCodes - - :sauna_man: - - - - Categories - - Person Activity - - - - - Character - 🧗 - ShortCodes - - :climbing: - - - - Categories - - Person Activity - - - - - Character - 🧗‍♀️ - ShortCodes - - :climbing_woman: - - - - Categories - - Person Activity - - - - - Character - 💆‍♂️ - ShortCodes - - :massage_man: - - - - Categories - - Person Activity - - - - - Character - 💇 - ShortCodes - - :haircut: - - - - Categories - - Person Activity - - - - - Character - 💇‍♀️ - ShortCodes - - :haircut_woman: - - - - Categories - - Person Activity - - - - - Character - 🚶‍♂️ - ShortCodes - - :walking_man: - - - - Categories - - Person Activity - - - - - Character - 🧍 - ShortCodes - - :standing_person: - - - - Categories - - Person Activity - - - - - Character - 🧍‍♀️ - ShortCodes - - :standing_woman: - - - - Categories - - Person Activity - - - - - Character - 🧎‍♂️ - ShortCodes - - :kneeling_man: - - - - Categories - - Person Activity - - - - - Character - 🧑‍🦯 - ShortCodes - - :person_with_probing_cane: - - - - Categories - - Person Activity - - - - - Character - 👩‍🦯 - ShortCodes - - :woman_with_probing_cane: - - - - Categories - - Person Activity - - - - - Character - 👨‍🦼 - ShortCodes - - :man_in_motorized_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 🧑‍🦽 - ShortCodes - - :person_in_manual_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 👩‍🦽 - ShortCodes - - :woman_in_manual_wheelchair: - - - - Categories - - Person Activity - - - - - Character - 🏃‍♂️ - ShortCodes - - :running_man: - - - - Categories - - Person Activity - - - - - Character - 💃 - ShortCodes - - :dancer: - :woman_dancing: - - - Categories - - Person Activity - - - - - Character - 🕴️ - ShortCodes - - :business_suit_levitating: - - - - Categories - - Person Activity - - - - - Character - 👯‍♂️ - ShortCodes - - :dancing_men: - - - - Categories - - Person Activity - - - - - Character - 🧖 - ShortCodes - - :sauna_person: - - - - Categories - - Person Activity - - - - - Character - 🧖‍♀️ - ShortCodes - - :sauna_woman: - - - - Categories - - Person Activity - - - - - Character - 🧗‍♂️ - ShortCodes - - :climbing_man: - - - - Categories - - Person Activity - - - - - Character - 🤺 - ShortCodes - - :person_fencing: - - - - Categories - - Person Sport - - - - - Character - ⛷️ - ShortCodes - - :skier: - - - - Categories - - Person Sport - - - - - Character - 🏌️ - ShortCodes - - :golfing: - - - - Categories - - Person Sport - - - - - Character - 🏌️‍♀️ - ShortCodes - - :golfing_woman: - - - - Categories - - Person Sport - - - - - Character - 🏄‍♂️ - ShortCodes - - :surfing_man: - - - - Categories - - Person Sport - - - - - Character - 🚣 - ShortCodes - - :rowboat: - - - - Categories - - Person Sport - - - - - Character - 🚣‍♀️ - ShortCodes - - :rowing_woman: - - - - Categories - - Person Sport - - - - - Character - 🏊‍♂️ - ShortCodes - - :swimming_man: - - - - Categories - - Person Sport - - - - - Character - ⛹️ - ShortCodes - - :bouncing_ball_person: - - - - Categories - - Person Sport - - - - - Character - ⛹️‍♀️ - ShortCodes - - :basketball_woman: - :bouncing_ball_woman: - - - Categories - - Person Sport - - - - - Character - 🏋️‍♂️ - ShortCodes - - :weight_lifting_man: - - - - Categories - - Person Sport - - - - - Character - 🚴 - ShortCodes - - :bicyclist: - - - - Categories - - Person Sport - - - - - Character - 🚴‍♀️ - ShortCodes - - :biking_woman: - - - - Categories - - Person Sport - - - - - Character - 🚵‍♂️ - ShortCodes - - :mountain_biking_man: - - - - Categories - - Person Sport - - - - - Character - 🤸 - ShortCodes - - :cartwheeling: - - - - Categories - - Person Sport - - - - - Character - 🤸‍♀️ - ShortCodes - - :woman_cartwheeling: - - - - Categories - - Person Sport - - - - - Character - 🤼‍♂️ - ShortCodes - - :men_wrestling: - - - - Categories - - Person Sport - - - - - Character - 🤽 - ShortCodes - - :water_polo: - - - - Categories - - Person Sport - - - - - Character - 🤽‍♀️ - ShortCodes - - :woman_playing_water_polo: - - - - Categories - - Person Sport - - - - - Character - 🤾‍♂️ - ShortCodes - - :man_playing_handball: - - - - Categories - - Person Sport - - - - - Character - 🤹 - ShortCodes - - :juggling_person: - - - - Categories - - Person Sport - - - - - Character - 🤹‍♀️ - ShortCodes - - :woman_juggling: - - - - Categories - - Person Sport - - - - - Character - 🏇 - ShortCodes - - :horse_racing: - - - - Categories - - Person Sport - - - - - Character - 🏂 - ShortCodes - - :snowboarder: - - - - Categories - - Person Sport - - - - - Character - 🏌️‍♂️ - ShortCodes - - :golfing_man: - - - - Categories - - Person Sport - - - - - Character - 🏄 - ShortCodes - - :surfer: - - - - Categories - - Person Sport - - - - - Character - 🏄‍♀️ - ShortCodes - - :surfing_woman: - - - - Categories - - Person Sport - - - - - Character - 🚣‍♂️ - ShortCodes - - :rowing_man: - - - - Categories - - Person Sport - - - - - Character - 🏊 - ShortCodes - - :swimmer: - - - - Categories - - Person Sport - - - - - Character - 🏊‍♀️ - ShortCodes - - :swimming_woman: - - - - Categories - - Person Sport - - - - - Character - ⛹️‍♂️ - ShortCodes - - :basketball_man: - :bouncing_ball_man: - - - Categories - - Person Sport - - - - - Character - 🏋️ - ShortCodes - - :weight_lifting: - - - - Categories - - Person Sport - - - - - Character - 🏋️‍♀️ - ShortCodes - - :weight_lifting_woman: - - - - Categories - - Person Sport - - - - - Character - 🚴‍♂️ - ShortCodes - - :biking_man: - - - - Categories - - Person Sport - - - - - Character - 🚵 - ShortCodes - - :mountain_bicyclist: - - - - Categories - - Person Sport - - - - - Character - 🚵‍♀️ - ShortCodes - - :mountain_biking_woman: - - - - Categories - - Person Sport - - - - - Character - 🤸‍♂️ - ShortCodes - - :man_cartwheeling: - - - - Categories - - Person Sport - - - - - Character - 🤼 - ShortCodes - - :wrestling: - - - - Categories - - Person Sport - - - - - Character - 🤼‍♀️ - ShortCodes - - :women_wrestling: - - - - Categories - - Person Sport - - - - - Character - 🤽‍♂️ - ShortCodes - - :man_playing_water_polo: - - - - Categories - - Person Sport - - - - - Character - 🤾 - ShortCodes - - :handball_person: - - - - Categories - - Person Sport - - - - - Character - 🤾‍♀️ - ShortCodes - - :woman_playing_handball: - - - - Categories - - Person Sport - - - - - Character - 🤹‍♂️ - ShortCodes - - :man_juggling: - - - - Categories - - Person Sport - - - - - Character - 🧘 - ShortCodes - - :lotus_position: - - - - Categories - - Person Resting - - - - - Character - 🧘‍♀️ - ShortCodes - - :lotus_position_woman: - - - - Categories - - Person Resting - - - - - Character - 🛌 - ShortCodes - - :sleeping_bed: - - - - Categories - - Person Resting - - - - - Character - 🧘‍♂️ - ShortCodes - - :lotus_position_man: - - - - Categories - - Person Resting - - - - - Character - 🛀 - ShortCodes - - :bath: - - - - Categories - - Person Resting - - - - - Character - 🧑‍🤝‍🧑 - ShortCodes - - :people_holding_hands: - - - - Categories - - Person - Family - - - - Character - 👫 - ShortCodes - - :couple: - - - - Categories - - Person - Family - - - - Character - 💏 - ShortCodes - - :couplekiss: - - - - Categories - - Person - Family - - - - Character - 👨‍❤️‍💋‍👨 - ShortCodes - - :couplekiss_man_man: - - - - Categories - - Person - Family - - - - Character - 💑 - ShortCodes - - :couple_with_heart: - - - - Categories - - Person - Family - - - - Character - 👨‍❤️‍👨 - ShortCodes - - :couple_with_heart_man_man: - - - - Categories - - Person - Family - - - - Character - 👪 - ShortCodes - - :family: - - - - Categories - - Person - Family - - - - Character - 👨‍👩‍👧 - ShortCodes - - :family_man_woman_girl: - - - - Categories - - Person - Family - - - - Character - 👨‍👩‍👦‍👦 - ShortCodes - - :family_man_woman_boy_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👨‍👦 - ShortCodes - - :family_man_man_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👨‍👧‍👦 - ShortCodes - - :family_man_man_girl_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👨‍👧‍👧 - ShortCodes - - :family_man_man_girl_girl: - - - - Categories - - Person - Family - - - - Character - 👩‍👩‍👧 - ShortCodes - - :family_woman_woman_girl: - - - - Categories - - Person - Family - - - - Character - 👩‍👩‍👦‍👦 - ShortCodes - - :family_woman_woman_boy_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👦 - ShortCodes - - :family_man_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👧 - ShortCodes - - :family_man_girl: - - - - Categories - - Person - Family - - - - Character - 👨‍👧‍👧 - ShortCodes - - :family_man_girl_girl: - - - - Categories - - Person - Family - - - - Character - 👩‍👦‍👦 - ShortCodes - - :family_woman_boy_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👧‍👦 - ShortCodes - - :family_woman_girl_boy: - - - - Categories - - Person - Family - - - - Character - 👭 - ShortCodes - - :two_women_holding_hands: - - - - Categories - - Person - Family - - - - Character - 👬 - ShortCodes - - :two_men_holding_hands: - - - - Categories - - Person - Family - - - - Character - 👩‍❤️‍💋‍👨 - ShortCodes - - :couplekiss_man_woman: - - - - Categories - - Person - Family - - - - Character - 👩‍❤️‍💋‍👩 - ShortCodes - - :couplekiss_woman_woman: - - - - Categories - - Person - Family - - - - Character - 👩‍❤️‍👨 - ShortCodes - - :couple_with_heart_woman_man: - - - - Categories - - Person - Family - - - - Character - 👩‍❤️‍👩 - ShortCodes - - :couple_with_heart_woman_woman: - - - - Categories - - Person - Family - - - - Character - 👨‍👩‍👦 - ShortCodes - - :family_man_woman_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👩‍👧‍👦 - ShortCodes - - :family_man_woman_girl_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👩‍👧‍👧 - ShortCodes - - :family_man_woman_girl_girl: - - - - Categories - - Person - Family - - - - Character - 👨‍👨‍👧 - ShortCodes - - :family_man_man_girl: - - - - Categories - - Person - Family - - - - Character - 👨‍👨‍👦‍👦 - ShortCodes - - :family_man_man_boy_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👩‍👦 - ShortCodes - - :family_woman_woman_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👩‍👧‍👦 - ShortCodes - - :family_woman_woman_girl_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👩‍👧‍👧 - ShortCodes - - :family_woman_woman_girl_girl: - - - - Categories - - Person - Family - - - - Character - 👨‍👦‍👦 - ShortCodes - - :family_man_boy_boy: - - - - Categories - - Person - Family - - - - Character - 👨‍👧‍👦 - ShortCodes - - :family_man_girl_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👦 - ShortCodes - - :family_woman_boy: - - - - Categories - - Person - Family - - - - Character - 👩‍👧 - ShortCodes - - :family_woman_girl: - - - - Categories - - Person - Family - - - - Character - 👩‍👧‍👧 - ShortCodes - - :family_woman_girl_girl: - - - - Categories - - Person - Family - - - - Character - 🗣️ - ShortCodes - - :speaking_head: - - - - Categories - - Person Symbol - - - - - Character - 👥 - ShortCodes - - :busts_in_silhouette: - - - - Categories - - Person Symbol - - - - - Character - 👣 - ShortCodes - - :footprints: - - - - Categories - - Person Symbol - - - - - Character - 👤 - ShortCodes - - :bust_in_silhouette: - - - - Categories - - Person Symbol - - - - - Character - 🫂 - ShortCodes - - :people_hugging: - - - - Categories - - Person Symbol - - - - - Character - 🐵 - ShortCodes - - :monkey_face: - - - - Categories - - Animal Mammal - - - - - Character - 🦍 - ShortCodes - - :gorilla: - - - - Categories - - Animal Mammal - - - - - Character - 🐶 - ShortCodes - - :dog: - - - - Categories - - Animal Mammal - - - - - Character - 🦮 - ShortCodes - - :guide_dog: - - - - Categories - - Animal Mammal - - - - - Character - 🐩 - ShortCodes - - :poodle: - - - - Categories - - Animal Mammal - - - - - Character - 🦊 - ShortCodes - - :fox_face: - - - - Categories - - Animal Mammal - - - - - Character - 🐱 - ShortCodes - - :cat: - - - - Categories - - Animal Mammal - - - - - Character - 🐈‍⬛ - ShortCodes - - :black_cat: - - - - Categories - - Animal Mammal - - - - - Character - 🐯 - ShortCodes - - :tiger: - - - - Categories - - Animal Mammal - - - - - Character - 🐆 - ShortCodes - - :leopard: - - - - Categories - - Animal Mammal - - - - - Character - 🐎 - ShortCodes - - :racehorse: - - - - Categories - - Animal Mammal - - - - - Character - 🦓 - ShortCodes - - :zebra: - - - - Categories - - Animal Mammal - - - - - Character - 🦬 - ShortCodes - - :bison: - - - - Categories - - Animal Mammal - - - - - Character - 🐂 - ShortCodes - - :ox: - - - - Categories - - Animal Mammal - - - - - Character - 🐄 - ShortCodes - - :cow2: - - - - Categories - - Animal Mammal - - - - - Character - 🐖 - ShortCodes - - :pig2: - - - - Categories - - Animal Mammal - - - - - Character - 🐽 - ShortCodes - - :pig_nose: - - - - Categories - - Animal Mammal - - - - - Character - 🐑 - ShortCodes - - :sheep: - - - - Categories - - Animal Mammal - - - - - Character - 🐪 - ShortCodes - - :dromedary_camel: - - - - Categories - - Animal Mammal - - - - - Character - 🦙 - ShortCodes - - :llama: - - - - Categories - - Animal Mammal - - - - - Character - 🐘 - ShortCodes - - :elephant: - - - - Categories - - Animal Mammal - - - - - Character - 🦏 - ShortCodes - - :rhinoceros: - - - - Categories - - Animal Mammal - - - - - Character - 🐭 - ShortCodes - - :mouse: - - - - Categories - - Animal Mammal - - - - - Character - 🐀 - ShortCodes - - :rat: - - - - Categories - - Animal Mammal - - - - - Character - 🐰 - ShortCodes - - :rabbit: - - - - Categories - - Animal Mammal - - - - - Character - 🐿️ - ShortCodes - - :chipmunk: - - - - Categories - - Animal Mammal - - - - - Character - 🦔 - ShortCodes - - :hedgehog: - - - - Categories - - Animal Mammal - - - - - Character - 🐻 - ShortCodes - - :bear: - - - - Categories - - Animal Mammal - - - - - Character - 🐨 - ShortCodes - - :koala: - - - - Categories - - Animal Mammal - - - - - Character - 🦥 - ShortCodes - - :sloth: - - - - Categories - - Animal Mammal - - - - - Character - 🦨 - ShortCodes - - :skunk: - - - - Categories - - Animal Mammal - - - - - Character - 🦡 - ShortCodes - - :badger: - - - - Categories - - Animal Mammal - - - - - Character - 🐒 - ShortCodes - - :monkey: - - - - Categories - - Animal Mammal - - - - - Character - 🦧 - ShortCodes - - :orangutan: - - - - Categories - - Animal Mammal - - - - - Character - 🐕 - ShortCodes - - :dog2: - - - - Categories - - Animal Mammal - - - - - Character - 🐕‍🦺 - ShortCodes - - :service_dog: - - - - Categories - - Animal Mammal - - - - - Character - 🐺 - ShortCodes - - :wolf: - - - - Categories - - Animal Mammal - - - - - Character - 🦝 - ShortCodes - - :raccoon: - - - - Categories - - Animal Mammal - - - - - Character - 🐈 - ShortCodes - - :cat2: - - - - Categories - - Animal Mammal - - - - - Character - 🦁 - ShortCodes - - :lion: - - - - Categories - - Animal Mammal - - - - - Character - 🐅 - ShortCodes - - :tiger2: - - - - Categories - - Animal Mammal - - - - - Character - 🐴 - ShortCodes - - :horse: - - - - Categories - - Animal Mammal - - - - - Character - 🦄 - ShortCodes - - :unicorn: - - - - Categories - - Animal Mammal - - - - - Character - 🦌 - ShortCodes - - :deer: - - - - Categories - - Animal Mammal - - - - - Character - 🐮 - ShortCodes - - :cow: - - - - Categories - - Animal Mammal - - - - - Character - 🐃 - ShortCodes - - :water_buffalo: - - - - Categories - - Animal Mammal - - - - - Character - 🐷 - ShortCodes - - :pig: - - - - Categories - - Animal Mammal - - - - - Character - 🐗 - ShortCodes - - :boar: - - - - Categories - - Animal Mammal - - - - - Character - 🐏 - ShortCodes - - :ram: - - - - Categories - - Animal Mammal - - - - - Character - 🐐 - ShortCodes - - :goat: - - - - Categories - - Animal Mammal - - - - - Character - 🐫 - ShortCodes - - :camel: - - - - Categories - - Animal Mammal - - - - - Character - 🦒 - ShortCodes - - :giraffe: - - - - Categories - - Animal Mammal - - - - - Character - 🦣 - ShortCodes - - :mammoth: - - - - Categories - - Animal Mammal - - - - - Character - 🦛 - ShortCodes - - :hippopotamus: - - - - Categories - - Animal Mammal - - - - - Character - 🐁 - ShortCodes - - :mouse2: - - - - Categories - - Animal Mammal - - - - - Character - 🐹 - ShortCodes - - :hamster: - - - - Categories - - Animal Mammal - - - - - Character - 🐇 - ShortCodes - - :rabbit2: - - - - Categories - - Animal Mammal - - - - - Character - 🦫 - ShortCodes - - :beaver: - - - - Categories - - Animal Mammal - - - - - Character - 🦇 - ShortCodes - - :bat: - - - - Categories - - Animal Mammal - - - - - Character - 🐻‍❄️ - ShortCodes - - :polar_bear: - - - - Categories - - Animal Mammal - - - - - Character - 🐼 - ShortCodes - - :panda_face: - - - - Categories - - Animal Mammal - - - - - Character - 🦦 - ShortCodes - - :otter: - - - - Categories - - Animal Mammal - - - - - Character - 🦘 - ShortCodes - - :kangaroo: - - - - Categories - - Animal Mammal - - - - - Character - 🐾 - ShortCodes - - :feet: - :paw_prints: - - - Categories - - Animal Mammal - - - - - Character - 🦃 - ShortCodes - - :turkey: - - - - Categories - - Animal Bird - - - - - Character - 🐓 - ShortCodes - - :rooster: - - - - Categories - - Animal Bird - - - - - Character - 🐤 - ShortCodes - - :baby_chick: - - - - Categories - - Animal Bird - - - - - Character - 🐦 - ShortCodes - - :bird: - - - - Categories - - Animal Bird - - - - - Character - 🕊️ - ShortCodes - - :dove: - - - - Categories - - Animal Bird - - - - - Character - 🦆 - ShortCodes - - :duck: - - - - Categories - - Animal Bird - - - - - Character - 🦉 - ShortCodes - - :owl: - - - - Categories - - Animal Bird - - - - - Character - 🪶 - ShortCodes - - :feather: - - - - Categories - - Animal Bird - - - - - Character - 🦚 - ShortCodes - - :peacock: - - - - Categories - - Animal Bird - - - - - Character - 🐔 - ShortCodes - - :chicken: - - - - Categories - - Animal Bird - - - - - Character - 🐣 - ShortCodes - - :hatching_chick: - - - - Categories - - Animal Bird - - - - - Character - 🐥 - ShortCodes - - :hatched_chick: - - - - Categories - - Animal Bird - - - - - Character - 🐧 - ShortCodes - - :penguin: - - - - Categories - - Animal Bird - - - - - Character - 🦅 - ShortCodes - - :eagle: - - - - Categories - - Animal Bird - - - - - Character - 🦢 - ShortCodes - - :swan: - - - - Categories - - Animal Bird - - - - - Character - 🦤 - ShortCodes - - :dodo: - - - - Categories - - Animal Bird - - - - - Character - 🦩 - ShortCodes - - :flamingo: - - - - Categories - - Animal Bird - - - - - Character - 🦜 - ShortCodes - - :parrot: - - - - Categories - - Animal Bird - - - - - Character - 🐸 - ShortCodes - - :frog: - - - - Categories - - Animal Amphibian - - - - - Character - 🐊 - ShortCodes - - :crocodile: - - - - Categories - - Animal Reptile - - - - - Character - 🦎 - ShortCodes - - :lizard: - - - - Categories - - Animal Reptile - - - - - Character - 🐲 - ShortCodes - - :dragon_face: - - - - Categories - - Animal Reptile - - - - - Character - 🦕 - ShortCodes - - :sauropod: - - - - Categories - - Animal Reptile - - - - - Character - 🐢 - ShortCodes - - :turtle: - - - - Categories - - Animal Reptile - - - - - Character - 🐍 - ShortCodes - - :snake: - - - - Categories - - Animal Reptile - - - - - Character - 🐉 - ShortCodes - - :dragon: - - - - Categories - - Animal Reptile - - - - - Character - 🦖 - ShortCodes - - :t-rex: - - - - Categories - - Animal Reptile - - - - - Character - 🐳 - ShortCodes - - :whale: - - - - Categories - - Animal Marine - - - - - Character - 🐬 - ShortCodes - - :dolphin: - :flipper: - - - Categories - - Animal Marine - - - - - Character - 🐟 - ShortCodes - - :fish: - - - - Categories - - Animal Marine - - - - - Character - 🐡 - ShortCodes - - :blowfish: - - - - Categories - - Animal Marine - - - - - Character - 🐙 - ShortCodes - - :octopus: - - - - Categories - - Animal Marine - - - - - Character - 🐋 - ShortCodes - - :whale2: - - - - Categories - - Animal Marine - - - - - Character - 🦭 - ShortCodes - - :seal: - - - - Categories - - Animal Marine - - - - - Character - 🐠 - ShortCodes - - :tropical_fish: - - - - Categories - - Animal Marine - - - - - Character - 🦈 - ShortCodes - - :shark: - - - - Categories - - Animal Marine - - - - - Character - 🐚 - ShortCodes - - :shell: - - - - Categories - - Animal Marine - - - - - Character - 🐌 - ShortCodes - - :snail: - - - - Categories - - Animal Bug - - - - - Character - 🐛 - ShortCodes - - :bug: - - - - Categories - - Animal Bug - - - - - Character - 🐝 - ShortCodes - - :bee: - :honeybee: - - - Categories - - Animal Bug - - - - - Character - 🐞 - ShortCodes - - :lady_beetle: - - - - Categories - - Animal Bug - - - - - Character - 🪳 - ShortCodes - - :cockroach: - - - - Categories - - Animal Bug - - - - - Character - 🕸️ - ShortCodes - - :spider_web: - - - - Categories - - Animal Bug - - - - - Character - 🦟 - ShortCodes - - :mosquito: - - - - Categories - - Animal Bug - - - - - Character - 🪱 - ShortCodes - - :worm: - - - - Categories - - Animal Bug - - - - - Character - 🦋 - ShortCodes - - :butterfly: - - - - Categories - - Animal Bug - - - - - Character - 🐜 - ShortCodes - - :ant: - - - - Categories - - Animal Bug - - - - - Character - 🪲 - ShortCodes - - :beetle: - - - - Categories - - Animal Bug - - - - - Character - 🦗 - ShortCodes - - :cricket: - - - - Categories - - Animal Bug - - - - - Character - 🕷️ - ShortCodes - - :spider: - - - - Categories - - Animal Bug - - - - - Character - 🦂 - ShortCodes - - :scorpion: - - - - Categories - - Animal Bug - - - - - Character - 🪰 - ShortCodes - - :fly: - - - - Categories - - Animal Bug - - - - - Character - 🦠 - ShortCodes - - :microbe: - - - - Categories - - Animal Bug - - - - - Character - 💐 - ShortCodes - - :bouquet: - - - - Categories - - Plant Flower - - - - - Character - 💮 - ShortCodes - - :white_flower: - - - - Categories - - Plant Flower - - - - - Character - 🌹 - ShortCodes - - :rose: - - - - Categories - - Plant Flower - - - - - Character - 🌺 - ShortCodes - - :hibiscus: - - - - Categories - - Plant Flower - - - - - Character - 🌼 - ShortCodes - - :blossom: - - - - Categories - - Plant Flower - - - - - Character - 🌸 - ShortCodes - - :cherry_blossom: - - - - Categories - - Plant Flower - - - - - Character - 🏵️ - ShortCodes - - :rosette: - - - - Categories - - Plant Flower - - - - - Character - 🥀 - ShortCodes - - :wilted_flower: - - - - Categories - - Plant Flower - - - - - Character - 🌻 - ShortCodes - - :sunflower: - - - - Categories - - Plant Flower - - - - - Character - 🌷 - ShortCodes - - :tulip: - - - - Categories - - Plant Flower - - - - - Character - 🌱 - ShortCodes - - :seedling: - - - - Categories - - Plant Other - - - - - Character - 🌲 - ShortCodes - - :evergreen_tree: - - - - Categories - - Plant Other - - - - - Character - 🌴 - ShortCodes - - :palm_tree: - - - - Categories - - Plant Other - - - - - Character - 🌾 - ShortCodes - - :ear_of_rice: - - - - Categories - - Plant Other - - - - - Character - ☘️ - ShortCodes - - :shamrock: - - - - Categories - - Plant Other - - - - - Character - 🍁 - ShortCodes - - :maple_leaf: - - - - Categories - - Plant Other - - - - - Character - 🍃 - ShortCodes - - :leaves: - - - - Categories - - Plant Other - - - - - Character - 🪴 - ShortCodes - - :potted_plant: - - - - Categories - - Plant Other - - - - - Character - 🌳 - ShortCodes - - :deciduous_tree: - - - - Categories - - Plant Other - - - - - Character - 🌵 - ShortCodes - - :cactus: - - - - Categories - - Plant Other - - - - - Character - 🌿 - ShortCodes - - :herb: - - - - Categories - - Plant Other - - - - - Character - 🍀 - ShortCodes - - :four_leaf_clover: - - - - Categories - - Plant Other - - - - - Character - 🍂 - ShortCodes - - :fallen_leaf: - - - - Categories - - Plant Other - - - - - Character - 🍇 - ShortCodes - - :grapes: - - - - Categories - - Food Fruit - - - - - Character - 🍉 - ShortCodes - - :watermelon: - - - - Categories - - Food Fruit - - - - - Character - 🍋 - ShortCodes - - :lemon: - - - - Categories - - Food Fruit - - - - - Character - 🍍 - ShortCodes - - :pineapple: - - - - Categories - - Food Fruit - - - - - Character - 🍎 - ShortCodes - - :apple: - - - - Categories - - Food Fruit - - - - - Character - 🍐 - ShortCodes - - :pear: - - - - Categories - - Food Fruit - - - - - Character - 🍒 - ShortCodes - - :cherries: - - - - Categories - - Food Fruit - - - - - Character - 🫐 - ShortCodes - - :blueberries: - - - - Categories - - Food Fruit - - - - - Character - 🍅 - ShortCodes - - :tomato: - - - - Categories - - Food Fruit - - - - - Character - 🥥 - ShortCodes - - :coconut: - - - - Categories - - Food Fruit - - - - - Character - 🍈 - ShortCodes - - :melon: - - - - Categories - - Food Fruit - - - - - Character - 🍊 - ShortCodes - - :mandarin: - :orange: - :tangerine: - - Categories - - Food Fruit - - - - - Character - 🍌 - ShortCodes - - :banana: - - - - Categories - - Food Fruit - - - - - Character - 🥭 - ShortCodes - - :mango: - - - - Categories - - Food Fruit - - - - - Character - 🍏 - ShortCodes - - :green_apple: - - - - Categories - - Food Fruit - - - - - Character - 🍑 - ShortCodes - - :peach: - - - - Categories - - Food Fruit - - - - - Character - 🍓 - ShortCodes - - :strawberry: - - - - Categories - - Food Fruit - - - - - Character - 🥝 - ShortCodes - - :kiwi_fruit: - - - - Categories - - Food Fruit - - - - - Character - 🫒 - ShortCodes - - :olive: - - - - Categories - - Food Fruit - - - - - Character - 🥑 - ShortCodes - - :avocado: - - - - Categories - - Food Vegetable - - - - - Character - 🥔 - ShortCodes - - :potato: - - - - Categories - - Food Vegetable - - - - - Character - 🌽 - ShortCodes - - :corn: - - - - Categories - - Food Vegetable - - - - - Character - 🫑 - ShortCodes - - :bell_pepper: - - - - Categories - - Food Vegetable - - - - - Character - 🥬 - ShortCodes - - :leafy_green: - - - - Categories - - Food Vegetable - - - - - Character - 🧄 - ShortCodes - - :garlic: - - - - Categories - - Food Vegetable - - - - - Character - 🍄 - ShortCodes - - :mushroom: - - - - Categories - - Food Vegetable - - - - - Character - 🌰 - ShortCodes - - :chestnut: - - - - Categories - - Food Vegetable - - - - - Character - 🍆 - ShortCodes - - :eggplant: - - - - Categories - - Food Vegetable - - - - - Character - 🥕 - ShortCodes - - :carrot: - - - - Categories - - Food Vegetable - - - - - Character - 🌶️ - ShortCodes - - :hot_pepper: - - - - Categories - - Food Vegetable - - - - - Character - 🥒 - ShortCodes - - :cucumber: - - - - Categories - - Food Vegetable - - - - - Character - 🥦 - ShortCodes - - :broccoli: - - - - Categories - - Food Vegetable - - - - - Character - 🧅 - ShortCodes - - :onion: - - - - Categories - - Food Vegetable - - - - - Character - 🥜 - ShortCodes - - :peanuts: - - - - Categories - - Food Vegetable - - - - - Character - 🍞 - ShortCodes - - :bread: - - - - Categories - - Food Prepared - - - - - Character - 🥖 - ShortCodes - - :baguette_bread: - - - - Categories - - Food Prepared - - - - - Character - 🥨 - ShortCodes - - :pretzel: - - - - Categories - - Food Prepared - - - - - Character - 🥞 - ShortCodes - - :pancakes: - - - - Categories - - Food Prepared - - - - - Character - 🧀 - ShortCodes - - :cheese: - - - - Categories - - Food Prepared - - - - - Character - 🍗 - ShortCodes - - :poultry_leg: - - - - Categories - - Food Prepared - - - - - Character - 🥓 - ShortCodes - - :bacon: - - - - Categories - - Food Prepared - - - - - Character - 🍟 - ShortCodes - - :fries: - - - - Categories - - Food Prepared - - - - - Character - 🌭 - ShortCodes - - :hotdog: - - - - Categories - - Food Prepared - - - - - Character - 🌮 - ShortCodes - - :taco: - - - - Categories - - Food Prepared - - - - - Character - 🫔 - ShortCodes - - :tamale: - - - - Categories - - Food Prepared - - - - - Character - 🧆 - ShortCodes - - :falafel: - - - - Categories - - Food Prepared - - - - - Character - 🍳 - ShortCodes - - :fried_egg: - - - - Categories - - Food Prepared - - - - - Character - 🍲 - ShortCodes - - :stew: - - - - Categories - - Food Prepared - - - - - Character - 🥣 - ShortCodes - - :bowl_with_spoon: - - - - Categories - - Food Prepared - - - - - Character - 🍿 - ShortCodes - - :popcorn: - - - - Categories - - Food Prepared - - - - - Character - 🧂 - ShortCodes - - :salt: - - - - Categories - - Food Prepared - - - - - Character - 🥐 - ShortCodes - - :croissant: - - - - Categories - - Food Prepared - - - - - Character - 🫓 - ShortCodes - - :flatbread: - - - - Categories - - Food Prepared - - - - - Character - 🥯 - ShortCodes - - :bagel: - - - - Categories - - Food Prepared - - - - - Character - 🧇 - ShortCodes - - :waffle: - - - - Categories - - Food Prepared - - - - - Character - 🍖 - ShortCodes - - :meat_on_bone: - - - - Categories - - Food Prepared - - - - - Character - 🥩 - ShortCodes - - :cut_of_meat: - - - - Categories - - Food Prepared - - - - - Character - 🍔 - ShortCodes - - :hamburger: - - - - Categories - - Food Prepared - - - - - Character - 🍕 - ShortCodes - - :pizza: - - - - Categories - - Food Prepared - - - - - Character - 🥪 - ShortCodes - - :sandwich: - - - - Categories - - Food Prepared - - - - - Character - 🌯 - ShortCodes - - :burrito: - - - - Categories - - Food Prepared - - - - - Character - 🥙 - ShortCodes - - :stuffed_flatbread: - - - - Categories - - Food Prepared - - - - - Character - 🥚 - ShortCodes - - :egg: - - - - Categories - - Food Prepared - - - - - Character - 🥘 - ShortCodes - - :shallow_pan_of_food: - - - - Categories - - Food Prepared - - - - - Character - 🫕 - ShortCodes - - :fondue: - - - - Categories - - Food Prepared - - - - - Character - 🥗 - ShortCodes - - :green_salad: - - - - Categories - - Food Prepared - - - - - Character - 🧈 - ShortCodes - - :butter: - - - - Categories - - Food Prepared - - - - - Character - 🥫 - ShortCodes - - :canned_food: - - - - Categories - - Food Prepared - - - - - Character - 🍱 - ShortCodes - - :bento: - - - - Categories - - Food Asian - - - - - Character - 🍙 - ShortCodes - - :rice_ball: - - - - Categories - - Food Asian - - - - - Character - 🍛 - ShortCodes - - :curry: - - - - Categories - - Food Asian - - - - - Character - 🍝 - ShortCodes - - :spaghetti: - - - - Categories - - Food Asian - - - - - Character - 🍢 - ShortCodes - - :oden: - - - - Categories - - Food Asian - - - - - Character - 🍤 - ShortCodes - - :fried_shrimp: - - - - Categories - - Food Asian - - - - - Character - 🥮 - ShortCodes - - :moon_cake: - - - - Categories - - Food Asian - - - - - Character - 🥟 - ShortCodes - - :dumpling: - - - - Categories - - Food Asian - - - - - Character - 🥡 - ShortCodes - - :takeout_box: - - - - Categories - - Food Asian - - - - - Character - 🍘 - ShortCodes - - :rice_cracker: - - - - Categories - - Food Asian - - - - - Character - 🍚 - ShortCodes - - :rice: - - - - Categories - - Food Asian - - - - - Character - 🍜 - ShortCodes - - :ramen: - - - - Categories - - Food Asian - - - - - Character - 🍠 - ShortCodes - - :sweet_potato: - - - - Categories - - Food Asian - - - - - Character - 🍣 - ShortCodes - - :sushi: - - - - Categories - - Food Asian - - - - - Character - 🍥 - ShortCodes - - :fish_cake: - - - - Categories - - Food Asian - - - - - Character - 🍡 - ShortCodes - - :dango: - - - - Categories - - Food Asian - - - - - Character - 🥠 - ShortCodes - - :fortune_cookie: - - - - Categories - - Food Asian - - - - - -- cgit v1.2.3 From 93717f14ca57e63f34493bf392fe0cf53fa8573b Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 10 Apr 2023 16:58:55 -0700 Subject: SL-19078: add filename of emoji/shortcode XML files to ignore list so Viewer checkouts don't appear to be polluted with files from 3p libs --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ab5f43b352..23a7f0cb4b 100755 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ indra/newview/teleport_history.txt indra/newview/typed_locations.txt indra/newview/vivox-runtime indra/newview/skins/default/html/common/equirectangular/js +emoji_characters.xml indra/server-linux-* indra/temp indra/test/linden_file.dat -- cgit v1.2.3 From 351faf283a854fe62a328ecf007e0d0d079e7355 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 10 Apr 2023 16:59:45 -0700 Subject: SL-19078: pull in 3p versions of the emoji/shortcode mapping XML files - 1 for each language that the viewer supports except sadly, Turkish which is not available so far --- autobuild.xml | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/autobuild.xml b/autobuild.xml index 73e10769a5..11057d2b48 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -527,6 +527,62 @@ version 1.12.4.202209142021_91.1.21_g9dd45fe_chromium-91.0.4472.114 + emoji_shortcodes + + canonical_repo + https://github.com/secondlife/3p-emoji-shortcodes + copyright + Copyright 2017-2019 Miles Johnson. + description + Emoji shortcodes + license + MIT + license_file + LICENSES/emojibase-license.txt + name + emoji_shortcodes + platforms + + darwin64 + + archive + + hash + 7ac35da9b1b5c9a05954edeef3fe8e54 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113242/980233/emoji_shortcodes-6.1.0.579438-darwin64-579438.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + 3c5c4c7e3bb2eeef61e605b6690a63f3 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113244/980245/emoji_shortcodes-6.1.0.579438-windows-579438.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 087ce7e6d93dcd88b477b10d8e1ab259 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113243/980244/emoji_shortcodes-6.1.0.579438-windows64-579438.tar.bz2 + + name + windows64 + + + version + 6.1.0.579438 + expat copyright -- cgit v1.2.3 From 12e044755e9d9cf886ceb63ef7af3010303d31c4 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Mon, 10 Apr 2023 17:01:10 -0700 Subject: SL-19078: changes to autobuild to unpack the emoji/shortcode 3p library and then copy the XML files to the right place in the Viewer dev tree (indra/newview/skins/xui/*/emoji_characters.xml) --- indra/cmake/ViewerMiscLibs.cmake | 1 + indra/newview/CMakeLists.txt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 7eed456833..cae68fbc11 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -20,3 +20,4 @@ use_prebuilt_binary(slvoice) use_prebuilt_binary(nanosvg) use_prebuilt_binary(viewer-fonts) +use_prebuilt_binary(emoji_shortcodes) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b63100fc2b..ab0c60a402 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1917,6 +1917,22 @@ file(GLOB FONT_FILE_GLOB_LIST ) file(COPY ${FONT_FILE_GLOB_LIST} DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/fonts") +# Copy over the Emoji/shortcodes mapping XML files (and create dependency +# if they are changed, CMake will run again and copy over new versions) +message("Copying Emoji/shortcode mappings") +set(emoji_mapping_src_folder ${AUTOBUILD_INSTALL_DIR}/xui) +set(emoji_mapping_dst_folder ${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui) + +# Note Turkey is missing from this set (not available in Emoji package yet) +set(country_codes "da;de;en;es;fr;it;ja;pl;pt;ru;zh") +foreach(elem ${country_codes}) + set(emoji_mapping_src_file + "${emoji_mapping_src_folder}/${elem}/emoji_characters.xml") + set(emoji_mapping_dst_file + "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml") + configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY) +endforeach() + if (LINUX) set(product SecondLife-${ARCH}-${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}) -- cgit v1.2.3 From 978a5b66f29b870083bfa41c7594dcd48d4b0961 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Tue, 11 Apr 2023 11:26:37 -0700 Subject: SL-19139 Credits for Kitty - update the contributors.txt file with a mention of Kitty's large contribution. (No externally facing JIRA that I can find) --- doc/contributions.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/contributions.txt b/doc/contributions.txt index fa40bd327a..8afe922cbe 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -884,6 +884,7 @@ Kitty Barnett STORM-2149 MAINT-7581 MAINT-7081 + DRTVWR-489 (Internal JIRA that tracks Kitty's sizeable, epic contribution: support for Emoji characters in the Viewer [April 2023]) Kolor Fall Komiko Okamoto Korvel Noh -- cgit v1.2.3 From 602d7ea1387113aa2a36b80e61eb9b52c23698e8 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Tue, 11 Apr 2023 14:18:23 -0700 Subject: SL-19368: update copyright information in Viewer Fonts description that eventually ends up in the Credits panel of Help->About - new 3p viewer fonts package --- autobuild.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 11057d2b48..d454e0f93a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2865,7 +2865,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors viewer-fonts copyright - Copyright various + Copyright 2016-2022 Brad Erickson CC-BY-4.0/MIT, Copyright 2016-2022 Twitter, Inc. CC-BY-4.0, Copyright 2013 Joe Loughry and Terence Eden MIT description Viewer fonts license @@ -2881,9 +2881,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - d47e0ed35dad11f0a5dc821758e2ae46 + 6041bbd4001e3951f96ac3456c7906da url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109658/953998/viewer_fonts-1.577782-darwin64-577782.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113314/980656/viewer_fonts-1.579464-darwin64-579464.tar.bz2 name darwin64 @@ -2893,9 +2893,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 7dc39bb7cd8133d251eaff9c9e16bdfd + 19c48abc168a1c4e0f0ec6d471b2e1bd url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109660/954010/viewer_fonts-1.577782-windows-577782.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113308/980632/viewer_fonts-1.579464-windows-579464.tar.bz2 name windows @@ -2905,16 +2905,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 86134368c16c7d685156403e15a7cbcd + 1745ba6eec0108250446fe01d4aa065c url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/109659/954009/viewer_fonts-1.577782-windows64-577782.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113307/980631/viewer_fonts-1.579464-windows64-579464.tar.bz2 name windows64 version - 1.577782 + 1.579464 viewer-manager -- cgit v1.2.3 From 638a45cbb1aeb228a0cf910571f1af8759c003a9 Mon Sep 17 00:00:00 2001 From: Callum Prentice Date: Thu, 13 Apr 2023 15:44:40 -0700 Subject: DRTVWR-489: Pull in updated version of BugSplat to work around their change in TLS on 2023-04-11 --- autobuild.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index d454e0f93a..ac153ed5e7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -184,9 +184,9 @@ archive hash - 7b4aceaed511d44c4d1354b2162b59c7 + 878eaf654926e400d67680100cb780c9 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107398/936936/bugsplat-1.0.7.576560-darwin64-576560.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113512/981912/bugsplat-1.0.7.579546-darwin64-579546.tar.bz2 name darwin64 @@ -196,9 +196,9 @@ archive hash - 53918c7c74b943cdc0bb90caf9657a84 + ad306307016d6ac6f86823d7292847ff url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107400/936949/bugsplat-4.0.3.0.576560-windows-576560.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113514/981926/bugsplat-4.0.3.0.579546-windows-579546.tar.bz2 name windows @@ -208,16 +208,16 @@ archive hash - 19d6a55db101f02e7eb531daf3e8cfd1 + 8d237d16a0c038649e17a64ba8c9f2b7 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/107401/936948/bugsplat-.576560-windows64-576560.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/113517/981927/bugsplat-4.0.3.0.579546-windows64-579546.tar.bz2 name windows64 version - 4.0.3.0.576560 + 4.0.3.0.579546 colladadom -- cgit v1.2.3 From ff7ebf08922293c1623b7bdb8c9923c14fc9db48 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Fri, 14 Apr 2023 07:44:56 +0200 Subject: SL-19575 Create emoji gallery access icon --- indra/llui/llemojidictionary.h | 2 + indra/llui/llemojihelper.cpp | 10 +- indra/llui/llemojihelper.h | 6 +- indra/llui/llscrolllistctrl.cpp | 2 +- indra/llui/lltexteditor.cpp | 22 ++-- indra/llui/lltexteditor.h | 3 +- indra/newview/CMakeLists.txt | 2 + indra/newview/llfloateremojipicker.cpp | 143 +++++++++++++++++++++ indra/newview/llfloateremojipicker.h | 59 +++++++++ indra/newview/llfloaterimsessiontab.cpp | 30 ++++- indra/newview/llfloaterimsessiontab.h | 4 + indra/newview/llviewerfloaterreg.cpp | 20 +-- .../default/textures/icons/emoji_picker_icon.png | Bin 0 -> 316 bytes indra/newview/skins/default/textures/textures.xml | 5 +- .../skins/default/xui/en/floater_emoji_picker.xml | 39 ++++++ .../skins/default/xui/en/floater_im_session.xml | 14 +- indra/newview/skins/default/xui/en/strings.xml | 10 +- 17 files changed, 335 insertions(+), 36 deletions(-) create mode 100644 indra/newview/llfloateremojipicker.cpp create mode 100644 indra/newview/llfloateremojipicker.h create mode 100644 indra/newview/skins/default/textures/icons/emoji_picker_icon.png create mode 100644 indra/newview/skins/default/xui/en/floater_emoji_picker.xml diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h index 46a61f1cd7..adc22ced58 100644 --- a/indra/llui/llemojidictionary.h +++ b/indra/llui/llemojidictionary.h @@ -61,6 +61,8 @@ public: const LLEmojiDescriptor* getDescriptorFromShortCode(const std::string& short_code) const; std::string getNameFromEmoji(llwchar ch) const; + const std::map& getEmoji2Descr() const { return mEmoji2Descr; } + private: void addEmoji(LLEmojiDescriptor&& descr); diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index 1e4c19a183..fb660a9e5b 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -82,12 +82,12 @@ bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S return isShortCode; } -void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function cb) +void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function cb) { // Commit immediately if the user already typed a full shortcode if (const auto* emojiDescrp = LLEmojiDictionary::instance().getDescriptorFromShortCode(short_code)) { - cb(LLWString(1, emojiDescrp->Character)); + cb(emojiDescrp->Character); hideHelper(); return; } @@ -96,7 +96,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c { LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER); mHelperHandle = pHelperFloater->getHandle(); - mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())); }, std::placeholders::_2)); + mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2)); } setHostCtrl(hostctrl_p); mEmojiCommitCb = cb; @@ -135,11 +135,11 @@ bool LLEmojiHelper::handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask) return mHelperHandle.get()->handleKey(key, mask, true); } -void LLEmojiHelper::onCommitEmoji(const LLWString& wstr) +void LLEmojiHelper::onCommitEmoji(llwchar emoji) { if (!mHostHandle.isDead() && mEmojiCommitCb) { - mEmojiCommitCb(wstr); + mEmojiCommitCb(emoji); } } diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h index 63f5c640c9..58f68d12a4 100644 --- a/indra/llui/llemojihelper.h +++ b/indra/llui/llemojihelper.h @@ -44,12 +44,12 @@ public: std::string getToolTip(llwchar ch) const; bool isActive(const LLUICtrl* ctrl_p) const; static bool isCursorInEmojiCode(const LLWString& wtext, S32 cursor_pos, S32* short_code_pos_p = nullptr); - void showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function commit_cb); + void showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function commit_cb); void hideHelper(const LLUICtrl* ctrl_p = nullptr); // Eventing bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); - void onCommitEmoji(const LLWString& wstr); + void onCommitEmoji(llwchar emoji); protected: LLUICtrl* getHostCtrl() const { return mHostHandle.get(); } @@ -60,5 +60,5 @@ private: LLHandle mHelperHandle; boost::signals2::connection mHostCtrlFocusLostConn; boost::signals2::connection mHelperCommitConn; - std::function mEmojiCommitCb; + std::function mEmojiCommitCb; }; diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 219667f766..2a6e8a6b76 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -411,7 +411,7 @@ void LLScrollListCtrl::clearRows() LLScrollListItem* LLScrollListCtrl::getFirstSelected() const { item_list::const_iterator iter; - for(iter = mItemList.begin(); iter != mItemList.end(); iter++) + for (iter = mItemList.begin(); iter != mItemList.end(); iter++) { LLScrollListItem* item = *iter; if (item->getSelected()) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index a85ac2a5a3..95d8b666ab 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -680,18 +680,24 @@ void LLTextEditor::selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_p endSelection(); } -void LLTextEditor::handleEmojiCommit(const LLWString& wstr) +void LLTextEditor::insertEmoji(llwchar emoji) { - LLWString wtext(getWText()); S32 shortCodePos; - if (LLEmojiHelper::isCursorInEmojiCode(wtext, mCursorPos, &shortCodePos)) + auto styleParams = LLStyle::Params(); + styleParams.font = LLFontGL::getFontEmoji(); + auto segment = new LLEmojiTextSegment(new LLStyle(styleParams), mCursorPos, mCursorPos + 1, *this); + insert(mCursorPos, LLWString(1, emoji), false, segment); + setCursorPos(mCursorPos + 1); +} + +void LLTextEditor::handleEmojiCommit(llwchar emoji) +{ + S32 shortCodePos; + if (LLEmojiHelper::isCursorInEmojiCode(getWText(), mCursorPos, &shortCodePos)) { remove(shortCodePos, mCursorPos - shortCodePos, true); + setCursorPos(shortCodePos); - auto styleParams = LLStyle::Params(); - styleParams.font = LLFontGL::getFontEmoji(); - insert(shortCodePos, wstr, false, new LLEmojiTextSegment(new LLStyle(styleParams), shortCodePos, shortCodePos + wstr.size(), *this)); - - setCursorPos(shortCodePos + 1); + insertEmoji(emoji); } } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index dabd0460c6..f830732cb8 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -92,7 +92,8 @@ public: static S32 spacesPerTab(); - void handleEmojiCommit(const LLWString& wstr); + void insertEmoji(llwchar emoji); + void handleEmojiCommit(llwchar emoji); // mousehandler overrides virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index ab0c60a402..1f8b937965 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -205,6 +205,7 @@ set(viewer_SOURCE_FILES llfloaterdisplayname.cpp llfloatereditenvironmentbase.cpp llfloatereditextdaycycle.cpp + llfloateremojipicker.cpp llfloaterenvironmentadjust.cpp llfloaterevent.cpp llfloaterexperiencepicker.cpp @@ -845,6 +846,7 @@ set(viewer_HEADER_FILES llfloaterdisplayname.h llfloatereditenvironmentbase.h llfloatereditextdaycycle.h + llfloateremojipicker.h llfloaterenvironmentadjust.h llfloaterevent.h llfloaterexperiencepicker.h diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp new file mode 100644 index 0000000000..c828a95a59 --- /dev/null +++ b/indra/newview/llfloateremojipicker.cpp @@ -0,0 +1,143 @@ +/** + * @file llfloateremojipicker.cpp + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llfloateremojipicker.h" + +#include "llfloaterreg.h" +#include "llscrolllistctrl.h" +#include "llscrolllistitem.h" +#include "llemojidictionary.h" + +class LLEmojiScrollListItem : public LLScrollListItem +{ +public: + LLEmojiScrollListItem(const llwchar emoji, const LLScrollListItem::Params& params) + : LLScrollListItem(params) + , mEmoji(emoji) + { + } + + llwchar getEmoji() const { return mEmoji; } + + virtual void draw(const LLRect& rect, + const LLColor4& fg_color, + const LLColor4& hover_color, // highlight/hover selection of whole item or cell + const LLColor4& select_color, // highlight/hover selection of whole item or cell + const LLColor4& highlight_color, // highlights contents of cells (ex: text) + S32 column_padding) override + { + LLScrollListItem::draw(rect, fg_color, hover_color, select_color, highlight_color, column_padding); + + S32 width = getColumn(0)->getWidth(); + LLFontGL::getFontEmoji()->render(LLWString(1, mEmoji), 0, rect.mLeft + width / 2, rect.getCenterY(), LLColor4::white, + LLFontGL::HCENTER, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW_SOFT, 1, S32_MAX, nullptr, false, true); + } + +private: + llwchar mEmoji; +}; + +LLFloaterEmojiPicker* LLFloaterEmojiPicker::getInstance() +{ + LLFloaterEmojiPicker* floater = LLFloaterReg::getTypedInstance("emoji_picker"); + if (!floater) + LL_WARNS() << "Cannot instantiate emoji picker" << LL_ENDL; + return floater; +} + +LLFloaterEmojiPicker* LLFloaterEmojiPicker::showInstance(select_callback_t callback) +{ + LLFloaterEmojiPicker* floater = getInstance(); + if (LLFloaterEmojiPicker* floater = getInstance()) + floater->show(callback); + return floater; +} + +void LLFloaterEmojiPicker::show(select_callback_t callback) +{ + mSelectCallback = callback; + openFloater(mKey); + setFocus(TRUE); +} + +LLFloaterEmojiPicker::LLFloaterEmojiPicker(const LLSD& key) +: LLFloater(key) +{ +} + +BOOL LLFloaterEmojiPicker::postBuild() +{ + if (mEmojis = getChild("Emojis")) + { + mEmojis->setDoubleClickCallback(boost::bind(&LLFloaterEmojiPicker::onSelect, this)); + + mEmojis->clearRows(); + + const std::map& emoji2Descr = LLEmojiDictionary::instance().getEmoji2Descr(); + for (const std::pair& it : emoji2Descr) + { + LLScrollListItem::Params params; + params.columns.add().column("name").value(it.second->Name); + mEmojis->addRow(new LLEmojiScrollListItem(it.first, params), params); + } + } + + return TRUE; +} + +LLFloaterEmojiPicker::~LLFloaterEmojiPicker() +{ + gFocusMgr.releaseFocusIfNeeded( this ); +} + +void LLFloaterEmojiPicker::onSelect() +{ + if (mEmojis && mSelectCallback) + { + if (LLEmojiScrollListItem* item = dynamic_cast(mEmojis->getFirstSelected())) + { + mSelectCallback(item->getEmoji()); + } + } +} + +// virtual +BOOL LLFloaterEmojiPicker::handleKeyHere(KEY key, MASK mask) +{ + if (key == KEY_RETURN && mask == MASK_NONE) + { + onSelect(); + return TRUE; + } + else if (key == KEY_ESCAPE && mask == MASK_NONE) + { + closeFloater(); + return TRUE; + } + + return LLFloater::handleKeyHere(key, mask); +} diff --git a/indra/newview/llfloateremojipicker.h b/indra/newview/llfloateremojipicker.h new file mode 100644 index 0000000000..9b442064d0 --- /dev/null +++ b/indra/newview/llfloateremojipicker.h @@ -0,0 +1,59 @@ +/** + * @file llfloateremojipicker.h + * @brief Header file for llfloateremojipicker + * + * $LicenseInfo:firstyear=2003&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +#ifndef LLFLOATEREMOJIPICKER_H +#define LLFLOATEREMOJIPICKER_H + +#include "llfloater.h" + +class LLFloaterEmojiPicker : public LLFloater +{ +public: + // The callback function will be called with an emoji char. + typedef boost::function select_callback_t; + + // Call this to select an emoji. + static LLFloaterEmojiPicker* getInstance(); + static LLFloaterEmojiPicker* showInstance(select_callback_t callback); + + LLFloaterEmojiPicker(const LLSD& key); + virtual ~LLFloaterEmojiPicker(); + + virtual BOOL postBuild(); + + void show(select_callback_t callback); + +private: + void onSelect(); + + virtual BOOL handleKeyHere(KEY key, MASK mask); + + class LLScrollListCtrl* mEmojis; + select_callback_t mSelectCallback; + std::string mEmojiName; +}; + +#endif diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 78271369d2..3d9751dd35 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -40,6 +40,7 @@ #include "llchicletbar.h" #include "lldraghandle.h" #include "llfloaterreg.h" +#include "llfloateremojipicker.h" #include "llfloaterimsession.h" #include "llfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container #include "lllayoutstack.h" @@ -250,10 +251,13 @@ BOOL LLFloaterIMSessionTab::postBuild() mTearOffBtn = getChild("tear_off_btn"); mTearOffBtn->setCommitCallback(boost::bind(&LLFloaterIMSessionTab::onTearOffClicked, this)); + mEmojiBtn = getChild("emoji_panel_btn"); + mEmojiBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onEmojiPanelBtnClicked, this)); + mGearBtn = getChild("gear_btn"); mAddBtn = getChild("add_btn"); mVoiceButton = getChild("voice_call_btn"); - + mParticipantListPanel = getChild("speakers_list_panel"); mRightPartPanel = getChild("right_part_holder"); @@ -424,6 +428,30 @@ void LLFloaterIMSessionTab::onInputEditorClicked() gToolBarView->flashCommand(LLCommandId("chat"), false); } +void LLFloaterIMSessionTab::onEmojiPanelBtnClicked(LLFloaterIMSessionTab* self) +{ + if (LLFloaterEmojiPicker* picker = LLFloaterEmojiPicker::getInstance()) + { + if (!picker->isShown()) + { + picker->show(boost::bind(&LLFloaterIMSessionTab::onEmojiSelected, self, _1)); + if (LLFloater* root_floater = gFloaterView->getParentFloater(self)) + { + root_floater->addDependentFloater(picker); + } + } + else + { + picker->closeFloater(); + } + } +} + +void LLFloaterIMSessionTab::onEmojiSelected(llwchar emoji) +{ + mInputEditor->insertEmoji(emoji); +} + std::string LLFloaterIMSessionTab::appendTime() { time_t utc_time; diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index 9f00917647..cd5065420d 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -181,6 +181,7 @@ protected: LLButton* mExpandCollapseLineBtn; LLButton* mExpandCollapseBtn; LLButton* mTearOffBtn; + LLButton* mEmojiBtn; LLButton* mCloseBtn; LLButton* mGearBtn; LLButton* mAddBtn; @@ -206,6 +207,9 @@ private: void onInputEditorClicked(); + static void onEmojiPanelBtnClicked(LLFloaterIMSessionTab* self); + void onEmojiSelected(llwchar emoji); + bool checkIfTornOff(); bool mIsHostAttached; bool mHasVisibleBeenInitialized; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 1c1aa9ea47..483b22adc8 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -65,6 +65,7 @@ #include "llfloaterdestinations.h" #include "llfloaterdisplayname.h" #include "llfloatereditextdaycycle.h" +#include "llfloateremojipicker.h" #include "llfloaterenvironmentadjust.h" #include "llfloaterexperienceprofile.h" #include "llfloaterexperiences.h" @@ -329,7 +330,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("camera_presets", "floater_camera_presets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater); - LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("conversation", "floater_conversation_log.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("add_landmark", "floater_create_landmark.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); @@ -337,19 +338,20 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("emoji_complete", "floater_emoji_complete.xml", &LLFloaterReg::build); + LLFloaterReg::add("emoji_picker", "floater_emoji_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("emoji_complete", "floater_emoji_complete.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("env_fixed_environmentent_water", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("env_fixed_environmentent_sky", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("env_fixed_environmentent_water", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("env_fixed_environmentent_sky", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("env_adjust_snapshot", "floater_adjust_environment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("env_adjust_snapshot", "floater_adjust_environment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("env_edit_extdaycycle", "floater_edit_ext_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("my_environments", "floater_my_environments.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("env_edit_extdaycycle", "floater_edit_ext_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("my_environments", "floater_my_environments.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("experiences", "floater_experiences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("experience_profile", "floater_experienceprofile.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("experience_search", "floater_experience_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/textures/icons/emoji_picker_icon.png b/indra/newview/skins/default/textures/icons/emoji_picker_icon.png new file mode 100644 index 0000000000..668dcaf193 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/emoji_picker_icon.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 1f2c0867c4..f69f1df71a 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -205,6 +205,7 @@ with the same filename but different name + @@ -212,7 +213,7 @@ with the same filename but different name - + @@ -328,7 +329,7 @@ with the same filename but different name - + diff --git a/indra/newview/skins/default/xui/en/floater_emoji_picker.xml b/indra/newview/skins/default/xui/en/floater_emoji_picker.xml new file mode 100644 index 0000000000..a3e504cc31 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_emoji_picker.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index da84fbeea6..1592352d1b 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -297,8 +297,20 @@ tab_group="3" bottom="-8" left_pad="5" - right="-5" + right="-30" wrap="true" /> + + + Date: Tue, 1 Aug 2023 15:51:18 -0700 Subject: First commit of code to investigate how we might do bulk uploads of inventory item thumbnails - both from a code and a UI perspective --- indra/newview/CMakeLists.txt | 2 + indra/newview/llfloaterbulkythumbs.cpp | 63 ++++++++++++++++++++++ indra/newview/llfloaterbulkythumbs.h | 49 +++++++++++++++++ indra/newview/llviewerfloaterreg.cpp | 2 + .../skins/default/xui/en/floater_bulky_thumbs.xml | 42 +++++++++++++++ indra/newview/skins/default/xui/en/menu_viewer.xml | 8 +++ 6 files changed, 166 insertions(+) create mode 100644 indra/newview/llfloaterbulkythumbs.cpp create mode 100644 indra/newview/llfloaterbulkythumbs.h create mode 100644 indra/newview/skins/default/xui/en/floater_bulky_thumbs.xml diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c37d03221c..4c6e37f82f 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -185,6 +185,7 @@ set(viewer_SOURCE_FILES llfloaterbigpreview.cpp llfloaterbuildoptions.cpp llfloaterbulkpermission.cpp + llfloaterbulkythumbs.cpp llfloaterbump.cpp llfloaterbuy.cpp llfloaterbuycontents.cpp @@ -831,6 +832,7 @@ set(viewer_HEADER_FILES llfloaterbigpreview.h llfloaterbuildoptions.h llfloaterbulkpermission.h + llfloaterbulkythumbs.h llfloaterbump.h llfloaterbuy.h llfloaterbuycontents.h diff --git a/indra/newview/llfloaterbulkythumbs.cpp b/indra/newview/llfloaterbulkythumbs.cpp new file mode 100644 index 0000000000..14ecc32c40 --- /dev/null +++ b/indra/newview/llfloaterbulkythumbs.cpp @@ -0,0 +1,63 @@ +/** + * @file llfloaterbulkythumbs.cpp + * @author Callum Prentice + * @brief LLFloaterBulkyThumbs class implementation + * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +/** + * Floater that appears when buying an object, giving a preview + * of its contents and their permissions. + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterbulkythumbs.h" +#include "lluictrlfactory.h" + + +LLFloaterBulkyThumbs::LLFloaterBulkyThumbs(const LLSD &key) + : LLFloater("floater_bulky_thumbs") +{ +} + +LLFloaterBulkyThumbs::~LLFloaterBulkyThumbs() {} + +BOOL LLFloaterBulkyThumbs::postBuild() +{ + mPasteFromInventoryBtn = getChild("paste_from_inventory"); + mPasteFromInventoryBtn->setCommitCallback(boost::bind(&LLFloaterBulkyThumbs::onPasteFromInventory, this)); + + mProcessBulkyThumbsBtn = getChild("process_bulky_thumbs"); + mProcessBulkyThumbsBtn->setCommitCallback(boost::bind(&LLFloaterBulkyThumbs::onProcessBulkyThumbs, this)); + mProcessBulkyThumbsBtn->setEnabled(false); + + return true; +} + + +void LLFloaterBulkyThumbs::onPasteFromInventory() +{ std::cout << "onPasteFromInventory" << std::endl; } + +void LLFloaterBulkyThumbs::onProcessBulkyThumbs() +{ std::cout << "onProcessBulkyThumbs" << std::endl; } diff --git a/indra/newview/llfloaterbulkythumbs.h b/indra/newview/llfloaterbulkythumbs.h new file mode 100644 index 0000000000..9c951211d7 --- /dev/null +++ b/indra/newview/llfloaterbulkythumbs.h @@ -0,0 +1,49 @@ +/** + * @file llfloaterbulkythumbs.h + * @author Callum Prentice + * @brief Helper floater for bulk processing of inventory thumbnails + * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +#ifndef LL_LLFLOATERBULKYTHUMBS_H +#define LL_LLFLOATERBULKYTHUMBS_H + +#include "llfloater.h" + +class LLFloaterBulkyThumbs: + public LLFloater +{ + friend class LLFloaterReg; +private: + LLFloaterBulkyThumbs(const LLSD &key); + BOOL postBuild() override; + ~LLFloaterBulkyThumbs(); + + LLUICtrl *mPasteFromInventoryBtn; + void onPasteFromInventory(); + + LLUICtrl *mProcessBulkyThumbsBtn; + void onProcessBulkyThumbs(); +}; + +#endif // LL_LLFLOATERBULKYTHUMBS_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 060bdb6995..459101317b 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -47,6 +47,7 @@ #include "llfloaterbeacons.h" #include "llfloaterbuildoptions.h" #include "llfloaterbulkpermission.h" +#include "llfloaterbulkythumbs.h" #include "llfloaterbump.h" #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" @@ -328,6 +329,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("build", "floater_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("build_options", "floater_build_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("bulky_thumbs", "floater_bulky_thumbs.xml", (LLFloaterBuildFunc) &LLFloaterReg::build); LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("camera_presets", "floater_camera_presets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/skins/default/xui/en/floater_bulky_thumbs.xml b/indra/newview/skins/default/xui/en/floater_bulky_thumbs.xml new file mode 100644 index 0000000000..867c8fdc20 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_bulky_thumbs.xml @@ -0,0 +1,42 @@ + + + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml index 188c9f8707..52f9068264 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index 8fc5cd7e63..3a7731d235 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -1,4 +1,4 @@ - + Fee is based on your subscription level. Higher levels are charged lower fees. - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml index 8e92552921..60e99c04c3 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml index 2fdbee49f0..f0219da88f 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml index a1ce99c8be..7598f7d7e5 100644 --- a/indra/newview/skins/default/xui/en/panel_sound_devices.xml +++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml @@ -1,3 +1,4 @@ + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml index 07642946f8..76b6713d43 100644 --- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml +++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + You can: @@ -401,7 +401,7 @@ TestString PleaseIgnore layout="topleft" left="5" right="-5" - name="cost_text_border" + name="cost_text_border1" top_pad="9"/> + + + + + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml index bbd53ccb12..b598bbccd8 100644 --- a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml @@ -1,4 +1,4 @@ - + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml index 8c171c387f..3c8e7c7940 100644 --- a/indra/newview/skins/default/xui/en/widgets/inspector.xml +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -1,4 +1,4 @@ - + + + + + + diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml index f39e086196..d37bee27ba 100644 --- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml @@ -1,4 +1,4 @@ - + + + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 674be59753..d12f1434a8 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item_call.xml b/indra/newview/skins/default/xui/en/widgets/menu_item_call.xml index 24bda97f44..db46e6ddfc 100644 --- a/indra/newview/skins/default/xui/en/widgets/menu_item_call.xml +++ b/indra/newview/skins/default/xui/en/widgets/menu_item_call.xml @@ -1,4 +1,4 @@ - + + + + + + - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/en/widgets/name_list.xml b/indra/newview/skins/default/xui/en/widgets/name_list.xml index 3ae0f68227..4ad2512ccd 100644 --- a/indra/newview/skins/default/xui/en/widgets/name_list.xml +++ b/indra/newview/skins/default/xui/en/widgets/name_list.xml @@ -1,3 +1,3 @@ - + diff --git a/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml b/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml index 150225af27..4f87c58420 100644 --- a/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/notification_list_view.xml @@ -1,4 +1,4 @@ - + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml index 9d71ceca2f..788c733ca8 100644 --- a/indra/newview/skins/default/xui/en/widgets/output_monitor.xml +++ b/indra/newview/skins/default/xui/en/widgets/output_monitor.xml @@ -1,4 +1,4 @@ - + + + - \ No newline at end of file + diff --git a/indra/newview/skins/default/xui/en/widgets/split_button.xml b/indra/newview/skins/default/xui/en/widgets/split_button.xml index 2ff9ada90a..f85638166b 100644 --- a/indra/newview/skins/default/xui/en/widgets/split_button.xml +++ b/indra/newview/skins/default/xui/en/widgets/split_button.xml @@ -1,4 +1,4 @@ - + + + + + + + + -- cgit v1.2.3 From be44fc277e0c137a907fa6e9e39a700725e16b1a Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 4 Dec 2023 16:22:57 +0200 Subject: SL-20679 fix for "Sort conversations by recent activity" option # Conflicts: # indra/newview/llfloaterimcontainer.cpp --- indra/newview/llfloaterimcontainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 011ad67011..543540d20f 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1755,7 +1755,7 @@ void LLFloaterIMContainer::setTimeNow(const LLUUID& session_id, const LLUUID& pa LLConversationItemSession* item = dynamic_cast(get_ptr_in_map(mConversationsItems,session_id)); if (item) { - item->setTimeNow(participant_id); + item->setTimeNow(participant_id); mConversationViewModel.requestSortAll(); mConversationsRoot->arrangeAll(); } -- cgit v1.2.3 From 86a437d96cf508fb4feacc9d091f64aa7eb152ce Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 5 Dec 2023 16:17:04 +0200 Subject: DRTVWR-587 Update llca to version 202312051404.0 --- autobuild.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 37371746d5..526b615f4a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1468,11 +1468,11 @@ archive hash - e50ea94bbaa4ff41bf53b84b7192df1a694c5337 + 3a3e14563cd5fc019c3f139b82aa46ec79847709 hash_algorithm sha1 url - https://github.com/secondlife/llca/releases/download/v202310121525.0-d22bd98/llca-202310121530.0-common-d22bd98.tar.zst + https://github.com/secondlife/llca/releases/download/v202312051403.17-0f5d9c3/llca-202312051404.0-common-0f5d9c3.tar.zst name common @@ -1486,7 +1486,7 @@ Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. version - 202310121530.0 + 202312051404.0 name llca -- cgit v1.2.3 From eff5958c11f2fcbb0449b8e011d4676a239bbe57 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 4 Dec 2023 08:26:09 +0100 Subject: Fix formatting in autobuild.xml (indents in close tags) --- .github/release.yaml | 36 +++++++++++++-------------- autobuild.xml | 70 ++++++++++++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/.github/release.yaml b/.github/release.yaml index 0f4884c944..f550e52020 100644 --- a/.github/release.yaml +++ b/.github/release.yaml @@ -1,18 +1,18 @@ -changelog: - exclude: - labels: - - ignore-for-release - authors: - - dependabot - categories: - - title: Breaking Changes 🛠 - labels: - - semver-major - - breaking-change - - title: New Features 🎉 - labels: - - semver-minor - - enhancement - - title: Other Changes - labels: - - '*' +changelog: + exclude: + labels: + - ignore-for-release + authors: + - dependabot + categories: + - title: Breaking Changes 🛠 + labels: + - semver-major + - breaking-change + - title: New Features 🎉 + labels: + - semver-minor + - enhancement + - title: Other Changes + labels: + - '*' diff --git a/autobuild.xml b/autobuild.xml index 526b615f4a..05e8f9d630 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2933,7 +2933,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - + build @@ -2953,11 +2953,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - + arguments ../indra - + name RelWithDebInfoOS @@ -2974,7 +2974,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - + build @@ -2994,11 +2994,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - + arguments ../indra - + name ReleaseOS @@ -3019,11 +3019,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode - + arguments ../indra - + build @@ -3036,7 +3036,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + default True @@ -3051,7 +3051,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode - + build @@ -3064,7 +3064,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + name RelWithDebInfoOS @@ -3077,11 +3077,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode - + arguments ../indra - + build @@ -3094,7 +3094,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + name Release @@ -3107,7 +3107,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode - + build @@ -3120,7 +3120,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + name ReleaseOS @@ -3144,11 +3144,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Ninja -DLL_TESTS=Off - + arguments ../indra - + build @@ -3169,7 +3169,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Ninja -DLL_TESTS=Off - + build @@ -3207,11 +3207,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + arguments ..\indra - + build @@ -3221,11 +3221,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + arguments SecondLife.sln - + default True @@ -3245,11 +3245,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=FALSE -DUSE_KDU=FALSE -DUSE_OPENAL:BOOL=ON - + arguments ..\indra - + build @@ -3263,11 +3263,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - + arguments SecondLife.sln - + name RelWithDebInfoOS @@ -3282,11 +3282,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + arguments ..\indra - + build @@ -3296,11 +3296,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + arguments SecondLife.sln - + name Release @@ -3319,11 +3319,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=FALSE -DUSE_KDU=FALSE -DUSE_OPENAL:BOOL=ON - + arguments ..\indra - + build @@ -3337,11 +3337,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - + arguments SecondLife.sln - + name ReleaseOS -- cgit v1.2.3 From f4307bed264cc4c5502e8f0552cbf368e23edc28 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 28 Nov 2023 21:23:38 +0200 Subject: SL-20181 Don't force fetch if vesion is unknown --- indra/newview/llinventorymodel.cpp | 3 ++ indra/newview/llinventoryobserver.cpp | 65 +++++++++++++++++------------------ 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 8583cca103..01bf7b3270 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -3546,6 +3546,9 @@ void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, vo gInventoryCallbacks.fire(callback_id, item_id); + // Message system at the moment doesn't support Thumbnails and potential + // newer features so just rerequest whole item + // // todo: instead of unpacking message fully, // grab only an item_id, then fetch LLInventoryModelBackgroundFetch::instance().scheduleItemFetch(item_id, true); diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 655bdfca6b..71c81e9352 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -337,51 +337,48 @@ void LLInventoryFetchItemsObserver::startFetch() { for (requests_by_folders_t::value_type &folder : requests) { - if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS) + LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first); + if (cat) { - // requesting one by one will take a while - // do whole folder - LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); - } - else - { - LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first); - if (cat) + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { - if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) - { - // start fetching whole folder since it's not ready either way - cat->fetch(); - } - else if (cat->getViewerDescendentCount() <= folder.second.size() - || cat->getDescendentCount() <= folder.second.size()) - { - // Start fetching whole folder since we need all items - LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); - } - else - { - // get items one by one - for (LLUUID &item_id : folder.second) - { - LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); - } - } + // start fetching whole folder since it's not ready either way + cat->fetch(); + } + else if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS) + { + // requesting one by one will take a while + // do whole folder + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); + } + else if (cat->getViewerDescendentCount() <= folder.second.size() + || cat->getDescendentCount() <= folder.second.size()) + { + // Start fetching whole folder since we need all items + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); } else { - // Isn't supposed to happen? We should have all folders - // and if item exists, folder is supposed to exist as well. - llassert(false); - LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL; - // get items one by one - for (LLUUID &item_id : folder.second) + for (LLUUID& item_id : folder.second) { LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); } } } + else + { + // Isn't supposed to happen? We should have all folders + // and if item exists, folder is supposed to exist as well. + llassert(false); + LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL; + + // get items one by one + for (LLUUID& item_id : folder.second) + { + LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id); + } + } } } else -- cgit v1.2.3 From f394d675a766f58b62bebaaa4f7caeddcec9a600 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 28 Nov 2023 21:42:13 +0200 Subject: SL-20181 Dupplicate prevention for forced fetches Might be better to have a separate set of states for 'fetched children' or 'all children complete' inside the folder itself. --- indra/newview/llinventorymodelbackgroundfetch.cpp | 44 +++++++++++++++++++---- indra/newview/llinventorymodelbackgroundfetch.h | 1 + 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 91adef8047..f1c5104e76 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -358,8 +358,22 @@ void LLInventoryModelBackgroundFetch::scheduleFolderFetch(const LLUUID& cat_id, { mBackgroundFetchActive = true; - // Specific folder requests go to front of queue. - mFetchFolderQueue.push_front(FetchQueueInfo(cat_id, forced ? FT_FORCED : FT_DEFAULT)); + if (forced) + { + // check if already requested + if (mForceFetchSet.find(cat_id) != mForceFetchSet.end()) + { + mForceFetchSet.insert(cat_id); + mFetchItemQueue.push_front(FetchQueueInfo(cat_id, FT_FORCED)); + } + } + else + { + // Specific folder requests go to front of queue. + // version presence acts as dupplicate prevention for normal fetches + mFetchItemQueue.push_front(FetchQueueInfo(cat_id, FT_DEFAULT)); + } + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } } @@ -369,8 +383,21 @@ void LLInventoryModelBackgroundFetch::scheduleItemFetch(const LLUUID& item_id, b if (mFetchItemQueue.empty() || mFetchItemQueue.front().mUUID != item_id) { mBackgroundFetchActive = true; + if (forced) + { + // check if already requested + if (mForceFetchSet.find(item_id)!= mForceFetchSet.end()) + { + mForceFetchSet.insert(item_id); + mFetchItemQueue.push_front(FetchQueueInfo(item_id, FT_FORCED, false)); + } + } + else + { + // 'isFinished' being set acts as dupplicate prevention for normal fetches + mFetchItemQueue.push_front(FetchQueueInfo(item_id, FT_DEFAULT, false)); + } - mFetchItemQueue.push_front(FetchQueueInfo(item_id, forced ? FT_FORCED : FT_DEFAULT, false)); gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } } @@ -846,10 +873,10 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc mExpectedFolderIds.push_back(cat_id); EFetchType type = fetch_info.mFetchType; - LLUUID cat_id = cat->getUUID(); - AISAPI::completion_t cb = [cat_id , type](const LLUUID& response_id) + LLUUID cat_cb_id = cat_id; + AISAPI::completion_t cb = [cat_cb_id, type](const LLUUID& response_id) { - LLInventoryModelBackgroundFetch::instance().onAISFolderCalback(cat_id , response_id , type); + LLInventoryModelBackgroundFetch::instance().onAISFolderCalback(cat_cb_id, response_id , type); }; AISAPI::ITEM_TYPE item_type = AISAPI::INVENTORY; @@ -908,6 +935,11 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc AISAPI::FetchItem(fetch_info.mUUID, AISAPI::INVENTORY, ais_simple_item_callback); } } + + if (fetch_info.mFetchType == FT_FORCED) + { + mForceFetchSet.erase(fetch_info.mUUID); + } } // Bundle up a bunch of requests to send all at once. diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index e7be265a3d..5d66985b40 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -129,6 +129,7 @@ private: F32 mMinTimeBetweenFetches; fetch_queue_t mFetchFolderQueue; fetch_queue_t mFetchItemQueue; + uuid_set_t mForceFetchSet; std::list mExpectedFolderIds; // for debug, should this track time? }; -- cgit v1.2.3 From 9f3edb90d49bb10fa5608b4d6bdf242c243b0441 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 28 Nov 2023 23:27:18 +0200 Subject: SL-20181 Minor inventory fetching adjustements --- indra/newview/llaisapi.cpp | 16 +++++++++++----- indra/newview/llinventoryfilter.cpp | 12 +++++++++--- indra/newview/llinventorygallery.cpp | 2 +- indra/newview/llinventorymodel.cpp | 17 ++++++++++------- indra/newview/llviewerinventory.cpp | 5 ++--- indra/newview/llviewerinventory.h | 5 +++-- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 17e1a27934..f23ce13608 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -1738,10 +1738,6 @@ void AISUpdate::doUpdate() LL_DEBUGS("Inventory") << "cat version update " << cat->getName() << " to version " << cat->getVersion() << LL_ENDL; if (cat->getVersion() != version) { - LL_WARNS() << "Possible version mismatch for category " << cat->getName() - << ", viewer version " << cat->getVersion() - << " AIS version " << version << " !!!Adjusting local version!!!" << LL_ENDL; - // the AIS version should be considered the true version. Adjust // our local category model to reflect this version number. Otherwise // it becomes possible to get stuck with the viewer being out of @@ -1751,13 +1747,23 @@ void AISUpdate::doUpdate() // is performed. This occasionally gets out of sync however. if (version != LLViewerInventoryCategory::VERSION_UNKNOWN) { + LL_WARNS() << "Possible version mismatch for category " << cat->getName() + << ", viewer version " << cat->getVersion() + << " AIS version " << version << " !!!Adjusting local version!!!" << LL_ENDL; cat->setVersion(version); } else { // We do not account for update if version is UNKNOWN, so we shouldn't rise version // either or viewer will get stuck on descendants count -1, try to refetch folder instead - cat->fetch(); + // + // Todo: proper backoff? + + LL_WARNS() << "Possible version mismatch for category " << cat->getName() + << ", viewer version " << cat->getVersion() + << " AIS version " << version << " !!!Rerequesting category!!!" << LL_ENDL; + const S32 LONG_EXPIRY = 360; + cat->fetch(LONG_EXPIRY); } } } diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 7b4283e94d..332c6d3085 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -202,12 +202,18 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const && !LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress()) { LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id); - if ((!cat && folder_id.notNull()) || (cat && cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)) + if ((!cat && folder_id.notNull())) { - // At the moment background fetch only cares about VERSION_UNKNOWN, - // so do not check isCategoryComplete that compares descendant count + // Shouldn't happen? Server provides full list of folders on startup LLInventoryModelBackgroundFetch::instance().start(folder_id, false); } + else if (cat && cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + { + // At the moment background fetch only cares about VERSION_UNKNOWN, + // so do not check isCategoryComplete that compares descendant count, + // but if that is nesesary, do a forced scheduleFolderFetch. + cat->fetch(); + } } if (!checkAgainstFilterThumbnails(folder_id)) diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 212f8b0446..9fb2783506 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -2386,7 +2386,7 @@ BOOL LLInventoryGallery::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return handled; } -void LLInventoryGallery::startDrag() +void LLInventoryGallery::startDrag() { std::vector types; uuid_vec_t ids; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 01bf7b3270..7f60e6c509 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -3911,19 +3911,22 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**) for (cat_array_t::iterator cit = folders.begin(); cit != folders.end(); ++cit) { - gInventory.updateCategory(*cit); - - // Temporary workaround: just fetch the item using AIS to get missing fields. - // If this works fine we might want to extract ids only from the message - // then use AIS as a primary fetcher - LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch((*cit)->getUUID(), true /*force, since it has changes*/); + gInventory.updateCategory(*cit); + if ((*cit)->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN) + { + // Temporary workaround: just fetch the item using AIS to get missing fields. + // If this works fine we might want to extract 'ids only' from the message + // then use AIS as a primary fetcher + LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch((*cit)->getUUID(), true /*force, since it has changes*/); + } + // else already called fetch() above } for (item_array_t::iterator iit = items.begin(); iit != items.end(); ++iit) { gInventory.updateItem(*iit); // Temporary workaround: just fetch the item using AIS to get missing fields. - // If this works fine we might want to extract ids only from the message + // If this works fine we might want to extract 'ids only' from the message // then use AIS as a primary fetcher LLInventoryModelBackgroundFetch::instance().scheduleItemFetch((*iit)->getUUID(), true); } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 5ee613d49d..6d5049347f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -648,15 +648,14 @@ void LLViewerInventoryCategory::setVersion(S32 version) mVersion = version; } -bool LLViewerInventoryCategory::fetch() +bool LLViewerInventoryCategory::fetch(S32 expiry_seconds) { if((VERSION_UNKNOWN == getVersion()) && mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads. { LL_DEBUGS(LOG_INV) << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL; - const F32 FETCH_TIMER_EXPIRY = 10.0f; mDescendentsRequested.reset(); - mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY); + mDescendentsRequested.setTimerExpirySec(expiry_seconds); std::string url; if (gAgent.getRegion()) diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index bce8da0a69..4297e194dd 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -209,8 +209,9 @@ public: S32 getVersion() const; void setVersion(S32 version); - // Returns true if a fetch was issued (not nessesary in progress). - bool fetch(); + // Returns true if a fetch was issued (not nessesary in progress). + // no requests will happen during expiry_seconds even if fetch completed + bool fetch(S32 expiry_seconds = 10); typedef enum { FETCH_NONE = 0, -- cgit v1.2.3 From 728a91b288c88131db032db687a3e6f0e0a09301 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 29 Nov 2023 22:33:59 +0200 Subject: SL-20181 Use back-of compatible fetch If fetch failed for some reason, old version would cause excessive rerequests. --- indra/newview/llinventorybridge.cpp | 7 +++++-- indra/newview/llviewerinventory.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index de987d2dbd..ff92af32ff 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2284,8 +2284,11 @@ BOOL LLFolderBridge::isItemMovable() const void LLFolderBridge::selectItem() { - // Have no fear: the first thing start() does is to test if everything for that folder has been fetched... - LLInventoryModelBackgroundFetch::instance().start(getUUID(), true); + LLViewerInventoryCategory* cat = gInventory.getCategory(getUUID()); + if (cat) + { + cat->fetch(); + } } void LLFolderBridge::buildDisplayName() const diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 6d5049347f..a976cdc06d 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -664,7 +664,7 @@ bool LLViewerInventoryCategory::fetch(S32 expiry_seconds) } else { - LL_WARNS(LOG_INV) << "agent region is null" << LL_ENDL; + LL_WARNS_ONCE(LOG_INV) << "agent region is null" << LL_ENDL; } if (!url.empty() || AISAPI::isAvailable()) { -- cgit v1.2.3 From 38fbe5267bef11d57cb3ad7795c3a9b602e414c5 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 30 Nov 2023 00:21:46 +0200 Subject: SL-20181 Optimize marketplace fetch request - Move it to the back unless requested by floater (prioritize main inventory) - Instead of fetching whole folder which likely has pending changes from web side, fetch folder individually, then fetch changed content in bulk --- indra/newview/llfloatermarketplacelistings.cpp | 25 ++++++--- indra/newview/llfloatermarketplacelistings.h | 4 +- indra/newview/llinventorymodelbackgroundfetch.cpp | 67 ++++++++++++++++------- indra/newview/llinventorymodelbackgroundfetch.h | 3 +- 4 files changed, 67 insertions(+), 32 deletions(-) diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp index 71b3b16809..6216f4e39a 100644 --- a/indra/newview/llfloatermarketplacelistings.cpp +++ b/indra/newview/llfloatermarketplacelistings.cpp @@ -183,7 +183,8 @@ void LLPanelMarketplaceListings::draw() // Get the audit button enabled only after the whole inventory is fetched if (!mAuditBtn->getEnabled()) { - mAuditBtn->setEnabled(LLInventoryModelBackgroundFetch::instance().isEverythingFetched()); + LLInventoryModelBackgroundFetch* inst = LLInventoryModelBackgroundFetch::getInstance(); + mAuditBtn->setEnabled(inst->isEverythingFetched() && !inst->folderFetchActive()); } LLPanel::draw(); @@ -410,8 +411,14 @@ BOOL LLFloaterMarketplaceListings::postBuild() mCategoryAddedObserver = new LLMarketplaceListingsAddedObserver(this); gInventory.addObserver(mCategoryAddedObserver); - // Fetch aggressively so we can interact with listings right onOpen() - fetchContents(); + + // Fetch aggressively so we can interact with listings as soon as possible + if (!fetchContents()) + { + const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS); + LLInventoryModelBackgroundFetch::instance().start(marketplacelistings_id, true); + } + return TRUE; } @@ -440,17 +447,19 @@ void LLFloaterMarketplaceListings::onFocusReceived() updateView(); } -void LLFloaterMarketplaceListings::fetchContents() +bool LLFloaterMarketplaceListings::fetchContents() { - if (mRootFolderId.notNull() && + if (mRootFolderId.notNull() && (LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_LOADING) && (LLMarketplaceData::instance().getSLMDataFetched() != MarketplaceFetchCodes::MARKET_FETCH_DONE)) - { + { LLMarketplaceData::instance().setDataFetchedSignal(boost::bind(&LLFloaterMarketplaceListings::updateView, this)); LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_LOADING); - LLInventoryModelBackgroundFetch::instance().start(mRootFolderId, true); + LLInventoryModelBackgroundFetch::instance().start(mRootFolderId, true); LLMarketplaceData::instance().getSLMListings(); - } + return true; + } + return false; } void LLFloaterMarketplaceListings::setRootFolder() diff --git a/indra/newview/llfloatermarketplacelistings.h b/indra/newview/llfloatermarketplacelistings.h index 085e517a9d..78d43f97a9 100644 --- a/indra/newview/llfloatermarketplacelistings.h +++ b/indra/newview/llfloatermarketplacelistings.h @@ -114,8 +114,8 @@ public: protected: void setRootFolder(); void setPanels(); - void fetchContents(); - + bool fetchContents(); + void setStatusString(const std::string& statusString); void onClose(bool app_quitting); diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index f1c5104e76..493fb139ac 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -193,13 +193,16 @@ LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch(): mLastFetchCount(0), mFetchFolderCount(0), mAllRecursiveFoldersFetched(false), - mRecursiveInventoryFetchStarted(false), - mRecursiveLibraryFetchStarted(false), - mMinTimeBetweenFetches(0.3f) + mRecursiveInventoryFetchStarted(false), + mRecursiveLibraryFetchStarted(false), + mRecursiveMarketplaceFetchStarted(false), + mMinTimeBetweenFetches(0.3f) {} LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch() -{} +{ + gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); +} bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const { @@ -314,6 +317,23 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, bool recursive) gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } } + else if (cat && cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) + { + if (mFetchFolderQueue.empty() || mFetchFolderQueue.back().mUUID != id) + { + if (recursive && AISAPI::isAvailable()) + { + // Request marketplace folder and content separately + mFetchFolderQueue.push_front(FetchQueueInfo(id, FT_FOLDER_AND_CONTENT)); + } + else + { + mFetchFolderQueue.push_front(FetchQueueInfo(id, recursion_type)); + } + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + mRecursiveMarketplaceFetchStarted = true; + } + } else { if (AISAPI::isAvailable()) @@ -724,7 +744,26 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() if (isFolderFetchProcessingComplete() && mFolderFetchActive) { - setAllFoldersFetched(); + if (!mRecursiveInventoryFetchStarted || mRecursiveMarketplaceFetchStarted) + { + setAllFoldersFetched(); + } + else + { + // Intent is for marketplace request to happen after + // main inventory is done, unless requested by floater + mRecursiveMarketplaceFetchStarted = true; + const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS); + if (marketplacelistings_id.notNull()) + { + mFetchFolderQueue.push_front(FetchQueueInfo(marketplacelistings_id, FT_FOLDER_AND_CONTENT)); + } + else + { + setAllFoldersFetched(); + } + } + } if (isBulkFetchProcessingComplete()) @@ -784,22 +823,8 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc if (child_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) { - // special case - content_done = false; - if (children.empty()) - { - // fetch marketplace alone - // Should it actually be fetched as FT_FOLDER_AND_CONTENT? - children.push_back(child_cat->getUUID()); - mExpectedFolderIds.push_back(child_cat->getUUID()); - child_cat->setFetching(target_state); - break; - } - else - { - // fetch marketplace alone next run - continue; - } + // special case, marketplace will fetch that as needed + continue; } children.push_back(child_cat->getUUID()); diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 5d66985b40..3343b4dd4e 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -69,7 +69,6 @@ public: void incrFetchFolderCount(S32 fetching); bool isBulkFetchProcessingComplete() const; - bool isFolderFetchProcessingComplete() const; void setAllFoldersFetched(); typedef boost::function folders_fetched_callback_t; @@ -79,6 +78,7 @@ public: void addRequestAtBack(const LLUUID & id, bool recursive, bool is_category); protected: + bool isFolderFetchProcessingComplete() const; typedef enum { FT_DEFAULT = 0, @@ -115,6 +115,7 @@ protected: private: bool mRecursiveInventoryFetchStarted; bool mRecursiveLibraryFetchStarted; + bool mRecursiveMarketplaceFetchStarted; // AIS3 specific bool mAllRecursiveFoldersFetched; typedef boost::signals2::signal folders_fetched_signal_t; folders_fetched_signal_t mFoldersFetchedSignal; -- cgit v1.2.3 From 71d547b255c87297a4b97a9b05d004a743ab68e6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 4 Dec 2023 22:48:00 +0200 Subject: SL-20181 Back off on failure --- indra/newview/llinventorymodelbackgroundfetch.cpp | 7 +++++-- indra/newview/llviewerinventory.cpp | 8 +++++++- indra/newview/llviewerinventory.h | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 493fb139ac..12debd7923 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -582,6 +582,7 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i return; } + LLViewerInventoryCategory::EFetchType new_state = LLViewerInventoryCategory::FETCH_NONE; bool request_descendants = false; if (response_id.isNull()) // Failure { @@ -599,10 +600,12 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i // set folder's version to prevent viewer from trying to request folder indefinetely LLViewerInventoryCategory* cat(gInventory.getCategory(request_id)); - if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + if (cat && cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { cat->setVersion(0); } + // back off for a bit in case something tries to force-request immediately + new_state = LLViewerInventoryCategory::FETCH_FAILED; } } else @@ -655,7 +658,7 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i LLViewerInventoryCategory * cat(gInventory.getCategory(request_id)); if (cat) { - cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); + cat->setFetching(new_state); } } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index a976cdc06d..a58ca182fc 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -688,7 +688,13 @@ LLViewerInventoryCategory::EFetchType LLViewerInventoryCategory::getFetching() void LLViewerInventoryCategory::setFetching(LLViewerInventoryCategory::EFetchType fetching) { - if (fetching > mFetching) // allow a switch from normal to recursive + if (fetching == FETCH_FAILED) + { + const F32 FETCH_FAILURE_EXPIRY = 60.0f; + mDescendentsRequested.setTimerExpirySec(FETCH_FAILURE_EXPIRY); + mFetching = fetching; + } + else if (fetching > mFetching) // allow a switch from normal to recursive { if (mDescendentsRequested.hasExpired() || (mFetching == FETCH_NONE)) { diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 4297e194dd..1adc5403fd 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -217,6 +217,7 @@ public: FETCH_NONE = 0, FETCH_NORMAL, FETCH_RECURSIVE, + FETCH_FAILED, // back off } EFetchType; EFetchType getFetching(); // marks as fetch being in progress or as done -- cgit v1.2.3 From 4fc7bc0703df40566c4c33f8406d1301079a3ff8 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 4 Dec 2023 22:54:53 +0200 Subject: SL-20181 Small tweak for requests --- indra/newview/llinventorymodelbackgroundfetch.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 12debd7923..49b2cb74af 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -317,7 +317,7 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, bool recursive) gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } } - else if (cat && cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) + else if (recursive && cat && cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) { if (mFetchFolderQueue.empty() || mFetchFolderQueue.back().mUUID != id) { @@ -381,7 +381,7 @@ void LLInventoryModelBackgroundFetch::scheduleFolderFetch(const LLUUID& cat_id, if (forced) { // check if already requested - if (mForceFetchSet.find(cat_id) != mForceFetchSet.end()) + if (mForceFetchSet.find(cat_id) == mForceFetchSet.end()) { mForceFetchSet.insert(cat_id); mFetchItemQueue.push_front(FetchQueueInfo(cat_id, FT_FORCED)); @@ -406,7 +406,7 @@ void LLInventoryModelBackgroundFetch::scheduleItemFetch(const LLUUID& item_id, b if (forced) { // check if already requested - if (mForceFetchSet.find(item_id)!= mForceFetchSet.end()) + if (mForceFetchSet.find(item_id) == mForceFetchSet.end()) { mForceFetchSet.insert(item_id); mFetchItemQueue.push_front(FetchQueueInfo(item_id, FT_FORCED, false)); -- cgit v1.2.3 From 5accc1feff322c89e63fbfa0f3ac6911abcf6436 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 6 Dec 2023 12:58:20 +0200 Subject: SL-20695 Fix hardware probes CoCreateInstance returns 'no interface supported' Preferable not to mix init types so switched everything. --- indra/llwindow/lldxhardware.cpp | 22 ++++++++++------------ indra/newview/llmachineid.cpp | 3 +-- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp index 07856edefc..aaa2f6aef1 100644 --- a/indra/llwindow/lldxhardware.cpp +++ b/indra/llwindow/lldxhardware.cpp @@ -65,13 +65,12 @@ HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam) { HRESULT hr; bool bGotMemory = false; - HRESULT hrCoInitialize = S_OK; IWbemLocator* pIWbemLocator = nullptr; IWbemServices* pIWbemServices = nullptr; BSTR pNamespace = nullptr; *pdwAdapterRam = 0; - hrCoInitialize = CoInitializeEx(0, COINIT_MULTITHREADED); + CoInitializeEx(0, COINIT_APARTMENTTHREADED); hr = CoCreateInstance( CLSID_WbemLocator, nullptr, @@ -208,8 +207,7 @@ HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam) SAFE_RELEASE( pIWbemLocator ); - if( SUCCEEDED( hrCoInitialize ) ) - CoUninitialize(); + CoUninitialize(); if( bGotMemory ) return S_OK; @@ -232,9 +230,8 @@ S32 LLDXHardware::getMBVideoMemoryViaWMI() std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor) { std::string mDriverVersion; - HRESULT hrCoInitialize = S_OK; HRESULT hres; - hrCoInitialize = CoInitializeEx(0, COINIT_MULTITHREADED); + CoInitializeEx(0, COINIT_APARTMENTTHREADED); IWbemLocator *pLoc = NULL; hres = CoCreateInstance( @@ -437,10 +434,10 @@ std::string LLDXHardware::getDriverVersionWMI(EGPUVendor vendor) { pEnumerator->Release(); } - if (SUCCEEDED(hrCoInitialize)) - { - CoUninitialize(); - } + + // supposed to always call CoUninitialize even if init returned false + CoUninitialize(); + return mDriverVersion; } @@ -687,7 +684,8 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) BOOL ok = FALSE; HRESULT hr; - CoInitializeEx(NULL, COINIT_MULTITHREADED); + // CLSID_DxDiagProvider does not work with Multithreaded? + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); IDxDiagProvider *dx_diag_providerp = NULL; IDxDiagContainer *dx_diag_rootp = NULL; @@ -976,7 +974,7 @@ LLSD LLDXHardware::getDisplayInfo() LLTimer hw_timer; HRESULT hr; LLSD ret; - CoInitializeEx(NULL, COINIT_MULTITHREADED); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); IDxDiagProvider *dx_diag_providerp = NULL; IDxDiagContainer *dx_diag_rootp = NULL; diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index 8f03b13d2d..1f4418f119 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -85,12 +85,11 @@ void LLWMIMethods::initCOMObjects() // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ - mHR = CoInitializeEx(0, COINIT_MULTITHREADED); + mHR = CoInitializeEx(0, COINIT_APARTMENTTHREADED); if (FAILED(mHR)) { // if result S_FALSE, it's already initialized LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << std::hex << mHR << LL_ENDL; - return; } // Step 2: -------------------------------------------------- -- cgit v1.2.3 From bf8fb4ef0d5345f65cfc2e8a750eea6a4ef3d05c Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 6 Dec 2023 14:10:30 +0200 Subject: SL-20694 FIXED Unable to publish classified if first entered insufficient L$ amount --- indra/newview/llpanelprofileclassifieds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index dec6cfd83b..f9529e9d23 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -954,7 +954,7 @@ void LLPanelProfileClassified::onSaveClick() } if(isNew() || isNewWithErrors()) { - if(gStatusBar->getBalance() < getPriceForListing()) + if(gStatusBar->getBalance() < MINIMUM_PRICE_FOR_LISTING) { LLNotificationsUtil::add("ClassifiedInsufficientFunds"); return; -- cgit v1.2.3 From b2b1aeffc72fda7b2857f2dd9069d65b23bd7021 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Wed, 6 Dec 2023 14:11:33 +0200 Subject: SL-20693 FIXED Classifieds publish price field misinterprets invalid values --- indra/newview/llpanelprofileclassifieds.cpp | 8 ++++++++ indra/newview/skins/default/xui/en/floater_publish_classified.xml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index f9529e9d23..393deb41ab 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -1427,6 +1427,14 @@ void LLPanelProfileClassified::doSave() void LLPanelProfileClassified::onPublishFloaterPublishClicked() { + if (mPublishFloater->getPrice() < MINIMUM_PRICE_FOR_LISTING) + { + LLSD args; + args["MIN_PRICE"] = MINIMUM_PRICE_FOR_LISTING; + LLNotificationsUtil::add("MinClassifiedPrice", args); + return; + } + setPriceForListing(mPublishFloater->getPrice()); doSave(); diff --git a/indra/newview/skins/default/xui/en/floater_publish_classified.xml b/indra/newview/skins/default/xui/en/floater_publish_classified.xml index 84e0b489d0..3e68011b6c 100644 --- a/indra/newview/skins/default/xui/en/floater_publish_classified.xml +++ b/indra/newview/skins/default/xui/en/floater_publish_classified.xml @@ -25,6 +25,7 @@ Remember, Classified fees are non-refundable. Date: Wed, 6 Dec 2023 03:54:06 +0100 Subject: SL-20140 Setting shape hand size to 36 won't save --- indra/newview/character/avatar_lad.xml | 17 ++++---- indra/newview/llscrollingpanelparam.cpp | 63 +++++++++-------------------- indra/newview/llscrollingpanelparam.h | 3 -- indra/newview/llscrollingpanelparambase.cpp | 29 ++++++------- indra/newview/llscrollingpanelparambase.h | 7 +++- 5 files changed, 47 insertions(+), 72 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index 2cdd86267e..aef402d4db 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -2021,7 +2021,7 @@ value_min="-1" value_max="1"> - + - - - @@ -2042,7 +2041,7 @@ name="mFaceEyeAltRight" scale="0 0 0" offset="-.005 0 0" /> - + - @@ -2062,17 +2061,17 @@ name="mFaceEyeLidUpperLeft" scale="0 0.3 0.7" offset=" 0 0 0" /> - + - + - + diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index bfa453a0ae..efd84eaa6d 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -259,19 +259,15 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint ) // Make sure we're not taking the slider out of bounds // (this is where some simple UI limits are stored) - F32 new_percent = weightToPercent(new_weight); - LLSliderCtrl* slider = getChild("param slider"); - if (slider) + F32 new_percent = weightToSlider(new_weight); + if (mSlider->getMinValue() < new_percent + && new_percent < mSlider->getMaxValue()) { - if (slider->getMinValue() < new_percent - && new_percent < slider->getMaxValue()) - { - mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight); - mWearable->writeToAvatar(gAgentAvatarp); - gAgentAvatarp->updateVisualParams(); + mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight); + mWearable->writeToAvatar(gAgentAvatarp); + gAgentAvatarp->updateVisualParams(); - slider->setValue( weightToPercent( new_weight ) ); - } + mSlider->setValue( weightToSlider( new_weight ) ); } } } @@ -292,17 +288,13 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata ) F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight(); // step a fraction in the negative directiona F32 new_weight = current_weight - (range / 10.f); - F32 new_percent = self->weightToPercent(new_weight); - LLSliderCtrl* slider = self->getChild("param slider"); - if (slider) + F32 new_percent = self->weightToSlider(new_weight); + if (self->mSlider->getMinValue() < new_percent + && new_percent < self->mSlider->getMaxValue()) { - if (slider->getMinValue() < new_percent - && new_percent < slider->getMaxValue()) - { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); - self->mWearable->writeToAvatar(gAgentAvatarp); - slider->setValue( self->weightToPercent( new_weight ) ); - } + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); + self->mWearable->writeToAvatar(gAgentAvatarp); + self->mSlider->setValue( self->weightToSlider( new_weight ) ); } } @@ -326,33 +318,16 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata ) F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight(); // step a fraction in the negative direction F32 new_weight = current_weight + (range / 10.f); - F32 new_percent = self->weightToPercent(new_weight); - LLSliderCtrl* slider = self->getChild("param slider"); - if (slider) + F32 new_percent = self->weightToSlider(new_weight); + if (self->mSlider->getMinValue() < new_percent + && new_percent < self->mSlider->getMaxValue()) { - if (slider->getMinValue() < new_percent - && new_percent < slider->getMaxValue()) - { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); - self->mWearable->writeToAvatar(gAgentAvatarp); - slider->setValue( self->weightToPercent( new_weight ) ); - } + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); + self->mWearable->writeToAvatar(gAgentAvatarp); + self->mSlider->setValue( self->weightToSlider( new_weight ) ); } } } LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax ); } - - -F32 LLScrollingPanelParam::weightToPercent( F32 weight ) -{ - LLViewerVisualParam* param = mParam; - return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f; -} - -F32 LLScrollingPanelParam::percentToWeight( F32 percent ) -{ - LLViewerVisualParam* param = mParam; - return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight(); -} diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index c7a47d5c7a..dc344486fc 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -61,9 +61,6 @@ public: void onHintMouseDown( LLVisualParamHint* hint ); void onHintHeldDown( LLVisualParamHint* hint ); - F32 weightToPercent( F32 weight ); - F32 percentToWeight( F32 percent ); - public: // Constants for LLPanelVisualParam const static F32 PARAM_STEP_TIME_THRESHOLD; diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp index fe7a362723..2a6c25235d 100644 --- a/indra/newview/llscrollingpanelparambase.cpp +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -43,6 +43,7 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints) : LLScrollingPanel( panel_params ), mParam(param), + mSlider(nullptr), mAllowModify(allow_modify), mWearable(wearable) { @@ -50,13 +51,15 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan buildFromFile( "panel_scrolling_param.xml"); else buildFromFile( "panel_scrolling_param_base.xml"); - - getChild("param slider")->setValue(weightToPercent(param->getWeight())); + + mSlider = getChild("param slider"); + mSlider->setMaxValue(100.f * (mParam->getMaxWeight() - mParam->getMinWeight())); + mSlider->setValue(weightToSlider(param->getWeight())); std::string display_name = LLTrans::getString(param->getDisplayName()); - getChild("param slider")->setLabelArg("[DESC]", display_name); - getChildView("param slider")->setEnabled(mAllowModify); - childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this); + mSlider->setLabelArg("[DESC]", display_name); + mSlider->setEnabled(mAllowModify); + mSlider->setCommitCallback(boost::bind(LLScrollingPanelParamBase::onSliderMoved, mSlider, this)); setVisible(FALSE); setBorderVisible( FALSE ); @@ -77,9 +80,9 @@ void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify) } F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); - getChild("param slider")->setValue(weightToPercent( current_weight ) ); + mSlider->setValue(weightToSlider( current_weight ) ); mAllowModify = allow_modify; - getChildView("param slider")->setEnabled(mAllowModify); + mSlider->setEnabled(mAllowModify); } // static @@ -90,7 +93,7 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) LLViewerVisualParam* param = self->mParam; F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() ); - F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); + F32 new_weight = self->sliderToWeight( (F32)slider->getValue().asReal() ); if (current_weight != new_weight ) { self->mWearable->setVisualParamWeight( param->getID(), new_weight); @@ -99,14 +102,12 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) } } -F32 LLScrollingPanelParamBase::weightToPercent( F32 weight ) +F32 LLScrollingPanelParamBase::weightToSlider(F32 weight) { - LLViewerVisualParam* param = mParam; - return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f; + return (weight - mParam->getMinWeight()) * 100.f; } -F32 LLScrollingPanelParamBase::percentToWeight( F32 percent ) +F32 LLScrollingPanelParamBase::sliderToWeight(F32 slider) { - LLViewerVisualParam* param = mParam; - return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight(); + return slider / 100.f + mParam->getMinWeight(); } diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h index 9538826251..e7f88a21bd 100644 --- a/indra/newview/llscrollingpanelparambase.h +++ b/indra/newview/llscrollingpanelparambase.h @@ -36,6 +36,7 @@ class LLViewerVisualParam; class LLWearable; class LLVisualParamHint; class LLViewerVisualParam; +class LLSliderCtrl; class LLJoint; class LLScrollingPanelParamBase : public LLScrollingPanel @@ -49,11 +50,13 @@ public: static void onSliderMoved(LLUICtrl* ctrl, void* userdata); - F32 weightToPercent( F32 weight ); - F32 percentToWeight( F32 percent ); + F32 weightToSlider(F32 weight); + F32 sliderToWeight(F32 slider); public: LLViewerVisualParam* mParam; + LLSliderCtrl* mSlider; + protected: BOOL mAllowModify; LLWearable *mWearable; -- cgit v1.2.3 From d109b84c8d80a628b95afdc52b84962114b8c6fd Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 7 Dec 2023 17:37:41 +0200 Subject: SL-20696 FIXED llLoopSoundSlave producing no sound since viewer update --- indra/llaudio/llaudioengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index a387bb23cd..ece0a12a7a 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -398,7 +398,7 @@ void LLAudioEngine::idle() for (source_map::value_type& src_pair : mAllSources) { LLAudioSource *sourcep = src_pair.second; - if (sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) + if (!sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) { sync_masterp = sourcep; master_channelp = sync_masterp->getChannel(); -- cgit v1.2.3 From cde3816ed07489415257e3bda3f64069ca580b0d Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 11 Dec 2023 23:42:31 +0200 Subject: SL-20709 FIXED Avatar Maximum Complexity changing upon cancelling Advanced Graphics --- indra/newview/llfloaterpreference.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d4e40ff103..fb726ff051 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -978,7 +978,6 @@ void LLFloaterPreference::onBtnCancel(const LLSD& userdata) if (userdata.asString() == "closeadvanced") { LLFloaterReg::hideInstance("prefs_graphics_advanced"); - updateMaxComplexity(); } else { -- cgit v1.2.3 From 8c1aa6d6623995e56e1cf5de127befcf9033c8ca Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 12 Dec 2023 00:15:29 +0200 Subject: SL-20714 Crash accessing mControlAVBridge Looks like control avatar was recreated after cleanup then object was deleted --- indra/newview/llviewermessage.cpp | 2 +- indra/newview/llviewerobject.cpp | 5 +++++ indra/newview/llvovolume.cpp | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8b6a6807e4..c50365db2a 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4229,7 +4229,7 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) LLObjectSignaledAnimationMap::instance().getMap()[uuid] = signaled_anims; LLViewerObject *objp = gObjectList.findObject(uuid); - if (!objp) + if (!objp || objp->isDead()) { LL_DEBUGS("AnimatedObjectsNotify") << "Received animation state for unknown object " << uuid << LL_ENDL; return; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d6443b0bfb..1458570de2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -391,6 +391,7 @@ LLViewerObject::~LLViewerObject() sNumObjects--; sNumZombieObjects--; llassert(mChildList.size() == 0); + llassert(mControlAvatar.isNull()); // Should have been cleaned by now clearInventoryListeners(); } @@ -3106,6 +3107,10 @@ void LLViewerObject::updateControlAvatar() return; } + // caller isn't supposed to operate on a dead object, + // avatar was already cleaned up + llassert(!isDead()); + bool should_have_control_avatar = false; if (is_animated_object) { diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index ec2f490742..1e212250a3 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5494,6 +5494,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME; llassert(!gCubeSnapshot); + if (group->isDead()) + { + return; + } + if (group->changeLOD()) { group->mLastUpdateDistance = group->mDistance; @@ -5577,7 +5582,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) LLVOVolume* vobj = drawablep->getVOVolume(); - if (!vobj) + if (!vobj || vobj->isDead()) { continue; } -- cgit v1.2.3 From 7e6578dc0f71fa969d6b301fd3d3ef4090d68d50 Mon Sep 17 00:00:00 2001 From: AiraYumi Date: Fri, 8 Dec 2023 22:27:14 +0900 Subject: Fix nonnull error in gcc version 13 on Linux. --- indra/newview/llfasttimerview.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 5b8ca6c49c..a7998f6e9e 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -947,7 +947,7 @@ void LLFastTimerView::printLineStats() { std::string legend_stat; bool first = true; - for(block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); + for(LLTrace::block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); it != LLTrace::end_block_timer_tree_df(); ++it) { @@ -969,7 +969,7 @@ void LLFastTimerView::printLineStats() std::string timer_stat; first = true; - for(block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); + for(LLTrace::block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); it != LLTrace::end_block_timer_tree_df(); ++it) { @@ -1046,7 +1046,7 @@ void LLFastTimerView::drawLineGraph() F32Seconds cur_max(0); U32 cur_max_calls = 0; - for(block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); + for(LLTrace::block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); it != LLTrace::end_block_timer_tree_df(); ++it) { @@ -1195,8 +1195,8 @@ void LLFastTimerView::drawLegend() S32 scroll_offset = 0; // element's y offset from top of the inner scroll's rect ft_display_idx.clear(); std::map display_line; - for (block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); - it != block_timer_tree_df_iterator_t(); + for (LLTrace::block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); + it != LLTrace::end_block_timer_tree_df(); ++it) { BlockTimerStatHandle* idp = (*it); @@ -1311,8 +1311,8 @@ void LLFastTimerView::generateUniqueColors() F32 hue = 0.f; - for (block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); - it != block_timer_tree_df_iterator_t(); + for (LLTrace::block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); + it != LLTrace::end_block_timer_tree_df(); ++it) { BlockTimerStatHandle* idp = (*it); -- cgit v1.2.3 From 67ee70a6abe1e1b8ae1cc8e89e404357495fb313 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 12 Dec 2023 00:39:59 +0200 Subject: SL-20713 Crash at isAvatar Likely object was NULL --- indra/newview/llselectmgr.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d172a87b1d..f0d3e878dd 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -4308,9 +4308,12 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r BOOL LLSelectMgr::isMovableAvatarSelected() { - if (mAllowSelectAvatar) + if (mAllowSelectAvatar && getSelection()->getObjectCount() == 1) { - return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject()->isAvatar()) && getSelection()->getFirstMoveableNode(TRUE); + // nothing but avatar should be selected, so check that + // there is only one selected object and it is a root + LLViewerObject* obj = getSelection()->getFirstRootObject(); + return obj && obj->isAvatar() && getSelection()->getFirstMoveableNode(TRUE); } return FALSE; } -- cgit v1.2.3 From 7b3a0d86e2c8ec35f2cd1e5c4991d06ed460dee7 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 12 Dec 2023 01:12:15 +0200 Subject: SL-20712 Crash at null cache buffer --- indra/newview/llviewerregion.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 452dcdd8fd..6c0e25ae39 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2467,7 +2467,10 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry) //set parent id U32 parent_id = 0; - LLViewerObject::unpackParentID(entry->getDP(), parent_id); + if (entry->getDP()) // NULL if nothing cached + { + LLViewerObject::unpackParentID(entry->getDP(), parent_id); + } if(parent_id != entry->getParentID()) { entry->setParentID(parent_id); @@ -2487,7 +2490,7 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry) LLQuaternion rot; //decode spatial info and parent info - U32 parent_id = LLViewerObject::extractSpatialExtents(entry->getDP(), pos, scale, rot); + U32 parent_id = entry->getDP() ? LLViewerObject::extractSpatialExtents(entry->getDP(), pos, scale, rot) : entry->getParentID(); U32 old_parent_id = entry->getParentID(); bool same_old_parent = false; -- cgit v1.2.3 From 5abcec163c46c2bcb06ba9703c717f0e037f087e Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 12 Dec 2023 18:29:55 +0200 Subject: SL-20710 ignore pelvis fixup when sitting in mouselook --- indra/newview/llagentcamera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 29642d3f45..e54d3a2042 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -1773,7 +1773,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit) head_offset.clearVec(); F32 fixup; - if (gAgentAvatarp->hasPelvisFixup(fixup)) + if (gAgentAvatarp->hasPelvisFixup(fixup) && !gAgentAvatarp->isSitting()) { head_offset[VZ] -= fixup; } -- cgit v1.2.3 From 5b789e05f560c14024bd3749fe7ebc8c29926746 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 12 Dec 2023 19:02:54 +0200 Subject: DRTVWR-489 Update freetype to v.2.12.1.557becd --- autobuild.xml | 1478 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 744 insertions(+), 734 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index cf4d20c232..5c11097b11 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1,14 +1,19 @@ - - - version - 1.3 - type - autobuild + installables SDL + copyright + Copyright (C) 1997-2012 Sam Lantinga + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. + license + lgpl + license_file + LICENSES/SDL.txt + name + SDL platforms linux64 @@ -24,21 +29,21 @@ linux64 - license - lgpl - license_file - LICENSES/SDL.txt - copyright - Copyright (C) 1997-2012 Sam Lantinga version 1.2.15 - name - SDL - description - Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. apr_suite + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. + description + Apache portable runtime project + license + apache + license_file + LICENSES/apr_suite.txt + name + apr_suite platforms darwin64 @@ -82,21 +87,21 @@ windows64 - license - apache - license_file - LICENSES/apr_suite.txt - copyright - Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. version 1.7.2-e935465 - name - apr_suite - description - Apache portable runtime project boost + copyright + (see individual source files) + description + Boost C++ Libraries + license + boost 1.0 + license_file + LICENSES/boost.txt + name + boost platforms darwin64 @@ -128,21 +133,21 @@ windows64 - license - boost 1.0 - license_file - LICENSES/boost.txt - copyright - (see individual source files) version 1.81-09d25a7 - name - boost - description - Boost C++ Libraries bugsplat + copyright + Copyright 2003-2017, BugSplat + description + Bugsplat crash reporting package + license + Proprietary + license_file + LICENSES/BUGSPLAT_LICENSE.txt + name + bugsplat platforms darwin64 @@ -174,21 +179,19 @@ windows64 - license - Proprietary - license_file - LICENSES/BUGSPLAT_LICENSE.txt - copyright - Copyright 2003-2017, BugSplat version 4.0.3.0-527603a - name - bugsplat - description - Bugsplat crash reporting package colladadom + copyright + Copyright 2006 Sony Computer Entertainment Inc. + license + SCEA + license_file + LICENSES/collada.txt + name + colladadom platforms darwin64 @@ -220,19 +223,19 @@ windows64 - license - SCEA - license_file - LICENSES/collada.txt - copyright - Copyright 2006 Sony Computer Entertainment Inc. version 2.3.ab0c124 - name - colladadom cubemaptoequirectangular + copyright + Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com + license + MIT + license_file + LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt + name + cubemaptoequirectangular platforms darwin64 @@ -276,19 +279,21 @@ windows64 - license - MIT - license_file - LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt - copyright - Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com version 1.1.0 - name - cubemaptoequirectangular curl + copyright + Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). + description + Library for transferring data specified with URL syntax + license + curl + license_file + LICENSES/curl.txt + name + curl platforms darwin64 @@ -332,21 +337,21 @@ windows64 - license - curl - license_file - LICENSES/curl.txt - copyright - Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). version 7.54.1-5a4a82d - name - curl - description - Library for transferring data specified with URL syntax dbus_glib + copyright + Copyright (C) Red Hat Inc. + description + D-Bus bindings for glib + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + name + dbus_glib platforms linux64 @@ -362,21 +367,21 @@ linux64 - license - Academic Free License v. 2.1 - license_file - LICENSES/dbus-glib.txt - copyright - Copyright (C) Red Hat Inc. version 0.76 - name - dbus_glib - description - D-Bus bindings for glib dictionaries + copyright + Copyright 2014 Apache OpenOffice software + description + Spell checking dictionaries to bundled into the viewer + license + various open source + license_file + LICENSES/dictionaries.txt + name + dictionaries platforms common @@ -394,21 +399,21 @@ common - license - various open source - license_file - LICENSES/dictionaries.txt - copyright - Copyright 2014 Apache OpenOffice software version None - name - dictionaries - description - Spell checking dictionaries to bundled into the viewer dullahan + copyright + Copyright (c) 2017, Linden Research, Inc. + description + A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. + license + MPL + license_file + LICENSES/LICENSE.txt + name + dullahan platforms darwin64 @@ -440,18 +445,8 @@ windows64 - license - MPL - license_file - LICENSES/LICENSE.txt - copyright - Copyright (c) 2017, Linden Research, Inc. version 1.14.0.202310131404_118.4.1_g3dd6078_chromium-118.0.5993.54 - name - dullahan - description - A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. emoji_shortcodes @@ -499,6 +494,16 @@ expat + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + description + Expat is an XML parser library written in C + license + expat + license_file + LICENSES/expat.txt + name + expat platforms darwin64 @@ -544,21 +549,21 @@ windows64 - license - expat - license_file - LICENSES/expat.txt - copyright - Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. version 2.1.1.1f36d02 - name - expat - description - Expat is an XML parser library written in C fmodstudio + copyright + FMOD Studio by Firelight Technologies Pty Ltd. + description + FMOD Studio API + license + fmod + license_file + LICENSES/fmodstudio.txt + name + fmodstudio platforms darwin64 @@ -610,21 +615,21 @@ windows64 - license - fmod - license_file - LICENSES/fmodstudio.txt - copyright - FMOD Studio by Firelight Technologies Pty Ltd. version 2.02.13.578928 - name - fmodstudio - description - FMOD Studio API fontconfig + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. + description + Fontconfig is a library for configuring and customizing font access. + license + bsd + license_file + LICENSES/fontconfig.txt + name + fontconfig platforms linux64 @@ -640,21 +645,21 @@ linux64 - license - bsd - license_file - LICENSES/fontconfig.txt - copyright - Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. version 2.11.0 - name - fontconfig - description - Fontconfig is a library for configuring and customizing font access. freetype + copyright + Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. + description + Font rendering library + license + FreeType + license_file + LICENSES/freetype.txt + name + freetype platforms darwin64 @@ -662,11 +667,11 @@ archive hash - bc05f1d79b2935607af127c286b93a6804d27463 + d90a5c2fb4a729eeff3965ea6dd0a35cf146d379 hash_algorithm sha1 url - https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.1f4d9cc/freetype-2.12.1.1f4d9cc-darwin64-1f4d9cc.tar.zst + https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.557becd/freetype-2.12.1.557becd-darwin64-557becd.tar.zst name darwin64 @@ -676,45 +681,59 @@ archive hash - 92b7a5f300c1cc419800e5a664216e5955b475fc + 4a999279562e8f3e4ba02d3e78a844ddf6fe18f1 hash_algorithm sha1 url - https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.1f4d9cc/freetype-2.12.1.1f4d9cc-linux64-1f4d9cc.tar.zst + https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.557becd/freetype-2.12.1.557becd-linux64-557becd.tar.zst name linux64 + windows + + archive + + hash + 4fecff41a38d67d6b1c97c7c73980667b6a8a1bd + hash_algorithm + sha1 + url + https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.557becd/freetype-2.12.1.557becd-windows-557becd.tar.zst + + name + windows + windows64 archive hash - 20fd901015919c1c70160dc49effa2624fcd591b + 1837fdfd44204c78e79134944f824b0211817883 hash_algorithm sha1 url - https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.1f4d9cc/freetype-2.12.1.1f4d9cc-windows64-1f4d9cc.tar.zst + https://github.com/secondlife/3p-freetype/releases/download/v.2.12.1.557becd/freetype-2.12.1.557becd-windows64-557becd.tar.zst name windows64 - license - FreeType - license_file - LICENSES/freetype.txt - copyright - Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. version - 2.12.1.1f4d9cc - name - freetype - description - Font rendering library + 2.12.1.557becd glext + copyright + Copyright (c) 2007-2010 The Khronos Group Inc. + description + glext headers define function prototypes and constants for OpenGL extensions + license + Copyright (c) 2007-2010 The Khronos Group Inc. + license_file + LICENSES/glext.txt + name + glext platforms common @@ -732,21 +751,21 @@ common - license - Copyright (c) 2007-2010 The Khronos Group Inc. - license_file - LICENSES/glext.txt - copyright - Copyright (c) 2007-2010 The Khronos Group Inc. version 68 - name - glext - description - glext headers define function prototypes and constants for OpenGL extensions glh_linear + copyright + Copyright (c) 2000 Cass Everitt + description + glh - is a platform-indepenedent C++ OpenGL helper library + license + BSD + license_file + LICENSES/glh-linear.txt + name + glh_linear platforms common @@ -764,21 +783,21 @@ common - license - BSD - license_file - LICENSES/glh-linear.txt - copyright - Copyright (c) 2000 Cass Everitt version None - name - glh_linear - description - glh - is a platform-indepenedent C++ OpenGL helper library googlemock + copyright + Copyright 2008, Google Inc. + description + a library for writing and using C++ mock classes + license + BSD + license_file + LICENSES/gmock.txt + name + googlemock platforms darwin64 @@ -810,21 +829,19 @@ windows64 - license - BSD - license_file - LICENSES/gmock.txt - copyright - Copyright 2008, Google Inc. version 1.7.0.2b109d4 - name - googlemock - description - a library for writing and using C++ mock classes gstreamer + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + license + LGPL + license_file + LICENSES/gstreamer.txt + name + gstreamer platforms linux64 @@ -840,19 +857,19 @@ linux64 - license - LGPL - license_file - LICENSES/gstreamer.txt - copyright - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> version 0.10.6.314267 - name - gstreamer gtk-atk-pango-glib + copyright + Copyright (various, see sources) + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + name + gtk-atk-pango-glib platforms linux64 @@ -868,19 +885,21 @@ linux64 - license - lgpl - license_file - LICENSES/gtk-atk-pango-glib.txt - copyright - Copyright (various, see sources) version 0.1 - name - gtk-atk-pango-glib havok-source + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. + description + Havok source code for libs and demos + license + havok + license_file + LICENSES/havok.txt + name + havok-source platforms darwin64 @@ -928,18 +947,8 @@ windows64 - license - havok - license_file - LICENSES/havok.txt - copyright - Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. version 2012.1-2 - name - havok-source - description - Havok source code for libs and demos icu4c @@ -991,6 +1000,14 @@ jpegencoderbasic + copyright + Andreas Ritter, www.bytestrom.eu, 11/2009 + license + NONE + license_file + LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt + name + jpegencoderbasic platforms darwin64 @@ -1034,19 +1051,21 @@ windows64 - license - NONE - license_file - LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt - copyright - Andreas Ritter, www.bytestrom.eu, 11/2009 version 1.0 - name - jpegencoderbasic jpeglib + copyright + Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + description + JPEG encoding, decoding library + license + jpeglib + license_file + LICENSES/jpeglib.txt + name + jpeglib platforms darwin64 @@ -1092,21 +1111,21 @@ windows64 - license - jpeglib - license_file - LICENSES/jpeglib.txt - copyright - Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. version 8c.7846234 - name - jpeglib - description - JPEG encoding, decoding library jsoncpp + copyright + Copyright (c) 2007-2010 Baptiste Lepilleur + description + jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. + license + public domain + license_file + LICENSES/jsoncpp.txt + name + jsoncpp platforms darwin64 @@ -1152,21 +1171,21 @@ windows64 - license - public domain - license_file - LICENSES/jsoncpp.txt - copyright - Copyright (c) 2007-2010 Baptiste Lepilleur version 0.5.0.bc46e62 - name - jsoncpp - description - jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. kdu + copyright + Kakadu software + description + JPEG2000 library by Kakadu + license + Kakadu + license_file + LICENSES/kdu.txt + name + kdu platforms darwin64 @@ -1218,21 +1237,21 @@ windows64 - license - Kakadu - license_file - LICENSES/kdu.txt - copyright - Kakadu software version 7.10.4.539108 - name - kdu - description - JPEG2000 library by Kakadu libhunspell + copyright + See hunspell.txt + description + Spell checking library + license + LGPL + license_file + LICENSES/hunspell.txt + name + libhunspell platforms darwin64 @@ -1278,21 +1297,21 @@ windows64 - license - LGPL - license_file - LICENSES/hunspell.txt - copyright - See hunspell.txt version 1.3.2.650fb94 - name - libhunspell - description - Spell checking library libndofdev + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. + description + 3DConnexion SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + libndofdev platforms darwin64 @@ -1324,21 +1343,21 @@ windows64 - license - BSD - license_file - LICENSES/libndofdev.txt - copyright - Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. version 0.1.8e9edc7 - name - libndofdev - description - 3DConnexion SDK libpng + copyright + Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson + description + PNG Reference library + license + libpng + license_file + LICENSES/libpng.txt + name + libpng platforms darwin64 @@ -1382,21 +1401,21 @@ windows64 - license - libpng - license_file - LICENSES/libpng.txt - copyright - Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson version 1.6.38-ca06e99 - name - libpng - description - PNG Reference library libuuid + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). + license + UUID + license_file + LICENSES/uuid.txt + name + libuuid platforms linux64 @@ -1412,21 +1431,21 @@ linux64 - license - UUID - license_file - LICENSES/uuid.txt - copyright - Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> version 1.6.2 - name - libuuid - description - OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). libxml2 + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. + license + mit + license_file + LICENSES/libxml2.txt + name + libxml2 platforms darwin64 @@ -1472,21 +1491,21 @@ windows64 - license - mit - license_file - LICENSES/libxml2.txt - copyright - Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. version 2.9.4.7476681 - name - libxml2 - description - Libxml2 is the XML C parser and toolkit developed for the Gnome project. llappearance_utility + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab appearance utility for server-side avatar baking services. + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + name + llappearance_utility platforms linux @@ -1502,21 +1521,20 @@ linux - license - Proprietary - license_file - LICENSES/llappearanceutility.txt - copyright - Copyright (c) 2000-2012, Linden Research, Inc. version 0.0.1 - name - llappearance_utility - description - Linden Lab appearance utility for server-side avatar baking services. llca + copyright + Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. + + license + mit + license_file + LICENSES/ca-license.txt + name + llca platforms common @@ -1534,20 +1552,19 @@ common - license - mit - license_file - LICENSES/ca-license.txt - copyright - Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. - version 202310121530.0 - name - llca llphysicsextensions_source + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_source platforms darwin64 @@ -1599,19 +1616,19 @@ windows64 - license - internal - license_file - LICENSES/llphysicsextensions.txt - copyright - Copyright (c) 2010, Linden Research, Inc. version 1.0.565768 - name - llphysicsextensions_source llphysicsextensions_stub + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_stub platforms darwin64 @@ -1651,19 +1668,19 @@ windows - license - internal - license_file - LICENSES/llphysicsextensions.txt - copyright - Copyright (c) 2010, Linden Research, Inc. version 1.0.542456 - name - llphysicsextensions_stub llphysicsextensions_tpv + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/HavokSublicense.pdf + name + llphysicsextensions_tpv platforms darwin64 @@ -1703,19 +1720,17 @@ windows - license - internal - license_file - LICENSES/HavokSublicense.pdf - copyright - Copyright (c) 2010, Linden Research, Inc. version 1.0.561752 - name - llphysicsextensions_tpv mesa + license + mesa + license_file + LICENSES/mesa.txt + name + mesa platforms linux @@ -1731,17 +1746,23 @@ linux - license - mesa - license_file - LICENSES/mesa.txt version 7.11.1.297294 - name - mesa meshoptimizer + canonical_repo + https://bitbucket.org/lindenlab/3p-meshoptimizer + copyright + Copyright (c) 2016-2021 Arseny Kapoulkine + description + Meshoptimizer. Mesh optimization library. + license + meshoptimizer + license_file + LICENSES/meshoptimizer.txt + name + meshoptimizer platforms darwin64 @@ -1773,20 +1794,8 @@ windows64 - license - meshoptimizer - license_file - LICENSES/meshoptimizer.txt - copyright - Copyright (c) 2016-2021 Arseny Kapoulkine version 160 - name - meshoptimizer - canonical_repo - https://bitbucket.org/lindenlab/3p-meshoptimizer - description - Meshoptimizer. Mesh optimization library. mikktspace @@ -1846,6 +1855,18 @@ minizip-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-minizip-ng + copyright + This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. + license + minizip-ng + license_file + LICENSES/minizip-ng.txt + name + minizip-ng platforms darwin64 @@ -1891,20 +1912,8 @@ windows64 - license - minizip-ng - license_file - LICENSES/minizip-ng.txt - copyright - This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 3.0.2.3e9876e - name - minizip-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-minizip-ng - description - minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. nanosvg @@ -1964,6 +1973,17 @@ nghttp2 + copyright + Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors + description + Library providing HTTP 2 support for libcurl + license + MIT + license_file + LICENSES/nghttp2.txt + name + nghttp2 platforms darwin64 @@ -2009,24 +2029,23 @@ windows64 - license - MIT - license_file - LICENSES/nghttp2.txt - copyright - Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa -Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors - version - 1.40.0.b1526c6 - name - nghttp2 - description - Library providing HTTP 2 support for libcurl source_type hg + version + 1.40.0.b1526c6 nvapi + copyright + Copyright © 2012 NVIDIA Corporation. All rights reserved. + description + NVAPI provides an interface to NVIDIA devices. + license + NVIDIA Corporation Software License Agreement – NVAPI SDK + license_file + LICENSES/NVAPI_SDK_License_Agreement.pdf + name + nvapi platforms windows64 @@ -2044,21 +2063,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - NVIDIA Corporation Software License Agreement – NVAPI SDK - license_file - LICENSES/NVAPI_SDK_License_Agreement.pdf - copyright - Copyright © 2012 NVIDIA Corporation. All rights reserved. version 352.aac0e19 - name - nvapi - description - NVAPI provides an interface to NVIDIA devices. ogg_vorbis + copyright + Copyright (c) 2002, Xiph.org Foundation + description + Audio encoding library + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + name + ogg_vorbis platforms darwin64 @@ -2102,96 +2121,96 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - ogg-vorbis - license_file - LICENSES/ogg-vorbis.txt - copyright - Copyright (c) 2002, Xiph.org Foundation version 1.3.3-1.3.6.e4101b6 - name - ogg_vorbis - description - Audio encoding library open-libndofdev + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) + description + Open Source replacement for 3DConnection SDK license BSD license_file LICENSES/libndofdev.txt - copyright - Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) - version - 0.3 name open-libndofdev - description - Open Source replacement for 3DConnection SDK + version + 0.3 openal + copyright + Copyright (C) 1999-2007 by authors. + description + OpenAL Soft is a software implementation of the OpenAL 3D audio API. + license + LGPL2 + license_file + LICENSES/openal-soft.txt + name + openal platforms - linux64 + darwin64 archive hash - e0fbc4874acc4167a6e2b6489fbb8258d98fd665 + 4edaef5f03a1122eae8467c4a04d9caccaaaf847 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst name - linux64 + darwin64 - windows64 + linux64 archive hash - 6ae3b5310eb1988741bc55416681ca9d64f76f85 + e0fbc4874acc4167a6e2b6489fbb8258d98fd665 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst name - windows64 + linux64 - darwin64 + windows64 archive hash - 4edaef5f03a1122eae8467c4a04d9caccaaaf847 + 6ae3b5310eb1988741bc55416681ca9d64f76f85 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst name - darwin64 + windows64 - license - LGPL2 - license_file - LICENSES/openal-soft.txt - copyright - Copyright (C) 1999-2007 by authors. version 1.23.1 - name - openal - description - OpenAL Soft is a software implementation of the OpenAL 3D audio API. openjpeg + copyright + Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; + description + The OpenJPEG library is an open-source JPEG 2000 codec written in C language. + license + BSD + license_file + LICENSES/openjpeg.txt + name + openjpeg platforms darwin64 @@ -2237,21 +2256,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - BSD - license_file - LICENSES/openjpeg.txt - copyright - Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; version 2.5.0.ea12248 - name - openjpeg - description - The OpenJPEG library is an open-source JPEG 2000 codec written in C language. openssl + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library + license + openssl + license_file + LICENSES/openssl.txt + name + openssl platforms darwin64 @@ -2297,21 +2316,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - openssl - license_file - LICENSES/openssl.txt - copyright - Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) version 1.1.1q.de53f55 - name - openssl - description - Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library pcre + copyright + Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. + description + PCRE Perl-compatible regular expression library + license + bsd + license_file + LICENSES/pcre-license.txt + name + pcre platforms darwin64 @@ -2355,21 +2374,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - bsd - license_file - LICENSES/pcre-license.txt - copyright - Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. version 8.35.979fd86 - name - pcre - description - PCRE Perl-compatible regular expression library slvoice + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) + description + Vivox SDK components + license + Mixed + license_file + LICENSES/vivox_licenses.txt + name + slvoice platforms darwin64 @@ -2417,21 +2436,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - Mixed - license_file - LICENSES/vivox_licenses.txt - copyright - 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) version 4.10.0000.32327.5fc3fe7c.571099 - name - slvoice - description - Vivox SDK components threejs + copyright + Copyright © 2010-2021 three.js authors + license + MIT + license_file + LICENSES/THREEJS_LICENSE.txt + name + threejs platforms darwin64 @@ -2475,16 +2492,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - MIT - license_file - LICENSES/THREEJS_LICENSE.txt - copyright - Copyright © 2010-2021 three.js authors version 0.132.2 - name - threejs tinygltf @@ -2524,6 +2533,18 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tracy + canonical_repo + https://bitbucket.org/lindenlab/3p-tracy + copyright + Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) + description + Tracy Profiler Library + license + bsd + license_file + LICENSES/tracy_license.txt + name + tracy platforms darwin64 @@ -2553,20 +2574,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - bsd - license_file - LICENSES/tracy_license.txt - copyright - Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) - version - v0.8.1.235e98f - name - tracy - canonical_repo - https://bitbucket.org/lindenlab/3p-tracy - description - Tracy Profiler Library source https://bitbucket.org/lindenlab/3p-tracy source_type @@ -2576,6 +2583,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tut + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek + description + TUT is a small and portable unit test framework for C++. + license + bsd + license_file + LICENSES/tut.txt + name + tut platforms common @@ -2593,21 +2610,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors common - license - bsd - license_file - LICENSES/tut.txt - copyright - Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek version 2008.11.30 - name - tut - description - TUT is a small and portable unit test framework for C++. uriparser + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. + license + New BSD license + license_file + LICENSES/uriparser.txt + name + uriparser platforms darwin64 @@ -2653,18 +2670,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - New BSD license - license_file - LICENSES/uriparser.txt - copyright - Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> version 0.9.4 - name - uriparser - description - uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. viewer-fonts @@ -2710,6 +2717,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors viewer-manager + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab Viewer Management Process suite. + license + viewerlgpl + license_file + LICENSE + name + viewer-manager platforms darwin64 @@ -2755,25 +2772,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - viewerlgpl - license_file - LICENSE - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - version - 3.0.cc7ea1e - name - viewer-manager - description - Linden Lab Viewer Management Process suite. source https://bitbucket.org/lindenlab/vmp-standalone source_type hg + version + 3.0.cc7ea1e vlc-bin + copyright + Copyright (C) 1998-2016 VLC authors and VideoLAN + license + GPL2 + license_file + LICENSES/vlc.txt + name + vlc-bin platforms darwin64 @@ -2805,19 +2820,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - GPL2 - license_file - LICENSES/vlc.txt - copyright - Copyright (C) 1998-2016 VLC authors and VideoLAN version 3.0.16.c219a5d - name - vlc-bin - xmlrpc-epi + vulkan_gltf + canonical_repo + https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr + copyright + Copyright (c) 2018 Sascha Willems + description + Vulkan GLTF Sample Implementation + license + Copyright (c) 2018 Sascha Willems + license_file + LICENSES/vulkan_gltf.txt + name + vulkan_gltf platforms darwin64 @@ -2825,71 +2844,53 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - aa12611374876196b3ebb6bda8d419a697217b8b - hash_algorithm - sha1 + 8cff2060843db3db788511ee34a8e8cc url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 name darwin64 - linux64 + windows archive hash - ad0c8b41ee4b4de216382bec46ee1c25962a3f12 - hash_algorithm - sha1 + 58eea384be49ba756ce9c5e66669540b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 name - linux64 + windows windows64 archive hash - e53fd38c14b8c47c7c84dead8a1b211bb8be170c - hash_algorithm - sha1 + 79b6a11622c2f83cfc2b7cd1fafb867b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 name windows64 - license - xmlrpc-epi - license_file - LICENSES/xmlrpc-epi.txt - copyright - Copyright: (C) 2000 Epinions, Inc. version - 0.54.1.8a05acf - name - xmlrpc-epi - description - XMLRPC Library + 1 - vulkan_gltf + xmlrpc-epi - canonical_repo - https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr copyright - Copyright (c) 2018 Sascha Willems + Copyright: (C) 2000 Epinions, Inc. description - Vulkan GLTF Sample Implementation + XMLRPC Library license - Copyright (c) 2018 Sascha Willems + xmlrpc-epi license_file - LICENSES/vulkan_gltf.txt + LICENSES/xmlrpc-epi.txt name - vulkan_gltf + xmlrpc-epi platforms darwin64 @@ -2897,43 +2898,59 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8cff2060843db3db788511ee34a8e8cc + aa12611374876196b3ebb6bda8d419a697217b8b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst name darwin64 - windows + linux64 archive hash - 58eea384be49ba756ce9c5e66669540b + ad0c8b41ee4b4de216382bec46ee1c25962a3f12 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst name - windows + linux64 windows64 archive hash - 79b6a11622c2f83cfc2b7cd1fafb867b + e53fd38c14b8c47c7c84dead8a1b211bb8be170c + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst name windows64 version - 1 + 0.54.1.8a05acf xxhash + copyright + Copyright (c) 2012-2021 Yann Collet + description + xxHash Library + license + xxhash + license_file + LICENSES/xxhash.txt + name + xxhash platforms common @@ -2991,21 +3008,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - xxhash - license_file - LICENSES/xxhash.txt - copyright - Copyright (c) 2012-2021 Yann Collet version 0.8.1.7501c90 - name - xxhash - description - xxHash Library zlib-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-zlib-ng + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + zlib data compression library for the next generation systems + license + zlib-ng + license_file + LICENSES/zlib-ng.txt + name + zlib-ng platforms darwin64 @@ -3051,24 +3070,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - zlib-ng - license_file - LICENSES/zlib-ng.txt - copyright - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 1.2.11.zlib-ng.32fd361 - name - zlib-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-zlib-ng - description - zlib data compression library for the next generation systems package_description + canonical_repo + https://github.com/secondlife/viewer + copyright + Copyright (c) 2020, Linden Research, Inc. + description + Second Life Viewer + license + LGPL + license_file + docs/LICENSE-source.txt + name + Second Life Viewer platforms common @@ -3077,6 +3096,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfo + build + + configure command @@ -3089,9 +3111,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=TRUE - build - - name RelWithDebInfo @@ -3099,6 +3118,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure + arguments + + ../indra + command cmake options @@ -3108,16 +3131,15 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - arguments - - ../indra - name RelWithDebInfoOS Release + build + + configure command @@ -3130,9 +3152,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=TRUE - build - - name Release @@ -3140,6 +3159,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure + arguments + + ../indra + command cmake options @@ -3149,10 +3172,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - arguments - - ../indra - name ReleaseOS @@ -3163,22 +3182,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors darwin64 + build_directory + build-darwin-x86_64 configurations RelWithDebInfo - configure - - options - - -G - Xcode - - arguments - - ../indra - - build command @@ -3192,21 +3201,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets - default - True - name - RelWithDebInfo - - RelWithDebInfoOS - configure + arguments + + ../indra + options -G Xcode + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + build command @@ -3220,11 +3233,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets - name - RelWithDebInfoOS - - Release - configure options @@ -3232,11 +3240,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode - arguments - - ../indra - + name + RelWithDebInfoOS + + Release + build command @@ -3250,19 +3259,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets - name - Release - - ReleaseOS - configure + arguments + + ../indra + options -G Xcode + name + Release + + ReleaseOS + build command @@ -3276,38 +3289,46 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets + configure + + options + + -G + Xcode + + name ReleaseOS - build_directory - build-darwin-x86_64 name darwin64 linux64 + build_directory + build-linux-x86_64 configurations Release + build + + command + ninja + configure + arguments + + ../indra + options -G Ninja -DLL_TESTS=Off - arguments - - ../indra - - - build - - command - ninja default True @@ -3316,6 +3337,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ReleaseOS + build + + command + ninja + configure options @@ -3325,11 +3351,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DLL_TESTS=Off - build - - command - ninja - name ReleaseOS @@ -3342,33 +3363,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors default - build_directory - build-linux-x86_64 name linux64 windows + build_directory + build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE configurations RelWithDebInfo - configure + build - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - arguments - ..\indra + SecondLife.sln - - build - command devenv options @@ -3376,9 +3387,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + + configure + arguments - SecondLife.sln + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} default @@ -3388,25 +3409,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfoOS - configure + build - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - arguments - ..\indra + SecondLife.sln - - build - command msbuild.exe options @@ -3418,32 +3426,35 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - arguments - - SecondLife.sln - - name - RelWithDebInfoOS - - Release - configure + arguments + + ..\indra + options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - arguments - - ..\indra + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + name + RelWithDebInfoOS + + Release + build + arguments + + SecondLife.sln + command devenv options @@ -3451,36 +3462,32 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - arguments - - SecondLife.sln - - name - Release - - ReleaseOS - configure + arguments + + ..\indra + options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DUNATTENDED:BOOL=ON - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - - arguments - - ..\indra + name + Release + + ReleaseOS + build + arguments + + SecondLife.sln + command msbuild.exe options @@ -3492,35 +3499,38 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental + + configure + arguments - SecondLife.sln + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + -DUNATTENDED:BOOL=ON + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON name ReleaseOS - build_directory - build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE name windows - license - LGPL - license_file - docs/LICENSE-source.txt - copyright - Copyright (c) 2020, Linden Research, Inc. version_file newview/viewer_version.txt - name - Second Life Viewer - canonical_repo - https://github.com/secondlife/viewer - description - Second Life Viewer - - + type + autobuild + version + 1.3 + -- cgit v1.2.3 From 88921452adf528bf7aecc2d2fe893ecb5574bde0 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Wed, 13 Dec 2023 06:26:06 +0200 Subject: DRTVWR-489 Restore autobuild.xml format --- autobuild.xml | 1430 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 717 insertions(+), 713 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 5c11097b11..8d8ffe0084 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1,19 +1,14 @@ - + + + version + 1.3 + type + autobuild installables SDL - copyright - Copyright (C) 1997-2012 Sam Lantinga - description - Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. - license - lgpl - license_file - LICENSES/SDL.txt - name - SDL platforms linux64 @@ -29,21 +24,21 @@ linux64 + license + lgpl + license_file + LICENSES/SDL.txt + copyright + Copyright (C) 1997-2012 Sam Lantinga version 1.2.15 + name + SDL + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. apr_suite - copyright - Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. - description - Apache portable runtime project - license - apache - license_file - LICENSES/apr_suite.txt - name - apr_suite platforms darwin64 @@ -87,21 +82,21 @@ windows64 + license + apache + license_file + LICENSES/apr_suite.txt + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. version 1.7.2-e935465 + name + apr_suite + description + Apache portable runtime project boost - copyright - (see individual source files) - description - Boost C++ Libraries - license - boost 1.0 - license_file - LICENSES/boost.txt - name - boost platforms darwin64 @@ -133,21 +128,21 @@ windows64 + license + boost 1.0 + license_file + LICENSES/boost.txt + copyright + (see individual source files) version 1.81-09d25a7 + name + boost + description + Boost C++ Libraries bugsplat - copyright - Copyright 2003-2017, BugSplat - description - Bugsplat crash reporting package - license - Proprietary - license_file - LICENSES/BUGSPLAT_LICENSE.txt - name - bugsplat platforms darwin64 @@ -179,19 +174,21 @@ windows64 + license + Proprietary + license_file + LICENSES/BUGSPLAT_LICENSE.txt + copyright + Copyright 2003-2017, BugSplat version 4.0.3.0-527603a + name + bugsplat + description + Bugsplat crash reporting package colladadom - copyright - Copyright 2006 Sony Computer Entertainment Inc. - license - SCEA - license_file - LICENSES/collada.txt - name - colladadom platforms darwin64 @@ -223,19 +220,19 @@ windows64 + license + SCEA + license_file + LICENSES/collada.txt + copyright + Copyright 2006 Sony Computer Entertainment Inc. version 2.3.ab0c124 + name + colladadom cubemaptoequirectangular - copyright - Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com - license - MIT - license_file - LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt - name - cubemaptoequirectangular platforms darwin64 @@ -279,21 +276,19 @@ windows64 + license + MIT + license_file + LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt + copyright + Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com version 1.1.0 + name + cubemaptoequirectangular curl - copyright - Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). - description - Library for transferring data specified with URL syntax - license - curl - license_file - LICENSES/curl.txt - name - curl platforms darwin64 @@ -337,21 +332,21 @@ windows64 + license + curl + license_file + LICENSES/curl.txt + copyright + Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). version 7.54.1-5a4a82d + name + curl + description + Library for transferring data specified with URL syntax dbus_glib - copyright - Copyright (C) Red Hat Inc. - description - D-Bus bindings for glib - license - Academic Free License v. 2.1 - license_file - LICENSES/dbus-glib.txt - name - dbus_glib platforms linux64 @@ -367,21 +362,21 @@ linux64 + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + copyright + Copyright (C) Red Hat Inc. version 0.76 + name + dbus_glib + description + D-Bus bindings for glib dictionaries - copyright - Copyright 2014 Apache OpenOffice software - description - Spell checking dictionaries to bundled into the viewer - license - various open source - license_file - LICENSES/dictionaries.txt - name - dictionaries platforms common @@ -399,21 +394,21 @@ common + license + various open source + license_file + LICENSES/dictionaries.txt + copyright + Copyright 2014 Apache OpenOffice software version None + name + dictionaries + description + Spell checking dictionaries to bundled into the viewer dullahan - copyright - Copyright (c) 2017, Linden Research, Inc. - description - A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. - license - MPL - license_file - LICENSES/LICENSE.txt - name - dullahan platforms darwin64 @@ -445,8 +440,18 @@ windows64 + license + MPL + license_file + LICENSES/LICENSE.txt + copyright + Copyright (c) 2017, Linden Research, Inc. version 1.14.0.202310131404_118.4.1_g3dd6078_chromium-118.0.5993.54 + name + dullahan + description + A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. emoji_shortcodes @@ -494,16 +499,6 @@ expat - copyright - Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - description - Expat is an XML parser library written in C - license - expat - license_file - LICENSES/expat.txt - name - expat platforms darwin64 @@ -549,21 +544,21 @@ windows64 + license + expat + license_file + LICENSES/expat.txt + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. version 2.1.1.1f36d02 + name + expat + description + Expat is an XML parser library written in C fmodstudio - copyright - FMOD Studio by Firelight Technologies Pty Ltd. - description - FMOD Studio API - license - fmod - license_file - LICENSES/fmodstudio.txt - name - fmodstudio platforms darwin64 @@ -615,21 +610,21 @@ windows64 + license + fmod + license_file + LICENSES/fmodstudio.txt + copyright + FMOD Studio by Firelight Technologies Pty Ltd. version 2.02.13.578928 + name + fmodstudio + description + FMOD Studio API fontconfig - copyright - Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. - description - Fontconfig is a library for configuring and customizing font access. - license - bsd - license_file - LICENSES/fontconfig.txt - name - fontconfig platforms linux64 @@ -645,8 +640,18 @@ linux64 + license + bsd + license_file + LICENSES/fontconfig.txt + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. version 2.11.0 + name + fontconfig + description + Fontconfig is a library for configuring and customizing font access. freetype @@ -724,16 +729,6 @@ glext - copyright - Copyright (c) 2007-2010 The Khronos Group Inc. - description - glext headers define function prototypes and constants for OpenGL extensions - license - Copyright (c) 2007-2010 The Khronos Group Inc. - license_file - LICENSES/glext.txt - name - glext platforms common @@ -751,21 +746,21 @@ common + license + Copyright (c) 2007-2010 The Khronos Group Inc. + license_file + LICENSES/glext.txt + copyright + Copyright (c) 2007-2010 The Khronos Group Inc. version 68 + name + glext + description + glext headers define function prototypes and constants for OpenGL extensions glh_linear - copyright - Copyright (c) 2000 Cass Everitt - description - glh - is a platform-indepenedent C++ OpenGL helper library - license - BSD - license_file - LICENSES/glh-linear.txt - name - glh_linear platforms common @@ -783,21 +778,21 @@ common + license + BSD + license_file + LICENSES/glh-linear.txt + copyright + Copyright (c) 2000 Cass Everitt version None + name + glh_linear + description + glh - is a platform-indepenedent C++ OpenGL helper library googlemock - copyright - Copyright 2008, Google Inc. - description - a library for writing and using C++ mock classes - license - BSD - license_file - LICENSES/gmock.txt - name - googlemock platforms darwin64 @@ -829,19 +824,21 @@ windows64 + license + BSD + license_file + LICENSES/gmock.txt + copyright + Copyright 2008, Google Inc. version 1.7.0.2b109d4 + name + googlemock + description + a library for writing and using C++ mock classes gstreamer - copyright - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - license - LGPL - license_file - LICENSES/gstreamer.txt - name - gstreamer platforms linux64 @@ -857,19 +854,19 @@ linux64 + license + LGPL + license_file + LICENSES/gstreamer.txt + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> version 0.10.6.314267 + name + gstreamer gtk-atk-pango-glib - copyright - Copyright (various, see sources) - license - lgpl - license_file - LICENSES/gtk-atk-pango-glib.txt - name - gtk-atk-pango-glib platforms linux64 @@ -885,21 +882,19 @@ linux64 + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + copyright + Copyright (various, see sources) version 0.1 + name + gtk-atk-pango-glib havok-source - copyright - Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. - description - Havok source code for libs and demos - license - havok - license_file - LICENSES/havok.txt - name - havok-source platforms darwin64 @@ -947,8 +942,18 @@ windows64 + license + havok + license_file + LICENSES/havok.txt + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. version 2012.1-2 + name + havok-source + description + Havok source code for libs and demos icu4c @@ -1000,14 +1005,6 @@ jpegencoderbasic - copyright - Andreas Ritter, www.bytestrom.eu, 11/2009 - license - NONE - license_file - LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt - name - jpegencoderbasic platforms darwin64 @@ -1051,21 +1048,19 @@ windows64 + license + NONE + license_file + LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt + copyright + Andreas Ritter, www.bytestrom.eu, 11/2009 version 1.0 + name + jpegencoderbasic jpeglib - copyright - Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. - description - JPEG encoding, decoding library - license - jpeglib - license_file - LICENSES/jpeglib.txt - name - jpeglib platforms darwin64 @@ -1111,21 +1106,21 @@ windows64 + license + jpeglib + license_file + LICENSES/jpeglib.txt + copyright + Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. version 8c.7846234 + name + jpeglib + description + JPEG encoding, decoding library jsoncpp - copyright - Copyright (c) 2007-2010 Baptiste Lepilleur - description - jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. - license - public domain - license_file - LICENSES/jsoncpp.txt - name - jsoncpp platforms darwin64 @@ -1171,21 +1166,21 @@ windows64 + license + public domain + license_file + LICENSES/jsoncpp.txt + copyright + Copyright (c) 2007-2010 Baptiste Lepilleur version 0.5.0.bc46e62 + name + jsoncpp + description + jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. kdu - copyright - Kakadu software - description - JPEG2000 library by Kakadu - license - Kakadu - license_file - LICENSES/kdu.txt - name - kdu platforms darwin64 @@ -1237,21 +1232,21 @@ windows64 + license + Kakadu + license_file + LICENSES/kdu.txt + copyright + Kakadu software version 7.10.4.539108 + name + kdu + description + JPEG2000 library by Kakadu libhunspell - copyright - See hunspell.txt - description - Spell checking library - license - LGPL - license_file - LICENSES/hunspell.txt - name - libhunspell platforms darwin64 @@ -1297,21 +1292,21 @@ windows64 + license + LGPL + license_file + LICENSES/hunspell.txt + copyright + See hunspell.txt version 1.3.2.650fb94 + name + libhunspell + description + Spell checking library libndofdev - copyright - Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. - description - 3DConnexion SDK - license - BSD - license_file - LICENSES/libndofdev.txt - name - libndofdev platforms darwin64 @@ -1343,21 +1338,21 @@ windows64 + license + BSD + license_file + LICENSES/libndofdev.txt + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. version 0.1.8e9edc7 + name + libndofdev + description + 3DConnexion SDK libpng - copyright - Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson - description - PNG Reference library - license - libpng - license_file - LICENSES/libpng.txt - name - libpng platforms darwin64 @@ -1401,21 +1396,21 @@ windows64 + license + libpng + license_file + LICENSES/libpng.txt + copyright + Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson version 1.6.38-ca06e99 + name + libpng + description + PNG Reference library libuuid - copyright - Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> - description - OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). - license - UUID - license_file - LICENSES/uuid.txt - name - libuuid platforms linux64 @@ -1431,21 +1426,21 @@ linux64 + license + UUID + license_file + LICENSES/uuid.txt + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> version 1.6.2 + name + libuuid + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). libxml2 - copyright - Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. - description - Libxml2 is the XML C parser and toolkit developed for the Gnome project. - license - mit - license_file - LICENSES/libxml2.txt - name - libxml2 platforms darwin64 @@ -1491,21 +1486,21 @@ windows64 + license + mit + license_file + LICENSES/libxml2.txt + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. version 2.9.4.7476681 + name + libxml2 + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. llappearance_utility - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - description - Linden Lab appearance utility for server-side avatar baking services. - license - Proprietary - license_file - LICENSES/llappearanceutility.txt - name - llappearance_utility platforms linux @@ -1521,20 +1516,21 @@ linux + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + copyright + Copyright (c) 2000-2012, Linden Research, Inc. version 0.0.1 + name + llappearance_utility + description + Linden Lab appearance utility for server-side avatar baking services. llca - copyright - Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. - - license - mit - license_file - LICENSES/ca-license.txt - name - llca platforms common @@ -1552,19 +1548,20 @@ common + license + mit + license_file + LICENSES/ca-license.txt + copyright + Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. + version 202310121530.0 + name + llca llphysicsextensions_source - copyright - Copyright (c) 2010, Linden Research, Inc. - license - internal - license_file - LICENSES/llphysicsextensions.txt - name - llphysicsextensions_source platforms darwin64 @@ -1616,19 +1613,19 @@ windows64 - version - 1.0.565768 - - llphysicsextensions_stub - - copyright - Copyright (c) 2010, Linden Research, Inc. license internal license_file LICENSES/llphysicsextensions.txt + copyright + Copyright (c) 2010, Linden Research, Inc. + version + 1.0.565768 name - llphysicsextensions_stub + llphysicsextensions_source + + llphysicsextensions_stub + platforms darwin64 @@ -1668,19 +1665,19 @@ windows + license + internal + license_file + LICENSES/llphysicsextensions.txt + copyright + Copyright (c) 2010, Linden Research, Inc. version 1.0.542456 + name + llphysicsextensions_stub llphysicsextensions_tpv - copyright - Copyright (c) 2010, Linden Research, Inc. - license - internal - license_file - LICENSES/HavokSublicense.pdf - name - llphysicsextensions_tpv platforms darwin64 @@ -1720,17 +1717,19 @@ windows + license + internal + license_file + LICENSES/HavokSublicense.pdf + copyright + Copyright (c) 2010, Linden Research, Inc. version 1.0.561752 + name + llphysicsextensions_tpv mesa - license - mesa - license_file - LICENSES/mesa.txt - name - mesa platforms linux @@ -1746,23 +1745,17 @@ linux + license + mesa + license_file + LICENSES/mesa.txt version 7.11.1.297294 + name + mesa meshoptimizer - canonical_repo - https://bitbucket.org/lindenlab/3p-meshoptimizer - copyright - Copyright (c) 2016-2021 Arseny Kapoulkine - description - Meshoptimizer. Mesh optimization library. - license - meshoptimizer - license_file - LICENSES/meshoptimizer.txt - name - meshoptimizer platforms darwin64 @@ -1794,8 +1787,20 @@ windows64 + license + meshoptimizer + license_file + LICENSES/meshoptimizer.txt + copyright + Copyright (c) 2016-2021 Arseny Kapoulkine version 160 + name + meshoptimizer + canonical_repo + https://bitbucket.org/lindenlab/3p-meshoptimizer + description + Meshoptimizer. Mesh optimization library. mikktspace @@ -1855,18 +1860,6 @@ minizip-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-minizip-ng - copyright - This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - description - minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. - license - minizip-ng - license_file - LICENSES/minizip-ng.txt - name - minizip-ng platforms darwin64 @@ -1912,8 +1905,20 @@ windows64 + license + minizip-ng + license_file + LICENSES/minizip-ng.txt + copyright + This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 3.0.2.3e9876e + name + minizip-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-minizip-ng + description + minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. nanosvg @@ -1973,17 +1978,6 @@ nghttp2 - copyright - Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa -Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors - description - Library providing HTTP 2 support for libcurl - license - MIT - license_file - LICENSES/nghttp2.txt - name - nghttp2 platforms darwin64 @@ -2029,23 +2023,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - source_type - hg + license + MIT + license_file + LICENSES/nghttp2.txt + copyright + Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors version 1.40.0.b1526c6 + name + nghttp2 + description + Library providing HTTP 2 support for libcurl + source_type + hg nvapi - copyright - Copyright © 2012 NVIDIA Corporation. All rights reserved. - description - NVAPI provides an interface to NVIDIA devices. - license - NVIDIA Corporation Software License Agreement – NVAPI SDK - license_file - LICENSES/NVAPI_SDK_License_Agreement.pdf - name - nvapi platforms windows64 @@ -2063,21 +2058,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + NVIDIA Corporation Software License Agreement – NVAPI SDK + license_file + LICENSES/NVAPI_SDK_License_Agreement.pdf + copyright + Copyright © 2012 NVIDIA Corporation. All rights reserved. version 352.aac0e19 + name + nvapi + description + NVAPI provides an interface to NVIDIA devices. ogg_vorbis - copyright - Copyright (c) 2002, Xiph.org Foundation - description - Audio encoding library - license - ogg-vorbis - license_file - LICENSES/ogg-vorbis.txt - name - ogg_vorbis platforms darwin64 @@ -2121,96 +2116,96 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + copyright + Copyright (c) 2002, Xiph.org Foundation version 1.3.3-1.3.6.e4101b6 + name + ogg_vorbis + description + Audio encoding library open-libndofdev - copyright - Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) - description - Open Source replacement for 3DConnection SDK license BSD license_file LICENSES/libndofdev.txt - name - open-libndofdev + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) version 0.3 + name + open-libndofdev + description + Open Source replacement for 3DConnection SDK openal - copyright - Copyright (C) 1999-2007 by authors. - description - OpenAL Soft is a software implementation of the OpenAL 3D audio API. - license - LGPL2 - license_file - LICENSES/openal-soft.txt - name - openal platforms - darwin64 + linux64 archive hash - 4edaef5f03a1122eae8467c4a04d9caccaaaf847 + e0fbc4874acc4167a6e2b6489fbb8258d98fd665 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst name - darwin64 + linux64 - linux64 + windows64 archive hash - e0fbc4874acc4167a6e2b6489fbb8258d98fd665 + 6ae3b5310eb1988741bc55416681ca9d64f76f85 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst name - linux64 + windows64 - windows64 + darwin64 archive hash - 6ae3b5310eb1988741bc55416681ca9d64f76f85 + 4edaef5f03a1122eae8467c4a04d9caccaaaf847 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst name - windows64 + darwin64 + license + LGPL2 + license_file + LICENSES/openal-soft.txt + copyright + Copyright (C) 1999-2007 by authors. version 1.23.1 + name + openal + description + OpenAL Soft is a software implementation of the OpenAL 3D audio API. openjpeg - copyright - Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; - description - The OpenJPEG library is an open-source JPEG 2000 codec written in C language. - license - BSD - license_file - LICENSES/openjpeg.txt - name - openjpeg platforms darwin64 @@ -2256,21 +2251,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + BSD + license_file + LICENSES/openjpeg.txt + copyright + Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; version 2.5.0.ea12248 + name + openjpeg + description + The OpenJPEG library is an open-source JPEG 2000 codec written in C language. openssl - copyright - Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - description - Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library - license - openssl - license_file - LICENSES/openssl.txt - name - openssl platforms darwin64 @@ -2316,21 +2311,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + openssl + license_file + LICENSES/openssl.txt + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) version 1.1.1q.de53f55 + name + openssl + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library pcre - copyright - Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. - description - PCRE Perl-compatible regular expression library - license - bsd - license_file - LICENSES/pcre-license.txt - name - pcre platforms darwin64 @@ -2374,21 +2369,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + bsd + license_file + LICENSES/pcre-license.txt + copyright + Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. version 8.35.979fd86 + name + pcre + description + PCRE Perl-compatible regular expression library slvoice - copyright - 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) - description - Vivox SDK components - license - Mixed - license_file - LICENSES/vivox_licenses.txt - name - slvoice platforms darwin64 @@ -2436,19 +2431,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + Mixed + license_file + LICENSES/vivox_licenses.txt + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) version 4.10.0000.32327.5fc3fe7c.571099 + name + slvoice + description + Vivox SDK components threejs - copyright - Copyright © 2010-2021 three.js authors - license - MIT - license_file - LICENSES/THREEJS_LICENSE.txt - name - threejs platforms darwin64 @@ -2492,8 +2489,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + MIT + license_file + LICENSES/THREEJS_LICENSE.txt + copyright + Copyright © 2010-2021 three.js authors version 0.132.2 + name + threejs tinygltf @@ -2533,18 +2538,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tracy - canonical_repo - https://bitbucket.org/lindenlab/3p-tracy - copyright - Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) - description - Tracy Profiler Library - license - bsd - license_file - LICENSES/tracy_license.txt - name - tracy platforms darwin64 @@ -2574,6 +2567,20 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + bsd + license_file + LICENSES/tracy_license.txt + copyright + Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) + version + v0.8.1.235e98f + name + tracy + canonical_repo + https://bitbucket.org/lindenlab/3p-tracy + description + Tracy Profiler Library source https://bitbucket.org/lindenlab/3p-tracy source_type @@ -2583,16 +2590,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tut - copyright - Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek - description - TUT is a small and portable unit test framework for C++. - license - bsd - license_file - LICENSES/tut.txt - name - tut platforms common @@ -2610,21 +2607,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors common + license + bsd + license_file + LICENSES/tut.txt + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek version 2008.11.30 + name + tut + description + TUT is a small and portable unit test framework for C++. uriparser - copyright - Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> - description - uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. - license - New BSD license - license_file - LICENSES/uriparser.txt - name - uriparser platforms darwin64 @@ -2670,8 +2667,18 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + New BSD license + license_file + LICENSES/uriparser.txt + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> version 0.9.4 + name + uriparser + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. viewer-fonts @@ -2717,16 +2724,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors viewer-manager - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - description - Linden Lab Viewer Management Process suite. - license - viewerlgpl - license_file - LICENSE - name - viewer-manager platforms darwin64 @@ -2772,23 +2769,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + viewerlgpl + license_file + LICENSE + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + version + 3.0.cc7ea1e + name + viewer-manager + description + Linden Lab Viewer Management Process suite. source https://bitbucket.org/lindenlab/vmp-standalone source_type hg - version - 3.0.cc7ea1e vlc-bin - copyright - Copyright (C) 1998-2016 VLC authors and VideoLAN - license - GPL2 - license_file - LICENSES/vlc.txt - name - vlc-bin platforms darwin64 @@ -2820,23 +2819,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + GPL2 + license_file + LICENSES/vlc.txt + copyright + Copyright (C) 1998-2016 VLC authors and VideoLAN version 3.0.16.c219a5d + name + vlc-bin - vulkan_gltf + xmlrpc-epi - canonical_repo - https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr - copyright - Copyright (c) 2018 Sascha Willems - description - Vulkan GLTF Sample Implementation - license - Copyright (c) 2018 Sascha Willems - license_file - LICENSES/vulkan_gltf.txt - name - vulkan_gltf platforms darwin64 @@ -2844,53 +2839,71 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8cff2060843db3db788511ee34a8e8cc + aa12611374876196b3ebb6bda8d419a697217b8b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst name darwin64 - windows + linux64 archive hash - 58eea384be49ba756ce9c5e66669540b + ad0c8b41ee4b4de216382bec46ee1c25962a3f12 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst name - windows + linux64 windows64 archive hash - 79b6a11622c2f83cfc2b7cd1fafb867b + e53fd38c14b8c47c7c84dead8a1b211bb8be170c + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst name windows64 + license + xmlrpc-epi + license_file + LICENSES/xmlrpc-epi.txt + copyright + Copyright: (C) 2000 Epinions, Inc. version - 1 + 0.54.1.8a05acf + name + xmlrpc-epi + description + XMLRPC Library - xmlrpc-epi + vulkan_gltf + canonical_repo + https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr copyright - Copyright: (C) 2000 Epinions, Inc. + Copyright (c) 2018 Sascha Willems description - XMLRPC Library + Vulkan GLTF Sample Implementation license - xmlrpc-epi + Copyright (c) 2018 Sascha Willems license_file - LICENSES/xmlrpc-epi.txt + LICENSES/vulkan_gltf.txt name - xmlrpc-epi + vulkan_gltf platforms darwin64 @@ -2898,59 +2911,43 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - aa12611374876196b3ebb6bda8d419a697217b8b - hash_algorithm - sha1 + 8cff2060843db3db788511ee34a8e8cc url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 name darwin64 - linux64 + windows archive hash - ad0c8b41ee4b4de216382bec46ee1c25962a3f12 - hash_algorithm - sha1 + 58eea384be49ba756ce9c5e66669540b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 name - linux64 + windows windows64 archive hash - e53fd38c14b8c47c7c84dead8a1b211bb8be170c - hash_algorithm - sha1 + 79b6a11622c2f83cfc2b7cd1fafb867b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 name windows64 version - 0.54.1.8a05acf + 1 xxhash - copyright - Copyright (c) 2012-2021 Yann Collet - description - xxHash Library - license - xxhash - license_file - LICENSES/xxhash.txt - name - xxhash platforms common @@ -3008,23 +3005,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + xxhash + license_file + LICENSES/xxhash.txt + copyright + Copyright (c) 2012-2021 Yann Collet version 0.8.1.7501c90 + name + xxhash + description + xxHash Library zlib-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-zlib-ng - copyright - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - description - zlib data compression library for the next generation systems - license - zlib-ng - license_file - LICENSES/zlib-ng.txt - name - zlib-ng platforms darwin64 @@ -3070,24 +3065,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + zlib-ng + license_file + LICENSES/zlib-ng.txt + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 1.2.11.zlib-ng.32fd361 + name + zlib-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-zlib-ng + description + zlib data compression library for the next generation systems package_description - canonical_repo - https://github.com/secondlife/viewer - copyright - Copyright (c) 2020, Linden Research, Inc. - description - Second Life Viewer - license - LGPL - license_file - docs/LICENSE-source.txt - name - Second Life Viewer platforms common @@ -3096,9 +3091,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfo - build - - configure command @@ -3111,6 +3103,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=TRUE + build + + name RelWithDebInfo @@ -3118,10 +3113,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure - arguments - - ../indra - command cmake options @@ -3131,15 +3122,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE + arguments + + ../indra + name RelWithDebInfoOS Release - build - - configure command @@ -3152,6 +3144,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DINSTALL_PROPRIETARY=TRUE + build + + name Release @@ -3159,10 +3154,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure - arguments - - ../indra - command cmake options @@ -3172,6 +3163,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE + arguments + + ../indra + name ReleaseOS @@ -3182,12 +3177,22 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors darwin64 - build_directory - build-darwin-x86_64 configurations RelWithDebInfo + configure + + options + + -G + Xcode + + arguments + + ../indra + + build command @@ -3201,25 +3206,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + configure - arguments - - ../indra - options -G Xcode - default - True - name - RelWithDebInfo - - RelWithDebInfoOS - build command @@ -3233,6 +3234,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets + name + RelWithDebInfoOS + + Release + configure options @@ -3240,12 +3246,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Xcode + arguments + + ../indra + - name - RelWithDebInfoOS - - Release - build command @@ -3259,23 +3264,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets + name + Release + + ReleaseOS + configure - arguments - - ../indra - options -G Xcode - name - Release - - ReleaseOS - build command @@ -3289,46 +3290,38 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -parallelizeTargets - configure - - options - - -G - Xcode - - name ReleaseOS + build_directory + build-darwin-x86_64 name darwin64 linux64 - build_directory - build-linux-x86_64 configurations Release - build - - command - ninja - configure - arguments - - ../indra - options -G Ninja -DLL_TESTS=Off + arguments + + ../indra + + + build + + command + ninja default True @@ -3337,11 +3330,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ReleaseOS - build - - command - ninja - configure options @@ -3351,6 +3339,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DLL_TESTS=Off + build + + command + ninja + name ReleaseOS @@ -3363,23 +3356,33 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors default + build_directory + build-linux-x86_64 name linux64 windows - build_directory - build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE configurations RelWithDebInfo - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + arguments - SecondLife.sln + ..\indra + + build + command devenv options @@ -3387,19 +3390,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - configure - arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + SecondLife.sln default @@ -3409,12 +3402,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfoOS - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + arguments - SecondLife.sln + ..\indra + + build + command msbuild.exe options @@ -3426,22 +3432,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - - configure - arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON + SecondLife.sln name @@ -3449,12 +3442,22 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors Release - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + arguments - SecondLife.sln + ..\indra + + build + command devenv options @@ -3462,19 +3465,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /build Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - configure - arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + SecondLife.sln name @@ -3482,12 +3475,26 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ReleaseOS - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + -DUNATTENDED:BOOL=ON + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + arguments - SecondLife.sln + ..\indra + + build + command msbuild.exe options @@ -3499,38 +3506,35 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - - configure - arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DUNATTENDED:BOOL=ON - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON + SecondLife.sln name ReleaseOS + build_directory + build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE name windows + license + LGPL + license_file + docs/LICENSE-source.txt + copyright + Copyright (c) 2020, Linden Research, Inc. version_file newview/viewer_version.txt + name + Second Life Viewer + canonical_repo + https://github.com/secondlife/viewer + description + Second Life Viewer - type - autobuild - version - 1.3 - + + -- cgit v1.2.3 From 0db9bcf21fd4b7172e8a35cdb2805ccdc736e273 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Wed, 13 Dec 2023 20:20:01 +0100 Subject: SL-20279 BugSplat Crash #1327171: gl_debug_callback(111) --- indra/llrender/llgl.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 4c7c8e6f5c..f7fb46e310 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -94,6 +94,17 @@ void APIENTRY gl_debug_callback(GLenum source, return; }*/ + if (gGLManager.mIsDisabled && + severity == GL_DEBUG_SEVERITY_HIGH_ARB && + source == GL_DEBUG_SOURCE_API_ARB && + type == GL_DEBUG_TYPE_ERROR_ARB && + id == GL_INVALID_VALUE) + { + // Suppress messages about deleting already deleted objects called from LLViewerWindow::stopGL() + // "GL_INVALID_VALUE error generated. Handle does not refer to an object generated by OpenGL." + return; + } + // list of messages to suppress const char* suppress[] = { @@ -148,8 +159,9 @@ void APIENTRY gl_debug_callback(GLenum source, glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_SIZE, &ubo_size); glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_IMMUTABLE_STORAGE, &ubo_immutable); } - - if (severity == GL_DEBUG_SEVERITY_HIGH) + + // No needs to halt when is called from LLViewerWindow::stopGL() + if (severity == GL_DEBUG_SEVERITY_HIGH && !gGLManager.mIsDisabled) { LL_ERRS() << "Halting on GL Error" << LL_ENDL; } -- cgit v1.2.3 From 009cd9adccd117357fa4054c523218a0e990bb80 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 13 Dec 2023 23:22:22 +0200 Subject: SL-20729 Crash in getObject in "new_folder_from_selected" at gInventory.getObject(*ids.begin()); according to bugsplat argument id was a null pointer so I assume there was an issue geting id out of the list. --- indra/newview/llinventoryfunctions.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 4aeacae6ed..6ac8bbee76 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2949,6 +2949,23 @@ bool get_selection_object_uuids(LLFolderView *root, uuid_vec_t& ids) void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action, BOOL user_confirm) { std::set selected_items = root->getSelectionList(); + if (selected_items.empty() + && action != "wear" + && action != "wear_add" + && !isRemoveAction(action)) + { + // Was item removed while user was checking menu? + // "wear" and removal exlusions are due to use of + // getInventorySelectedUUIDs() below + LL_WARNS("Inventory") << "Menu tried to operate on empty selection" << LL_ENDL; + + if (("copy" == action) || ("cut" == action)) + { + LLClipboard::instance().reset(); + } + + return; + } // Prompt the user and check for authorization for some marketplace active listing edits if (user_confirm && (("delete" == action) || ("cut" == action) || ("rename" == action) || ("properties" == action) || ("task_properties" == action) || ("open" == action))) -- cgit v1.2.3 From dc1676af27b1a6a1d33d293b22627a6fa3749316 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 15 Dec 2023 00:41:40 +0200 Subject: SL-20734 Uploaded Materials should use 'Uploads' permissions --- indra/newview/llmaterialeditor.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index 292ddb765f..ae61198110 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -1376,10 +1376,23 @@ bool LLMaterialEditor::saveIfNeeded() LLPermissions local_permissions; local_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null); - U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials"); - U32 group_perm = LLFloaterPerms::getGroupPerms("Materials"); - U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials"); - local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm); + if (mIsOverride) + { + // Shouldn't happen, but just in case it ever changes + U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials"); + U32 group_perm = LLFloaterPerms::getGroupPerms("Materials"); + U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials"); + local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm); + + } + else + { + // Uploads are supposed to use Upload permissions, not material permissions + U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Uploads"); + U32 group_perm = LLFloaterPerms::getGroupPerms("Uploads"); + U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Uploads"); + local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm); + } std::string res_desc = buildMaterialDescription(); createInventoryItem(buffer, mMaterialName, res_desc, local_permissions); -- cgit v1.2.3 From 8ea1f4a3fc77145cb60a7b8182e0da9c0e43ed69 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 14 Dec 2023 22:51:18 +0200 Subject: SL-15628 Crash inside ~LLModelInstanceBase More explicit cleanup in hopes of narrowing down which of the models failed --- indra/llmath/llvolume.h | 2 +- indra/llprimitive/llmodel.cpp | 1 + indra/llprimitive/llmodel.h | 16 +++++++++++++++- indra/newview/llmodelpreview.cpp | 10 ++++++++++ indra/newview/llmodelpreview.h | 1 - 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index afed98ff36..71878b8cb6 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -1000,7 +1000,7 @@ class LLVolume : public LLRefCount friend class LLVolumeLODGroup; protected: - ~LLVolume(); // use unref + virtual ~LLVolume(); // use unref public: typedef std::vector face_list_t; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index ee493968de..68a7f29378 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -67,6 +67,7 @@ LLModel::~LLModel() { LLConvexDecomposition::getInstance()->deleteDecomposition(mDecompID); } + mPhysics.mMesh.clear(); } //static diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 4505d6b3b9..040257e00e 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -106,6 +106,8 @@ public: std::vector mPositions; std::vector mNormals; + ~PhysicsMesh() {} + void clear() { mPositions.clear(); @@ -131,6 +133,7 @@ public: public: Decomposition() { } Decomposition(LLSD& data); + ~Decomposition() { } void fromLLSD(LLSD& data); LLSD asLLSD() const; bool hasHullList() const; @@ -365,7 +368,7 @@ class LLModelInstanceBase { public: LLPointer mModel; - LLPointer mLOD[5]; + LLPointer mLOD[LLModel::NUM_LODS]; LLUUID mMeshID; LLMatrix4 mTransform; @@ -380,6 +383,15 @@ public: : mModel(NULL) { } + + virtual ~LLModelInstanceBase() + { + mModel = NULL; + for (int j = 0; j < LLModel::NUM_LODS; ++j) + { + mLOD[j] = NULL; + } + }; }; typedef std::vector model_instance_list; @@ -399,6 +411,8 @@ public: LLModelInstance(LLSD& data); + ~LLModelInstance() {} + LLSD asLLSD(); }; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index ccae1030f1..ad22e84c6e 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -220,6 +220,16 @@ LLModelPreview::~LLModelPreview() mPreviewAvatar->markDead(); mPreviewAvatar = NULL; } + + mUploadData.clear(); + mTextureSet.clear(); + + for (U32 i = 0; i < LLModel::NUM_LODS; i++) + { + clearModel(i); + } + mBaseModel.clear(); + mBaseScene.clear(); } void LLModelPreview::updateDimentionsAndOffsets() diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index df7320768c..d4d5d087bd 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -310,7 +310,6 @@ protected: vv_LLVolumeFace_t mBaseModelFacesCopy; U32 mGroup; - std::map, U32> mObject; // Amount of triangles in original(base) model U32 mMaxTriangleLimit; -- cgit v1.2.3 From 8968f21763db711722e61d5b716873271bae1ed4 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Fri, 15 Dec 2023 07:23:24 +0200 Subject: Fix EOF in VIEWER_VERSION.txt --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 0e7b60da8a..a8a1887568 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.2 \ No newline at end of file +7.1.2 -- cgit v1.2.3 From 422c006e32109890aa3cde23c40f334868187cbf Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Fri, 15 Dec 2023 18:02:55 +0200 Subject: SL-20702 Remove ALM info in About --- indra/newview/llappviewer.cpp | 1 - indra/newview/skins/default/xui/en/strings.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4a43133ff6..e6a47f1c64 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3328,7 +3328,6 @@ LLSD LLAppViewer::getViewerInfo() const info["NET_BANDWITH"] = gSavedSettings.getF32("ThrottleBandwidthKBPS"); info["LOD_FACTOR"] = gSavedSettings.getF32("RenderVolumeLODFactor"); info["RENDER_QUALITY"] = (F32)gSavedSettings.getU32("RenderQualityPerformance"); - info["GPU_SHADERS"] = gSavedSettings.getBOOL("RenderDeferred") ? "Enabled" : "Disabled"; info["TEXTURE_MEMORY"] = gGLManager.mVRAM; #if LL_DARWIN diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 5d33853adc..e405d9ea10 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -53,7 +53,6 @@ Draw distance: [DRAW_DISTANCE]m Bandwidth: [NET_BANDWITH]kbit/s LOD factor: [LOD_FACTOR] Render quality: [RENDER_QUALITY] -Advanced Lighting Model: [GPU_SHADERS] Texture memory: [TEXTURE_MEMORY]MB Disk cache: [DISK_CACHE_INFO] -- cgit v1.2.3 From 27f6dd5767edc4f96f3267d81bb4d386d2df0a71 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Fri, 15 Dec 2023 20:17:14 +0200 Subject: Fix EOF in VIEWER_VERSION.txt --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 0e7b60da8a..a8a1887568 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.2 \ No newline at end of file +7.1.2 -- cgit v1.2.3 From 1cc91fac587ae0edf86d2dec42e2846e57bfafd0 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 15 Dec 2023 19:32:05 +0200 Subject: SL-20737 Crash clearing texture callbacks shutdown crash --- indra/newview/llfloaterprofiletexture.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/indra/newview/llfloaterprofiletexture.cpp b/indra/newview/llfloaterprofiletexture.cpp index bf1f56a6d1..ec2e627165 100644 --- a/indra/newview/llfloaterprofiletexture.cpp +++ b/indra/newview/llfloaterprofiletexture.cpp @@ -58,6 +58,8 @@ LLFloaterProfileTexture::~LLFloaterProfileTexture() mImage->setBoostLevel(mImageOldBoostLevel); mImage = NULL; } + + LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList); } // virtual -- cgit v1.2.3 From a069a21d318abd4eded46556c3252fec08eea84c Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 7 Dec 2023 13:59:22 +0200 Subject: SL-20696 FIXED llLoopSoundSlave producing no sound since viewer update --- indra/llaudio/llaudioengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index a387bb23cd..ece0a12a7a 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -398,7 +398,7 @@ void LLAudioEngine::idle() for (source_map::value_type& src_pair : mAllSources) { LLAudioSource *sourcep = src_pair.second; - if (sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) + if (!sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority) { sync_masterp = sourcep; master_channelp = sync_masterp->getChannel(); -- cgit v1.2.3 From 1df31d64e8f06c3aa64714af631750263e9cc9ce Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 15 Dec 2023 16:13:51 -0500 Subject: DRTVWR-601: Update mikktspace and tinygltf to GHA package builds. Ditch 32-bit Windows build of mikktspace. --- autobuild.xml | 88 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 0e5a5a2a25..936c86c84d 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1734,18 +1734,6 @@ mikktspace - canonical_repo - https://bitbucket.org/lindenlab/3p-mikktspace - copyright - Copyright (C) 2011 by Morten S. Mikkelsen - description - Mikktspace Tangent Generator - license - Copyright (C) 2011 by Morten S. Mikkelsen - license_file - mikktspace.txt - name - mikktspace platforms darwin64 @@ -1753,40 +1741,58 @@ archive hash - b48b7ac0792d3ea8f087d99d9e4a29d8 + 6542ca342661ec4dc7f3fbcd29ca7962d3bf4a01 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104415/914944/mikktspace-1-darwin64-574859.tar.bz2 + https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-darwin64-12b73ee.tar.zst name darwin64 - windows + windows64 archive hash - 0a016b9c0c1e2c0b557e0124094da6c5 + b4c1138005a224018e8c1b9c057f03695b23e70b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104407/914918/mikktspace-1-windows-574859.tar.bz2 + https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-windows64-12b73ee.tar.zst name - windows + windows64 - windows64 + linux64 archive hash - 02e9e5b6fe6788f4d2babb83ec544843 + e61c1e678b82d75764e29cac107431bdddb3f21f + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/104406/914909/mikktspace-1-windows64-574859.tar.bz2 + https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-linux64-12b73ee.tar.zst name - windows64 + linux64 + license + Copyright (C) 2011 by Morten S. Mikkelsen + license_file + mikktspace.txt + copyright + Copyright (C) 2011 by Morten S. Mikkelsen version 1 + name + mikktspace + canonical_repo + https://bitbucket.org/lindenlab/3p-mikktspace + description + Mikktspace Tangent Generator minizip-ng @@ -2376,18 +2382,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tinygltf - canonical_repo - https://bitbucket.org/lindenlab/3p-tinygltf - copyright - // Copyright (c) 2015 - Present Syoyo Fujita, Aurélien Chatelain and many contributors. - description - tinygltf import library - license - MIT - license_file - LICENSES/tinygltf_license.txt - name - tinygltf platforms common @@ -2395,20 +2389,34 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 4dad1c0948141e1667c01a3ee755e4dc + eee6b755cea664e228dcc28b2ea2a036741a4d77 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/105849/926137/tinygltf-v2.5.0-common-575729.tar.bz2 + https://github.com/secondlife/3p-tinygltf/releases/download/v2.5.0-5d136c3/tinygltf-v2.5.0-common-5d136c3.tar.zst name common + license + MIT + license_file + LICENSES/tinygltf_license.txt + copyright + // Copyright (c) 2015 - Present Syoyo Fujita, Aurélien Chatelain and many contributors. + version + v2.5.0 + name + tinygltf + canonical_repo + https://bitbucket.org/lindenlab/3p-tinygltf + description + tinygltf import library source https://bitbucket.org/lindenlab/3p-tinygltf source_type git - version - v2.5.0 tracy @@ -2448,7 +2456,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors copyright Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) version - v0.8.1.235e98f + v0.8.1.578241 name tracy canonical_repo @@ -2459,8 +2467,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors https://bitbucket.org/lindenlab/3p-tracy source_type git - version - v0.8.1.578241 tut -- cgit v1.2.3 From d07cd115e3bdef8a2b1d2f6a5a507ddb67ff8cd9 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 15 Dec 2023 16:14:38 -0500 Subject: DRTVWR-601: Drop 32-bit Windows build of llphysicsextension_stub. --- autobuild.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 936c86c84d..a3cf4970e8 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1582,18 +1582,6 @@ name linux64 - windows - - archive - - hash - 2e5f1f7046a49d8b0bc295aa878116bc - url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/60043/564063/llphysicsextensions_stub-1.0.542456-windows-542456.tar.bz2 - - name - windows - license internal -- cgit v1.2.3 From 67da0c7f604c970c6f637700d84ae0f631b9843a Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 15 Dec 2023 16:23:49 -0500 Subject: DRTVWR-601: Update vulkan_gltf to GHA build. --- autobuild.xml | 60 +++++++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index a3cf4970e8..6004096ac7 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2718,59 +2718,37 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors vulkan_gltf - canonical_repo - https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr - copyright - Copyright (c) 2018 Sascha Willems - description - Vulkan GLTF Sample Implementation - license - Copyright (c) 2018 Sascha Willems - license_file - LICENSES/vulkan_gltf.txt - name - vulkan_gltf platforms - darwin64 - - archive - - hash - 8cff2060843db3db788511ee34a8e8cc - url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 - - name - darwin64 - - windows - - archive - - hash - 58eea384be49ba756ce9c5e66669540b - url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 - - name - windows - - windows64 + common archive hash - 79b6a11622c2f83cfc2b7cd1fafb867b + 0c4742a4b1a870de9ef0ecfc3ba7ee7d996cb8fc + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 + https://github.com/secondlife/3p-vulkan-gltf-pbr/releases/download/v1.0.0-93b7b3b/vulkan_gltf-1.0.0-common-93b7b3b.tar.zst name - windows64 + common + license + Copyright (c) 2018 Sascha Willems + license_file + vulkan_gltf.txt + copyright + Copyright (c) 2018 Sascha Willems version - 1 + 1.0.0 + name + vulkan_gltf + canonical_repo + https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr + description + Vulkan GLTF Sample Implementation xxhash -- cgit v1.2.3 From c85d244b61cce60c110da415fb8adf9760455e33 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 08:38:05 -0500 Subject: DRTVWR-601: fix source nanny complaint about VIEWER_VERSION.txt EOL --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 0e7b60da8a..a8a1887568 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.2 \ No newline at end of file +7.1.2 -- cgit v1.2.3 From b782ab73e640e434e4ed67fa8dfc951f09757585 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 10:59:03 -0500 Subject: DRTVWR-601: Make autobuild set vcs_url, vcs_branch, vcs_revision in viewer's autobuild-package.xml. Ensure that AUTOBUILD_VCS_BRANCH is set before the build. --- .github/workflows/build.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 849c10d62e..ad494cb3a4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -33,6 +33,9 @@ jobs: AUTOBUILD_GITHUB_TOKEN: ${{ secrets.SHARED_AUTOBUILD_GITHUB_TOKEN }} AUTOBUILD_INSTALLABLE_CACHE: ${{ github.workspace }}/.autobuild-installables AUTOBUILD_VARIABLES_FILE: ${{ github.workspace }}/.build-variables/variables + # Direct autobuild to store vcs_url, vcs_branch and vcs_revision in + # autobuild-package.xml. + AUTOBUILD_VCS_INFO: "true" AUTOBUILD_VSVER: "170" DEVELOPER_DIR: ${{ matrix.developer_dir }} # Ensure that Linden viewer builds engage Bugsplat. @@ -192,6 +195,11 @@ jobs: fi export PYTHON_COMMAND_NATIVE="$(native_path "$PYTHON_COMMAND")" + # branch will be something like "origin/mybranch" + branch="$(git branch -r --contains ${{ github.event.pull_request.head.sha || github.sha }} | head -n 1)" + # strip off "origin/" + export AUTOBUILD_VCS_BRANCH="${branch#*/}" + ./build.sh # Each artifact is downloaded as a distinct .zip file. Multiple jobs -- cgit v1.2.3 From 6f4dcd58b75b536f78eaa1314ce3daa76621c283 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 14:47:03 -0500 Subject: DRTVWR-601: Update mikktspace, tinygltf, tracy, vulkan_gltf, xxhash to latest GitHub builds. Some of these were still referencing codeticket builds produced by TeamCity. --- autobuild.xml | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 6004096ac7..f036675b15 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1729,11 +1729,11 @@ archive hash - 6542ca342661ec4dc7f3fbcd29ca7962d3bf4a01 + 6cc1585dba85b0226a2e7033a7e2a2ceaae7c983 hash_algorithm sha1 url - https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-darwin64-12b73ee.tar.zst + https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-darwin64-5cee1f4.tar.zst name darwin64 @@ -1743,11 +1743,11 @@ archive hash - b4c1138005a224018e8c1b9c057f03695b23e70b + 6b7d01ad54e4a88a001f66840c32329cedb28202 hash_algorithm sha1 url - https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-windows64-12b73ee.tar.zst + https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-windows64-5cee1f4.tar.zst name windows64 @@ -1757,11 +1757,11 @@ archive hash - e61c1e678b82d75764e29cac107431bdddb3f21f + edc9782bf209e17ad1845498b42f16d733582082 hash_algorithm sha1 url - https://github.com/secondlife/3p-mikktspace/releases/download/v1-12b73ee/mikktspace-1-linux64-12b73ee.tar.zst + https://github.com/secondlife/3p-mikktspace/releases/download/v1-5cee1f4/mikktspace-1-linux64-5cee1f4.tar.zst name linux64 @@ -2377,11 +2377,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - eee6b755cea664e228dcc28b2ea2a036741a4d77 + 2c47ae2d0c38c86b8c2db8d9317f0ab15edfc74f hash_algorithm sha1 url - https://github.com/secondlife/3p-tinygltf/releases/download/v2.5.0-5d136c3/tinygltf-v2.5.0-common-5d136c3.tar.zst + https://github.com/secondlife/3p-tinygltf/releases/download/v2.5.0-1ae57fd/tinygltf-v2.5.0-common-1ae57fd.tar.zst name common @@ -2415,9 +2415,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 9b6e1a1f4b0969d38a1ca8ee00aeb548 + 49650353442698c3e05102676fe427d0ebe02f0b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110584/960613/tracy-v0.8.1.578241-darwin64-578241.tar.bz2 + https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-darwin64-eecbf72.tar.zst name darwin64 @@ -2427,11 +2429,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 05b72ae5d733aed7d3bf142287601cc6 + 2b80e7407e4f3e82eff3879add0e9ad63e7fcace hash_algorithm - md5 + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110586/960637/tracy-v0.8.1.578241-windows64-578241.tar.bz2 + https://github.com/secondlife/3p-tracy/releases/download/v0.8.1-eecbf72/tracy-v0.8.1-eecbf72-windows64-eecbf72.tar.zst name windows64 @@ -2444,7 +2446,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors copyright Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) version - v0.8.1.578241 + v0.8.1-eecbf72 name tracy canonical_repo @@ -2725,11 +2727,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 0c4742a4b1a870de9ef0ecfc3ba7ee7d996cb8fc + 8e365eff8dcace48d91e2530f8b13e420849aefc hash_algorithm sha1 url - https://github.com/secondlife/3p-vulkan-gltf-pbr/releases/download/v1.0.0-93b7b3b/vulkan_gltf-1.0.0-common-93b7b3b.tar.zst + https://github.com/secondlife/3p-vulkan-gltf-pbr/releases/download/v1.0.0-d7c372f/vulkan_gltf-1.0.0-common-d7c372f.tar.zst name common @@ -2771,11 +2773,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - fdcc803a76a3359bb426db7dac161406676d51e7 + 71921e972a9181da916d9f9da6bceaa99935901b hash_algorithm sha1 url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-darwin64-7501c90.tar.zst + https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-darwin64-d405199.tar.zst name darwin64 @@ -2785,11 +2787,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 7acb3f94a549fbb9bd7bc16604e34f33c5365a9b + b5b47855316f1f82266e3f9086997048b8d81952 hash_algorithm sha1 url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-linux64-7501c90.tar.zst + https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-linux64-d405199.tar.zst name linux64 @@ -2799,11 +2801,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 4522d075ea4703ef4b527c3039864ef735ea7953 + 069d5f4a4b25462092d74da24d03db34cc2b91f3 hash_algorithm sha1 url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1.7501c90/xxhash-0.8.1.7501c90-windows64-7501c90.tar.zst + https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-windows64-d405199.tar.zst name windows64 @@ -2816,7 +2818,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors copyright Copyright (c) 2012-2021 Yann Collet version - 0.8.1.7501c90 + 0.8.1-d405199 name xxhash description @@ -3341,4 +3343,4 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors Second Life Viewer - + \ No newline at end of file -- cgit v1.2.3 From 2c5066f1fcc0c9f145698ef3aaec72d27bce7181 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 17:35:23 -0500 Subject: DRTVWR-601: Use viewer-build-util/which-branch to determine branch. --- .github/workflows/build.yaml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ad494cb3a4..dee1ca24ab 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -99,10 +99,17 @@ jobs: if: runner.os == 'Windows' run: choco install nsis-unicode + - name: Determine source branch + id: which-branch + uses: secondlife/viewer-build-util/which-branch@v1 + with: + token: ${{ github.token }} + - name: Build id: build shell: bash env: + AUTOBUILD_VCS_BRANCH: ${{ steps.which-branch.outputs.branch }} RUNNER_OS: ${{ runner.os }} run: | # set up things the viewer's build.sh script expects @@ -153,7 +160,7 @@ jobs: } repo_branch() { - git -C "$1" branch | grep '^* ' | cut -c 3- + echo "$AUTOBUILD_VCS_BRANCH" } record_dependencies_graph() { @@ -195,11 +202,6 @@ jobs: fi export PYTHON_COMMAND_NATIVE="$(native_path "$PYTHON_COMMAND")" - # branch will be something like "origin/mybranch" - branch="$(git branch -r --contains ${{ github.event.pull_request.head.sha || github.sha }} | head -n 1)" - # strip off "origin/" - export AUTOBUILD_VCS_BRANCH="${branch#*/}" - ./build.sh # Each artifact is downloaded as a distinct .zip file. Multiple jobs -- cgit v1.2.3 From f43e4c6253e14309ceffbe215a7f03b49b7215e8 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Tue, 19 Dec 2023 10:20:37 -0600 Subject: SL-20611 Followup -- fix for water haze artifacts on fullbright objects above water. --- indra/newview/pipeline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 3a1edb0d00..f740fa60be 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8359,7 +8359,7 @@ void LLPipeline::doWaterHaze() else { //render water patches like LLDrawPoolWater does - LLGLDepthTest depth(GL_FALSE); + LLGLDepthTest depth(GL_TRUE, GL_FALSE); LLGLDisable cull(GL_CULL_FACE); gGLLastMatrix = NULL; -- cgit v1.2.3 From 575dc8f4105828b421dd1a3856412a6dc4f16618 Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Tue, 19 Dec 2023 15:36:34 -0600 Subject: SL-20754 Modify default midday to be a better approximation of Cloud Layers HDRI (addresses blue sheen). --- indra/newview/llenvironment.cpp | 2 +- indra/newview/llmaterialeditor.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index edc7bdef5f..ffaca846dd 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -815,7 +815,7 @@ const F64Seconds LLEnvironment::TRANSITION_SLOW(10.0f); const F64Seconds LLEnvironment::TRANSITION_ALTITUDE(5.0f); const LLUUID LLEnvironment::KNOWN_SKY_SUNRISE("01e41537-ff51-2f1f-8ef7-17e4df760bfb"); -const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("651510b8-5f4d-8991-1592-e7eeab2a5a06"); +const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("c46226b4-0e43-5a56-9708-d27ca1df3292"); const LLUUID LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY("cef49723-0292-af49-9b14-9598a616b8a3"); const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("084e26cd-a900-28e8-08d0-64a9de5c15e2"); const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("8a01b97a-cb20-c1ea-ac63-f7ea84ad0090"); diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index ae61198110..db9589666c 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -2241,7 +2241,7 @@ bool LLMaterialEditor::canModifyObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_MODIFY}), ItemSource::OBJECT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_MODIFY}), ItemSource::OBJECT, permissions, item_out); } bool LLMaterialEditor::canSaveObjectsMaterial() @@ -2249,7 +2249,7 @@ bool LLMaterialEditor::canSaveObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item_out); } bool LLMaterialEditor::canClipboardObjectsMaterial() @@ -2275,7 +2275,7 @@ bool LLMaterialEditor::canClipboardObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), ItemSource::OBJECT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), ItemSource::OBJECT, permissions, item_out); } void LLMaterialEditor::saveObjectsMaterialAs() @@ -2283,7 +2283,7 @@ void LLMaterialEditor::saveObjectsMaterialAs() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item = nullptr; - bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item); + bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item); if (!allowed) { LL_WARNS("MaterialEditor") << "Failed to save GLTF material from object" << LL_ENDL; -- cgit v1.2.3 From bc3076938ea3c812054db41a72bdd5d5fbc46d3f Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 20 Dec 2023 12:50:34 -0500 Subject: DRTVWR-601: Update xxhash common platform to GHA build. Remove identical platform-specific package references. --- autobuild.xml | 50 +++++--------------------------------------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index f036675b15..522d9e6df4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2761,54 +2761,14 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - e4f77ba0a9b8ec3cc3fabc51c4da81d2 - url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/110070/956941/xxhash-0.8.1.578006-windows-578006.tar.bz2 - - name - common - - darwin64 - - archive - - hash - 71921e972a9181da916d9f9da6bceaa99935901b - hash_algorithm - sha1 - url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-darwin64-d405199.tar.zst - - name - darwin64 - - linux64 - - archive - - hash - b5b47855316f1f82266e3f9086997048b8d81952 - hash_algorithm - sha1 - url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-linux64-d405199.tar.zst - - name - linux64 - - windows64 - - archive - - hash - 069d5f4a4b25462092d74da24d03db34cc2b91f3 + 1a73c476b371b62066d1c3eced249660e9467e53 hash_algorithm sha1 url - https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-d405199/xxhash-0.8.1-d405199-windows64-d405199.tar.zst + https://github.com/secondlife/3p-xxhash/releases/download/v0.8.1-69ff69a/xxhash-0.8.1-69ff69a-common-69ff69a.tar.zst name - windows64 + common license @@ -2818,7 +2778,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors copyright Copyright (c) 2012-2021 Yann Collet version - 0.8.1-d405199 + 0.8.1-69ff69a name xxhash description @@ -3343,4 +3303,4 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors Second Life Viewer - \ No newline at end of file + -- cgit v1.2.3 From 602a2af309bd66f76bcf4ca10515a10ca57aa5d6 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 2 Jan 2024 20:55:44 +0200 Subject: SL-20759 Ctrl+O should close Avatar floater if Wearing tab is opened --- indra/newview/llpaneloutfitsinventory.h | 3 ++- indra/newview/llsidepanelappearance.cpp | 9 +++++++++ indra/newview/llsidepanelappearance.h | 2 ++ indra/newview/llviewermenu.cpp | 8 ++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 50d7074d4b..f9e29c0a92 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -61,6 +61,8 @@ public: void openApearanceTab(const std::string& tab_name); + bool isCOFPanelActive() const; + protected: void updateVerbs(); @@ -73,7 +75,6 @@ private: protected: void initTabPanels(); void onTabChange(); - bool isCOFPanelActive() const; bool isOutfitsListPanelActive() const; bool isOutfitsGalleryPanelActive() const; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index aed9dba7ef..7571d361a4 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -361,6 +361,15 @@ void LLSidepanelAppearance::toggleMyOutfitsPanel(BOOL visible, const std::string } } +bool LLSidepanelAppearance::isCOFPanelVisible() +{ + if (mPanelOutfitsInventory && mPanelOutfitsInventory->getVisible()) + { + return mPanelOutfitsInventory->isCOFPanelActive(); + } + return false; +} + void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch) { if (!mOutfitEdit || mOutfitEdit->getVisible() == visible) diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index bb9709a2b8..e67652d6f7 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -66,6 +66,8 @@ public: void updateToVisibility( const LLSD& new_visibility ); LLPanelEditWearable* getWearable(){ return mEditWearable; } + bool isCOFPanelVisible(); + private: void onFilterEdit(const std::string& search_string); void onVisibilityChanged ( const LLSD& new_visibility ); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 553eaaf9b2..0e3527ec36 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -102,6 +102,7 @@ #include "llsceneview.h" #include "llscenemonitor.h" #include "llselectmgr.h" +#include "llsidepanelappearance.h" #include "llspellcheckmenuhandler.h" #include "llstatusbar.h" #include "lltextureview.h" @@ -6651,6 +6652,13 @@ void handle_edit_outfit() void handle_now_wearing() { + LLSidepanelAppearance *panel_appearance = dynamic_cast(LLFloaterSidePanelContainer::getPanel("appearance")); + if (panel_appearance && panel_appearance->isInVisibleChain() && panel_appearance->isCOFPanelVisible()) + { + LLFloaterReg::findInstance("appearance")->closeFloater(); + return; + } + LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "now_wearing")); } -- cgit v1.2.3 From a7dcb0df2a11377b1112dfa0720e876507e1ae3d Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Wed, 20 Dec 2023 17:41:03 +0100 Subject: Build fix for Visual Studio update (std::vector) --- indra/newview/llmaterialeditor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index a5437f7a88..5e78e15c72 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -2131,7 +2131,7 @@ bool LLMaterialEditor::canModifyObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_MODIFY}), permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_MODIFY}), permissions, item_out); } bool LLMaterialEditor::canSaveObjectsMaterial() @@ -2139,7 +2139,7 @@ bool LLMaterialEditor::canSaveObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item_out); } bool LLMaterialEditor::canClipboardObjectsMaterial() @@ -2165,7 +2165,7 @@ bool LLMaterialEditor::canClipboardObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), permissions, item_out); } void LLMaterialEditor::saveObjectsMaterialAs() @@ -2173,7 +2173,7 @@ void LLMaterialEditor::saveObjectsMaterialAs() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item = nullptr; - bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item); + bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item); if (!allowed) { LL_WARNS("MaterialEditor") << "Failed to save GLTF material from object" << LL_ENDL; -- cgit v1.2.3 From 706ae0afad2aaa054a1c8165a2a2ff0cd118e5e4 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 3 Jan 2024 17:27:37 +0200 Subject: SL-20769 Local textures shouldn't be used for Picks & Classifieds --- indra/newview/llpanelprofileclassifieds.cpp | 2 ++ indra/newview/llpanelprofilepicks.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index e0902c5ce4..75477dcf75 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -650,6 +650,8 @@ BOOL LLPanelProfileClassified::postBuild() mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelProfileClassified::onTextureSelected, this)); mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelProfileClassified::onTexturePickerMouseEnter, this)); mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelProfileClassified::onTexturePickerMouseLeave, this)); + mSnapshotCtrl->setAllowLocalTexture(FALSE); + mSnapshotCtrl->setBakeTextureEnabled(FALSE); mEditIcon->setVisible(false); mMapButton->setCommitCallback(boost::bind(&LLPanelProfileClassified::onMapClick, this)); diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index ff3f654d0e..6bedc11f9d 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -581,6 +581,8 @@ BOOL LLPanelProfilePick::postBuild() mSnapshotCtrl = getChild("pick_snapshot"); mSnapshotCtrl->setCommitCallback(boost::bind(&LLPanelProfilePick::onSnapshotChanged, this)); + mSnapshotCtrl->setAllowLocalTexture(FALSE); + mSnapshotCtrl->setBakeTextureEnabled(FALSE); childSetAction("teleport_btn", boost::bind(&LLPanelProfilePick::onClickTeleport, this)); childSetAction("show_on_map_btn", boost::bind(&LLPanelProfilePick::onClickMap, this)); -- cgit v1.2.3 From 9659527ffd2226293993d81ecca72982a56756cf Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 4 Jan 2024 16:19:24 +0200 Subject: SL-20771 FIXED Classifieds Title not immediately updating button name --- indra/newview/llpanelprofileclassifieds.cpp | 10 +++++++++- indra/newview/llpanelprofileclassifieds.h | 1 + indra/newview/llpanelprofilepicks.cpp | 2 ++ indra/newview/llpanelprofilepicks.h | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index 75477dcf75..307935f45f 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -669,7 +669,7 @@ BOOL LLPanelProfileClassified::postBuild() mCategoryCombo->add(LLTrans::getString(iter->second)); } - mClassifiedNameEdit->setKeystrokeCallback(boost::bind(&LLPanelProfileClassified::onChange, this), NULL); + mClassifiedNameEdit->setKeystrokeCallback(boost::bind(&LLPanelProfileClassified::onTitleChange, this), NULL); mClassifiedDescEdit->setKeystrokeCallback(boost::bind(&LLPanelProfileClassified::onChange, this)); mCategoryCombo->setCommitCallback(boost::bind(&LLPanelProfileClassified::onChange, this)); mContentTypeCombo->setCommitCallback(boost::bind(&LLPanelProfileClassified::onChange, this)); @@ -937,6 +937,8 @@ void LLPanelProfileClassified::onCancelClick() } else { + updateTabLabel(mClassifiedNameText->getValue()); + // Reload data to undo changes to forms LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId()); } @@ -1405,6 +1407,12 @@ void LLPanelProfileClassified::onChange() enableSave(isDirty()); } +void LLPanelProfileClassified::onTitleChange() +{ + updateTabLabel(getClassifiedName()); + onChange(); +} + void LLPanelProfileClassified::doSave() { //*TODO: Fix all of this diff --git a/indra/newview/llpanelprofileclassifieds.h b/indra/newview/llpanelprofileclassifieds.h index 912819e86b..d1aa5f55e3 100644 --- a/indra/newview/llpanelprofileclassifieds.h +++ b/indra/newview/llpanelprofileclassifieds.h @@ -257,6 +257,7 @@ protected: void onSetLocationClick(); void onChange(); + void onTitleChange(); void onPublishFloaterPublishClicked(); diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index 6bedc11f9d..e02ecfaa0a 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -672,6 +672,7 @@ void LLPanelProfilePick::setSnapshotId(const LLUUID& id) void LLPanelProfilePick::setPickName(const std::string& name) { mPickName->setValue(name); + mPickNameStr = name; } const std::string LLPanelProfilePick::getPickName() @@ -787,6 +788,7 @@ void LLPanelProfilePick::onClickSave() void LLPanelProfilePick::onClickCancel() { + updateTabLabel(mPickNameStr); LLAvatarPropertiesProcessor::getInstance()->sendPickInfoRequest(getAvatarId(), getPickId()); mLocationChanged = false; enableSaveButton(FALSE); diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h index f84463cc9b..27331831d3 100644 --- a/indra/newview/llpanelprofilepicks.h +++ b/indra/newview/llpanelprofilepicks.h @@ -237,6 +237,7 @@ protected: LLUUID mParcelId; LLUUID mPickId; LLUUID mRequestedId; + std::string mPickNameStr; bool mLocationChanged; bool mNewPick; -- cgit v1.2.3 From 4392f1bc8f3e44cc5b92bc1ed7b51744ef3c4c38 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 5 Jan 2024 00:57:58 +0200 Subject: SL-20748 Fix library materials not being previewable on an object --- indra/newview/llpanelface.cpp | 3 ++- indra/newview/llselectmgr.cpp | 38 ++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 5f8071d3eb..033c396d08 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -5176,8 +5176,9 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp) bool can_modify = itemp->getPermissions().allowOperationBy(PERM_MODIFY, gAgentID); // do we have perm to transfer this material? bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply material belong to the agent? bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply material not for sale? + bool from_library = ALEXANDRIA_LINDEN_ID == itemp->getPermissions().getOwner(); - if (can_copy && can_transfer && can_modify) + if ((can_copy && can_transfer && can_modify) || from_library) { pbr_ctrl->setCanApply(true, true); return; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d172a87b1d..c2e3857af0 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -1959,26 +1959,30 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) { return false; } - if (mItem && objectp->isAttachment()) + LLUUID asset_id = mMatId; + if (mItem) { const LLPermissions& perm = mItem->getPermissions(); - BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE; - if (!unrestricted) + bool from_library = perm.getOwner() == ALEXANDRIA_LINDEN_ID; + if (objectp->isAttachment()) { - // Attachments are in world and in inventory simultaneously, - // at the moment server doesn't support such a situation. - return false; + bool unrestricted = (perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED; + + if (!unrestricted && !from_library) + { + // Attachments are in world and in inventory simultaneously, + // at the moment server doesn't support such a situation. + return false; + } } - } - LLUUID asset_id = mMatId; - if (mItem) - { - // If success, the material may be copied into the object's inventory - BOOL success = LLToolDragAndDrop::handleDropMaterialProtections(objectp, mItem, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null); - if (!success) + + if (!from_library + // Check if item may be copied into the object's inventory + && !LLToolDragAndDrop::handleDropMaterialProtections(objectp, mItem, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null)) { return false; } + asset_id = mItem->getAssetUUID(); if (asset_id.isNull()) { @@ -1994,11 +1998,13 @@ bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id) }; bool success = true; - if (item && - (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) || + if (item + && (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) || !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()) || !item->getPermissions().allowOperationBy(PERM_MODIFY, gAgent.getID()) - )) + ) + && item->getPermissions().getOwner() != ALEXANDRIA_LINDEN_ID + ) { success = success && getSelection()->applyRestrictedPbrMaterialToTEs(item); } -- cgit v1.2.3 From a1c36a3218a7fe6eb7b646e64c6bf9bc29b24886 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Fri, 5 Jan 2024 19:45:58 +0100 Subject: DRTVWR-489 MacOS Release build fix (vertex_count and index_count aren't used) --- indra/newview/llvotree.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 36e6da802b..575b1dbe7e 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -865,6 +865,10 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable) mReferenceBuffer->unmapBuffer(); llassert(vertex_count == max_vertices); llassert(index_count == max_indices); +#ifndef SHOW_ASSERT + (void)vertex_count; + (void)index_count; +#endif } //generate tree mesh -- cgit v1.2.3 From 7c8907522fe6600918dacc15ee138ca72b2cf35e Mon Sep 17 00:00:00 2001 From: AiraYumi Date: Sat, 6 Jan 2024 23:29:06 +0900 Subject: replace boost library to standard --- indra/llappearance/llavatarappearance.cpp | 2 +- indra/llcommon/lldoubledispatch.h | 2 +- indra/llcommon/llerror.cpp | 8 +++--- indra/llcommon/llerrorcontrol.h | 2 +- indra/llcommon/llinitparam.h | 2 +- indra/llcommon/llleap.cpp | 4 +-- indra/llcommon/llprocess.h | 2 +- indra/llcommon/llrun.h | 2 +- indra/llcommon/llstring.h | 2 +- indra/llcommon/tests/llerror_test.cpp | 30 +++++++++++----------- indra/llcommon/tests/lleventcoro_test.cpp | 8 +++--- indra/llcommon/tests/llinstancetracker_test.cpp | 4 +-- indra/llcommon/tests/wrapllerrs.h | 4 +-- indra/llcorehttp/_httplibcurl.h | 2 +- indra/llcorehttp/_httpoperation.cpp | 2 +- indra/llcorehttp/_httpoperation.h | 14 +++++----- indra/llcorehttp/_httpoprequest.cpp | 6 ++--- indra/llcorehttp/_httpoprequest.h | 2 +- indra/llcorehttp/_httpopsetget.h | 2 +- indra/llcorehttp/_httppolicy.h | 2 +- indra/llcorehttp/_httpreplyqueue.h | 4 +-- indra/llcorehttp/_httprequestqueue.h | 2 +- indra/llcorehttp/httpcommon.h | 14 +++++----- indra/llcorehttp/httphandler.h | 4 +-- indra/llcorehttp/httpheaders.h | 2 +- indra/llcorehttp/httpoptions.h | 2 +- indra/llcorehttp/httprequest.h | 6 ++--- indra/llcorehttp/httpresponse.h | 2 +- indra/llimage/llimagej2c.cpp | 2 +- indra/llimage/llimagej2c.h | 2 +- indra/llkdu/llimagej2ckdu.h | 8 +++--- indra/llmessage/llcoproceduremanager.cpp | 8 +++--- indra/llmessage/llcorehttputil.h | 8 +++--- indra/llmessage/llexperiencecache.h | 2 +- indra/llmessage/lliohttpserver.cpp | 2 +- indra/llmessage/lliopipe.h | 2 +- indra/llmessage/lliosocket.h | 4 +-- indra/llmessage/llservice.h | 2 +- indra/llmessage/llstoredmessage.h | 2 +- indra/llmessage/tests/llcurl_stub.cpp | 2 +- indra/llplugin/llpluginclassmedia.h | 2 +- indra/llplugin/llpluginprocessparent.h | 4 +-- indra/llprimitive/tests/llmediaentry_test.cpp | 2 +- indra/llui/llnotifications.h | 2 +- indra/newview/llagent.h | 4 +-- indra/newview/llappearancemgr.cpp | 2 +- indra/newview/llchiclet.h | 2 +- indra/newview/llcompilequeue.cpp | 2 +- indra/newview/llconversationlog.cpp | 2 +- indra/newview/llfloatereditsky.cpp | 2 +- indra/newview/llfloatereditwater.cpp | 2 +- indra/newview/llfloaterimnearbychathandler.cpp | 2 +- indra/newview/llfloaterimnearbychathandler.h | 2 +- indra/newview/llfloateruipreview.cpp | 2 +- indra/newview/llinventorybridge.cpp | 10 ++++---- indra/newview/llinventorybridge.h | 4 +-- indra/newview/llinventorygallery.cpp | 2 +- indra/newview/lllogchat.cpp | 2 +- indra/newview/lllogininstance.h | 2 +- indra/newview/llmaterialmgr.cpp | 2 +- indra/newview/llmediadataclient.h | 4 +-- indra/newview/llmeshrepository.cpp | 6 ++--- indra/newview/llpanellogin.h | 2 +- indra/newview/llpathfindingmanager.cpp | 4 +-- indra/newview/llpathfindingmanager.h | 4 +-- indra/newview/llpathfindingnavmesh.h | 2 +- indra/newview/llpathfindingnavmeshzone.h | 2 +- indra/newview/llpathfindingobject.h | 2 +- indra/newview/llpathfindingobjectlist.h | 2 +- indra/newview/llpreviewtexture.cpp | 2 +- indra/newview/llsculptidsize.cpp | 2 +- indra/newview/llsculptidsize.h | 2 +- indra/newview/llsearchableui.h | 2 +- indra/newview/llviewermedia.h | 2 +- indra/newview/llviewermenufile.h | 2 +- indra/newview/llviewerparcelaskplay.cpp | 2 +- indra/newview/llviewershadermgr.cpp | 2 +- indra/newview/llviewerwindow.h | 4 +-- indra/newview/llvoicevivox.cpp | 2 +- indra/newview/llvoicevivox.h | 14 +++++----- indra/newview/llwindowlistener.cpp | 2 +- indra/newview/llxmlrpclistener.cpp | 2 +- indra/newview/llxmlrpctransaction.cpp | 2 +- indra/newview/tests/llremoteparcelrequest_test.cpp | 4 +-- indra/test/io.cpp | 10 ++++---- indra/test/llevents_tut.cpp | 4 +-- indra/test/test.cpp | 20 +++++++-------- indra/viewer_components/login/lllogin.h | 2 +- 88 files changed, 173 insertions(+), 173 deletions(-) diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 18b03c1f89..b9c3aee839 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -230,7 +230,7 @@ void LLAvatarAppearance::initInstance() for (U32 lod = 0; lod < mesh_dict->mLOD; lod++) { LLAvatarJointMesh* mesh = createAvatarJointMesh(); - std::string mesh_name = "m" + mesh_dict->mName + boost::lexical_cast(lod); + std::string mesh_name = "m" + mesh_dict->mName + std::to_string(lod); // We pre-pended an m - need to capitalize first character for camelCase mesh_name[1] = toupper(mesh_name[1]); mesh->setName(mesh_name); diff --git a/indra/llcommon/lldoubledispatch.h b/indra/llcommon/lldoubledispatch.h index 8ed295b6f1..ce6731e864 100644 --- a/indra/llcommon/lldoubledispatch.h +++ b/indra/llcommon/lldoubledispatch.h @@ -255,7 +255,7 @@ private: }; /// shared_ptr manages Entry lifespan for us - typedef boost::shared_ptr EntryPtr; + typedef std::shared_ptr EntryPtr; /// use a @c list to make it easy to insert typedef std::list DispatchTable; DispatchTable mDispatch; diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 414515854a..4268f107e9 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -1070,7 +1070,7 @@ namespace LLError // // NOTE!!! Requires external mutex lock!!! template - std::pair, Recorders::iterator> + std::pair, Recorders::iterator> findRecorderPos(SettingsConfigPtr &s) { // Since we promise to return an iterator, use a classic iterator @@ -1081,7 +1081,7 @@ namespace LLError // *it is a RecorderPtr, a shared_ptr. Use a // dynamic_pointer_cast to try to downcast to test if it's also a // shared_ptr. - auto ptr = boost::dynamic_pointer_cast(*it); + auto ptr = std::dynamic_pointer_cast(*it); if (ptr) { // found the entry we want @@ -1101,7 +1101,7 @@ namespace LLError // shared_ptr might be empty (operator!() returns true) if there was no // such RECORDER subclass instance in mRecorders. template - boost::shared_ptr findRecorder() + std::shared_ptr findRecorder() { SettingsConfigPtr s = Globals::getInstance()->getSettingsConfig(); LLMutexLock lock(&s->mRecorderMutex); @@ -1134,7 +1134,7 @@ namespace LLError if (!file_name.empty()) { - boost::shared_ptr recordToFile(new RecordToFile(file_name)); + std::shared_ptr recordToFile(new RecordToFile(file_name)); if (recordToFile->okay()) { addRecorder(recordToFile); diff --git a/indra/llcommon/llerrorcontrol.h b/indra/llcommon/llerrorcontrol.h index 57f10b7895..77b187a80f 100644 --- a/indra/llcommon/llerrorcontrol.h +++ b/indra/llcommon/llerrorcontrol.h @@ -174,7 +174,7 @@ namespace LLError bool mWantsMultiline; }; - typedef boost::shared_ptr RecorderPtr; + typedef std::shared_ptr RecorderPtr; /** * Instantiate GenericRecorder with a callable(level, message) to get diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h index 9edc7e40f3..e0d0ab9ac7 100644 --- a/indra/llcommon/llinitparam.h +++ b/indra/llcommon/llinitparam.h @@ -627,7 +627,7 @@ namespace LLInitParam UserData* mUserData; }; - typedef boost::shared_ptr ParamDescriptorPtr; + typedef std::shared_ptr ParamDescriptorPtr; // each derived Block class keeps a static data structure maintaining offsets to various params class LL_COMMON_API BlockDescriptor diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index 8f88e728ce..b2b1162f63 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -462,10 +462,10 @@ private: LLProcessPtr mChild; LLTempBoundListener mStdinConnection, mStdoutConnection, mStdoutDataConnection, mStderrConnection; - boost::scoped_ptr mBlocker; + std::unique_ptr mBlocker; LLProcess::ReadPipe::size_type mExpect; LLError::RecorderPtr mRecorder; - boost::scoped_ptr mListener; + std::unique_ptr mListener; }; // These must follow the declaration of LLLeapImpl, so they may as well be last. diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h index 0842f2eb07..c57821bf52 100644 --- a/indra/llcommon/llprocess.h +++ b/indra/llcommon/llprocess.h @@ -51,7 +51,7 @@ class LLEventPump; class LLProcess; /// LLProcess instances are created on the heap by static factory methods and /// managed by ref-counted pointers. -typedef boost::shared_ptr LLProcessPtr; +typedef std::shared_ptr LLProcessPtr; /** * LLProcess handles launching an external process with specified command line diff --git a/indra/llcommon/llrun.h b/indra/llcommon/llrun.h index d610f86234..42e3d9b47a 100644 --- a/indra/llcommon/llrun.h +++ b/indra/llcommon/llrun.h @@ -48,7 +48,7 @@ public: /** * @brief The pointer to a runnable. */ - typedef boost::shared_ptr run_ptr_t; + typedef std::shared_ptr run_ptr_t; /** * @brief The handle for use in the API. diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 1fd6cac14a..61fc47e4d0 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -1199,7 +1199,7 @@ void LLStringUtilBase::getTokens(const string_type& string, std::vector > instrp; + std::unique_ptr< LLStringUtilBaseImpl::InString > instrp; if (escapes.empty()) instrp.reset(new LLStringUtilBaseImpl::InString(string.begin(), string.end())); else diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp index 148c18aabe..b4cdbdc6bf 100644 --- a/indra/llcommon/tests/llerror_test.cpp +++ b/indra/llcommon/tests/llerror_test.cpp @@ -153,27 +153,27 @@ namespace tut int countMessages() { - return boost::dynamic_pointer_cast(mRecorder)->countMessages(); + return std::dynamic_pointer_cast(mRecorder)->countMessages(); } void clearMessages() { - boost::dynamic_pointer_cast(mRecorder)->clearMessages(); + std::dynamic_pointer_cast(mRecorder)->clearMessages(); } void setWantsTime(bool t) { - boost::dynamic_pointer_cast(mRecorder)->showTime(t); + std::dynamic_pointer_cast(mRecorder)->showTime(t); } void setWantsMultiline(bool t) { - boost::dynamic_pointer_cast(mRecorder)->showMultiline(t); + std::dynamic_pointer_cast(mRecorder)->showMultiline(t); } std::string message(int n) { - return boost::dynamic_pointer_cast(mRecorder)->message(n); + return std::dynamic_pointer_cast(mRecorder)->message(n); } void ensure_message_count(int expectedCount) @@ -497,12 +497,12 @@ namespace void testLogName(LLError::RecorderPtr recorder, LogFromFunction f, const std::string& class_name = "") { - boost::dynamic_pointer_cast(recorder)->clearMessages(); + std::dynamic_pointer_cast(recorder)->clearMessages(); std::string name = f(false); f(true); - std::string messageWithoutName = boost::dynamic_pointer_cast(recorder)->message(0); - std::string messageWithName = boost::dynamic_pointer_cast(recorder)->message(1); + std::string messageWithoutName = std::dynamic_pointer_cast(recorder)->message(0); + std::string messageWithName = std::dynamic_pointer_cast(recorder)->message(1); ensure_has(name + " logged without name", messageWithoutName, name); @@ -691,13 +691,13 @@ namespace tut LL_INFOS() << "boo" << LL_ENDL; ensure_message_field_equals(0, MSG_FIELD, "boo"); - ensure_equals("alt recorder count", boost::dynamic_pointer_cast(altRecorder)->countMessages(), 1); - ensure_contains("alt recorder message 0", boost::dynamic_pointer_cast(altRecorder)->message(0), "boo"); + ensure_equals("alt recorder count", std::dynamic_pointer_cast(altRecorder)->countMessages(), 1); + ensure_contains("alt recorder message 0", std::dynamic_pointer_cast(altRecorder)->message(0), "boo"); LLError::setTimeFunction(roswell); LLError::RecorderPtr anotherRecorder(new TestRecorder()); - boost::dynamic_pointer_cast(anotherRecorder)->showTime(true); + std::dynamic_pointer_cast(anotherRecorder)->showTime(true); LLError::addRecorder(anotherRecorder); LL_INFOS() << "baz" << LL_ENDL; @@ -705,10 +705,10 @@ namespace tut std::string when = roswell(); ensure_message_does_not_contain(1, when); - ensure_equals("alt recorder count", boost::dynamic_pointer_cast(altRecorder)->countMessages(), 2); - ensure_does_not_contain("alt recorder message 1", boost::dynamic_pointer_cast(altRecorder)->message(1), when); - ensure_equals("another recorder count", boost::dynamic_pointer_cast(anotherRecorder)->countMessages(), 1); - ensure_contains("another recorder message 0", boost::dynamic_pointer_cast(anotherRecorder)->message(0), when); + ensure_equals("alt recorder count", std::dynamic_pointer_cast(altRecorder)->countMessages(), 2); + ensure_does_not_contain("alt recorder message 1", std::dynamic_pointer_cast(altRecorder)->message(1), when); + ensure_equals("another recorder count", std::dynamic_pointer_cast(anotherRecorder)->countMessages(), 1); + ensure_contains("another recorder message 0", std::dynamic_pointer_cast(anotherRecorder)->message(0), when); LLError::removeRecorder(altRecorder); LLError::removeRecorder(anotherRecorder); diff --git a/indra/llcommon/tests/lleventcoro_test.cpp b/indra/llcommon/tests/lleventcoro_test.cpp index 032923a108..01104545c6 100644 --- a/indra/llcommon/tests/lleventcoro_test.cpp +++ b/indra/llcommon/tests/lleventcoro_test.cpp @@ -101,7 +101,7 @@ namespace tut int which; LLTestApp testApp; - void explicit_wait(boost::shared_ptr>& cbp); + void explicit_wait(std::shared_ptr>& cbp); void waitForEventOn1(); void coroPump(); void postAndWait1(); @@ -111,7 +111,7 @@ namespace tut typedef coroutine_group::object object; coroutine_group coroutinegrp("coroutine"); - void test_data::explicit_wait(boost::shared_ptr>& cbp) + void test_data::explicit_wait(std::shared_ptr>& cbp) { BEGIN { @@ -127,7 +127,7 @@ namespace tut // For test purposes, instead of handing 'callback' (or an // adapter) off to some I/O subsystem, we'll just pass it back to // our caller. - cbp = boost::make_shared>(); + cbp = std::make_shared>(); LLCoros::Future future = LLCoros::getFuture(*cbp); // calling get() on the future causes us to suspend @@ -146,7 +146,7 @@ namespace tut DEBUG; // Construct the coroutine instance that will run explicit_wait. - boost::shared_ptr> respond; + std::shared_ptr> respond; LLCoros::instance().launch("test<1>", [this, &respond](){ explicit_wait(respond); }); mSync.bump(); diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp index 5daa29adf4..95af9c2a50 100644 --- a/indra/llcommon/tests/llinstancetracker_test.cpp +++ b/indra/llcommon/tests/llinstancetracker_test.cpp @@ -94,7 +94,7 @@ namespace tut ensure("couldn't find stack Keyed", bool(found)); ensure_equals("found wrong Keyed instance", found.get(), &one); { - boost::scoped_ptr two(new Keyed("two")); + std::unique_ptr two(new Keyed("two")); ensure_equals(Keyed::instanceCount(), 2); auto found = Keyed::getInstance("two"); ensure("couldn't find heap Keyed", bool(found)); @@ -118,7 +118,7 @@ namespace tut std::weak_ptr found = one.getWeak(); ensure(! found.expired()); { - boost::scoped_ptr two(new Unkeyed); + std::unique_ptr two(new Unkeyed); ensure_equals(Unkeyed::instanceCount(), 2); } ensure_equals(Unkeyed::instanceCount(), 1); diff --git a/indra/llcommon/tests/wrapllerrs.h b/indra/llcommon/tests/wrapllerrs.h index d657b329bb..6978c296b3 100644 --- a/indra/llcommon/tests/wrapllerrs.h +++ b/indra/llcommon/tests/wrapllerrs.h @@ -218,12 +218,12 @@ public: /// for the sought string. std::string messageWith(const std::string& search, bool required=true) { - return boost::dynamic_pointer_cast(mRecorder)->messageWith(search, required); + return std::dynamic_pointer_cast(mRecorder)->messageWith(search, required); } std::ostream& streamto(std::ostream& out) const { - return boost::dynamic_pointer_cast(mRecorder)->streamto(out); + return std::dynamic_pointer_cast(mRecorder)->streamto(out); } friend inline std::ostream& operator<<(std::ostream& out, const CaptureLog& self) diff --git a/indra/llcorehttp/_httplibcurl.h b/indra/llcorehttp/_httplibcurl.h index a71eae59c0..61ecc492af 100644 --- a/indra/llcorehttp/_httplibcurl.h +++ b/indra/llcorehttp/_httplibcurl.h @@ -65,7 +65,7 @@ private: void operator=(const HttpLibcurl &); // Not defined public: - typedef boost::shared_ptr opReqPtr_t; + typedef std::shared_ptr opReqPtr_t; /// Give cycles to libcurl to run active requests. Completed /// operations (successful or failed) will be retried or handed diff --git a/indra/llcorehttp/_httpoperation.cpp b/indra/llcorehttp/_httpoperation.cpp index 3b64018132..c3a9bcaf54 100644 --- a/indra/llcorehttp/_httpoperation.cpp +++ b/indra/llcorehttp/_httpoperation.cpp @@ -58,7 +58,7 @@ HttpOperation::handleMap_t HttpOperation::mHandleMap; LLCoreInt::HttpMutex HttpOperation::mOpMutex; HttpOperation::HttpOperation(): - boost::enable_shared_from_this(), + std::enable_shared_from_this(), mReplyQueue(), mUserHandler(), mReqPolicy(HttpRequest::DEFAULT_POLICY_ID), diff --git a/indra/llcorehttp/_httpoperation.h b/indra/llcorehttp/_httpoperation.h index 8c1364bab4..b07ef76d49 100644 --- a/indra/llcorehttp/_httpoperation.h +++ b/indra/llcorehttp/_httpoperation.h @@ -69,12 +69,12 @@ class HttpService; /// and those interfaces establish the access rules. class HttpOperation : private boost::noncopyable, - public boost::enable_shared_from_this + public std::enable_shared_from_this { public: - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; - typedef boost::shared_ptr HttpReplyQueuePtr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; + typedef std::shared_ptr HttpReplyQueuePtr_t; /// Threading: called by consumer thread. HttpOperation(); @@ -157,12 +157,12 @@ public: HttpHandle getHandle(); template< class OPT > - static boost::shared_ptr< OPT > fromHandle(HttpHandle handle) + static std::shared_ptr< OPT > fromHandle(HttpHandle handle) { ptr_t ptr = findByHandle(handle); if (!ptr) - return boost::shared_ptr< OPT >(); - return boost::dynamic_pointer_cast< OPT >(ptr); + return std::shared_ptr< OPT >(); + return std::dynamic_pointer_cast< OPT >(ptr); } protected: diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index d60eb6c95f..3247146212 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -201,7 +201,7 @@ HttpOpRequest::~HttpOpRequest() void HttpOpRequest::stageFromRequest(HttpService * service) { LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; - HttpOpRequest::ptr_t self(boost::dynamic_pointer_cast(shared_from_this())); + HttpOpRequest::ptr_t self(std::dynamic_pointer_cast(shared_from_this())); service->getPolicy().addOp(self); // transfers refcount } @@ -209,7 +209,7 @@ void HttpOpRequest::stageFromRequest(HttpService * service) void HttpOpRequest::stageFromReady(HttpService * service) { LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; - HttpOpRequest::ptr_t self(boost::dynamic_pointer_cast(shared_from_this())); + HttpOpRequest::ptr_t self(std::dynamic_pointer_cast(shared_from_this())); service->getTransport().addOp(self); // transfers refcount } @@ -290,7 +290,7 @@ void HttpOpRequest::visitNotifier(HttpRequest * request) // HttpOpRequest::ptr_t HttpOpRequest::fromHandle(HttpHandle handle) // { // -// return boost::dynamic_pointer_cast((static_cast(handle))->shared_from_this()); +// return std::dynamic_pointer_cast((static_cast(handle))->shared_from_this()); // } diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h index ec84822cf4..626064329d 100644 --- a/indra/llcorehttp/_httpoprequest.h +++ b/indra/llcorehttp/_httpoprequest.h @@ -66,7 +66,7 @@ class BufferArray; class HttpOpRequest : public HttpOperation { public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; HttpOpRequest(); diff --git a/indra/llcorehttp/_httpopsetget.h b/indra/llcorehttp/_httpopsetget.h index eabd41e79f..04ab2446ef 100644 --- a/indra/llcorehttp/_httpopsetget.h +++ b/indra/llcorehttp/_httpopsetget.h @@ -53,7 +53,7 @@ namespace LLCore class HttpOpSetGet : public HttpOperation { public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; HttpOpSetGet(); diff --git a/indra/llcorehttp/_httppolicy.h b/indra/llcorehttp/_httppolicy.h index 0b8806a3e2..955f757c93 100644 --- a/indra/llcorehttp/_httppolicy.h +++ b/indra/llcorehttp/_httppolicy.h @@ -60,7 +60,7 @@ private: void operator=(const HttpPolicy &); // Not defined public: - typedef boost::shared_ptr opReqPtr_t; + typedef std::shared_ptr opReqPtr_t; /// Threading: called by init thread. HttpRequest::policy_t createPolicyClass(); diff --git a/indra/llcorehttp/_httpreplyqueue.h b/indra/llcorehttp/_httpreplyqueue.h index 33e205c1c9..2de26249ef 100644 --- a/indra/llcorehttp/_httpreplyqueue.h +++ b/indra/llcorehttp/_httpreplyqueue.h @@ -63,8 +63,8 @@ class HttpReplyQueue : private boost::noncopyable { public: - typedef boost::shared_ptr opPtr_t; - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr opPtr_t; + typedef std::shared_ptr ptr_t; HttpReplyQueue(); virtual ~HttpReplyQueue(); diff --git a/indra/llcorehttp/_httprequestqueue.h b/indra/llcorehttp/_httprequestqueue.h index f0296f30e3..52369df174 100644 --- a/indra/llcorehttp/_httprequestqueue.h +++ b/indra/llcorehttp/_httprequestqueue.h @@ -61,7 +61,7 @@ private: void operator=(const HttpRequestQueue &); // Not defined public: - typedef boost::shared_ptr opPtr_t; + typedef std::shared_ptr opPtr_t; static void init(); static void term(); diff --git a/indra/llcorehttp/httpcommon.h b/indra/llcorehttp/httpcommon.h index 18505e0aad..7fe5c48edf 100644 --- a/indra/llcorehttp/httpcommon.h +++ b/indra/llcorehttp/httpcommon.h @@ -301,24 +301,24 @@ struct HttpStatus HttpStatus() { - mDetails = boost::shared_ptr
(new Details(LLCORE, HE_SUCCESS)); + mDetails = std::shared_ptr
(new Details(LLCORE, HE_SUCCESS)); } HttpStatus(type_enum_t type, short status) { - mDetails = boost::shared_ptr
(new Details(type, status)); + mDetails = std::shared_ptr
(new Details(type, status)); } HttpStatus(int http_status) { - mDetails = boost::shared_ptr
(new Details(http_status, + mDetails = std::shared_ptr
(new Details(http_status, (http_status >= 200 && http_status <= 299) ? HE_SUCCESS : HE_REPLY_ERROR)); llassert(http_status >= 100 && http_status <= 999); } HttpStatus(int http_status, const std::string &message) { - mDetails = boost::shared_ptr
(new Details(http_status, + mDetails = std::shared_ptr
(new Details(http_status, (http_status >= 200 && http_status <= 299) ? HE_SUCCESS : HE_REPLY_ERROR)); llassert(http_status >= 100 && http_status <= 999); mDetails->mMessage = message; @@ -341,7 +341,7 @@ struct HttpStatus HttpStatus & clone(const HttpStatus &rhs) { - mDetails = boost::shared_ptr
(new Details(*rhs.mDetails)); + mDetails = std::shared_ptr
(new Details(*rhs.mDetails)); return *this; } @@ -490,14 +490,14 @@ private: LLSD mErrorData; }; - boost::shared_ptr
mDetails; + std::shared_ptr
mDetails; }; // end struct HttpStatus /// A namespace for several free methods and low level utilities. namespace LLHttp { - typedef boost::shared_ptr CURL_ptr; + typedef std::shared_ptr CURL_ptr; void initialize(); void cleanup(); diff --git a/indra/llcorehttp/httphandler.h b/indra/llcorehttp/httphandler.h index 65e043f5d3..4cfb2598c7 100644 --- a/indra/llcorehttp/httphandler.h +++ b/indra/llcorehttp/httphandler.h @@ -58,8 +58,8 @@ class HttpResponse; class HttpHandler { public: - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; virtual ~HttpHandler() { } diff --git a/indra/llcorehttp/httpheaders.h b/indra/llcorehttp/httpheaders.h index b9168cb6ec..e7cf4037bf 100644 --- a/indra/llcorehttp/httpheaders.h +++ b/indra/llcorehttp/httpheaders.h @@ -85,7 +85,7 @@ public: typedef container_t::const_reverse_iterator const_reverse_iterator; typedef container_t::value_type value_type; typedef container_t::size_type size_type; - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; public: /// @post In addition to the instance, caller has a refcount diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h index 41f71896b0..fa993c857b 100644 --- a/indra/llcorehttp/httpoptions.h +++ b/indra/llcorehttp/httpoptions.h @@ -60,7 +60,7 @@ class HttpOptions : private boost::noncopyable public: HttpOptions(); - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; virtual ~HttpOptions(); // Use release() diff --git a/indra/llcorehttp/httprequest.h b/indra/llcorehttp/httprequest.h index ca4b9e92bc..857a034a7b 100644 --- a/indra/llcorehttp/httprequest.h +++ b/indra/llcorehttp/httprequest.h @@ -96,8 +96,8 @@ private: public: typedef unsigned int policy_t; - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; public: /// @name PolicyMethods /// @{ @@ -627,7 +627,7 @@ public: protected: private: - typedef boost::shared_ptr HttpReplyQueuePtr_t; + typedef std::shared_ptr HttpReplyQueuePtr_t; /// @name InstanceData /// diff --git a/indra/llcorehttp/httpresponse.h b/indra/llcorehttp/httpresponse.h index b834085e5c..ef98fbef2b 100644 --- a/indra/llcorehttp/httpresponse.h +++ b/indra/llcorehttp/httpresponse.h @@ -72,7 +72,7 @@ public: /// Statistics for the HTTP struct TransferStats { - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; TransferStats() : mSizeDownload(0.0), mTotalTime(0.0), mSpeedDownload(0.0) {} F64 mSizeDownload; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index 8dba1641a6..68598589b8 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -48,7 +48,7 @@ std::string LLImageJ2C::getEngineInfo() { // All known LLImageJ2CImpl implementation subclasses are cheap to // construct. - boost::scoped_ptr impl(fallbackCreateLLImageJ2CImpl()); + std::unique_ptr impl(fallbackCreateLLImageJ2CImpl()); return impl->getEngineInfo(); } diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index e196f7479e..b30df6f776 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -95,7 +95,7 @@ protected: S8 mRawDiscardLevel; F32 mRate; bool mReversible; - boost::scoped_ptr mImpl; + std::unique_ptr mImpl; std::string mLastError; // Image compression/decompression tester diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h index b57e4cc40e..fe3902380c 100644 --- a/indra/llkdu/llimagej2ckdu.h +++ b/indra/llkdu/llimagej2ckdu.h @@ -113,10 +113,10 @@ private: }; // Encode variable - boost::scoped_ptr mInputp; + std::unique_ptr mInputp; CodeStreamHolder mCodeStreamp; - boost::scoped_ptr mTPosp; // tile position - boost::scoped_ptr mTileIndicesp; + std::unique_ptr mTPosp; // tile position + std::unique_ptr mTileIndicesp; int mBlocksSize; int mPrecinctsSize; int mLevels; @@ -125,7 +125,7 @@ private: // We don't own this LLImageRaw. We're simply pointing to an instance // passed into initDecode(). LLImageRaw *mRawImagep; - boost::scoped_ptr mDecodeState; + std::unique_ptr mDecodeState; }; #endif diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp index ebbaea9b12..c0a5e361b1 100644 --- a/indra/llmessage/llcoproceduremanager.cpp +++ b/indra/llmessage/llcoproceduremanager.cpp @@ -95,7 +95,7 @@ public: private: struct QueuedCoproc { - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; QueuedCoproc(const std::string &name, const LLUUID &id, CoProcedure_t proc) : mName(name), @@ -115,7 +115,7 @@ private: // Use shared_ptr to control the lifespan of our CoprocQueue_t instance // because the consuming coroutine might outlive this LLCoprocedurePool // instance. - typedef boost::shared_ptr CoprocQueuePtr; + typedef std::shared_ptr CoprocQueuePtr; std::string mPoolName; size_t mPoolSize, mActiveCoprocsCount, mPending; @@ -301,7 +301,7 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size): mPoolSize(size), mActiveCoprocsCount(0), mPending(0), - mPendingCoprocs(boost::make_shared(LLCoprocedureManager::DEFAULT_QUEUE_SIZE)), + mPendingCoprocs(std::make_shared(LLCoprocedureManager::DEFAULT_QUEUE_SIZE)), mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID), mCoroMapping() { @@ -384,7 +384,7 @@ LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoproced LL_INFOS("CoProcMgr") << "Coprocedure(" << name << ") enqueuing with id=" << id.asString() << " in pool \"" << mPoolName << "\" at " << mPending << LL_ENDL; } - auto pushed = mPendingCoprocs->try_push(boost::make_shared(name, id, proc)); + auto pushed = mPendingCoprocs->try_push(std::make_shared(name, id, proc)); if (pushed == boost::fibers::channel_op_status::success) { ++mPending; diff --git a/indra/llmessage/llcorehttputil.h b/indra/llmessage/llcorehttputil.h index 6d0d68cf24..fc561c6b0f 100644 --- a/indra/llmessage/llcorehttputil.h +++ b/indra/llmessage/llcorehttputil.h @@ -263,8 +263,8 @@ class HttpCoroHandler : public LLCore::HttpHandler { public: - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; HttpCoroHandler(LLEventStream &reply); @@ -317,8 +317,8 @@ public: static const std::string HTTP_RESULTS_CONTENT; static const std::string HTTP_RESULTS_RAW; - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; HttpCoroutineAdapter(const std::string &name, LLCore::HttpRequest::policy_t policyId); ~HttpCoroutineAdapter(); diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h index 1c97133723..f0dc4624ef 100644 --- a/indra/llmessage/llexperiencecache.h +++ b/indra/llmessage/llexperiencecache.h @@ -112,7 +112,7 @@ private: // Callback types for get() typedef boost::signals2::signal < void(const LLSD &) > callback_signal_t; - typedef boost::shared_ptr signal_ptr; + typedef std::shared_ptr signal_ptr; // May have multiple callbacks for a single ID, which are // represented as multiple slots bound to the signal. // Avoid copying signals via pointers. diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp index c707c7ad09..e302dd2b5e 100644 --- a/indra/llmessage/lliohttpserver.cpp +++ b/indra/llmessage/lliohttpserver.cpp @@ -982,7 +982,7 @@ LLHTTPNode& LLIOHTTPServer::create( } LLHTTPResponseFactory* factory = new LLHTTPResponseFactory; - boost::shared_ptr factory_ptr(factory); + std::shared_ptr factory_ptr(factory); LLIOServerSocket* server = new LLIOServerSocket(pool, socket, factory_ptr); diff --git a/indra/llmessage/lliopipe.h b/indra/llmessage/lliopipe.h index 7fd4cee8ba..e6ac8ebfc2 100644 --- a/indra/llmessage/lliopipe.h +++ b/indra/llmessage/lliopipe.h @@ -89,7 +89,7 @@ public: /** * @brief Scattered memory container. */ - typedef boost::shared_ptr buffer_ptr_t; + typedef std::shared_ptr buffer_ptr_t; /** * @brief Enumeration for IO return codes diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h index 303d80eb14..a62b3c0204 100644 --- a/indra/llmessage/lliosocket.h +++ b/indra/llmessage/lliosocket.h @@ -65,7 +65,7 @@ public: /** * @brief Reference counted shared pointers to sockets. */ - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; /** * @brief Type of socket to create. @@ -305,7 +305,7 @@ class LLIOServerSocket : public LLIOPipe { public: typedef LLSocket::ptr_t socket_t; - typedef boost::shared_ptr factory_t; + typedef std::shared_ptr factory_t; LLIOServerSocket(apr_pool_t* pool, socket_t listener, factory_t reactor); virtual ~LLIOServerSocket(); diff --git a/indra/llmessage/llservice.h b/indra/llmessage/llservice.h index 9c09aeb44c..f215acab56 100644 --- a/indra/llmessage/llservice.h +++ b/indra/llmessage/llservice.h @@ -116,7 +116,7 @@ class LLService : public LLIOPipe public: //typedef boost::intrusive_ptr creator_t; //typedef boost::intrusive_ptr service_t; - typedef boost::shared_ptr creator_t; + typedef std::shared_ptr creator_t; /** * @brief This method is used to register a protocol name with a diff --git a/indra/llmessage/llstoredmessage.h b/indra/llmessage/llstoredmessage.h index 9c98e2c558..6ea150fda3 100644 --- a/indra/llmessage/llstoredmessage.h +++ b/indra/llmessage/llstoredmessage.h @@ -46,7 +46,7 @@ private: std::string mName; }; -typedef boost::shared_ptr LLStoredMessagePtr; +typedef std::shared_ptr LLStoredMessagePtr; #endif // LL_STOREDMESSAGE_H diff --git a/indra/llmessage/tests/llcurl_stub.cpp b/indra/llmessage/tests/llcurl_stub.cpp index b7fdf4f437..1c571a74da 100644 --- a/indra/llmessage/tests/llcurl_stub.cpp +++ b/indra/llmessage/tests/llcurl_stub.cpp @@ -49,7 +49,7 @@ void LLCurl::Responder::httpCompleted() } void LLCurl::Responder::completedRaw(LLChannelDescriptors const&, - boost::shared_ptr const&) + std::shared_ptr const&) { } diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index ba76ae4e37..d56712257b 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -335,7 +335,7 @@ public: // "init_history" message void initializeUrlHistory(const LLSD& url_history); - boost::shared_ptr getSharedPtr() { return boost::dynamic_pointer_cast(shared_from_this()); } // due to enable_shared_from_this + std::shared_ptr getSharedPtr() { return std::dynamic_pointer_cast(shared_from_this()); } // due to enable_shared_from_this protected: diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 1893c9e657..01627925d7 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -43,7 +43,7 @@ #include "llsd.h" #include "llevents.h" -class LLPluginProcessParentOwner : public boost::enable_shared_from_this < LLPluginProcessParentOwner > +class LLPluginProcessParentOwner : public std::enable_shared_from_this < LLPluginProcessParentOwner > { public: virtual ~LLPluginProcessParentOwner(); @@ -60,7 +60,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner LLPluginProcessParent(LLPluginProcessParentOwner *owner); public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; ~LLPluginProcessParent(); diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp index b072ce3964..c3e17d1267 100644 --- a/indra/llprimitive/tests/llmediaentry_test.cpp +++ b/indra/llprimitive/tests/llmediaentry_test.cpp @@ -211,7 +211,7 @@ namespace tut void whitelist_test(int num, bool enable, const char *whitelist, const char *candidate_url, bool expected_pass) { - std::string message = "Whitelist test " + boost::lexical_cast(num); + std::string message = "Whitelist test " + std::to_string(num); LLMediaEntry entry; entry.setWhiteListEnable(enable); set_whitelist(entry, whitelist); diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 921398a693..4d010ae9d9 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -990,7 +990,7 @@ private: bool mIgnoreAllNotifications; - boost::scoped_ptr mListener; + std::unique_ptr mListener; std::vector mDefaultChannels; }; diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index fd3a9b1d7b..43b4457bf5 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -61,7 +61,7 @@ class LLTeleportRequest; -typedef boost::shared_ptr LLTeleportRequestPtr; +typedef std::shared_ptr LLTeleportRequestPtr; //-------------------------------------------------------------------- // Types @@ -131,7 +131,7 @@ public: private: bool mInitialized; bool mFirstLogin; - boost::shared_ptr mListener; + std::shared_ptr mListener; //-------------------------------------------------------------------- // Session diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4c3a9229d2..ebf08eacd9 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3742,7 +3742,7 @@ LLSD LLAppearanceMgr::dumpCOF() const LLUUID linked_asset_id(linked_item->getAssetUUID()); md5.update((unsigned char*)linked_asset_id.mData, 16); U32 flags = linked_item->getFlags(); - md5.update(boost::lexical_cast(flags)); + md5.update(std::to_string(flags)); } else if (LLAssetType::AT_LINK_FOLDER != inv_item->getActualType()) { diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 58a797218f..5705cbb3f5 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -552,7 +552,7 @@ protected: LLNotificationChiclet* const mChiclet; }; - boost::scoped_ptr mNotificationChannel; + std::unique_ptr mNotificationChannel; LLNotificationChiclet(const Params& p); diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index eb2c156ca5..b11786a451 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -73,7 +73,7 @@ namespace class ObjectInventoryFetcher: public LLVOInventoryListener { public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; ObjectInventoryFetcher(LLEventPump &pump, LLViewerObject* object, void* user_data) : mPump(pump), diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index a696c99a82..e7ead90840 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -434,7 +434,7 @@ bool LLConversationLog::moveLog(const std::string &originDirectory, const std::s while(LLFile::isfile(backupFileName)) { ++backupFileCount; - backupFileName = targetDirectory + ".backup" + boost::lexical_cast(backupFileCount); + backupFileName = targetDirectory + ".backup" + std::to_string(backupFileCount); } //Rename the file to its backup name so it is not overwritten diff --git a/indra/newview/llfloatereditsky.cpp b/indra/newview/llfloatereditsky.cpp index 2d5e86869d..fa51143f3a 100644 --- a/indra/newview/llfloatereditsky.cpp +++ b/indra/newview/llfloatereditsky.cpp @@ -84,7 +84,7 @@ BOOL LLFloaterEditSky::postBuild() mSkyPresetCombo = getChild("sky_preset_combo"); mMakeDefaultCheckBox = getChild("make_default_cb"); mSaveButton = getChild("save"); - mSkyAdapter = boost::make_shared(); + mSkyAdapter = std::make_shared(); LLEnvironment::instance().setSkyListChange(boost::bind(&LLFloaterEditSky::onSkyPresetListChange, this)); diff --git a/indra/newview/llfloatereditwater.cpp b/indra/newview/llfloatereditwater.cpp index c44ae7faca..4a6268435b 100644 --- a/indra/newview/llfloatereditwater.cpp +++ b/indra/newview/llfloatereditwater.cpp @@ -71,7 +71,7 @@ BOOL LLFloaterEditWater::postBuild() mMakeDefaultCheckBox = getChild("make_default_cb"); mSaveButton = getChild("save"); - mWaterAdapter = boost::make_shared(); + mWaterAdapter = std::make_shared(); LLEnvironment::instance().setWaterListChange(boost::bind(&LLFloaterEditWater::onWaterPresetListChange, this)); diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index 4cd91c53d8..ef4b71b3af 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -453,7 +453,7 @@ void LLFloaterIMNearbyChatScreenChannel::arrangeToasts() //----------------------------------------------------------------------------------------------- //LLFloaterIMNearbyChatHandler //----------------------------------------------------------------------------------------------- -boost::scoped_ptr LLFloaterIMNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat")); +std::unique_ptr LLFloaterIMNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat")); LLFloaterIMNearbyChatHandler::LLFloaterIMNearbyChatHandler() { diff --git a/indra/newview/llfloaterimnearbychathandler.h b/indra/newview/llfloaterimnearbychathandler.h index 5e6f8cde30..1849604470 100644 --- a/indra/newview/llfloaterimnearbychathandler.h +++ b/indra/newview/llfloaterimnearbychathandler.h @@ -46,7 +46,7 @@ public: protected: virtual void initChannel(); - static boost::scoped_ptr sChatWatcher; + static std::unique_ptr sChatWatcher; }; } diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 67a205417e..b0183f072e 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -158,7 +158,7 @@ public: // typedef std::map,std::list > > DiffMap; // this version copies the lists etc., and thus is bad memory-wise typedef std::list StringList; - typedef boost::shared_ptr StringListPtr; + typedef std::shared_ptr StringListPtr; typedef std::map > DiffMap; DiffMap mDiffsMap; // map, of filename to pair of list of changed element paths and list of errors diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 932a0316dd..eee60de033 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3027,7 +3027,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, return accept; } -void warn_move_inventory(LLViewerObject* object, boost::shared_ptr move_inv) +void warn_move_inventory(LLViewerObject* object, std::shared_ptr move_inv) { const char* dialog = NULL; if (object->flagScripted()) @@ -3040,7 +3040,7 @@ void warn_move_inventory(LLViewerObject* object, boost::shared_ptr mo } static LLNotificationPtr notification_ptr; - static boost::shared_ptr inv_ptr; + static std::shared_ptr inv_ptr; // Notification blocks user from interacting with inventories so everything that comes after first message // is part of this message - don'r show it again @@ -3153,7 +3153,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, if(drop && accept) { it = inventory_objects.begin(); - boost::shared_ptr move_inv(new LLMoveInv); + std::shared_ptr move_inv(new LLMoveInv); move_inv->mObjectID = object_id; move_inv->mCategoryID = category_id; move_inv->mCallback = callback; @@ -5012,7 +5012,7 @@ LLFontGL::StyleFlags LLMarketplaceFolderBridge::getLabelStyle() const // helper stuff -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr move_inv) +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, std::shared_ptr move_inv) { LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData; LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID); @@ -5486,7 +5486,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if (accept && drop) { LLUUID item_id = inv_item->getUUID(); - boost::shared_ptr move_inv (new LLMoveInv()); + std::shared_ptr move_inv (new LLMoveInv()); move_inv->mObjectID = inv_item->getParentUUID(); two_uuids_t item_pair(mUUID, item_id); move_inv->mMoveList.push_back(item_pair); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3cbbd68e51..6f06f3b36d 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -794,7 +794,7 @@ struct LLMoveInv void* mUserData; }; -void warn_move_inventory(LLViewerObject* object, boost::shared_ptr move_inv); -bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr); +void warn_move_inventory(LLViewerObject* object, std::shared_ptr move_inv); +bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, std::shared_ptr); #endif // LL_LLINVENTORYBRIDGE_H diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 68581d04eb..651790dd68 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -3323,7 +3323,7 @@ BOOL dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, BOOL drop, if (accept && drop) { - boost::shared_ptr move_inv (new LLMoveInv()); + std::shared_ptr move_inv (new LLMoveInv()); move_inv->mObjectID = inv_item->getParentUUID(); std::pair item_pair(folder_id, inv_item->getUUID()); move_inv->mMoveList.push_back(item_pair); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 052ac50185..ca88f90ea9 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -723,7 +723,7 @@ bool LLLogChat::moveTranscripts(const std::string originDirectory, while(LLFile::isfile(backupFileName)) { ++backupFileCount; - backupFileName = newFullPath + ".backup" + boost::lexical_cast(backupFileCount); + backupFileName = newFullPath + ".backup" + std::to_string(backupFileCount); } //Rename the file to its backup name so it is not overwritten diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index 2e9aab7c00..74d6890d1d 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -90,7 +90,7 @@ private: void attemptComplete() { mAttemptComplete = true; } // In the future an event? - boost::scoped_ptr mLoginModule; + std::unique_ptr mLoginModule; LLNotificationsInterface* mNotifications; std::string mLoginState; diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index 3b59b2f05e..577ab0048f 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -68,7 +68,7 @@ class LLMaterialHttpHandler : public LLHttpSDHandler { public: typedef boost::function CallbackFunction; - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; LLMaterialHttpHandler(const std::string& method, CallbackFunction cback); diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 58f8bad3e4..8cd4793106 100644 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -116,10 +116,10 @@ protected: // Request (pure virtual base class for requests in the queue) class Request: - public boost::enable_shared_from_this + public std::enable_shared_from_this { public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; // Subclasses must implement this to build a payload for their request type. virtual LLSD getPayload() const = 0; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 01d6469010..1f909b98dc 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -411,7 +411,7 @@ namespace { static S32 dump_num = 0; std::string make_dump_name(std::string prefix, S32 num) { - return prefix + boost::lexical_cast(num) + std::string(".xml"); + return prefix + std::to_string(num) + std::string(".xml"); } void dump_llsd_to_file(const LLSD& content, std::string filename); LLSD llsd_from_file(std::string filename); @@ -572,10 +572,10 @@ S32 LLMeshRepoThread::sRequestWaterLevel = 0; // LLMeshUploadThread class LLMeshHandlerBase : public LLCore::HttpHandler, - public boost::enable_shared_from_this + public std::enable_shared_from_this { public: - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; LOG_CLASS(LLMeshHandlerBase); LLMeshHandlerBase(U32 offset, U32 requested_bytes) diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h index c6254f72cf..5c4f8e9135 100644 --- a/indra/newview/llpanellogin.h +++ b/indra/newview/llpanellogin.h @@ -112,7 +112,7 @@ private: static void updateServerCombo(); private: - boost::scoped_ptr mListener; + std::unique_ptr mListener; void updateLoginButtons(); void populateUserList(LLPointer credential); diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 17b8ec0683..664e240484 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -114,7 +114,7 @@ public: void handleTerrainLinksetsResult(const LLSD &pContent); void handleTerrainLinksetsError(); - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; protected: @@ -139,7 +139,7 @@ private: LLPathfindingObjectPtr mTerrainLinksetPtr; }; -typedef boost::shared_ptr LinksetsResponderPtr; +typedef std::shared_ptr LinksetsResponderPtr; //--------------------------------------------------------------------------- // LLPathfindingManager diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h index bb44f780c8..258d0fdef7 100644 --- a/indra/newview/llpathfindingmanager.h +++ b/indra/newview/llpathfindingmanager.h @@ -107,8 +107,8 @@ private: void navMeshStatusRequestCoro(std::string url, U64 regionHandle, bool isGetStatusOnly); void navAgentStateRequestCoro(std::string url); void navMeshRebakeCoro(std::string url, rebake_navmesh_callback_t rebakeNavMeshCallback); - void linksetObjectsCoro(std::string url, boost::shared_ptr linksetsResponsderPtr, LLSD putData) const; - void linksetTerrainCoro(std::string url, boost::shared_ptr linksetsResponsderPtr, LLSD putData) const; + void linksetObjectsCoro(std::string url, std::shared_ptr linksetsResponsderPtr, LLSD putData) const; + void linksetTerrainCoro(std::string url, std::shared_ptr linksetsResponsderPtr, LLSD putData) const; void charactersCoro(std::string url, request_id_t requestId, object_request_callback_t callback) const; //void handleNavMeshStatusRequest(const LLPathfindingNavMeshStatus &pNavMeshStatus, LLViewerRegion *pRegion, bool pIsGetStatusOnly); diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index 87f32b8d56..ddc886f01c 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -39,7 +39,7 @@ class LLPathfindingNavMesh; class LLUUID; -typedef boost::shared_ptr LLPathfindingNavMeshPtr; +typedef std::shared_ptr LLPathfindingNavMeshPtr; class LLPathfindingNavMesh { diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h index baa1cc5979..b76f4421a6 100644 --- a/indra/newview/llpathfindingnavmeshzone.h +++ b/indra/newview/llpathfindingnavmeshzone.h @@ -114,7 +114,7 @@ private: LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot; }; - typedef boost::shared_ptr NavMeshLocationPtr; + typedef std::shared_ptr NavMeshLocationPtr; typedef std::vector NavMeshLocationPtrs; void handleNavMeshLocation(); diff --git a/indra/newview/llpathfindingobject.h b/indra/newview/llpathfindingobject.h index b8d3ca2364..0114cce3f1 100644 --- a/indra/newview/llpathfindingobject.h +++ b/indra/newview/llpathfindingobject.h @@ -41,7 +41,7 @@ class LLPathfindingObject; class LLSD; -typedef boost::shared_ptr LLPathfindingObjectPtr; +typedef std::shared_ptr LLPathfindingObjectPtr; class LLPathfindingObject { diff --git a/indra/newview/llpathfindingobjectlist.h b/indra/newview/llpathfindingobjectlist.h index 61580582d3..e2e0dce4da 100644 --- a/indra/newview/llpathfindingobjectlist.h +++ b/indra/newview/llpathfindingobjectlist.h @@ -36,7 +36,7 @@ class LLPathfindingObjectList; -typedef boost::shared_ptr LLPathfindingObjectListPtr; +typedef std::shared_ptr LLPathfindingObjectListPtr; typedef std::map LLPathfindingObjectMap; class LLPathfindingObjectList diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 975e2bb910..ea7d4800e0 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -653,7 +653,7 @@ void LLPreviewTexture::adjustAspectRatio() { // No existing ratio found, create an element that will show image at original ratio populateRatioList(); // makes sure previous custom ratio is cleared - std::string ratio = boost::lexical_cast(num)+":" + boost::lexical_cast(denom); + std::string ratio = std::to_string(num)+":" + std::to_string(denom); mRatiosList.push_back(ratio); combo->add(ratio); combo->setCurrentByIndex(mRatiosList.size()- 1); diff --git a/indra/newview/llsculptidsize.cpp b/indra/newview/llsculptidsize.cpp index 5d051d0ebf..bedee32213 100644 --- a/indra/newview/llsculptidsize.cpp +++ b/indra/newview/llsculptidsize.cpp @@ -66,7 +66,7 @@ void LLSculptIDSize::inc(const LLDrawable *pdrawable, int sz) if (itLU.first == itLU.second) { //register //llassert(mSizeInfo.get().end() == mSizeInfo.get().find(pdrawable)); - mSizeInfo.get().insert(Info(pdrawable, sz, boost::make_shared(sz), sculptId)); + mSizeInfo.get().insert(Info(pdrawable, sz, std::make_shared(sz), sculptId)); total_size = sz; } else diff --git a/indra/newview/llsculptidsize.h b/indra/newview/llsculptidsize.h index 87ee417b86..679fcbd44c 100644 --- a/indra/newview/llsculptidsize.h +++ b/indra/newview/llsculptidsize.h @@ -52,7 +52,7 @@ public: struct Info { - typedef boost::shared_ptr PtrSizeSum; + typedef std::shared_ptr PtrSizeSum; Info(const LLDrawable *drawable, int size, PtrSizeSum sizeInfo, LLUUID sculptId) : mDrawable(drawable) diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h index 31f11eb8ef..84fcefb835 100644 --- a/indra/newview/llsearchableui.h +++ b/indra/newview/llsearchableui.h @@ -93,7 +93,7 @@ namespace ll { struct SearchableItem; - typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; + typedef std::shared_ptr< SearchableItem > SearchableItemPtr; typedef std::vector< SearchableItemPtr > tSearchableItemList; diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index f1f42afd81..5041c9f76f 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -431,7 +431,7 @@ private: private: // a single media url with some data and an impl. - boost::shared_ptr mMediaSource; + std::shared_ptr mMediaSource; LLMutex mLock; F64 mZoomFactor; LLUUID mTextureId; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index ff2ee693fd..6b9df6df28 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -145,7 +145,7 @@ public: virtual void notify(const std::vector& filenames); private: - boost::shared_ptr mPlugin; + std::shared_ptr mPlugin; }; diff --git a/indra/newview/llviewerparcelaskplay.cpp b/indra/newview/llviewerparcelaskplay.cpp index afbe2c94de..aea06834b2 100644 --- a/indra/newview/llviewerparcelaskplay.cpp +++ b/indra/newview/llviewerparcelaskplay.cpp @@ -287,7 +287,7 @@ void LLViewerParcelAskPlay::saveSettings() if ((iter_parcel->second.mDate.secondsSinceEpoch() + (F64SecondsImplicit)U32Days(30)) > LLTimer::getTotalSeconds()) { // write unexpired parcels - std::string parcel_id = boost::lexical_cast(iter_parcel->first); + std::string parcel_id = std::to_string(iter_parcel->first); write_llsd[key][parcel_id] = LLSD(); write_llsd[key][parcel_id]["mode"] = (LLSD::Integer)iter_parcel->second.mMode; write_llsd[key][parcel_id]["date"] = iter_parcel->second.mDate; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 3225299493..2bab50300b 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -592,7 +592,7 @@ std::string LLViewerShaderMgr::loadBasicShaders() std::map attribs; attribs["MAX_JOINTS_PER_MESH_OBJECT"] = - boost::lexical_cast(LLSkinningUtil::getMaxJointCount()); + std::to_string(LLSkinningUtil::getMaxJointCount()); BOOL ssr = gSavedSettings.getBOOL("RenderScreenSpaceReflections"); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index ccef006a07..346073b8a1 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -538,8 +538,8 @@ private: bool mStatesDirty; U32 mCurrResolutionIndex; - boost::scoped_ptr mWindowListener; - boost::scoped_ptr mViewerWindowListener; + std::unique_ptr mWindowListener; + std::unique_ptr mViewerWindowListener; // Object temporarily hovered over while dragging LLPointer mDragHoveredObject; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 3725510b6a..c8d77a6e0b 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -5952,7 +5952,7 @@ void LLVivoxVoiceClient::filePlaybackSetMode(bool vox, float speed) } //------------------------------------------------------------------------ -std::set LLVivoxVoiceClient::sessionState::mSession; +std::set> LLVivoxVoiceClient::sessionState::mSession; LLVivoxVoiceClient::sessionState::sessionState() : diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index e3ab99c675..d75d1b4b5d 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -294,8 +294,8 @@ protected: bool mAvatarIDValid; bool mIsSelf; }; - typedef boost::shared_ptr participantStatePtr_t; - typedef boost::weak_ptr participantStateWptr_t; + typedef std::shared_ptr participantStatePtr_t; + typedef std::weak_ptr participantStateWptr_t; typedef std::map participantMap; typedef std::map participantUUIDMap; @@ -303,10 +303,10 @@ protected: struct sessionState { public: - typedef boost::shared_ptr ptr_t; - typedef boost::weak_ptr wptr_t; + typedef std::shared_ptr ptr_t; + typedef std::weak_ptr wptr_t; - typedef boost::function sessionFunc_t; + typedef std::function sessionFunc_t; static ptr_t createSession(); ~sessionState(); @@ -370,7 +370,7 @@ protected: private: sessionState(); - static std::set mSession; // canonical list of outstanding sessions. + static std::set> mSession; // canonical list of outstanding sessions. std::set::iterator mMyIterator; // used for delete static void for_eachPredicate(const wptr_t &a, sessionFunc_t func); @@ -381,7 +381,7 @@ protected: static bool testByCallerId(const LLVivoxVoiceClient::sessionState::wptr_t &a, LLUUID participantId); }; - typedef boost::shared_ptr sessionStatePtr_t; + typedef std::shared_ptr sessionStatePtr_t; typedef std::map sessionMap; diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index aa8c79b0d2..0edabf358f 100644 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -388,7 +388,7 @@ static void mouseEvent(const MouseFunc& func, const LLSD& request) LLCoordGL pos(request["x"].asInteger(), request["y"].asInteger()); bool has_pos(request.has("x") && request.has("y")); - boost::scoped_ptr tempfunc; + std::unique_ptr tempfunc; // Documentation for mouseDown(), mouseUp() and mouseMove() claims you // must either specify ["path"], or both of ["x"] and ["y"]. You MAY diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index b816f9a3b5..3c2c6d15c4 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -544,7 +544,7 @@ private: const std::string mMethod; const std::string mReplyPump; LLTempBoundListener mBoundListener; - boost::scoped_ptr mTransaction; + std::unique_ptr mTransaction; LLXMLRPCTransaction::EStatus mPreviousStatus; // To detect state changes. }; diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index ba7e8d7298..a77c31eee3 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -188,7 +188,7 @@ public: virtual void onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response); - typedef boost::shared_ptr ptr_t; + typedef std::shared_ptr ptr_t; private: diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp index 4f7f87b6b0..4eddfb46e1 100644 --- a/indra/newview/tests/llremoteparcelrequest_test.cpp +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -49,7 +49,7 @@ void LLCurl::Responder::failureResult(S32 status, const std::string& reason, con void LLCurl::Responder::successResult(const LLSD& content) { } void LLCurl::Responder::completeResult(S32 status, const std::string& reason, const LLSD& content) { } std::string LLCurl::Responder::dumpResponse() const { return "(failure)"; } -void LLCurl::Responder::completedRaw(LLChannelDescriptors const &,boost::shared_ptr const &) { } +void LLCurl::Responder::completedRaw(LLChannelDescriptors const &,std::shared_ptr const &) { } void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { } void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { } void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { } @@ -110,7 +110,7 @@ namespace tut { set_test_name("observer pointer"); - boost::scoped_ptr observer(new TestObserver()); + std::unique_ptr observer(new TestObserver()); LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance(); processor.addObserver(LLUUID(TEST_PARCEL_ID), observer.get()); diff --git a/indra/test/io.cpp b/indra/test/io.cpp index 40243a8ad6..99b49c8b29 100644 --- a/indra/test/io.cpp +++ b/indra/test/io.cpp @@ -946,7 +946,7 @@ namespace tut typedef LLCloneIOFactory emitter_t; emitter_t* emitter = new emitter_t( new LLPipeStringInjector("suckers never play me")); - boost::shared_ptr factory(emitter); + std::shared_ptr factory(emitter); LLIOServerSocket* server = new LLIOServerSocket( mPool, mSocket, @@ -993,7 +993,7 @@ namespace tut LLPumpIO::chain_t chain; typedef LLCloneIOFactory emitter_t; emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - boost::shared_ptr factory(emitter); + std::shared_ptr factory(emitter); LLIOServerSocket* server = new LLIOServerSocket( mPool, mSocket, @@ -1036,7 +1036,7 @@ namespace tut LLPumpIO::chain_t chain; typedef LLCloneIOFactory emitter_t; emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - boost::shared_ptr factory(emitter); + std::shared_ptr factory(emitter); LLIOServerSocket* server = new LLIOServerSocket( mPool, mSocket, @@ -1079,7 +1079,7 @@ namespace tut LLPumpIO::chain_t chain; typedef LLCloneIOFactory emitter_t; emitter_t* emitter = new emitter_t(new LLIOFuzz(1000000)); - boost::shared_ptr factory(emitter); + std::shared_ptr factory(emitter); LLIOServerSocket* server = new LLIOServerSocket( mPool, mSocket, @@ -1120,7 +1120,7 @@ namespace tut LLPumpIO::chain_t chain; typedef LLCloneIOFactory sleeper_t; sleeper_t* sleeper = new sleeper_t(new LLIOSleeper); - boost::shared_ptr factory(sleeper); + std::shared_ptr factory(sleeper); LLIOServerSocket* server = new LLIOServerSocket( mPool, mSocket, diff --git a/indra/test/llevents_tut.cpp b/indra/test/llevents_tut.cpp index 17f64a4953..a38de71e48 100644 --- a/indra/test/llevents_tut.cpp +++ b/indra/test/llevents_tut.cpp @@ -368,10 +368,10 @@ void events_object::test<7>() LLEventStream bob("bob"); // should work, previous one unregistered LLEventStream bob1("bob", true);// allowed to tweak name ensure_equals("tweaked LLEventStream name", bob1.getName(), "bob1"); - std::vector > streams; + std::vector > streams; for (int i = 2; i <= 10; ++i) { - streams.push_back(boost::shared_ptr(new LLEventStream("bob", true))); + streams.push_back(std::shared_ptr(new LLEventStream("bob", true))); } ensure_equals("last tweaked LLEventStream name", streams.back()->getName(), "bob10"); } diff --git a/indra/test/test.cpp b/indra/test/test.cpp index a265e1273b..fba7a48bb4 100644 --- a/indra/test/test.cpp +++ b/indra/test/test.cpp @@ -160,12 +160,12 @@ public: virtual void reset() { - boost::dynamic_pointer_cast(mRecorder)->reset(); + std::dynamic_pointer_cast(mRecorder)->reset(); } virtual void replay(std::ostream& out) { - boost::dynamic_pointer_cast(mRecorder)->replay(out); + std::dynamic_pointer_cast(mRecorder)->replay(out); } private: @@ -179,7 +179,7 @@ class LLTestCallback : public chained_callback public: LLTestCallback(bool verbose_mode, std::ostream *stream, - boost::shared_ptr replayer) : + std::shared_ptr replayer) : mVerboseMode(verbose_mode), mTotalTests(0), mPassedTests(0), @@ -187,7 +187,7 @@ public: mSkippedTests(0), // By default, capture a shared_ptr to std::cout, with a no-op "deleter" // so that destroying the shared_ptr makes no attempt to delete std::cout. - mStream(boost::shared_ptr(&std::cout, [](std::ostream*){})), + mStream(std::shared_ptr(&std::cout, [](std::ostream*){})), mReplayer(replayer) { if (stream) @@ -201,7 +201,7 @@ public: // Allocate and assign in two separate steps, per Herb Sutter. // (Until we turn on C++11 support, have to wrap *stream with // boost::ref() due to lack of perfect forwarding.) - boost::shared_ptr pstream(new TeeStream(std::cout, boost::ref(*stream))); + std::shared_ptr pstream(new TeeStream(std::cout, boost::ref(*stream))); mStream = pstream; } } @@ -325,8 +325,8 @@ protected: int mPassedTests; int mFailedTests; int mSkippedTests; - boost::shared_ptr mStream; - boost::shared_ptr mReplayer; + std::shared_ptr mStream; + std::shared_ptr mReplayer; }; // TeamCity specific class which emits service messages @@ -336,7 +336,7 @@ class LLTCTestCallback : public LLTestCallback { public: LLTCTestCallback(bool verbose_mode, std::ostream *stream, - boost::shared_ptr replayer) : + std::shared_ptr replayer) : LLTestCallback(verbose_mode, stream, replayer) { } @@ -549,7 +549,7 @@ int main(int argc, char **argv) apr_status_t apr_err; const char* opt_arg = NULL; int opt_id = 0; - boost::scoped_ptr output; + std::unique_ptr output; const char *touch = NULL; while(true) @@ -608,7 +608,7 @@ int main(int argc, char **argv) // set up logging const char* LOGFAIL = getenv("LOGFAIL"); - boost::shared_ptr replayer{boost::make_shared()}; + std::shared_ptr replayer{std::make_shared()}; // Testing environment variables for both 'set' and 'not empty' allows a // user to suppress a pre-existing environment variable by forcing empty. diff --git a/indra/viewer_components/login/lllogin.h b/indra/viewer_components/login/lllogin.h index 051641ff59..de58ca0c29 100644 --- a/indra/viewer_components/login/lllogin.h +++ b/indra/viewer_components/login/lllogin.h @@ -121,7 +121,7 @@ public: private: class Impl; - boost::scoped_ptr mImpl; + std::unique_ptr mImpl; }; #endif // LL_LLLOGIN_H -- cgit v1.2.3 From e5ef481cd3e3f07fbb39ccf07ae71718d54ffaa6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 9 Jan 2024 00:19:39 +0200 Subject: SL-20781 Follow up on boost to std replacement --- doc/contributions.txt | 2 ++ indra/llappearance/llavatarappearance.cpp | 14 -------------- indra/llprimitive/lldaeloader.cpp | 4 +--- indra/llprimitive/llgltfloader.cpp | 2 -- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/doc/contributions.txt b/doc/contributions.txt index a097aad7f6..fa47afe579 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -64,6 +64,8 @@ Aimee Trescothick VWR-14711 VWR-14712 VWR-15454 +AiraYumi + SL-20781 (github PR #613) Alejandro Rosenthal VWR-1184 Aleric Inglewood diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index b9c3aee839..b430c4c6aa 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -24,12 +24,6 @@ * $/LicenseInfo$ */ -#if LL_MSVC -// disable warning about boost::lexical_cast returning uninitialized data -// when it fails to parse the string -#pragma warning (disable:4701) -#endif - #include "linden_common.h" #include "llavatarappearance.h" @@ -46,14 +40,6 @@ #include "boost/bind.hpp" #include "boost/tokenizer.hpp" - -#if LL_MSVC -// disable boost::lexical_cast warning -#pragma warning (disable:4702) -#endif - -#include - using namespace LLAvatarAppearanceDefines; //----------------------------------------------------------------------------- diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 2e4b013b77..2c357e1ac5 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -53,8 +53,6 @@ #pragma warning (default : 4264) #endif -#include - #include "lldaeloader.h" #include "llsdserialize.h" #include "lljoint.h" @@ -2385,7 +2383,7 @@ std::string LLDAELoader::getElementLabel(daeElement *element) if (ind > 0) { - index_string = "_" + boost::lexical_cast(ind); + index_string = "_" + std::to_string(ind); } // if parent has a name or ID, use it diff --git a/indra/llprimitive/llgltfloader.cpp b/indra/llprimitive/llgltfloader.cpp index 7394f99794..8e498158d6 100644 --- a/indra/llprimitive/llgltfloader.cpp +++ b/indra/llprimitive/llgltfloader.cpp @@ -48,8 +48,6 @@ // TODO: includes inherited from dae loader. Validate / prune -#include - #include "llsdserialize.h" #include "lljoint.h" -- cgit v1.2.3 From 8e3fb2da0f91729f4a7a663002c68abd80d4a3e7 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 9 Jan 2024 00:43:56 +0100 Subject: Fix project structure generated by CMake --- indra/newview/CMakeLists.txt | 32 +++++++------------------------- 1 file changed, 7 insertions(+), 25 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7a70d0b6e6..e4f8d9b65e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1573,34 +1573,15 @@ endif (WINDOWS) # Add the xui files. This is handy for searching for xui elements # from within the IDE. -set(viewer_XUI_FILES - skins/default/colors.xml - skins/default/default_languages.xml - skins/default/textures/textures.xml - ) -file(GLOB DEFAULT_XUI_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml) -list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST}) - -file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST - ${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/widgets/*.xml) -list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST}) - -# Cannot append empty lists in CMake, wait until we have files here. -#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST -# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml) -#list(APPEND viewer_XUI_FILES ${SILVER_WIDGET_FILE_GLOB_LIST}) - -list(SORT viewer_XUI_FILES) - -source_group("XUI Files" FILES ${viewer_XUI_FILES}) - -set_source_files_properties(${viewer_XUI_FILES} +file(GLOB_RECURSE viewer_XUI_FILES LIST_DIRECTORIES FALSE + ${CMAKE_CURRENT_SOURCE_DIR}/skins/*.xml) +source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/skins PREFIX "XUI Files" FILES ${viewer_XUI_FILES}) +set_source_files_properties(${viewer_XUI_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) - list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) -file(GLOB_RECURSE viewer_SHADER_FILES LIST_DIRECTORIES TRUE +# Add the shader sources +file(GLOB_RECURSE viewer_SHADER_FILES LIST_DIRECTORIES FALSE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders/*.glsl) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders PREFIX "Shaders" FILES ${viewer_SHADER_FILES}) set_source_files_properties(${viewer_SHADER_FILES} @@ -1610,6 +1591,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_SHADER_FILES}) set(viewer_APPSETTINGS_FILES app_settings/anim.ini + app_settings/autoreplace.xml app_settings/cmd_line.xml app_settings/commands.xml app_settings/grass.xml -- cgit v1.2.3 From ba74152c823563a66729ea0a7fb7cab5bf58980d Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 9 Jan 2024 00:16:52 +0100 Subject: Replace BOOST_FOREACH with standard C++ range-based for-loops --- indra/llcommon/llprocess.cpp | 9 +++--- indra/llcommon/llsdutil.h | 6 ++-- indra/llcommon/llsingleton.cpp | 3 +- indra/llcommon/llsys.cpp | 10 +++---- indra/llcommon/tests/llprocess_test.cpp | 5 ++-- indra/llcommon/tests/llstreamqueue_test.cpp | 9 ++---- indra/llcommon/tests/lltreeiterators_test.cpp | 23 +++++++-------- indra/llfilesystem/lldir.cpp | 9 +++--- indra/llfilesystem/tests/lldir_test.cpp | 5 ++-- indra/llui/llcommandmanager.cpp | 4 +-- indra/llui/llfloater.cpp | 8 ++---- indra/llui/lllayoutstack.cpp | 41 ++++++++++++++------------- indra/llui/llloadingindicator.cpp | 3 +- indra/llui/llmenugl.cpp | 3 +- indra/llui/llnotifications.cpp | 17 ++++++----- indra/llui/llnotificationslistener.cpp | 1 - indra/llui/lltoolbar.cpp | 13 ++++----- indra/llui/lluicolortable.cpp | 3 +- indra/llui/llview.cpp | 27 +++++++++--------- indra/newview/llagent.cpp | 3 +- indra/newview/llappearancemgr.cpp | 5 ++-- indra/newview/llappviewer.cpp | 13 ++++----- indra/newview/llconversationlog.cpp | 3 +- indra/newview/llconversationmodel.cpp | 5 +--- indra/newview/llexternaleditor.cpp | 3 +- indra/newview/llfloaterimcontainer.cpp | 5 ++-- indra/newview/llinventoryfunctions.cpp | 2 -- indra/newview/lllogchat.cpp | 5 ++-- indra/newview/llmarketplacenotifications.cpp | 3 +- indra/newview/llnotificationmanager.cpp | 21 ++++++-------- indra/newview/lloutfitgallery.cpp | 4 +-- indra/newview/llpanelexperiencelisteditor.cpp | 3 +- indra/newview/llpanelgroupbulkban.cpp | 13 ++++----- indra/newview/lltoolbarview.cpp | 8 ++---- indra/newview/llviewermessage.cpp | 6 ++-- 35 files changed, 128 insertions(+), 173 deletions(-) diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp index 0d65762284..0d6a147da3 100644 --- a/indra/llcommon/llprocess.cpp +++ b/indra/llcommon/llprocess.cpp @@ -36,7 +36,6 @@ #include "llevents.h" #include "llexception.h" -#include #include #include #include @@ -587,7 +586,7 @@ LLProcess::LLProcess(const LLSDOrParams& params): // apr_procattr_child_err_set()), or accepting a filename, opening it and // passing that apr_file_t (simple <, >, 2> redirect emulation). std::vector select; - BOOST_FOREACH(const FileParam& fparam, params.files) + for (const FileParam& fparam : params.files) { // Every iteration, we're going to append an item to 'select'. At the // top of the loop, its size() is, in effect, an index. Use that to @@ -684,7 +683,7 @@ LLProcess::LLProcess(const LLSDOrParams& params): argv.push_back(params.executable().c_str()); // Add arguments. See above remarks about c_str(). - BOOST_FOREACH(const std::string& arg, params.args) + for (const std::string& arg : params.args) { argv.push_back(arg.c_str()); } @@ -961,7 +960,7 @@ void LLProcess::handle_status(int reason, int status) // only be performed if in fact we're going to produce the log message. LL_DEBUGS("LLProcess") << empty; std::string reason_str; - BOOST_FOREACH(const ReasonCode& rcp, reasons) + for (const ReasonCode& rcp : reasons) { if (reason == rcp.code) { @@ -1151,7 +1150,7 @@ std::ostream& operator<<(std::ostream& out, const LLProcess::Params& params) out << "cd " << LLStringUtil::quote(params.cwd) << ": "; } out << LLStringUtil::quote(params.executable); - BOOST_FOREACH(const std::string& arg, params.args) + for (const std::string& arg : params.args) { out << ' ' << LLStringUtil::quote(arg); } diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index ad54d1b0be..fdcc052bd0 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -478,9 +478,9 @@ namespace llsd { /***************************************************************************** -* BOOST_FOREACH() helpers for LLSD +* range-based for-loop helpers for LLSD *****************************************************************************/ -/// Usage: BOOST_FOREACH(LLSD item, inArray(someLLSDarray)) { ... } +/// Usage: for (LLSD item : inArray(someLLSDarray)) { ... } class inArray { public: @@ -503,7 +503,7 @@ private: /// MapEntry is what you get from dereferencing an LLSD::map_[const_]iterator. typedef std::map::value_type MapEntry; -/// Usage: BOOST_FOREACH([const] MapEntry& e, inMap(someLLSDmap)) { ... } +/// Usage: for([const] MapEntry& e : inMap(someLLSDmap)) { ... } class inMap { public: diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index 6b1986d0e9..5f1a89670e 100644 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -32,7 +32,6 @@ #include "lldependencies.h" #include "llexception.h" #include "llcoros.h" -#include #include #include // std::cerr in dire emergency #include @@ -411,7 +410,7 @@ void LLSingletonBase::cleanup_() void LLSingletonBase::deleteAll() { // It's essential to traverse these in dependency order. - BOOST_FOREACH(LLSingletonBase* sp, dep_sort()) + for (LLSingletonBase* sp : dep_sort()) { // Capture the class name first: in case of exception, don't count on // being able to extract it later. diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 938685bae6..f6b99b7d85 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -49,7 +49,6 @@ #include "llsdutil.h" #include #include -#include #include #include #include @@ -905,9 +904,9 @@ void LLMemoryInfo::stream(std::ostream& s) const // Max key length size_t key_width(0); - BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap)) + for (const auto& [key, value] : inMap(mStatsMap)) { - size_t len(pair.first.length()); + size_t len(key.length()); if (len > key_width) { key_width = len; @@ -915,10 +914,9 @@ void LLMemoryInfo::stream(std::ostream& s) const } // Now stream stats - BOOST_FOREACH(const MapEntry& pair, inMap(mStatsMap)) + for (const auto& [key, value] : inMap(mStatsMap)) { - s << pfx << std::setw(narrow(key_width+1)) << (pair.first + ':') << ' '; - LLSD value(pair.second); + s << pfx << std::setw(narrow(key_width+1)) << (key + ':') << ' '; if (value.isInteger()) s << std::setw(12) << value.asInteger(); else if (value.isReal()) diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index b6b297b8d7..628f046f55 100644 --- a/indra/llcommon/tests/llprocess_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -21,7 +21,6 @@ // external library headers #include "llapr.h" #include "apr_thread_proc.h" -#include #include #include #include @@ -323,7 +322,7 @@ namespace tut { /*==========================================================================*| std::string reason_str; - BOOST_FOREACH(const ReasonCode& rcp, reasons) + for (const ReasonCode& rcp : reasons) { if (reason == rcp.code) { @@ -554,7 +553,7 @@ namespace tut catch (const failure&) { std::cout << "History:\n"; - BOOST_FOREACH(const Item& item, history) + for (const Item& item : history) { std::string what(item.what); if ((! what.empty()) && what[what.length() - 1] == '\n') diff --git a/indra/llcommon/tests/llstreamqueue_test.cpp b/indra/llcommon/tests/llstreamqueue_test.cpp index 050ad5c5bf..8af057328b 100644 --- a/indra/llcommon/tests/llstreamqueue_test.cpp +++ b/indra/llcommon/tests/llstreamqueue_test.cpp @@ -15,9 +15,6 @@ #include "llstreamqueue.h" // STL headers #include -// std headers -// external library headers -#include // other Linden headers #include "../test/lltut.h" #include "stringize.h" @@ -133,7 +130,7 @@ namespace tut std::streamsize leave(5); // len("craft") above std::streamsize skip(total - leave); std::streamsize written(0); - BOOST_FOREACH(const std::string& block, blocks) + for (const std::string& block : blocks) { written += strq.write(&block[0], block.length()); ensure_equals("size() after write()", strq.size(), written); @@ -152,7 +149,7 @@ namespace tut { set_test_name("concatenate blocks"); std::string blocks[] = { "abcd", "efghij", "klmnopqrs" }; - BOOST_FOREACH(const std::string& block, blocks) + for (const std::string& block : blocks) { strq.write(&block[0], block.length()); } @@ -170,7 +167,7 @@ namespace tut { set_test_name("split blocks"); std::string blocks[] = { "abcdefghijklm", "nopqrstuvwxyz" }; - BOOST_FOREACH(const std::string& block, blocks) + for (const std::string& block : blocks) { strq.write(&block[0], block.length()); } diff --git a/indra/llcommon/tests/lltreeiterators_test.cpp b/indra/llcommon/tests/lltreeiterators_test.cpp index 1d619867d4..b9c7a70c07 100644 --- a/indra/llcommon/tests/lltreeiterators_test.cpp +++ b/indra/llcommon/tests/lltreeiterators_test.cpp @@ -38,7 +38,6 @@ // external library headers #include #include -#include // associated header #include "../lltreeiterators.h" @@ -402,7 +401,7 @@ private: * * Example: * @code - * BOOST_FOREACH(TreeNodePtr node, getRootRange(somenode)) + * for (TreeNodePtr node : getRootRange(somenode)) * { * std::cout << node->name() << '\n'; * } @@ -424,7 +423,7 @@ getRootRange(const TreeNodePtr& node) * * Example: * @code - * BOOST_FOREACH(TreeNodePtr node, getWalkRange(root)) + * for (TreeNodePtr node : getWalkRange(root)) * { * std::cout << node->name() << '\n'; * } @@ -520,7 +519,7 @@ public: * * Example usage: * @code - * BOOST_FOREACH(EnhancedTreeNodePtr node, somenode->getRootRange()) + * for (EnhancedTreeNodePtr node : somenode->getRootRange()) * { * std::cout << node->name() << '\n'; * } @@ -564,7 +563,7 @@ public: * * Example usage: * @code - * BOOST_FOREACH(EnhancedTreeNodePtr node, somenode->getWalkRange()) + * for (EnhancedTreeNodePtr node : somenode->getWalkRange()) * { * std::cout << node->name() << '\n'; * } @@ -644,7 +643,7 @@ LLLinkedIter PlainTree_child_end(PlainTree* node) * * Example: * @code - * BOOST_FOREACH(PlainTree* node, getRootRange(somenode)) + * for (PlainTree* node : getRootRange(somenode)) * { * std::cout << node->name() << '\n'; * } @@ -668,7 +667,7 @@ getRootRange(PlainTree* node) * * Example: * @code - * BOOST_FOREACH(PlainTree* node, getWalkRange(root)) + * for (PlainTree* node : getWalkRange(root)) * { * std::cout << node->name() << '\n'; * } @@ -1103,18 +1102,18 @@ namespace tut // This test function illustrates the looping techniques described in the // comments for the getRootRange() free function, the // EnhancedTreeNode::root_range template and the - // EnhancedTreeNode::getRootRange() method. Obviously the BOOST_FOREACH() + // EnhancedTreeNode::getRootRange() method. Obviously the for() // forms are more succinct. TreeNodePtr tnroot(example_tree()); TreeNodePtr tnB2b(get_B2b (tnroot, boost::bind(&TreeNode::child_begin, _1))); - std::string desc1("BOOST_FOREACH(TreeNodePr, getRootRange(tnB2b))"); + std::string desc1("for (TreeNodePr : getRootRange(tnB2b))"); // std::cout << desc1 << "\n"; // Although we've commented out the output statement, ensure that the // loop construct is still valid, as promised by the getRootRange() // documentation. - BOOST_FOREACH(TreeNodePtr node, getRootRange(tnB2b)) + for (TreeNodePtr node : getRootRange(tnB2b)) { // std::cout << node->name() << '\n'; } @@ -1137,9 +1136,9 @@ namespace tut // std::cout << (*ri)->name() << '\n'; } - std::string desc2("BOOST_FOREACH(EnhancedTreeNodePtr node, etnB2b->getRootRange())"); + std::string desc2("for (EnhancedTreeNodePtr node : etnB2b->getRootRange())"); // std::cout << desc2 << '\n'; - BOOST_FOREACH(EnhancedTreeNodePtr node, etnB2b->getRootRange()) + for (EnhancedTreeNodePtr node : etnB2b->getRootRange()) { // std::cout << node->name() << '\n'; } diff --git a/indra/llfilesystem/lldir.cpp b/indra/llfilesystem/lldir.cpp index 69b23f9cf8..41fbb97175 100644 --- a/indra/llfilesystem/lldir.cpp +++ b/indra/llfilesystem/lldir.cpp @@ -44,7 +44,6 @@ #include "stringize.h" #include "llstring.h" #include -#include #include #include #include @@ -691,10 +690,10 @@ void LLDir::walkSearchSkinDirs(const std::string& subdir, const std::string& filename, const FUNCTION& function) const { - BOOST_FOREACH(std::string skindir, mSearchSkinDirs) + for (const std::string& skindir : mSearchSkinDirs) { std::string subdir_path(add(skindir, subdir)); - BOOST_FOREACH(std::string subsubdir, subsubdirs) + for (const std::string& subsubdir : subsubdirs) { std::string full_path(add(subdir_path, subsubdir, filename)); if (fileExists(full_path)) @@ -843,7 +842,7 @@ std::vector LLDir::findSkinnedFilenames(const std::string& subdir, // current language, copy them -- in proper order -- into results. // Don't drive this by walking the map itself: it matters that we // generate results in the same order as subsubdirs. - BOOST_FOREACH(std::string subsubdir, subsubdirs) + for (const std::string& subsubdir : subsubdirs) { StringMap::const_iterator found(path_for.find(subsubdir)); if (found != path_for.end()) @@ -855,7 +854,7 @@ std::vector LLDir::findSkinnedFilenames(const std::string& subdir, LL_DEBUGS("LLDir") << empty; const char* comma = ""; - BOOST_FOREACH(std::string path, results) + for (const std::string& path : results) { LL_CONT << comma << "'" << path << "'"; comma = ", "; diff --git a/indra/llfilesystem/tests/lldir_test.cpp b/indra/llfilesystem/tests/lldir_test.cpp index 3cff622a4b..60265cade6 100644 --- a/indra/llfilesystem/tests/lldir_test.cpp +++ b/indra/llfilesystem/tests/lldir_test.cpp @@ -34,7 +34,6 @@ #include "../test/lltut.h" #include "stringize.h" -#include #include using boost::assign::list_of; @@ -109,7 +108,7 @@ struct LLDir_Dummy: public LLDir "install/skins/default/future/somefile.txt" }; - BOOST_FOREACH(const char* path, preload) + for (const char* path : preload) { buildFilesystem(path); } @@ -166,7 +165,7 @@ struct LLDir_Dummy: public LLDir LLStringUtil::getTokens(path, components, "/"); // Ensure we have an entry representing every level of this path std::string partial; - BOOST_FOREACH(std::string component, components) + for (std::string component : components) { append(partial, component); mFilesystem.insert(partial); diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp index 3e159365e5..8ef7bd837f 100644 --- a/indra/llui/llcommandmanager.cpp +++ b/indra/llui/llcommandmanager.cpp @@ -34,8 +34,6 @@ #include "llerror.h" #include "llxuiparser.h" -#include - // // LLCommandId class @@ -182,7 +180,7 @@ bool LLCommandManager::load() return false; } - BOOST_FOREACH(LLCommand::Params& commandParams, commandsParams.commands) + for (const LLCommand::Params& commandParams : commandsParams.commands) { LLCommand * command = new LLCommand(commandParams); diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 2303cd24b7..a2beda5b9e 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -59,7 +59,6 @@ #include "llmultifloater.h" #include "llsdutil.h" #include "lluiusage.h" -#include // use this to control "jumping" behavior when Ctrl-Tabbing @@ -2385,7 +2384,7 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent) //{ // floaterp->translate(translate_x, translate_y); //} - BOOST_FOREACH(LLHandle dependent_floater, floaterp->mDependents) + for (LLHandle dependent_floater : floaterp->mDependents) { if (dependent_floater.get()) { @@ -2400,10 +2399,9 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent) void LLFloaterView::restoreAll() { // make sure all subwindows aren't minimized - child_list_t child_list = *(getChildList()); - for (child_list_const_iter_t child_it = child_list.begin(); child_it != child_list.end(); ++child_it) + for (auto child : *getChildList()) { - LLFloater* floaterp = dynamic_cast(*child_it); + LLFloater* floaterp = dynamic_cast(child); if (floaterp) { floaterp->setMinimized(FALSE); diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 7e4e828a88..9ccf3b1627 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -395,8 +395,7 @@ void LLLayoutStack::updateLayout() : getRect().getHeight(); // first, assign minimum dimensions - LLLayoutPanel* panelp = NULL; - BOOST_FOREACH(panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -409,12 +408,15 @@ void LLLayoutStack::updateLayout() llassert(total_visible_fraction < 1.05f); // don't need spacing after last panel - space_to_distribute += panelp ? ll_round((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0; + { + LLLayoutPanel* panelp = mPanels.empty() ? nullptr : mPanels.back(); + space_to_distribute += panelp ? ll_round((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0; + } S32 remaining_space = space_to_distribute; if (space_to_distribute > 0 && total_visible_fraction > 0.f) { // give space proportionally to visible auto resize panels - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -427,7 +429,7 @@ void LLLayoutStack::updateLayout() } // distribute any left over pixels to non-collapsed, visible panels - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (remaining_space == 0) break; @@ -443,7 +445,7 @@ void LLLayoutStack::updateLayout() F32 cur_pos = (mOrientation == HORIZONTAL) ? 0.f : (F32)getRect().getHeight(); - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { F32 panel_dim = llmax(panelp->getExpandedMinDim(), panelp->mTargetDim); @@ -538,7 +540,7 @@ LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const { if (!panelp) return NULL; - BOOST_FOREACH(LLLayoutPanel* p, mPanels) + for (LLLayoutPanel* p : mPanels) { if (p == panelp) { @@ -552,7 +554,7 @@ LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) c { LLLayoutPanel* result = NULL; - BOOST_FOREACH(LLLayoutPanel* p, mPanels) + for (LLLayoutPanel* p : mPanels) { if (p->getName() == name) { @@ -566,7 +568,7 @@ LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) c void LLLayoutStack::createResizeBar(LLLayoutPanel* panelp) { - BOOST_FOREACH(LLLayoutPanel* lp, mPanels) + for (LLLayoutPanel* lp : mPanels) { if (lp->mResizeBar == NULL) { @@ -669,7 +671,7 @@ void LLLayoutStack::updateFractionalSizes() { F32 total_resizable_dim = 0.f; - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -677,7 +679,7 @@ void LLLayoutStack::updateFractionalSizes() } } - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -698,7 +700,7 @@ void LLLayoutStack::normalizeFractionalSizes() S32 num_auto_resize_panels = 0; F32 total_fractional_size = 0.f; - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -709,7 +711,7 @@ void LLLayoutStack::normalizeFractionalSizes() if (total_fractional_size == 0.f) { // equal distribution - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -719,7 +721,7 @@ void LLLayoutStack::normalizeFractionalSizes() } else { // renormalize - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->mAutoResize) { @@ -736,7 +738,7 @@ bool LLLayoutStack::animatePanels() // // animate visibility // - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (panelp->getVisible()) { @@ -834,7 +836,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect& LLLayoutPanel* other_resize_panel = NULL; LLLayoutPanel* following_panel = NULL; - BOOST_REVERSE_FOREACH(LLLayoutPanel* panelp, mPanels) + BOOST_REVERSE_FOREACH(LLLayoutPanel* panelp, mPanels) // Should replace this when C++20 reverse view adaptor becomes available... { if (panelp->mAutoResize) { @@ -883,7 +885,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect& AFTER_RESIZED_PANEL } which_panel = BEFORE_RESIZED_PANEL; - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { if (!panelp->getVisible() || panelp->mCollapsed) { @@ -974,6 +976,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect& MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE); } + break; default: break; } @@ -990,8 +993,8 @@ void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent) void LLLayoutStack::updateResizeBarLimits() { - LLLayoutPanel* previous_visible_panelp = NULL; - BOOST_REVERSE_FOREACH(LLLayoutPanel* visible_panelp, mPanels) + LLLayoutPanel* previous_visible_panelp{ nullptr }; + BOOST_REVERSE_FOREACH(LLLayoutPanel* visible_panelp, mPanels) // Should replace this when C++20 reverse view adaptor becomes available... { if (!visible_panelp->getVisible() || visible_panelp->mCollapsed) { diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp index 1ede5b706f..e8b6b7e43b 100644 --- a/indra/llui/llloadingindicator.cpp +++ b/indra/llui/llloadingindicator.cpp @@ -34,7 +34,6 @@ // Project includes #include "lluictrlfactory.h" #include "lluiimage.h" -#include "boost/foreach.hpp" // registered in llui.cpp to avoid being left out by MS linker //static LLDefaultChildRegistry::Register r("loading_indicator"); @@ -52,7 +51,7 @@ LLLoadingIndicator::LLLoadingIndicator(const Params& p) void LLLoadingIndicator::initFromParams(const Params& p) { - BOOST_FOREACH(LLUIImage* image, p.images().image) + for (LLUIImage* image : p.images().image) { mImages.push_back(image); } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index cebca70b59..76b50e0cdd 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -60,7 +60,6 @@ #include "v2math.h" #include #include -#include // static LLMenuHolderGL *LLMenuGL::sMenuContainer = NULL; @@ -2156,7 +2155,7 @@ void LLMenuGL::arrange( void ) } else { - BOOST_FOREACH(LLMenuItemGL* itemp, mItems) + for (LLMenuItemGL* itemp : mItems) { // do first so LLMenuGLItemCall can call on_visible to determine if visible itemp->buildDrawLabel(); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index d736aa6634..d5bfef132e 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -45,7 +45,6 @@ #include #include -#include const std::string NOTIFICATION_PERSIST_VERSION = "0.93"; @@ -444,14 +443,14 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par mSoundName = p.sound; } - BOOST_FOREACH(const LLNotificationTemplate::UniquenessContext& context, p.unique.contexts) + for (const LLNotificationTemplate::UniquenessContext& context : p.unique.contexts) { mUniqueContext.push_back(context.value); } LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL; - BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags) + for (const LLNotificationTemplate::Tag& tag : p.tags) { LL_DEBUGS("Notifications") << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL; mTags.push_back(tag.value); @@ -1153,7 +1152,7 @@ LLNotificationChannel::LLNotificationChannel(const Params& p) LLInstanceTracker(p.name.isProvided() ? p.name : LLUUID::generateNewID().asString()), mName(p.name.isProvided() ? p.name : LLUUID::generateNewID().asString()) { - BOOST_FOREACH(const std::string& source, p.sources) + for (const std::string& source : p.sources) { connectToChannel(source); } @@ -1521,7 +1520,7 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter form.ignore.text = replace; } - BOOST_FOREACH(LLNotificationForm::FormElement& element, form.form_elements.elements) + for (LLNotificationForm::FormElement& element : form.form_elements.elements) { if (element.button.isChosen() && element.button.text() == pattern) { @@ -1569,19 +1568,19 @@ bool LLNotifications::loadTemplates() mTemplates.clear(); - BOOST_FOREACH(LLNotificationTemplate::GlobalString& string, params.strings) + for (const LLNotificationTemplate::GlobalString& string : params.strings) { mGlobalStrings[string.name] = string.value; } std::map form_templates; - BOOST_FOREACH(LLNotificationTemplate::Template& notification_template, params.templates) + for (const LLNotificationTemplate::Template& notification_template : params.templates) { form_templates[notification_template.name] = notification_template.form; } - BOOST_FOREACH(LLNotificationTemplate::Params& notification, params.notifications) + for (LLNotificationTemplate::Params& notification : params.notifications) { if (notification.form_ref.form_template.isChosen()) { @@ -1635,7 +1634,7 @@ bool LLNotifications::loadVisibilityRules() mVisibilityRules.clear(); - BOOST_FOREACH(LLNotificationVisibilityRule::Rule& rule, params.rules) + for (const LLNotificationVisibilityRule::Rule& rule : params.rules) { mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(rule))); } diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp index e73ba1fbe9..02108c089c 100644 --- a/indra/llui/llnotificationslistener.cpp +++ b/indra/llui/llnotificationslistener.cpp @@ -32,7 +32,6 @@ #include "llnotificationtemplate.h" #include "llsd.h" #include "llui.h" -#include LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) : LLEventAPI("LLNotifications", diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 2707f7a15c..04772ddc73 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -27,7 +27,6 @@ #include "linden_common.h" -#include #include "lltoolbar.h" #include "llcommandmanager.h" @@ -219,7 +218,7 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p) mCenteringStack->addChild(LLUICtrlFactory::create(border_panel_p)); - BOOST_FOREACH(LLCommandId id, p.commands) + for (const LLCommandId& id : p.commands) { addCommand(id); } @@ -417,7 +416,7 @@ BOOL LLToolBar::handleRightMouseDown(S32 x, S32 y, MASK mask) // Determine which button the mouse was over during the click in case the context menu action // is intended to affect the button. mRightMouseTargetButton = NULL; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + for (LLToolBarButton* button : mButtons) { LLRect button_rect; button->localRectToOtherView(button->getLocalRect(), &button_rect, this); @@ -505,7 +504,7 @@ void LLToolBar::setButtonType(LLToolBarEnums::ButtonType button_type) void LLToolBar::resizeButtonsInRow(std::vector& buttons_in_row, S32 max_row_girth) { // make buttons in current row all same girth - BOOST_FOREACH(LLToolBarButton* button, buttons_in_row) + for (LLToolBarButton* button : buttons_in_row) { if (getOrientation(mSideType) == LLLayoutStack::HORIZONTAL) { @@ -693,7 +692,7 @@ void LLToolBar::updateLayoutAsNeeded() std::vector buttons_in_row; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + for (LLToolBarButton* button : mButtons) { button->reshape(button->mWidthRange.getMin(), button->mDesiredHeight); button->autoResize(); @@ -878,7 +877,7 @@ void LLToolBar::createButtons() { std::set set_flashing; - BOOST_FOREACH(LLToolBarButton* button, mButtons) + for (LLToolBarButton* button : mButtons) { if (button->getFlashTimer() && button->getFlashTimer()->isFlashingInProgress()) { @@ -896,7 +895,7 @@ void LLToolBar::createButtons() mButtonMap.clear(); mRightMouseTargetButton = NULL; - BOOST_FOREACH(LLCommandId& command_id, mButtonCommands) + for (const LLCommandId& command_id : mButtonCommands) { LLToolBarButton* button = createButton(command_id); mButtons.push_back(button); diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 096336045c..f43bdf1fdc 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -32,7 +32,6 @@ #include "llui.h" #include "lluicolortable.h" #include "lluictrlfactory.h" -#include LLUIColorTable::ColorParams::ColorParams() : value("value"), @@ -208,7 +207,7 @@ bool LLUIColorTable::loadFromSettings() // pass constraint=LLDir::ALL_SKINS because we want colors.xml from every // skin dir - BOOST_FOREACH(std::string colors_path, + for (const std::string& colors_path : gDirUtilp->findSkinnedFilenames(LLDir::SKINBASE, "colors.xml", LLDir::ALL_SKINS)) { result |= loadFromFilename(colors_path, mLoadedColors); diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index da7868d804..070cd4b107 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -32,7 +32,6 @@ #include #include -#include #include #include "llrender.h" @@ -592,7 +591,7 @@ void LLView::deleteAllChildren() void LLView::setAllChildrenEnabled(BOOL b) { - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { viewp->setEnabled(b); } @@ -621,7 +620,7 @@ void LLView::onVisibilityChange ( BOOL new_visibility ) { BOOL old_visibility; BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus(); - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { if (!viewp) { @@ -725,7 +724,7 @@ LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& m { if ( getVisible() && getEnabled() ) { - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { if ((viewp->*method)(c, mask, TRUE)) { @@ -744,7 +743,7 @@ LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& m template LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block) { - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { S32 local_x = x - viewp->getRect().mLeft; S32 local_y = y - viewp->getRect().mBottom; @@ -773,7 +772,7 @@ LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDA LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask) { - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { S32 local_x = x - viewp->getRect().mLeft; S32 local_y = y - viewp->getRect().mBottom; @@ -805,7 +804,7 @@ LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask, // default to not accepting drag and drop, will be overridden by handler *accept = ACCEPT_NO; - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { S32 local_x = x - viewp->getRect().mLeft; S32 local_y = y - viewp->getRect().mBottom; @@ -831,7 +830,7 @@ LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask, LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask) { - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { S32 local_x = x - viewp->getRect().mLeft; S32 local_y = y - viewp->getRect().mBottom; @@ -859,7 +858,7 @@ LLView* LLView::childFromPoint(S32 x, S32 y, bool recur) if (!getVisible()) return NULL; - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { S32 local_x = x - viewp->getRect().mLeft; S32 local_y = y - viewp->getRect().mBottom; @@ -1379,7 +1378,7 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent) mRect.mTop = getRect().mBottom + height; // move child views according to reshape flags - BOOST_FOREACH(LLView* viewp, mChildList) + for (LLView* viewp : mChildList) { if (viewp != NULL) { @@ -1451,7 +1450,7 @@ LLRect LLView::calcBoundingRect() { LLRect local_bounding_rect = LLRect::null; - BOOST_FOREACH(LLView* childp, mChildList) + for (LLView* childp : mChildList) { // ignore invisible and "top" children when calculating bounding rect // such as combobox popups @@ -1614,7 +1613,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; // Look for direct children *first* - BOOST_FOREACH(LLView* childp, mChildList) + for (LLView* childp : mChildList) { llassert(childp); if (childp->getName() == name) @@ -1625,7 +1624,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const if (recurse) { // Look inside each child as well. - BOOST_FOREACH(LLView* childp, mChildList) + for (LLView* childp : mChildList) { llassert(childp); LLView* viewp = childp->findChildView(name, recurse); @@ -2800,7 +2799,7 @@ S32 LLView::notifyParent(const LLSD& info) bool LLView::notifyChildren(const LLSD& info) { bool ret = false; - BOOST_FOREACH(LLView* childp, mChildList) + for (LLView* childp : mChildList) { ret = ret || childp->notifyChildren(info); } diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 3853aaa8fd..1b765dfb83 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -95,7 +95,6 @@ #include "llworld.h" #include "llworldmap.h" #include "stringize.h" -#include "boost/foreach.hpp" #include "llcorehttputil.h" #include "lluiusage.h" @@ -2329,7 +2328,7 @@ void LLAgent::endAnimationUpdateUI() LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance("im_container"); LLFloaterIMContainer::floater_list_t conversations; im_box->getDetachedConversationFloaters(conversations); - BOOST_FOREACH(LLFloater* conversation, conversations) + for (LLFloater* conversation : conversations) { LL_INFOS() << "skip_list.insert(session_floater): " << conversation->getTitle() << LL_ENDL; skip_list.insert(conversation); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ebf08eacd9..c84657cf7a 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -27,7 +27,6 @@ #include "llviewerprecompiledheaders.h" #include -#include #include "llaccordionctrltab.h" #include "llagent.h" #include "llagentcamera.h" @@ -1647,7 +1646,7 @@ void LLAppearanceMgr::removeOutfitPhoto(const LLUUID& outfit_id) sub_cat_array, outfit_item_array, LLInventoryModel::EXCLUDE_TRASH); - BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array) + for (LLViewerInventoryItem* outfit_item : outfit_item_array) { LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); if (linked_item != NULL) @@ -3438,7 +3437,7 @@ void update_base_outfit_after_ordering() sub_cat_array, outfit_item_array, LLInventoryModel::EXCLUDE_TRASH); - BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array) + for (LLViewerInventoryItem* outfit_item : outfit_item_array) { LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); if (linked_item != NULL) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4a43133ff6..b85ae408d4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -143,7 +143,6 @@ // Third party library includes #include -#include #include #include #include @@ -1207,7 +1206,7 @@ bool LLAppViewer::init() LLSD item(LeapCommand); LeapCommand.append(item); } - BOOST_FOREACH(const std::string& leap, llsd::inArray(LeapCommand)) + for (const std::string& leap : llsd::inArray(LeapCommand)) { LL_INFOS("InitInfo") << "processing --leap \"" << leap << '"' << LL_ENDL; // We don't have any better description of this plugin than the @@ -2357,7 +2356,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, LL_ERRS() << "Invalid settings location list" << LL_ENDL; } - BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups) + for (const SettingsGroup& group : mSettingsLocationList->groups) { // skip settings groups that aren't the one we requested if (group.name() != location_key) continue; @@ -2369,7 +2368,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, return false; } - BOOST_FOREACH(const SettingsFile& file, group.files) + for (const SettingsFile& file : group.files) { LL_INFOS("Settings") << "Attempting to load settings for the group " << file.name() << " - from location " << location_key << LL_ENDL; @@ -2433,11 +2432,11 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, std::string LLAppViewer::getSettingsFilename(const std::string& location_key, const std::string& file) { - BOOST_FOREACH(const SettingsGroup& group, mSettingsLocationList->groups) + for (const SettingsGroup& group : mSettingsLocationList->groups) { if (group.name() == location_key) { - BOOST_FOREACH(const SettingsFile& settings_file, group.files) + for (const SettingsFile& settings_file : group.files) { if (settings_file.name() == file) { @@ -3017,7 +3016,7 @@ void LLAppViewer::initStrings() // Now that we've set "[sourceid]", have to go back through // default_trans_args and reinitialize all those other keys because some // of them, in turn, reference "[sourceid]". - BOOST_FOREACH(std::string key, default_trans_args) + for (const std::string& key : default_trans_args) { std::string brackets(key), nobrackets(key); // Invalid to inspect key[0] if key is empty(). But then, the entire diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index e7ead90840..3c59ca046d 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -32,7 +32,6 @@ #include "llnotificationsutil.h" #include "lltrans.h" -#include #include "boost/lexical_cast.hpp" const S32Days CONVERSATION_LIFETIME = (S32Days)30; // lifetime of LLConversation is 30 days by spec @@ -392,7 +391,7 @@ void LLConversationLog::deleteBackupLogs() std::vector backup_logs; getListOfBackupLogs(backup_logs); - BOOST_FOREACH(const std::string& fullpath, backup_logs) + for (const std::string& fullpath : backup_logs) { LLFile::remove(fullpath); } diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 9ec4fb085b..fa5248920d 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -37,8 +37,6 @@ #include "llimview.h" //For LLIMModel #include "lltrans.h" -#include - // // Conversation items : common behaviors // @@ -293,8 +291,7 @@ void LLConversationItemSession::updateName(LLConversationItemParticipant* partic // In the case of a P2P conversation, we need to grab the name of the other participant in the session instance itself // as we do not create participants for such a session. - LLFolderViewModelItem * itemp; - BOOST_FOREACH(itemp, mChildren) + for (auto itemp : mChildren) { LLConversationItem* current_participant = dynamic_cast(itemp); // Add the avatar uuid to the list (except if it's the own agent uuid) diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp index b66eb754a4..b0d88159c1 100644 --- a/indra/newview/llexternaleditor.cpp +++ b/indra/newview/llexternaleditor.cpp @@ -32,7 +32,6 @@ #include "llprocess.h" #include "llsdutil.h" #include "llstring.h" -#include // static const std::string LLExternalEditor::sFilenameMarker = "%s"; @@ -93,7 +92,7 @@ LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path) params.executable = mProcessParams.executable; // Substitute the filename marker in the command with the actual passed file name. - BOOST_FOREACH(const std::string& arg, mProcessParams.args) + for (const std::string& arg : mProcessParams.args) { std::string fixed(arg); LLStringUtil::replaceString(fixed, sFilenameMarker, file_path); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index f997dc9910..92c54d2ffe 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -57,7 +57,6 @@ #include "llsdserialize.h" #include "llviewermenu.h" // is_agent_mappable #include "llviewerobjectlist.h" -#include "boost/foreach.hpp" const S32 EVENTS_PER_IDLE_LOOP_CURRENT_SESSION = 80; @@ -808,9 +807,9 @@ void LLFloaterIMContainer::getDetachedConversationFloaters(floater_list_t& float typedef conversations_widgets_map::value_type conv_pair; LLFloaterIMNearbyChat *nearby_chat = LLFloaterReg::findTypedInstance("nearby_chat"); - BOOST_FOREACH(conv_pair item, mConversationsWidgets) + for (const auto& [key, fvi] : mConversationsWidgets) { - LLConversationViewSession* widget = dynamic_cast(item.second); + LLConversationViewSession* widget = dynamic_cast(fvi); if (widget) { LLFloater* session_floater = widget->getSessionFloater(); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 6ac8bbee76..eb979335f8 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -91,8 +91,6 @@ #include "llvoavatarself.h" #include "llwearablelist.h" -#include - BOOL LLInventoryState::sWearNewClothing = FALSE; LLUUID LLInventoryState::sWearNewClothingTransactionID; std::list LLInventoryAction::sMarketplaceFolders; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index ca88f90ea9..55a947a09d 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -42,7 +42,6 @@ #include #include #include -#include #if LL_MSVC #pragma warning(push) @@ -709,7 +708,7 @@ bool LLLogChat::moveTranscripts(const std::string originDirectory, std::string backupFileName; unsigned backupFileCount; - BOOST_FOREACH(const std::string& fullpath, listOfFilesToMove) + for (const std::string& fullpath : listOfFilesToMove) { backupFileCount = 0; newFullPath = targetDirectory + fullpath.substr(originDirectory.length(), std::string::npos); @@ -780,7 +779,7 @@ void LLLogChat::deleteTranscripts() getListOfTranscriptFiles(list_of_transcriptions); getListOfTranscriptBackupFiles(list_of_transcriptions); - BOOST_FOREACH(const std::string& fullpath, list_of_transcriptions) + for (const std::string& fullpath : list_of_transcriptions) { S32 retry_count = 0; while (retry_count < 5) diff --git a/indra/newview/llmarketplacenotifications.cpp b/indra/newview/llmarketplacenotifications.cpp index 0886f9a990..02bd9e1f34 100644 --- a/indra/newview/llmarketplacenotifications.cpp +++ b/indra/newview/llmarketplacenotifications.cpp @@ -33,7 +33,6 @@ #include "llerror.h" -#include #include @@ -54,7 +53,7 @@ namespace LLMarketplaceInventoryNotifications llassert(!no_copy_payloads.empty()); llassert(no_copy_cb_action != NULL); - BOOST_FOREACH(const LLSD& payload, no_copy_payloads) + for (const LLSD& payload : no_copy_payloads) { (*no_copy_cb_action)(payload); } diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index b06131cf38..3f6a86106a 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -34,9 +34,6 @@ #include "llfloaterimnearbychathandler.h" #include "llnotifications.h" -#include -#include - using namespace LLNotificationsUI; //-------------------------------------------------------------------------- @@ -53,15 +50,15 @@ LLNotificationManager::~LLNotificationManager() //-------------------------------------------------------------------------- void LLNotificationManager::init() { - mChannels.push_back(new LLScriptHandler()); - mChannels.push_back(new LLTipHandler()); - mChannels.push_back(new LLGroupHandler()); - mChannels.push_back(new LLAlertHandler("Alerts", "alert", false)); - mChannels.push_back(new LLAlertHandler("AlertModal", "alertmodal", true)); - mChannels.push_back(new LLOfferHandler()); - mChannels.push_back(new LLHintHandler()); - mChannels.push_back(new LLBrowserNotification()); - mChannels.push_back(new LLIMHandler()); + mChannels.emplace_back(new LLScriptHandler()); + mChannels.emplace_back(new LLTipHandler()); + mChannels.emplace_back(new LLGroupHandler()); + mChannels.emplace_back(new LLAlertHandler("Alerts", "alert", false)); + mChannels.emplace_back(new LLAlertHandler("AlertModal", "alertmodal", true)); + mChannels.emplace_back(new LLOfferHandler()); + mChannels.emplace_back(new LLHintHandler()); + mChannels.emplace_back(new LLBrowserNotification()); + mChannels.emplace_back(new LLIMHandler()); mChatHandler = std::shared_ptr(new LLFloaterIMNearbyChatHandler()); } diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index de988555c5..432f18139c 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -28,8 +28,6 @@ #include "llviewerprecompiledheaders.h" // must be first include #include "lloutfitgallery.h" -#include - // llcommon #include "llcommonutils.h" #include "llfilesystem.h" @@ -1253,7 +1251,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id) sub_cat_array, outfit_item_array, LLInventoryModel::EXCLUDE_TRASH); - BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array) + for (LLViewerInventoryItem* outfit_item : outfit_item_array) { LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem(); LLUUID asset_id, inv_id; diff --git a/indra/newview/llpanelexperiencelisteditor.cpp b/indra/newview/llpanelexperiencelisteditor.cpp index 0fdb9a57f3..854a32621a 100644 --- a/indra/newview/llpanelexperiencelisteditor.cpp +++ b/indra/newview/llpanelexperiencelisteditor.cpp @@ -40,7 +40,6 @@ #include "lltextbox.h" #include "lltrans.h" #include "llsdutil.h" -#include static LLPanelInjector t_panel_experience_list_editor("panel_experience_list_editor"); @@ -96,7 +95,7 @@ void LLPanelExperienceListEditor::addExperienceIds( const uuid_vec_t& experience void LLPanelExperienceListEditor::setExperienceIds( const LLSD& experience_ids ) { mExperienceIds.clear(); - BOOST_FOREACH(LLSD uuid, llsd::inArray(experience_ids)) + for (LLSD uuid : llsd::inArray(experience_ids)) { // Using insert(range) doesn't work here because the conversion from // LLSD to LLUUID is ambiguous: have to specify asUUID() for each entry. diff --git a/indra/newview/llpanelgroupbulkban.cpp b/indra/newview/llpanelgroupbulkban.cpp index cf1f0bc32f..2b6bf1bcd6 100644 --- a/indra/newview/llpanelgroupbulkban.cpp +++ b/indra/newview/llpanelgroupbulkban.cpp @@ -49,8 +49,6 @@ #include "lluictrlfactory.h" #include "llviewerwindow.h" -#include - LLPanelGroupBulkBan::LLPanelGroupBulkBan(const LLUUID& group_id) : LLPanelGroupBulk(group_id) { // Pass on construction of this panel to the control factory. @@ -163,8 +161,8 @@ void LLPanelGroupBulkBan::submit() // remove already banned users and yourself from request. std::vector banned_avatar_names; std::vector out_of_limit_names; - bool banning_self = FALSE; - std::vector::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), gAgent.getID()); + bool banning_self{ false }; + std::vector::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), gAgentID); if (conflict != banned_agent_list.end()) { banned_agent_list.erase(conflict); @@ -172,18 +170,17 @@ void LLPanelGroupBulkBan::submit() } if (group_datap) { - BOOST_FOREACH(const LLGroupMgrGroupData::ban_list_t::value_type& group_ban_pair, group_datap->mBanList) + for (const auto& [group_ban_agent_id, group_ban_data] : group_datap->mBanList) { - const LLUUID& group_ban_agent_id = group_ban_pair.first; std::vector::iterator conflict = std::find(banned_agent_list.begin(), banned_agent_list.end(), group_ban_agent_id); if (conflict != banned_agent_list.end()) { LLAvatarName av_name; LLAvatarNameCache::get(group_ban_agent_id, &av_name); - banned_avatar_names.push_back(av_name); + banned_avatar_names.emplace_back(av_name); banned_agent_list.erase(conflict); - if (banned_agent_list.size() == 0) + if (banned_agent_list.empty()) { break; } diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index f6628293ee..9157d20f98 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -46,8 +46,6 @@ #include "llviewercontrol.h" // HACK for destinations guide on startup #include "llinventorymodel.h" // HACK to disable starter avatars button for NUX -#include - LLToolBarView* gToolBarView = NULL; static LLDefaultChildRegistry::Register r("toolbar_view"); @@ -282,7 +280,7 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands) + for (const LLCommandId::Params& command_params : toolbar_set.left_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT])) { @@ -297,7 +295,7 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands) + for (const LLCommandId::Params& command_params : toolbar_set.right_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])) { @@ -312,7 +310,7 @@ bool LLToolBarView::loadToolbars(bool force_default) LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setButtonType(button_type); } - BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands) + for (const LLCommandId::Params& command_params : toolbar_set.bottom_toolbar.commands) { if (!addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ada898b98c..1dbb58a910 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -119,8 +119,6 @@ #include "llviewerregion.h" #include "llfloaterregionrestarting.h" -#include - #include "llnotificationmanager.h" // #include "llexperiencecache.h" @@ -5620,7 +5618,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp BOOL caution = FALSE; S32 count = 0; std::string perms; - BOOST_FOREACH(script_perm_t script_perm, SCRIPT_PERMISSIONS) + for (const script_perm_t& script_perm : SCRIPT_PERMISSIONS) { if ((orig_questions & script_perm.permbit) && script_perm.caution) @@ -5864,7 +5862,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data) S32 known_questions = 0; bool has_not_only_debit = questions ^ SCRIPT_PERMISSIONS[SCRIPT_PERMISSION_DEBIT].permbit; // check the received permission flags against each permission - BOOST_FOREACH(script_perm_t script_perm, SCRIPT_PERMISSIONS) + for (const script_perm_t& script_perm : SCRIPT_PERMISSIONS) { if (questions & script_perm.permbit) { -- cgit v1.2.3 From b3bb13b00647a2bb06b2657bd1f6110de3f5f039 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 9 Jan 2024 09:42:42 +0100 Subject: Simplify expression --- indra/llui/lllayoutstack.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 9ccf3b1627..2769a96875 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -408,9 +408,9 @@ void LLLayoutStack::updateLayout() llassert(total_visible_fraction < 1.05f); // don't need spacing after last panel + if (!mPanels.empty()) { - LLLayoutPanel* panelp = mPanels.empty() ? nullptr : mPanels.back(); - space_to_distribute += panelp ? ll_round((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0; + space_to_distribute += ll_round(F32(mPanelSpacing) * mPanels.back()->getVisibleAmount()); } S32 remaining_space = space_to_distribute; -- cgit v1.2.3 From 5b2d5a68542833fc2d89cc2917a378d63853975a Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 9 Jan 2024 21:02:18 +0200 Subject: DRTVWR-599 OSX buildfix --- indra/llui/lltoolbar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 04772ddc73..204b8b9984 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -218,7 +218,7 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p) mCenteringStack->addChild(LLUICtrlFactory::create(border_panel_p)); - for (const LLCommandId& id : p.commands) + for (const auto& id : p.commands) { addCommand(id); } -- cgit v1.2.3 From ffe0948b4a28abb1def26dabd32b292d413e55d1 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 9 Jan 2024 21:19:07 +0200 Subject: DRTVWR-599 OSX buildfix #2 remove unused typedef --- indra/newview/llfloaterimcontainer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 92c54d2ffe..8f12abe7a5 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -804,7 +804,6 @@ void LLFloaterIMContainer::setVisible(BOOL visible) void LLFloaterIMContainer::getDetachedConversationFloaters(floater_list_t& floaters) { - typedef conversations_widgets_map::value_type conv_pair; LLFloaterIMNearbyChat *nearby_chat = LLFloaterReg::findTypedInstance("nearby_chat"); for (const auto& [key, fvi] : mConversationsWidgets) -- cgit v1.2.3 From 284a3cbee95a001c9f7f897a7dd6f81a4b974bd1 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 9 Jan 2024 21:54:22 +0200 Subject: DRTVWR-599 OSX buildfix #3 --- indra/newview/llappviewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b85ae408d4..2599b1e4a0 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1206,7 +1206,7 @@ bool LLAppViewer::init() LLSD item(LeapCommand); LeapCommand.append(item); } - for (const std::string& leap : llsd::inArray(LeapCommand)) + for (const auto& leap : llsd::inArray(LeapCommand)) { LL_INFOS("InitInfo") << "processing --leap \"" << leap << '"' << LL_ENDL; // We don't have any better description of this plugin than the -- cgit v1.2.3 From 983a3c7207bcb233fb5a1cfdfbed8b9a3f992a73 Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Tue, 9 Jan 2024 15:52:33 -0600 Subject: SL-20780 Clean up some dead code. --- indra/newview/llgltfmateriallist.cpp | 171 +---------------------------------- indra/newview/llgltfmateriallist.h | 4 - indra/newview/llstartup.cpp | 3 - indra/newview/llviewerobject.cpp | 5 - indra/newview/llviewerregion.cpp | 11 --- indra/newview/llviewerregion.h | 2 - 6 files changed, 2 insertions(+), 194 deletions(-) diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 8919229c78..92c58a2dbc 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -139,69 +139,18 @@ static bool is_valid_update(const LLSD& data) } #endif -class LLGLTFMaterialOverrideDispatchHandler : public LLDispatchHandler +class LLGLTFMaterialOverrideDispatchHandler { LOG_CLASS(LLGLTFMaterialOverrideDispatchHandler); public: LLGLTFMaterialOverrideDispatchHandler() = default; - ~LLGLTFMaterialOverrideDispatchHandler() override = default; + ~LLGLTFMaterialOverrideDispatchHandler() = default; void addCallback(void(*callback)(const LLUUID& object_id, S32 side)) { mSelectionCallbacks.push_back(callback); } - bool operator()(const LLDispatcher* dispatcher, const std::string& key, const LLUUID& invoice, const sparam_t& strings) override - { - LL_PROFILE_ZONE_SCOPED; - // receive override data from simulator via LargeGenericMessage - // message should have: - // object_id - UUID of LLViewerObject - // sides - array of S32 indices of texture entries - // gltf_json - array of corresponding Strings of GLTF json for override data - - LLSD message; - bool success = true; -#if 0 //deprecated - for(const std::string& llsdRaw : strings) - { - std::istringstream llsdData(llsdRaw); - if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length())) - { - LL_WARNS() << "LLGLTFMaterialOverrideDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL; - success = false; - continue; - } - - LLGLTFOverrideCacheEntry object_override; - if (!object_override.fromLLSD(message)) - { - // malformed message, nothing we can do to handle it - LL_DEBUGS("GLTF") << "Message without id:" << message << LL_ENDL; - success = false; - continue; - } - - // Cache the data - { - LLViewerRegion * region = LLWorld::instance().getRegionFromHandle(object_override.mRegionHandle); - - if (region) - { - region->cacheFullUpdateGLTFOverride(object_override); - } - else - { - LL_WARNS("GLTF") << "could not access region for material overrides message cache, region_handle: " << LL_ENDL; - } - } - applyData(object_override); - } - -#endif - return success; - } - void doSelectionCallbacks(const LLUUID& object_id, S32 side) { for (auto& callback : mSelectionCallbacks) @@ -210,112 +159,6 @@ public: } } - void applyData(const LLGLTFOverrideCacheEntry &object_override) - { - // Parse the data - -#if 0 // DEPRECATED - LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop"); - LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General"); - - struct ReturnData - { - public: - LLGLTFMaterial mMaterial; - S32 mSide; - bool mSuccess; - }; - - if (!object_override.mSides.empty()) - { - // fromJson() is performance heavy offload to a thread. - main_queue->postTo( - general_queue, - [sides=object_override.mSides]() // Work done on general queue - { - std::vector results; - - results.reserve(sides.size()); - // parse json - std::unordered_map::const_iterator iter = sides.begin(); - std::unordered_map::const_iterator end = sides.end(); - while (iter != end) - { - ReturnData result; - - result.mMaterial.applyOverrideLLSD(iter->second); - - result.mSuccess = true; - result.mSide = iter->first; - - results.push_back(result); - iter++; - } - return results; - }, - [object_id=object_override.mObjectId, this](std::vector results) // Callback to main thread - { - LLViewerObject * obj = gObjectList.findObject(object_id); - - if (results.size() > 0 ) - { - std::unordered_set side_set; - - for (auto const & result : results) - { - S32 side = result.mSide; - if (result.mSuccess) - { - // copy to heap here because LLTextureEntry is going to take ownership with an LLPointer - LLGLTFMaterial * material = new LLGLTFMaterial(result.mMaterial); - - // flag this side to not be nulled out later - side_set.insert(side); - - if (obj) - { - obj->setTEGLTFMaterialOverride(side, material); - } - } - - // unblock material editor - if (obj && obj->getTE(side) && obj->getTE(side)->isSelected()) - { - doSelectionCallbacks(object_id, side); - } - } - - if (obj && side_set.size() != obj->getNumTEs()) - { // object exists and at least one texture entry needs to have its override data nulled out - for (int i = 0; i < obj->getNumTEs(); ++i) - { - if (side_set.find(i) == side_set.end()) - { - obj->setTEGLTFMaterialOverride(i, nullptr); - if (obj->getTE(i) && obj->getTE(i)->isSelected()) - { - doSelectionCallbacks(object_id, i); - } - } - } - } - } - else if (obj) - { // override list was empty or an error occurred, null out all overrides for this object - for (int i = 0; i < obj->getNumTEs(); ++i) - { - obj->setTEGLTFMaterialOverride(i, nullptr); - if (obj->getTE(i) && obj->getTE(i)->isSelected()) - { - doSelectionCallbacks(obj->getID(), i); - } - } - } - }); - } -#endif - } - private: std::vector mSelectionCallbacks; @@ -821,12 +664,6 @@ void LLGLTFMaterialList::flushMaterials() } } -// static -void LLGLTFMaterialList::registerCallbacks() -{ - gGenericDispatcher.addHandler("GLTFMaterialOverride", &handle_gltf_override_message); -} - // static void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, void(*done_callback)(bool) ) { @@ -864,7 +701,3 @@ void LLGLTFMaterialList::modifyMaterialCoro(std::string cap_url, LLSD overrides, } } -void LLGLTFMaterialList::loadCacheOverrides(const LLGLTFOverrideCacheEntry& override) -{ - handle_gltf_override_message.applyData(override); -} diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h index 7317214019..f1c4ce20f9 100644 --- a/indra/newview/llgltfmateriallist.h +++ b/indra/newview/llgltfmateriallist.h @@ -52,8 +52,6 @@ public: void flushMaterials(); - static void registerCallbacks(); - // Queue an modification of a material that we want to send to the simulator. Call "flushUpdates" to flush pending updates. // id - ID of object to modify // side - TexureEntry index to modify, or -1 for all sides @@ -99,8 +97,6 @@ public: // any override data that arrived before the object was ready to receive it void applyQueuedOverrides(LLViewerObject* obj); - static void loadCacheOverrides(const LLGLTFOverrideCacheEntry& override); - // Apply an override update with the given data void applyOverrideMessage(LLMessageSystem* msg, const std::string& data); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d0b76848f7..8681bf6e2a 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1511,9 +1511,6 @@ bool idle_startup() gXferManager->registerCallbacks(gMessageSystem); display_startup(); - LLGLTFMaterialList::registerCallbacks(); - display_startup(); - LLStartUp::initNameCache(); display_startup(); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d4346ee2d9..a741f57753 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5041,11 +5041,6 @@ void LLViewerObject::updateTEMaterialTextures(U8 te) LLViewerObject* obj = gObjectList.findObject(id); if (obj) { - LLViewerRegion* region = obj->getRegion(); - if(region) - { - region->loadCacheMiscExtras(obj->getLocalID()); - } obj->markForUpdate(); } }); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 452dcdd8fd..60862ae5bd 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1879,8 +1879,6 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry) addActiveCacheEntry(entry); } - loadCacheMiscExtras(entry->getLocalID()); - return obj; } @@ -3655,15 +3653,6 @@ std::string LLViewerRegion::getSimHostName() return std::string("..."); } -void LLViewerRegion::loadCacheMiscExtras(U32 local_id) -{ - auto iter = mImpl->mGLTFOverridesLLSD.find(local_id); - if (iter != mImpl->mGLTFOverridesLLSD.end()) - { - LLGLTFMaterialList::loadCacheOverrides(iter->second); - } -} - void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index a409d837a4..622490c881 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -435,8 +435,6 @@ private: bool isNonCacheableObjectCreated(U32 local_id); public: - void loadCacheMiscExtras(U32 local_id); - void applyCacheMiscExtras(LLViewerObject* obj); struct CompareDistance -- cgit v1.2.3 From 390a5031dcdbc6bf191f49a105021c8a707a9949 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 10 Jan 2024 01:43:36 +0200 Subject: SL-19555 Fix picker failing to highlight default material in inventory --- indra/newview/llfloaterchangeitemthumbnail.cpp | 3 +- indra/newview/llinventoryfunctions.cpp | 6 ++ indra/newview/llinventoryfunctions.h | 22 +++++ indra/newview/llpanelface.cpp | 2 +- indra/newview/llpanelprofile.cpp | 6 +- indra/newview/lltexturectrl.cpp | 123 +++++++++++++++---------- indra/newview/lltexturectrl.h | 24 ++--- 7 files changed, 119 insertions(+), 67 deletions(-) diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp index 0301627c15..776f8dc785 100644 --- a/indra/newview/llfloaterchangeitemthumbnail.cpp +++ b/indra/newview/llfloaterchangeitemthumbnail.cpp @@ -751,7 +751,8 @@ void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id) PERM_NONE, PERM_NONE, FALSE, - NULL); + NULL, + PICK_TEXTURE); mPickerHandle = floaterp->getHandle(); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 4aeacae6ed..207dd692a8 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2554,6 +2554,12 @@ bool LLIsOfAssetType::operator()(LLInventoryCategory* cat, LLInventoryItem* item return FALSE; } +bool LLAssetIDAndTypeMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item) +{ + if (!item) return false; + return (item->getActualType() == mType && item->getAssetUUID() == mAssetID); +} + bool LLIsValidItemLink::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { LLViewerInventoryItem *vitem = dynamic_cast(item); diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index 925217dda3..2056a7f6a3 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -278,6 +278,28 @@ protected: LLAssetType::EType mType; }; +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLAssetIDAndTypeMatches +// +// Implementation of a LLInventoryCollectFunctor which returns TRUE if +// the item matches both asset type and asset id. +// This is needed in case you are looking for a specific type with default id +// (since null is default for multiple asset types) +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +class LLAssetIDAndTypeMatches: public LLInventoryCollectFunctor +{ +public: + LLAssetIDAndTypeMatches(const LLUUID& asset_id, LLAssetType::EType type): mAssetID(asset_id), mType(type) {} + virtual ~LLAssetIDAndTypeMatches() {} + bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); + +protected: + LLUUID mAssetID; + LLAssetType::EType mType; +}; + class LLIsValidItemLink : public LLInventoryCollectFunctor { public: diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 033c396d08..269ae23eb8 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -330,7 +330,7 @@ BOOL LLPanelFace::postBuild() pbr_ctrl->setImmediateFilterPermMask(PERM_NONE); pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER); pbr_ctrl->setBakeTextureEnabled(false); - pbr_ctrl->setInventoryPickType(LLTextureCtrl::PICK_MATERIAL); + pbr_ctrl->setInventoryPickType(PICK_MATERIAL); } mTextureCtrl = getChild("texture control"); diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index ffbed778c1..8114e05a94 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -1969,7 +1969,8 @@ void LLPanelProfileSecondLife::onShowTexturePicker() PERM_NONE, PERM_NONE, FALSE, - NULL); + NULL, + PICK_TEXTURE); mFloaterTexturePickerHandle = texture_floaterp->getHandle(); @@ -2304,7 +2305,8 @@ void LLPanelProfileFirstLife::onChangePhoto() PERM_NONE, PERM_NONE, FALSE, - NULL); + NULL, + PICK_TEXTURE); mFloaterTexturePickerHandle = texture_floaterp->getHandle(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 28e01c6c21..233b864fba 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -151,7 +151,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( PermissionMask immediate_filter_perm_mask, PermissionMask dnd_filter_perm_mask, BOOL can_apply_immediately, - LLUIImagePtr fallback_image) + LLUIImagePtr fallback_image, + EPickInventoryType pick_type) : LLFloater(LLSD()), mOwner( owner ), mImageAssetID( image_asset_id ), @@ -181,7 +182,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mSetImageAssetIDCallback(NULL), mOnUpdateImageStatsCallback(NULL), mBakeTextureEnabled(FALSE), - mInventoryPickType(LLTextureCtrl::PICK_TEXTURE) + mInventoryPickType(pick_type) { mCanApplyImmediately = can_apply_immediately; buildFromFile("floater_texture_ctrl.xml"); @@ -225,7 +226,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID()); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL + if (mInventoryPickType == PICK_MATERIAL && mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID && itemp && itemp->getAssetUUID().isNull()) { @@ -266,7 +267,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection) { LLUUID asset_id = itemp->getAssetUUID(); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull()) + if (mInventoryPickType == PICK_MATERIAL && asset_id.isNull()) { // If an inventory item has a null asset, consider it a valid blank material(gltf) asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID; @@ -425,11 +426,11 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop( bool is_material = cargo_type == DAD_MATERIAL; bool allow_dnd = false; - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { allow_dnd = is_material; } - else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (mInventoryPickType == PICK_TEXTURE) { allow_dnd = is_texture || is_mesh; } @@ -602,9 +603,7 @@ BOOL LLFloaterTexturePicker::postBuild() // don't put keyboard focus on selected item, because the selection callback // will assume that this was user input - - - if(!mImageAssetID.isNull()) + if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL) { mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO); } @@ -661,7 +660,7 @@ void LLFloaterTexturePicker::draw() mGLTFMaterial = NULL; if (mImageAssetID.notNull()) { - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { mGLTFMaterial = (LLFetchedGLTFMaterial*) gGLTFMaterialList.getMaterial(mImageAssetID); llassert(mGLTFMaterial == nullptr || dynamic_cast(gGLTFMaterialList.getMaterial(mImageAssetID)) != nullptr); @@ -786,27 +785,43 @@ void LLFloaterTexturePicker::draw() const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library) { - LLUUID loockup_id = asset_id; - if (loockup_id.isNull()) + if (asset_id.isNull()) { - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) - { - loockup_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID; - } - else - { - return LLUUID::null; - } + // null asset id means, no material or texture assigned + return LLUUID::null; } + LLUUID loockup_id = asset_id; + if (mInventoryPickType == PICK_MATERIAL && loockup_id == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID) + { + // default asset id means we are looking for an inventory item with a default asset UUID (null) + loockup_id = LLUUID::null; + } + LLViewerInventoryCategory::cat_array_t cats; LLViewerInventoryItem::item_array_t items; - LLAssetIDMatches asset_id_matches(loockup_id); - gInventory.collectDescendentsIf(LLUUID::null, - cats, - items, - LLInventoryModel::INCLUDE_TRASH, - asset_id_matches); + + if (loockup_id.isNull()) + { + // looking for a material with a null id, null id is shared by a lot + // of objects as a default value, so have to filter by type as well + LLAssetIDAndTypeMatches matches(loockup_id, LLAssetType::AT_MATERIAL); + gInventory.collectDescendentsIf(LLUUID::null, + cats, + items, + LLInventoryModel::INCLUDE_TRASH, + matches); + } + else + { + LLAssetIDMatches asset_id_matches(loockup_id); + gInventory.collectDescendentsIf(LLUUID::null, + cats, + items, + LLInventoryModel::INCLUDE_TRASH, + asset_id_matches); + } + if (items.size()) { @@ -871,7 +886,7 @@ void LLFloaterTexturePicker::commitCallback(LLTextureCtrl::ETexturePickOp op) LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID()); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL + if (mInventoryPickType == PICK_MATERIAL && mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID && itemp && itemp->getAssetUUID().isNull()) { @@ -1064,15 +1079,15 @@ void LLFloaterTexturePicker::onBtnAdd(void* userdata) { LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata; - if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL) + if (self->mInventoryPickType == PICK_TEXTURE_MATERIAL) { LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL_TEXTURE, true); } - else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (self->mInventoryPickType == PICK_TEXTURE) { LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_IMAGE, true); } - else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + else if (self->mInventoryPickType == PICK_MATERIAL) { LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL, true); } @@ -1351,7 +1366,7 @@ void LLFloaterTexturePicker::changeMode() getChild("hide_base_mesh_region")->setVisible(FALSE);// index == 2 ? TRUE : FALSE); bool pipette_visible = (index == PICKER_INVENTORY) - && (mInventoryPickType != LLTextureCtrl::PICK_MATERIAL); + && (mInventoryPickType != PICK_MATERIAL); mPipetteBtn->setVisible(pipette_visible); if (index == PICKER_BAKE) @@ -1414,16 +1429,16 @@ void LLFloaterTexturePicker::refreshLocalList() { mLocalScrollCtrl->clearRows(); - if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL) + if (mInventoryPickType == PICK_TEXTURE_MATERIAL) { LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl); LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl); } - else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (mInventoryPickType == PICK_TEXTURE) { LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl); } - else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + else if (mInventoryPickType == PICK_MATERIAL) { LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl); } @@ -1433,18 +1448,18 @@ void LLFloaterTexturePicker::refreshInventoryFilter() { U32 filter_types = 0x0; - if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL) + if (mInventoryPickType == PICK_TEXTURE_MATERIAL) { filter_types |= 0x1 << LLInventoryType::IT_TEXTURE; filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT; filter_types |= 0x1 << LLInventoryType::IT_MATERIAL; } - else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (mInventoryPickType == PICK_TEXTURE) { filter_types |= 0x1 << LLInventoryType::IT_TEXTURE; filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT; } - else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + else if (mInventoryPickType == PICK_MATERIAL) { filter_types |= 0x1 << LLInventoryType::IT_MATERIAL; } @@ -1479,13 +1494,13 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) onModeSelect(0, this); } -void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryType type) +void LLFloaterTexturePicker::setInventoryPickType(EPickInventoryType type) { mInventoryPickType = type; refreshLocalList(); refreshInventoryFilter(); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { getChild("Pipette")->setVisible(false); } @@ -1501,7 +1516,7 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT setTitle(pick + mLabel); } - else if(mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + else if(mInventoryPickType == PICK_MATERIAL) { setTitle(getString("pick_material")); } @@ -1509,6 +1524,12 @@ void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryT { setTitle(getString("pick_texture")); } + + // refresh selection + if (!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL) + { + mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO); + } } void LLFloaterTexturePicker::setImmediateFilterPermMask(PermissionMask mask) @@ -1543,16 +1564,16 @@ void LLFloaterTexturePicker::onPickerCallback(const std::vector& fi LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)handle.get(); self->mLocalScrollCtrl->clearRows(); - if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL) + if (self->mInventoryPickType == PICK_TEXTURE_MATERIAL) { LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl); LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl); } - else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (self->mInventoryPickType == PICK_TEXTURE) { LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl); } - else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + else if (self->mInventoryPickType == PICK_MATERIAL) { LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl); } @@ -1565,7 +1586,7 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te ) if (inventory_item_id.notNull()) { LLToolPipette::getInstance()->setResult(TRUE, ""); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { // tes have no data about material ids // Plus gltf materials are layered with overrides, @@ -1807,7 +1828,8 @@ void LLTextureCtrl::showPicker(BOOL take_focus) mImmediateFilterPermMask, mDnDFilterPermMask, mCanApplyImmediately, - mFallbackImage); + mFallbackImage, + mInventoryPickType); mFloaterHandle = floaterp->getHandle(); LLFloaterTexturePicker* texture_floaterp = dynamic_cast(floaterp); @@ -1828,7 +1850,6 @@ void LLTextureCtrl::showPicker(BOOL take_focus) texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1)); texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled); - texture_floaterp->setInventoryPickType(mInventoryPickType); } LLFloater* root_floater = gFloaterView->getParentFloater(this); @@ -1891,7 +1912,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask) if (!mOpenTexPreview) { showPicker(FALSE); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { //grab materials first... LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL)); @@ -2089,11 +2110,11 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, bool is_material = cargo_type == DAD_MATERIAL; bool allow_dnd = false; - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { allow_dnd = is_material; } - else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE) + else if (mInventoryPickType == PICK_TEXTURE) { allow_dnd = is_texture || is_mesh; } @@ -2156,7 +2177,7 @@ void LLTextureCtrl::draw() if (texture.isNull()) { - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL) + if (mInventoryPickType == PICK_MATERIAL) { LLPointer material = gGLTFMaterialList.getMaterial(mImageAssetID); if (material) @@ -2313,7 +2334,7 @@ BOOL LLTextureCtrl::doDrop(LLInventoryItem* item) // no callback installed, so just set the image ids and carry on. LLUUID asset_id = item->getAssetUUID(); - if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull()) + if (mInventoryPickType == PICK_MATERIAL && asset_id.isNull()) { // If an inventory material has a null asset, consider it a valid blank material(gltf) asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID; diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 7a96eea60d..cb6ce636e0 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -72,6 +72,13 @@ enum LLPickerSource PICKER_UNKNOWN, // on cancel, default ids }; +typedef enum e_pick_inventory_type +{ + PICK_TEXTURE_MATERIAL = 0, + PICK_TEXTURE = 1, + PICK_MATERIAL = 2, +} EPickInventoryType; + ////////////////////////////////////////////////////////////////////////////////////////// // LLTextureCtrl @@ -87,13 +94,6 @@ public: TEXTURE_CANCEL } ETexturePickOp; - typedef enum e_pick_inventory_type - { - PICK_TEXTURE_MATERIAL = 0, - PICK_TEXTURE = 1, - PICK_MATERIAL = 2, - } EPickInventoryType; - public: struct Params : public LLInitParam::Block { @@ -276,7 +276,7 @@ private: S32 mLabelWidth; bool mOpenTexPreview; bool mBakeTextureEnabled; - LLTextureCtrl::EPickInventoryType mInventoryPickType; + EPickInventoryType mInventoryPickType; }; ////////////////////////////////////////////////////////////////////////////////////////// @@ -300,8 +300,8 @@ public: PermissionMask immediate_filter_perm_mask, PermissionMask dnd_filter_perm_mask, BOOL can_apply_immediately, - LLUIImagePtr fallback_image_name - ); + LLUIImagePtr fallback_image_name, + EPickInventoryType pick_type); virtual ~LLFloaterTexturePicker(); @@ -369,7 +369,7 @@ public: void setLocalTextureEnabled(BOOL enabled); void setBakeTextureEnabled(BOOL enabled); - void setInventoryPickType(LLTextureCtrl::EPickInventoryType type); + void setInventoryPickType(EPickInventoryType type); void setImmediateFilterPermMask(PermissionMask mask); static void onPickerCallback(const std::vector& filenames, LLHandle handle); @@ -428,7 +428,7 @@ private: bool mLimitsSet; S32 mMaxDim; S32 mMinDim; - LLTextureCtrl::EPickInventoryType mInventoryPickType; + EPickInventoryType mInventoryPickType; texture_selected_callback mTextureSelectedCallback; -- cgit v1.2.3 From 38a89c1fe66a7002b47e3801c074304f0893cba2 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 10 Jan 2024 17:16:00 +0200 Subject: SL-20770 FIXED Picks location field not updating to different parcel/region --- indra/newview/llpanelprofilepicks.cpp | 32 ++++++++++++++++++++++++++++++++ indra/newview/llpanelprofilepicks.h | 7 ++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index e02ecfaa0a..5826621645 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -252,6 +252,8 @@ void LLPanelProfilePicks::onClickNewBtn() select_tab(true). label(pick_panel->getPickName())); updateButtons(); + + pick_panel->addLocationChangedCallbacks(); } void LLPanelProfilePicks::onClickDelete() @@ -488,6 +490,8 @@ LLPanelProfilePick::LLPanelProfilePick() , mLocationChanged(false) , mNewPick(false) , mIsEditing(false) + , mRegionCallbackConnection() + , mParcelCallbackConnection() { } @@ -505,6 +509,15 @@ LLPanelProfilePick::~LLPanelProfilePick() { LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this); } + + if (mRegionCallbackConnection.connected()) + { + mRegionCallbackConnection.disconnect(); + } + if (mParcelCallbackConnection.connected()) + { + mParcelCallbackConnection.disconnect(); + } } void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id) @@ -781,6 +794,18 @@ void LLPanelProfilePick::onClickSetLocation() void LLPanelProfilePick::onClickSave() { + if (mRegionCallbackConnection.connected()) + { + mRegionCallbackConnection.disconnect(); + } + if (mParcelCallbackConnection.connected()) + { + mParcelCallbackConnection.disconnect(); + } + if (mLocationChanged) + { + onClickSetLocation(); + } sendUpdate(); mLocationChanged = false; @@ -828,6 +853,13 @@ void LLPanelProfilePick::processParcelInfo(const LLParcelData& parcel_data) } } +void LLPanelProfilePick::addLocationChangedCallbacks() +{ + mRegionCallbackConnection = gAgent.addRegionChangedCallback([this]() { onClickSetLocation(); }); + mParcelCallbackConnection = gAgent.addParcelChangedCallback([this]() { onClickSetLocation(); }); +} + + void LLPanelProfilePick::sendUpdate() { LLPickData pick_data; diff --git a/indra/newview/llpanelprofilepicks.h b/indra/newview/llpanelprofilepicks.h index 27331831d3..d56f786ff1 100644 --- a/indra/newview/llpanelprofilepicks.h +++ b/indra/newview/llpanelprofilepicks.h @@ -140,7 +140,9 @@ public: void setParcelID(const LLUUID& parcel_id) override { mParcelId = parcel_id; } void setErrorStatus(S32 status, const std::string& reason) override {}; -protected: + void addLocationChangedCallbacks(); + + protected: /** * Sends remote parcel info request to resolve parcel name from its ID. @@ -239,6 +241,9 @@ protected: LLUUID mRequestedId; std::string mPickNameStr; + boost::signals2::connection mRegionCallbackConnection; + boost::signals2::connection mParcelCallbackConnection; + bool mLocationChanged; bool mNewPick; bool mIsEditing; -- cgit v1.2.3 From fab4cfbab26948fbec9015bd2ba1e8b05c3cd9e3 Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Wed, 10 Jan 2024 13:50:15 -0600 Subject: SL-20704 Fix for pathfinding debug display not working. --- autobuild.xml | 1542 ++++++++++++++++++------------------ indra/llrender/llrendernavprim.cpp | 10 +- 2 files changed, 783 insertions(+), 769 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 0e5a5a2a25..6098b4ffdf 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1,14 +1,20 @@ - version - 1.3 - type - autobuild installables SDL + copyright + Copyright (C) 1997-2012 Sam Lantinga + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. + license + lgpl + license_file + LICENSES/SDL.txt + name + SDL platforms linux64 @@ -24,21 +30,21 @@ linux64 - license - lgpl - license_file - LICENSES/SDL.txt - copyright - Copyright (C) 1997-2012 Sam Lantinga version 1.2.15 - name - SDL - description - Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. apr_suite + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. + description + Apache portable runtime project + license + apache + license_file + LICENSES/apr_suite.txt + name + apr_suite platforms darwin64 @@ -82,21 +88,21 @@ windows64 - license - apache - license_file - LICENSES/apr_suite.txt - copyright - Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. version 1.7.2-e935465 - name - apr_suite - description - Apache portable runtime project boost + copyright + (see individual source files) + description + Boost C++ Libraries + license + boost 1.0 + license_file + LICENSES/boost.txt + name + boost platforms darwin64 @@ -140,21 +146,21 @@ windows64 - license - boost 1.0 - license_file - LICENSES/boost.txt - copyright - (see individual source files) version 1.81 - name - boost - description - Boost C++ Libraries bugsplat + copyright + Copyright 2003-2017, BugSplat + description + Bugsplat crash reporting package + license + Proprietary + license_file + LICENSES/BUGSPLAT_LICENSE.txt + name + bugsplat platforms darwin64 @@ -186,21 +192,19 @@ windows64 - license - Proprietary - license_file - LICENSES/BUGSPLAT_LICENSE.txt - copyright - Copyright 2003-2017, BugSplat version 4.0.3.0-527603a - name - bugsplat - description - Bugsplat crash reporting package colladadom + copyright + Copyright 2006 Sony Computer Entertainment Inc. + license + SCEA + license_file + LICENSES/collada.txt + name + colladadom platforms darwin64 @@ -244,19 +248,19 @@ windows64 - license - SCEA - license_file - LICENSES/collada.txt - copyright - Copyright 2006 Sony Computer Entertainment Inc. version 2.3.d1ef72a - name - colladadom cubemaptoequirectangular + copyright + Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com + license + MIT + license_file + LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt + name + cubemaptoequirectangular platforms darwin64 @@ -300,19 +304,21 @@ windows64 - license - MIT - license_file - LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt - copyright - Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com version 1.1.0 - name - cubemaptoequirectangular curl + copyright + Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). + description + Library for transferring data specified with URL syntax + license + curl + license_file + LICENSES/curl.txt + name + curl platforms darwin64 @@ -356,21 +362,21 @@ windows64 - license - curl - license_file - LICENSES/curl.txt - copyright - Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). version 7.54.1-5a4a82d - name - curl - description - Library for transferring data specified with URL syntax dbus_glib + copyright + Copyright (C) Red Hat Inc. + description + D-Bus bindings for glib + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + name + dbus_glib platforms linux64 @@ -386,21 +392,21 @@ linux64 - license - Academic Free License v. 2.1 - license_file - LICENSES/dbus-glib.txt - copyright - Copyright (C) Red Hat Inc. version 0.76 - name - dbus_glib - description - D-Bus bindings for glib dictionaries + copyright + Copyright 2014 Apache OpenOffice software + description + Spell checking dictionaries to bundled into the viewer + license + various open source + license_file + LICENSES/dictionaries.txt + name + dictionaries platforms common @@ -418,21 +424,21 @@ common - license - various open source - license_file - LICENSES/dictionaries.txt - copyright - Copyright 2014 Apache OpenOffice software version None - name - dictionaries - description - Spell checking dictionaries to bundled into the viewer dullahan + copyright + Copyright (c) 2017, Linden Research, Inc. + description + A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. + license + MPL + license_file + LICENSES/LICENSE.txt + name + dullahan platforms darwin64 @@ -464,21 +470,21 @@ windows64 - license - MPL - license_file - LICENSES/LICENSE.txt - copyright - Copyright (c) 2017, Linden Research, Inc. version 1.14.0.202310131404_118.4.1_g3dd6078_chromium-118.0.5993.54 - name - dullahan - description - A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. expat + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + description + Expat is an XML parser library written in C + license + expat + license_file + LICENSES/expat.txt + name + expat platforms darwin64 @@ -524,21 +530,21 @@ windows64 - license - expat - license_file - LICENSES/expat.txt - copyright - Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. version 2.1.1.1f36d02 - name - expat - description - Expat is an XML parser library written in C fmodstudio + copyright + FMOD Studio by Firelight Technologies Pty Ltd. + description + FMOD Studio API + license + fmod + license_file + LICENSES/fmodstudio.txt + name + fmodstudio platforms darwin64 @@ -590,21 +596,21 @@ windows64 - license - fmod - license_file - LICENSES/fmodstudio.txt - copyright - FMOD Studio by Firelight Technologies Pty Ltd. version 2.02.13.578928 - name - fmodstudio - description - FMOD Studio API fontconfig + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. + description + Fontconfig is a library for configuring and customizing font access. + license + bsd + license_file + LICENSES/fontconfig.txt + name + fontconfig platforms linux64 @@ -620,21 +626,21 @@ linux64 - license - bsd - license_file - LICENSES/fontconfig.txt - copyright - Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. version 2.11.0 - name - fontconfig - description - Fontconfig is a library for configuring and customizing font access. freetype + copyright + Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. + description + Font rendering library + license + FreeType + license_file + LICENSES/freetype.txt + name + freetype platforms darwin64 @@ -680,21 +686,21 @@ windows64 - license - FreeType - license_file - LICENSES/freetype.txt - copyright - Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. version 2.4.4.4f739fa - name - freetype - description - Font rendering library glext + copyright + Copyright (c) 2007-2010 The Khronos Group Inc. + description + glext headers define function prototypes and constants for OpenGL extensions + license + Copyright (c) 2007-2010 The Khronos Group Inc. + license_file + LICENSES/glext.txt + name + glext platforms common @@ -712,21 +718,21 @@ common - license - Copyright (c) 2007-2010 The Khronos Group Inc. - license_file - LICENSES/glext.txt - copyright - Copyright (c) 2007-2010 The Khronos Group Inc. version 68 - name - glext - description - glext headers define function prototypes and constants for OpenGL extensions glh_linear + copyright + Copyright (c) 2000 Cass Everitt + description + glh - is a platform-indepenedent C++ OpenGL helper library + license + BSD + license_file + LICENSES/glh-linear.txt + name + glh_linear platforms common @@ -744,21 +750,21 @@ common - license - BSD - license_file - LICENSES/glh-linear.txt - copyright - Copyright (c) 2000 Cass Everitt version None - name - glh_linear - description - glh - is a platform-indepenedent C++ OpenGL helper library googlemock + copyright + Copyright 2008, Google Inc. + description + a library for writing and using C++ mock classes + license + BSD + license_file + LICENSES/gmock.txt + name + googlemock platforms darwin64 @@ -802,21 +808,19 @@ windows64 - license - BSD - license_file - LICENSES/gmock.txt - copyright - Copyright 2008, Google Inc. version 1.7.0.77bba00 - name - googlemock - description - a library for writing and using C++ mock classes gstreamer + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + license + LGPL + license_file + LICENSES/gstreamer.txt + name + gstreamer platforms linux64 @@ -832,19 +836,19 @@ linux64 - license - LGPL - license_file - LICENSES/gstreamer.txt - copyright - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> version 0.10.6.314267 - name - gstreamer gtk-atk-pango-glib + copyright + Copyright (various, see sources) + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + name + gtk-atk-pango-glib platforms linux64 @@ -860,19 +864,21 @@ linux64 - license - lgpl - license_file - LICENSES/gtk-atk-pango-glib.txt - copyright - Copyright (various, see sources) version 0.1 - name - gtk-atk-pango-glib havok-source + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. + description + Havok source code for libs and demos + license + havok + license_file + LICENSES/havok.txt + name + havok-source platforms darwin64 @@ -920,21 +926,19 @@ windows64 - license - havok - license_file - LICENSES/havok.txt - copyright - Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. version 2012.1-2 - name - havok-source - description - Havok source code for libs and demos jpegencoderbasic + copyright + Andreas Ritter, www.bytestrom.eu, 11/2009 + license + NONE + license_file + LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt + name + jpegencoderbasic platforms darwin64 @@ -978,19 +982,21 @@ windows64 - license - NONE - license_file - LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt - copyright - Andreas Ritter, www.bytestrom.eu, 11/2009 version 1.0 - name - jpegencoderbasic jpeglib + copyright + Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + description + JPEG encoding, decoding library + license + jpeglib + license_file + LICENSES/jpeglib.txt + name + jpeglib platforms darwin64 @@ -1036,21 +1042,21 @@ windows64 - license - jpeglib - license_file - LICENSES/jpeglib.txt - copyright - Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. version 8c.7846234 - name - jpeglib - description - JPEG encoding, decoding library jsoncpp + copyright + Copyright (c) 2007-2010 Baptiste Lepilleur + description + jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. + license + public domain + license_file + LICENSES/jsoncpp.txt + name + jsoncpp platforms darwin64 @@ -1096,21 +1102,21 @@ windows64 - license - public domain - license_file - LICENSES/jsoncpp.txt - copyright - Copyright (c) 2007-2010 Baptiste Lepilleur version 0.5.0.bc46e62 - name - jsoncpp - description - jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. kdu + copyright + Kakadu software + description + JPEG2000 library by Kakadu + license + Kakadu + license_file + LICENSES/kdu.txt + name + kdu platforms darwin64 @@ -1162,21 +1168,21 @@ windows64 - license - Kakadu - license_file - LICENSES/kdu.txt - copyright - Kakadu software version 7.10.4.539108 - name - kdu - description - JPEG2000 library by Kakadu libhunspell + copyright + See hunspell.txt + description + Spell checking library + license + LGPL + license_file + LICENSES/hunspell.txt + name + libhunspell platforms darwin64 @@ -1222,21 +1228,21 @@ windows64 - license - LGPL - license_file - LICENSES/hunspell.txt - copyright - See hunspell.txt version 1.3.2.650fb94 - name - libhunspell - description - Spell checking library libndofdev + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. + description + 3DConnexion SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + libndofdev platforms darwin64 @@ -1268,29 +1274,29 @@ windows64 - license - BSD - license_file - LICENSES/libndofdev.txt - copyright - Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. version 0.1.8e9edc7 - name - libndofdev - description - 3DConnexion SDK libpng - platforms - - darwin64 - - archive - - hash - fea8f0684a4ed0a73343651948b13049a135a92a + copyright + Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson + description + PNG Reference library + license + libpng + license_file + LICENSES/libpng.txt + name + libpng + platforms + + darwin64 + + archive + + hash + fea8f0684a4ed0a73343651948b13049a135a92a hash_algorithm sha1 url @@ -1326,21 +1332,21 @@ windows64 - license - libpng - license_file - LICENSES/libpng.txt - copyright - Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson version 1.6.38-ca06e99 - name - libpng - description - PNG Reference library libuuid + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). + license + UUID + license_file + LICENSES/uuid.txt + name + libuuid platforms linux64 @@ -1356,21 +1362,21 @@ linux64 - license - UUID - license_file - LICENSES/uuid.txt - copyright - Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> version 1.6.2 - name - libuuid - description - OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). libxml2 + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. + license + mit + license_file + LICENSES/libxml2.txt + name + libxml2 platforms darwin64 @@ -1416,21 +1422,21 @@ windows64 - license - mit - license_file - LICENSES/libxml2.txt - copyright - Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. version 2.9.4.7476681 - name - libxml2 - description - Libxml2 is the XML C parser and toolkit developed for the Gnome project. llappearance_utility + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab appearance utility for server-side avatar baking services. + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + name + llappearance_utility platforms linux @@ -1446,21 +1452,20 @@ linux - license - Proprietary - license_file - LICENSES/llappearanceutility.txt - copyright - Copyright (c) 2000-2012, Linden Research, Inc. version 0.0.1 - name - llappearance_utility - description - Linden Lab appearance utility for server-side avatar baking services. llca + copyright + Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. + + license + mit + license_file + LICENSES/ca-license.txt + name + llca platforms common @@ -1478,20 +1483,19 @@ common - license - mit - license_file - LICENSES/ca-license.txt - copyright - Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. - version 202310121530.0 - name - llca llphysicsextensions_source + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_source platforms darwin64 @@ -1501,11 +1505,11 @@ creds github hash - 48bca5d0233d1e724a59f649a2c6c7ac5f40ec3c + b037cc0b29ea70ee834cfae6dda5b7a25cd57174 hash_algorithm sha1 url - https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009335 + https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851460 name darwin64 @@ -1517,15 +1521,31 @@ creds github hash - 39f52d0350e130f41c5c758f7cb94e87b962c223 + bdea1fd5c4da9da5afde088d16188b45d0853e04 hash_algorithm sha1 url - https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009336 + https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851461 name linux64 + windows + + archive + + creds + github + hash + 2e6a66da6071253ae888839cfab59d3f5c1b8b4c + hash_algorithm + sha1 + url + https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851462 + + name + windows + windows64 archive @@ -1533,29 +1553,29 @@ creds github hash - 7b5e645fb7eb399abbea63bd21e8063bbb32a911 + f652ce0d6aef864689f0ed44255da4d9cd65a43f hash_algorithm sha1 url - https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/117009339 + https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851463 name windows64 + version + 1.0.479d20a + + llphysicsextensions_stub + + copyright + Copyright (c) 2010, Linden Research, Inc. license internal license_file LICENSES/llphysicsextensions.txt - copyright - Copyright (c) 2010, Linden Research, Inc. - version - 1.0.565768 name - llphysicsextensions_source - - llphysicsextensions_stub - + llphysicsextensions_stub platforms darwin64 @@ -1595,19 +1615,19 @@ windows - license - internal - license_file - LICENSES/llphysicsextensions.txt - copyright - Copyright (c) 2010, Linden Research, Inc. version 1.0.542456 - name - llphysicsextensions_stub llphysicsextensions_tpv + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/HavokSublicense.pdf + name + llphysicsextensions_tpv platforms darwin64 @@ -1647,19 +1667,17 @@ windows - license - internal - license_file - LICENSES/HavokSublicense.pdf - copyright - Copyright (c) 2010, Linden Research, Inc. version 1.0.561752 - name - llphysicsextensions_tpv mesa + license + mesa + license_file + LICENSES/mesa.txt + name + mesa platforms linux @@ -1675,17 +1693,23 @@ linux - license - mesa - license_file - LICENSES/mesa.txt version 7.11.1.297294 - name - mesa meshoptimizer + canonical_repo + https://bitbucket.org/lindenlab/3p-meshoptimizer + copyright + Copyright (c) 2016-2021 Arseny Kapoulkine + description + Meshoptimizer. Mesh optimization library. + license + meshoptimizer + license_file + LICENSES/meshoptimizer.txt + name + meshoptimizer platforms darwin64 @@ -1717,20 +1741,8 @@ windows64 - license - meshoptimizer - license_file - LICENSES/meshoptimizer.txt - copyright - Copyright (c) 2016-2021 Arseny Kapoulkine version 160 - name - meshoptimizer - canonical_repo - https://bitbucket.org/lindenlab/3p-meshoptimizer - description - Meshoptimizer. Mesh optimization library. mikktspace @@ -1790,6 +1802,18 @@ minizip-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-minizip-ng + copyright + This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. + license + minizip-ng + license_file + LICENSES/minizip-ng.txt + name + minizip-ng platforms darwin64 @@ -1835,23 +1859,22 @@ windows64 - license - minizip-ng - license_file - LICENSES/minizip-ng.txt - copyright - This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 3.0.2.3e9876e - name - minizip-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-minizip-ng - description - minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. nghttp2 + copyright + Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors + description + Library providing HTTP 2 support for libcurl + license + MIT + license_file + LICENSES/nghttp2.txt + name + nghttp2 platforms darwin64 @@ -1897,28 +1920,27 @@ windows64 - license - MIT - license_file - LICENSES/nghttp2.txt - copyright - Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa -Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors - version - 1.40.0.b1526c6 - name - nghttp2 - description - Library providing HTTP 2 support for libcurl source_type hg + version + 1.40.0.b1526c6 nvapi - platforms - - windows64 - + copyright + Copyright © 2012 NVIDIA Corporation. All rights reserved. + description + NVAPI provides an interface to NVIDIA devices. + license + NVIDIA Corporation Software License Agreement – NVAPI SDK + license_file + LICENSES/NVAPI_SDK_License_Agreement.pdf + name + nvapi + platforms + + windows64 + archive hash @@ -1932,21 +1954,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - NVIDIA Corporation Software License Agreement – NVAPI SDK - license_file - LICENSES/NVAPI_SDK_License_Agreement.pdf - copyright - Copyright © 2012 NVIDIA Corporation. All rights reserved. version 352.aac0e19 - name - nvapi - description - NVAPI provides an interface to NVIDIA devices. ogg_vorbis + copyright + Copyright (c) 2002, Xiph.org Foundation + description + Audio encoding library + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + name + ogg_vorbis platforms darwin64 @@ -1990,96 +2012,96 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - ogg-vorbis - license_file - LICENSES/ogg-vorbis.txt - copyright - Copyright (c) 2002, Xiph.org Foundation version 1.3.3-1.3.6.e4101b6 - name - ogg_vorbis - description - Audio encoding library open-libndofdev + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) + description + Open Source replacement for 3DConnection SDK license BSD license_file LICENSES/libndofdev.txt - copyright - Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) - version - 0.3 name open-libndofdev - description - Open Source replacement for 3DConnection SDK + version + 0.3 openal + copyright + Copyright (C) 1999-2007 by authors. + description + OpenAL Soft is a software implementation of the OpenAL 3D audio API. + license + LGPL2 + license_file + LICENSES/openal-soft.txt + name + openal platforms - linux64 + darwin64 archive hash - e0fbc4874acc4167a6e2b6489fbb8258d98fd665 + 4edaef5f03a1122eae8467c4a04d9caccaaaf847 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst name - linux64 + darwin64 - windows64 + linux64 archive hash - 6ae3b5310eb1988741bc55416681ca9d64f76f85 + e0fbc4874acc4167a6e2b6489fbb8258d98fd665 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst name - windows64 + linux64 - darwin64 + windows64 archive hash - 4edaef5f03a1122eae8467c4a04d9caccaaaf847 + 6ae3b5310eb1988741bc55416681ca9d64f76f85 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst name - darwin64 + windows64 - license - LGPL2 - license_file - LICENSES/openal-soft.txt - copyright - Copyright (C) 1999-2007 by authors. version 1.23.1 - name - openal - description - OpenAL Soft is a software implementation of the OpenAL 3D audio API. openjpeg + copyright + Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; + description + The OpenJPEG library is an open-source JPEG 2000 codec written in C language. + license + BSD + license_file + LICENSES/openjpeg.txt + name + openjpeg platforms darwin64 @@ -2125,21 +2147,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - BSD - license_file - LICENSES/openjpeg.txt - copyright - Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; version 2.5.0.ea12248 - name - openjpeg - description - The OpenJPEG library is an open-source JPEG 2000 codec written in C language. openssl + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library + license + openssl + license_file + LICENSES/openssl.txt + name + openssl platforms darwin64 @@ -2185,21 +2207,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - openssl - license_file - LICENSES/openssl.txt - copyright - Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) version 1.1.1q.de53f55 - name - openssl - description - Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library pcre + copyright + Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. + description + PCRE Perl-compatible regular expression library + license + bsd + license_file + LICENSES/pcre-license.txt + name + pcre platforms darwin64 @@ -2243,21 +2265,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - bsd - license_file - LICENSES/pcre-license.txt - copyright - Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. version 8.35.979fd86 - name - pcre - description - PCRE Perl-compatible regular expression library slvoice + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) + description + Vivox SDK components + license + Mixed + license_file + LICENSES/vivox_licenses.txt + name + slvoice platforms darwin64 @@ -2305,21 +2327,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - Mixed - license_file - LICENSES/vivox_licenses.txt - copyright - 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) version 4.10.0000.32327.5fc3fe7c.571099 - name - slvoice - description - Vivox SDK components threejs + copyright + Copyright © 2010-2021 three.js authors + license + MIT + license_file + LICENSES/THREEJS_LICENSE.txt + name + threejs platforms darwin64 @@ -2363,16 +2383,8 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - MIT - license_file - LICENSES/THREEJS_LICENSE.txt - copyright - Copyright © 2010-2021 three.js authors version 0.132.2 - name - threejs tinygltf @@ -2412,6 +2424,18 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tracy + canonical_repo + https://bitbucket.org/lindenlab/3p-tracy + copyright + Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) + description + Tracy Profiler Library + license + bsd + license_file + LICENSES/tracy_license.txt + name + tracy platforms darwin64 @@ -2441,20 +2465,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - bsd - license_file - LICENSES/tracy_license.txt - copyright - Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) - version - v0.8.1.235e98f - name - tracy - canonical_repo - https://bitbucket.org/lindenlab/3p-tracy - description - Tracy Profiler Library source https://bitbucket.org/lindenlab/3p-tracy source_type @@ -2464,6 +2474,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tut + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek + description + TUT is a small and portable unit test framework for C++. + license + bsd + license_file + LICENSES/tut.txt + name + tut platforms common @@ -2481,21 +2501,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors common - license - bsd - license_file - LICENSES/tut.txt - copyright - Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek version 2008.11.30 - name - tut - description - TUT is a small and portable unit test framework for C++. uriparser + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. + license + New BSD license + license_file + LICENSES/uriparser.txt + name + uriparser platforms darwin64 @@ -2541,21 +2561,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - New BSD license - license_file - LICENSES/uriparser.txt - copyright - Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> version 0.9.4 - name - uriparser - description - uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. viewer-manager + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab Viewer Management Process suite. + license + viewerlgpl + license_file + LICENSE + name + viewer-manager platforms darwin64 @@ -2601,25 +2621,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - viewerlgpl - license_file - LICENSE - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - version - 3.0-08bf5ee - name - viewer-manager - description - Linden Lab Viewer Management Process suite. source https://bitbucket.org/lindenlab/vmp-standalone source_type hg + version + 3.0-08bf5ee vlc-bin + copyright + Copyright (C) 1998-2016 VLC authors and VideoLAN + license + GPL2 + license_file + LICENSES/vlc.txt + name + vlc-bin platforms darwin64 @@ -2651,19 +2669,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - GPL2 - license_file - LICENSES/vlc.txt - copyright - Copyright (C) 1998-2016 VLC authors and VideoLAN version 3.0.16.c219a5d - name - vlc-bin - xmlrpc-epi + vulkan_gltf + canonical_repo + https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr + copyright + Copyright (c) 2018 Sascha Willems + description + Vulkan GLTF Sample Implementation + license + Copyright (c) 2018 Sascha Willems + license_file + LICENSES/vulkan_gltf.txt + name + vulkan_gltf platforms darwin64 @@ -2671,71 +2693,53 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - aa12611374876196b3ebb6bda8d419a697217b8b - hash_algorithm - sha1 + 8cff2060843db3db788511ee34a8e8cc url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 name darwin64 - linux64 + windows archive hash - ad0c8b41ee4b4de216382bec46ee1c25962a3f12 - hash_algorithm - sha1 + 58eea384be49ba756ce9c5e66669540b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 name - linux64 + windows windows64 archive hash - e53fd38c14b8c47c7c84dead8a1b211bb8be170c - hash_algorithm - sha1 + 79b6a11622c2f83cfc2b7cd1fafb867b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 name windows64 - license - xmlrpc-epi - license_file - LICENSES/xmlrpc-epi.txt - copyright - Copyright: (C) 2000 Epinions, Inc. version - 0.54.1.8a05acf - name - xmlrpc-epi - description - XMLRPC Library + 1 - vulkan_gltf + xmlrpc-epi - canonical_repo - https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr copyright - Copyright (c) 2018 Sascha Willems + Copyright: (C) 2000 Epinions, Inc. description - Vulkan GLTF Sample Implementation + XMLRPC Library license - Copyright (c) 2018 Sascha Willems + xmlrpc-epi license_file - LICENSES/vulkan_gltf.txt + LICENSES/xmlrpc-epi.txt name - vulkan_gltf + xmlrpc-epi platforms darwin64 @@ -2743,43 +2747,59 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8cff2060843db3db788511ee34a8e8cc + aa12611374876196b3ebb6bda8d419a697217b8b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst name darwin64 - windows + linux64 archive hash - 58eea384be49ba756ce9c5e66669540b + ad0c8b41ee4b4de216382bec46ee1c25962a3f12 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst name - windows + linux64 windows64 archive hash - 79b6a11622c2f83cfc2b7cd1fafb867b + e53fd38c14b8c47c7c84dead8a1b211bb8be170c + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst name windows64 version - 1 + 0.54.1.8a05acf xxhash + copyright + Copyright (c) 2012-2021 Yann Collet + description + xxHash Library + license + xxhash + license_file + LICENSES/xxhash.txt + name + xxhash platforms common @@ -2837,21 +2857,23 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - xxhash - license_file - LICENSES/xxhash.txt - copyright - Copyright (c) 2012-2021 Yann Collet version 0.8.1.7501c90 - name - xxhash - description - xxHash Library zlib-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-zlib-ng + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + zlib data compression library for the next generation systems + license + zlib-ng + license_file + LICENSES/zlib-ng.txt + name + zlib-ng platforms darwin64 @@ -2897,24 +2919,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - license - zlib-ng - license_file - LICENSES/zlib-ng.txt - copyright - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 1.2.11.zlib-ng.32fd361 - name - zlib-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-zlib-ng - description - zlib data compression library for the next generation systems package_description + canonical_repo + https://github.com/secondlife/viewer + copyright + Copyright (c) 2020, Linden Research, Inc. + description + Second Life Viewer + license + LGPL + license_file + docs/LICENSE-source.txt + name + Second Life Viewer platforms common @@ -2923,6 +2945,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfo + build + + configure command @@ -2933,10 +2958,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - - - build - + name RelWithDebInfo @@ -2945,6 +2967,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure + arguments + + ../indra + command cmake options @@ -2953,17 +2979,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - - arguments - - ../indra - + name RelWithDebInfoOS Release + build + + configure command @@ -2974,10 +2999,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - - - build - + name Release @@ -2986,6 +3008,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure + arguments + + ../indra + command cmake options @@ -2994,11 +3020,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - - arguments - - ../indra - + name ReleaseOS @@ -3009,22 +3031,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors darwin64 + build_directory + build-darwin-x86_64 configurations RelWithDebInfo - configure - - options - - -G - Xcode - - arguments - - ../indra - - build command @@ -3036,23 +3048,27 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + - default - True - name - RelWithDebInfo - - RelWithDebInfoOS - configure + arguments + + ../indra + options -G Xcode - + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + build command @@ -3064,25 +3080,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + - name - RelWithDebInfoOS - - Release - configure options -G Xcode - - arguments - - ../indra - + + name + RelWithDebInfoOS + + Release + build command @@ -3094,21 +3106,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + - name - Release - - ReleaseOS - configure + arguments + + ../indra + options -G Xcode - + + name + Release + + ReleaseOS + build command @@ -3120,40 +3136,48 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + + + configure + + options + + -G + Xcode + name ReleaseOS - build_directory - build-darwin-x86_64 name darwin64 linux64 + build_directory + build-linux-x86_64 configurations Release + build + + command + ninja + configure + arguments + + ../indra + options -G Ninja -DLL_TESTS=Off - - arguments - - ../indra - - - build - - command - ninja + default True @@ -3162,6 +3186,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ReleaseOS + build + + command + ninja + configure options @@ -3169,12 +3198,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Ninja -DLL_TESTS=Off - - - build - - command - ninja + name ReleaseOS @@ -3188,44 +3212,44 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors default - build_directory - build-linux-x86_64 name linux64 windows + build_directory + build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE configurations RelWithDebInfo - configure + build - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - arguments - ..\indra - - - build - + SecondLife.sln + command devenv options /build RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + + + configure + arguments - SecondLife.sln - + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + default True @@ -3234,25 +3258,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfoOS - configure + build - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - arguments - ..\indra - - - build - + SecondLife.sln + command msbuild.exe options @@ -3263,70 +3274,69 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - - arguments - - SecondLife.sln - + - name - RelWithDebInfoOS - - Release - configure + arguments + + ..\indra + options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - arguments - - ..\indra - + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + + name + RelWithDebInfoOS + + Release + build + arguments + + SecondLife.sln + command devenv options /build Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - arguments - - SecondLife.sln - + - name - Release - - ReleaseOS - configure + arguments + + ..\indra + options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DUNATTENDED:BOOL=ON - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - - arguments - - ..\indra - + + name + Release + + ReleaseOS + build + arguments + + SecondLife.sln + command msbuild.exe options @@ -3337,36 +3347,40 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - + + + configure + arguments - SecondLife.sln - + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + -DUNATTENDED:BOOL=ON + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + name ReleaseOS - build_directory - build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE name windows - license - LGPL - license_file - docs/LICENSE-source.txt - copyright - Copyright (c) 2020, Linden Research, Inc. version_file newview/viewer_version.txt - name - Second Life Viewer - canonical_repo - https://github.com/secondlife/viewer - description - Second Life Viewer + type + autobuild + version + 1.3 diff --git a/indra/llrender/llrendernavprim.cpp b/indra/llrender/llrendernavprim.cpp index d610a44bc6..eea3077632 100644 --- a/indra/llrender/llrendernavprim.cpp +++ b/indra/llrender/llrendernavprim.cpp @@ -40,20 +40,20 @@ LLRenderNavPrim gRenderNav; //============================================================================= void LLRenderNavPrim::renderLLTri( const LLVector3& a, const LLVector3& b, const LLVector3& c, const LLColor4U& color ) const { - LLColor4 cV(color); - gGL.color4fv( cV.mV ); - gGL.begin(LLRender::TRIANGLES); + gGL.color4ubv(color.mV); + + gGL.begin(LLRender::TRIANGLES); { gGL.vertex3fv( a.mV ); gGL.vertex3fv( b.mV ); gGL.vertex3fv( c.mV ); } - gGL.end(); + gGL.end(); } //============================================================================= void LLRenderNavPrim::renderNavMeshVB( U32 mode, LLVertexBuffer* pVBO, int vertCnt ) { pVBO->setBuffer(); - pVBO->drawArrays( mode, 0, vertCnt ); + pVBO->drawArrays( mode, 0, vertCnt ); } //============================================================================= -- cgit v1.2.3 From 990f9dd92fc8b770a85649c022137e53e4549b2d Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 11 Jan 2024 01:12:01 +0200 Subject: SL-20798 FIXED Crash at LLIMMgr::addMessage --- indra/newview/llimview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 61a01d7418..9e6704af26 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3160,7 +3160,7 @@ void LLIMMgr::addMessage( } // Fetch group chat history, enabled by default. - if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) + if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory") && gAgent.getRegion()) { std::string chat_url = gAgent.getRegion()->getCapability("ChatSessionRequest"); LLCoros::instance().launch("chatterBoxHistoryCoro", -- cgit v1.2.3 From 0d8bd79c79c1e917bc49669426bdfa89dc48ff04 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 11 Jan 2024 00:19:56 +0200 Subject: SL-20750 MacOS Crash processing attributed string --- indra/llwindow/llopenglview-objc.mm | 68 ++++++++++++++++++++++-------------- indra/newview/llinventorygallery.cpp | 4 +-- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 37f4568b98..0bd4e506a2 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -736,33 +736,49 @@ attributedStringInfo getSegments(NSAttributedString *str) // SL-19801 Special workaround for system emoji picker if ([aString length] == 2) { - uint32_t b0 = [aString characterAtIndex:0]; - uint32_t b1 = [aString characterAtIndex:1]; - if (((b0 & 0xF000) == 0xD000) && ((b1 & 0xF000) == 0xD000)) - { - uint32_t b = 0x10000 | ((b0 & 0x3F) << 10) | (b1 & 0x3FF); - callUnicodeCallback(b, 0); - return; - } - } - - if (!mHasMarkedText) - { - for (NSInteger i = 0; i < [aString length]; i++) - { - callUnicodeCallback([aString characterAtIndex:i], mModifiers); - } - } else { - resetPreedit(); - // We may never get this point since unmarkText may be called before insertText ever gets called once we submit our text. - // But just in case... - - for (NSInteger i = 0; i < [aString length]; i++) - { - handleUnicodeCharacter([aString characterAtIndex:i]); - } - mHasMarkedText = FALSE; + @try + { + uint32_t b0 = [aString characterAtIndex:0]; + uint32_t b1 = [aString characterAtIndex:1]; + if (((b0 & 0xF000) == 0xD000) && ((b1 & 0xF000) == 0xD000)) + { + uint32_t b = 0x10000 | ((b0 & 0x3F) << 10) | (b1 & 0x3FF); + callUnicodeCallback(b, 0); + return; + } + } + @catch(NSException * e) + { + // One of the characters is an attribute string? + NSLog(@"Encountered an unsupported attributed character. Exception: %@ String: %@", e.name, aString); + return; + } } + + @try + { + if (!mHasMarkedText) + { + for (NSInteger i = 0; i < [aString length]; i++) + { + callUnicodeCallback([aString characterAtIndex:i], mModifiers); + } + } else { + resetPreedit(); + // We may never get this point since unmarkText may be called before insertText ever gets called once we submit our text. + // But just in case... + + for (NSInteger i = 0; i < [aString length]; i++) + { + handleUnicodeCharacter([aString characterAtIndex:i]); + } + mHasMarkedText = FALSE; + } + } + @catch(NSException * e) + { + NSLog(@"Failed to process an attributed string. Exception: %@ String: %@", e.name, aString); + } } - (void) insertNewline:(id)sender diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 72ef6e5bb6..d4ca58f778 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -2432,9 +2432,7 @@ void LLInventoryGallery::startDrag() ids.push_back(selected_id); } } - // We must have set this for some reason, but it's causing compile errors - (void)src; - LLToolDragAndDrop::getInstance()->beginMultiDrag(types, ids, LLToolDragAndDrop::SOURCE_AGENT); + LLToolDragAndDrop::getInstance()->beginMultiDrag(types, ids, src); } bool LLInventoryGallery::areViewsInitialized() -- cgit v1.2.3 From 82774d2db9649f2df0993604d0a1751ef9a61df2 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Wed, 20 Dec 2023 17:41:03 +0100 Subject: Build fix for Visual Studio update (std::vector) --- indra/newview/llmaterialeditor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index 292ddb765f..1f5974c74d 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -2228,7 +2228,7 @@ bool LLMaterialEditor::canModifyObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_MODIFY}), ItemSource::OBJECT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_MODIFY}), ItemSource::OBJECT, permissions, item_out); } bool LLMaterialEditor::canSaveObjectsMaterial() @@ -2236,7 +2236,7 @@ bool LLMaterialEditor::canSaveObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item_out); } bool LLMaterialEditor::canClipboardObjectsMaterial() @@ -2262,7 +2262,7 @@ bool LLMaterialEditor::canClipboardObjectsMaterial() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item_out; - return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), ItemSource::OBJECT, permissions, item_out); + return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), ItemSource::OBJECT, permissions, item_out); } void LLMaterialEditor::saveObjectsMaterialAs() @@ -2270,7 +2270,7 @@ void LLMaterialEditor::saveObjectsMaterialAs() LLSelectedTEGetMatData func(true); LLPermissions permissions; LLViewerInventoryItem* item = nullptr; - bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item); + bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), ItemSource::AGENT, permissions, item); if (!allowed) { LL_WARNS("MaterialEditor") << "Failed to save GLTF material from object" << LL_ENDL; -- cgit v1.2.3 From 6173bd6236dc452b05b6e32258b59c6db05a022d Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Thu, 11 Jan 2024 19:19:35 +0100 Subject: SL-20749 Scrolling up by mouse wheel is endless in LLPanelEmojiComplete --- indra/newview/llpanelemojicomplete.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 9bfe04fc31..46f455aede 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -264,7 +264,11 @@ BOOL LLPanelEmojiComplete::handleScrollWheel(S32 x, S32 y, S32 clicks) if (mTotalEmojis > mVisibleEmojis) { - mScrollPos = llclamp(mScrollPos + clicks, 0, mTotalEmojis - mVisibleEmojis); + // In case of wheel up (clicks < 0) we shouldn't subtract more than value of mScrollPos + // Example: if mScrollPos = 0, clicks = -1 then (mScrollPos + clicks) becomes SIZE_MAX + // As a result of llclamp() mScrollPos becomes (mTotalEmojis - mVisibleEmojis) + S32 newScrollPos = llmax(0, (S32)mScrollPos + clicks); + mScrollPos = llclamp((size_t)newScrollPos, 0, mTotalEmojis - mVisibleEmojis); mCurSelected = posToIndex(x, y); return TRUE; } -- cgit v1.2.3 From 5c412a2b70fb64d7106492bcb7578f6bba4098bf Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 11 Jan 2024 20:46:07 +0200 Subject: SL-20798 use appropriate check --- indra/newview/llimview.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 9e6704af26..ce4a032b27 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3160,11 +3160,13 @@ void LLIMMgr::addMessage( } // Fetch group chat history, enabled by default. - if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory") && gAgent.getRegion()) + if (gSavedPerAccountSettings.getBOOL("FetchGroupChatHistory")) { - std::string chat_url = gAgent.getRegion()->getCapability("ChatSessionRequest"); - LLCoros::instance().launch("chatterBoxHistoryCoro", - boost::bind(&chatterBoxHistoryCoro, chat_url, session_id, from, msg, timestamp)); + std::string chat_url = gAgent.getRegionCapability("ChatSessionRequest"); + if (!chat_url.empty()) + { + LLCoros::instance().launch("chatterBoxHistoryCoro", boost::bind(&chatterBoxHistoryCoro, chat_url, session_id, from, msg, timestamp)); + } } //Play sound for new conversations -- cgit v1.2.3 From 03870e0cf3733d244269f8c9ce7c982309d4f9fd Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Thu, 11 Jan 2024 20:29:06 +0100 Subject: SL-20756 The emoji in the profile floater is displayed schematically --- indra/llui/lltextbase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 1b83ee401c..8f628b4818 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -168,7 +168,7 @@ LLTextBase::Params::Params() trusted_content("trusted_content", true), always_show_icons("always_show_icons", false), use_ellipses("use_ellipses", false), - use_color("use_color", false), + use_color("use_color", true), parse_urls("parse_urls", false), force_urls_external("force_urls_external", false), parse_highlights("parse_highlights", false) -- cgit v1.2.3 From 5771736bd2dcae1169acd8899bba87a82fbe9de9 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 12 Jan 2024 14:04:46 +0200 Subject: SL-20799 FIXED Viewer crashes when trying to save snapshot on disc without empty space --- indra/llimage/llimage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 031471d1fe..f9393dea54 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -2259,9 +2259,9 @@ bool LLImageFormatted::save(const std::string &filename) return false; } - outfile.write(getData(), getDataSize()); + S32 result = outfile.write(getData(), getDataSize()); outfile.close() ; - return true; + return (result != 0); } S8 LLImageFormatted::getCodec() const -- cgit v1.2.3 From 577706eddc22cd750c11e2110c79b7ead85e6005 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 Jan 2024 00:20:46 +0200 Subject: SL-20629 Fix first opened legacy env displaying probe ambience as '1' --- indra/newview/llenvironment.cpp | 8 ++++++++ indra/newview/llsettingsvo.cpp | 4 +--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index ffaca846dd..60c2682078 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -895,6 +895,14 @@ void LLEnvironment::initSingleton() gGenericDispatcher.addHandler(MESSAGE_PUSHENVIRONMENT, &environment_push_dispatch_handler); } + gSavedSettings.getControl("RenderSkyAutoAdjustProbeAmbiance")->getSignal()->connect( + [](LLControlVariable*, const LLSD& new_val, const LLSD& old_val) + { + LLSettingsSky::sAutoAdjustProbeAmbiance = new_val.asReal(); + } + ); + LLSettingsSky::sAutoAdjustProbeAmbiance = gSavedSettings.getF32("RenderSkyAutoAdjustProbeAmbiance"); + LLEventPumps::instance().obtain(PUMP_EXPERIENCE).stopListening(LISTENER_NAME); LLEventPumps::instance().obtain(PUMP_EXPERIENCE).listen(LISTENER_NAME, [this](LLSD message) { listenExperiencePump(message); return false; }); } diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 7009fb98ab..c07c939862 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -739,7 +739,6 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force) static LLCachedControl auto_adjust_blue_horizon_scale(gSavedSettings, "RenderSkyAutoAdjustBlueHorizonScale", 1.f); static LLCachedControl auto_adjust_blue_density_scale(gSavedSettings, "RenderSkyAutoAdjustBlueDensityScale", 1.f); static LLCachedControl auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f); - static LLCachedControl auto_adjust_probe_ambiance(gSavedSettings, "RenderSkyAutoAdjustProbeAmbiance", 1.f); static LLCachedControl sunlight_scale(gSavedSettings, "RenderSkySunlightScale", 1.5f); static LLCachedControl ambient_scale(gSavedSettings, "RenderSkyAmbientScale", 1.5f); @@ -772,8 +771,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force) shader->uniform3fv(LLShaderMgr::BLUE_DENSITY, blue_density.mV); shader->uniform3fv(LLShaderMgr::BLUE_HORIZON, blue_horizon.mV); - LLSettingsSky::sAutoAdjustProbeAmbiance = auto_adjust_probe_ambiance; - probe_ambiance = auto_adjust_probe_ambiance; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true + probe_ambiance = sAutoAdjustProbeAmbiance; } else { -- cgit v1.2.3 From 2c8532bdc7afa8ff380fbae7c2be8300b5ce8214 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 Jan 2024 00:22:47 +0200 Subject: SL-20629 Fix Probe ambiance being displayed as 0 when it isn't And hide warning when it's already 0 --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/llfloatereditextdaycycle.cpp | 4 +++- indra/newview/llfloaterfixedenvironment.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 00b59f9a4d..8fbeb82d07 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10720,7 +10720,7 @@ Type F32 Value - 0.001 + 0.01 RenderSkySunlightScale diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index bb47feaa95..4e764674e5 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -1724,7 +1724,9 @@ void LLFloaterEditExtDayCycle::showHDRNotification(const LLSettingsDay::ptr_t &p while (iter != end) { LLSettingsSky::ptr_t sky = std::static_pointer_cast(iter->second); - if (sky && sky->canAutoAdjust()) + if (sky + && sky->canAutoAdjust() + && sky->getReflectionProbeAmbiance(true) != 0.f) { LLNotificationsUtil::add("AutoAdjustHDRSky"); return; diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index 8e28fd6234..3e8bad3ef5 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -186,7 +186,8 @@ void LLFloaterFixedEnvironment::setEditSettingsAndUpdate(const LLSettingsBase::p // teach user about HDR settings if (mSettings && mSettings->getSettingsType() == "sky" - && ((LLSettingsSky*)mSettings.get())->canAutoAdjust()) + && ((LLSettingsSky*)mSettings.get())->canAutoAdjust() + && ((LLSettingsSky*)mSettings.get())->getReflectionProbeAmbiance(true) != 0.f) { LLNotificationsUtil::add("AutoAdjustHDRSky"); } -- cgit v1.2.3 From 25d7828bec3e54eeceb76b77fa6b8b1527611bcf Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Fri, 12 Jan 2024 12:39:57 -0600 Subject: DRTVWR-601 Fix for Tracy instrumentation (Tracy doesn't play nice with coroutines). --- indra/llcommon/llsingleton.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 51ef514cf7..fba8301c4d 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -455,7 +455,7 @@ public: static DERIVED_TYPE* getInstance() { - LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; + //LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; // TODO -- reenable this when we have a fix for using Tracy with coroutines // We know the viewer has LLSingleton dependency circularities. If you // feel strongly motivated to eliminate them, cheers and good luck. // (At that point we could consider a much simpler locking mechanism.) -- cgit v1.2.3 From 568f1a19b16f7febfd6ff3963f28840399aec8b5 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 15 Jan 2024 22:30:54 +0200 Subject: SL-20783 Avatar turning animation was affected by framerate --- indra/newview/llvoavatar.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index fee00eb6f4..550be30919 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4283,6 +4283,15 @@ void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time) if (mTurning) { pelvis_rot_threshold *= 0.4f; + // account for fps, assume that above value is for ~60fps + constexpr F32 default_frame_sec = 0.016f; + F32 prev_frame_sec = LLFrameTimer::getFrameDeltaTimeF32(); + if (default_frame_sec > prev_frame_sec) + { + // reduce threshold since turn rate per second is constant, + // shorter frame means shorter turn. + pelvis_rot_threshold *= prev_frame_sec/default_frame_sec; + } } // am I done turning? -- cgit v1.2.3 From 65b501c42973e3ffdbf37e70ed78243bab588039 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Tue, 16 Jan 2024 02:12:34 +0100 Subject: SL-20751 Information about frequently used and recently used emojis is available to all users --- indra/newview/llfloateremojipicker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index a9bc0fd6bb..abc5165f1e 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -973,7 +973,7 @@ void LLFloaterEmojiPicker::loadState() if (!sStateFileName.empty()) return; // Already loaded - sStateFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "emoji_floater_state.xml"); + sStateFileName = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "emoji_floater_state.xml"); llifstream file; file.open(sStateFileName.c_str()); -- cgit v1.2.3 From 382f9f0786b5225ac6d9648241e6c04f4f94f262 Mon Sep 17 00:00:00 2001 From: AiraYumi Date: Sat, 13 Jan 2024 15:36:45 +0900 Subject: replace part of boost::fibers::* to std::* --- indra/llcommon/llcond.h | 1 - indra/llcommon/llcoros.h | 14 +++++--------- indra/llcommon/lleventcoro.cpp | 6 +++--- indra/llcommon/llthreadsafequeue.h | 9 +++------ indra/llcommon/workqueue.cpp | 1 - indra/llmessage/message.h | 1 - 6 files changed, 11 insertions(+), 21 deletions(-) diff --git a/indra/llcommon/llcond.h b/indra/llcommon/llcond.h index da6e6affe1..a4bec124ca 100644 --- a/indra/llcommon/llcond.h +++ b/indra/llcommon/llcond.h @@ -16,7 +16,6 @@ #include "llunits.h" #include "llcoros.h" -#include LLCOROS_MUTEX_HEADER #include "mutex.h" #include diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 966ce03296..8160b87f23 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -41,10 +41,6 @@ #include #include -// e.g. #include LLCOROS_MUTEX_HEADER -#define LLCOROS_MUTEX_HEADER -#define LLCOROS_CONDVAR_HEADER - namespace boost { namespace fibers { class mutex; @@ -289,17 +285,17 @@ public: * proxy, so continue using the aliases. */ template - using Promise = boost::fibers::promise; + using Promise = std::promise; template - using Future = boost::fibers::future; + using Future = std::future; template static Future getFuture(Promise& promise) { return promise.get_future(); } // use mutex, lock, condition_variable suitable for coroutines - using Mutex = boost::fibers::mutex; + using Mutex = std::mutex; using LockType = std::unique_lock; - using cv_status = boost::fibers::cv_status; - using ConditionVariable = boost::fibers::condition_variable; + using cv_status = std::cv_status; + using ConditionVariable = std::condition_variable; /// for data local to each running coroutine template diff --git a/indra/llcommon/lleventcoro.cpp b/indra/llcommon/lleventcoro.cpp index 067b5e6fbc..97a7ad04ad 100644 --- a/indra/llcommon/lleventcoro.cpp +++ b/indra/llcommon/lleventcoro.cpp @@ -285,7 +285,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, // declare the future LLCoros::Future future = LLCoros::getFuture(promise); // wait for specified timeout - boost::fibers::future_status status; + std::future_status status; { LLCoros::TempStatus st(STRINGIZE("waiting for " << replyPump.getPump().getName() << " for " << timeout << "s")); @@ -296,7 +296,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, status = future.wait_for(std::chrono::milliseconds(long(timeout * 1000))); } // if the future is NOT yet ready, return timeoutResult instead - if (status == boost::fibers::future_status::timeout) + if (status == std::future_status::timeout) { LL_DEBUGS("lleventcoro") << "postAndSuspendWithTimeout(): coroutine " << listenerName << " timed out after " << timeout << " seconds," @@ -305,7 +305,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, } else { - llassert_always(status == boost::fibers::future_status::ready); + llassert_always(status == std::future_status::ready); // future is now ready, no more waiting LLSD value(future.get()); diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h index f396a71e6f..0aa75c9b73 100644 --- a/indra/llcommon/llthreadsafequeue.h +++ b/indra/llcommon/llthreadsafequeue.h @@ -28,9 +28,6 @@ #define LL_LLTHREADSAFEQUEUE_H #include "llcoros.h" -#include LLCOROS_MUTEX_HEADER -#include -#include LLCOROS_CONDVAR_HEADER #include "llexception.h" #include "mutex.h" #include @@ -182,10 +179,10 @@ protected: size_t mCapacity; bool mClosed; - boost::fibers::timed_mutex mLock; + std::timed_mutex mLock; typedef std::unique_lock lock_t; - boost::fibers::condition_variable_any mCapacityCond; - boost::fibers::condition_variable_any mEmptyCond; + std::condition_variable_any mCapacityCond; + std::condition_variable_any mEmptyCond; enum pop_result { EMPTY, DONE, WAITING, POPPED }; // implementation logic, suitable for passing to tryLockUntil() diff --git a/indra/llcommon/workqueue.cpp b/indra/llcommon/workqueue.cpp index cf80ce0656..9c434bf2a9 100644 --- a/indra/llcommon/workqueue.cpp +++ b/indra/llcommon/workqueue.cpp @@ -18,7 +18,6 @@ // external library headers // other Linden headers #include "llcoros.h" -#include LLCOROS_MUTEX_HEADER #include "llerror.h" #include "llexception.h" #include "stringize.h" diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index e25a9ea7ef..4aab0a6537 100644 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -58,7 +58,6 @@ #include "boost/function.hpp" #include "llpounceable.h" #include "llcoros.h" -#include LLCOROS_MUTEX_HEADER const U32 MESSAGE_MAX_STRINGS_LENGTH = 64; const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192; -- cgit v1.2.3 From 746788e78901835aeb3ba983840092ce97b257da Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 16 Jan 2024 16:46:34 +0200 Subject: Revert "replaces parts of boost to C++ standard." --- indra/llcommon/llcond.h | 1 + indra/llcommon/llcoros.h | 14 +++++++++----- indra/llcommon/lleventcoro.cpp | 6 +++--- indra/llcommon/llthreadsafequeue.h | 9 ++++++--- indra/llcommon/workqueue.cpp | 1 + indra/llmessage/message.h | 1 + 6 files changed, 21 insertions(+), 11 deletions(-) diff --git a/indra/llcommon/llcond.h b/indra/llcommon/llcond.h index a4bec124ca..da6e6affe1 100644 --- a/indra/llcommon/llcond.h +++ b/indra/llcommon/llcond.h @@ -16,6 +16,7 @@ #include "llunits.h" #include "llcoros.h" +#include LLCOROS_MUTEX_HEADER #include "mutex.h" #include diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index 8160b87f23..966ce03296 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -41,6 +41,10 @@ #include #include +// e.g. #include LLCOROS_MUTEX_HEADER +#define LLCOROS_MUTEX_HEADER +#define LLCOROS_CONDVAR_HEADER + namespace boost { namespace fibers { class mutex; @@ -285,17 +289,17 @@ public: * proxy, so continue using the aliases. */ template - using Promise = std::promise; + using Promise = boost::fibers::promise; template - using Future = std::future; + using Future = boost::fibers::future; template static Future getFuture(Promise& promise) { return promise.get_future(); } // use mutex, lock, condition_variable suitable for coroutines - using Mutex = std::mutex; + using Mutex = boost::fibers::mutex; using LockType = std::unique_lock; - using cv_status = std::cv_status; - using ConditionVariable = std::condition_variable; + using cv_status = boost::fibers::cv_status; + using ConditionVariable = boost::fibers::condition_variable; /// for data local to each running coroutine template diff --git a/indra/llcommon/lleventcoro.cpp b/indra/llcommon/lleventcoro.cpp index 97a7ad04ad..067b5e6fbc 100644 --- a/indra/llcommon/lleventcoro.cpp +++ b/indra/llcommon/lleventcoro.cpp @@ -285,7 +285,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, // declare the future LLCoros::Future future = LLCoros::getFuture(promise); // wait for specified timeout - std::future_status status; + boost::fibers::future_status status; { LLCoros::TempStatus st(STRINGIZE("waiting for " << replyPump.getPump().getName() << " for " << timeout << "s")); @@ -296,7 +296,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, status = future.wait_for(std::chrono::milliseconds(long(timeout * 1000))); } // if the future is NOT yet ready, return timeoutResult instead - if (status == std::future_status::timeout) + if (status == boost::fibers::future_status::timeout) { LL_DEBUGS("lleventcoro") << "postAndSuspendWithTimeout(): coroutine " << listenerName << " timed out after " << timeout << " seconds," @@ -305,7 +305,7 @@ LLSD llcoro::postAndSuspendWithTimeout(const LLSD& event, } else { - llassert_always(status == std::future_status::ready); + llassert_always(status == boost::fibers::future_status::ready); // future is now ready, no more waiting LLSD value(future.get()); diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h index 0aa75c9b73..f396a71e6f 100644 --- a/indra/llcommon/llthreadsafequeue.h +++ b/indra/llcommon/llthreadsafequeue.h @@ -28,6 +28,9 @@ #define LL_LLTHREADSAFEQUEUE_H #include "llcoros.h" +#include LLCOROS_MUTEX_HEADER +#include +#include LLCOROS_CONDVAR_HEADER #include "llexception.h" #include "mutex.h" #include @@ -179,10 +182,10 @@ protected: size_t mCapacity; bool mClosed; - std::timed_mutex mLock; + boost::fibers::timed_mutex mLock; typedef std::unique_lock lock_t; - std::condition_variable_any mCapacityCond; - std::condition_variable_any mEmptyCond; + boost::fibers::condition_variable_any mCapacityCond; + boost::fibers::condition_variable_any mEmptyCond; enum pop_result { EMPTY, DONE, WAITING, POPPED }; // implementation logic, suitable for passing to tryLockUntil() diff --git a/indra/llcommon/workqueue.cpp b/indra/llcommon/workqueue.cpp index 9c434bf2a9..cf80ce0656 100644 --- a/indra/llcommon/workqueue.cpp +++ b/indra/llcommon/workqueue.cpp @@ -18,6 +18,7 @@ // external library headers // other Linden headers #include "llcoros.h" +#include LLCOROS_MUTEX_HEADER #include "llerror.h" #include "llexception.h" #include "stringize.h" diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index 4aab0a6537..e25a9ea7ef 100644 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -58,6 +58,7 @@ #include "boost/function.hpp" #include "llpounceable.h" #include "llcoros.h" +#include LLCOROS_MUTEX_HEADER const U32 MESSAGE_MAX_STRINGS_LENGTH = 64; const U32 MESSAGE_NUMBER_OF_HASH_BUCKETS = 8192; -- cgit v1.2.3 From 0fa6ff2b1f488165c2521ef83e8b78aa2981ac88 Mon Sep 17 00:00:00 2001 From: Ansariel Hiller Date: Tue, 16 Jan 2024 18:08:39 +0100 Subject: Undo re-ordering of autobuild.xml (#638) --- autobuild.xml | 1514 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 750 insertions(+), 764 deletions(-) diff --git a/autobuild.xml b/autobuild.xml index 6098b4ffdf..8d73bf1fb4 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1,20 +1,14 @@ + version + 1.3 + type + autobuild installables SDL - copyright - Copyright (C) 1997-2012 Sam Lantinga - description - Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. - license - lgpl - license_file - LICENSES/SDL.txt - name - SDL platforms linux64 @@ -30,21 +24,21 @@ linux64 + license + lgpl + license_file + LICENSES/SDL.txt + copyright + Copyright (C) 1997-2012 Sam Lantinga version 1.2.15 + name + SDL + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. apr_suite - copyright - Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. - description - Apache portable runtime project - license - apache - license_file - LICENSES/apr_suite.txt - name - apr_suite platforms darwin64 @@ -88,21 +82,21 @@ windows64 + license + apache + license_file + LICENSES/apr_suite.txt + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. version 1.7.2-e935465 + name + apr_suite + description + Apache portable runtime project boost - copyright - (see individual source files) - description - Boost C++ Libraries - license - boost 1.0 - license_file - LICENSES/boost.txt - name - boost platforms darwin64 @@ -146,21 +140,21 @@ windows64 + license + boost 1.0 + license_file + LICENSES/boost.txt + copyright + (see individual source files) version 1.81 + name + boost + description + Boost C++ Libraries bugsplat - copyright - Copyright 2003-2017, BugSplat - description - Bugsplat crash reporting package - license - Proprietary - license_file - LICENSES/BUGSPLAT_LICENSE.txt - name - bugsplat platforms darwin64 @@ -192,19 +186,21 @@ windows64 + license + Proprietary + license_file + LICENSES/BUGSPLAT_LICENSE.txt + copyright + Copyright 2003-2017, BugSplat version 4.0.3.0-527603a + name + bugsplat + description + Bugsplat crash reporting package colladadom - copyright - Copyright 2006 Sony Computer Entertainment Inc. - license - SCEA - license_file - LICENSES/collada.txt - name - colladadom platforms darwin64 @@ -248,19 +244,19 @@ windows64 + license + SCEA + license_file + LICENSES/collada.txt + copyright + Copyright 2006 Sony Computer Entertainment Inc. version 2.3.d1ef72a + name + colladadom cubemaptoequirectangular - copyright - Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com - license - MIT - license_file - LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt - name - cubemaptoequirectangular platforms darwin64 @@ -304,21 +300,19 @@ windows64 + license + MIT + license_file + LICENSES/CUBEMAPTOEQUIRECTANGULAR_LICENSE.txt + copyright + Copyright (c) 2017 Jaume Sanchez Elias, http://www.clicktorelease.com version 1.1.0 + name + cubemaptoequirectangular curl - copyright - Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). - description - Library for transferring data specified with URL syntax - license - curl - license_file - LICENSES/curl.txt - name - curl platforms darwin64 @@ -362,21 +356,21 @@ windows64 + license + curl + license_file + LICENSES/curl.txt + copyright + Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). version 7.54.1-5a4a82d + name + curl + description + Library for transferring data specified with URL syntax dbus_glib - copyright - Copyright (C) Red Hat Inc. - description - D-Bus bindings for glib - license - Academic Free License v. 2.1 - license_file - LICENSES/dbus-glib.txt - name - dbus_glib platforms linux64 @@ -392,21 +386,21 @@ linux64 + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + copyright + Copyright (C) Red Hat Inc. version 0.76 + name + dbus_glib + description + D-Bus bindings for glib dictionaries - copyright - Copyright 2014 Apache OpenOffice software - description - Spell checking dictionaries to bundled into the viewer - license - various open source - license_file - LICENSES/dictionaries.txt - name - dictionaries platforms common @@ -424,21 +418,21 @@ common + license + various open source + license_file + LICENSES/dictionaries.txt + copyright + Copyright 2014 Apache OpenOffice software version None + name + dictionaries + description + Spell checking dictionaries to bundled into the viewer dullahan - copyright - Copyright (c) 2017, Linden Research, Inc. - description - A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. - license - MPL - license_file - LICENSES/LICENSE.txt - name - dullahan platforms darwin64 @@ -470,21 +464,21 @@ windows64 + license + MPL + license_file + LICENSES/LICENSE.txt + copyright + Copyright (c) 2017, Linden Research, Inc. version 1.14.0.202310131404_118.4.1_g3dd6078_chromium-118.0.5993.54 + name + dullahan + description + A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. expat - copyright - Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. - description - Expat is an XML parser library written in C - license - expat - license_file - LICENSES/expat.txt - name - expat platforms darwin64 @@ -530,21 +524,21 @@ windows64 + license + expat + license_file + LICENSES/expat.txt + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. version 2.1.1.1f36d02 + name + expat + description + Expat is an XML parser library written in C fmodstudio - copyright - FMOD Studio by Firelight Technologies Pty Ltd. - description - FMOD Studio API - license - fmod - license_file - LICENSES/fmodstudio.txt - name - fmodstudio platforms darwin64 @@ -596,21 +590,21 @@ windows64 + license + fmod + license_file + LICENSES/fmodstudio.txt + copyright + FMOD Studio by Firelight Technologies Pty Ltd. version 2.02.13.578928 + name + fmodstudio + description + FMOD Studio API fontconfig - copyright - Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. - description - Fontconfig is a library for configuring and customizing font access. - license - bsd - license_file - LICENSES/fontconfig.txt - name - fontconfig platforms linux64 @@ -626,21 +620,21 @@ linux64 + license + bsd + license_file + LICENSES/fontconfig.txt + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. version 2.11.0 + name + fontconfig + description + Fontconfig is a library for configuring and customizing font access. freetype - copyright - Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. - description - Font rendering library - license - FreeType - license_file - LICENSES/freetype.txt - name - freetype platforms darwin64 @@ -686,21 +680,21 @@ windows64 + license + FreeType + license_file + LICENSES/freetype.txt + copyright + Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. version 2.4.4.4f739fa + name + freetype + description + Font rendering library glext - copyright - Copyright (c) 2007-2010 The Khronos Group Inc. - description - glext headers define function prototypes and constants for OpenGL extensions - license - Copyright (c) 2007-2010 The Khronos Group Inc. - license_file - LICENSES/glext.txt - name - glext platforms common @@ -718,21 +712,21 @@ common + license + Copyright (c) 2007-2010 The Khronos Group Inc. + license_file + LICENSES/glext.txt + copyright + Copyright (c) 2007-2010 The Khronos Group Inc. version 68 + name + glext + description + glext headers define function prototypes and constants for OpenGL extensions glh_linear - copyright - Copyright (c) 2000 Cass Everitt - description - glh - is a platform-indepenedent C++ OpenGL helper library - license - BSD - license_file - LICENSES/glh-linear.txt - name - glh_linear platforms common @@ -750,21 +744,21 @@ common + license + BSD + license_file + LICENSES/glh-linear.txt + copyright + Copyright (c) 2000 Cass Everitt version None + name + glh_linear + description + glh - is a platform-indepenedent C++ OpenGL helper library googlemock - copyright - Copyright 2008, Google Inc. - description - a library for writing and using C++ mock classes - license - BSD - license_file - LICENSES/gmock.txt - name - googlemock platforms darwin64 @@ -808,19 +802,21 @@ windows64 + license + BSD + license_file + LICENSES/gmock.txt + copyright + Copyright 2008, Google Inc. version 1.7.0.77bba00 + name + googlemock + description + a library for writing and using C++ mock classes gstreamer - copyright - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - license - LGPL - license_file - LICENSES/gstreamer.txt - name - gstreamer platforms linux64 @@ -836,19 +832,19 @@ linux64 + license + LGPL + license_file + LICENSES/gstreamer.txt + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> version 0.10.6.314267 + name + gstreamer gtk-atk-pango-glib - copyright - Copyright (various, see sources) - license - lgpl - license_file - LICENSES/gtk-atk-pango-glib.txt - name - gtk-atk-pango-glib platforms linux64 @@ -864,21 +860,19 @@ linux64 + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + copyright + Copyright (various, see sources) version 0.1 + name + gtk-atk-pango-glib havok-source - copyright - Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. - description - Havok source code for libs and demos - license - havok - license_file - LICENSES/havok.txt - name - havok-source platforms darwin64 @@ -926,19 +920,21 @@ windows64 + license + havok + license_file + LICENSES/havok.txt + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. version 2012.1-2 + name + havok-source + description + Havok source code for libs and demos jpegencoderbasic - copyright - Andreas Ritter, www.bytestrom.eu, 11/2009 - license - NONE - license_file - LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt - name - jpegencoderbasic platforms darwin64 @@ -982,21 +978,19 @@ windows64 + license + NONE + license_file + LICENSES/JPEG_ENCODER_BASIC_LICENSE.txt + copyright + Andreas Ritter, www.bytestrom.eu, 11/2009 version 1.0 + name + jpegencoderbasic jpeglib - copyright - Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. - description - JPEG encoding, decoding library - license - jpeglib - license_file - LICENSES/jpeglib.txt - name - jpeglib platforms darwin64 @@ -1042,21 +1036,21 @@ windows64 + license + jpeglib + license_file + LICENSES/jpeglib.txt + copyright + Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. version 8c.7846234 + name + jpeglib + description + JPEG encoding, decoding library jsoncpp - copyright - Copyright (c) 2007-2010 Baptiste Lepilleur - description - jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. - license - public domain - license_file - LICENSES/jsoncpp.txt - name - jsoncpp platforms darwin64 @@ -1102,21 +1096,21 @@ windows64 + license + public domain + license_file + LICENSES/jsoncpp.txt + copyright + Copyright (c) 2007-2010 Baptiste Lepilleur version 0.5.0.bc46e62 + name + jsoncpp + description + jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. kdu - copyright - Kakadu software - description - JPEG2000 library by Kakadu - license - Kakadu - license_file - LICENSES/kdu.txt - name - kdu platforms darwin64 @@ -1168,21 +1162,21 @@ windows64 + license + Kakadu + license_file + LICENSES/kdu.txt + copyright + Kakadu software version 7.10.4.539108 + name + kdu + description + JPEG2000 library by Kakadu libhunspell - copyright - See hunspell.txt - description - Spell checking library - license - LGPL - license_file - LICENSES/hunspell.txt - name - libhunspell platforms darwin64 @@ -1228,21 +1222,21 @@ windows64 + license + LGPL + license_file + LICENSES/hunspell.txt + copyright + See hunspell.txt version 1.3.2.650fb94 + name + libhunspell + description + Spell checking library libndofdev - copyright - Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. - description - 3DConnexion SDK - license - BSD - license_file - LICENSES/libndofdev.txt - name - libndofdev platforms darwin64 @@ -1274,21 +1268,21 @@ windows64 + license + BSD + license_file + LICENSES/libndofdev.txt + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. version 0.1.8e9edc7 + name + libndofdev + description + 3DConnexion SDK libpng - copyright - Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson - description - PNG Reference library - license - libpng - license_file - LICENSES/libpng.txt - name - libpng platforms darwin64 @@ -1332,21 +1326,21 @@ windows64 + license + libpng + license_file + LICENSES/libpng.txt + copyright + Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson version 1.6.38-ca06e99 + name + libpng + description + PNG Reference library libuuid - copyright - Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> - description - OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). - license - UUID - license_file - LICENSES/uuid.txt - name - libuuid platforms linux64 @@ -1362,21 +1356,21 @@ linux64 + license + UUID + license_file + LICENSES/uuid.txt + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> version 1.6.2 + name + libuuid + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). libxml2 - copyright - Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. - description - Libxml2 is the XML C parser and toolkit developed for the Gnome project. - license - mit - license_file - LICENSES/libxml2.txt - name - libxml2 platforms darwin64 @@ -1422,21 +1416,21 @@ windows64 + license + mit + license_file + LICENSES/libxml2.txt + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. version 2.9.4.7476681 + name + libxml2 + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. llappearance_utility - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - description - Linden Lab appearance utility for server-side avatar baking services. - license - Proprietary - license_file - LICENSES/llappearanceutility.txt - name - llappearance_utility platforms linux @@ -1452,20 +1446,21 @@ linux + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + copyright + Copyright (c) 2000-2012, Linden Research, Inc. version 0.0.1 + name + llappearance_utility + description + Linden Lab appearance utility for server-side avatar baking services. llca - copyright - Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. - - license - mit - license_file - LICENSES/ca-license.txt - name - llca platforms common @@ -1483,19 +1478,20 @@ common + license + mit + license_file + LICENSES/ca-license.txt + copyright + Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. + version 202310121530.0 + name + llca llphysicsextensions_source - copyright - Copyright (c) 2010, Linden Research, Inc. - license - internal - license_file - LICENSES/llphysicsextensions.txt - name - llphysicsextensions_source platforms darwin64 @@ -1530,22 +1526,6 @@ name linux64 - windows - - archive - - creds - github - hash - 2e6a66da6071253ae888839cfab59d3f5c1b8b4c - hash_algorithm - sha1 - url - https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/144851462 - - name - windows - windows64 archive @@ -1563,19 +1543,19 @@ windows64 - version - 1.0.479d20a - - llphysicsextensions_stub - - copyright - Copyright (c) 2010, Linden Research, Inc. license internal license_file LICENSES/llphysicsextensions.txt + copyright + Copyright (c) 2010, Linden Research, Inc. + version + 1.0.479d20a name - llphysicsextensions_stub + llphysicsextensions_source + + llphysicsextensions_stub + platforms darwin64 @@ -1615,19 +1595,19 @@ windows + license + internal + license_file + LICENSES/llphysicsextensions.txt + copyright + Copyright (c) 2010, Linden Research, Inc. version 1.0.542456 + name + llphysicsextensions_stub llphysicsextensions_tpv - copyright - Copyright (c) 2010, Linden Research, Inc. - license - internal - license_file - LICENSES/HavokSublicense.pdf - name - llphysicsextensions_tpv platforms darwin64 @@ -1667,17 +1647,19 @@ windows + license + internal + license_file + LICENSES/HavokSublicense.pdf + copyright + Copyright (c) 2010, Linden Research, Inc. version 1.0.561752 + name + llphysicsextensions_tpv mesa - license - mesa - license_file - LICENSES/mesa.txt - name - mesa platforms linux @@ -1693,23 +1675,17 @@ linux + license + mesa + license_file + LICENSES/mesa.txt version 7.11.1.297294 + name + mesa meshoptimizer - canonical_repo - https://bitbucket.org/lindenlab/3p-meshoptimizer - copyright - Copyright (c) 2016-2021 Arseny Kapoulkine - description - Meshoptimizer. Mesh optimization library. - license - meshoptimizer - license_file - LICENSES/meshoptimizer.txt - name - meshoptimizer platforms darwin64 @@ -1741,8 +1717,20 @@ windows64 + license + meshoptimizer + license_file + LICENSES/meshoptimizer.txt + copyright + Copyright (c) 2016-2021 Arseny Kapoulkine version 160 + name + meshoptimizer + canonical_repo + https://bitbucket.org/lindenlab/3p-meshoptimizer + description + Meshoptimizer. Mesh optimization library. mikktspace @@ -1802,18 +1790,6 @@ minizip-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-minizip-ng - copyright - This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - description - minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. - license - minizip-ng - license_file - LICENSES/minizip-ng.txt - name - minizip-ng platforms darwin64 @@ -1859,22 +1835,23 @@ windows64 + license + minizip-ng + license_file + LICENSES/minizip-ng.txt + copyright + This project uses the zlib license. Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 3.0.2.3e9876e + name + minizip-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-minizip-ng + description + minizip-ng is a zip manipulation library. Based on work of Gilles Vollant. nghttp2 - copyright - Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa -Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors - description - Library providing HTTP 2 support for libcurl - license - MIT - license_file - LICENSES/nghttp2.txt - name - nghttp2 platforms darwin64 @@ -1920,23 +1897,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - source_type - hg + license + MIT + license_file + LICENSES/nghttp2.txt + copyright + Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors version 1.40.0.b1526c6 + name + nghttp2 + description + Library providing HTTP 2 support for libcurl + source_type + hg nvapi - copyright - Copyright © 2012 NVIDIA Corporation. All rights reserved. - description - NVAPI provides an interface to NVIDIA devices. - license - NVIDIA Corporation Software License Agreement – NVAPI SDK - license_file - LICENSES/NVAPI_SDK_License_Agreement.pdf - name - nvapi platforms windows64 @@ -1954,21 +1932,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + NVIDIA Corporation Software License Agreement – NVAPI SDK + license_file + LICENSES/NVAPI_SDK_License_Agreement.pdf + copyright + Copyright © 2012 NVIDIA Corporation. All rights reserved. version 352.aac0e19 - - ogg_vorbis - - copyright - Copyright (c) 2002, Xiph.org Foundation - description - Audio encoding library - license - ogg-vorbis - license_file - LICENSES/ogg-vorbis.txt name - ogg_vorbis + nvapi + description + NVAPI provides an interface to NVIDIA devices. + + ogg_vorbis + platforms darwin64 @@ -2012,96 +1990,96 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + copyright + Copyright (c) 2002, Xiph.org Foundation version 1.3.3-1.3.6.e4101b6 + name + ogg_vorbis + description + Audio encoding library open-libndofdev - copyright - Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) - description - Open Source replacement for 3DConnection SDK license BSD license_file LICENSES/libndofdev.txt - name - open-libndofdev + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) version 0.3 + name + open-libndofdev + description + Open Source replacement for 3DConnection SDK openal - copyright - Copyright (C) 1999-2007 by authors. - description - OpenAL Soft is a software implementation of the OpenAL 3D audio API. - license - LGPL2 - license_file - LICENSES/openal-soft.txt - name - openal platforms - darwin64 + linux64 archive hash - 4edaef5f03a1122eae8467c4a04d9caccaaaf847 + e0fbc4874acc4167a6e2b6489fbb8258d98fd665 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst name - darwin64 + linux64 - linux64 + windows64 archive hash - e0fbc4874acc4167a6e2b6489fbb8258d98fd665 + 6ae3b5310eb1988741bc55416681ca9d64f76f85 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-linux64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst name - linux64 + windows64 - windows64 + darwin64 archive hash - 6ae3b5310eb1988741bc55416681ca9d64f76f85 + 4edaef5f03a1122eae8467c4a04d9caccaaaf847 hash_algorithm sha1 url - https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-windows64-18e315c.tar.zst + https://github.com/secondlife/3p-openal-soft/releases/download/v1.23.1-18e315c/openal-1.23.1-darwin64-18e315c.tar.zst name - windows64 + darwin64 + license + LGPL2 + license_file + LICENSES/openal-soft.txt + copyright + Copyright (C) 1999-2007 by authors. version 1.23.1 + name + openal + description + OpenAL Soft is a software implementation of the OpenAL 3D audio API. openjpeg - copyright - Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; - description - The OpenJPEG library is an open-source JPEG 2000 codec written in C language. - license - BSD - license_file - LICENSES/openjpeg.txt - name - openjpeg platforms darwin64 @@ -2147,21 +2125,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + BSD + license_file + LICENSES/openjpeg.txt + copyright + Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; version 2.5.0.ea12248 + name + openjpeg + description + The OpenJPEG library is an open-source JPEG 2000 codec written in C language. openssl - copyright - Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - description - Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library - license - openssl - license_file - LICENSES/openssl.txt - name - openssl platforms darwin64 @@ -2207,21 +2185,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + openssl + license_file + LICENSES/openssl.txt + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) version 1.1.1q.de53f55 + name + openssl + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library pcre - copyright - Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. - description - PCRE Perl-compatible regular expression library - license - bsd - license_file - LICENSES/pcre-license.txt - name - pcre platforms darwin64 @@ -2265,21 +2243,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + bsd + license_file + LICENSES/pcre-license.txt + copyright + Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. version 8.35.979fd86 + name + pcre + description + PCRE Perl-compatible regular expression library slvoice - copyright - 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) - description - Vivox SDK components - license - Mixed - license_file - LICENSES/vivox_licenses.txt - name - slvoice platforms darwin64 @@ -2327,19 +2305,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + Mixed + license_file + LICENSES/vivox_licenses.txt + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) version 4.10.0000.32327.5fc3fe7c.571099 + name + slvoice + description + Vivox SDK components threejs - copyright - Copyright © 2010-2021 three.js authors - license - MIT - license_file - LICENSES/THREEJS_LICENSE.txt - name - threejs platforms darwin64 @@ -2383,8 +2363,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + MIT + license_file + LICENSES/THREEJS_LICENSE.txt + copyright + Copyright © 2010-2021 three.js authors version 0.132.2 + name + threejs tinygltf @@ -2424,18 +2412,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tracy - canonical_repo - https://bitbucket.org/lindenlab/3p-tracy - copyright - Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) - description - Tracy Profiler Library - license - bsd - license_file - LICENSES/tracy_license.txt - name - tracy platforms darwin64 @@ -2465,6 +2441,20 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + bsd + license_file + LICENSES/tracy_license.txt + copyright + Copyright (c) 2017-2022, Bartosz Taudul (wolf@nereid.pl) + version + v0.8.1.235e98f + name + tracy + canonical_repo + https://bitbucket.org/lindenlab/3p-tracy + description + Tracy Profiler Library source https://bitbucket.org/lindenlab/3p-tracy source_type @@ -2474,16 +2464,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors tut - copyright - Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek - description - TUT is a small and portable unit test framework for C++. - license - bsd - license_file - LICENSES/tut.txt - name - tut platforms common @@ -2501,21 +2481,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors common + license + bsd + license_file + LICENSES/tut.txt + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek version 2008.11.30 + name + tut + description + TUT is a small and portable unit test framework for C++. uriparser - copyright - Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> - description - uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. - license - New BSD license - license_file - LICENSES/uriparser.txt - name - uriparser platforms darwin64 @@ -2561,21 +2541,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + New BSD license + license_file + LICENSES/uriparser.txt + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> version 0.9.4 + name + uriparser + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. viewer-manager - copyright - Copyright (c) 2000-2012, Linden Research, Inc. - description - Linden Lab Viewer Management Process suite. - license - viewerlgpl - license_file - LICENSE - name - viewer-manager platforms darwin64 @@ -2621,23 +2601,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 - source - https://bitbucket.org/lindenlab/vmp-standalone - source_type - hg + license + viewerlgpl + license_file + LICENSE + copyright + Copyright (c) 2000-2012, Linden Research, Inc. version 3.0-08bf5ee + name + viewer-manager + description + Linden Lab Viewer Management Process suite. + source + https://bitbucket.org/lindenlab/vmp-standalone + source_type + hg vlc-bin - copyright - Copyright (C) 1998-2016 VLC authors and VideoLAN - license - GPL2 - license_file - LICENSES/vlc.txt - name - vlc-bin platforms darwin64 @@ -2669,23 +2651,19 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + GPL2 + license_file + LICENSES/vlc.txt + copyright + Copyright (C) 1998-2016 VLC authors and VideoLAN version 3.0.16.c219a5d + name + vlc-bin - vulkan_gltf + xmlrpc-epi - canonical_repo - https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr - copyright - Copyright (c) 2018 Sascha Willems - description - Vulkan GLTF Sample Implementation - license - Copyright (c) 2018 Sascha Willems - license_file - LICENSES/vulkan_gltf.txt - name - vulkan_gltf platforms darwin64 @@ -2693,53 +2671,71 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8cff2060843db3db788511ee34a8e8cc + aa12611374876196b3ebb6bda8d419a697217b8b + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst name darwin64 - windows + linux64 archive hash - 58eea384be49ba756ce9c5e66669540b + ad0c8b41ee4b4de216382bec46ee1c25962a3f12 + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst name - windows + linux64 windows64 archive hash - 79b6a11622c2f83cfc2b7cd1fafb867b + e53fd38c14b8c47c7c84dead8a1b211bb8be170c + hash_algorithm + sha1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 + https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst name windows64 + license + xmlrpc-epi + license_file + LICENSES/xmlrpc-epi.txt + copyright + Copyright: (C) 2000 Epinions, Inc. version - 1 + 0.54.1.8a05acf + name + xmlrpc-epi + description + XMLRPC Library - xmlrpc-epi + vulkan_gltf + canonical_repo + https://bitbucket.org/lindenlab/3p-vulkan-gltf-pbr copyright - Copyright: (C) 2000 Epinions, Inc. + Copyright (c) 2018 Sascha Willems description - XMLRPC Library + Vulkan GLTF Sample Implementation license - xmlrpc-epi + Copyright (c) 2018 Sascha Willems license_file - LICENSES/xmlrpc-epi.txt + LICENSES/vulkan_gltf.txt name - xmlrpc-epi + vulkan_gltf platforms darwin64 @@ -2747,59 +2743,43 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - aa12611374876196b3ebb6bda8d419a697217b8b - hash_algorithm - sha1 + 8cff2060843db3db788511ee34a8e8cc url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-darwin64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101316/891509/vulkan_gltf-1-darwin64-572743.tar.bz2 name darwin64 - linux64 + windows archive hash - ad0c8b41ee4b4de216382bec46ee1c25962a3f12 - hash_algorithm - sha1 + 58eea384be49ba756ce9c5e66669540b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-linux64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101318/891520/vulkan_gltf-1-windows-572743.tar.bz2 name - linux64 + windows windows64 archive hash - e53fd38c14b8c47c7c84dead8a1b211bb8be170c - hash_algorithm - sha1 + 79b6a11622c2f83cfc2b7cd1fafb867b url - https://github.com/secondlife/3p-xmlrpc-epi/releases/download/v0.54.1.8a05acf/xmlrpc_epi-0.54.1.8a05acf-windows64-8a05acf.tar.zst + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/101319/891521/vulkan_gltf-1-windows64-572743.tar.bz2 name windows64 version - 0.54.1.8a05acf + 1 xxhash - copyright - Copyright (c) 2012-2021 Yann Collet - description - xxHash Library - license - xxhash - license_file - LICENSES/xxhash.txt - name - xxhash platforms common @@ -2857,23 +2837,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + xxhash + license_file + LICENSES/xxhash.txt + copyright + Copyright (c) 2012-2021 Yann Collet version 0.8.1.7501c90 + name + xxhash + description + xxHash Library zlib-ng - canonical_repo - https://bitbucket.org/lindenlab/3p-zlib-ng - copyright - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler - description - zlib data compression library for the next generation systems - license - zlib-ng - license_file - LICENSES/zlib-ng.txt - name - zlib-ng platforms darwin64 @@ -2919,24 +2897,24 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors windows64 + license + zlib-ng + license_file + LICENSES/zlib-ng.txt + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler version 1.2.11.zlib-ng.32fd361 + name + zlib-ng + canonical_repo + https://bitbucket.org/lindenlab/3p-zlib-ng + description + zlib data compression library for the next generation systems package_description - canonical_repo - https://github.com/secondlife/viewer - copyright - Copyright (c) 2020, Linden Research, Inc. - description - Second Life Viewer - license - LGPL - license_file - docs/LICENSE-source.txt - name - Second Life Viewer platforms common @@ -2945,9 +2923,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfo - build - - configure command @@ -2958,7 +2933,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - + + + build + name RelWithDebInfo @@ -2967,10 +2945,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure - arguments - - ../indra - command cmake options @@ -2979,16 +2953,17 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - + + arguments + + ../indra + name RelWithDebInfoOS Release - build - - configure command @@ -2999,7 +2974,10 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=TRUE - + + + build + name Release @@ -3008,10 +2986,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors configure - arguments - - ../indra - command cmake options @@ -3020,7 +2994,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE -DROOT_PROJECT_NAME:STRING=SecondLife -DINSTALL_PROPRIETARY=FALSE - + + arguments + + ../indra + name ReleaseOS @@ -3031,12 +3009,22 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors darwin64 - build_directory - build-darwin-x86_64 configurations RelWithDebInfo + configure + + options + + -G + Xcode + + arguments + + ../indra + + build command @@ -3048,19 +3036,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - - - configure - - arguments - - ../indra - - options - - -G - Xcode - + default True @@ -3069,6 +3045,14 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfoOS + configure + + options + + -G + Xcode + + build command @@ -3080,21 +3064,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + + name + RelWithDebInfoOS + + Release + configure options -G Xcode - + + arguments + + ../indra + - name - RelWithDebInfoOS - - Release - build command @@ -3106,25 +3094,21 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - + + name + Release + + ReleaseOS + configure - arguments - - ../indra - options -G Xcode - + - name - Release - - ReleaseOS - build command @@ -3136,48 +3120,40 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -project SecondLife.xcodeproj -parallelizeTargets - - - configure - - options - - -G - Xcode - + name ReleaseOS + build_directory + build-darwin-x86_64 name darwin64 linux64 - build_directory - build-linux-x86_64 configurations Release - build - - command - ninja - configure - arguments - - ../indra - options -G Ninja -DLL_TESTS=Off - + + arguments + + ../indra + + + build + + command + ninja default True @@ -3186,11 +3162,6 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors ReleaseOS - build - - command - ninja - configure options @@ -3198,7 +3169,12 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors -G Ninja -DLL_TESTS=Off - + + + build + + command + ninja name ReleaseOS @@ -3212,44 +3188,44 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors default + build_directory + build-linux-x86_64 name linux64 windows - build_directory - build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE configurations RelWithDebInfo - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + arguments - SecondLife.sln - + ..\indra + + + build + command devenv options /build RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - - - configure - + arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + SecondLife.sln + default True @@ -3258,12 +3234,25 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors RelWithDebInfoOS - build + configure + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -A + ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + arguments - SecondLife.sln - + ..\indra + + + build + command msbuild.exe options @@ -3274,69 +3263,70 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - + + arguments + + SecondLife.sln + + name + RelWithDebInfoOS + + Release + configure - arguments - - ..\indra - options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - + + arguments + + ..\indra + - name - RelWithDebInfoOS - - Release - build - arguments - - SecondLife.sln - command devenv options /build Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + + arguments + + SecondLife.sln + + name + Release + + ReleaseOS + configure - arguments - - ..\indra - options -G ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} -A ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - + -DUNATTENDED:BOOL=ON + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DUSE_OPENAL:BOOL=ON + + arguments + + ..\indra + - name - Release - - ReleaseOS - build - arguments - - SecondLife.sln - command msbuild.exe options @@ -3347,40 +3337,36 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors /p:useenv=true /verbosity:minimal /p:VCBuildAdditionalOptions= /incremental - - - configure - + arguments - ..\indra - - options - - -G - ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} - -A - ${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} - -DUNATTENDED:BOOL=ON - -DINSTALL_PROPRIETARY=FALSE - -DUSE_KDU=FALSE - -DUSE_OPENAL:BOOL=ON - + SecondLife.sln + name ReleaseOS + build_directory + build-vc${AUTOBUILD_VSVER|170}-$AUTOBUILD_ADDRSIZE name windows + license + LGPL + license_file + docs/LICENSE-source.txt + copyright + Copyright (c) 2020, Linden Research, Inc. version_file newview/viewer_version.txt + name + Second Life Viewer + canonical_repo + https://github.com/secondlife/viewer + description + Second Life Viewer - type - autobuild - version - 1.3 -- cgit v1.2.3 From bf43a8574c394c27bad1b0b08c88cad308a55572 Mon Sep 17 00:00:00 2001 From: Rye Mutt Date: Tue, 16 Jan 2024 12:09:26 -0500 Subject: Fix failure to optimize away alpha channel on some GLTF upload paths (#606) Co-authored-by: RunitaiLinden --- indra/newview/lltinygltfhelper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/newview/lltinygltfhelper.cpp b/indra/newview/lltinygltfhelper.cpp index 999be07dba..5b75db37d0 100644 --- a/indra/newview/lltinygltfhelper.cpp +++ b/indra/newview/lltinygltfhelper.cpp @@ -178,6 +178,7 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny { rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component); rawImage->verticalFlip(); + rawImage->optimizeAwayAlpha(); } return rawImage; -- cgit v1.2.3 From a67dde1f16c144247cff0b765201e64f8f8e75c2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 16 Jan 2024 02:58:07 +0200 Subject: SL-20783 Fix excessive control messages controlFlagsDirty() gets set every frame as an example if 'w' is held, causing viewer to send updates each frame, which can be excessive --- indra/newview/llappviewer.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 2599b1e4a0..401476e177 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4681,16 +4681,23 @@ void LLAppViewer::idle() // When appropriate, update agent location to the simulator. F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); F32 agent_force_update_time = mLastAgentForceUpdate + agent_update_time; - BOOL force_update = gAgent.controlFlagsDirty() - || (mLastAgentControlFlags != gAgent.getControlFlags()) - || (agent_force_update_time > (1.0f / (F32) AGENT_FORCE_UPDATES_PER_SECOND)); - if (force_update || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) + bool timed_out = agent_update_time > (1.0f / (F32)AGENT_UPDATES_PER_SECOND); + BOOL force_send = + // if there is something to send + (gAgent.controlFlagsDirty() && timed_out) + // if something changed + || (mLastAgentControlFlags != gAgent.getControlFlags()) + // keep alive + || (agent_force_update_time > (1.0f / (F32) AGENT_FORCE_UPDATES_PER_SECOND)); + // timing out doesn't warranty that an update will be sent, + // just that it will be checked. + if (force_send || timed_out) { LL_PROFILE_ZONE_SCOPED_CATEGORY_NETWORK; // Send avatar and camera info mLastAgentControlFlags = gAgent.getControlFlags(); - mLastAgentForceUpdate = force_update ? 0 : agent_force_update_time; - send_agent_update(force_update); + mLastAgentForceUpdate = force_send ? 0 : agent_force_update_time; + send_agent_update(force_send); agent_update_timer.reset(); } } -- cgit v1.2.3 From 71bcc8977646072d4fbf3a2cd49c7a4ee1b4ea78 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 16 Jan 2024 22:04:18 +0200 Subject: SL-20669 Material editor uses incorect blank normal maps --- indra/newview/llmaterialeditor.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index db9589666c..34f2f77d25 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -43,6 +43,7 @@ #include "llnotificationsutil.h" #include "lltexturectrl.h" #include "lltrans.h" +#include "llviewercontrol.h" #include "llviewermenufile.h" #include "llviewertexture.h" #include "llsdutil.h" @@ -448,6 +449,10 @@ BOOL LLMaterialEditor::postBuild() mEmissiveTextureCtrl->setCommitCallback(boost::bind(&LLMaterialEditor::onCommitTexture, this, _1, _2, MATERIAL_EMISIVE_TEX_DIRTY)); mNormalTextureCtrl->setCommitCallback(boost::bind(&LLMaterialEditor::onCommitTexture, this, _1, _2, MATERIAL_NORMAL_TEX_DIRTY)); + // should match normal textures from mBumpyTextureCtrl + mNormalTextureCtrl->setDefaultImageAssetID(LLUUID(gSavedSettings.getString("DefaultObjectNormalTexture"))); + mNormalTextureCtrl->setBlankImageAssetID(LLUUID(gSavedSettings.getString("DefaultBlankNormalTexture"))); + if (mIsOverride) { // Live editing needs a recovery mechanism on cancel -- cgit v1.2.3 From ae91ae43a51c58cc496f3947921fbf886c6be86e Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 15 Jan 2024 23:20:24 +0100 Subject: SL-20795 Part of previously typed emojis disappear in the 'Save settings as a preset...' option of the 'Preferences' floater --- indra/llcommon/llstring.cpp | 2 -- indra/llrender/llfontfreetype.cpp | 11 ++++++++++- indra/llrender/llfontgl.cpp | 6 +++--- indra/llrender/llfontgl.h | 8 ++++---- indra/llui/llbutton.cpp | 2 +- indra/llui/llfolderviewitem.cpp | 10 +++++----- indra/llui/lllineeditor.cpp | 2 +- indra/llui/llview.cpp | 3 +-- indra/newview/llfloateremojipicker.cpp | 22 ++++------------------ indra/newview/llfloateruipreview.cpp | 8 ++++---- indra/newview/llpanelemojicomplete.cpp | 8 ++++---- indra/newview/lltextureview.cpp | 3 +-- indra/newview/llviewerwindow.cpp | 3 +-- indra/newview/llworldmapview.cpp | 3 +-- .../default/xui/en/panel_preferences_graphics1.xml | 2 +- 15 files changed, 41 insertions(+), 52 deletions(-) diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 81b0207038..17d69351ec 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -339,8 +339,6 @@ S32 wchar_utf8_length(const llwchar wc) { if (wc < 0x80) { - // This case will also catch negative values which are - // technically invalid. return 1; } else if (wc < 0x800) diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index ca9f2ed778..d87fb5245c 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -665,7 +665,16 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) co load_flags |= FT_LOAD_COLOR; } - llassert_always(! FT_Load_Glyph(mFTFace, glyph_index, load_flags) ); + FT_Error error = FT_Load_Glyph(mFTFace, glyph_index, load_flags); + if (FT_Err_Ok != error) + { + std::string message = llformat( + "Error %d (%s) loading glyph %u: bitmap_type=%u, load_flags=%d", + error, FT_Error_String(error), glyph_index, bitmap_type, load_flags); + LL_WARNS_ONCE() << message << LL_ENDL; + error = FT_Load_Glyph(mFTFace, glyph_index, load_flags ^ FT_LOAD_COLOR); + llassert_always_msg(FT_Err_Ok == error, message.c_str()); + } llassert_always(! FT_Render_Glyph(mFTFace->glyph, gFontRenderMode) ); diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index f0b89f9a1d..53661b6a63 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -420,7 +420,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons S32 LLFontGL::render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color) const { - return render(text, begin_offset, x, y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); + return render(text, begin_offset, x, y, color, LEFT, BASELINE, NORMAL, NO_SHADOW); } S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const @@ -430,12 +430,12 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const { - return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE, FALSE); + return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW); } S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow) const { - return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow, S32_MAX, S32_MAX, NULL, FALSE, FALSE); + return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow); } // font metrics - override for LLFontFreetype that returns units of virtual pixels diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index a9d512f7ce..f6ec416c8b 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -99,7 +99,7 @@ public: S32 max_chars = S32_MAX, F32* right_x=NULL, BOOL use_ellipses = FALSE, - BOOL use_color = FALSE) const; + BOOL use_color = TRUE) const; S32 render(const LLWString &text, S32 begin_offset, const LLRectf& rect, @@ -109,7 +109,7 @@ public: S32 max_chars = S32_MAX, F32* right_x=NULL, BOOL use_ellipses = FALSE, - BOOL use_color = FALSE) const; + BOOL use_color = TRUE) const; S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, @@ -119,12 +119,12 @@ public: S32 max_chars = S32_MAX, S32 max_pixels = S32_MAX, F32* right_x=NULL, BOOL use_ellipses = FALSE, - BOOL use_color = FALSE) const; + BOOL use_color = TRUE) const; S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color) const; // renderUTF8 does a conversion, so is slower! - S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const; + S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars = S32_MAX, S32 max_pixels = S32_MAX, F32* right_x = NULL, BOOL use_ellipses = FALSE, BOOL use_color = TRUE) const; S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const; S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const; diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 5ce1cbd63c..9ef019840a 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -68,7 +68,7 @@ LLButton::Params::Params() label_shadow("label_shadow", true), auto_resize("auto_resize", false), use_ellipses("use_ellipses", false), - use_font_color("use_font_color", false), + use_font_color("use_font_color", true), image_unselected("image_unselected"), image_selected("image_selected"), image_hover_selected("image_hover_selected"), diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index c47f4c60e3..bc9469cfad 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -890,7 +890,7 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y // font->renderUTF8(mLabel, 0, x, y, color, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/TRUE, /*use_color*/FALSE); + S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/TRUE); } void LLFolderViewItem::draw() @@ -999,7 +999,7 @@ void LLFolderViewItem::draw() { suffix_font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, &right_x, /*use_ellipses*/FALSE, /*use_color*/FALSE ); + S32_MAX, S32_MAX, &right_x); } //--------------------------------------------------------------------------------// @@ -1013,7 +1013,7 @@ void LLFolderViewItem::draw() F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD; font->renderUTF8(combined_string, filter_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - filter_string_length, S32_MAX, &right_x, FALSE, FALSE); + filter_string_length, S32_MAX, &right_x); } else { @@ -1024,7 +1024,7 @@ void LLFolderViewItem::draw() F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD; font->renderUTF8(mLabel, filter_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - label_filter_length, S32_MAX, &right_x, FALSE, FALSE); + label_filter_length, S32_MAX, &right_x); } S32 suffix_filter_length = label_filter_length > 0 ? filter_string_length - label_filter_length : filter_string_length; @@ -1035,7 +1035,7 @@ void LLFolderViewItem::draw() F32 yy = (F32)getRect().getHeight() - suffix_font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD; suffix_font->renderUTF8(mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - suffix_filter_length, S32_MAX, &right_x, FALSE, FALSE); + suffix_filter_length, S32_MAX, &right_x); } } diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index bd6fd5b79e..e032b4b8c2 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -2107,7 +2107,7 @@ void LLLineEditor::draw() LLFontGL::NO_SHADOW, S32_MAX, mTextRightEdge - ll_round(rendered_pixels_right), - &rendered_pixels_right, FALSE); + &rendered_pixels_right); } // Draw children (border) LLView::draw(); diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 7b6661a519..0afccef735 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1336,8 +1336,7 @@ void LLView::drawDebugRect() std::string debug_text = llformat("%s (%d x %d)", getName().c_str(), debug_rect.getWidth(), debug_rect.getHeight()); LLFontGL::getFontSansSerifSmall()->renderUTF8(debug_text, 0, (F32)x, (F32)y, border_color, - LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); } } LLUI::popMatrix(); diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index abc5165f1e..ecfc4e7b41 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -102,11 +102,7 @@ public: LLFontGL::VCENTER, // valign LLFontGL::NORMAL, // style LLFontGL::DROP_SHADOW_SOFT, // shadow - mText.size(), // max_chars - S32_MAX, // max_pixels - nullptr, // right_x - false, // use_ellipses - true); // use_color + mText.size()); // max_chars } virtual void updatePanel(BOOL allow_modify) override {} @@ -144,11 +140,7 @@ public: LLFontGL::VCENTER, // valign LLFontGL::NORMAL, // style LLFontGL::DROP_SHADOW_SOFT, // shadow - 1, // max_chars - S32_MAX, // max_pixels - nullptr, // right_x - false, // use_ellipses - true); // use_color + 1); // max_chars } virtual void updatePanel(BOOL allow_modify) override {} @@ -225,10 +217,7 @@ protected: LLFontGL::NORMAL, // style LLFontGL::DROP_SHADOW_SOFT, // shadow 1, // max_chars - max_pixels, // max_pixels - nullptr, // right_x - false, // use_ellipses - true); // use_color + max_pixels); // max_pixels } void drawName(std::string name, F32 x, F32 y, S32 max_pixels, LLColor4& color) @@ -244,10 +233,7 @@ protected: LLFontGL::NORMAL, // style LLFontGL::DROP_SHADOW_SOFT, // shadow -1, // max_chars - max_pixels, // max_pixels - nullptr, // right_x - true, // use_ellipses - false); // use_color + max_pixels); // max_pixels } private: diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 6032064c31..db69c3e2c3 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1601,7 +1601,7 @@ void LLOverlapPanel::draw() LLUI::translate(5,getRect().getHeight()-20); // translate to top-5,left-5 LLView::sDrawPreviewHighlights = FALSE; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); } else { @@ -1619,7 +1619,7 @@ void LLOverlapPanel::draw() std::string current_selection = std::string(current_selection_text + LLView::sPreviewClickedElement->getName() + " (no elements overlap)"); S32 text_width = LLFontGL::getFontSansSerifSmall()->getWidth(current_selection) + 10; LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection, 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); // widen panel enough to fit this text LLRect rect = getRect(); setRect(LLRect(rect.mLeft,rect.mTop,rect.getWidth() < text_width ? rect.mLeft + text_width : rect.mRight,rect.mTop)); @@ -1685,7 +1685,7 @@ void LLOverlapPanel::draw() // draw currently-selected element at top of overlappers LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text + LLView::sPreviewClickedElement->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); LLUI::translate(0,-mSpacing-LLView::sPreviewClickedElement->getRect().getHeight()); // skip spacing distance + height LLView::sPreviewClickedElement->draw(); @@ -1700,7 +1700,7 @@ void LLOverlapPanel::draw() // draw name LLUI::translate(0,-mSpacing); LLFontGL::getFontSansSerifSmall()->renderUTF8(overlapper_text + viewp->getName(), 0, 0, 0, text_color, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); // draw element LLUI::translate(0,-mSpacing-viewp->getRect().getHeight()); // skip spacing distance + height diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 46f455aede..e6e3a10e13 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -118,7 +118,7 @@ void LLPanelEmojiComplete::draw() LLWString text(1, mEmojis[curIdx].Character); mIconFont->render(text, 0, iconCenterX, iconCenterY, LLColor4::white, LLFontGL::HCENTER, LLFontGL::VCENTER, LLFontGL::NORMAL, - LLFontGL::DROP_SHADOW_SOFT, 1, S32_MAX, nullptr, false, true); + LLFontGL::DROP_SHADOW_SOFT, 1); if (mVertical) { const std::string& shortCode = mEmojis[curIdx].String; @@ -129,7 +129,7 @@ void LLPanelEmojiComplete::draw() std::string text = shortCode.substr(0, mEmojis[curIdx].Begin); mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - text.size(), x1, NULL, FALSE, FALSE); + text.size(), x1); x0 += mTextFont->getWidthF32(text); x1 = textLeft + textWidth - x0; } @@ -138,7 +138,7 @@ void LLPanelEmojiComplete::draw() std::string text = shortCode.substr(mEmojis[curIdx].Begin, mEmojis[curIdx].End - mEmojis[curIdx].Begin); mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::yellow6, LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - text.size(), x1, NULL, FALSE, FALSE); + text.size(), x1); x0 += mTextFont->getWidthF32(text); x1 = textLeft + textWidth - x0; } @@ -147,7 +147,7 @@ void LLPanelEmojiComplete::draw() std::string text = shortCode.substr(mEmojis[curIdx].End); mTextFont->renderUTF8(text, 0, x0, iconCenterY, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, - text.size(), x1, NULL, FALSE, FALSE); + text.size(), x1); } iconCenterY -= mEmojiHeight; } diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 1051194183..84cd6e2da7 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -588,8 +588,7 @@ void LLGLTexMemBar::draw() x_right = 550.0; LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, text_color, LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, - &x_right, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right); F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6de510bc11..47c7eed872 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -955,8 +955,7 @@ public: { const Line& line = *iter; LLFontGL::getFontMonospace()->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor, - LLFontGL::LEFT, LLFontGL::TOP, - LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE); + LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW); } } diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index d597207859..a8676d2ad6 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -520,8 +520,7 @@ void LLWorldMapView::draw() S32_MAX, //max_chars mMapScale, //max_pixels NULL, - /*use_ellipses*/TRUE, - /*use_color*/FALSE); + /*use_ellipses*/TRUE); } } } diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index fe74cea2f1..8a9d3b755e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -27,7 +27,7 @@ left_delta="110" name="preset_text" top="5" - width="120"> + width="320"> (None) -- cgit v1.2.3 From 586e4cd090b22f11a68fa635e598847ce3b84d21 Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Wed, 17 Jan 2024 12:14:44 -0600 Subject: SL-18429 Make it so auto adjusting legacy skies merely turns on tonemapping. --- indra/newview/app_settings/settings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8fbeb82d07..77ca52a7f7 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10676,7 +10676,7 @@ Type F32 Value - 2.0 + 1.0 RendeSkyAutoAdjustBlueHorizonScale -- cgit v1.2.3 From 90aa7f0042b0793e205a399dcf82a246ed089526 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 18 Jan 2024 02:18:39 +0200 Subject: SL-20723 CLICK_ACTION_IGNORE was ignored on some attachments Now should match LLOctreeIntersect's check --- indra/newview/llvovolume.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index ec2f490742..c5b6eca5ae 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4575,6 +4575,11 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& } } + if (getClickAction() == CLICK_ACTION_IGNORE && !LLFloater::isVisible(gFloaterTools)) + { + return FALSE; + } + BOOL ret = FALSE; LLVolume* volume = getVolume(); -- cgit v1.2.3 From 6e8d4f48466a5bbad2fcc27bc2877a30e575d4ce Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 10:59:03 -0500 Subject: DRTVWR-601: Make autobuild set vcs_url, vcs_branch, vcs_revision in viewer's autobuild-package.xml. Ensure that AUTOBUILD_VCS_BRANCH is set before the build. (cherry picked from commit b782ab73e640e434e4ed67fa8dfc951f09757585) --- .github/workflows/build.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d7f0daf8b3..da7e0b9809 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -34,6 +34,9 @@ jobs: AUTOBUILD_GITHUB_TOKEN: ${{ secrets.SHARED_AUTOBUILD_GITHUB_TOKEN }} AUTOBUILD_INSTALLABLE_CACHE: ${{ github.workspace }}/.autobuild-installables AUTOBUILD_VARIABLES_FILE: ${{ github.workspace }}/.build-variables/variables + # Direct autobuild to store vcs_url, vcs_branch and vcs_revision in + # autobuild-package.xml. + AUTOBUILD_VCS_INFO: "true" AUTOBUILD_VSVER: "170" DEVELOPER_DIR: ${{ matrix.developer_dir }} # Ensure that Linden viewer builds engage Bugsplat. @@ -199,6 +202,11 @@ jobs: fi export PYTHON_COMMAND_NATIVE="$(native_path "$PYTHON_COMMAND")" + # branch will be something like "origin/mybranch" + branch="$(git branch -r --contains ${{ github.event.pull_request.head.sha || github.sha }} | head -n 1)" + # strip off "origin/" + export AUTOBUILD_VCS_BRANCH="${branch#*/}" + ./build.sh # Each artifact is downloaded as a distinct .zip file. Multiple jobs -- cgit v1.2.3 From ff1741cecae0fac6d94507fa4a6e4662219af707 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 18 Dec 2023 17:35:23 -0500 Subject: DRTVWR-601: Use viewer-build-util/which-branch to determine branch. (cherry picked from commit 2c5066f1fcc0c9f145698ef3aaec72d27bce7181) --- .github/workflows/build.yaml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index da7e0b9809..d21acccbd2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -100,10 +100,17 @@ jobs: if: runner.os == 'Windows' run: choco install nsis-unicode + - name: Determine source branch + id: which-branch + uses: secondlife/viewer-build-util/which-branch@v1 + with: + token: ${{ github.token }} + - name: Build id: build shell: bash env: + AUTOBUILD_VCS_BRANCH: ${{ steps.which-branch.outputs.branch }} RUNNER_OS: ${{ runner.os }} run: | # set up things the viewer's build.sh script expects @@ -154,7 +161,7 @@ jobs: } repo_branch() { - git -C "$1" branch | grep '^* ' | cut -c 3- + echo "$AUTOBUILD_VCS_BRANCH" } record_dependencies_graph() { @@ -202,11 +209,6 @@ jobs: fi export PYTHON_COMMAND_NATIVE="$(native_path "$PYTHON_COMMAND")" - # branch will be something like "origin/mybranch" - branch="$(git branch -r --contains ${{ github.event.pull_request.head.sha || github.sha }} | head -n 1)" - # strip off "origin/" - export AUTOBUILD_VCS_BRANCH="${branch#*/}" - ./build.sh # Each artifact is downloaded as a distinct .zip file. Multiple jobs -- cgit v1.2.3 From 09f66828ba573515c3766cce32f4746b8189efcf Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 18 Jan 2024 13:34:40 -0500 Subject: SL-20546: Use branch for autobuild package as well as release page. which_branch.py has moved to viewer-build-util as a reusable action. --- .github/workflows/build.yaml | 8 +--- .github/workflows/which_branch.py | 77 --------------------------------------- 2 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 .github/workflows/which_branch.py diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d21acccbd2..deabdf9c1e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ jobs: outputs: viewer_channel: ${{ steps.build.outputs.viewer_channel }} viewer_version: ${{ steps.build.outputs.viewer_version }} - viewer_branch: ${{ steps.build.outputs.viewer_branch }} + viewer_branch: ${{ steps.which-branch.outputs.branch }} imagename: ${{ steps.build.outputs.imagename }} env: AUTOBUILD_ADDRSIZE: 64 @@ -187,15 +187,9 @@ jobs: if [[ "$GITHUB_REF_TYPE" == "tag" && "${GITHUB_REF_NAME:0:12}" == "Second_Life_" ]] then viewer_channel="${GITHUB_REF_NAME%#*}" export viewer_channel="${viewer_channel//_/ }" - # Since GITHUB_REF_NAME is a tag rather than a branch, we need - # to discover to what branch this tag corresponds. - viewer_branch="$(python3 .github/workflows/which_branch.py \ - --token "${{ github.token }}" ${{ github.workflow_sha }})" else export viewer_channel="Second Life Test" - viewer_branch="${GITHUB_REF_NAME}" fi echo "viewer_channel=$viewer_channel" >> "$GITHUB_OUTPUT" - echo "viewer_branch=$viewer_branch" >> "$GITHUB_OUTPUT" # On windows we need to point the build to the correct python # as neither CMake's FindPython nor our custom Python.cmake module diff --git a/.github/workflows/which_branch.py b/.github/workflows/which_branch.py deleted file mode 100644 index 802ea44b5a..0000000000 --- a/.github/workflows/which_branch.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -"""\ -@file which_branch.py -@author Nat Goodspeed -@date 2023-11-14 -@brief Discover which git branch(es) correspond to a given commit hash. - -$LicenseInfo:firstyear=2023&license=viewerlgpl$ -Copyright (c) 2023, Linden Research, Inc. -$/LicenseInfo$ -""" - -import github -import re -import sys -import subprocess - -class Error(Exception): - pass - -def branches_for(token, commit, repo=None): - """ - Use the GitHub REST API to discover which branch(es) correspond to the - passed commit hash. The commit string can actually be any of the ways git - permits to identify a commit: - - https://git-scm.com/docs/gitrevisions#_specifying_revisions - - branches_for() generates a (possibly empty) sequence of all the branches - of the specified repo for which the specified commit is the tip. - - If repo is omitted or None, assume the current directory is a local clone - whose 'origin' remote is the GitHub repository of interest. - """ - if not repo: - url = subprocess.check_output(['git', 'remote', 'get-url', 'origin'], - text=True) - parts = re.split(r'[:/]', url.rstrip()) - repo = '/'.join(parts[-2:]).removesuffix('.git') - - gh = github.MainClass.Github(token) - grepo = gh.get_repo(repo) - for branch in grepo.get_branches(): - try: - delta = grepo.compare(base=commit, head=branch.name) - except github.GithubException: - continue - - if delta.ahead_by == 0 and delta.behind_by == 0: - yield branch - -def main(*raw_args): - from argparse import ArgumentParser - parser = ArgumentParser(description= -"%(prog)s reports the branch(es) for which the specified commit hash is the tip.", - epilog="""\ -When GitHub Actions launches a tag build, it checks out the specific changeset -identified by the tag, and so 'git branch' reports detached HEAD. But we use -tag builds to build a GitHub 'release' of the tip of a particular branch, and -it's useful to be able to identify which branch that is. -""") - parser.add_argument('-t', '--token', required=True, - help="""GitHub REST API access token""") - parser.add_argument('-r', '--repo', - help="""GitHub repository name, in the form OWNER/REPOSITORY""") - parser.add_argument('commit', - help="""commit hash at the tip of the sought branch""") - - args = parser.parse_args(raw_args) - for branch in branches_for(token=args.token, commit=args.commit, repo=args.repo): - print(branch.name) - -if __name__ == "__main__": - try: - sys.exit(main(*sys.argv[1:])) - except Error as err: - sys.exit(str(err)) -- cgit v1.2.3 From dd0ec112fe5ded8ed5f69b72b3df26343ca12d35 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 18 Jan 2024 13:43:34 -0500 Subject: SL-20546: PyGithub was only needed for local which_branch.py. Now that which_branch.py has moved to viewer-build-util, so has the PyGithub dependency. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index deabdf9c1e..19a6a0ef6f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -84,7 +84,7 @@ jobs: path: .master-message-template - name: Install autobuild and python dependencies - run: pip3 install autobuild PyGithub llsd + run: pip3 install autobuild llsd - name: Cache autobuild packages uses: actions/cache@v3 -- cgit v1.2.3 From 834cc3d1e094bdc9615e6ba46cf49c8c5db872d7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 18 Jan 2024 15:21:15 -0500 Subject: SL-20546: Test new viewer-build-util branch pr-branch. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 19a6a0ef6f..2e97d7c6dc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -102,7 +102,7 @@ jobs: - name: Determine source branch id: which-branch - uses: secondlife/viewer-build-util/which-branch@v1 + uses: secondlife/viewer-build-util/which-branch@pr-branch with: token: ${{ github.token }} -- cgit v1.2.3 From b156dd92957bc5ba123f69781bbe538cdc3a06c7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 18 Jan 2024 15:38:48 -0500 Subject: SL-20546: Kick the build. --- indra/llmessage/llxfer.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/indra/llmessage/llxfer.cpp b/indra/llmessage/llxfer.cpp index 93d5cfc131..212d0619d1 100644 --- a/indra/llmessage/llxfer.cpp +++ b/indra/llmessage/llxfer.cpp @@ -386,12 +386,3 @@ std::ostream& operator<< (std::ostream& os, LLXfer &hh) os << hh.getFileName() ; return os; } - - - - - - - - - -- cgit v1.2.3 From 5e19a58a21ce60488d8cba44ee71d22871487b3c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 18 Jan 2024 23:31:44 +0200 Subject: Fix broken fonts partial revert of 06c2c87bfaf364cb358b8a4b194e6369531a63c6 --- indra/newview/skins/default/xui/en/fonts.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 1f4ff860da..567dd85090 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -51,19 +51,19 @@ - DejaVuSans-Bold.ttf - DejaVuSans-Oblique.ttf - DejaVuSans-BoldOblique.ttf @@ -79,19 +79,19 @@ DejaVuSans.ttf - DejaVuSans-Bold.ttf - DejaVuSans-Oblique.ttf - DejaVuSans-BoldOblique.ttf @@ -108,7 +108,7 @@ - DejaVuSans-Bold.ttf @@ -120,7 +120,7 @@ - DejaVuSans-Oblique.ttf @@ -132,7 +132,7 @@ - DejaVuSans-BoldOblique.ttf -- cgit v1.2.3 From 6555fb3409fbdbd412a8062962c133af7aea7614 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Thu, 18 Jan 2024 21:35:48 -0500 Subject: SL-20546: Use viewer-build-util@v1 instead of PR branch. The fix we wanted was on the pr-branch branch of the viewer-build-util repo. Now that it's been published as v1.1.2, the updated v1 tag references the fix, so revert mention to @v1. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2e97d7c6dc..19a6a0ef6f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -102,7 +102,7 @@ jobs: - name: Determine source branch id: which-branch - uses: secondlife/viewer-build-util/which-branch@pr-branch + uses: secondlife/viewer-build-util/which-branch@v1 with: token: ${{ github.token }} -- cgit v1.2.3 From fee2dc981cb15c54cacd63f778f106ff93a85796 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 19 Jan 2024 23:01:06 +0200 Subject: NSException test --- indra/newview/llappviewer.cpp | 7 ++++++ indra/newview/llappviewer.h | 1 + indra/newview/llappviewermacosx-objc.h | 2 ++ indra/newview/llappviewermacosx-objc.mm | 6 +++++ indra/newview/llappviewermacosx.cpp | 5 +++++ indra/newview/llappviewermacosx.h | 2 ++ indra/newview/llviewermenu.cpp | 26 ++++++++++++++++++++++ indra/newview/skins/default/xui/en/menu_viewer.xml | 8 +++++++ 8 files changed, 57 insertions(+) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 08a6c20acf..30fb0be46c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -5445,6 +5445,13 @@ void LLAppViewer::forceErrorSoftwareException() LLTHROW(LLException("User selected Force Software Exception")); } +void LLAppViewer::forceErrorOSSpecificException() +{ + // Virtual, MacOS only + const std::string exception_text = "User selected Force OS Exception, Not implemented on this OS"; + throw std::runtime_error(exception_text); +} + void LLAppViewer::forceErrorDriverCrash() { LL_WARNS() << "Forcing a deliberate driver crash" << LL_ENDL; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 6d1496d517..c5faa67120 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -156,6 +156,7 @@ public: virtual void forceErrorBadMemoryAccess(); virtual void forceErrorInfiniteLoop(); virtual void forceErrorSoftwareException(); + virtual void forceErrorOSSpecificException(); virtual void forceErrorDriverCrash(); virtual void forceErrorCoroutineCrash(); virtual void forceErrorThreadCrash(); diff --git a/indra/newview/llappviewermacosx-objc.h b/indra/newview/llappviewermacosx-objc.h index c6dcec8e34..3721151aba 100644 --- a/indra/newview/llappviewermacosx-objc.h +++ b/indra/newview/llappviewermacosx-objc.h @@ -33,4 +33,6 @@ //Why? Because BOOL void launchApplication(const std::string* app_name, const std::vector* args); +void force_ns_sxeption(); + #endif // LL_LLAPPVIEWERMACOSX_OBJC_H diff --git a/indra/newview/llappviewermacosx-objc.mm b/indra/newview/llappviewermacosx-objc.mm index 17301847e8..5d9ca24db2 100644 --- a/indra/newview/llappviewermacosx-objc.mm +++ b/indra/newview/llappviewermacosx-objc.mm @@ -71,3 +71,9 @@ void launchApplication(const std::string* app_name, const std::vectorisPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetViewableCharacters(); } +bool enable_os_exception() +{ +#if LL_DARWIN + return true; +#else + return false; +#endif +} + class LLSelfRemoveAllAttachments : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8371,6 +8390,11 @@ void force_error_software_exception(void *) LLAppViewer::instance()->forceErrorSoftwareException(); } +void force_error_os_exception(void*) +{ + LLAppViewer::instance()->forceErrorOSSpecificException(); +} + void force_error_driver_crash(void *) { LLAppViewer::instance()->forceErrorDriverCrash(); @@ -9598,6 +9622,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedForceErrorBadMemoryAccessCoro(), "Advanced.ForceErrorBadMemoryAccessCoro"); view_listener_t::addMenu(new LLAdvancedForceErrorInfiniteLoop(), "Advanced.ForceErrorInfiniteLoop"); view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareException(), "Advanced.ForceErrorSoftwareException"); + view_listener_t::addMenu(new LLAdvancedForceOSException(), "Advanced.ForceErrorOSException"); view_listener_t::addMenu(new LLAdvancedForceErrorSoftwareExceptionCoro(), "Advanced.ForceErrorSoftwareExceptionCoro"); view_listener_t::addMenu(new LLAdvancedForceErrorDriverCrash(), "Advanced.ForceErrorDriverCrash"); view_listener_t::addMenu(new LLAdvancedForceErrorCoroutineCrash(), "Advanced.ForceErrorCoroutineCrash"); @@ -9779,6 +9804,7 @@ void initialize_menus() enable.add("VisibleSelectInPathfindingLinksets", boost::bind(&visible_object_select_in_pathfinding_linksets)); commit.add("Pathfinding.Characters.Select", boost::bind(&LLFloaterPathfindingCharacters::openCharactersWithSelectedObjects)); enable.add("EnableSelectInPathfindingCharacters", boost::bind(&enable_object_select_in_pathfinding_characters)); + enable.add("Advanced.EnableErrorOSException", boost::bind(&enable_os_exception)); view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible"); view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel"); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 2c26296547..910c2a969c 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2754,6 +2754,14 @@ function="World.EnvPreset" + + + + -- cgit v1.2.3 From 4a34a1196627c7e9998edde725d5e839f3ef61b9 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sat, 20 Jan 2024 02:26:51 +0200 Subject: SL-18721 Shutdown fixes 1. After window closes viewer still takes some time to shut down, so added splash screen to not confuse users (and to see if something gets stuck) 2. Having two identical mWindowHandle caused confusion for me, so I split them. It looks like there might have been issues with thread being stuck because thread's handle wasn't cleaned up. 3. Made region clean mCacheMap immediately instead of spending time making copies on shutdown --- indra/llcommon/threadpool.cpp | 17 +++++++++-- indra/llcommon/threadpool.h | 10 +++++-- indra/llwindow/llwindowwin32.cpp | 61 ++++++++++++++++++++-------------------- indra/newview/llappviewer.cpp | 8 ++++++ indra/newview/llviewerregion.cpp | 15 +++++++--- 5 files changed, 71 insertions(+), 40 deletions(-) diff --git a/indra/llcommon/threadpool.cpp b/indra/llcommon/threadpool.cpp index 3a9a5a2062..a063a01b82 100644 --- a/indra/llcommon/threadpool.cpp +++ b/indra/llcommon/threadpool.cpp @@ -60,12 +60,15 @@ struct sleepy_robin: public boost::fibers::algo::round_robin /***************************************************************************** * ThreadPoolBase *****************************************************************************/ -LL::ThreadPoolBase::ThreadPoolBase(const std::string& name, size_t threads, - WorkQueueBase* queue): +LL::ThreadPoolBase::ThreadPoolBase(const std::string& name, + size_t threads, + WorkQueueBase* queue, + bool auto_shutdown): super(name), mName("ThreadPool:" + name), mThreadCount(getConfiguredWidth(name, threads)), - mQueue(queue) + mQueue(queue), + mAutomaticShutdown(auto_shutdown) {} void LL::ThreadPoolBase::start() @@ -79,6 +82,14 @@ void LL::ThreadPoolBase::start() run(tname); }); } + + if (!mAutomaticShutdown) + { + // Some threads, like main window's might need to run a bit longer + // to wait for a proper shutdown message + return; + } + // Listen on "LLApp", and when the app is shutting down, close the queue // and join the workers. LLEventPumps::instance().obtain("LLApp").listen( diff --git a/indra/llcommon/threadpool.h b/indra/llcommon/threadpool.h index 60f4a0ce1b..fa16c6fe71 100644 --- a/indra/llcommon/threadpool.h +++ b/indra/llcommon/threadpool.h @@ -40,7 +40,7 @@ namespace LL * overrides this parameter. */ ThreadPoolBase(const std::string& name, size_t threads, - WorkQueueBase* queue); + WorkQueueBase* queue, bool auto_shutdown = true); virtual ~ThreadPoolBase(); /** @@ -87,6 +87,7 @@ namespace LL protected: std::unique_ptr mQueue; + bool mAutomaticShutdown; private: void run(const std::string& name); @@ -117,8 +118,11 @@ namespace LL * Constraining the queue can cause a submitter to block. Do not * constrain any ThreadPool accepting work from the main thread. */ - ThreadPoolUsing(const std::string& name, size_t threads=1, size_t capacity=1024*1024): - ThreadPoolBase(name, threads, new queue_t(name, capacity)) + ThreadPoolUsing(const std::string& name, + size_t threads=1, + size_t capacity=1024*1024, + bool auto_shutdown = true): + ThreadPoolBase(name, threads, new queue_t(name, capacity), auto_shutdown) {} ~ThreadPoolUsing() override {} diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 057d7a700e..0c1ed85477 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -412,8 +412,8 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool using FuncType = std::function; // call GetMessage() and pull enqueue messages for later processing void gatherInput(); - HWND mWindowHandle = NULL; - HDC mhDC = 0; + HWND mWindowHandleThrd = NULL; + HDC mhDCThrd = 0; // *HACK: Attempt to prevent startup crashes by deferring memory accounting // until after some graphics setup. See SL-20177. -Cosmic,2023-09-18 @@ -987,23 +987,23 @@ void LLWindowWin32::close() LL_DEBUGS("Window") << "Destroying Window" << LL_ENDL; - mWindowThread->post([=]() + mWindowThread->post([this, self = mWindowThread]() { - if (IsWindow(mWindowHandle)) + if (IsWindow(self->mWindowHandleThrd)) { - if (mhDC) + if (self->mhDCThrd) { - if (!ReleaseDC(mWindowHandle, mhDC)) + if (!ReleaseDC(self->mWindowHandleThrd, self->mhDCThrd)) { LL_WARNS("Window") << "Release of ghDC failed!" << LL_ENDL; } } // Make sure we don't leave a blank toolbar button. - ShowWindow(mWindowHandle, SW_HIDE); + ShowWindow(self->mWindowHandleThrd, SW_HIDE); // This causes WM_DESTROY to be sent *immediately* - if (!destroy_window_handler(mWindowHandle)) + if (!destroy_window_handler(self->mWindowHandleThrd)) { OSMessageBox(mCallbacks->translateString("MBDestroyWinFailed"), mCallbacks->translateString("MBShutdownErr"), @@ -1015,17 +1015,18 @@ void LLWindowWin32::close() // Something killed the window while we were busy destroying gl or handle somehow got broken LL_WARNS("Window") << "Failed to destroy Window, invalid handle!" << LL_ENDL; } - + self->mWindowHandleThrd = NULL; + self->mhDCThrd = NULL; + self->mGLReady = false; }); - // Window thread might be waiting for a getMessage(), give it - // a push to enshure it will process destroy_window_handler - kickWindowThread(); - // Even though the above lambda might not yet have run, we've already - // bound mWindowHandle into it by value, which should suffice for the - // operations we're asking. That's the last time WE should touch it. mhDC = NULL; mWindowHandle = NULL; + + // Window thread might be waiting for a getMessage(), give it + // a push to enshure it will process destroy_window_handler + kickWindowThread(); + mWindowThread->close(); } @@ -1777,8 +1778,8 @@ void LLWindowWin32::recreateWindow(RECT window_rect, DWORD dw_ex_style, DWORD dw () { LL_DEBUGS("Window") << "recreateWindow(): window_work entry" << LL_ENDL; - self->mWindowHandle = 0; - self->mhDC = 0; + self->mWindowHandleThrd = 0; + self->mhDCThrd = 0; if (oldWindowHandle) { @@ -1813,20 +1814,20 @@ void LLWindowWin32::recreateWindow(RECT window_rect, DWORD dw_ex_style, DWORD dw { // Failed to create window: clear the variables. This // assignment is valid because we're running on mWindowThread. - self->mWindowHandle = NULL; - self->mhDC = 0; + self->mWindowHandleThrd = NULL; + self->mhDCThrd = 0; } else { // Update mWindowThread's own mWindowHandle and mhDC. - self->mWindowHandle = handle; - self->mhDC = GetDC(handle); + self->mWindowHandleThrd = handle; + self->mhDCThrd = GetDC(handle); } updateWindowRect(); // It's important to wake up the future either way. - promise.set_value(std::make_pair(self->mWindowHandle, self->mhDC)); + promise.set_value(std::make_pair(self->mWindowHandleThrd, self->mhDCThrd)); LL_DEBUGS("Window") << "recreateWindow(): window_work done" << LL_ENDL; }; // But how we pass window_work to the window thread depends on whether we @@ -4589,7 +4590,7 @@ U32 LLWindowWin32::getAvailableVRAMMegabytes() #endif // LL_WINDOWS inline LLWindowWin32::LLWindowWin32Thread::LLWindowWin32Thread() - : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE) + : LL::ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE, false) { LL::ThreadPool::start(); } @@ -4745,7 +4746,7 @@ void LLWindowWin32::LLWindowWin32Thread::initD3D() { if (!mGLReady) { return; } - if (mDXGIAdapter == NULL && mD3DDevice == NULL && mWindowHandle != 0) + if (mDXGIAdapter == NULL && mD3DDevice == NULL && mWindowHandleThrd != 0) { mD3D = Direct3DCreate9(D3D_SDK_VERSION); @@ -4755,7 +4756,7 @@ void LLWindowWin32::LLWindowWin32Thread::initD3D() d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; - HRESULT res = mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mWindowHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &mD3DDevice); + HRESULT res = mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mWindowHandleThrd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &mD3DDevice); if (FAILED(res)) { @@ -4861,7 +4862,7 @@ void LLWindowWin32::LLWindowWin32Thread::run() // lazily call initD3D inside this loop to catch when mGLReady has been set to true initDX(); - if (mWindowHandle != 0) + if (mWindowHandleThrd != 0) { // lazily call initD3D inside this loop to catch when mWindowHandle has been set, and mGLReady has been set to true // *TODO: Shutdown if this fails when mWindowHandle exists @@ -4869,16 +4870,16 @@ void LLWindowWin32::LLWindowWin32Thread::run() MSG msg; BOOL status; - if (mhDC == 0) + if (mhDCThrd == 0) { LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("w32t - PeekMessage"); - logger.onChange("PeekMessage(", std::hex, mWindowHandle, ")"); - status = PeekMessage(&msg, mWindowHandle, 0, 0, PM_REMOVE); + logger.onChange("PeekMessage(", std::hex, mWindowHandleThrd, ")"); + status = PeekMessage(&msg, mWindowHandleThrd, 0, 0, PM_REMOVE); } else { LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("w32t - GetMessage"); - logger.always("GetMessage(", std::hex, mWindowHandle, ")"); + logger.always("GetMessage(", std::hex, mWindowHandleThrd, ")"); status = GetMessage(&msg, NULL, 0, 0); } if (status > 0) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 30fb0be46c..f094170ff5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1892,6 +1892,9 @@ bool LLAppViewer::cleanup() LL_INFOS() << "ViewerWindow deleted" << LL_ENDL; } + LLSplashScreen::show(); + LLSplashScreen::update(LLTrans::getString("ShuttingDown")); + LL_INFOS() << "Cleaning up Keyboard & Joystick" << LL_ENDL; // viewer UI relies on keyboard so keep it aound until viewer UI isa gone @@ -2170,6 +2173,8 @@ bool LLAppViewer::cleanup() // deleteSingleton() methods. LLSingletonBase::deleteAll(); + LLSplashScreen::hide(); + LL_INFOS() << "Goodbye!" << LL_ENDL; removeDumpDir(); @@ -5059,6 +5064,9 @@ void LLAppViewer::idleShutdown() && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME && !logoutRequestSent()) { + gViewerWindow->setShowProgress(TRUE); + gViewerWindow->setProgressPercent(100.f); + gViewerWindow->setProgressString(LLTrans::getString("LoggingOut")); return; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 6c0e25ae39..ed5b809003 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -829,10 +829,17 @@ void LLViewerRegion::saveObjectCache() mCacheDirty = FALSE; } - // Map of LLVOCacheEntry takes time to release, store map for cleanup on idle - sRegionCacheCleanup.insert(mImpl->mCacheMap.begin(), mImpl->mCacheMap.end()); - mImpl->mCacheMap.clear(); - // TODO - probably need to do the same for overrides cache + if (LLAppViewer::instance()->isQuitting()) + { + mImpl->mCacheMap.clear(); + } + else + { + // Map of LLVOCacheEntry takes time to release, store map for cleanup on idle + sRegionCacheCleanup.insert(mImpl->mCacheMap.begin(), mImpl->mCacheMap.end()); + mImpl->mCacheMap.clear(); + // TODO - probably need to do the same for overrides cache + } } void LLViewerRegion::sendMessage() -- cgit v1.2.3 From e0b7cb8e9a8b0fdbd45a54ce2e79a66e4908fc87 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 23 Jan 2024 04:18:57 +0200 Subject: Issue #30 Notecard losing thumbnail data --- indra/llinventory/llinventory.cpp | 55 +++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 55bcc7c5b2..6334a35fd0 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -32,6 +32,7 @@ #include "llinventorydefines.h" #include "llxorcipher.h" #include "llsd.h" +#include "llsdserialize.h" #include "message.h" #include @@ -217,7 +218,19 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream) } else if (0 == strcmp("metadata", keyword)) { - LLSD metadata(valuestr); + LLSD metadata; + if (strncmp("", valuestr, 6) == 0) + { + std::istringstream stream(valuestr); + LLSDSerialize::fromXML(metadata, stream); + } + else + { + // next line likely contains metadata, but at the moment is not supported + // can do something like: + // LLSDSerialize::fromNotation(metadata, input_stream, -1); + } + if (metadata.has("thumbnail")) { const LLSD& thumbnail = metadata["thumbnail"]; @@ -693,7 +706,19 @@ BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream) } else if (0 == strcmp("metadata", keyword)) { - LLSD metadata(valuestr); + LLSD metadata; + if (strncmp("", valuestr, 6) == 0) + { + std::istringstream stream(valuestr); + LLSDSerialize::fromXML(metadata, stream); + } + else + { + // next line likely contains metadata, but at the moment is not supported + // can do something like: + // LLSDSerialize::fromNotation(metadata, input_stream, -1); + } + if (metadata.has("thumbnail")) { const LLSD& thumbnail = metadata["thumbnail"]; @@ -802,9 +827,14 @@ BOOL LLInventoryItem::exportLegacyStream(std::ostream& output_stream, BOOL inclu if (mThumbnailUUID.notNull()) { + // Max length is 255 chars, will have to export differently if it gets more data + // Ex: use newline and toNotation (uses {}) for unlimited size LLSD metadata; metadata["thumbnail"] = LLSD().with("asset_id", mThumbnailUUID); - output_stream << "\t\tmetadata\t" << metadata << "|\n"; + + output_stream << "\t\tmetadata\t"; + LLSDSerialize::toXML(metadata, output_stream); + output_stream << "|\n"; } // Check for permissions to see the asset id, and if so write it @@ -1303,7 +1333,19 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream) } else if (0 == strcmp("metadata", keyword)) { - LLSD metadata(valuestr); + LLSD metadata; + if (strncmp("", valuestr, 6) == 0) + { + std::istringstream stream(valuestr); + LLSDSerialize::fromXML(metadata, stream); + } + else + { + // next line likely contains metadata, but at the moment is not supported + // can do something like: + // LLSDSerialize::fromNotation(metadata, input_stream, -1); + } + if (metadata.has("thumbnail")) { const LLSD& thumbnail = metadata["thumbnail"]; @@ -1343,9 +1385,12 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL) output_stream << "\t\tname\t" << mName.c_str() << "|\n"; if (mThumbnailUUID.notNull()) { + // Only up to 255 chars LLSD metadata; metadata["thumbnail"] = LLSD().with("asset_id", mThumbnailUUID); - output_stream << "\t\tmetadata\t" << metadata << "|\n"; + output_stream << "\t\tmetadata\t"; + LLSDSerialize::toXML(metadata, output_stream); + output_stream << "|\n"; } output_stream << "\t}\n"; return TRUE; -- cgit v1.2.3 From da48bd943923958952ea77eed858ba8372d58d9a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 23 Jan 2024 02:23:28 +0200 Subject: SL-18721 Shutdown fixes #2 Set DONE if decode thread is down instead of waiting for an update. Decodes can't be canceled, so fix potential situation where we get two responses --- indra/llimage/llimageworker.cpp | 31 ++++++++++++++++++------------- indra/llimage/llimageworker.h | 4 +++- indra/newview/lltexturefetch.cpp | 36 +++++++++++++++++++++++++++++------- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index c1ee052997..fd59daad3d 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -35,8 +35,10 @@ class ImageRequest { public: ImageRequest(const LLPointer& image, - S32 discard, BOOL needs_aux, - const LLPointer& responder); + S32 discard, + BOOL needs_aux, + const LLPointer& responder, + U32 request_id); virtual ~ImageRequest(); /*virtual*/ bool processRequest(); @@ -48,6 +50,7 @@ private: // input LLPointer mFormattedImage; S32 mDiscardLevel; + U32 mRequestId; BOOL mNeedsAux; // output LLPointer mDecodedImageRaw; @@ -62,6 +65,7 @@ private: // MAIN THREAD LLImageDecodeThread::LLImageDecodeThread(bool /*threaded*/) + : mDecodeCount(0) { mThreadPool.reset(new LL::ThreadPool("ImageDecode", 8)); mThreadPool->start(); @@ -92,9 +96,10 @@ LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage( { LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; + U32 decode_id = ++mDecodeCount; // Instantiate the ImageRequest right in the lambda, why not? bool posted = mThreadPool->getQueue().post( - [req = ImageRequest(image, discard, needs_aux, responder)] + [req = ImageRequest(image, discard, needs_aux, responder, decode_id)] () mutable { auto done = req.processRequest(); @@ -103,13 +108,10 @@ LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage( if (! posted) { LL_DEBUGS() << "Tried to start decoding on shutdown" << LL_ENDL; - // should this return 0? + return 0; } - // It's important to our consumer (LLTextureFetchWorker) that we return a - // nonzero handle. It is NOT important that the nonzero handle be unique: - // nothing is ever done with it except to compare it to zero, or zero it. - return 17; + return decode_id; } void LLImageDecodeThread::shutdown() @@ -123,15 +125,18 @@ LLImageDecodeThread::Responder::~Responder() //---------------------------------------------------------------------------- -ImageRequest::ImageRequest(const LLPointer& image, - S32 discard, BOOL needs_aux, - const LLPointer& responder) +ImageRequest::ImageRequest(const LLPointer& image, + S32 discard, + BOOL needs_aux, + const LLPointer& responder, + U32 request_id) : mFormattedImage(image), mDiscardLevel(discard), mNeedsAux(needs_aux), mDecodedRaw(FALSE), mDecodedAux(FALSE), - mResponder(responder) + mResponder(responder), + mRequestId(request_id) { } @@ -199,7 +204,7 @@ void ImageRequest::finishRequest(bool completed) if (mResponder.notNull()) { bool success = completed && mDecodedRaw && (!mNeedsAux || mDecodedAux); - mResponder->completed(success, mDecodedImageRaw, mDecodedImageAux); + mResponder->completed(success, mDecodedImageRaw, mDecodedImageAux, mRequestId); } // Will automatically be deleted } diff --git a/indra/llimage/llimageworker.h b/indra/llimage/llimageworker.h index ca4c0d93d0..b4ab9432e6 100644 --- a/indra/llimage/llimageworker.h +++ b/indra/llimage/llimageworker.h @@ -39,7 +39,7 @@ public: protected: virtual ~Responder(); public: - virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) = 0; + virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux, U32 request_id) = 0; }; public: @@ -53,6 +53,7 @@ public: const LLPointer& responder); size_t getPending(); size_t update(F32 max_time_ms); + S32 getTotalDecodeCount() { return mDecodeCount; } void shutdown(); private: @@ -60,6 +61,7 @@ private: // LLQueuedThread - instead this is the API by which we submit work to the // "ImageDecode" ThreadPool. std::unique_ptr mThreadPool; + LLAtomicU32 mDecodeCount; }; #endif diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 38c9b3717d..40bbe2b934 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -348,13 +348,13 @@ private: } // Threads: Tid - virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux) + virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux, U32 request_id) { LL_PROFILE_ZONE_SCOPED; LLTextureFetchWorker* worker = mFetcher->getWorker(mID); if (worker) { - worker->callbackDecoded(success, raw, aux); + worker->callbackDecoded(success, raw, aux, request_id); } } private: @@ -398,7 +398,7 @@ public: void callbackCacheWrite(bool success); // Threads: Tid - void callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux); + void callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux, S32 decode_id); // Threads: T* void setGetStatus(LLCore::HttpStatus status, const std::string& reason) @@ -1800,8 +1800,22 @@ bool LLTextureFetchWorker::doWork(S32 param) setState(DECODE_IMAGE_UPDATE); LL_DEBUGS(LOG_TXT) << mID << ": Decoding. Bytes: " << mFormattedImage->getDataSize() << " Discard: " << discard << " All Data: " << mHaveAllData << LL_ENDL; - mDecodeHandle = LLAppViewer::getImageDecodeThread()->decodeImage(mFormattedImage, discard, mNeedsAux, - new DecodeResponder(mFetcher, mID, this)); + + // In case worked manages to request decode, be shut down, + // then init and request decode again with first decode + // still in progress, assign a sufficiently unique id + mDecodeHandle = LLAppViewer::getImageDecodeThread()->decodeImage(mFormattedImage, + discard, + mNeedsAux, + new DecodeResponder(mFetcher, mID, this)); + if (mDecodeHandle == 0) + { + // Abort, failed to put into queue. + // Happens if viewer is shutting down + setState(DONE); + LL_DEBUGS(LOG_TXT) << mID << " DECODE_IMAGE abort: failed to post for decoding" << LL_ENDL; + return true; + } // fall though } @@ -2305,16 +2319,24 @@ void LLTextureFetchWorker::callbackCacheWrite(bool success) ////////////////////////////////////////////////////////////////////////////// // Threads: Tid -void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux) +void LLTextureFetchWorker::callbackDecoded(bool success, LLImageRaw* raw, LLImageRaw* aux, S32 decode_id) { LLMutexLock lock(&mWorkMutex); // +Mw if (mDecodeHandle == 0) { return; // aborted, ignore } + if (mDecodeHandle != decode_id) + { + // Queue doesn't support canceling old requests. + // This shouldn't normally happen, but in case it's possible that a worked + // will request decode, be aborted, reinited then start a new decode + LL_DEBUGS(LOG_TXT) << mID << " received obsolete decode's callback" << LL_ENDL; + return; // ignore + } if (mState != DECODE_IMAGE_UPDATE) { -// LL_WARNS(LOG_TXT) << "Decode callback for " << mID << " with state = " << mState << LL_ENDL; + LL_DEBUGS(LOG_TXT) << "Decode callback for " << mID << " with state = " << mState << LL_ENDL; mDecodeHandle = 0; return; } -- cgit v1.2.3 From f6ceafee5bb26cf86d64959cabf68deefaf791a8 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 22 Jan 2024 06:40:41 +0100 Subject: SL-20416 Avoid of taking focus by EmojiPicker --- indra/llui/llemojidictionary.cpp | 132 ++- indra/llui/llemojidictionary.h | 1 + indra/llui/llemojihelper.cpp | 7 +- indra/llui/llemojihelper.h | 4 +- indra/llui/llfloater.cpp | 28 +- indra/llui/llfloater.h | 5 +- indra/llui/lltexteditor.cpp | 24 +- indra/llui/lltexteditor.h | 1 + indra/llui/lluictrl.cpp | 25 +- indra/newview/llfloateremojipicker.cpp | 1066 ++++++++++++-------- indra/newview/llfloateremojipicker.h | 66 +- indra/newview/llfloaterimsessiontab.cpp | 81 +- indra/newview/llfloaterimsessiontab.h | 10 +- .../skins/default/xui/en/floater_emoji_picker.xml | 34 +- .../skins/default/xui/en/floater_im_session.xml | 5 +- 15 files changed, 833 insertions(+), 656 deletions(-) diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp index e29f3436cf..f16c38a11a 100644 --- a/indra/llui/llemojidictionary.cpp +++ b/indra/llui/llemojidictionary.cpp @@ -41,9 +41,9 @@ static const std::string SKINNED_EMOJI_FILENAME("emoji_characters.xml"); static const std::string SKINNED_CATEGORY_FILENAME("emoji_categories.xml"); static const std::string COMMON_GROUP_FILENAME("emoji_groups.xml"); -static const std::string GROUP_NAME_ALL("all"); -static const std::string GROUP_NAME_OTHERS("others"); static const std::string GROUP_NAME_SKIP("skip"); +// https://www.compart.com/en/unicode/U+1F302 +static const S32 GROUP_OTHERS_IMAGE_INDEX = 0x1F302; // ============================================================================ // Helper functions @@ -143,68 +143,76 @@ LLWString LLEmojiDictionary::findMatchingEmojis(const std::string& needle) const return result; } -void LLEmojiDictionary::findByShortCode(std::vector& result, const std::string& needle) const +// static +bool LLEmojiDictionary::searchInShortCode(std::size_t& begin, std::size_t& end, const std::string& shortCode, const std::string& needle) +{ + begin = 0; + end = 1; + std::size_t index = 1; + // Search for begin + char d = tolower(needle[index++]); + while (end < shortCode.size()) + { + char s = tolower(shortCode[end++]); + if (s == d) + { + begin = end - 1; + break; + } + } + if (!begin) + return false; + // Search for end + d = tolower(needle[index++]); + if (!d) + return true; + while (end < shortCode.size() && index <= needle.size()) + { + char s = tolower(shortCode[end++]); + if (s == d) + { + if (index == needle.size()) + return true; + d = tolower(needle[index++]); + continue; + } + switch (s) + { + case L'-': + case L'_': + case L'+': + continue; + } + break; + } + return false; +} + +void LLEmojiDictionary::findByShortCode( + std::vector& result, + const std::string& needle +) const { result.clear(); if (needle.empty() || needle.front() != ':') return; - auto search = [needle](std::size_t& begin, std::size_t& end, const std::string& shortCode) -> bool + std::map> results; + + for (const LLEmojiDescriptor& d : mEmojis) + { + if (!d.ShortCodes.empty()) { - begin = 0; - end = 1; - std::size_t index = 1; - // Search for begin - char d = tolower(needle[index++]); - while (end < shortCode.size()) + const std::string& shortCode = d.ShortCodes.front(); + if (shortCode.size() >= needle.size() && shortCode.front() == needle.front()) { - char s = tolower(shortCode[end++]); - if (s == d) + std::size_t begin, end; + if (searchInShortCode(begin, end, shortCode, needle)) { - begin = end - 1; - break; + results[begin].emplace_back(d.Character, shortCode, begin, end); } } - if (!begin) - return false; - // Search for end - d = tolower(needle[index++]); - while (end < shortCode.size() && index <= needle.size()) - { - char s = tolower(shortCode[end++]); - if (s == d) - { - if (index == needle.size()) - return true; - d = tolower(needle[index++]); - continue; - } - switch (s) - { - case L'-': - case L'_': - case L'+': - continue; - } - break; - } - return false; - }; - - std::map> results; - - for (const LLEmojiDescriptor& d : mEmojis) - { - if (d.ShortCodes.empty()) - continue; - const std::string& shortCode = d.ShortCodes.front(); - if (shortCode.size() < needle.size() || shortCode.front() != needle.front()) - continue; - std::size_t begin, end; - if (search(begin, end, shortCode)) - { - results[begin].emplace_back(d.Character, shortCode, begin, end); } } @@ -312,27 +320,13 @@ void LLEmojiDictionary::loadGroups() } mGroups.clear(); - // Add group "all" - mGroups.emplace_back(); - // https://www.compart.com/en/unicode/U+1F50D - mGroups.front().Character = 0x1F50D; - // https://www.compart.com/en/unicode/U+1F302 - llwchar iconOthers = 0x1F302; // Register all groups for (LLSD::array_const_iterator it = data.beginArray(), end = data.endArray(); it != end; ++it) { const LLSD& sd = *it; const std::string& name = sd["Name"].asStringRef(); - if (name == GROUP_NAME_ALL) - { - mGroups.front().Character = loadIcon(sd); - } - else if (name == GROUP_NAME_OTHERS) - { - iconOthers = loadIcon(sd); - } - else if (name == GROUP_NAME_SKIP) + if (name == GROUP_NAME_SKIP) { mSkipCategories = loadCategories(sd); translateCategories(mSkipCategories); @@ -355,7 +349,7 @@ void LLEmojiDictionary::loadGroups() // Add group "others" mGroups.emplace_back(); - mGroups.back().Character = iconOthers; + mGroups.back().Character = GROUP_OTHERS_IMAGE_INDEX; } void LLEmojiDictionary::loadEmojis() diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h index 66b564b70a..4af376df64 100644 --- a/indra/llui/llemojidictionary.h +++ b/indra/llui/llemojidictionary.h @@ -89,6 +89,7 @@ public: static void initClass(); LLWString findMatchingEmojis(const std::string& needle) const; + static bool searchInShortCode(std::size_t& begin, std::size_t& end, const std::string& shortCode, const std::string& needle); void findByShortCode(std::vector& result, const std::string& needle) const; const LLEmojiDescriptor* getDescriptorFromEmoji(llwchar emoji) const; const LLEmojiDescriptor* getDescriptorFromShortCode(const std::string& short_code) const; diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp index 9411f7cac5..89e6ddf987 100644 --- a/indra/llui/llemojihelper.cpp +++ b/indra/llui/llemojihelper.cpp @@ -36,7 +36,7 @@ // Constants // -constexpr char DEFAULT_EMOJI_HELPER_FLOATER[] = "emoji_complete"; +constexpr char DEFAULT_EMOJI_HELPER_FLOATER[] = "emoji_picker"; constexpr S32 HELPER_FLOATER_OFFSET_X = 0; constexpr S32 HELPER_FLOATER_OFFSET_Y = 0; @@ -117,9 +117,10 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c pHelperFloater->openFloater(LLSD().with("hint", short_code)); } -void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p) +void LLEmojiHelper::hideHelper(const LLUICtrl* ctrl_p, bool strict) { - if (ctrl_p && !isActive(ctrl_p)) + mIsHideDisabled &= !strict; + if (mIsHideDisabled || (ctrl_p && !isActive(ctrl_p))) { return; } diff --git a/indra/llui/llemojihelper.h b/indra/llui/llemojihelper.h index 58f68d12a4..e826ff93e6 100644 --- a/indra/llui/llemojihelper.h +++ b/indra/llui/llemojihelper.h @@ -45,7 +45,8 @@ public: bool isActive(const LLUICtrl* ctrl_p) const; static bool isCursorInEmojiCode(const LLWString& wtext, S32 cursor_pos, S32* short_code_pos_p = nullptr); void showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, const std::string& short_code, std::function commit_cb); - void hideHelper(const LLUICtrl* ctrl_p = nullptr); + void hideHelper(const LLUICtrl* ctrl_p = nullptr, bool strict = false); + void setIsHideDisabled(bool disabled) { mIsHideDisabled = disabled; }; // Eventing bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask); @@ -61,4 +62,5 @@ private: boost::signals2::connection mHostCtrlFocusLostConn; boost::signals2::connection mHelperCommitConn; std::function mEmojiCommitCb; + bool mIsHideDisabled; }; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 23d3a66631..31019f6c33 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -182,6 +182,7 @@ LLFloater::Params::Params() save_visibility("save_visibility", false), can_dock("can_dock", false), show_title("show_title", true), + auto_close("auto_close", false), positioning("positioning", LLFloaterEnums::POSITIONING_RELATIVE), header_height("header_height", 0), legacy_header_height("legacy_header_height", 0), @@ -254,6 +255,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) mCanClose(p.can_close), mDragOnLeft(p.can_drag_on_left), mResizable(p.can_resize), + mAutoClose(p.auto_close), mPositioning(p.positioning), mMinWidth(p.min_width), mMinHeight(p.min_height), @@ -681,7 +683,7 @@ void LLFloater::openFloater(const LLSD& key) if (getHost() != NULL) { getHost()->setMinimized(FALSE); - getHost()->setVisibleAndFrontmost(mAutoFocus); + getHost()->setVisibleAndFrontmost(mAutoFocus && !getIsChrome()); getHost()->showFloater(this); } else @@ -693,7 +695,7 @@ void LLFloater::openFloater(const LLSD& key) } applyControlsAndPosition(floater_to_stack); setMinimized(FALSE); - setVisibleAndFrontmost(mAutoFocus); + setVisibleAndFrontmost(mAutoFocus && !getIsChrome()); } mOpenSignal(this, key); @@ -1551,7 +1553,7 @@ void LLFloater::addDependentFloater(LLFloater* floaterp, BOOL reposition, BOOL r if (floaterp->isFrontmost()) { // make sure to bring self and sibling floaters to front - gFloaterView->bringToFront(floaterp); + gFloaterView->bringToFront(floaterp, floaterp->getAutoFocus() && !getIsChrome()); } } @@ -1696,6 +1698,7 @@ BOOL LLFloater::handleDoubleClick(S32 x, S32 y, MASK mask) return was_minimized || LLPanel::handleDoubleClick(x, y, mask); } +// virtual void LLFloater::bringToFront( S32 x, S32 y ) { if (getVisible() && pointInView(x, y)) @@ -1710,12 +1713,20 @@ void LLFloater::bringToFront( S32 x, S32 y ) LLFloaterView* parent = dynamic_cast( getParent() ); if (parent) { - parent->bringToFront( this ); + parent->bringToFront(this, !getIsChrome()); } } } } +// virtual +void LLFloater::goneFromFront() +{ + if (mAutoClose) + { + closeFloater(); + } +} // virtual void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key) @@ -2561,6 +2572,11 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore return; } + if (mFrontChild && !mFrontChild->isDead()) + { + mFrontChild->goneFromFront(); + } + mFrontChild = child; // *TODO: make this respect floater's mAutoFocus value, instead of @@ -3060,6 +3076,9 @@ LLFloater *LLFloaterView::getBackmost() const void LLFloaterView::syncFloaterTabOrder() { + if (mFrontChild && !mFrontChild->isDead() && mFrontChild->getIsChrome()) + return; + // look for a visible modal dialog, starting from first LLModalDialog* modal_dialog = NULL; for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) @@ -3307,6 +3326,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p) mDefaultRelativeY = p.rel_y; mPositioning = p.positioning; + mAutoClose = p.auto_close; mSaveRect = p.save_rect; if (p.save_visibility) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 860a6f9e2a..5f4e1a2cad 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -163,7 +163,8 @@ public: save_visibility, save_dock_state, can_dock, - show_title; + show_title, + auto_close; Optional positioning; @@ -390,6 +391,7 @@ protected: void setInstanceName(const std::string& name); virtual void bringToFront(S32 x, S32 y); + virtual void goneFromFront(); void setExpandedRect(const LLRect& rect) { mExpandedRect = rect; } // size when not minimized const LLRect& getExpandedRect() const { return mExpandedRect; } @@ -488,6 +490,7 @@ private: bool mFocusStealsFrontmost = true; // FALSE if we don't want the currently focused floater to cover this floater without user interaction BOOL mDragOnLeft; BOOL mResizable; + BOOL mAutoClose; LLFloaterEnums::EOpenPositioning mPositioning; LLCoordFloater mPosition; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 3910be1443..092739a538 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -508,7 +508,8 @@ void LLTextEditor::getSegmentsInRange(LLTextEditor::segment_vec_t& segments_out, } } -void LLTextEditor::setShowEmojiHelper(bool show) { +void LLTextEditor::setShowEmojiHelper(bool show) +{ if (!mShowEmojiHelper) { LLEmojiHelper::instance().hideHelper(this); @@ -1192,6 +1193,16 @@ void LLTextEditor::addChar(llwchar wc) } } +void LLTextEditor::showEmojiHelper() +{ + if (mReadOnly || !mShowEmojiHelper) + return; + + const LLRect cursorRect(getLocalRectFromDocIndex(mCursorPos)); + auto cb = [this](llwchar emoji) { insertEmoji(emoji); }; + LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb); +} + void LLTextEditor::tryToShowEmojiHelper() { if (mReadOnly || !mShowEmojiHelper) @@ -1207,6 +1218,10 @@ void LLTextEditor::tryToShowEmojiHelper() auto cb = [this](llwchar emoji) { handleEmojiCommit(emoji); }; LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, part, cb); } + else + { + LLEmojiHelper::instance().hideHelper(); + } } void LLTextEditor::addLineBreakChar(BOOL group_together) @@ -1911,7 +1926,12 @@ BOOL LLTextEditor::handleUnicodeCharHere(llwchar uni_char) // Handle most keys only if the text editor is writeable. if( !mReadOnly ) { - if( mAutoIndent && '}' == uni_char ) + if (mShowEmojiHelper && uni_char < 0x80 && LLEmojiHelper::instance().handleKey(this, (KEY)uni_char, MASK_NONE)) + { + return TRUE; + } + + if( mAutoIndent && '}' == uni_char ) { unindentLineBeforeCloseBrace(); } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 7a96e17899..521405ec25 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -206,6 +206,7 @@ public: void setShowContextMenu(bool show) { mShowContextMenu = show; } bool getShowContextMenu() const { return mShowContextMenu; } + void showEmojiHelper(); void setShowEmojiHelper(bool show); bool getShowEmojiHelper() const { return mShowEmojiHelper; } diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 21afcae7c3..7eb9ae69fb 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -768,25 +768,20 @@ void LLUICtrl::setIsChrome(BOOL is_chrome) // virtual BOOL LLUICtrl::getIsChrome() const -{ +{ + if (mIsChrome) + return TRUE; + LLView* parent_ctrl = getParent(); - while(parent_ctrl) + while (parent_ctrl) { - if(parent_ctrl->isCtrl()) - { - break; - } + if (parent_ctrl->isCtrl()) + return ((LLUICtrl*)parent_ctrl)->getIsChrome(); + parent_ctrl = parent_ctrl->getParent(); } - - if(parent_ctrl) - { - return mIsChrome || ((LLUICtrl*)parent_ctrl)->getIsChrome(); - } - else - { - return mIsChrome ; - } + + return FALSE; } diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index ecfc4e7b41..2380fd357b 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -31,7 +31,7 @@ #include "llbutton.h" #include "llcombobox.h" #include "llemojidictionary.h" -#include "llfiltereditor.h" +#include "llemojihelper.h" #include "llfloaterreg.h" #include "llkeyboard.h" #include "llscrollcontainer.h" @@ -46,16 +46,25 @@ namespace { // The following variables and constants are used for storing the floater state // between different lifecycles of the floater and different sissions of the viewer +// Floater constants +static const S32 ALL_EMOJIS_GROUP_INDEX = -2; +// https://www.compart.com/en/unicode/U+1F50D +static const S32 ALL_EMOJIS_IMAGE_INDEX = 0x1F50D; +static const S32 USED_EMOJIS_GROUP_INDEX = -1; +// https://www.compart.com/en/unicode/U+23F2 +static const S32 USED_EMOJIS_IMAGE_INDEX = 0x23F2; +// https://www.compart.com/en/unicode/U+1F6D1 +static const S32 EMPTY_LIST_IMAGE_INDEX = 0x1F6D1; +// The following categories should follow the required alphabetic order +static const std::string RECENTLY_USED_CATEGORY = "1 recently used"; +static const std::string FREQUENTLY_USED_CATEGORY = "2 frequently used"; + // Floater state related variables -static U32 sSelectedGroupIndex = 0; -static std::string sFilterPattern; static std::list sRecentlyUsed; static std::list> sFrequentlyUsed; // State file related values static std::string sStateFileName; -static const std::string sKeySelectedGroupIndex("SelectedGroupIndex"); -static const std::string sKeyFilterPattern("FilterPattern"); static const std::string sKeyRecentlyUsed("RecentlyUsed"); static const std::string sKeyFrequentlyUsed("FrequentlyUsed"); } @@ -116,11 +125,10 @@ class LLEmojiGridIcon : public LLScrollingPanel public: LLEmojiGridIcon( const LLPanel::Params& panel_params - , const LLEmojiDescriptor* descr - , std::string category) + , const LLEmojiSearchResult& emoji) : LLScrollingPanel(panel_params) - , mDescr(descr) - , mText(LLWString(1, descr->Character)) + , mData(emoji) + , mText(LLWString(1, emoji.Character)) { } @@ -145,12 +153,11 @@ public: virtual void updatePanel(BOOL allow_modify) override {} - const LLEmojiDescriptor* getDescr() const { return mDescr; } - llwchar getEmoji() const { return mDescr->Character; } + const LLEmojiSearchResult& getData() const { return mData; } LLWString getText() const { return mText; } private: - const LLEmojiDescriptor* mDescr; + const LLEmojiSearchResult mData; const LLWString mText; }; @@ -162,23 +169,31 @@ public: { } - void setEmoji(const LLEmojiDescriptor* descr) + void setIcon(const LLEmojiGridIcon* icon) { - mDescr = descr; - - if (!mDescr) - return; + if (icon) + { + setData(icon->getData().Character, icon->getData().String, icon->getData().Begin, icon->getData().End); + } + else + { + setData(0, LLStringUtil::null, 0, 0); + } + } - mEmojiText = LLWString(1, descr->Character); + void setData(llwchar emoji, std::string title, size_t begin, size_t end) + { + mWStr = LLWString(1, emoji); + mEmoji = emoji; + mTitle = title; + mBegin = begin; + mEnd = end; } virtual void draw() override { LLPanel::draw(); - if (!mDescr) - return; - S32 clientHeight = getRect().getHeight(); S32 clientWidth = getRect().getWidth(); S32 iconWidth = clientHeight; @@ -190,24 +205,14 @@ public: static LLColor4 defaultColor(0.75f, 0.75f, 0.75f, 1.0f); LLColor4 textColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", defaultColor); S32 max_pixels = clientWidth - iconWidth; - size_t count = mDescr->ShortCodes.size(); - if (count == 1) - { - drawName(mDescr->ShortCodes.front(), iconWidth, centerY, max_pixels, textColor); - } - else if (count > 1) - { - F32 quarterY = 0.5f * centerY; - drawName(mDescr->ShortCodes.front(), iconWidth, centerY + quarterY, max_pixels, textColor); - drawName(*++mDescr->ShortCodes.begin(), iconWidth, quarterY, max_pixels, textColor); - } + drawName(iconWidth, centerY, max_pixels, textColor); } protected: void drawIcon(F32 x, F32 y, S32 max_pixels) { LLFontGL::getFontEmojiHuge()->render( - mEmojiText, // wstr + mWStr, // wstr 0, // begin_offset x, // x y, // y @@ -220,90 +225,118 @@ protected: max_pixels); // max_pixels } - void drawName(std::string name, F32 x, F32 y, S32 max_pixels, LLColor4& color) + void drawName(F32 x, F32 y, S32 max_pixels, LLColor4& color) { - LLFontGL::getFontEmoji()->renderUTF8( - name, // wstr - 0, // begin_offset - x, // x - y, // y - color, // color - LLFontGL::LEFT, // halign - LLFontGL::VCENTER, // valign - LLFontGL::NORMAL, // style - LLFontGL::DROP_SHADOW_SOFT, // shadow - -1, // max_chars - max_pixels); // max_pixels + F32 x0 = x; + F32 x1 = max_pixels; + LLFontGL* font = LLFontGL::getFontEmoji(); + if (mBegin) + { + std::string text = mTitle.substr(0, mBegin); + font->renderUTF8( + text, // text + 0, // begin_offset + x0, // x + y, // y + color, // color + LLFontGL::LEFT, // halign + LLFontGL::VCENTER, // valign + LLFontGL::NORMAL, // style + LLFontGL::DROP_SHADOW_SOFT, // shadow + text.size(), // max_chars + x1); // max_pixels + F32 dx = font->getWidthF32(text); + x0 += dx; + x1 -= dx; + } + if (x1 > 0 && mEnd > mBegin) + { + std::string text = mTitle.substr(mBegin, mEnd - mBegin); + font->renderUTF8( + text, // text + 0, // begin_offset + x0, // x + y, // y + LLColor4::yellow6, // color + LLFontGL::LEFT, // halign + LLFontGL::VCENTER, // valign + LLFontGL::NORMAL, // style + LLFontGL::DROP_SHADOW_SOFT, // shadow + text.size(), // max_chars + x1); // max_pixels + F32 dx = font->getWidthF32(text); + x0 += dx; + x1 -= dx; + } + if (x1 > 0 && mEnd < mTitle.size()) + { + std::string text = mEnd ? mTitle.substr(mEnd) : mTitle; + font->renderUTF8( + text, // text + 0, // begin_offset + x0, // x + y, // y + color, // color + LLFontGL::LEFT, // halign + LLFontGL::VCENTER, // valign + LLFontGL::NORMAL, // style + LLFontGL::DROP_SHADOW_SOFT, // shadow + text.size(), // max_chars + x1); // max_pixels + } } private: - const LLEmojiDescriptor* mDescr { nullptr }; - LLWString mEmojiText; + llwchar mEmoji; + LLWString mWStr; + std::string mTitle; + size_t mBegin; + size_t mEnd; }; -LLFloaterEmojiPicker* LLFloaterEmojiPicker::getInstance() -{ - LLFloaterEmojiPicker* floater = LLFloaterReg::getTypedInstance("emoji_picker"); - if (!floater) - LL_ERRS() << "Cannot instantiate emoji picker" << LL_ENDL; - return floater; -} - -LLFloaterEmojiPicker* LLFloaterEmojiPicker::showInstance(pick_callback_t pick_callback, close_callback_t close_callback) -{ - LLFloaterEmojiPicker* floater = getInstance(); - floater->show(pick_callback, close_callback); - return floater; -} - -void LLFloaterEmojiPicker::show(pick_callback_t pick_callback, close_callback_t close_callback) -{ - mEmojiPickCallback = pick_callback; - mFloaterCloseCallback = close_callback; - openFloater(mKey); - setFocus(TRUE); -} - LLFloaterEmojiPicker::LLFloaterEmojiPicker(const LLSD& key) : super(key) { + // This floater should hover on top of our dependent (with the dependent having the focus) + setFocusStealsFrontmost(FALSE); + setBackgroundVisible(FALSE); + setAutoFocus(FALSE); + loadState(); } BOOL LLFloaterEmojiPicker::postBuild() { - // Should be initialized first + mGroups = getChild("Groups"); + mBadge = getChild("Badge"); + mEmojiScroll = getChild("EmojiGridContainer"); + mEmojiGrid = getChild("EmojiGrid"); + mDummy = getChild("Dummy"); + mPreview = new LLEmojiPreviewPanel(); mPreview->setVisible(FALSE); addChild(mPreview); - mDummy = getChild("Dummy"); - - mGroups = getChild("Groups"); - mBadge = getChild("Badge"); - - mFilter = getChild("Filter"); - mFilter->setKeystrokeCallback([this](LLUICtrl*, const LLSD&) { onFilterChanged(); }); - mFilter->setTextChangedCallback([this](LLUICtrl*, const LLSD&) { onFilterChanged(); }); - mFilter->setText(sFilterPattern); + return LLFloater::postBuild(); +} - mEmojiScroll = getChild("EmojiGridContainer"); - mEmojiScroll->setMouseEnterCallback([this](LLUICtrl*, const LLSD&) { onGridMouseEnter(); }); - mEmojiScroll->setMouseLeaveCallback([this](LLUICtrl*, const LLSD&) { onGridMouseLeave(); }); +void LLFloaterEmojiPicker::onOpen(const LLSD& key) +{ + mHint = key["hint"].asString(); - mEmojiGrid = getChild("EmojiGrid"); + LLEmojiHelper::instance().setIsHideDisabled(mHint.empty()); + mFilterPattern = mHint; - fillGroups(); - fillEmojis(); + initialize(); - return TRUE; + gFloaterView->adjustToFitScreen(this, FALSE); } void LLFloaterEmojiPicker::dirtyRect() { super::dirtyRect(); - if (!mFilter) + if (!mPreview) return; const S32 HPADDING = 4; @@ -314,20 +347,81 @@ void LLFloaterEmojiPicker::dirtyRect() mPreview->setRect(rect); } - if (mEmojiScroll && mEmojiScroll->getRect().getWidth() != mRecentGridWidth) + if (mEmojiScroll && mEmojiGrid) { - moveGroups(); - fillEmojis(true); + S32 outer_width = mEmojiScroll->getRect().getWidth(); + S32 inner_width = mEmojiGrid->getRect().getWidth(); + if (outer_width != inner_width) + { + resizeGroupButtons(); + fillEmojis(true); + } } } -LLFloaterEmojiPicker::~LLFloaterEmojiPicker() +void LLFloaterEmojiPicker::initialize() { - gFocusMgr.releaseFocusIfNeeded( this ); + S32 groupIndex = mSelectedGroupIndex && mSelectedGroupIndex <= mFilteredEmojiGroups.size() ? + mFilteredEmojiGroups[mSelectedGroupIndex - 1] : ALL_EMOJIS_GROUP_INDEX; + + fillGroups(); + + if (mFilteredEmojis.empty()) + { + if (!mHint.empty()) + { + hideFloater(); + return; + } + + mGroups->setVisible(FALSE); + mFocusedIconRow = -1; + mFocusedIconCol = -1; + mFocusedIcon = nullptr; + mHoveredIcon = nullptr; + mEmojiScroll->goToTop(); + mEmojiGrid->clearPanels(); + + if (mFilterPattern.empty()) + { + showPreview(false); + } + else + { + const std::string prompt("No emoji found for "); + std::string title(prompt + '"' + mFilterPattern.substr(1) + '"'); + mPreview->setData(EMPTY_LIST_IMAGE_INDEX, title, prompt.size() + 1, title.size() - 1); + showPreview(true); + } + return; + } + + mGroups->setVisible(TRUE); + mPreview->setIcon(nullptr); + showPreview(true); + + mSelectedGroupIndex = groupIndex == ALL_EMOJIS_GROUP_INDEX ? 0 : + (1 + std::distance(mFilteredEmojiGroups.begin(), + std::find(mFilteredEmojiGroups.begin(), mFilteredEmojiGroups.end(), groupIndex))) % + (1 + mFilteredEmojiGroups.size()); + + mGroupButtons[mSelectedGroupIndex]->setToggleState(TRUE); + mGroupButtons[mSelectedGroupIndex]->setUseFontColor(TRUE); + + fillEmojis(); } void LLFloaterEmojiPicker::fillGroups() { + // Do not use deleteAllChildren() because mBadge shouldn't be removed + for (LLButton* button : mGroupButtons) + { + mGroups->removeChild(button); + } + mFilteredEmojiGroups.clear(); + mFilteredEmojis.clear(); + mGroupButtons.clear(); + LLButton::Params params; params.font = LLFontGL::getFontEmoji(); @@ -335,277 +429,426 @@ void LLFloaterEmojiPicker::fillGroups() rect.mTop = mGroups->getRect().getHeight(); rect.mBottom = mBadge->getRect().getHeight(); + // Create button for "All categories" + createGroupButton(params, rect, ALL_EMOJIS_IMAGE_INDEX); + + // Create group and button for "Recently used" and/or "Frequently used" + if (!sRecentlyUsed.empty() || !sFrequentlyUsed.empty()) + { + std::map> cats; + fillCategoryRecentlyUsed(cats); + fillCategoryFrequentlyUsed(cats); + + if (!cats.empty()) + { + mFilteredEmojiGroups.push_back(USED_EMOJIS_GROUP_INDEX); + mFilteredEmojis.emplace_back(cats); + createGroupButton(params, rect, USED_EMOJIS_IMAGE_INDEX); + } + } + const std::vector& groups = LLEmojiDictionary::instance().getGroups(); - for (const LLEmojiGroup& group : groups) + + // List all categories in the dictionary + for (U32 i = 0; i < groups.size(); ++i) { - LLButton* button = LLUICtrlFactory::create(params); - button->setClickedCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonClick(ctrl); }); - button->setMouseEnterCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonMouseEnter(ctrl); }); - button->setMouseLeaveCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonMouseLeave(ctrl); }); + std::map> cats; - button->setRect(rect); - button->setLabel(LLUIString(LLWString(1, group.Character))); + fillGroupEmojis(cats, i); - if (mGroupButtons.size() == sSelectedGroupIndex) + if (!cats.empty()) { - button->setToggleState(TRUE); - button->setUseFontColor(TRUE); + mFilteredEmojiGroups.push_back(i); + mFilteredEmojis.emplace_back(cats); + createGroupButton(params, rect, groups[i].Character); } + } + + resizeGroupButtons(); +} + +void LLFloaterEmojiPicker::fillCategoryRecentlyUsed(std::map>& cats) +{ + if (sRecentlyUsed.empty()) + return; - mGroupButtons.push_back(button); - mGroups->addChild(button); + std::vector emojis; + + // In case of empty mFilterPattern we'd use sRecentlyUsed directly + if (!mFilterPattern.empty()) + { + // List all emojis in "Recently used" + const LLEmojiDictionary::emoji2descr_map_t& emoji2descr = LLEmojiDictionary::instance().getEmoji2Descr(); + std::size_t begin, end; + for (llwchar emoji : sRecentlyUsed) + { + auto e2d = emoji2descr.find(emoji); + if (e2d != emoji2descr.end() && !e2d->second->ShortCodes.empty()) + { + const std::string shortcode(e2d->second->ShortCodes.front()); + if (LLEmojiDictionary::searchInShortCode(begin, end, shortcode, mFilterPattern)) + { + emojis.emplace_back(emoji, shortcode, begin, end); + } + } + } + if (emojis.empty()) + return; } - moveGroups(); + cats.emplace(std::make_pair(RECENTLY_USED_CATEGORY, emojis)); } -void LLFloaterEmojiPicker::moveGroups() +void LLFloaterEmojiPicker::fillCategoryFrequentlyUsed(std::map>& cats) { - const std::vector& groups = LLEmojiDictionary::instance().getGroups(); - if (groups.empty()) + if (sFrequentlyUsed.empty()) return; - int badgeWidth = mGroups->getRect().getWidth() / groups.size(); - if (badgeWidth == mRecentBadgeWidth) + std::vector emojis; + + // In case of empty mFilterPattern we'd use sFrequentlyUsed directly + if (!mFilterPattern.empty()) + { + // List all emojis in "Frequently used" + const LLEmojiDictionary::emoji2descr_map_t& emoji2descr = LLEmojiDictionary::instance().getEmoji2Descr(); + std::size_t begin, end; + for (const auto& emoji : sFrequentlyUsed) + { + auto e2d = emoji2descr.find(emoji.first); + if (e2d != emoji2descr.end() && !e2d->second->ShortCodes.empty()) + { + const std::string shortcode(e2d->second->ShortCodes.front()); + if (LLEmojiDictionary::searchInShortCode(begin, end, shortcode, mFilterPattern)) + { + emojis.emplace_back(emoji.first, shortcode, begin, end); + } + } + } + if (emojis.empty()) + return; + } + + cats.emplace(std::make_pair(FREQUENTLY_USED_CATEGORY, emojis)); +} + +void LLFloaterEmojiPicker::fillGroupEmojis(std::map>& cats, U32 index) +{ + const std::vector& groups = LLEmojiDictionary::instance().getGroups(); + const LLEmojiDictionary::cat2descrs_map_t& category2Descr = LLEmojiDictionary::instance().getCategory2Descrs(); + + for (const std::string& category : groups[index].Categories) + { + const LLEmojiDictionary::cat2descrs_map_t::const_iterator& c2d = category2Descr.find(category); + if (c2d == category2Descr.end()) + continue; + + std::vector emojis; + + // In case of empty mFilterPattern we'd use category2Descr directly + if (!mFilterPattern.empty()) + { + // List all emojis in category + std::size_t begin, end; + for (const LLEmojiDescriptor* descr : c2d->second) + { + if (!descr->ShortCodes.empty()) + { + const std::string shortcode(descr->ShortCodes.front()); + if (LLEmojiDictionary::searchInShortCode(begin, end, shortcode, mFilterPattern)) + { + emojis.emplace_back(descr->Character, shortcode, begin, end); + } + } + } + if (emojis.empty()) + continue; + } + + cats.emplace(std::make_pair(category, emojis)); + } +} + +void LLFloaterEmojiPicker::createGroupButton(LLButton::Params& params, const LLRect& rect, llwchar emoji) +{ + LLButton* button = LLUICtrlFactory::create(params); + button->setClickedCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonClick(ctrl); }); + button->setMouseEnterCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonMouseEnter(ctrl); }); + button->setMouseLeaveCallback([this](LLUICtrl* ctrl, const LLSD&) { onGroupButtonMouseLeave(ctrl); }); + + button->setRect(rect); + button->setTabStop(FALSE); + button->setLabel(LLUIString(LLWString(1, emoji))); + button->setUseFontColor(FALSE); + + mGroupButtons.push_back(button); + mGroups->addChild(button); +} + +void LLFloaterEmojiPicker::resizeGroupButtons() +{ + U32 groupCount = (U32)mGroupButtons.size(); + if (!groupCount) return; - mRecentBadgeWidth = badgeWidth; + S32 totalWidth = mGroups->getRect().getWidth(); + S32 badgeWidth = totalWidth / groupCount; + S32 leftOffset = (totalWidth - badgeWidth * groupCount) / 2; - for (int i = 0; i < mGroupButtons.size(); ++i) + for (U32 i = 0; i < groupCount; ++i) { LLRect rect = mGroupButtons[i]->getRect(); - rect.mLeft = badgeWidth * i; + rect.mLeft = leftOffset + badgeWidth * i; rect.mRight = rect.mLeft + badgeWidth; mGroupButtons[i]->setRect(rect); } LLRect rect = mBadge->getRect(); - rect.mLeft = badgeWidth * sSelectedGroupIndex; + rect.mLeft = leftOffset + badgeWidth * mSelectedGroupIndex; rect.mRight = rect.mLeft + badgeWidth; mBadge->setRect(rect); } -void LLFloaterEmojiPicker::showPreview(bool show) +void LLFloaterEmojiPicker::selectEmojiGroup(U32 index) { - mPreview->setEmoji(nullptr); - mDummy->setVisible(show ? FALSE : TRUE); - mPreview->setVisible(show ? TRUE : FALSE); + if (index == mSelectedGroupIndex || index >= mGroupButtons.size()) + return; + + if (mSelectedGroupIndex < mGroupButtons.size()) + { + mGroupButtons[mSelectedGroupIndex]->setUseFontColor(FALSE); + mGroupButtons[mSelectedGroupIndex]->setToggleState(FALSE); + } + + mSelectedGroupIndex = index; + mGroupButtons[mSelectedGroupIndex]->setToggleState(TRUE); + mGroupButtons[mSelectedGroupIndex]->setUseFontColor(TRUE); + + LLButton* button = mGroupButtons[mSelectedGroupIndex]; + LLRect rect = mBadge->getRect(); + rect.mLeft = button->getRect().mLeft; + rect.mRight = button->getRect().mRight; + mBadge->setRect(rect); + + fillEmojis(); } void LLFloaterEmojiPicker::fillEmojis(bool fromResize) { - mRecentGridWidth = mEmojiScroll->getRect().getWidth(); - - S32 scrollbarSize = mEmojiScroll->getSize(); - if (scrollbarSize < 0) + S32 scrollbar_size = mEmojiScroll->getSize(); + if (scrollbar_size < 0) { static LLUICachedControl scrollbar_size_control("UIScrollbarSize", 0); - scrollbarSize = scrollbar_size_control; + scrollbar_size = scrollbar_size_control; } - const S32 clientWidth = mRecentGridWidth - scrollbarSize - mEmojiScroll->getBorderWidth() * 2; - const S32 gridPadding = mEmojiGrid->getPadding(); - const S32 iconSpacing = mEmojiGrid->getSpacing(); - const S32 rowWidth = clientWidth - gridPadding * 2; - const S32 iconSize = 28; // icon width and height - const S32 maxIcons = llmax(1, (rowWidth + iconSpacing) / (iconSize + iconSpacing)); + const S32 scroll_width = mEmojiScroll->getRect().getWidth(); + const S32 client_width = scroll_width - scrollbar_size - mEmojiScroll->getBorderWidth() * 2; + const S32 grid_padding = mEmojiGrid->getPadding(); + const S32 icon_spacing = mEmojiGrid->getSpacing(); + const S32 row_width = client_width - grid_padding * 2; + const S32 icon_size = 28; // icon width and height + const S32 max_icons = llmax(1, (row_width + icon_spacing) / (icon_size + icon_spacing)); // Optimization: don't rearrange for different widths with the same maxIcons - if (fromResize && (maxIcons == mRecentMaxIcons)) + if (fromResize && (max_icons == mRecentMaxIcons)) return; - mRecentMaxIcons = maxIcons; + mRecentMaxIcons = max_icons; mFocusedIconRow = 0; mFocusedIconCol = 0; mFocusedIcon = nullptr; mHoveredIcon = nullptr; + mEmojiScroll->goToTop(); mEmojiGrid->clearPanels(); - mPreview->setEmoji(nullptr); + mPreview->setIcon(nullptr); - if (mEmojiGrid->getRect().getWidth() != clientWidth) + if (mEmojiGrid->getRect().getWidth() != client_width) { LLRect rect = mEmojiGrid->getRect(); - rect.mRight = rect.mLeft + clientWidth; + rect.mRight = rect.mLeft + client_width; mEmojiGrid->setRect(rect); } LLPanel::Params row_panel_params; - row_panel_params.rect = LLRect(0, iconSize, rowWidth, 0); + row_panel_params.rect = LLRect(0, icon_size, row_width, 0); LLScrollingPanelList::Params row_list_params; row_list_params.rect = row_panel_params.rect; row_list_params.is_horizontal = TRUE; row_list_params.padding = 0; - row_list_params.spacing = iconSpacing; + row_list_params.spacing = icon_spacing; LLPanel::Params icon_params; - LLRect icon_rect(0, iconSize, iconSize, 0); + LLRect icon_rect(0, icon_size, icon_size, 0); - static LLColor4 defaultColor(0.75f, 0.75f, 0.75f, 1.0f); - LLColor4 bgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", defaultColor); + static LLColor4 default_color(0.75f, 0.75f, 0.75f, 1.0f); + LLColor4 bg_color = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", default_color); - auto matchesPattern = [](const LLEmojiDescriptor* descr) -> bool + if (!mSelectedGroupIndex) { - for (const std::string& shortCode : descr->ShortCodes) - if (shortCode.find(sFilterPattern) != std::string::npos) - return true; - return false; - }; - - auto listCategory = [&](std::string category, const std::vector& emojis, int maxRows = 0) + // List all groups + for (const auto& group : mFilteredEmojis) + { + // List all categories in the group + for (const auto& category : group) + { + // List all emojis in the category + fillEmojisCategory(category.second, category.first, row_panel_params, + row_list_params, icon_params, icon_rect, max_icons, bg_color); + } + } + } + else { - int rowCount = 0; - int iconIndex = 0; - bool showDivider = true; - bool mixedFolder = maxRows; - LLEmojiGridRow* row = nullptr; - if (!mixedFolder && !isupper(category.front())) + // List all categories in the selected group + const auto& group = mFilteredEmojis[mSelectedGroupIndex - 1]; + for (const auto& category : group) { - LLStringUtil::capitalize(category); + // List all emojis in the category + fillEmojisCategory(category.second, category.first, row_panel_params, + row_list_params, icon_params, icon_rect, max_icons, bg_color); } + } - for (const LLEmojiDescriptor* descr : emojis) + if (mEmojiGrid->getPanelList().empty()) + { + showPreview(false); + mFocusedIconRow = -1; + mFocusedIconCol = -1; + if (!mHint.empty()) { - if (sFilterPattern.empty() || matchesPattern(descr)) - { - // Place a category title if needed - if (showDivider) - { - LLEmojiGridDivider* div = new LLEmojiGridDivider(row_panel_params, category); - mEmojiGrid->addPanel(div, true); - showDivider = false; - } - - // Place a new row each (maxIcons) icons - if (!(iconIndex % maxIcons)) - { - if (maxRows && ++rowCount > maxRows) - break; - row = new LLEmojiGridRow(row_panel_params, row_list_params); - mEmojiGrid->addPanel(row, true); - } - - // Place a new icon to the current row - LLEmojiGridIcon* icon = new LLEmojiGridIcon(icon_params, descr, mixedFolder ? LLStringUtil::capitalize(descr->Category) : category); - icon->setMouseEnterCallback([this](LLUICtrl* ctrl, const LLSD&) { onEmojiMouseEnter(ctrl); }); - icon->setMouseLeaveCallback([this](LLUICtrl* ctrl, const LLSD&) { onEmojiMouseLeave(ctrl); }); - icon->setMouseDownCallback([this](LLUICtrl* ctrl, S32, S32, MASK) { onEmojiMouseDown(ctrl); }); - icon->setMouseUpCallback([this](LLUICtrl* ctrl, S32, S32, MASK) { onEmojiMouseUp(ctrl); }); - icon->setBackgroundColor(bgColor); - icon->setBackgroundOpaque(1); - icon->setRect(icon_rect); - row->mList->addPanel(icon, true); - - iconIndex++; - } + hideFloater(); } - }; + } + else + { + showPreview(true); + mFocusedIconRow = 0; + mFocusedIconCol = 0; + moveFocusedIconNext(); + } +} - const std::vector& groups = LLEmojiDictionary::instance().getGroups(); - const LLEmojiDictionary::emoji2descr_map_t& emoji2descr = LLEmojiDictionary::instance().getEmoji2Descr(); - const LLEmojiDictionary::cat2descrs_map_t& category2Descr = LLEmojiDictionary::instance().getCategory2Descrs(); - if (!sSelectedGroupIndex) +void LLFloaterEmojiPicker::fillEmojisCategory(const std::vector& emojis, + const std::string& category, const LLPanel::Params& row_panel_params, const LLUICtrl::Params& row_list_params, + const LLPanel::Params& icon_params, const LLRect& icon_rect, S32 max_icons, const LLColor4& bg) +{ + // Place the category title + std::string title = + category == RECENTLY_USED_CATEGORY ? getString("title_for_recently_used") : + category == FREQUENTLY_USED_CATEGORY ? getString("title_for_frequently_used") : + isupper(category.front()) ? category : LLStringUtil::capitalize(category); + LLEmojiGridDivider* div = new LLEmojiGridDivider(row_panel_params, title); + mEmojiGrid->addPanel(div, true); + + int icon_index = 0; + LLEmojiGridRow* row = nullptr; + + if (mFilterPattern.empty()) { - std::vector recentlyUsed; - for (llwchar emoji : sRecentlyUsed) + const LLEmojiDictionary::emoji2descr_map_t& emoji2descr = LLEmojiDictionary::instance().getEmoji2Descr(); + LLEmojiSearchResult emoji { 0, "", 0, 0 }; + if (category == RECENTLY_USED_CATEGORY) { - auto it = emoji2descr.find(emoji); - if (it != emoji2descr.end()) + for (llwchar code : sRecentlyUsed) { - recentlyUsed.push_back(it->second); + const LLEmojiDictionary::emoji2descr_map_t::const_iterator& e2d = emoji2descr.find(code); + if (e2d != emoji2descr.end() && !e2d->second->ShortCodes.empty()) + { + emoji.Character = code; + emoji.String = e2d->second->ShortCodes.front(); + createEmojiIcon(emoji, category, row_panel_params, row_list_params, icon_params, + icon_rect, max_icons, bg, row, icon_index); + } } } - listCategory(getString("title_for_recently_used"), recentlyUsed, 1); - - std::vector frequentlyUsed; - for (auto& emoji : sFrequentlyUsed) + else if (category == FREQUENTLY_USED_CATEGORY) { - auto it = emoji2descr.find(emoji.first); - if (it != emoji2descr.end()) + for (const auto& code : sFrequentlyUsed) { - frequentlyUsed.push_back(it->second); + const LLEmojiDictionary::emoji2descr_map_t::const_iterator& e2d = emoji2descr.find(code.first); + if (e2d != emoji2descr.end() && !e2d->second->ShortCodes.empty()) + { + emoji.Character = code.first; + emoji.String = e2d->second->ShortCodes.front(); + createEmojiIcon(emoji, category, row_panel_params, row_list_params, icon_params, + icon_rect, max_icons, bg, row, icon_index); + } } } - listCategory(getString("title_for_frequently_used"), frequentlyUsed, 1); - - // List all groups - for (const LLEmojiGroup& group : groups) + else { - // List all categories in group - for (const std::string& category : group.Categories) + const LLEmojiDictionary::cat2descrs_map_t& category2Descr = LLEmojiDictionary::instance().getCategory2Descrs(); + const LLEmojiDictionary::cat2descrs_map_t::const_iterator& c2d = category2Descr.find(category); + if (c2d != category2Descr.end()) { - // List all emojis in category - const LLEmojiDictionary::cat2descrs_map_t::const_iterator& item = category2Descr.find(category); - if (item != category2Descr.end()) + for (const LLEmojiDescriptor* descr : c2d->second) { - listCategory(category, item->second); + emoji.Character = descr->Character; + emoji.String = descr->ShortCodes.front(); + createEmojiIcon(emoji, category, row_panel_params, row_list_params, icon_params, + icon_rect, max_icons, bg, row, icon_index); } } } } else { - // List all categories in the selected group - for (const std::string& category : groups[sSelectedGroupIndex].Categories) + for (const LLEmojiSearchResult& emoji : emojis) { - // List all emojis in category - const LLEmojiDictionary::cat2descrs_map_t::const_iterator& item = category2Descr.find(category); - if (item != category2Descr.end()) - { - listCategory(category, item->second); - } + createEmojiIcon(emoji, category, row_panel_params, row_list_params, icon_params, + icon_rect, max_icons, bg, row, icon_index); } } } -void LLFloaterEmojiPicker::onGroupButtonClick(LLUICtrl* ctrl) +void LLFloaterEmojiPicker::createEmojiIcon(const LLEmojiSearchResult& emoji, + const std::string& category, const LLPanel::Params& row_panel_params, const LLUICtrl::Params& row_list_params, + const LLPanel::Params& icon_params, const LLRect& icon_rect, S32 max_icons, const LLColor4& bg, + LLEmojiGridRow*& row, int& icon_index) { - if (LLButton* button = dynamic_cast(ctrl)) + // Place a new row each (max_icons) icons + if (!(icon_index % max_icons)) { - mFilter->setFocus(TRUE); - - if (button == mGroupButtons[sSelectedGroupIndex] || button->getToggleState()) - return; - - auto it = std::find(mGroupButtons.begin(), mGroupButtons.end(), button); - if (it == mGroupButtons.end()) - return; - - mGroupButtons[sSelectedGroupIndex]->setUseFontColor(FALSE); - mGroupButtons[sSelectedGroupIndex]->setToggleState(FALSE); - sSelectedGroupIndex = it - mGroupButtons.begin(); - mGroupButtons[sSelectedGroupIndex]->setToggleState(TRUE); - mGroupButtons[sSelectedGroupIndex]->setUseFontColor(TRUE); - - LLRect rect = mBadge->getRect(); - rect.mLeft = button->getRect().mLeft; - rect.mRight = button->getRect().mRight; - mBadge->setRect(rect); - - fillEmojis(); + row = new LLEmojiGridRow(row_panel_params, *(const LLScrollingPanelList::Params*)&row_list_params); + mEmojiGrid->addPanel(row, true); } + + // Place a new icon to the current row + LLEmojiGridIcon* icon = new LLEmojiGridIcon(icon_params, emoji); + icon->setMouseEnterCallback([this](LLUICtrl* ctrl, const LLSD&) { onEmojiMouseEnter(ctrl); }); + icon->setMouseLeaveCallback([this](LLUICtrl* ctrl, const LLSD&) { onEmojiMouseLeave(ctrl); }); + icon->setMouseDownCallback([this](LLUICtrl* ctrl, S32, S32, MASK) { onEmojiMouseDown(ctrl); }); + icon->setMouseUpCallback([this](LLUICtrl* ctrl, S32, S32, MASK) { onEmojiMouseUp(ctrl); }); + icon->setBackgroundColor(bg); + icon->setBackgroundOpaque(1); + icon->setRect(icon_rect); + row->mList->addPanel(icon, true); + + icon_index++; } -void LLFloaterEmojiPicker::onFilterChanged() +void LLFloaterEmojiPicker::showPreview(bool show) { - sFilterPattern = mFilter->getText(); - fillEmojis(); + //mPreview->setIcon(nullptr); + mDummy->setVisible(show ? FALSE : TRUE); + mPreview->setVisible(show ? TRUE : FALSE); } -void LLFloaterEmojiPicker::onGridMouseEnter() +void LLFloaterEmojiPicker::onGroupButtonClick(LLUICtrl* ctrl) { - LLFocusableElement* focus = gFocusMgr.getKeyboardFocus(); - if (focus == mEmojiGrid) + if (LLButton* button = dynamic_cast(ctrl)) { - exitArrowMode(); - } - showPreview(true); -} + if (button == mGroupButtons[mSelectedGroupIndex] || button->getToggleState()) + return; -void LLFloaterEmojiPicker::onGridMouseLeave() -{ - showPreview(false); + auto it = std::find(mGroupButtons.begin(), mGroupButtons.end(), button); + if (it == mGroupButtons.end()) + return; + + selectEmojiGroup(it - mGroupButtons.begin()); + } } void LLFloaterEmojiPicker::onGroupButtonMouseEnter(LLUICtrl* ctrl) @@ -626,33 +869,40 @@ void LLFloaterEmojiPicker::onGroupButtonMouseLeave(LLUICtrl* ctrl) void LLFloaterEmojiPicker::onEmojiMouseEnter(LLUICtrl* ctrl) { - if (ctrl) + if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) { - LLFocusableElement* focus = gFocusMgr.getKeyboardFocus(); - if (focus == mEmojiGrid) + if (mFocusedIcon && mFocusedIcon != icon && mFocusedIcon->isBackgroundVisible()) { - exitArrowMode(); - showPreview(true); + unselectGridIcon(mFocusedIcon); } - if (mHoveredIcon && mHoveredIcon != ctrl) + if (mHoveredIcon && mHoveredIcon != icon) { unselectGridIcon(mHoveredIcon); } - selectGridIcon(ctrl); + selectGridIcon(icon); - mHoveredIcon = ctrl; + mHoveredIcon = icon; } } void LLFloaterEmojiPicker::onEmojiMouseLeave(LLUICtrl* ctrl) { - if (ctrl) + if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) { - if (ctrl == mHoveredIcon) + if (icon == mHoveredIcon) { - unselectGridIcon(ctrl); + if (icon != mFocusedIcon) + { + unselectGridIcon(icon); + } + mHoveredIcon = nullptr; + } + + if (!mHoveredIcon && mFocusedIcon && !mFocusedIcon->isBackgroundVisible()) + { + selectGridIcon(mFocusedIcon); } } } @@ -672,195 +922,176 @@ void LLFloaterEmojiPicker::onEmojiMouseUp(LLUICtrl* ctrl) make_ui_sound("UISndClickRelease"); } - if (mEmojiPickCallback) + if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) { - if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) - { - if (mEmojiPickCallback) - { - mEmojiPickCallback(icon->getEmoji()); - } - } - } -} + LLSD value(wstring_to_utf8str(icon->getText())); + setValue(value); -bool LLFloaterEmojiPicker::enterArrowMode() -{ - S32 rowCount = mEmojiGrid->getPanelList().size(); - if (rowCount) - { - mFocusedIconRow = -1; - mFocusedIconCol = 0; - if (moveFocusedIconDown()) + onCommit(); + + if (!mHint.empty() || !(gKeyboard->currentMask(TRUE) & MASK_SHIFT)) { - showPreview(true); - mEmojiScroll->goToTop(); - mEmojiGrid->setFocus(TRUE); - return true; + hideFloater(); } } - return false; } -void LLFloaterEmojiPicker::exitArrowMode() +void LLFloaterEmojiPicker::selectFocusedIcon() { - if (mFocusedIcon) + if (mFocusedIcon && mFocusedIcon != mHoveredIcon) { unselectGridIcon(mFocusedIcon); - mFocusedIcon = nullptr; } - showPreview(false); - mEmojiScroll->goToTop(); - mFocusedIconRow = mFocusedIconCol = 0; - mFilter->setFocus(TRUE); + // Both mFocusedIconRow and mFocusedIconCol should be already verified + LLEmojiGridRow* row = dynamic_cast(mEmojiGrid->getPanelList()[mFocusedIconRow]); + mFocusedIcon = row ? dynamic_cast(row->mList->getPanelList()[mFocusedIconCol]) : nullptr; + + if (mFocusedIcon && !mHoveredIcon) + { + selectGridIcon(mFocusedIcon); + } } -void LLFloaterEmojiPicker::selectFocusedIcon() +bool LLFloaterEmojiPicker::moveFocusedIconPrev() { if (mHoveredIcon) - { - unselectGridIcon(mHoveredIcon); - } + return false; - if (mFocusedIcon) + if (mFocusedIconCol > 0) { - unselectGridIcon(mFocusedIcon); + mFocusedIconCol--; + selectFocusedIcon(); + return true; } - // Both mFocusedIconRow and mFocusedIconCol should be already verified - LLEmojiGridRow* row = (LLEmojiGridRow*)mEmojiGrid->getPanelList()[mFocusedIconRow]; - mFocusedIcon = row->mList->getPanelList()[mFocusedIconCol]; - selectGridIcon(mFocusedIcon); -} - -bool LLFloaterEmojiPicker::moveFocusedIconUp() -{ for (S32 i = mFocusedIconRow - 1; i >= 0; --i) { LLScrollingPanel* panel = mEmojiGrid->getPanelList()[i]; LLEmojiGridRow* row = dynamic_cast(panel); - if (row && row->mList->getPanelList().size() > mFocusedIconCol) + if (row && row->mList->getPanelList().size()) { mEmojiScroll->scrollToShowRect(row->getBoundingRect()); + mFocusedIconCol = row->mList->getPanelList().size() - 1; mFocusedIconRow = i; selectFocusedIcon(); return true; } } + return false; } -bool LLFloaterEmojiPicker::moveFocusedIconDown() +bool LLFloaterEmojiPicker::moveFocusedIconNext() { + if (mHoveredIcon) + return false; + + LLScrollingPanel* panel = mEmojiGrid->getPanelList()[mFocusedIconRow]; + LLEmojiGridRow* row = dynamic_cast(panel); + S32 colCount = row ? row->mList->getPanelList().size() : 0; + if (mFocusedIconCol < colCount - 1) + { + mFocusedIconCol++; + selectFocusedIcon(); + return true; + } + S32 rowCount = mEmojiGrid->getPanelList().size(); for (S32 i = mFocusedIconRow + 1; i < rowCount; ++i) { LLScrollingPanel* panel = mEmojiGrid->getPanelList()[i]; LLEmojiGridRow* row = dynamic_cast(panel); - if (row && row->mList->getPanelList().size() > mFocusedIconCol) + if (row && row->mList->getPanelList().size()) { mEmojiScroll->scrollToShowRect(row->getBoundingRect()); + mFocusedIconCol = 0; mFocusedIconRow = i; selectFocusedIcon(); return true; } } + return false; } -bool LLFloaterEmojiPicker::moveFocusedIconLeft() +void LLFloaterEmojiPicker::selectGridIcon(LLEmojiGridIcon* icon) { - if (mFocusedIconCol <= 0) - return false; - - mFocusedIconCol--; - selectFocusedIcon(); - return true; + icon->setBackgroundVisible(TRUE); + mPreview->setIcon(icon); } -bool LLFloaterEmojiPicker::moveFocusedIconRight() +void LLFloaterEmojiPicker::unselectGridIcon(LLEmojiGridIcon* icon) { - LLEmojiGridRow* row = (LLEmojiGridRow*)mEmojiGrid->getPanelList()[mFocusedIconRow]; - S32 colCount = row->mList->getPanelList().size(); - if (mFocusedIconCol >= colCount - 1) - return false; - - mFocusedIconCol++; - selectFocusedIcon(); - return true; + icon->setBackgroundVisible(FALSE); + mPreview->setIcon(nullptr); } -void LLFloaterEmojiPicker::selectGridIcon(LLUICtrl* ctrl) +// virtual +BOOL LLFloaterEmojiPicker::handleKey(KEY key, MASK mask, BOOL called_from_parent) { - if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) + if (mask == MASK_NONE) { - icon->setBackgroundVisible(TRUE); - mPreview->setEmoji(icon->getDescr()); + switch (key) + { + case KEY_LEFT: + selectEmojiGroup((mSelectedGroupIndex + mFilteredEmojis.size()) % mGroupButtons.size()); + return TRUE; + case KEY_RIGHT: + selectEmojiGroup((mSelectedGroupIndex + 1) % mGroupButtons.size()); + return TRUE; + case KEY_UP: + moveFocusedIconPrev(); + return TRUE; + case KEY_DOWN: + moveFocusedIconNext(); + return TRUE; + case KEY_ESCAPE: + hideFloater(); + return TRUE; + } } -} -void LLFloaterEmojiPicker::unselectGridIcon(LLUICtrl* ctrl) -{ - if (LLEmojiGridIcon* icon = dynamic_cast(ctrl)) + if (key == KEY_RETURN) { - icon->setBackgroundVisible(FALSE); - mPreview->setEmoji(nullptr); + U64 time = totalTime(); + // comes twice for unknown reason + if (mFocusedIcon && (time - mRecentReturnPressedMs > 100000)) // Min interval 0.1 sec. + { + onEmojiMouseDown(mFocusedIcon); + onEmojiMouseUp(mFocusedIcon); + } + mRecentReturnPressedMs = time; + return TRUE; } -} -// virtual -BOOL LLFloaterEmojiPicker::handleKey(KEY key, MASK mask, BOOL called_from_parent) -{ - if (mask == MASK_NONE) + if (mHint.empty()) { - LLFocusableElement* focus = gFocusMgr.getKeyboardFocus(); - if (focus == mEmojiGrid) + if (key >= 0x20 && key < 0x80) { - if (key == KEY_RETURN) + if (!mEmojiGrid->getPanelList().empty()) { - if (mFocusedIcon) + if (mFilterPattern.empty()) { - onEmojiMouseDown(mFocusedIcon); - onEmojiMouseUp(mFocusedIcon); - closeFloater(); - return TRUE; + mFilterPattern = ":"; } + mFilterPattern += (char)key; + initialize(); } - else if (key == KEY_TAB) - { - exitArrowMode(); - return TRUE; - } - else if (key == KEY_UP) - { - if (!moveFocusedIconUp()) - exitArrowMode(); - return TRUE; - } - else if (key == KEY_DOWN) - { - if (moveFocusedIconDown()) - return TRUE; - } - else if (key == KEY_LEFT) - { - if (moveFocusedIconLeft()) - return TRUE; - } - else if (key == KEY_RIGHT) - { - if (moveFocusedIconRight()) - return TRUE; - } + return TRUE; } - else // if (focus != mEmojiGrid) + else if (key == KEY_BACKSPACE) { - if (key == KEY_DOWN) + if (!mFilterPattern.empty()) { - if (enterArrowMode()) - return TRUE; + mFilterPattern.pop_back(); + if (mFilterPattern == ":") + { + mFilterPattern.clear(); + } + initialize(); } + return TRUE; } } @@ -868,30 +1099,14 @@ BOOL LLFloaterEmojiPicker::handleKey(KEY key, MASK mask, BOOL called_from_parent } // virtual -BOOL LLFloaterEmojiPicker::handleKeyHere(KEY key, MASK mask) +void LLFloaterEmojiPicker::goneFromFront() { - if (mask == MASK_NONE) - { - switch (key) - { - case KEY_ESCAPE: - closeFloater(); - return TRUE; - } - } - - return super::handleKeyHere(key, mask); + hideFloater(); } -// virtual -void LLFloaterEmojiPicker::closeFloater(bool app_quitting) +void LLFloaterEmojiPicker::hideFloater() const { - saveState(); - super::closeFloater(app_quitting); - if (mFloaterCloseCallback) - { - mFloaterCloseCallback(); - } + LLEmojiHelper::instance().hideHelper(nullptr, true); } // static @@ -938,18 +1153,17 @@ void LLFloaterEmojiPicker::onEmojiUsed(llwchar emoji) } // Append new if not found if (itf == sFrequentlyUsed.end()) - sFrequentlyUsed.push_back(std::make_pair(emoji, 1)); -} - -// static -void LLFloaterEmojiPicker::onRecentlyUsedChanged() -{ - if (sSelectedGroupIndex) - return; - - if (LLFloaterEmojiPicker* picker = getInstance()) { - picker->fillEmojis(); + // Insert before others with count == 1 + while (itf != sFrequentlyUsed.begin()) + { + auto prior = itf; + prior--; + if (prior->second > 1) + break; + itf = prior; + } + sFrequentlyUsed.insert(itf, std::make_pair(emoji, 1)); } } @@ -977,10 +1191,6 @@ void LLFloaterEmojiPicker::loadState() return; } - sSelectedGroupIndex = state[sKeySelectedGroupIndex].asInteger(); - - sFilterPattern = state[sKeyFilterPattern].asString(); - // Load and parse sRecentlyUsed std::string recentlyUsed = state[sKeyRecentlyUsed]; std::vector rtokens = LLStringUtil::getTokens(recentlyUsed, ","); @@ -1028,7 +1238,7 @@ void LLFloaterEmojiPicker::loadState() // Normalize by minimum if (!sFrequentlyUsed.empty()) { - U32 delta = sFrequentlyUsed.back().second; + U32 delta = sFrequentlyUsed.back().second - 1; for (auto& it : sFrequentlyUsed) { it.second = std::max((U32)0, it.second - delta); @@ -1047,16 +1257,6 @@ void LLFloaterEmojiPicker::saveState() LLSD state = LLSD::emptyMap(); - if (sSelectedGroupIndex) - { - state[sKeySelectedGroupIndex] = (int)sSelectedGroupIndex; - } - - if (!sFilterPattern.empty()) - { - state[sKeyFilterPattern] = sFilterPattern; - } - if (!sRecentlyUsed.empty()) { U32 maxCount = 20; diff --git a/indra/newview/llfloateremojipicker.h b/indra/newview/llfloateremojipicker.h index 48f66d7950..f169d67a4e 100644 --- a/indra/newview/llfloateremojipicker.h +++ b/indra/newview/llfloateremojipicker.h @@ -29,7 +29,10 @@ #include "llfloater.h" +class LLEmojiGridRow; +class LLEmojiGridIcon; struct LLEmojiDescriptor; +struct LLEmojiSearchResult; class LLFloaterEmojiPicker : public LLFloater { @@ -40,36 +43,40 @@ public: typedef boost::function pick_callback_t; typedef boost::function close_callback_t; - // Call this to select an emoji. - static LLFloaterEmojiPicker* getInstance(); - static LLFloaterEmojiPicker* showInstance(pick_callback_t pick_callback = nullptr, close_callback_t close_callback = nullptr); - LLFloaterEmojiPicker(const LLSD& key); - virtual ~LLFloaterEmojiPicker(); virtual BOOL postBuild() override; virtual void dirtyRect() override; + virtual void goneFromFront() override; - void show(pick_callback_t pick_callback = nullptr, close_callback_t close_callback = nullptr); - - virtual void closeFloater(bool app_quitting = false) override; + void hideFloater() const; static std::list& getRecentlyUsed(); static void onEmojiUsed(llwchar emoji); - static void onRecentlyUsedChanged(); + static void loadState(); static void saveState(); private: + void initialize(); void fillGroups(); - void moveGroups(); - void showPreview(bool show); + void fillCategoryRecentlyUsed(std::map>& cats); + void fillCategoryFrequentlyUsed(std::map>& cats); + void fillGroupEmojis(std::map>& cats, U32 index); + void createGroupButton(LLButton::Params& params, const LLRect& rect, llwchar emoji); + void resizeGroupButtons(); + void selectEmojiGroup(U32 index); void fillEmojis(bool fromResize = false); + void fillEmojisCategory(const std::vector& emojis, + const std::string& category, const LLPanel::Params& row_panel_params, const LLUICtrl::Params& row_list_params, + const LLPanel::Params& icon_params, const LLRect& icon_rect, S32 max_icons, const LLColor4& bg); + void createEmojiIcon(const LLEmojiSearchResult& emoji, + const std::string& category, const LLPanel::Params& row_panel_params, const LLUICtrl::Params& row_list_params, + const LLPanel::Params& icon_params, const LLRect& icon_rect, S32 max_icons, const LLColor4& bg, + LLEmojiGridRow*& row, int& icon_index); + void showPreview(bool show); void onGroupButtonClick(LLUICtrl* ctrl); - void onFilterChanged(); - void onGridMouseEnter(); - void onGridMouseLeave(); void onGroupButtonMouseEnter(LLUICtrl* ctrl); void onGroupButtonMouseLeave(LLUICtrl* ctrl); void onEmojiMouseEnter(LLUICtrl* ctrl); @@ -77,40 +84,37 @@ private: void onEmojiMouseDown(LLUICtrl* ctrl); void onEmojiMouseUp(LLUICtrl* ctrl); - bool enterArrowMode(); - void exitArrowMode(); void selectFocusedIcon(); - bool moveFocusedIconUp(); - bool moveFocusedIconDown(); - bool moveFocusedIconLeft(); - bool moveFocusedIconRight(); + bool moveFocusedIconPrev(); + bool moveFocusedIconNext(); - void selectGridIcon(LLUICtrl* ctrl); - void unselectGridIcon(LLUICtrl* ctrl); + void selectGridIcon(LLEmojiGridIcon* icon); + void unselectGridIcon(LLEmojiGridIcon* icon); + void onOpen(const LLSD& key) override; virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; - virtual BOOL handleKeyHere(KEY key, MASK mask) override; class LLPanel* mGroups { nullptr }; class LLPanel* mBadge { nullptr }; - class LLFilterEditor* mFilter { nullptr }; class LLScrollContainer* mEmojiScroll { nullptr }; class LLScrollingPanelList* mEmojiGrid { nullptr }; class LLEmojiPreviewPanel* mPreview { nullptr }; class LLTextBox* mDummy { nullptr }; - pick_callback_t mEmojiPickCallback; - close_callback_t mFloaterCloseCallback; - + std::vector mFilteredEmojiGroups; + std::vector>> mFilteredEmojis; std::vector mGroupButtons; - S32 mRecentBadgeWidth { 0 }; - S32 mRecentGridWidth { 0 }; + std::string mHint; + std::string mFilterPattern; + U32 mSelectedGroupIndex { 0 }; S32 mRecentMaxIcons { 0 }; S32 mFocusedIconRow { 0 }; S32 mFocusedIconCol { 0 }; - LLUICtrl* mFocusedIcon { nullptr }; - LLUICtrl* mHoveredIcon { nullptr }; + LLEmojiGridIcon* mFocusedIcon { nullptr }; + LLEmojiGridIcon* mHoveredIcon { nullptr }; + + U64 mRecentReturnPressedMs { 0 }; }; #endif diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 35b2af7b84..1e0540c88a 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -259,7 +259,7 @@ BOOL LLFloaterIMSessionTab::postBuild() mEmojiRecentPanelToggleBtn = getChild("emoji_recent_panel_toggle_btn"); mEmojiRecentPanelToggleBtn->setLabel(LLUIString(LLWString(1, 128512))); - mEmojiRecentPanelToggleBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiRecentPanelToggleBtnClicked(this); }); + mEmojiRecentPanelToggleBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiRecentPanelToggleBtnClicked(); }); mEmojiRecentPanel = getChild("emoji_recent_layout_panel"); mEmojiRecentPanel->setVisible(false); @@ -272,8 +272,8 @@ BOOL LLFloaterIMSessionTab::postBuild() mEmojiRecentIconsCtrl->setCommitCallback([this](LLUICtrl*, const LLSD& value) { onRecentEmojiPicked(value); }); mEmojiRecentIconsCtrl->setVisible(false); - mEmojiPickerToggleBtn = getChild("emoji_picker_toggle_btn"); - mEmojiPickerToggleBtn->setClickedCallback([](LLUICtrl*, const LLSD&) { onEmojiPickerToggleBtnClicked(); }); + mEmojiPickerShowBtn = getChild("emoji_picker_show_btn"); + mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); }); mGearBtn = getChild("gear_btn"); mAddBtn = getChild("add_btn"); @@ -452,56 +452,30 @@ void LLFloaterIMSessionTab::onInputEditorClicked() gToolBarView->flashCommand(LLCommandId("chat"), false); } -void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked(LLFloaterIMSessionTab* self) +void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked() { - bool show = !self->mEmojiRecentPanel->getVisible(); - bool restore_focus = !show || (gFocusMgr.getLastKeyboardFocus() == self->mInputEditor); - + BOOL show = mEmojiRecentPanel->getVisible() ? FALSE : TRUE; if (show) { - self->initEmojiRecentPanel(!restore_focus); + initEmojiRecentPanel(); } - self->mEmojiRecentPanel->setVisible(show ? TRUE : FALSE); - - if (restore_focus) - { - self->mInputEditor->setFocus(true); - } + mEmojiRecentPanel->setVisible(show); + mInputEditor->setFocus(TRUE); } -void LLFloaterIMSessionTab::onEmojiPickerToggleBtnClicked() +void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked() { - if (LLFloaterEmojiPicker* picker = LLFloaterEmojiPicker::getInstance()) - { - if (!picker->isShown()) - { - picker->show( - [](llwchar emoji) { onEmojiPicked(emoji); }, - []() { onEmojiPickerClosed(); }); - if (LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance()) - { - im_box->addDependentFloater(picker, TRUE, TRUE); - } - } - else - { - picker->closeFloater(); - } - } + mInputEditor->showEmojiHelper(); } -void LLFloaterIMSessionTab::initEmojiRecentPanel(bool moveFocus) +void LLFloaterIMSessionTab::initEmojiRecentPanel() { std::list& recentlyUsed = LLFloaterEmojiPicker::getRecentlyUsed(); if (recentlyUsed.empty()) { mEmojiRecentEmptyText->setVisible(TRUE); mEmojiRecentIconsCtrl->setVisible(FALSE); - if (moveFocus) - { - mEmojiPickerToggleBtn->setFocus(TRUE); - } } else { @@ -513,10 +487,6 @@ void LLFloaterIMSessionTab::initEmojiRecentPanel(bool moveFocus) mEmojiRecentIconsCtrl->setEmojis(emojis); mEmojiRecentEmptyText->setVisible(FALSE); mEmojiRecentIconsCtrl->setVisible(TRUE); - if (moveFocus) - { - mEmojiRecentIconsCtrl->setFocus(TRUE); - } } } @@ -534,31 +504,6 @@ void LLFloaterIMSessionTab::onRecentEmojiPicked(const LLSD& value) } } -// static -void LLFloaterIMSessionTab::onEmojiPicked(llwchar emoji) -{ - if (LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance()) - { - if (LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(im_box->getSelectedSession())) - { - session_floater->mInputEditor->insertEmoji(emoji); - session_floater->mInputEditor->setFocus(TRUE); - } - } -} - -// static -void LLFloaterIMSessionTab::onEmojiPickerClosed() -{ - if (LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance()) - { - if (LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(im_box->getSelectedSession())) - { - session_floater->mInputEditor->setFocus(TRUE); - } - } -} - void LLFloaterIMSessionTab::closeFloater(bool app_quitting) { LLFloaterEmojiPicker::saveState(); @@ -624,11 +569,11 @@ void LLFloaterIMSessionTab::updateUsedEmojis(LLWString text) if (!emojiSent) return; - LLFloaterEmojiPicker::onRecentlyUsedChanged(); + LLFloaterEmojiPicker::saveState(); if (mEmojiRecentPanel->getVisible()) { - initEmojiRecentPanel(false); + initEmojiRecentPanel(); } } diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h index ddffed57a3..cc985b2753 100644 --- a/indra/newview/llfloaterimsessiontab.h +++ b/indra/newview/llfloaterimsessiontab.h @@ -189,7 +189,7 @@ protected: LLButton* mExpandCollapseBtn; LLButton* mTearOffBtn; LLButton* mEmojiRecentPanelToggleBtn; - LLButton* mEmojiPickerToggleBtn; + LLButton* mEmojiPickerShowBtn; LLButton* mCloseBtn; LLButton* mGearBtn; LLButton* mAddBtn; @@ -215,12 +215,10 @@ private: void onInputEditorClicked(); - static void onEmojiRecentPanelToggleBtnClicked(LLFloaterIMSessionTab* self); - static void onEmojiPickerToggleBtnClicked(); - void initEmojiRecentPanel(bool moveFocus); + void onEmojiRecentPanelToggleBtnClicked(); + void onEmojiPickerShowBtnClicked(); + void initEmojiRecentPanel(); void onRecentEmojiPicked(const LLSD& value); - static void onEmojiPicked(llwchar emoji); - static void onEmojiPickerClosed(); bool checkIfTornOff(); bool mIsHostAttached; diff --git a/indra/newview/skins/default/xui/en/floater_emoji_picker.xml b/indra/newview/skins/default/xui/en/floater_emoji_picker.xml index a89d97d8e9..d21f8c82bc 100644 --- a/indra/newview/skins/default/xui/en/floater_emoji_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_emoji_picker.xml @@ -3,33 +3,26 @@ name="emojipicker" title="CHOOSE EMOJI" help_topic="emojipicker" - positioning="cascading" - legacy_header_height="0" + single_instance="true" + can_minimize="false" + can_tear_off="false" can_resize="true" + auto_close="true" layout="topleft" min_width="250" - height="400" - width="250"> + chrome="true" + height="350" + width="304"> - + height="275"> + left="0"/> + height="25"> No emoji selected + height="25">No emoji selected diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index eb5d88bba6..94400f6501 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -306,6 +306,7 @@ follows="right|bottom" use_font_color="true" font="EmojiLarge" + tab_stop="false" image_hover_unselected="Toolbar_Middle_Over" image_selected="Toolbar_Middle_Selected" image_unselected="Toolbar_Middle_Off" @@ -353,17 +354,19 @@ name="emoji_recent_icons_ctrl" follows="top|left|right" layout="topleft" + tab_stop="false" max_visible="20" top="0" left="1" right="-65" height="30"/> + + diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 6444ea2540..b3bf977df2 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3633,6 +3633,14 @@ function="World.EnvPreset" + + + + -- cgit v1.2.3 From 757655d7c342d66711937ff7786a50f1c52d8699 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 22 Mar 2024 22:36:45 +0200 Subject: Revert "SL-20416 Fix Crash Report 1409376 (update)" This reverts commit cc43f42e6b7401c2cdd3204a16f757f5169bd95b. --- indra/llui/llfloater.cpp | 11 +---------- indra/llui/llfloater.h | 1 - 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index de3de53569..fb90cebd39 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -506,7 +506,6 @@ void LLFloater::enableResizeCtrls(bool enable, bool width, bool height) void LLFloater::destroy() { - gFloaterView->onDestroyFloater(this); // LLFloaterReg should be synchronized with "dead" floater to avoid returning dead instance before // it was deleted via LLMortician::updateClass(). See EXT-8458. LLFloaterReg::removeInstance(mInstanceName, mKey); @@ -2573,7 +2572,7 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore return; } - if (mFrontChild) + if (mFrontChild && !mFrontChild->isDead() && mFrontChild->getVisible()) { mFrontChild->goneFromFront(); } @@ -3235,14 +3234,6 @@ void LLFloaterView::setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LL } } -void LLFloaterView::onDestroyFloater(LLFloater* floater) -{ - if (mFrontChild == floater) - { - mFrontChild = nullptr; - } -} - void LLFloater::setInstanceName(const std::string& name) { if (name != mInstanceName) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 88f9e77777..5f4e1a2cad 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -607,7 +607,6 @@ public: LLFloater* getFrontmostClosableFloater(); void setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect); - void onDestroyFloater(LLFloater* floater); private: void hiddenFloaterClosed(LLFloater* floater); -- cgit v1.2.3 From 689ef9442581d7af8ff0e0264be4919fe6cffd73 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 22 Mar 2024 23:04:56 +0200 Subject: viewer#1033 Crash at syncFloaterTabOrder --- indra/llui/llfloater.cpp | 22 ++++++++++++---------- indra/llui/llfloater.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index fb90cebd39..cf33d633ad 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2406,8 +2406,7 @@ LLFloaterView::LLFloaterView (const Params& p) mFocusCycleMode(FALSE), mMinimizePositionVOffset(0), mSnapOffsetBottom(0), - mSnapOffsetRight(0), - mFrontChild(NULL) + mSnapOffsetRight(0) { mSnapView = getHandle(); } @@ -2563,7 +2562,8 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore if (!child) return; - if (mFrontChild == child) + LLFloater* front_child = mFrontChildHandle.get(); + if (front_child == child) { if (give_focus && child->canFocusStealFrontmost() && !gFocusMgr.childHasKeyboardFocus(child)) { @@ -2572,12 +2572,12 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore return; } - if (mFrontChild && !mFrontChild->isDead() && mFrontChild->getVisible()) + if (front_child && front_child->getVisible()) { - mFrontChild->goneFromFront(); + front_child->goneFromFront(); } - mFrontChild = child; + mFrontChildHandle = child->getHandle(); // *TODO: make this respect floater's mAutoFocus value, instead of // using parameter @@ -3076,7 +3076,8 @@ LLFloater *LLFloaterView::getBackmost() const void LLFloaterView::syncFloaterTabOrder() { - if (mFrontChild && !mFrontChild->isDead() && mFrontChild->getIsChrome()) + LLFloater* front_child = mFrontChildHandle.get(); + if (front_child && front_child->getIsChrome()) return; // look for a visible modal dialog, starting from first @@ -3114,11 +3115,12 @@ void LLFloaterView::syncFloaterTabOrder() LLFloater* floaterp = dynamic_cast(*child_it); if (gFocusMgr.childHasKeyboardFocus(floaterp)) { - if (mFrontChild != floaterp) + LLFloater* front_child = mFrontChildHandle.get(); + if (front_child != floaterp) { // Grab a list of the top floaters that want to stay on top of the focused floater std::list listTop; - if (mFrontChild && !mFrontChild->canFocusStealFrontmost()) + if (front_child && !front_child->canFocusStealFrontmost()) { for (LLView* childp : *getChildList()) { @@ -3138,7 +3140,7 @@ void LLFloaterView::syncFloaterTabOrder() { sendChildToFront(childp); } - mFrontChild = listTop.back(); + mFrontChildHandle = listTop.back()->getHandle(); } } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 5f4e1a2cad..39957386df 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -622,7 +622,7 @@ private: S32 mMinimizePositionVOffset; typedef std::vector, boost::signals2::connection> > hidden_floaters_t; hidden_floaters_t mHiddenFloaters; - LLFloater * mFrontChild; + LLHandle mFrontChildHandle; }; // -- cgit v1.2.3 From f815b015cecda18098dd2d16f65682a37e1bff7c Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Tue, 26 Mar 2024 03:19:06 +0100 Subject: secondlife/jira-archive-internal#69593 Avatar is upside down when viewed from below --- indra/newview/llagent.cpp | 30 ++++---- indra/newview/llfloatercamera.cpp | 81 ++++++++++++++-------- .../skins/default/xui/en/floater_camera.xml | 6 +- 3 files changed, 72 insertions(+), 45 deletions(-) diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d1e1815a79..13501833b2 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1468,23 +1468,27 @@ void LLAgent::pitch(F32 angle) LLVector3 skyward = getReferenceUpVector(); - // SL-19286 Avatar is upside down when viewed from below - // after left-clicking the mouse on the avatar and dragging down - // - // The issue is observed on angle below 10 degrees - const F32 look_down_limit = 179.f * DEG_TO_RAD; - const F32 look_up_limit = 10.f * DEG_TO_RAD; - - F32 angle_from_skyward = acos(mFrameAgent.getAtAxis() * skyward); - // clamp pitch to limits - if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit)) + if (angle >= 0.f) { - angle = look_down_limit - angle_from_skyward; + const F32 look_down_limit = 179.f * DEG_TO_RAD; + F32 angle_from_skyward = acos(mFrameAgent.getAtAxis() * skyward); + if (angle_from_skyward + angle > look_down_limit) + { + angle = look_down_limit - angle_from_skyward; + } } - else if ((angle < 0.f) && (angle_from_skyward + angle < look_up_limit)) + else if (angle < 0.f) { - angle = look_up_limit - angle_from_skyward; + const F32 look_up_limit = 5.f * DEG_TO_RAD; + const LLVector3& viewer_camera_pos = LLViewerCamera::getInstance()->getOrigin(); + LLVector3 agent_focus_pos = getPosAgentFromGlobal(gAgentCamera.calcFocusPositionTargetGlobal()); + LLVector3 look_dir = agent_focus_pos - viewer_camera_pos; + F32 angle_from_skyward = angle_between(look_dir, skyward); + if (angle_from_skyward + angle < look_up_limit) + { + angle = look_up_limit - angle_from_skyward; + } } if (fabs(angle) > 1e-4) diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 177e2a8567..7985ce447f 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -248,23 +248,25 @@ void activate_camera_tool() class LLCameraInfoPanel : public LLPanel { - const S32 MARGIN { 10 }; - - const char* mTitle; - const LLCoordFrame* mCamera; - const LLFontGL* mFont; - public: - LLCameraInfoPanel(const LLView* parent, const LLCoordFrame* camera, const char* title) - : LLPanel([&]() -> LLPanel::Params - { - LLPanel::Params params; - params.rect = LLRect(parent->getLocalRect()); - return params; - }()) - , mTitle(title) - , mCamera(camera) - , mFont(LLFontGL::getFontSansSerifBig()) + typedef std::function get_vector_t; + + LLCameraInfoPanel( + const LLView* parent, + const char* title, + const LLCoordFrame& camera, + const get_vector_t get_focus + ) + : LLPanel([&]() -> LLPanel::Params + { + LLPanel::Params params; + params.rect = LLRect(parent->getLocalRect()); + return params; + }()) + , mTitle(title) + , mCamera(camera) + , mGetFocus(get_focus) + , mFont(LLFontGL::getFontSansSerifBig()) { } @@ -272,25 +274,44 @@ public: { LLPanel::draw(); + static const U32 HPADDING = 10; + static const U32 VPADDING = 5; + LLVector3 focus = mGetFocus(); + LLVector3 sight = focus - mCamera.mOrigin; + std::pair const data[] = + { + { "Origin:", mCamera.mOrigin }, + { "X Axis:", mCamera.mXAxis }, + { "Y Axis:", mCamera.mYAxis }, + { "Z Axis:", mCamera.mZAxis }, + { "Focus:", focus }, + { "Sight:", sight } + }; S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); - S32 top = MARGIN / 2 + (height - MARGIN) / 10 * 9; - mFont->renderUTF8(mTitle, 0, MARGIN, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); - const LLVector3* const vectors[] = { &mCamera->getOrigin(), &mCamera->getXAxis(), &mCamera->getYAxis(), &mCamera->getZAxis() }; - for (int row = 0; row < 4; ++row) + S32 row_count = 1 + sizeof(data) / sizeof(*data); + S32 row_height = (height - VPADDING * 2) / row_count; + S32 top = height - VPADDING - row_height / 2; + mFont->renderUTF8(mTitle, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); + for (const auto& row : data) { - top -= (height - MARGIN) / 5; - static const char* const labels[] = { "Origin:", "X Axis:", "Y Axis:", "Z Axis:" }; - mFont->renderUTF8(labels[row], 0, MARGIN, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); - const LLVector3& vector = *vectors[row]; - for (int col = 0; col < 3; ++col) + top -= row_height; + mFont->renderUTF8(row.first, 0, HPADDING, top, LLColor4::white, LLFontGL::LEFT, LLFontGL::VCENTER); + const LLVector3& vector = row.second; + for (S32 i = 0; i < 3; ++i) { - std::string text = llformat("%.6f", vector[col]); - S32 right = width / 4 * (col + 2) - MARGIN; + std::string text = llformat("%.6f", vector[i]); + S32 right = width / 4 * (i + 2) - HPADDING; mFont->renderUTF8(text, 0, right, top, LLColor4::white, LLFontGL::RIGHT, LLFontGL::VCENTER); } } } + +private: + const char* mTitle; + const LLCoordFrame& mCamera; + const get_vector_t mGetFocus; + const LLFontGL* mFont; }; // @@ -344,8 +365,10 @@ void LLFloaterCamera::showDebugInfo(bool show) // Initially LLPanel contains 1 child "view_border" if (show && mViewerCameraInfo->getChildCount() < 2) { - mViewerCameraInfo->addChild(new LLCameraInfoPanel(mViewerCameraInfo, LLViewerCamera::getInstance(), "Viewer Camera")); - mAgentCameraInfo->addChild(new LLCameraInfoPanel(mAgentCameraInfo, &gAgent.getFrameAgent(), "Agent Camera")); + mViewerCameraInfo->addChild(new LLCameraInfoPanel(mViewerCameraInfo, "Viewer Camera", *LLViewerCamera::getInstance(), + []() { return LLViewerCamera::getInstance()->getPointOfInterest(); })); + mAgentCameraInfo->addChild(new LLCameraInfoPanel(mAgentCameraInfo, "Agent Camera", gAgent.getFrameAgent(), + []() { return gAgent.getPosAgentFromGlobal(gAgentCamera.calcFocusPositionTargetGlobal()); })); } mAgentCameraInfo->setVisible(show); diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 8774b12e2b..93cfdf6030 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -258,16 +258,16 @@ left="0" top="135" width="400" - height="130" + height="150" border="true" visible="false" background_visible="true"/> -- cgit v1.2.3 From 9567393f803dfb0c786b8e917e41c8f4b8b22af7 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 26 Mar 2024 16:56:26 -0400 Subject: Increment viewer version to 7.1.5 following promotion of secondlife/viewer #650 --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index b7f8ee41e6..69adf3456f 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.4 +7.1.5 -- cgit v1.2.3 From 2b1e372f760c8dd7510418e1c2362804b7c854b3 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Sat, 30 Mar 2024 21:21:55 -0700 Subject: Remove BuildParams This file is no longer used. --- BuildParams | 73 ------------------------------------------------------------- build.sh | 3 --- 2 files changed, 76 deletions(-) delete mode 100644 BuildParams diff --git a/BuildParams b/BuildParams deleted file mode 100644 index dda25e3e63..0000000000 --- a/BuildParams +++ /dev/null @@ -1,73 +0,0 @@ -# BuildParams -# -# Please refer to: -# https://wiki.secondlife.com/wiki/Automated_Build_System - -# Variants (NOTE: 'Release' must be last for uploads to work correctly) -variants = "RelWithDebInfo Release" - -# Use Public Upload Locations -public_build = true -build_docs = true - -# enable Doxygen building on Linux for TeamCity (it can be done manually on any platform) -build_Linux_Doxygen = true - -# Need viewer-build-variables as well as other shared repositories -buildscripts_shared_more_NAMEs="build_secrets build_variables git_hooks" - -# Python 3 / SL-15742 -BUILDSCRIPTS_PY3 = "true" - -################################################################ -#### Examples of how to set the viewer_channel #### -# -# To build a Release or Release candidate in build bingo: -# bingo.viewer_channel = "Second Life Release" -# -# To build a Beta for the 'Bingo' project in build bingo: -# bingo.viewer_channel = "Second Life Beta Bingo" -# -# To build a Project viewer for the 'Bingo' project in build bingo: -# bingo.viewer_channel = "Second Life Project Bingo" -# -# If left unset, viewer_channel defaults to 'Second Life Test', -# which is appropriate for individual developer builds. -# -# All Linden Lab builds (and only Linden Lab builds) -# should use a viewer_channel that begins with "Second Life" -################################################################ -viewer_channel = "Second Life Test" - - -################################################################ -# Special packaging parameters. -# These parameters can be used to create additional packages -# which identify themselves in a distinct way with either -# a sourceid (sent to web services) or a channel name (sent to login) -# the default sourceid should always be a null string: -sourceid = "" -# the additional_packages variable is a blank separated list of package prefixes: -# additional_packages = "" -# to set the special values for a package, create variables using each prefix: -# additional_packages = "Foo Bar" -# Foo_sourceid = "bingo" -# Foo_viewer_channel_suffix = "Foo" -# Bar_sourceid = "bongo" -# Bar_viewer_channel_suffix = "Bar" -# the viewer_channel_suffix is prefixed by a blank and then appended to the viewer_channel -# for the package in a setting that overrides the compiled-in value -################################################################ -additional_packages = "EDU" -Linux.additional_packages = "" - -# The EDU package allows us to create a separate release channel whose expirations -# are synchronized as much as possible with the academic year -EDU_sourceid = "" -EDU_viewer_channel_suffix = "edu" - -# Notifications - to configure email notices use the TeamCity parameter -# setting screen for your project or build configuration to set the -# environment variable 'email' to a space-separated list of email addresses -email="" - diff --git a/build.sh b/build.sh index f7b3632ee8..fe795a24ee 100755 --- a/build.sh +++ b/build.sh @@ -6,9 +6,6 @@ # it relies on the environment that sets up, functions it provides, and # the build result post-processing it does. # -# The shared buildscript build.sh invokes this because it is named 'build.sh', -# which is the default custom build script name in buildscripts/hg/BuildParams -# # PLEASE NOTE: # # * This script is interpreted on three platforms, including windows and cygwin -- cgit v1.2.3 From da9a1dcb55548a249ff7a1255f3e518696b81245 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 9 Apr 2024 17:14:13 -0400 Subject: Increment viewer version to 7.1.6 following promotion of secondlife/viewer #690 --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 69adf3456f..14627a7c8c 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.5 +7.1.6 -- cgit v1.2.3 From 72d46037bd03dfcdf7f3804bb70a8cff86107a2a Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Wed, 10 Apr 2024 21:21:09 -0700 Subject: Remove unused fix-incredibuild.py --- indra/fix-incredibuild.py | 61 ----------------------------------------------- 1 file changed, 61 deletions(-) delete mode 100755 indra/fix-incredibuild.py diff --git a/indra/fix-incredibuild.py b/indra/fix-incredibuild.py deleted file mode 100755 index 678ee4329e..0000000000 --- a/indra/fix-incredibuild.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -## -## $LicenseInfo:firstyear=2011&license=viewerlgpl$ -## Second Life Viewer Source Code -## Copyright (C) 2011, 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$ - -import sys -import os -import glob - -def delete_file_types(path, filetypes): - if os.path.exists(path): - print('Cleaning: ' + path) - orig_dir = os.getcwd(); - os.chdir(path) - filelist = [] - for type in filetypes: - filelist.extend(glob.glob(type)) - for file in filelist: - os.remove(file) - os.chdir(orig_dir) - -def main(): - build_types = ['*.exp','*.exe','*.pdb','*.idb', - '*.ilk','*.lib','*.obj','*.ib_pdb_index'] - pch_types = ['*.pch'] - delete_file_types("build-vc80/newview/Release", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/Release/", - pch_types) - delete_file_types("build-vc80/newview/RelWithDebInfo", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/RelWithDebInfo/", - pch_types) - delete_file_types("build-vc80/newview/Debug", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/Debug/", - pch_types) - - - delete_file_types("build-vc80/test/RelWithDebInfo", build_types) - delete_file_types("build-vc80/test/test.dir/RelWithDebInfo/", - pch_types) - - -if __name__ == "__main__": - main() -- cgit v1.2.3 From 7fa24d636e42c19baf8a9a6fc4bf9b554dca0e3a Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Thu, 11 Apr 2024 00:16:17 -0700 Subject: CI: Remove python-version from matrix Drop python version from matrix configuration as it's always 3.11. --- .github/workflows/build.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ddb0f44150..f18b31ef0f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,6 @@ jobs: matrix: runner: [windows-large, macos-12-xl] configuration: [Release, ReleaseOS] - python-version: ["3.11"] include: - runner: macos-12-xl developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer" @@ -67,7 +66,7 @@ jobs: - name: Setup python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: "3.11" - name: Checkout build variables uses: actions/checkout@v4 -- cgit v1.2.3 From 0f94ea86d44f56ace4160eabceafe07a1f11784f Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Thu, 11 Apr 2024 13:32:48 -0700 Subject: CI: adopt xz compression Move towards packaging artifacts with xz, which offers higher compression ratios and faster decode time. --- .github/workflows/build.yaml | 58 +++++++++++++++------------------------- build.sh | 10 +++---- indra/newview/CMakeLists.txt | 12 ++++----- indra/newview/viewer_manifest.py | 14 +++++----- 4 files changed, 40 insertions(+), 54 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f18b31ef0f..44f32c1c5d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,13 +12,10 @@ jobs: strategy: matrix: runner: [windows-large, macos-12-xl] - configuration: [Release, ReleaseOS] + configuration: [Release] include: - runner: macos-12-xl developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer" - exclude: - - runner: macos-12-xl - configuration: ReleaseOS runs-on: ${{ matrix.runner }} outputs: viewer_channel: ${{ steps.build.outputs.viewer_channel }} @@ -100,7 +97,7 @@ jobs: - name: Determine source branch id: which-branch - uses: secondlife/viewer-build-util/which-branch@v1 + uses: secondlife/viewer-build-util/which-branch@v2 with: token: ${{ github.token }} @@ -223,7 +220,7 @@ jobs: - name: Upload executable if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.viewer_app - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-app" path: | @@ -233,7 +230,7 @@ jobs: # artifact for that too. - name: Upload symbol file if: matrix.configuration != 'ReleaseOS' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-symbols" path: | @@ -241,7 +238,7 @@ jobs: - name: Upload metadata if: matrix.configuration != 'ReleaseOS' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-metadata" # emitted by build.sh, possibly multiple lines @@ -249,7 +246,7 @@ jobs: ${{ steps.build.outputs.metadata }} - name: Upload physics package - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 # should only be set for viewer-private if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.physicstpv with: @@ -270,7 +267,7 @@ jobs: steps: - name: Sign and package Windows viewer if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID - uses: secondlife/viewer-build-util/sign-pkg-windows@v1 + uses: secondlife/viewer-build-util/sign-pkg-windows@v2 with: vault_uri: "${{ env.AZURE_KEY_VAULT_URI }}" cert_name: "${{ env.AZURE_CERT_NAME }}" @@ -309,7 +306,7 @@ jobs: - name: Sign and package Mac viewer if: env.SIGNING_CERT_MACOS && env.SIGNING_CERT_MACOS_IDENTITY && env.SIGNING_CERT_MACOS_PASSWORD && steps.note-creds.outputs.note_user && steps.note-creds.outputs.note_pass && steps.note-creds.outputs.note_team - uses: secondlife/viewer-build-util/sign-pkg-mac@v1 + uses: secondlife/viewer-build-util/sign-pkg-mac@v2 with: channel: ${{ needs.build.outputs.viewer_channel }} imagename: ${{ needs.build.outputs.imagename }} @@ -329,7 +326,7 @@ jobs: steps: - name: Post Windows symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: secondlife/viewer-build-util/post-bugsplat-windows@v1 + uses: secondlife/viewer-build-util/post-bugsplat-windows@v2 with: username: ${{ env.BUGSPLAT_USER }} password: ${{ env.BUGSPLAT_PASS }} @@ -346,7 +343,7 @@ jobs: steps: - name: Post Mac symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: secondlife/viewer-build-util/post-bugsplat-mac@v1 + uses: secondlife/viewer-build-util/post-bugsplat-mac@v2 with: username: ${{ env.BUGSPLAT_USER }} password: ${{ env.BUGSPLAT_PASS }} @@ -359,31 +356,20 @@ jobs: runs-on: ubuntu-latest if: github.ref_type == 'tag' && startsWith(github.ref_name, 'Second_Life_') steps: - - uses: actions/download-artifact@v3 - with: - name: Windows-installer - - - uses: actions/download-artifact@v3 - with: - name: macOS-installer - - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: - name: Windows-metadata - - - name: Rename windows metadata - run: | - mv autobuild-package.xml Windows-autobuild-package.xml - mv newview/viewer_version.txt Windows-viewer_version.txt + pattern: "*-installer" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: - name: macOS-metadata - - - name: Rename macOS metadata + pattern: "*-metadata" + + - name: Rename metadata run: | - mv autobuild-package.xml macOS-autobuild-package.xml - mv newview/viewer_version.txt macOS-viewer_version.txt + cp Windows-metadata/autobuild-package.xml Windows-autobuild-package.xml + cp Windows-metadata/newview/viewer_version.txt Windows-viewer_version.txt + cp macOS-metadata/autobuild-package.xml macOS-autobuild-package.xml + cp macOS-metadata/newview/viewer_version.txt macOS-viewer_version.txt # forked from softprops/action-gh-release - name: Create GitHub release @@ -406,8 +392,8 @@ jobs: append_body: true fail_on_unmatched_files: true files: | - *.dmg - *.exe + macOS-installer/*.dmg + Windows-installer/*.exe *-autobuild-package.xml *-viewer_version.txt diff --git a/build.sh b/build.sh index 806718e077..46a287ea32 100755 --- a/build.sh +++ b/build.sh @@ -82,7 +82,7 @@ installer_Linux() { local package_name="$1" local package_dir="$(build_dir_Linux)/newview/" - local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.bz2\$" + local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.xz\$" # since the additional packages are built after the base package, # sorting oldest first ensures that the unqualified package is returned # even if someone makes a qualified name that duplicates the last word of the base name @@ -170,7 +170,7 @@ pre_build() # This name is consumed by indra/newview/CMakeLists.txt. Make it # absolute because we've had troubles with relative pathnames. abs_build_dir="$(cd "$build_dir"; pwd)" - VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.bz2")" + VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.xz")" fi # honor autobuild_configure_parameters same as sling-buildscripts @@ -414,10 +414,10 @@ do fi if [ -d "$build_dir/doxygen/html" ] then - tar -c -f "$build_dir/viewer-doxygen.tar.bz2" --strip-components 3 "$build_dir/doxygen/html" - python_cmd "$helpers/codeticket.py" addoutput "Doxygen Tarball" "$build_dir/viewer-doxygen.tar.bz2" \ + tar -cJf "$build_dir/viewer-doxygen.tar.xz" --strip-components 3 "$build_dir/doxygen/html" + python_cmd "$helpers/codeticket.py" addoutput "Doxygen Tarball" "$build_dir/viewer-doxygen.tar.xz" \ || fatal "Upload of doxygen tarball failed" - metadata+=("$build_dir/viewer-doxygen.tar.bz2") + metadata+=("$build_dir/viewer-doxygen.tar.xz") fi ;; *) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 355f35c558..39f6117c69 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1820,7 +1820,7 @@ if (WINDOWS) if (PACKAGE) add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py @@ -1864,7 +1864,7 @@ if (WINDOWS) ) # temporarily disable packaging of event_host until hg subrepos get # sorted out on the parabuild cluster... - #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) + #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz) endif (PACKAGE) elseif (DARWIN) @@ -1984,7 +1984,7 @@ if (LINUX) #endif (NOT USE_BUGSPLAT) add_custom_command( - OUTPUT ${product}.tar.bz2 + OUTPUT ${product}.tar.xz COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2038,7 +2038,7 @@ if (LINUX) add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched) if (PACKAGE) - add_custom_target(llpackage ALL DEPENDS ${product}.tar.bz2) + add_custom_target(llpackage ALL DEPENDS ${product}.tar.xz) # Make sure we don't run two instances of viewer_manifest.py at the same time. add_dependencies(llpackage copy_l_viewer_manifest) check_message_template(llpackage) @@ -2169,12 +2169,12 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN OUTPUT_STRIP_TRAILING_WHITESPACE) add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" - # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.bz2; + # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.xz; # testing a string suffix is painful enough in CMake language that # we'll continue assuming it until forced to generalize. COMMAND "tar" ARGS - "cjf" + "cJf" "${VIEWER_SYMBOL_FILE_CYGWIN}" "-C" "${PARENT_DIRECTORY_CYGWIN}" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c7f32d0da9..4de4dc8fc5 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -525,7 +525,7 @@ class Windows_x86_64_Manifest(ViewerManifest): 'secondlife-bin.*', '*_Setup.exe', '*.bat', - '*.tar.bz2'))) + '*.tar.xz'))) with self.prefix(src=os.path.join(pkgdir, "VMP")): # include the compiled launcher scripts so that it gets included in the file_list @@ -1183,9 +1183,9 @@ class Darwin_x86_64_Manifest(ViewerManifest): # causes problems, especially with frameworks: a framework's top # level must contain symlinks into its Versions/Current, which # must itself be a symlink to some specific Versions subdir. - tarpath = os.path.join(RUNNER_TEMP, "viewer.tar.bz2") + tarpath = os.path.join(RUNNER_TEMP, "viewer.tar.xz") print(f'Creating {tarpath} from {self.get_dst_prefix()}') - with tarfile.open(tarpath, mode="w:bz2") as tarball: + with tarfile.open(tarpath, mode="w:xz") as tarball: # Store in the tarball as just 'Second Life Mumble.app' # instead of 'Users/someone/.../newview/Release/Second...' # It's at this point that we rename 'Second Life Release.app' @@ -1272,7 +1272,7 @@ class LinuxManifest(ViewerManifest): self.run_command(['find', self.get_dst_prefix(), '-type', 'f', '-perm', old, '-exec', 'chmod', new, '{}', ';']) - self.package_file = installer_name + '.tar.bz2' + self.package_file = installer_name + '.tar.xz' # temporarily move directory tree so that it has the right # name in the tarfile @@ -1285,10 +1285,10 @@ class LinuxManifest(ViewerManifest): # --numeric-owner hides the username of the builder for # security etc. self.run_command(['tar', '-C', self.get_build_prefix(), - '--numeric-owner', '-cjf', - tempname + '.tar.bz2', installer_name]) + '--numeric-owner', '-cJf', + tempname + '.tar.xz', installer_name]) else: - print("Skipping %s.tar.bz2 for non-Release build (%s)" % \ + print("Skipping %s.tar.xz for non-Release build (%s)" % \ (installer_name, self.args['buildtype'])) finally: self.run_command(["mv", tempname, realname]) -- cgit v1.2.3 From e1f9356e917c197a26557467b84304c33432bb24 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Sat, 30 Mar 2024 21:21:55 -0700 Subject: Remove BuildParams This file is no longer used. --- BuildParams | 73 ------------------------------------------------------------- build.sh | 3 --- 2 files changed, 76 deletions(-) delete mode 100644 BuildParams diff --git a/BuildParams b/BuildParams deleted file mode 100644 index dda25e3e63..0000000000 --- a/BuildParams +++ /dev/null @@ -1,73 +0,0 @@ -# BuildParams -# -# Please refer to: -# https://wiki.secondlife.com/wiki/Automated_Build_System - -# Variants (NOTE: 'Release' must be last for uploads to work correctly) -variants = "RelWithDebInfo Release" - -# Use Public Upload Locations -public_build = true -build_docs = true - -# enable Doxygen building on Linux for TeamCity (it can be done manually on any platform) -build_Linux_Doxygen = true - -# Need viewer-build-variables as well as other shared repositories -buildscripts_shared_more_NAMEs="build_secrets build_variables git_hooks" - -# Python 3 / SL-15742 -BUILDSCRIPTS_PY3 = "true" - -################################################################ -#### Examples of how to set the viewer_channel #### -# -# To build a Release or Release candidate in build bingo: -# bingo.viewer_channel = "Second Life Release" -# -# To build a Beta for the 'Bingo' project in build bingo: -# bingo.viewer_channel = "Second Life Beta Bingo" -# -# To build a Project viewer for the 'Bingo' project in build bingo: -# bingo.viewer_channel = "Second Life Project Bingo" -# -# If left unset, viewer_channel defaults to 'Second Life Test', -# which is appropriate for individual developer builds. -# -# All Linden Lab builds (and only Linden Lab builds) -# should use a viewer_channel that begins with "Second Life" -################################################################ -viewer_channel = "Second Life Test" - - -################################################################ -# Special packaging parameters. -# These parameters can be used to create additional packages -# which identify themselves in a distinct way with either -# a sourceid (sent to web services) or a channel name (sent to login) -# the default sourceid should always be a null string: -sourceid = "" -# the additional_packages variable is a blank separated list of package prefixes: -# additional_packages = "" -# to set the special values for a package, create variables using each prefix: -# additional_packages = "Foo Bar" -# Foo_sourceid = "bingo" -# Foo_viewer_channel_suffix = "Foo" -# Bar_sourceid = "bongo" -# Bar_viewer_channel_suffix = "Bar" -# the viewer_channel_suffix is prefixed by a blank and then appended to the viewer_channel -# for the package in a setting that overrides the compiled-in value -################################################################ -additional_packages = "EDU" -Linux.additional_packages = "" - -# The EDU package allows us to create a separate release channel whose expirations -# are synchronized as much as possible with the academic year -EDU_sourceid = "" -EDU_viewer_channel_suffix = "edu" - -# Notifications - to configure email notices use the TeamCity parameter -# setting screen for your project or build configuration to set the -# environment variable 'email' to a space-separated list of email addresses -email="" - diff --git a/build.sh b/build.sh index 251a04a6dd..806718e077 100755 --- a/build.sh +++ b/build.sh @@ -6,9 +6,6 @@ # it relies on the environment that sets up, functions it provides, and # the build result post-processing it does. # -# The shared buildscript build.sh invokes this because it is named 'build.sh', -# which is the default custom build script name in buildscripts/hg/BuildParams -# # PLEASE NOTE: # # * This script is interpreted on three platforms, including windows and cygwin -- cgit v1.2.3 From 970531b483e4cab8c5b9608028f19626ce6f0cce Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Wed, 10 Apr 2024 21:21:09 -0700 Subject: Remove unused fix-incredibuild.py --- indra/fix-incredibuild.py | 61 ----------------------------------------------- 1 file changed, 61 deletions(-) delete mode 100755 indra/fix-incredibuild.py diff --git a/indra/fix-incredibuild.py b/indra/fix-incredibuild.py deleted file mode 100755 index 678ee4329e..0000000000 --- a/indra/fix-incredibuild.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -## -## $LicenseInfo:firstyear=2011&license=viewerlgpl$ -## Second Life Viewer Source Code -## Copyright (C) 2011, 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$ - -import sys -import os -import glob - -def delete_file_types(path, filetypes): - if os.path.exists(path): - print('Cleaning: ' + path) - orig_dir = os.getcwd(); - os.chdir(path) - filelist = [] - for type in filetypes: - filelist.extend(glob.glob(type)) - for file in filelist: - os.remove(file) - os.chdir(orig_dir) - -def main(): - build_types = ['*.exp','*.exe','*.pdb','*.idb', - '*.ilk','*.lib','*.obj','*.ib_pdb_index'] - pch_types = ['*.pch'] - delete_file_types("build-vc80/newview/Release", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/Release/", - pch_types) - delete_file_types("build-vc80/newview/RelWithDebInfo", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/RelWithDebInfo/", - pch_types) - delete_file_types("build-vc80/newview/Debug", build_types) - delete_file_types("build-vc80/newview/secondlife-bin.dir/Debug/", - pch_types) - - - delete_file_types("build-vc80/test/RelWithDebInfo", build_types) - delete_file_types("build-vc80/test/test.dir/RelWithDebInfo/", - pch_types) - - -if __name__ == "__main__": - main() -- cgit v1.2.3 From f8c7933f306dc2cec81b222a1d58a1d84e0f6442 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Thu, 11 Apr 2024 00:16:17 -0700 Subject: CI: Remove python-version from matrix Drop python version from matrix configuration as it's always 3.11. --- .github/workflows/build.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ddb0f44150..f18b31ef0f 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,6 @@ jobs: matrix: runner: [windows-large, macos-12-xl] configuration: [Release, ReleaseOS] - python-version: ["3.11"] include: - runner: macos-12-xl developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer" @@ -67,7 +66,7 @@ jobs: - name: Setup python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} + python-version: "3.11" - name: Checkout build variables uses: actions/checkout@v4 -- cgit v1.2.3 From 11bffc8252d169d84bf5066ad4cd34cad535f5e8 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Thu, 11 Apr 2024 13:32:48 -0700 Subject: CI: adopt xz compression Move towards packaging artifacts with xz, which offers higher compression ratios and faster decode time. --- .github/workflows/build.yaml | 58 +++++++++++++++------------------------- build.sh | 10 +++---- indra/newview/CMakeLists.txt | 12 ++++----- indra/newview/viewer_manifest.py | 14 +++++----- 4 files changed, 40 insertions(+), 54 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f18b31ef0f..44f32c1c5d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,13 +12,10 @@ jobs: strategy: matrix: runner: [windows-large, macos-12-xl] - configuration: [Release, ReleaseOS] + configuration: [Release] include: - runner: macos-12-xl developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer" - exclude: - - runner: macos-12-xl - configuration: ReleaseOS runs-on: ${{ matrix.runner }} outputs: viewer_channel: ${{ steps.build.outputs.viewer_channel }} @@ -100,7 +97,7 @@ jobs: - name: Determine source branch id: which-branch - uses: secondlife/viewer-build-util/which-branch@v1 + uses: secondlife/viewer-build-util/which-branch@v2 with: token: ${{ github.token }} @@ -223,7 +220,7 @@ jobs: - name: Upload executable if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.viewer_app - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-app" path: | @@ -233,7 +230,7 @@ jobs: # artifact for that too. - name: Upload symbol file if: matrix.configuration != 'ReleaseOS' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-symbols" path: | @@ -241,7 +238,7 @@ jobs: - name: Upload metadata if: matrix.configuration != 'ReleaseOS' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: "${{ steps.build.outputs.artifact }}-metadata" # emitted by build.sh, possibly multiple lines @@ -249,7 +246,7 @@ jobs: ${{ steps.build.outputs.metadata }} - name: Upload physics package - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 # should only be set for viewer-private if: matrix.configuration != 'ReleaseOS' && steps.build.outputs.physicstpv with: @@ -270,7 +267,7 @@ jobs: steps: - name: Sign and package Windows viewer if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID - uses: secondlife/viewer-build-util/sign-pkg-windows@v1 + uses: secondlife/viewer-build-util/sign-pkg-windows@v2 with: vault_uri: "${{ env.AZURE_KEY_VAULT_URI }}" cert_name: "${{ env.AZURE_CERT_NAME }}" @@ -309,7 +306,7 @@ jobs: - name: Sign and package Mac viewer if: env.SIGNING_CERT_MACOS && env.SIGNING_CERT_MACOS_IDENTITY && env.SIGNING_CERT_MACOS_PASSWORD && steps.note-creds.outputs.note_user && steps.note-creds.outputs.note_pass && steps.note-creds.outputs.note_team - uses: secondlife/viewer-build-util/sign-pkg-mac@v1 + uses: secondlife/viewer-build-util/sign-pkg-mac@v2 with: channel: ${{ needs.build.outputs.viewer_channel }} imagename: ${{ needs.build.outputs.imagename }} @@ -329,7 +326,7 @@ jobs: steps: - name: Post Windows symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: secondlife/viewer-build-util/post-bugsplat-windows@v1 + uses: secondlife/viewer-build-util/post-bugsplat-windows@v2 with: username: ${{ env.BUGSPLAT_USER }} password: ${{ env.BUGSPLAT_PASS }} @@ -346,7 +343,7 @@ jobs: steps: - name: Post Mac symbols if: env.BUGSPLAT_USER && env.BUGSPLAT_PASS - uses: secondlife/viewer-build-util/post-bugsplat-mac@v1 + uses: secondlife/viewer-build-util/post-bugsplat-mac@v2 with: username: ${{ env.BUGSPLAT_USER }} password: ${{ env.BUGSPLAT_PASS }} @@ -359,31 +356,20 @@ jobs: runs-on: ubuntu-latest if: github.ref_type == 'tag' && startsWith(github.ref_name, 'Second_Life_') steps: - - uses: actions/download-artifact@v3 - with: - name: Windows-installer - - - uses: actions/download-artifact@v3 - with: - name: macOS-installer - - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: - name: Windows-metadata - - - name: Rename windows metadata - run: | - mv autobuild-package.xml Windows-autobuild-package.xml - mv newview/viewer_version.txt Windows-viewer_version.txt + pattern: "*-installer" - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: - name: macOS-metadata - - - name: Rename macOS metadata + pattern: "*-metadata" + + - name: Rename metadata run: | - mv autobuild-package.xml macOS-autobuild-package.xml - mv newview/viewer_version.txt macOS-viewer_version.txt + cp Windows-metadata/autobuild-package.xml Windows-autobuild-package.xml + cp Windows-metadata/newview/viewer_version.txt Windows-viewer_version.txt + cp macOS-metadata/autobuild-package.xml macOS-autobuild-package.xml + cp macOS-metadata/newview/viewer_version.txt macOS-viewer_version.txt # forked from softprops/action-gh-release - name: Create GitHub release @@ -406,8 +392,8 @@ jobs: append_body: true fail_on_unmatched_files: true files: | - *.dmg - *.exe + macOS-installer/*.dmg + Windows-installer/*.exe *-autobuild-package.xml *-viewer_version.txt diff --git a/build.sh b/build.sh index 806718e077..46a287ea32 100755 --- a/build.sh +++ b/build.sh @@ -82,7 +82,7 @@ installer_Linux() { local package_name="$1" local package_dir="$(build_dir_Linux)/newview/" - local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.bz2\$" + local pattern=".*$(viewer_channel_suffix ${package_name})_[0-9]+_[0-9]+_[0-9]+_[0-9]+_i686\\.tar\\.xz\$" # since the additional packages are built after the base package, # sorting oldest first ensures that the unqualified package is returned # even if someone makes a qualified name that duplicates the last word of the base name @@ -170,7 +170,7 @@ pre_build() # This name is consumed by indra/newview/CMakeLists.txt. Make it # absolute because we've had troubles with relative pathnames. abs_build_dir="$(cd "$build_dir"; pwd)" - VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.bz2")" + VIEWER_SYMBOL_FILE="$(native_path "$abs_build_dir/newview/$variant/secondlife-symbols-$symplat-${AUTOBUILD_ADDRSIZE}.tar.xz")" fi # honor autobuild_configure_parameters same as sling-buildscripts @@ -414,10 +414,10 @@ do fi if [ -d "$build_dir/doxygen/html" ] then - tar -c -f "$build_dir/viewer-doxygen.tar.bz2" --strip-components 3 "$build_dir/doxygen/html" - python_cmd "$helpers/codeticket.py" addoutput "Doxygen Tarball" "$build_dir/viewer-doxygen.tar.bz2" \ + tar -cJf "$build_dir/viewer-doxygen.tar.xz" --strip-components 3 "$build_dir/doxygen/html" + python_cmd "$helpers/codeticket.py" addoutput "Doxygen Tarball" "$build_dir/viewer-doxygen.tar.xz" \ || fatal "Upload of doxygen tarball failed" - metadata+=("$build_dir/viewer-doxygen.tar.bz2") + metadata+=("$build_dir/viewer-doxygen.tar.xz") fi ;; *) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5408d03509..a6ae041935 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1804,7 +1804,7 @@ if (WINDOWS) if (PACKAGE) add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py @@ -1848,7 +1848,7 @@ if (WINDOWS) ) # temporarily disable packaging of event_host until hg subrepos get # sorted out on the parabuild cluster... - #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2) + #${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.xz) endif (PACKAGE) elseif (DARWIN) @@ -1968,7 +1968,7 @@ if (LINUX) #endif (NOT USE_BUGSPLAT) add_custom_command( - OUTPUT ${product}.tar.bz2 + OUTPUT ${product}.tar.xz COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -2022,7 +2022,7 @@ if (LINUX) add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched) if (PACKAGE) - add_custom_target(llpackage ALL DEPENDS ${product}.tar.bz2) + add_custom_target(llpackage ALL DEPENDS ${product}.tar.xz) # Make sure we don't run two instances of viewer_manifest.py at the same time. add_dependencies(llpackage copy_l_viewer_manifest) check_message_template(llpackage) @@ -2153,12 +2153,12 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE OUTPUT_VARIABLE PARENT_DIRECTORY_CYGWIN OUTPUT_STRIP_TRAILING_WHITESPACE) add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" - # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.bz2; + # Use of 'tar ...j' here assumes VIEWER_SYMBOL_FILE endswith .tar.xz; # testing a string suffix is painful enough in CMake language that # we'll continue assuming it until forced to generalize. COMMAND "tar" ARGS - "cjf" + "cJf" "${VIEWER_SYMBOL_FILE_CYGWIN}" "-C" "${PARENT_DIRECTORY_CYGWIN}" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c7f32d0da9..4de4dc8fc5 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -525,7 +525,7 @@ class Windows_x86_64_Manifest(ViewerManifest): 'secondlife-bin.*', '*_Setup.exe', '*.bat', - '*.tar.bz2'))) + '*.tar.xz'))) with self.prefix(src=os.path.join(pkgdir, "VMP")): # include the compiled launcher scripts so that it gets included in the file_list @@ -1183,9 +1183,9 @@ class Darwin_x86_64_Manifest(ViewerManifest): # causes problems, especially with frameworks: a framework's top # level must contain symlinks into its Versions/Current, which # must itself be a symlink to some specific Versions subdir. - tarpath = os.path.join(RUNNER_TEMP, "viewer.tar.bz2") + tarpath = os.path.join(RUNNER_TEMP, "viewer.tar.xz") print(f'Creating {tarpath} from {self.get_dst_prefix()}') - with tarfile.open(tarpath, mode="w:bz2") as tarball: + with tarfile.open(tarpath, mode="w:xz") as tarball: # Store in the tarball as just 'Second Life Mumble.app' # instead of 'Users/someone/.../newview/Release/Second...' # It's at this point that we rename 'Second Life Release.app' @@ -1272,7 +1272,7 @@ class LinuxManifest(ViewerManifest): self.run_command(['find', self.get_dst_prefix(), '-type', 'f', '-perm', old, '-exec', 'chmod', new, '{}', ';']) - self.package_file = installer_name + '.tar.bz2' + self.package_file = installer_name + '.tar.xz' # temporarily move directory tree so that it has the right # name in the tarfile @@ -1285,10 +1285,10 @@ class LinuxManifest(ViewerManifest): # --numeric-owner hides the username of the builder for # security etc. self.run_command(['tar', '-C', self.get_build_prefix(), - '--numeric-owner', '-cjf', - tempname + '.tar.bz2', installer_name]) + '--numeric-owner', '-cJf', + tempname + '.tar.xz', installer_name]) else: - print("Skipping %s.tar.bz2 for non-Release build (%s)" % \ + print("Skipping %s.tar.xz for non-Release build (%s)" % \ (installer_name, self.args['buildtype'])) finally: self.run_command(["mv", tempname, realname]) -- cgit v1.2.3 From b340042a3f20b516d482e72e423ff4b00e085e1f Mon Sep 17 00:00:00 2001 From: Vir Linden <60274682+vir-linden@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:19:09 -0400 Subject: https://github.com/secondlife/viewer/issues/1214 - Update cla.yaml --- .github/workflows/cla.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yaml b/.github/workflows/cla.yaml index b4b2565889..3f4bf21864 100644 --- a/.github/workflows/cla.yaml +++ b/.github/workflows/cla.yaml @@ -19,7 +19,7 @@ jobs: PERSONAL_ACCESS_TOKEN: ${{ secrets.SHARED_CLA_TOKEN }} with: branch: main - path-to-document: https://github.com/secondlife/cla/blob/master/CLA.md + path-to-document: https://github.com/secondlife/cla/blob/main/CLA.md path-to-signatures: signatures.json remote-organization-name: secondlife remote-repository-name: cla-signatures -- cgit v1.2.3 From 5e40b5e64433b224be4dc220e4496dcd0a43f3f6 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Mon, 15 Apr 2024 18:39:23 +0300 Subject: Revert "SL-20140 Setting shape hand size to 36 won't save" This reverts commit 810a3d24c2e3671f926091c062b101bdec6a1517. (secondlife/jira-archive-internal#70482) --- indra/newview/character/avatar_lad.xml | 17 ++++---- indra/newview/llscrollingpanelparam.cpp | 63 ++++++++++++++++++++--------- indra/newview/llscrollingpanelparam.h | 3 ++ indra/newview/llscrollingpanelparambase.cpp | 29 +++++++------ indra/newview/llscrollingpanelparambase.h | 7 +--- 5 files changed, 72 insertions(+), 47 deletions(-) diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index aef402d4db..2cdd86267e 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -2021,7 +2021,7 @@ value_min="-1" value_max="1"> - + - - @@ -2041,7 +2042,7 @@ name="mFaceEyeAltRight" scale="0 0 0" offset="-.005 0 0" /> - + - @@ -2061,17 +2062,17 @@ name="mFaceEyeLidUpperLeft" scale="0 0.3 0.7" offset=" 0 0 0" /> - + - + - + diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index efd84eaa6d..bfa453a0ae 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -259,15 +259,19 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint ) // Make sure we're not taking the slider out of bounds // (this is where some simple UI limits are stored) - F32 new_percent = weightToSlider(new_weight); - if (mSlider->getMinValue() < new_percent - && new_percent < mSlider->getMaxValue()) + F32 new_percent = weightToPercent(new_weight); + LLSliderCtrl* slider = getChild("param slider"); + if (slider) { - mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight); - mWearable->writeToAvatar(gAgentAvatarp); - gAgentAvatarp->updateVisualParams(); + if (slider->getMinValue() < new_percent + && new_percent < slider->getMaxValue()) + { + mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight); + mWearable->writeToAvatar(gAgentAvatarp); + gAgentAvatarp->updateVisualParams(); - mSlider->setValue( weightToSlider( new_weight ) ); + slider->setValue( weightToPercent( new_weight ) ); + } } } } @@ -288,13 +292,17 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata ) F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight(); // step a fraction in the negative directiona F32 new_weight = current_weight - (range / 10.f); - F32 new_percent = self->weightToSlider(new_weight); - if (self->mSlider->getMinValue() < new_percent - && new_percent < self->mSlider->getMaxValue()) + F32 new_percent = self->weightToPercent(new_weight); + LLSliderCtrl* slider = self->getChild("param slider"); + if (slider) { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); - self->mWearable->writeToAvatar(gAgentAvatarp); - self->mSlider->setValue( self->weightToSlider( new_weight ) ); + if (slider->getMinValue() < new_percent + && new_percent < slider->getMaxValue()) + { + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); + self->mWearable->writeToAvatar(gAgentAvatarp); + slider->setValue( self->weightToPercent( new_weight ) ); + } } } @@ -318,16 +326,33 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata ) F32 range = self->mHintMax->getVisualParamWeight() - self->mHintMin->getVisualParamWeight(); // step a fraction in the negative direction F32 new_weight = current_weight + (range / 10.f); - F32 new_percent = self->weightToSlider(new_weight); - if (self->mSlider->getMinValue() < new_percent - && new_percent < self->mSlider->getMaxValue()) + F32 new_percent = self->weightToPercent(new_weight); + LLSliderCtrl* slider = self->getChild("param slider"); + if (slider) { - self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); - self->mWearable->writeToAvatar(gAgentAvatarp); - self->mSlider->setValue( self->weightToSlider( new_weight ) ); + if (slider->getMinValue() < new_percent + && new_percent < slider->getMaxValue()) + { + self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight); + self->mWearable->writeToAvatar(gAgentAvatarp); + slider->setValue( self->weightToPercent( new_weight ) ); + } } } } LLVisualParamHint::requestHintUpdates( self->mHintMin, self->mHintMax ); } + + +F32 LLScrollingPanelParam::weightToPercent( F32 weight ) +{ + LLViewerVisualParam* param = mParam; + return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f; +} + +F32 LLScrollingPanelParam::percentToWeight( F32 percent ) +{ + LLViewerVisualParam* param = mParam; + return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight(); +} diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h index dc344486fc..c7a47d5c7a 100644 --- a/indra/newview/llscrollingpanelparam.h +++ b/indra/newview/llscrollingpanelparam.h @@ -61,6 +61,9 @@ public: void onHintMouseDown( LLVisualParamHint* hint ); void onHintHeldDown( LLVisualParamHint* hint ); + F32 weightToPercent( F32 weight ); + F32 percentToWeight( F32 percent ); + public: // Constants for LLPanelVisualParam const static F32 PARAM_STEP_TIME_THRESHOLD; diff --git a/indra/newview/llscrollingpanelparambase.cpp b/indra/newview/llscrollingpanelparambase.cpp index 2a6c25235d..fe7a362723 100644 --- a/indra/newview/llscrollingpanelparambase.cpp +++ b/indra/newview/llscrollingpanelparambase.cpp @@ -43,7 +43,6 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp, BOOL use_hints) : LLScrollingPanel( panel_params ), mParam(param), - mSlider(nullptr), mAllowModify(allow_modify), mWearable(wearable) { @@ -51,15 +50,13 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan buildFromFile( "panel_scrolling_param.xml"); else buildFromFile( "panel_scrolling_param_base.xml"); - - mSlider = getChild("param slider"); - mSlider->setMaxValue(100.f * (mParam->getMaxWeight() - mParam->getMinWeight())); - mSlider->setValue(weightToSlider(param->getWeight())); + + getChild("param slider")->setValue(weightToPercent(param->getWeight())); std::string display_name = LLTrans::getString(param->getDisplayName()); - mSlider->setLabelArg("[DESC]", display_name); - mSlider->setEnabled(mAllowModify); - mSlider->setCommitCallback(boost::bind(LLScrollingPanelParamBase::onSliderMoved, mSlider, this)); + getChild("param slider")->setLabelArg("[DESC]", display_name); + getChildView("param slider")->setEnabled(mAllowModify); + childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this); setVisible(FALSE); setBorderVisible( FALSE ); @@ -80,9 +77,9 @@ void LLScrollingPanelParamBase::updatePanel(BOOL allow_modify) } F32 current_weight = mWearable->getVisualParamWeight( param->getID() ); - mSlider->setValue(weightToSlider( current_weight ) ); + getChild("param slider")->setValue(weightToPercent( current_weight ) ); mAllowModify = allow_modify; - mSlider->setEnabled(mAllowModify); + getChildView("param slider")->setEnabled(mAllowModify); } // static @@ -93,7 +90,7 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) LLViewerVisualParam* param = self->mParam; F32 current_weight = self->mWearable->getVisualParamWeight( param->getID() ); - F32 new_weight = self->sliderToWeight( (F32)slider->getValue().asReal() ); + F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() ); if (current_weight != new_weight ) { self->mWearable->setVisualParamWeight( param->getID(), new_weight); @@ -102,12 +99,14 @@ void LLScrollingPanelParamBase::onSliderMoved(LLUICtrl* ctrl, void* userdata) } } -F32 LLScrollingPanelParamBase::weightToSlider(F32 weight) +F32 LLScrollingPanelParamBase::weightToPercent( F32 weight ) { - return (weight - mParam->getMinWeight()) * 100.f; + LLViewerVisualParam* param = mParam; + return (weight - param->getMinWeight()) / (param->getMaxWeight() - param->getMinWeight()) * 100.f; } -F32 LLScrollingPanelParamBase::sliderToWeight(F32 slider) +F32 LLScrollingPanelParamBase::percentToWeight( F32 percent ) { - return slider / 100.f + mParam->getMinWeight(); + LLViewerVisualParam* param = mParam; + return percent / 100.f * (param->getMaxWeight() - param->getMinWeight()) + param->getMinWeight(); } diff --git a/indra/newview/llscrollingpanelparambase.h b/indra/newview/llscrollingpanelparambase.h index e7f88a21bd..9538826251 100644 --- a/indra/newview/llscrollingpanelparambase.h +++ b/indra/newview/llscrollingpanelparambase.h @@ -36,7 +36,6 @@ class LLViewerVisualParam; class LLWearable; class LLVisualParamHint; class LLViewerVisualParam; -class LLSliderCtrl; class LLJoint; class LLScrollingPanelParamBase : public LLScrollingPanel @@ -50,13 +49,11 @@ public: static void onSliderMoved(LLUICtrl* ctrl, void* userdata); - F32 weightToSlider(F32 weight); - F32 sliderToWeight(F32 slider); + F32 weightToPercent( F32 weight ); + F32 percentToWeight( F32 percent ); public: LLViewerVisualParam* mParam; - LLSliderCtrl* mSlider; - protected: BOOL mAllowModify; LLWearable *mWearable; -- cgit v1.2.3 From d98fc504a1d4bc292ba86acdda053c8b4598a193 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 24 Apr 2024 09:43:07 -0400 Subject: Increment viewer version to 7.1.7 following promotion of secondlife/viewer #736 --- indra/newview/VIEWER_VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 14627a7c8c..2380dcfd47 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -7.1.6 +7.1.7 -- cgit v1.2.3