merge from viewer-release
commit
57da9bcd1b
1
.hgtags
1
.hgtags
|
|
@ -517,3 +517,4 @@ e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
|
|||
0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release
|
||||
450de775fff66a011be1a001acd117cc623c445d 4.0.5-release
|
||||
4070611edd95eb3a683d1cd97c4c07fe67793812 4.0.6-release
|
||||
33981d8130f031597b4c7f4c981b18359afb61a0 4.0.7-release
|
||||
|
|
|
|||
85
build.sh
85
build.sh
|
|
@ -16,12 +16,6 @@
|
|||
# * The special style in which python is invoked is intentional to permit
|
||||
# use of a native python install on windows - which requires paths in DOS form
|
||||
|
||||
check_for()
|
||||
{
|
||||
if [ -e "$2" ]; then found_dict='FOUND'; else found_dict='MISSING'; fi
|
||||
echo "$1 ${found_dict} '$2' " 1>&2
|
||||
}
|
||||
|
||||
build_dir_Darwin()
|
||||
{
|
||||
echo build-darwin-i386
|
||||
|
|
@ -101,13 +95,14 @@ pre_build()
|
|||
&& [ -r "$master_message_template_checkout/message_template.msg" ] \
|
||||
&& template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg"
|
||||
|
||||
"$autobuild" configure -c $variant -- \
|
||||
"$autobuild" configure --quiet -c $variant -- \
|
||||
-DPACKAGE:BOOL=ON \
|
||||
-DRELEASE_CRASH_REPORTING:BOOL=ON \
|
||||
-DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \
|
||||
-DGRID:STRING="\"$viewer_grid\"" \
|
||||
-DLL_TESTS:BOOL="$run_tests" \
|
||||
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url
|
||||
-DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url \
|
||||
|| fatal "$variant configuration failed"
|
||||
|
||||
end_section "Configure $variant"
|
||||
}
|
||||
|
|
@ -146,52 +141,46 @@ build()
|
|||
local variant="$1"
|
||||
if $build_viewer
|
||||
then
|
||||
"$autobuild" build --no-configure -c $variant
|
||||
build_ok=$?
|
||||
|
||||
"$autobuild" build --no-configure -c $variant || fatal "failed building $variant"
|
||||
|
||||
# Run build extensions
|
||||
if [ $build_ok -eq 0 -a -d ${build_dir}/packages/build-extensions ]; then
|
||||
for extension in ${build_dir}/packages/build-extensions/*.sh; do
|
||||
if [ $build_ok -eq 0 -a -d ${build_dir}/packages/build-extensions ]
|
||||
then
|
||||
for extension in ${build_dir}/packages/build-extensions/*.sh
|
||||
do
|
||||
begin_section "Extension $extension"
|
||||
. $extension
|
||||
end_section "Extension $extension"
|
||||
if [ $build_ok -ne 0 ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# *TODO: Make this a build extension.
|
||||
package_llphysicsextensions_tpv
|
||||
tpvlib_build_ok=$?
|
||||
if [ $build_ok -eq 0 -a $tpvlib_build_ok -eq 0 ]
|
||||
then
|
||||
package_llphysicsextensions_tpv || fatal "failed building llphysicsextensions packages"
|
||||
|
||||
echo true >"$build_dir"/build_ok
|
||||
else
|
||||
echo "Skipping build due to configuration build_viewer=${build_viewer}"
|
||||
echo true >"$build_dir"/build_ok
|
||||
else
|
||||
echo false >"$build_dir"/build_ok
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Check to see if we were invoked from the wrapper, if not, re-exec ourselves from there
|
||||
if [ "x$arch" = x ]
|
||||
################################################################
|
||||
# Start of the actual script
|
||||
################################################################
|
||||
|
||||
# Check to see if we were invoked from the master buildscripts wrapper, if not, fail
|
||||
if [ "x${BUILDSCRIPTS_SUPPORT_FUNCTIONS}" = x ]
|
||||
then
|
||||
top=`hg root`
|
||||
if [ -x "$top/../buildscripts/hg/bin/build.sh" ]
|
||||
then
|
||||
exec "$top/../buildscripts/hg/bin/build.sh" "$top"
|
||||
else
|
||||
cat <<EOF
|
||||
This script, if called in a development environment, requires that the branch
|
||||
independent build script repository be checked out next to this repository.
|
||||
This repository is located at http://bitbucket.org/lindenlabinternal/sl-buildscripts
|
||||
EOF
|
||||
echo "This script relies on being run by the master Linden Lab buildscripts" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check to see if we're skipping the platform
|
||||
eval '$build_'"$arch" || pass
|
||||
if ! eval '$build_'"$arch"
|
||||
then
|
||||
record_event "building on architecture $arch is disabled"
|
||||
pass
|
||||
fi
|
||||
|
||||
# ensure AUTOBUILD is in native path form for child processes
|
||||
AUTOBUILD="$(native_path "$AUTOBUILD")"
|
||||
|
|
@ -204,7 +193,7 @@ then
|
|||
fi
|
||||
|
||||
# load autobuild provided shell functions and variables
|
||||
eval "$("$autobuild" source_environment)"
|
||||
eval "$("$autobuild" --quiet source_environment)"
|
||||
|
||||
# something about the additional_packages mechanism messes up buildscripts results.py on Linux
|
||||
# since we don't care about those packages on Linux, just zero it out, yes - a HACK
|
||||
|
|
@ -235,14 +224,13 @@ do
|
|||
|
||||
begin_section "Initialize $variant Build Directory"
|
||||
rm -rf "$build_dir"
|
||||
mkdir -p "$build_dir"
|
||||
mkdir -p "$build_dir/tmp"
|
||||
end_section "Initialize $variant Build Directory"
|
||||
|
||||
if pre_build "$variant" "$build_dir"
|
||||
then
|
||||
begin_section "Build $variant"
|
||||
build "$variant" "$build_dir" 2>&1 | tee -a "$build_log" | sed -n 's/^ *\(##teamcity.*\)/\1/p'
|
||||
build "$variant" "$build_dir"
|
||||
if `cat "$build_dir/build_ok"`
|
||||
then
|
||||
case "$variant" in
|
||||
|
|
@ -255,7 +243,7 @@ do
|
|||
then
|
||||
record_dependencies_graph # defined in buildscripts/hg/bin/build.sh
|
||||
else
|
||||
record_event "TBD - no dependency graph for linux (probable python version dependency)" 1>&2
|
||||
record_event "TBD - no dependency graph for linux (probable python version dependency)"
|
||||
fi
|
||||
end_section "Autobuild metadata"
|
||||
else
|
||||
|
|
@ -306,11 +294,10 @@ then
|
|||
dch --force-bad-version \
|
||||
--distribution unstable \
|
||||
--newversion "${VIEWER_VERSION}" \
|
||||
"Automated build #$build_id, repository $branch revision $revision." \
|
||||
>> "$build_log" 2>&1
|
||||
"Automated build #$build_id, repository $branch revision $revision."
|
||||
|
||||
# build the debian package
|
||||
$pkg_default_debuild_command >>"$build_log" 2>&1 || record_failure "\"$pkg_default_debuild_command\" failed."
|
||||
$pkg_default_debuild_command || record_failure "\"$pkg_default_debuild_command\" failed."
|
||||
|
||||
# Unmangle the changelog file
|
||||
hg revert debian/changelog
|
||||
|
|
@ -359,10 +346,10 @@ then
|
|||
end_section "Upload Debian Repository"
|
||||
|
||||
else
|
||||
echo debian build not enabled
|
||||
record_event "debian build not enabled"
|
||||
fi
|
||||
else
|
||||
echo skipping debian build due to failed build.
|
||||
record_event "skipping debian build due to failed build"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
@ -376,7 +363,7 @@ then
|
|||
package=$(installer_$arch)
|
||||
if [ x"$package" = x ] || test -d "$package"
|
||||
then
|
||||
# Coverity doesn't package, so it's ok, anything else is fail
|
||||
record_event "??? mystery event $package // $build_coverity"
|
||||
succeeded=$build_coverity
|
||||
else
|
||||
# Upload base package.
|
||||
|
|
@ -428,12 +415,12 @@ then
|
|||
fi
|
||||
end_section Upload Installer
|
||||
else
|
||||
echo skipping upload of installer
|
||||
record_event "skipping upload of installer"
|
||||
fi
|
||||
|
||||
|
||||
else
|
||||
echo skipping upload of installer due to failed build.
|
||||
record_event "skipping upload of installer due to failed build"
|
||||
fi
|
||||
|
||||
# The branch independent build.sh script invoking this script will finish processing
|
||||
|
|
|
|||
|
|
@ -191,6 +191,9 @@ Ansariel Hiller
|
|||
STORM-2094
|
||||
MAINT-5756
|
||||
MAINT-4677
|
||||
MAINT-6432
|
||||
STORM-2133
|
||||
MAINT-6511
|
||||
Aralara Rajal
|
||||
Arare Chantilly
|
||||
CHUIBUG-191
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
|
|||
|
||||
if (DEFINED ENV{revision})
|
||||
set(VIEWER_VERSION_REVISION $ENV{revision})
|
||||
message("Revision (from environment): ${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
|
||||
|
||||
else (DEFINED ENV{revision})
|
||||
find_program(MERCURIAL
|
||||
|
|
@ -33,23 +33,23 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
|
|||
string(REGEX REPLACE "[^0-9a-f]" "" VIEWER_VERSION_REVISION ${VIEWER_VERSION_REVISION})
|
||||
endif (NOT ${hg_id_result} EQUAL 0)
|
||||
if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
message("Revision (from hg) ${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Revision (from hg) ${VIEWER_VERSION_REVISION}")
|
||||
else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
message("Revision not set (repository not found?); using 0")
|
||||
message(STATUS "Revision not set (repository not found?); using 0")
|
||||
set(VIEWER_VERSION_REVISION 0 )
|
||||
endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
|
||||
else (MERCURIAL)
|
||||
message("Revision not set: mercurial not found; using 0")
|
||||
message(STATUS "Revision not set: mercurial not found; using 0")
|
||||
set(VIEWER_VERSION_REVISION 0)
|
||||
endif (MERCURIAL)
|
||||
endif (DEFINED ENV{revision})
|
||||
message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
|
||||
message(STATUS "Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
|
||||
else ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
|
||||
message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'")
|
||||
endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} )
|
||||
|
||||
if ("${VIEWER_VERSION_REVISION}" STREQUAL "")
|
||||
message("Ultimate fallback, revision was blank or not set: will use 0")
|
||||
message(STATUS "Ultimate fallback, revision was blank or not set: will use 0")
|
||||
set(VIEWER_VERSION_REVISION 0)
|
||||
endif ("${VIEWER_VERSION_REVISION}" STREQUAL "")
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,10 @@ const LLUUID IMG_SMOKE_POOF ("1e63e323-5fe0-452e-92f8-b98bd0f764e3"); // On d
|
|||
const LLUUID IMG_BIG_EXPLOSION_1 ("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); // On dataserver
|
||||
const LLUUID IMG_BIG_EXPLOSION_2 ("9c8eca51-53d5-42a7-bb58-cef070395db8"); // On dataserver
|
||||
|
||||
const LLUUID IMG_ALPHA_GRAD ("e97cf410-8e61-7005-ec06-629eba4cd1fb"); // VIEWER
|
||||
const LLUUID IMG_ALPHA_GRAD_2D ("38b86f85-2575-52a9-a531-23108d8da837"); // VIEWER
|
||||
const LLUUID IMG_TRANSPARENT ("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"); // VIEWER
|
||||
|
||||
const LLUUID IMG_BLOOM1 ("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); // VIEWER
|
||||
const LLUUID TERRAIN_DIRT_DETAIL ("0bc58228-74a0-7e83-89bc-5c23464bcec5"); // VIEWER
|
||||
const LLUUID TERRAIN_GRASS_DETAIL ("63338ede-0037-c4fd-855b-015d77112fc8"); // VIEWER
|
||||
|
|
|
|||
|
|
@ -197,6 +197,10 @@ LL_COMMON_API extern const LLUUID IMG_SMOKE_POOF;
|
|||
LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_1;
|
||||
LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_2;
|
||||
|
||||
LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD;
|
||||
LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD_2D;
|
||||
LL_COMMON_API extern const LLUUID IMG_TRANSPARENT;
|
||||
|
||||
LL_COMMON_API extern const LLUUID IMG_BLOOM1;
|
||||
LL_COMMON_API extern const LLUUID TERRAIN_DIRT_DETAIL;
|
||||
LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL;
|
||||
|
|
|
|||
|
|
@ -576,6 +576,33 @@ std::string utf8str_truncate(const std::string& utf8str, const S32 max_len)
|
|||
}
|
||||
}
|
||||
|
||||
std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len)
|
||||
{
|
||||
if (0 == symbol_len)
|
||||
{
|
||||
return std::string();
|
||||
}
|
||||
if ((S32)utf8str.length() <= symbol_len)
|
||||
{
|
||||
return utf8str;
|
||||
}
|
||||
else
|
||||
{
|
||||
int len = 0, byteIndex = 0;
|
||||
const char* aStr = utf8str.c_str();
|
||||
size_t origSize = utf8str.size();
|
||||
|
||||
for (byteIndex = 0; len < symbol_len && byteIndex < origSize; byteIndex++)
|
||||
{
|
||||
if ((aStr[byteIndex] & 0xc0) != 0x80)
|
||||
{
|
||||
len += 1;
|
||||
}
|
||||
}
|
||||
return utf8str.substr(0, byteIndex);
|
||||
}
|
||||
}
|
||||
|
||||
std::string utf8str_substChar(
|
||||
const std::string& utf8str,
|
||||
const llwchar target_char,
|
||||
|
|
|
|||
|
|
@ -563,6 +563,17 @@ LL_COMMON_API S32 utf8str_compare_insensitive(
|
|||
const std::string& lhs,
|
||||
const std::string& rhs);
|
||||
|
||||
/**
|
||||
* @brief Properly truncate a utf8 string to a maximum character count.
|
||||
*
|
||||
* If symbol_len is longer than the string passed in, the return
|
||||
* value == utf8str.
|
||||
* @param utf8str A valid utf8 string to truncate.
|
||||
* @param symbol_len The maximum number of symbols in the return value.
|
||||
* @return Returns a valid utf8 string with symbol count <= max_len.
|
||||
*/
|
||||
LL_COMMON_API std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len);
|
||||
|
||||
/**
|
||||
* @brief Replace all occurences of target_char with replace_char
|
||||
*
|
||||
|
|
|
|||
|
|
@ -773,7 +773,8 @@ const U8* LLImageBase::getData() const
|
|||
{
|
||||
if(mBadBufferAllocation)
|
||||
{
|
||||
LL_ERRS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
|
||||
LL_WARNS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return mData;
|
||||
|
|
@ -783,7 +784,8 @@ U8* LLImageBase::getData()
|
|||
{
|
||||
if(mBadBufferAllocation)
|
||||
{
|
||||
LL_ERRS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
|
||||
LL_WARNS() << "Bad memory allocation for the image buffer!" << LL_ENDL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return mData;
|
||||
|
|
@ -895,30 +897,30 @@ void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components)
|
|||
sGlobalRawMemory += getDataSize();
|
||||
}
|
||||
|
||||
BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)
|
||||
bool LLImageRaw::resize(U16 width, U16 height, S8 components)
|
||||
{
|
||||
if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components))
|
||||
{
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
// Reallocate the data buffer.
|
||||
deleteData();
|
||||
|
||||
allocateDataSize(width,height,components);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
|
||||
const U8 *data, U32 stride, BOOL reverse_y)
|
||||
bool LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
|
||||
const U8 *data, U32 stride, bool reverse_y)
|
||||
{
|
||||
if (!getData())
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
if (!data)
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Should do some simple bounds checking
|
||||
|
|
@ -933,7 +935,7 @@ BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
|
|||
data + from_offset, getComponents()*width);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLImageRaw::clear(U8 r, U8 g, U8 b, U8 a)
|
||||
|
|
@ -988,7 +990,7 @@ void LLImageRaw::verticalFlip()
|
|||
}
|
||||
|
||||
|
||||
void LLImageRaw::expandToPowerOfTwo(S32 max_dim, BOOL scale_image)
|
||||
void LLImageRaw::expandToPowerOfTwo(S32 max_dim, bool scale_image)
|
||||
{
|
||||
// Find new sizes
|
||||
S32 new_width = expandDimToPowerOfTwo(getWidth(), max_dim);
|
||||
|
|
@ -997,7 +999,7 @@ void LLImageRaw::expandToPowerOfTwo(S32 max_dim, BOOL scale_image)
|
|||
scale( new_width, new_height, scale_image );
|
||||
}
|
||||
|
||||
void LLImageRaw::contractToPowerOfTwo(S32 max_dim, BOOL scale_image)
|
||||
void LLImageRaw::contractToPowerOfTwo(S32 max_dim, bool scale_image)
|
||||
{
|
||||
// Find new sizes
|
||||
S32 new_width = contractDimToPowerOfTwo(getWidth(), MIN_IMAGE_SIZE);
|
||||
|
|
@ -1397,7 +1399,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
||||
bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
|
||||
{
|
||||
llassert((1 == getComponents()) || (3 == getComponents()) || (4 == getComponents()) );
|
||||
|
||||
|
|
@ -1406,7 +1408,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
|
||||
if( (old_width == new_width) && (old_height == new_height) )
|
||||
{
|
||||
return TRUE; // Nothing to do.
|
||||
return true; // Nothing to do.
|
||||
}
|
||||
|
||||
// Reallocate the data buffer.
|
||||
|
|
@ -1441,7 +1443,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
U8 *new_data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), new_data_size);
|
||||
if(NULL == new_data)
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
bilinear_scale(getData(), old_width, old_height, getComponents(), old_width*getComponents(), new_data, new_width, new_height, getComponents(), new_width*getComponents());
|
||||
|
|
@ -1476,7 +1478,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )
|
||||
|
|
@ -1795,7 +1797,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
|
|||
ifs.read ((char*)buffer, length);
|
||||
ifs.close();
|
||||
|
||||
BOOL success;
|
||||
bool success;
|
||||
|
||||
success = image->updateData();
|
||||
if (success)
|
||||
|
|
@ -1971,7 +1973,7 @@ S32 LLImageFormatted::calcDiscardLevelBytes(S32 bytes)
|
|||
//----------------------------------------------------------------------------
|
||||
|
||||
// Subclasses that can handle more than 4 channels should override this function.
|
||||
BOOL LLImageFormatted::decodeChannels(LLImageRaw* raw_image,F32 decode_time, S32 first_channel, S32 max_channel)
|
||||
bool LLImageFormatted::decodeChannels(LLImageRaw* raw_image,F32 decode_time, S32 first_channel, S32 max_channel)
|
||||
{
|
||||
llassert( (first_channel == 0) && (max_channel == 4) );
|
||||
return decode( raw_image, decode_time ); // Loads first 4 channels by default.
|
||||
|
|
@ -2022,7 +2024,7 @@ void LLImageFormatted::sanityCheck()
|
|||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
BOOL LLImageFormatted::copyData(U8 *data, S32 size)
|
||||
bool LLImageFormatted::copyData(U8 *data, S32 size)
|
||||
{
|
||||
if ( data && ((data != getData()) || (size != getDataSize())) )
|
||||
{
|
||||
|
|
@ -2030,7 +2032,7 @@ BOOL LLImageFormatted::copyData(U8 *data, S32 size)
|
|||
allocateData(size);
|
||||
memcpy(getData(), data, size); /* Flawfinder: ignore */
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// LLImageFormatted becomes the owner of data
|
||||
|
|
@ -2066,7 +2068,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size)
|
|||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
BOOL LLImageFormatted::load(const std::string &filename, int load_size)
|
||||
bool LLImageFormatted::load(const std::string &filename, int load_size)
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -2077,12 +2079,12 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
|
|||
if (!apr_file)
|
||||
{
|
||||
setLastError("Unable to open file for reading", filename);
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
if (file_size == 0)
|
||||
{
|
||||
setLastError("File is empty",filename);
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Constrain the load size to acceptable values
|
||||
|
|
@ -2090,7 +2092,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
|
|||
{
|
||||
load_size = file_size;
|
||||
}
|
||||
BOOL res;
|
||||
bool res;
|
||||
U8 *data = allocateData(load_size);
|
||||
apr_size_t bytes_read = load_size;
|
||||
apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
|
||||
|
|
@ -2098,7 +2100,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
|
|||
{
|
||||
deleteData();
|
||||
setLastError("Unable to read file",filename);
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2108,7 +2110,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
|
|||
return res;
|
||||
}
|
||||
|
||||
BOOL LLImageFormatted::save(const std::string &filename)
|
||||
bool LLImageFormatted::save(const std::string &filename)
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -2117,15 +2119,15 @@ BOOL LLImageFormatted::save(const std::string &filename)
|
|||
if (!outfile.getFileHandle())
|
||||
{
|
||||
setLastError("Unable to open file for writing", filename);
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
outfile.write(getData(), getDataSize());
|
||||
outfile.close() ;
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// BOOL LLImageFormatted::save(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)
|
||||
// bool LLImageFormatted::save(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)
|
||||
// Depricated to remove VFS dependency.
|
||||
// Use:
|
||||
// LLVFile::writeFile(image->getData(), image->getDataSize(), vfs, uuid, type);
|
||||
|
|
|
|||
|
|
@ -199,11 +199,11 @@ public:
|
|||
/*virtual*/ U8* allocateData(S32 size = -1);
|
||||
/*virtual*/ U8* reallocateData(S32 size);
|
||||
|
||||
BOOL resize(U16 width, U16 height, S8 components);
|
||||
bool resize(U16 width, U16 height, S8 components);
|
||||
|
||||
//U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;
|
||||
BOOL setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
|
||||
const U8 *data, U32 stride = 0, BOOL reverse_y = FALSE);
|
||||
bool setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
|
||||
const U8 *data, U32 stride = 0, bool reverse_y = false);
|
||||
|
||||
void clear(U8 r=0, U8 g=0, U8 b=0, U8 a=255);
|
||||
|
||||
|
|
@ -212,10 +212,10 @@ public:
|
|||
static S32 biasedDimToPowerOfTwo(S32 curr_dim, S32 max_dim = MAX_IMAGE_SIZE);
|
||||
static S32 expandDimToPowerOfTwo(S32 curr_dim, S32 max_dim = MAX_IMAGE_SIZE);
|
||||
static S32 contractDimToPowerOfTwo(S32 curr_dim, S32 min_dim = MIN_IMAGE_SIZE);
|
||||
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
|
||||
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
|
||||
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
|
||||
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
|
||||
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
|
||||
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
|
||||
bool scale( S32 new_width, S32 new_height, bool scale_image = true );
|
||||
|
||||
// Fill the buffer with a constant color
|
||||
void fill( const LLColor4U& color );
|
||||
|
|
@ -314,23 +314,23 @@ public:
|
|||
// getRawDiscardLevel() by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
|
||||
virtual S8 getRawDiscardLevel() { return mDiscardLevel; }
|
||||
|
||||
BOOL load(const std::string& filename, int load_size = 0);
|
||||
BOOL save(const std::string& filename);
|
||||
bool load(const std::string& filename, int load_size = 0);
|
||||
bool save(const std::string& filename);
|
||||
|
||||
virtual BOOL updateData() = 0; // pure virtual
|
||||
virtual bool updateData() = 0; // pure virtual
|
||||
void setData(U8 *data, S32 size);
|
||||
void appendData(U8 *data, S32 size);
|
||||
|
||||
// Loads first 4 channels.
|
||||
virtual BOOL decode(LLImageRaw* raw_image, F32 decode_time) = 0;
|
||||
virtual bool decode(LLImageRaw* raw_image, F32 decode_time) = 0;
|
||||
// Subclasses that can handle more than 4 channels should override this function.
|
||||
virtual BOOL decodeChannels(LLImageRaw* raw_image, F32 decode_time, S32 first_channel, S32 max_channel);
|
||||
virtual bool decodeChannels(LLImageRaw* raw_image, F32 decode_time, S32 first_channel, S32 max_channel);
|
||||
|
||||
virtual BOOL encode(const LLImageRaw* raw_image, F32 encode_time) = 0;
|
||||
virtual bool encode(const LLImageRaw* raw_image, F32 encode_time) = 0;
|
||||
|
||||
S8 getCodec() const;
|
||||
BOOL isDecoding() const { return mDecoding ? TRUE : FALSE; }
|
||||
BOOL isDecoded() const { return mDecoded ? TRUE : FALSE; }
|
||||
bool isDecoding() const { return mDecoding; }
|
||||
bool isDecoded() const { return mDecoded; }
|
||||
void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; }
|
||||
S8 getDiscardLevel() const { return mDiscardLevel; }
|
||||
S8 getLevels() const { return mLevels; }
|
||||
|
|
@ -341,7 +341,7 @@ public:
|
|||
virtual void setLastError(const std::string& message, const std::string& filename = std::string());
|
||||
|
||||
protected:
|
||||
BOOL copyData(U8 *data, S32 size); // calls updateData()
|
||||
bool copyData(U8 *data, S32 size); // calls updateData()
|
||||
|
||||
protected:
|
||||
S8 mCodec;
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ LLImageBMP::LLImageBMP()
|
|||
mColorPalette( NULL ),
|
||||
mBitmapOffset( 0 ),
|
||||
mBitsPerPixel( 0 ),
|
||||
mOriginAtTop( FALSE )
|
||||
mOriginAtTop( false )
|
||||
{
|
||||
mBitfieldMask[0] = 0;
|
||||
mBitfieldMask[1] = 0;
|
||||
|
|
@ -92,7 +92,7 @@ LLImageBMP::~LLImageBMP()
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageBMP::updateData()
|
||||
bool LLImageBMP::updateData()
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -101,7 +101,7 @@ BOOL LLImageBMP::updateData()
|
|||
if (!mdata || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("Uninitialized instance of LLImageBMP");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Read the bitmap headers in order to get all the useful info
|
||||
|
|
@ -120,12 +120,12 @@ BOOL LLImageBMP::updateData()
|
|||
if ((mdata[0] != 'B') || (mdata[1] != 'A'))
|
||||
{
|
||||
setLastError("OS/2 bitmap array BMP files are not supported");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
setLastError("Does not appear to be a bitmap file");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -160,12 +160,12 @@ BOOL LLImageBMP::updateData()
|
|||
llendianswizzleone(header.mNumColors);
|
||||
llendianswizzleone(header.mNumColorsImportant);
|
||||
|
||||
BOOL windows_nt_version = FALSE;
|
||||
BOOL windows_95_version = FALSE;
|
||||
bool windows_nt_version = false;
|
||||
bool windows_95_version = false;
|
||||
if( 12 == header.mSize )
|
||||
{
|
||||
setLastError("Windows 2.x and OS/2 1.x BMP files are not supported");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
if( 40 == header.mSize )
|
||||
|
|
@ -173,7 +173,7 @@ BOOL LLImageBMP::updateData()
|
|||
if( 3 == header.mCompression )
|
||||
{
|
||||
// Windows NT
|
||||
windows_nt_version = TRUE;
|
||||
windows_nt_version = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -184,32 +184,32 @@ BOOL LLImageBMP::updateData()
|
|||
if( 12 <= header.mSize && 64 <= header.mSize )
|
||||
{
|
||||
setLastError("OS/2 2.x BMP files are not supported");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
if( 108 == header.mSize )
|
||||
{
|
||||
// BITMAPV4HEADER
|
||||
windows_95_version = TRUE;
|
||||
windows_95_version = true;
|
||||
}
|
||||
else
|
||||
if( 108 < header.mSize )
|
||||
{
|
||||
// BITMAPV5HEADER or greater
|
||||
// Should work as long at Microsoft maintained backwards compatibility (which they did in V4 and V5)
|
||||
windows_95_version = TRUE;
|
||||
windows_95_version = true;
|
||||
}
|
||||
|
||||
S32 width = header.mWidth;
|
||||
S32 height = header.mHeight;
|
||||
if (height < 0)
|
||||
{
|
||||
mOriginAtTop = TRUE;
|
||||
mOriginAtTop = true;
|
||||
height = -height;
|
||||
}
|
||||
else
|
||||
{
|
||||
mOriginAtTop = FALSE;
|
||||
mOriginAtTop = false;
|
||||
}
|
||||
|
||||
mBitsPerPixel = header.mBitsPerPixel;
|
||||
|
|
@ -228,10 +228,10 @@ BOOL LLImageBMP::updateData()
|
|||
case 16: // Started work on 16, but doesn't work yet
|
||||
// These are legal, but we don't support them yet.
|
||||
setLastError("Unsupported bit depth");
|
||||
return FALSE;
|
||||
return false;
|
||||
default:
|
||||
setLastError("Unrecognized bit depth");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
setSize(width, height, components);
|
||||
|
|
@ -244,11 +244,11 @@ BOOL LLImageBMP::updateData()
|
|||
|
||||
case 1:
|
||||
setLastError("8 bit RLE compression not supported.");
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
case 2:
|
||||
setLastError("4 bit RLE compression not supported.");
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
case 3:
|
||||
// Windows NT or Windows 95
|
||||
|
|
@ -256,7 +256,7 @@ BOOL LLImageBMP::updateData()
|
|||
|
||||
default:
|
||||
setLastError("Unsupported compression format.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -267,13 +267,13 @@ BOOL LLImageBMP::updateData()
|
|||
if( (16 != header.mBitsPerPixel) && (32 != header.mBitsPerPixel) )
|
||||
{
|
||||
setLastError("Bitfield encoding requires 16 or 32 bits per pixel.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
if( 0 != header.mNumColors )
|
||||
{
|
||||
setLastError("Bitfield encoding is not compatible with a color table.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -322,15 +322,15 @@ BOOL LLImageBMP::updateData()
|
|||
if (!mColorPalette)
|
||||
{
|
||||
LL_ERRS() << "Out of memory in LLImageBMP::updateData()" << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
memcpy( mColorPalette, mdata + FILE_HEADER_SIZE + BITMAP_HEADER_SIZE + extension_size, color_palette_size ); /* Flawfinder: ignore */
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
bool LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -341,7 +341,7 @@ BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if (!mdata || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("llimagebmp trying to decode an image with no data!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
raw_image->resize(getWidth(), getHeight(), 3);
|
||||
|
|
@ -349,7 +349,7 @@ BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
U8* src = mdata + mBitmapOffset;
|
||||
U8* dst = raw_image->getData();
|
||||
|
||||
BOOL success = FALSE;
|
||||
bool success = false;
|
||||
|
||||
switch( mBitsPerPixel )
|
||||
{
|
||||
|
|
@ -393,7 +393,7 @@ U32 LLImageBMP::countTrailingZeros( U32 m )
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageBMP::decodeColorMask16( U8* dst, U8* src )
|
||||
bool LLImageBMP::decodeColorMask16( U8* dst, U8* src )
|
||||
{
|
||||
llassert( 16 == mBitsPerPixel );
|
||||
|
||||
|
|
@ -426,10 +426,10 @@ BOOL LLImageBMP::decodeColorMask16( U8* dst, U8* src )
|
|||
src += alignment_bytes;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
|
||||
bool LLImageBMP::decodeColorMask32( U8* dst, U8* src )
|
||||
{
|
||||
// Note: alpha is not supported
|
||||
|
||||
|
|
@ -445,7 +445,7 @@ BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
|
|||
|
||||
if (getWidth() * getHeight() * 4 > getDataSize() - mBitmapOffset)
|
||||
{ //here we have situation when data size in src less than actually needed
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
S32 src_row_span = getWidth() * 4;
|
||||
|
|
@ -469,11 +469,11 @@ BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
|
|||
src += alignment_bytes;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
|
||||
bool LLImageBMP::decodeColorTable8( U8* dst, U8* src )
|
||||
{
|
||||
llassert( (8 == mBitsPerPixel) && (mColorPaletteColors >= 256) );
|
||||
|
||||
|
|
@ -482,7 +482,7 @@ BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
|
|||
|
||||
if ((getWidth() * getHeight()) + getHeight() * alignment_bytes > getDataSize() - mBitmapOffset)
|
||||
{ //here we have situation when data size in src less than actually needed
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
for( S32 row = 0; row < getHeight(); row++ )
|
||||
|
|
@ -499,11 +499,11 @@ BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
|
|||
src += alignment_bytes;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
|
||||
bool LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
|
||||
{
|
||||
llassert( 24 == mBitsPerPixel );
|
||||
llassert( 3 == getComponents() );
|
||||
|
|
@ -512,7 +512,7 @@ BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
|
|||
|
||||
if ((getWidth() * getHeight() * 3) + getHeight() * alignment_bytes > getDataSize() - mBitmapOffset)
|
||||
{ //here we have situation when data size in src less than actually needed
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
for( S32 row = 0; row < getHeight(); row++ )
|
||||
|
|
@ -528,10 +528,10 @@ BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
|
|||
src += alignment_bytes;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
bool LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -563,7 +563,7 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
// Allocate the new buffer for the data.
|
||||
if(!allocateData(file_bytes)) //memory allocation failed
|
||||
{
|
||||
return FALSE ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
magic[0] = 'B'; magic[1] = 'M';
|
||||
|
|
@ -663,5 +663,5 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,15 +40,15 @@ public:
|
|||
LLImageBMP();
|
||||
|
||||
/*virtual*/ std::string getExtension() { return std::string("bmp"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
/*virtual*/ bool updateData();
|
||||
/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
|
||||
protected:
|
||||
BOOL decodeColorTable8( U8* dst, U8* src );
|
||||
BOOL decodeColorMask16( U8* dst, U8* src );
|
||||
BOOL decodeTruecolor24( U8* dst, U8* src );
|
||||
BOOL decodeColorMask32( U8* dst, U8* src );
|
||||
bool decodeColorTable8( U8* dst, U8* src );
|
||||
bool decodeColorMask16( U8* dst, U8* src );
|
||||
bool decodeTruecolor24( U8* dst, U8* src );
|
||||
bool decodeColorMask32( U8* dst, U8* src );
|
||||
|
||||
U32 countTrailingZeros( U32 m );
|
||||
|
||||
|
|
@ -58,7 +58,7 @@ protected:
|
|||
S32 mBitmapOffset;
|
||||
S32 mBitsPerPixel;
|
||||
U32 mBitfieldMask[4]; // rgba
|
||||
BOOL mOriginAtTop;
|
||||
bool mOriginAtTop;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ LLImageDXT::~LLImageDXT()
|
|||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLImageDXT::updateData()
|
||||
bool LLImageDXT::updateData()
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -182,7 +182,7 @@ BOOL LLImageDXT::updateData()
|
|||
if (!data || !data_size)
|
||||
{
|
||||
setLastError("LLImageDXT uninitialized");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
S32 width, height, miplevelmax;
|
||||
|
|
@ -216,7 +216,7 @@ BOOL LLImageDXT::updateData()
|
|||
discard = llmin(discard, miplevelmax);
|
||||
setDiscardLevel(discard);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// discard: 0 = largest (last) mip
|
||||
|
|
@ -257,7 +257,7 @@ void LLImageDXT::setFormat()
|
|||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
|
||||
bool LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
|
||||
{
|
||||
// *TODO: Test! This has been tweaked since its intial inception,
|
||||
// but we don't use it any more!
|
||||
|
|
@ -266,7 +266,7 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
|
|||
if (mFileFormat >= FORMAT_DXT1 && mFileFormat <= FORMAT_DXR5)
|
||||
{
|
||||
LL_WARNS() << "Attempt to decode compressed LLImageDXT to Raw (unsupported)" << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
S32 width = getWidth(), height = getHeight();
|
||||
|
|
@ -286,16 +286,16 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
|
|||
if ((!getData()) || (data + image_size > getData() + getDataSize()))
|
||||
{
|
||||
setLastError("LLImageDXT trying to decode an image with not enough data!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
raw_image->resize(width, height, ncomponents);
|
||||
memcpy(raw_image->getData(), data, image_size); /* Flawfinder: ignore */
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
|
||||
bool LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
|
||||
{
|
||||
if (discard < 0)
|
||||
{
|
||||
|
|
@ -310,10 +310,10 @@ BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
|
|||
S32 height = 0;
|
||||
calcDiscardWidthHeight(discard, mFileFormat, width, height);
|
||||
raw = new LLImageRaw(data, width, height, getComponents());
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_mips)
|
||||
bool LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_mips)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -395,11 +395,11 @@ BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_
|
|||
prev_mipdata = mipdata;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLImageDXT::encode(const LLImageRaw* raw_image, F32 time)
|
||||
bool LLImageDXT::encode(const LLImageRaw* raw_image, F32 time)
|
||||
{
|
||||
return encodeDXT(raw_image, time, false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,21 +93,21 @@ protected:
|
|||
/*virtual*/ ~LLImageDXT();
|
||||
|
||||
private:
|
||||
BOOL encodeDXT(const LLImageRaw* raw_image, F32 decode_time, bool explicit_mips);
|
||||
bool encodeDXT(const LLImageRaw* raw_image, F32 decode_time, bool explicit_mips);
|
||||
|
||||
public:
|
||||
LLImageDXT();
|
||||
|
||||
/*virtual*/ std::string getExtension() { return std::string("dxt"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ bool updateData();
|
||||
|
||||
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
|
||||
/*virtual*/ S32 calcHeaderSize();
|
||||
/*virtual*/ S32 calcDataSize(S32 discard_level = 0);
|
||||
|
||||
BOOL getMipData(LLPointer<LLImageRaw>& raw, S32 discard=-1);
|
||||
bool getMipData(LLPointer<LLImageRaw>& raw, S32 discard=-1);
|
||||
|
||||
void setFormat();
|
||||
S32 getMipOffset(S32 discard);
|
||||
|
|
|
|||
|
|
@ -31,18 +31,13 @@
|
|||
#include "llmath.h"
|
||||
#include "llmemory.h"
|
||||
#include "llsd.h"
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
typedef LLImageJ2CImpl* (*CreateLLImageJ2CFunction)();
|
||||
typedef void (*DestroyLLImageJ2CFunction)(LLImageJ2CImpl*);
|
||||
typedef const char* (*EngineInfoLLImageJ2CFunction)();
|
||||
|
||||
// Declare the prototype for theses functions here. Their functionality
|
||||
// will be implemented in other files which define a derived LLImageJ2CImpl
|
||||
// but only ONE static library which has the implementation for these
|
||||
// functions should ever be included.
|
||||
// Declare the prototype for this factory function here. It is implemented in
|
||||
// other files which define a LLImageJ2CImpl subclass, but only ONE static
|
||||
// library which has the implementation for this function should ever be
|
||||
// linked.
|
||||
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl();
|
||||
void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl);
|
||||
const char* fallbackEngineInfoLLImageJ2CImpl();
|
||||
|
||||
// Test data gathering handle
|
||||
LLImageCompressionTester* LLImageJ2C::sTesterp = NULL ;
|
||||
|
|
@ -51,17 +46,20 @@ const std::string sTesterName("ImageCompressionTester");
|
|||
//static
|
||||
std::string LLImageJ2C::getEngineInfo()
|
||||
{
|
||||
return fallbackEngineInfoLLImageJ2CImpl();
|
||||
// All known LLImageJ2CImpl implementation subclasses are cheap to
|
||||
// construct.
|
||||
boost::scoped_ptr<LLImageJ2CImpl> impl(fallbackCreateLLImageJ2CImpl());
|
||||
return impl->getEngineInfo();
|
||||
}
|
||||
|
||||
LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C),
|
||||
mMaxBytes(0),
|
||||
mRawDiscardLevel(-1),
|
||||
mRate(DEFAULT_COMPRESSION_RATE),
|
||||
mReversible(FALSE),
|
||||
mReversible(false),
|
||||
mAreaUsedForDataSizeCalcs(0)
|
||||
{
|
||||
mImpl = fallbackCreateLLImageJ2CImpl();
|
||||
mImpl.reset(fallbackCreateLLImageJ2CImpl());
|
||||
claimMem(mImpl);
|
||||
|
||||
// Clear data size table
|
||||
|
|
@ -83,13 +81,7 @@ LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C),
|
|||
}
|
||||
|
||||
// virtual
|
||||
LLImageJ2C::~LLImageJ2C()
|
||||
{
|
||||
if ( mImpl )
|
||||
{
|
||||
fallbackDestroyLLImageJ2CImpl(mImpl);
|
||||
}
|
||||
}
|
||||
LLImageJ2C::~LLImageJ2C() {}
|
||||
|
||||
// virtual
|
||||
void LLImageJ2C::resetLastError()
|
||||
|
|
@ -111,16 +103,16 @@ S8 LLImageJ2C::getRawDiscardLevel()
|
|||
return mRawDiscardLevel;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2C::updateData()
|
||||
bool LLImageJ2C::updateData()
|
||||
{
|
||||
BOOL res = TRUE;
|
||||
bool res = true;
|
||||
resetLastError();
|
||||
|
||||
// Check to make sure that this instance has been initialized with data
|
||||
if (!getData() || (getDataSize() < 16))
|
||||
{
|
||||
setLastError("LLImageJ2C uninitialized");
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -142,29 +134,29 @@ BOOL LLImageJ2C::updateData()
|
|||
return res;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
|
||||
bool LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
|
||||
{
|
||||
setDiscardLevel(discard_level != -1 ? discard_level : 0);
|
||||
return mImpl->initDecode(*this,raw_image,discard_level,region);
|
||||
}
|
||||
|
||||
BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
bool LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
{
|
||||
return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);
|
||||
}
|
||||
|
||||
BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
|
||||
bool LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
|
||||
{
|
||||
return decodeChannels(raw_imagep, decode_time, 0, 4);
|
||||
}
|
||||
|
||||
|
||||
// Returns TRUE to mean done, whether successful or not.
|
||||
BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
|
||||
// Returns true to mean done, whether successful or not.
|
||||
bool LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
|
||||
{
|
||||
LLTimer elapsed;
|
||||
|
||||
BOOL res = TRUE;
|
||||
bool res = true;
|
||||
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -172,13 +164,13 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
|
|||
if (!getData() || (getDataSize() < 16))
|
||||
{
|
||||
setLastError("LLImageJ2C uninitialized");
|
||||
res = TRUE; // done
|
||||
res = true; // done
|
||||
}
|
||||
else
|
||||
{
|
||||
// Update the raw discard level
|
||||
updateRawDiscardLevel();
|
||||
mDecoding = TRUE;
|
||||
mDecoding = true;
|
||||
res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);
|
||||
}
|
||||
|
||||
|
|
@ -191,7 +183,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
|
|||
}
|
||||
else
|
||||
{
|
||||
mDecoding = FALSE;
|
||||
mDecoding = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -210,7 +202,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
|
|||
tester->updateDecompressionStats(elapsed.getElapsedTimeF32()) ;
|
||||
if (res)
|
||||
{
|
||||
// The whole data stream is finally decompressed when res is returned as TRUE
|
||||
// The whole data stream is finally decompressed when res is returned as true
|
||||
tester->updateDecompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ;
|
||||
}
|
||||
}
|
||||
|
|
@ -219,17 +211,17 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
|
||||
bool LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
|
||||
{
|
||||
return encode(raw_imagep, NULL, encode_time);
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
|
||||
bool LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
|
||||
{
|
||||
LLTimer elapsed;
|
||||
resetLastError();
|
||||
BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
|
||||
bool res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
|
||||
if (!mLastError.empty())
|
||||
{
|
||||
LLImage::setLastError(mLastError);
|
||||
|
|
@ -245,7 +237,7 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text,
|
|||
tester->updateCompressionStats(elapsed.getElapsedTimeF32()) ;
|
||||
if (res)
|
||||
{
|
||||
// The whole data stream is finally compressed when res is returned as TRUE
|
||||
// The whole data stream is finally compressed when res is returned as true
|
||||
tester->updateCompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ;
|
||||
}
|
||||
}
|
||||
|
|
@ -348,15 +340,15 @@ void LLImageJ2C::setMaxBytes(S32 max_bytes)
|
|||
mMaxBytes = max_bytes;
|
||||
}
|
||||
|
||||
void LLImageJ2C::setReversible(const BOOL reversible)
|
||||
void LLImageJ2C::setReversible(const bool reversible)
|
||||
{
|
||||
mReversible = reversible;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
|
||||
bool LLImageJ2C::loadAndValidate(const std::string &filename)
|
||||
{
|
||||
BOOL res = TRUE;
|
||||
bool res = true;
|
||||
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -367,12 +359,12 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
|
|||
if (!apr_file)
|
||||
{
|
||||
setLastError("Unable to open file for reading", filename);
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else if (file_size == 0)
|
||||
{
|
||||
setLastError("File is empty",filename);
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -385,7 +377,7 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
|
|||
{
|
||||
FREE_MEM(LLImageBase::getPrivatePool(), data);
|
||||
setLastError("Unable to read entire file");
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -402,21 +394,21 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
|
||||
bool LLImageJ2C::validate(U8 *data, U32 file_size)
|
||||
{
|
||||
|
||||
resetLastError();
|
||||
|
||||
setData(data, file_size);
|
||||
|
||||
BOOL res = updateData();
|
||||
bool res = updateData();
|
||||
if ( res )
|
||||
{
|
||||
// Check to make sure that this instance has been initialized with data
|
||||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImageJ2C uninitialized");
|
||||
res = FALSE;
|
||||
res = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -433,7 +425,7 @@ BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
|
|||
|
||||
void LLImageJ2C::decodeFailed()
|
||||
{
|
||||
mDecoding = FALSE;
|
||||
mDecoding = false;
|
||||
}
|
||||
|
||||
void LLImageJ2C::updateRawDiscardLevel()
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "llimage.h"
|
||||
#include "llassettype.h"
|
||||
#include "llmetricperformancetester.h"
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
// JPEG2000 : compression rate used in j2c conversion.
|
||||
const F32 DEFAULT_COMPRESSION_RATE = 1.f/8.f;
|
||||
|
|
@ -47,10 +48,10 @@ public:
|
|||
|
||||
// Base class overrides
|
||||
/*virtual*/ std::string getExtension() { return std::string("j2c"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ BOOL decode(LLImageRaw *raw_imagep, F32 decode_time);
|
||||
/*virtual*/ BOOL decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw *raw_imagep, F32 encode_time);
|
||||
/*virtual*/ bool updateData();
|
||||
/*virtual*/ bool decode(LLImageRaw *raw_imagep, F32 decode_time);
|
||||
/*virtual*/ bool decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
/*virtual*/ bool encode(const LLImageRaw *raw_imagep, F32 encode_time);
|
||||
/*virtual*/ S32 calcHeaderSize();
|
||||
/*virtual*/ S32 calcDataSize(S32 discard_level = 0);
|
||||
/*virtual*/ S32 calcDiscardLevelBytes(S32 bytes);
|
||||
|
|
@ -59,17 +60,17 @@ public:
|
|||
/*virtual*/ void resetLastError();
|
||||
/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
|
||||
|
||||
BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region);
|
||||
BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
|
||||
bool initDecode(LLImageRaw &raw_image, int discard_level, int* region);
|
||||
bool initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
|
||||
|
||||
// Encode with comment text
|
||||
BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
|
||||
bool encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
|
||||
|
||||
BOOL validate(U8 *data, U32 file_size);
|
||||
BOOL loadAndValidate(const std::string &filename);
|
||||
bool validate(U8 *data, U32 file_size);
|
||||
bool loadAndValidate(const std::string &filename);
|
||||
|
||||
// Encode accessors
|
||||
void setReversible(const BOOL reversible); // Use non-lossy?
|
||||
void setReversible(const bool reversible); // Use non-lossy?
|
||||
void setMaxBytes(S32 max_bytes);
|
||||
S32 getMaxBytes() const { return mMaxBytes; }
|
||||
|
||||
|
|
@ -93,8 +94,8 @@ protected:
|
|||
|
||||
S8 mRawDiscardLevel;
|
||||
F32 mRate;
|
||||
BOOL mReversible;
|
||||
LLImageJ2CImpl *mImpl;
|
||||
bool mReversible;
|
||||
boost::scoped_ptr<LLImageJ2CImpl> mImpl;
|
||||
std::string mLastError;
|
||||
|
||||
// Image compression/decompression tester
|
||||
|
|
@ -111,23 +112,25 @@ protected:
|
|||
// Return value:
|
||||
// true: image size and number of channels was determined
|
||||
// false: error on decode
|
||||
virtual BOOL getMetadata(LLImageJ2C &base) = 0;
|
||||
virtual bool getMetadata(LLImageJ2C &base) = 0;
|
||||
// Decode the raw image optionally aborting (to continue later) after
|
||||
// decode_time seconds. Decode at most max_channel_count and start
|
||||
// decoding channel first_channel.
|
||||
// Return value:
|
||||
// true: decoding complete (even if it failed)
|
||||
// false: time expired while decoding
|
||||
virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
|
||||
virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
BOOL reversible=FALSE) = 0;
|
||||
virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
|
||||
virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
|
||||
virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
|
||||
virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
bool reversible=false) = 0;
|
||||
virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
|
||||
virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
|
||||
|
||||
virtual std::string getEngineInfo() const = 0;
|
||||
|
||||
friend class LLImageJ2C;
|
||||
};
|
||||
|
||||
#define LINDEN_J2C_COMMENT_PREFIX "LL_"
|
||||
#define LINDEN_J2C_COMMENT_PREFIX "LL_" // Used by LLAppearanceUtility
|
||||
|
||||
//
|
||||
// This class is used for performance data gathering only.
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ LLImageJPEG::~LLImageJPEG()
|
|||
delete[] mOutputBuffer;
|
||||
}
|
||||
|
||||
BOOL LLImageJPEG::updateData()
|
||||
bool LLImageJPEG::updateData()
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -53,7 +53,7 @@ BOOL LLImageJPEG::updateData()
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("Uninitialized instance of LLImageJPEG");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
|
|
@ -79,7 +79,7 @@ BOOL LLImageJPEG::updateData()
|
|||
if(setjmp(sSetjmpBuffer))
|
||||
{
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
|
|
@ -106,7 +106,7 @@ BOOL LLImageJPEG::updateData()
|
|||
|
||||
////////////////////////////////////////
|
||||
// Step 3: read file parameters with jpeg_read_header()
|
||||
jpeg_read_header( &cinfo, TRUE );
|
||||
jpeg_read_header( &cinfo, true );
|
||||
|
||||
// Data set by jpeg_read_header
|
||||
setSize(cinfo.image_width, cinfo.image_height, 3); // Force to 3 components (RGB)
|
||||
|
|
@ -115,13 +115,13 @@ BOOL LLImageJPEG::updateData()
|
|||
// More data set by jpeg_read_header
|
||||
cinfo.num_components;
|
||||
cinfo.jpeg_color_space; // Colorspace of image
|
||||
cinfo.saw_JFIF_marker; // TRUE if a JFIF APP0 marker was seen
|
||||
cinfo.saw_JFIF_marker; // true if a JFIF APP0 marker was seen
|
||||
cinfo.JFIF_major_version; // Version information from JFIF marker
|
||||
cinfo.JFIF_minor_version; //
|
||||
cinfo.density_unit; // Resolution data from JFIF marker
|
||||
cinfo.X_density;
|
||||
cinfo.Y_density;
|
||||
cinfo.saw_Adobe_marker; // TRUE if an Adobe APP14 marker was seen
|
||||
cinfo.saw_Adobe_marker; // true if an Adobe APP14 marker was seen
|
||||
cinfo.Adobe_transform; // Color transform code from Adobe marker
|
||||
*/
|
||||
}
|
||||
|
|
@ -129,13 +129,13 @@ BOOL LLImageJPEG::updateData()
|
|||
{
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
////////////////////////////////////////
|
||||
// Step 4: Release JPEG decompression object
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Initialize source --- called by jpeg_read_header
|
||||
|
|
@ -154,7 +154,7 @@ boolean LLImageJPEG::decodeFillInputBuffer( j_decompress_ptr cinfo )
|
|||
// Should never get here, since we provide the entire buffer up front.
|
||||
ERREXIT(cinfo, JERR_INPUT_EMPTY);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Skip data --- used to skip over a potentially large amount of
|
||||
|
|
@ -182,7 +182,7 @@ void LLImageJPEG::decodeTermSource (j_decompress_ptr cinfo)
|
|||
|
||||
|
||||
// Returns true when done, whether or not decode was successful.
|
||||
BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
bool LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -192,7 +192,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImageJPEG trying to decode an image with no data!");
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
S32 row_stride = 0;
|
||||
|
|
@ -220,7 +220,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if(setjmp(sSetjmpBuffer))
|
||||
{
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
try
|
||||
{
|
||||
|
|
@ -247,11 +247,11 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
////////////////////////////////////////
|
||||
// Step 3: read file parameters with jpeg_read_header()
|
||||
|
||||
jpeg_read_header(&cinfo, TRUE);
|
||||
jpeg_read_header(&cinfo, true);
|
||||
|
||||
// We can ignore the return value from jpeg_read_header since
|
||||
// (a) suspension is not possible with our data source, and
|
||||
// (b) we passed TRUE to reject a tables-only JPEG file as an error.
|
||||
// (b) we passed true to reject a tables-only JPEG file as an error.
|
||||
// See libjpeg.doc for more info.
|
||||
|
||||
setSize(cinfo.image_width, cinfo.image_height, 3); // Force to 3 components (RGB)
|
||||
|
|
@ -314,7 +314,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
catch (int)
|
||||
{
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
// Check to see whether any corrupt-data warnings occurred
|
||||
|
|
@ -322,10 +322,10 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
{
|
||||
// TODO: extract the warning to find out what went wrong.
|
||||
setLastError( "Unable to decode JPEG image.");
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -344,11 +344,11 @@ void LLImageJPEG::encodeInitDestination ( j_compress_ptr cinfo )
|
|||
//
|
||||
// In typical applications, this should write the entire output buffer
|
||||
// (ignoring the current state of next_output_byte & free_in_buffer),
|
||||
// reset the pointer & count to the start of the buffer, and return TRUE
|
||||
// reset the pointer & count to the start of the buffer, and return true
|
||||
// indicating that the buffer has been dumped.
|
||||
//
|
||||
// In applications that need to be able to suspend compression due to output
|
||||
// overrun, a FALSE return indicates that the buffer cannot be emptied now.
|
||||
// overrun, a false return indicates that the buffer cannot be emptied now.
|
||||
// In this situation, the compressor will return to its caller (possibly with
|
||||
// an indication that it has not accepted all the supplied scanlines). The
|
||||
// application should resume compression after it has made more room in the
|
||||
|
|
@ -357,7 +357,7 @@ void LLImageJPEG::encodeInitDestination ( j_compress_ptr cinfo )
|
|||
//
|
||||
// When suspending, the compressor will back up to a convenient restart point
|
||||
// (typically the start of the current MCU). next_output_byte & free_in_buffer
|
||||
// indicate where the restart point will be if the current call returns FALSE.
|
||||
// indicate where the restart point will be if the current call returns false.
|
||||
// Data beyond this point will be regenerated after resumption, so do not
|
||||
// write it out when emptying the buffer externally.
|
||||
|
||||
|
|
@ -374,7 +374,7 @@ boolean LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )
|
|||
if (!new_buffer)
|
||||
{
|
||||
LL_ERRS() << "Out of memory in LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )" << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
memcpy( new_buffer, self->mOutputBuffer, self->mOutputBufferSize ); /* Flawfinder: ignore */
|
||||
delete[] self->mOutputBuffer;
|
||||
|
|
@ -386,7 +386,7 @@ boolean LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )
|
|||
self->mOutputBufferSize = new_buffer_size;
|
||||
self->claimMem(new_buffer_size);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Terminate destination --- called by jpeg_finish_compress
|
||||
|
|
@ -465,11 +465,11 @@ void LLImageJPEG::errorOutputMessage( j_common_ptr cinfo )
|
|||
std::string error = buffer ;
|
||||
LLImage::setLastError(error);
|
||||
|
||||
BOOL is_decode = (cinfo->is_decompressor != 0);
|
||||
bool is_decode = (cinfo->is_decompressor != 0);
|
||||
LL_WARNS() << "LLImageJPEG " << (is_decode ? "decode " : "encode ") << " failed: " << buffer << LL_ENDL;
|
||||
}
|
||||
|
||||
BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
||||
bool LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -482,7 +482,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
|||
break;
|
||||
default:
|
||||
setLastError("Unable to encode a JPEG image that doesn't have 1 or 3 components.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
setSize(raw_image->getWidth(), raw_image->getHeight(), raw_image->getComponents());
|
||||
|
|
@ -531,7 +531,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
|||
mOutputBuffer = NULL;
|
||||
disclaimMem(mOutputBufferSize);
|
||||
mOutputBufferSize = 0;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
|
|
@ -576,7 +576,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
|||
break;
|
||||
default:
|
||||
setLastError("Unable to encode a JPEG image that doesn't have 1 or 3 components.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Now use the library's routine to set default compression parameters.
|
||||
|
|
@ -585,15 +585,15 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
|||
jpeg_set_defaults(&cinfo);
|
||||
|
||||
// Now you can set any non-default parameters you wish to.
|
||||
jpeg_set_quality(&cinfo, mEncodeQuality, TRUE ); // limit to baseline-JPEG values
|
||||
jpeg_set_quality(&cinfo, mEncodeQuality, true ); // limit to baseline-JPEG values
|
||||
|
||||
////////////////////////////////////////
|
||||
// Step 4: Start compressor
|
||||
//
|
||||
// TRUE ensures that we will write a complete interchange-JPEG file.
|
||||
// Pass TRUE unless you are very sure of what you're doing.
|
||||
// true ensures that we will write a complete interchange-JPEG file.
|
||||
// Pass true unless you are very sure of what you're doing.
|
||||
|
||||
jpeg_start_compress(&cinfo, TRUE);
|
||||
jpeg_start_compress(&cinfo, true);
|
||||
|
||||
////////////////////////////////////////
|
||||
// Step 5: while (scan lines remain to be written)
|
||||
|
|
@ -647,8 +647,8 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
|
|||
mOutputBuffer = NULL;
|
||||
disclaimMem(mOutputBufferSize);
|
||||
mOutputBufferSize = 0;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,9 +51,9 @@ public:
|
|||
LLImageJPEG(S32 quality = 75);
|
||||
|
||||
/*virtual*/ std::string getExtension() { return std::string("jpg"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
/*virtual*/ bool updateData();
|
||||
/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
|
||||
void setEncodeQuality( S32 q ) { mEncodeQuality = q; } // on a scale from 1 to 100
|
||||
S32 getEncodeQuality() { return mEncodeQuality; }
|
||||
|
|
@ -73,7 +73,7 @@ public:
|
|||
static void errorEmitMessage(j_common_ptr cinfo, int msg_level);
|
||||
static void errorOutputMessage(j_common_ptr cinfo);
|
||||
|
||||
static BOOL decompress(LLImageJPEG* imagep);
|
||||
static bool decompress(LLImageJPEG* imagep);
|
||||
|
||||
protected:
|
||||
U8* mOutputBuffer; // temp buffer used during encoding
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ LLImagePNG::~LLImagePNG()
|
|||
// Virtual
|
||||
// Parse PNG image information and set the appropriate
|
||||
// width, height and component (channel) information.
|
||||
BOOL LLImagePNG::updateData()
|
||||
bool LLImagePNG::updateData()
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ BOOL LLImagePNG::updateData()
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("Uninitialized instance of LLImagePNG");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Decode the PNG data and extract sizing information
|
||||
|
|
@ -63,25 +63,25 @@ BOOL LLImagePNG::updateData()
|
|||
if (!pngWrapper.isValidPng(getData()))
|
||||
{
|
||||
setLastError("LLImagePNG data does not have a valid PNG header!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLPngWrapper::ImageInfo infop;
|
||||
if (! pngWrapper.readPng(getData(), getDataSize(), NULL, &infop))
|
||||
{
|
||||
setLastError(pngWrapper.getErrorMessage());
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
setSize(infop.mWidth, infop.mHeight, infop.mComponents);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Virtual
|
||||
// Decode an in-memory PNG image into the raw RGB or RGBA format
|
||||
// used within SecondLife.
|
||||
BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
bool LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -91,7 +91,7 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImagePNG trying to decode an image with no data!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Decode the PNG data into the raw image
|
||||
|
|
@ -99,21 +99,21 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if (!pngWrapper.isValidPng(getData()))
|
||||
{
|
||||
setLastError("LLImagePNG data does not have a valid PNG header!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (! pngWrapper.readPng(getData(), getDataSize(), raw_image))
|
||||
{
|
||||
setLastError(pngWrapper.getErrorMessage());
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Virtual
|
||||
// Encode the in memory RGB image into PNG format.
|
||||
BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
bool LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -133,7 +133,7 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
{
|
||||
setLastError(pngWrapper.getErrorMessage());
|
||||
delete[] tmpWriteBuffer;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Resize internal buffer and copy from temp
|
||||
|
|
@ -143,6 +143,6 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
|
||||
delete[] tmpWriteBuffer;
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,9 +38,9 @@ public:
|
|||
LLImagePNG();
|
||||
|
||||
/*virtual*/ std::string getExtension() { return std::string("png"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
/*virtual*/ bool updateData();
|
||||
/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
|
||||
/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ LLImageTGA::LLImageTGA()
|
|||
mColorMapStart( 0 ),
|
||||
mColorMapLength( 0 ),
|
||||
mColorMapBytesPerEntry( 0 ),
|
||||
mIs15Bit( FALSE ),
|
||||
mIs15Bit( false ),
|
||||
|
||||
mAttributeBits(0),
|
||||
mColorMapDepth(0),
|
||||
|
|
@ -94,7 +94,7 @@ LLImageTGA::LLImageTGA(const std::string& file_name)
|
|||
mColorMapStart( 0 ),
|
||||
mColorMapLength( 0 ),
|
||||
mColorMapBytesPerEntry( 0 ),
|
||||
mIs15Bit( FALSE )
|
||||
mIs15Bit( false )
|
||||
{
|
||||
loadFile(file_name);
|
||||
}
|
||||
|
|
@ -104,7 +104,7 @@ LLImageTGA::~LLImageTGA()
|
|||
delete [] mColorMap;
|
||||
}
|
||||
|
||||
BOOL LLImageTGA::updateData()
|
||||
bool LLImageTGA::updateData()
|
||||
{
|
||||
resetLastError();
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ BOOL LLImageTGA::updateData()
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImageTGA uninitialized");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Pull image information from the header...
|
||||
|
|
@ -185,13 +185,13 @@ BOOL LLImageTGA::updateData()
|
|||
case 0:
|
||||
// No image data included in file
|
||||
setLastError("Unable to load file. TGA file contains no image data.");
|
||||
return FALSE;
|
||||
return false;
|
||||
case 1:
|
||||
// Colormapped uncompressed
|
||||
if( 8 != mPixelSize )
|
||||
{
|
||||
setLastError("Unable to load file. Colormapped images must have 8 bits per pixel.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
|
|
@ -202,7 +202,7 @@ BOOL LLImageTGA::updateData()
|
|||
if( 8 != mPixelSize )
|
||||
{
|
||||
setLastError("Unable to load file. Monochrome images must have 8 bits per pixel.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
|
|
@ -216,12 +216,12 @@ BOOL LLImageTGA::updateData()
|
|||
if( 8 != mPixelSize )
|
||||
{
|
||||
setLastError("Unable to load file. Monochrome images must have 8 bits per pixel.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
setLastError("Unable to load file. Unrecoginzed TGA image type.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// discard the ID field, if any
|
||||
|
|
@ -266,8 +266,8 @@ BOOL LLImageTGA::updateData()
|
|||
mColorMap = new U8[ color_map_bytes ];
|
||||
if (!mColorMap)
|
||||
{
|
||||
LL_ERRS() << "Out of Memory in BOOL LLImageTGA::updateData()" << LL_ENDL;
|
||||
return FALSE;
|
||||
LL_ERRS() << "Out of Memory in bool LLImageTGA::updateData()" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
memcpy( mColorMap, getData() + mDataOffset, color_map_bytes ); /* Flawfinder: ignore */
|
||||
}
|
||||
|
|
@ -302,28 +302,28 @@ BOOL LLImageTGA::updateData()
|
|||
// if( mAttributeBits != 8 )
|
||||
// {
|
||||
// setLastError("Unable to load file. 32 bit TGA image does not have 8 bits of alpha.");
|
||||
// return FALSE;
|
||||
// return false;
|
||||
// }
|
||||
mAttributeBits = 8;
|
||||
break;
|
||||
case 15:
|
||||
case 16:
|
||||
components = 3;
|
||||
mIs15Bit = TRUE; // 16th bit is used for Targa hardware interupts and is ignored.
|
||||
mIs15Bit = true; // 16th bit is used for Targa hardware interupts and is ignored.
|
||||
break;
|
||||
case 8:
|
||||
components = 1;
|
||||
break;
|
||||
default:
|
||||
setLastError("Unable to load file. Unknown pixel size.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
setSize(width, height, components);
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
bool LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -331,7 +331,7 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImageTGA trying to decode an image with no data!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy everything after the header.
|
||||
|
|
@ -343,18 +343,18 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
(getComponents() != 4) )
|
||||
{
|
||||
setLastError("TGA images with a number of components other than 1, 3, and 4 are not supported.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if( mOriginRightBit )
|
||||
{
|
||||
setLastError("TGA images with origin on right side are not supported.");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL flipped = (mOriginTopBit != 0);
|
||||
BOOL rle_compressed = ((mImageType & 0x08) != 0);
|
||||
bool flipped = (mOriginTopBit != 0);
|
||||
bool rle_compressed = ((mImageType & 0x08) != 0);
|
||||
|
||||
if( mColorMap )
|
||||
{
|
||||
|
|
@ -366,10 +366,10 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
}
|
||||
}
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
|
||||
bool LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped )
|
||||
{
|
||||
BOOL success = FALSE;
|
||||
BOOL alpha_opaque = FALSE;
|
||||
bool success = false;
|
||||
bool alpha_opaque = false;
|
||||
if( rle )
|
||||
{
|
||||
|
||||
|
|
@ -404,7 +404,7 @@ BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped
|
|||
}
|
||||
else
|
||||
{
|
||||
BOOL alpha_opaque;
|
||||
bool alpha_opaque;
|
||||
success = decodeTruecolorNonRle( raw_image, alpha_opaque );
|
||||
if (alpha_opaque && raw_image->getComponents() == 4)
|
||||
{
|
||||
|
|
@ -430,9 +430,9 @@ BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque )
|
||||
bool LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, bool &alpha_opaque )
|
||||
{
|
||||
alpha_opaque = TRUE;
|
||||
alpha_opaque = true;
|
||||
|
||||
// Origin is the bottom left
|
||||
U8* dst = raw_image->getData();
|
||||
|
|
@ -442,7 +442,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
|
|||
|
||||
if (pixels * (mIs15Bit ? 2 : getComponents()) > getDataSize() - mDataOffset)
|
||||
{ //here we have situation when data size in src less than actually needed
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (getComponents() == 4)
|
||||
|
|
@ -456,7 +456,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
|
|||
dst[3] = src[3]; // Alpha
|
||||
if (dst[3] != 255)
|
||||
{
|
||||
alpha_opaque = FALSE;
|
||||
alpha_opaque = false;
|
||||
}
|
||||
dst += 4;
|
||||
src += 4;
|
||||
|
|
@ -490,7 +490,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
|
|||
memcpy(dst, src, pixels); /* Flawfinder: ignore */
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLImageTGA::decodeColorMapPixel8( U8* dst, const U8* src )
|
||||
|
|
@ -523,14 +523,14 @@ void LLImageTGA::decodeColorMapPixel32( U8* dst, const U8* src )
|
|||
}
|
||||
|
||||
|
||||
BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
|
||||
bool LLImageTGA::decodeColorMap( LLImageRaw* raw_image, bool rle, bool flipped )
|
||||
{
|
||||
// If flipped, origin is the top left. Need to reverse the order of the rows.
|
||||
// Otherwise the origin is the bottom left.
|
||||
|
||||
if( 8 != mPixelSize )
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
U8* src = getData() + mDataOffset;
|
||||
|
|
@ -544,7 +544,7 @@ BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
|
|||
case 2: pixel_decoder = &LLImageTGA::decodeColorMapPixel15; break;
|
||||
case 3: pixel_decoder = &LLImageTGA::decodeColorMapPixel24; break;
|
||||
case 4: pixel_decoder = &LLImageTGA::decodeColorMapPixel32; break;
|
||||
default: llassert(0); return FALSE;
|
||||
default: llassert(0); return false;
|
||||
}
|
||||
|
||||
if( rle )
|
||||
|
|
@ -613,12 +613,12 @@ BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
bool LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -642,7 +642,7 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
mImageType = 2;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Color map stuff (unsupported)
|
||||
|
|
@ -678,7 +678,7 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
bytes_per_pixel = 4;
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
mPixelSize = U8(bytes_per_pixel * 8); // 8, 16, 24, 32 bits per pixel
|
||||
|
||||
|
|
@ -765,13 +765,13 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
|
|||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque )
|
||||
bool LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, bool &alpha_opaque )
|
||||
{
|
||||
llassert( getComponents() == 4 );
|
||||
alpha_opaque = TRUE;
|
||||
alpha_opaque = true;
|
||||
|
||||
U8* dst = raw_image->getData();
|
||||
U32* dst_pixels = (U32*) dst;
|
||||
|
|
@ -788,7 +788,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
// Read RLE block header
|
||||
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
U8 block_header_byte = *src;
|
||||
src++;
|
||||
|
|
@ -799,7 +799,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
// Encoded (duplicate-pixel) block
|
||||
|
||||
if (src + 3 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
rgba_byte_p[0] = src[2];
|
||||
rgba_byte_p[1] = src[1];
|
||||
|
|
@ -807,7 +807,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
rgba_byte_p[3] = src[3];
|
||||
if (rgba_byte_p[3] != 255)
|
||||
{
|
||||
alpha_opaque = FALSE;
|
||||
alpha_opaque = false;
|
||||
}
|
||||
|
||||
src += 4;
|
||||
|
|
@ -826,7 +826,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
do
|
||||
{
|
||||
if (src + 3 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
((U8*)dst_pixels)[0] = src[2];
|
||||
((U8*)dst_pixels)[1] = src[1];
|
||||
|
|
@ -834,7 +834,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
((U8*)dst_pixels)[3] = src[3];
|
||||
if (src[3] != 255)
|
||||
{
|
||||
alpha_opaque = FALSE;
|
||||
alpha_opaque = false;
|
||||
}
|
||||
src += 4;
|
||||
dst_pixels++;
|
||||
|
|
@ -844,10 +844,10 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
||||
bool LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
||||
{
|
||||
llassert( getComponents() == 3 );
|
||||
llassert( mIs15Bit );
|
||||
|
|
@ -863,7 +863,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
|||
// Read RLE block header
|
||||
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
U8 block_header_byte = *src;
|
||||
src++;
|
||||
|
|
@ -875,7 +875,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
|||
do
|
||||
{
|
||||
if (src + 2 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
decodeTruecolorPixel15( dst, src ); // slow
|
||||
dst += 3;
|
||||
|
|
@ -890,7 +890,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
|||
do
|
||||
{
|
||||
if (src + 2 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
decodeTruecolorPixel15( dst, src );
|
||||
dst += 3;
|
||||
|
|
@ -901,12 +901,12 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
||||
bool LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
||||
{
|
||||
llassert( getComponents() == 3 );
|
||||
|
||||
|
|
@ -921,7 +921,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
|||
// Read RLE block header
|
||||
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
U8 block_header_byte = *src;
|
||||
src++;
|
||||
|
|
@ -933,7 +933,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
|||
do
|
||||
{
|
||||
if (src + 2 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
dst[0] = src[2];
|
||||
dst[1] = src[1];
|
||||
dst[2] = src[0];
|
||||
|
|
@ -949,7 +949,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
|||
do
|
||||
{
|
||||
if (src + 2 >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
dst[0] = src[2];
|
||||
dst[1] = src[1];
|
||||
|
|
@ -962,11 +962,11 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
||||
bool LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
||||
{
|
||||
llassert( getComponents() == 1 );
|
||||
|
||||
|
|
@ -981,7 +981,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
|||
// Read RLE block header
|
||||
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
U8 block_header_byte = *src;
|
||||
src++;
|
||||
|
|
@ -990,7 +990,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
|||
if( block_header_byte & 0x80 )
|
||||
{
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
// Encoded (duplicate-pixel) block
|
||||
memset( dst, *src, block_pixel_count );
|
||||
|
|
@ -1003,7 +1003,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
|||
do
|
||||
{
|
||||
if (src >= last_src)
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
*dst = *src;
|
||||
dst++;
|
||||
|
|
@ -1014,13 +1014,13 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
|
|||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Decoded and process the image for use in avatar gradient masks.
|
||||
// Processing happens during the decode for speed.
|
||||
BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight )
|
||||
bool LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight )
|
||||
{
|
||||
llassert_always(raw_image);
|
||||
|
||||
|
|
@ -1043,14 +1043,14 @@ BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight
|
|||
if (!getData() || (0 == getDataSize()))
|
||||
{
|
||||
setLastError("LLImageTGA trying to decode an image with no data!");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Only works for unflipped monochrome RLE images
|
||||
if( (getComponents() != 1) || (mImageType != 11) || mOriginTopBit || mOriginRightBit )
|
||||
{
|
||||
LL_ERRS() << "LLImageTGA trying to alpha-gradient process an image that's not a standard RLE, one component image" << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
raw_image->resize(getWidth(), getHeight(), getComponents());
|
||||
|
|
@ -1136,7 +1136,7 @@ BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight
|
|||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Reads a .tga file and creates an LLImageTGA with its data.
|
||||
|
|
|
|||
|
|
@ -41,25 +41,25 @@ public:
|
|||
LLImageTGA(const std::string& file_name);
|
||||
|
||||
/*virtual*/ std::string getExtension() { return std::string("tga"); }
|
||||
/*virtual*/ BOOL updateData();
|
||||
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time=0.0);
|
||||
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time=0.0);
|
||||
/*virtual*/ bool updateData();
|
||||
/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time=0.0);
|
||||
/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time=0.0);
|
||||
|
||||
BOOL decodeAndProcess(LLImageRaw* raw_image, F32 domain, F32 weight);
|
||||
bool decodeAndProcess(LLImageRaw* raw_image, F32 domain, F32 weight);
|
||||
|
||||
private:
|
||||
BOOL decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
|
||||
bool decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped );
|
||||
|
||||
BOOL decodeTruecolorRle8( LLImageRaw* raw_image );
|
||||
BOOL decodeTruecolorRle15( LLImageRaw* raw_image );
|
||||
BOOL decodeTruecolorRle24( LLImageRaw* raw_image );
|
||||
BOOL decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque );
|
||||
bool decodeTruecolorRle8( LLImageRaw* raw_image );
|
||||
bool decodeTruecolorRle15( LLImageRaw* raw_image );
|
||||
bool decodeTruecolorRle24( LLImageRaw* raw_image );
|
||||
bool decodeTruecolorRle32( LLImageRaw* raw_image, bool &alpha_opaque );
|
||||
|
||||
void decodeTruecolorPixel15( U8* dst, const U8* src );
|
||||
|
||||
BOOL decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque );
|
||||
bool decodeTruecolorNonRle( LLImageRaw* raw_image, bool &alpha_opaque );
|
||||
|
||||
BOOL decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
|
||||
bool decodeColorMap( LLImageRaw* raw_image, bool rle, bool flipped );
|
||||
|
||||
void decodeColorMapPixel8(U8* dst, const U8* src);
|
||||
void decodeColorMapPixel15(U8* dst, const U8* src);
|
||||
|
|
@ -100,7 +100,7 @@ private:
|
|||
S32 mColorMapLength;
|
||||
S32 mColorMapBytesPerEntry;
|
||||
|
||||
BOOL mIs15Bit;
|
||||
bool mIs15Bit;
|
||||
|
||||
static const U8 s5to8bits[32];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -33,23 +33,16 @@
|
|||
#include "lltimer.h"
|
||||
//#include "llmemory.h"
|
||||
|
||||
const char* fallbackEngineInfoLLImageJ2CImpl()
|
||||
{
|
||||
static std::string version_string =
|
||||
std::string("OpenJPEG: " OPENJPEG_VERSION ", Runtime: ")
|
||||
+ opj_version();
|
||||
return version_string.c_str();
|
||||
}
|
||||
|
||||
// Factory function: see declaration in llimagej2c.cpp
|
||||
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
|
||||
{
|
||||
return new LLImageJ2COJ();
|
||||
}
|
||||
|
||||
void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
|
||||
std::string LLImageJ2COJ::getEngineInfo() const
|
||||
{
|
||||
delete impl;
|
||||
impl = NULL;
|
||||
return std::string("OpenJPEG: " OPENJPEG_VERSION ", Runtime: ")
|
||||
+ opj_version();
|
||||
}
|
||||
|
||||
// Return string from message, eliminating final \n if present
|
||||
|
|
@ -107,19 +100,19 @@ LLImageJ2COJ::~LLImageJ2COJ()
|
|||
{
|
||||
}
|
||||
|
||||
BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
|
||||
bool LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
|
||||
{
|
||||
// No specific implementation for this method in the OpenJpeg case
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
bool LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
{
|
||||
// No specific implementation for this method in the OpenJpeg case
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
bool LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
{
|
||||
//
|
||||
// FIXME: Get the comment field out of the texture
|
||||
|
|
@ -186,7 +179,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
|
|||
opj_image_destroy(image);
|
||||
}
|
||||
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
// sometimes we get bad data out of the cache - check to see if the decode succeeded
|
||||
|
|
@ -196,8 +189,8 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
|
|||
{
|
||||
// if we didn't get the discard level we're expecting, fail
|
||||
opj_image_destroy(image);
|
||||
base.mDecoding = FALSE;
|
||||
return TRUE;
|
||||
base.mDecoding = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -209,7 +202,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
|
|||
opj_image_destroy(image);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Copy image data into our raw image format (instead of the separate channel format
|
||||
|
|
@ -256,18 +249,18 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
|
|||
LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL;
|
||||
opj_image_destroy(image);
|
||||
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
}
|
||||
|
||||
/* free image data structure */
|
||||
opj_image_destroy(image);
|
||||
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
|
||||
bool LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, bool reversible)
|
||||
{
|
||||
const S32 MAX_COMPS = 5;
|
||||
opj_cparameters_t parameters; /* compression parameters */
|
||||
|
|
@ -388,7 +381,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
|
|||
{
|
||||
opj_cio_close(cio);
|
||||
LL_DEBUGS("Texture") << "Failed to encode image." << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
codestream_length = cio_tell(cio);
|
||||
|
||||
|
|
@ -407,10 +400,10 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
|
|||
|
||||
/* free image data */
|
||||
opj_image_destroy(image);
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
|
||||
bool LLImageJ2COJ::getMetadata(LLImageJ2C &base)
|
||||
{
|
||||
//
|
||||
// FIXME: We get metadata by decoding the ENTIRE image.
|
||||
|
|
@ -473,7 +466,7 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
|
|||
if(!image)
|
||||
{
|
||||
LL_WARNS() << "ERROR -> getMetadata: failed to decode image!" << LL_ENDL;
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy image data into our raw image format (instead of the separate channel format
|
||||
|
|
@ -487,5 +480,5 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
|
|||
|
||||
/* free image data structure */
|
||||
opj_image_destroy(image);
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,12 +35,13 @@ public:
|
|||
LLImageJ2COJ();
|
||||
virtual ~LLImageJ2COJ();
|
||||
protected:
|
||||
/*virtual*/ BOOL getMetadata(LLImageJ2C &base);
|
||||
/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
BOOL reversible = FALSE);
|
||||
/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
|
||||
/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
|
||||
virtual bool getMetadata(LLImageJ2C &base);
|
||||
virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
bool reversible = false);
|
||||
virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
|
||||
virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
|
||||
virtual std::string getEngineInfo() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -72,37 +72,15 @@ private:
|
|||
//
|
||||
void set_default_colour_weights(kdu_params *siz);
|
||||
|
||||
const char* engineInfoLLImageJ2CKDU()
|
||||
{
|
||||
static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
|
||||
return version.c_str();
|
||||
}
|
||||
|
||||
LLImageJ2CKDU* createLLImageJ2CKDU()
|
||||
{
|
||||
return new LLImageJ2CKDU();
|
||||
}
|
||||
|
||||
void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu)
|
||||
{
|
||||
delete kdu;
|
||||
kdu = NULL;
|
||||
}
|
||||
|
||||
// Factory function: see declaration in llimagej2c.cpp
|
||||
LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
|
||||
{
|
||||
return new LLImageJ2CKDU();
|
||||
}
|
||||
|
||||
void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
|
||||
std::string LLImageJ2CKDU::getEngineInfo() const
|
||||
{
|
||||
delete impl;
|
||||
impl = NULL;
|
||||
}
|
||||
|
||||
const char* fallbackEngineInfoLLImageJ2CImpl()
|
||||
{
|
||||
return engineInfoLLImageJ2CKDU();
|
||||
return llformat("KDU %s", KDU_CORE_VERSION);
|
||||
}
|
||||
|
||||
class LLKDUDecodeState
|
||||
|
|
@ -110,11 +88,11 @@ class LLKDUDecodeState
|
|||
public:
|
||||
LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
|
||||
~LLKDUDecodeState();
|
||||
BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE);
|
||||
bool processTileDecode(F32 decode_time, bool limit_time = true);
|
||||
|
||||
private:
|
||||
S32 mNumComponents;
|
||||
BOOL mUseYCC;
|
||||
bool mUseYCC;
|
||||
kdu_dims mDims;
|
||||
kdu_sample_allocator mAllocator;
|
||||
kdu_tile_comp mComps[4];
|
||||
|
|
@ -128,74 +106,85 @@ private:
|
|||
S32 mRowGap;
|
||||
};
|
||||
|
||||
void ll_kdu_error( void )
|
||||
{
|
||||
// *FIX: This exception is bad, bad, bad. It gets thrown from a
|
||||
// destructor which can lead to immediate program termination!
|
||||
throw "ll_kdu_error() throwing an exception";
|
||||
}
|
||||
|
||||
// Stuff for new kdu error handling
|
||||
class LLKDUMessageWarning : public kdu_message
|
||||
class LLKDUMessage: public kdu_message
|
||||
{
|
||||
public:
|
||||
/*virtual*/ void put_text(const char *s);
|
||||
/*virtual*/ void put_text(const kdu_uint16 *s);
|
||||
LLKDUMessage(const std::string& type):
|
||||
mType(type)
|
||||
{}
|
||||
|
||||
static LLKDUMessageWarning sDefaultMessage;
|
||||
};
|
||||
|
||||
class LLKDUMessageError : public kdu_message
|
||||
{
|
||||
public:
|
||||
/*virtual*/ void put_text(const char *s);
|
||||
/*virtual*/ void put_text(const kdu_uint16 *s);
|
||||
/*virtual*/ void flush(bool end_of_message = false);
|
||||
static LLKDUMessageError sDefaultMessage;
|
||||
};
|
||||
|
||||
void LLKDUMessageWarning::put_text(const char *s)
|
||||
{
|
||||
LL_INFOS() << "KDU Warning: " << s << LL_ENDL;
|
||||
}
|
||||
|
||||
void LLKDUMessageWarning::put_text(const kdu_uint16 *s)
|
||||
{
|
||||
LL_INFOS() << "KDU Warning: " << s << LL_ENDL;
|
||||
}
|
||||
|
||||
void LLKDUMessageError::put_text(const char *s)
|
||||
{
|
||||
LL_INFOS() << "KDU Error: " << s << LL_ENDL;
|
||||
}
|
||||
|
||||
void LLKDUMessageError::put_text(const kdu_uint16 *s)
|
||||
{
|
||||
LL_INFOS() << "KDU Error: " << s << LL_ENDL;
|
||||
}
|
||||
|
||||
void LLKDUMessageError::flush(bool end_of_message)
|
||||
{
|
||||
if (end_of_message)
|
||||
virtual void put_text(const char *s)
|
||||
{
|
||||
throw "KDU throwing an exception";
|
||||
LL_INFOS() << "KDU " << mType << ": " << s << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
LLKDUMessageWarning LLKDUMessageWarning::sDefaultMessage;
|
||||
LLKDUMessageError LLKDUMessageError::sDefaultMessage;
|
||||
static bool kdu_message_initialized = false;
|
||||
virtual void put_text(const kdu_uint16 *s)
|
||||
{
|
||||
// The previous implementation simply streamed 's' to the log. So
|
||||
// either this put_text() override was never called -- or it produced
|
||||
// some baffling log messages -- because I assert that streaming a
|
||||
// const kdu_uint16* to a std::ostream will display only the hex value
|
||||
// of the pointer.
|
||||
LL_INFOS() << "KDU " << mType << ": "
|
||||
<< utf16str_to_utf8str(llutf16string(s)) << LL_ENDL;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string mType;
|
||||
};
|
||||
|
||||
struct LLKDUMessageWarning : public LLKDUMessage
|
||||
{
|
||||
LLKDUMessageWarning():
|
||||
LLKDUMessage("Warning")
|
||||
{
|
||||
kdu_customize_warnings(this);
|
||||
}
|
||||
};
|
||||
// Instantiating LLKDUMessageWarning calls kdu_customize_warnings() with the
|
||||
// new instance. Make it static so this only happens once.
|
||||
static LLKDUMessageWarning sWarningHandler;
|
||||
|
||||
struct LLKDUMessageError : public LLKDUMessage
|
||||
{
|
||||
LLKDUMessageError():
|
||||
LLKDUMessage("Error")
|
||||
{
|
||||
kdu_customize_errors(this);
|
||||
}
|
||||
|
||||
virtual void flush(bool end_of_message = false)
|
||||
{
|
||||
// According to the documentation nat found:
|
||||
// http://pirlwww.lpl.arizona.edu/resources/guide/software/Kakadu/html_pages/globals__kdu$mize_errors.html
|
||||
// "If a kdu_error object is destroyed, handler→flush will be called with
|
||||
// an end_of_message argument equal to true and the process will
|
||||
// subsequently be terminated through exit. The termination may be
|
||||
// avoided, however, by throwing an exception from within the message
|
||||
// terminating handler→flush call."
|
||||
// So throwing an exception here isn't arbitrary: we MUST throw an
|
||||
// exception if we want to recover from a KDU error.
|
||||
if (end_of_message)
|
||||
{
|
||||
throw "KDU throwing an exception";
|
||||
}
|
||||
}
|
||||
};
|
||||
// Instantiating LLKDUMessageError calls kdu_customize_errors() with the new
|
||||
// instance. Make it static so this only happens once.
|
||||
static LLKDUMessageError sErrorHandler;
|
||||
|
||||
LLImageJ2CKDU::LLImageJ2CKDU() : LLImageJ2CImpl(),
|
||||
mInputp(NULL),
|
||||
mCodeStreamp(NULL),
|
||||
mTPosp(NULL),
|
||||
mTileIndicesp(NULL),
|
||||
mRawImagep(NULL),
|
||||
mDecodeState(NULL),
|
||||
mBlocksSize(-1),
|
||||
mPrecinctsSize(-1),
|
||||
mLevels(0)
|
||||
mInputp(),
|
||||
mCodeStreamp(),
|
||||
mTPosp(),
|
||||
mTileIndicesp(),
|
||||
mRawImagep(NULL),
|
||||
mDecodeState(),
|
||||
mBlocksSize(-1),
|
||||
mPrecinctsSize(-1),
|
||||
mLevels(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -207,7 +196,7 @@ LLImageJ2CKDU::~LLImageJ2CKDU()
|
|||
// Stuff for new simple decode
|
||||
void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
|
||||
|
||||
void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode)
|
||||
void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode)
|
||||
{
|
||||
S32 data_size = base.getDataSize();
|
||||
S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
|
||||
|
|
@ -215,38 +204,27 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod
|
|||
//
|
||||
// Initialization
|
||||
//
|
||||
if (!kdu_message_initialized)
|
||||
{
|
||||
kdu_message_initialized = true;
|
||||
kdu_customize_errors(&LLKDUMessageError::sDefaultMessage);
|
||||
kdu_customize_warnings(&LLKDUMessageWarning::sDefaultMessage);
|
||||
}
|
||||
|
||||
if (mCodeStreamp)
|
||||
{
|
||||
mCodeStreamp->destroy();
|
||||
delete mCodeStreamp;
|
||||
mCodeStreamp = NULL;
|
||||
}
|
||||
mCodeStreamp.reset();
|
||||
|
||||
if (!mInputp && base.getData())
|
||||
{
|
||||
// The compressed data has been loaded
|
||||
// Setup the source for the codestream
|
||||
mInputp = new LLKDUMemSource(base.getData(), data_size);
|
||||
mInputp.reset(new LLKDUMemSource(base.getData(), data_size));
|
||||
}
|
||||
|
||||
if (mInputp)
|
||||
{
|
||||
// This is LLKDUMemSource::reset(), not boost::scoped_ptr::reset().
|
||||
mInputp->reset();
|
||||
}
|
||||
mCodeStreamp = new kdu_codestream;
|
||||
|
||||
mCodeStreamp->create(mInputp);
|
||||
mCodeStreamp->create(mInputp.get());
|
||||
|
||||
// Set the maximum number of bytes to use from the codestream
|
||||
// *TODO: This seems to be wrong. The base class should have no idea of how j2c compression works so no
|
||||
// good way of computing what's the byte range to be used.
|
||||
// *TODO: This seems to be wrong. The base class should have no idea of
|
||||
// how j2c compression works so no good way of computing what's the byte
|
||||
// range to be used.
|
||||
mCodeStreamp->set_max_bytes(max_bytes,true);
|
||||
|
||||
// If you want to flip or rotate the image for some reason, change
|
||||
|
|
@ -303,42 +281,26 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod
|
|||
|
||||
if (!keep_codestream)
|
||||
{
|
||||
mCodeStreamp->destroy();
|
||||
delete mCodeStreamp;
|
||||
mCodeStreamp = NULL;
|
||||
delete mInputp;
|
||||
mInputp = NULL;
|
||||
mCodeStreamp.reset();
|
||||
mInputp.reset();
|
||||
}
|
||||
}
|
||||
|
||||
void LLImageJ2CKDU::cleanupCodeStream()
|
||||
{
|
||||
delete mInputp;
|
||||
mInputp = NULL;
|
||||
|
||||
delete mDecodeState;
|
||||
mDecodeState = NULL;
|
||||
|
||||
if (mCodeStreamp)
|
||||
{
|
||||
mCodeStreamp->destroy();
|
||||
delete mCodeStreamp;
|
||||
mCodeStreamp = NULL;
|
||||
}
|
||||
|
||||
delete mTPosp;
|
||||
mTPosp = NULL;
|
||||
|
||||
delete mTileIndicesp;
|
||||
mTileIndicesp = NULL;
|
||||
mInputp.reset();
|
||||
mDecodeState.reset();
|
||||
mCodeStreamp.reset();
|
||||
mTPosp.reset();
|
||||
mTileIndicesp.reset();
|
||||
}
|
||||
|
||||
BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
|
||||
bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
|
||||
{
|
||||
return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);
|
||||
}
|
||||
|
||||
BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
bool LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
|
||||
{
|
||||
mPrecinctsSize = precincts_size;
|
||||
if (mPrecinctsSize != -1)
|
||||
|
|
@ -362,10 +324,10 @@ BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int bloc
|
|||
mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MAX_DECOMPOSITION_LEVELS);
|
||||
base.setLevels(mLevels);
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
|
||||
bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
|
||||
{
|
||||
base.resetLastError();
|
||||
|
||||
|
|
@ -377,7 +339,7 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
//findDiscardLevelsBoundaries(base);
|
||||
|
||||
base.updateRawDiscardLevel();
|
||||
setupCodeStream(base, TRUE, mode);
|
||||
setupCodeStream(base, true, mode);
|
||||
|
||||
mRawImagep = &raw_image;
|
||||
mCodeStreamp->change_appearance(false, true, false);
|
||||
|
|
@ -412,12 +374,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
|
||||
if (!mTileIndicesp)
|
||||
{
|
||||
mTileIndicesp = new kdu_dims;
|
||||
mTileIndicesp.reset(new kdu_dims);
|
||||
}
|
||||
mCodeStreamp->get_valid_tiles(*mTileIndicesp);
|
||||
if (!mTPosp)
|
||||
{
|
||||
mTPosp = new kdu_coords;
|
||||
mTPosp.reset(new kdu_coords);
|
||||
mTPosp->y = 0;
|
||||
mTPosp->x = 0;
|
||||
}
|
||||
|
|
@ -425,32 +387,32 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
catch (const char* msg)
|
||||
{
|
||||
base.setLastError(ll_safe_string(msg));
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
base.setLastError("Unknown J2C error");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Returns TRUE to mean done, whether successful or not.
|
||||
BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
// Returns true to mean done, whether successful or not.
|
||||
bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
{
|
||||
ECodeStreamMode mode = MODE_FAST;
|
||||
|
||||
LLTimer decode_timer;
|
||||
|
||||
if (!mCodeStreamp)
|
||||
if (!mCodeStreamp->exists())
|
||||
{
|
||||
if (!initDecode(base, raw_image, decode_time, mode, first_channel, max_channel_count))
|
||||
{
|
||||
// Initializing the J2C decode failed, bail out.
|
||||
cleanupCodeStream();
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -460,6 +422,13 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
|
||||
// Now we are ready to walk through the tiles processing them one-by-one.
|
||||
kdu_byte *buffer = raw_image.getData();
|
||||
if (!buffer)
|
||||
{
|
||||
base.setLastError("Memory error");
|
||||
base.decodeFailed();
|
||||
cleanupCodeStream();
|
||||
return true; // done
|
||||
}
|
||||
|
||||
while (mTPosp->y < mTileIndicesp->size.y)
|
||||
{
|
||||
|
|
@ -495,21 +464,20 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
kdu_coords offset = tile_dims.pos - dims.pos;
|
||||
int row_gap = channels*dims.size.x; // inter-row separation
|
||||
kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels;
|
||||
mDecodeState = new LLKDUDecodeState(tile, buf, row_gap);
|
||||
mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap));
|
||||
}
|
||||
// Do the actual processing
|
||||
F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32();
|
||||
// This is where we do the actual decode. If we run out of time, return false.
|
||||
if (mDecodeState->processTileDecode(remaining_time, (decode_time > 0.0f)))
|
||||
{
|
||||
delete mDecodeState;
|
||||
mDecodeState = NULL;
|
||||
mDecodeState.reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not finished decoding yet.
|
||||
// setLastError("Ran out of time while decoding");
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (const char* msg)
|
||||
|
|
@ -517,14 +485,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
base.setLastError(ll_safe_string(msg));
|
||||
base.decodeFailed();
|
||||
cleanupCodeStream();
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
base.setLastError( "Unknown J2C error" );
|
||||
base.decodeFailed();
|
||||
cleanupCodeStream();
|
||||
return TRUE; // done
|
||||
return true; // done
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -536,11 +504,11 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
|
||||
cleanupCodeStream();
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
|
||||
bool LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, bool reversible)
|
||||
{
|
||||
// Declare and set simple arguments
|
||||
bool transpose = false;
|
||||
|
|
@ -708,36 +676,36 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
|
|||
catch(const char* msg)
|
||||
{
|
||||
base.setLastError(ll_safe_string(msg));
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
base.setLastError( "Unknown J2C error" );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
|
||||
bool LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
|
||||
{
|
||||
// *FIX: kdu calls our callback function if there's an error, and
|
||||
// then bombs. To regain control, we throw an exception, and
|
||||
// catch it here.
|
||||
try
|
||||
{
|
||||
setupCodeStream(base, FALSE, MODE_FAST);
|
||||
return TRUE;
|
||||
setupCodeStream(base, false, MODE_FAST);
|
||||
return true;
|
||||
}
|
||||
catch (const char* msg)
|
||||
{
|
||||
base.setLastError(ll_safe_string(msg));
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
base.setLastError( "Unknown J2C error" );
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -745,6 +713,8 @@ BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
|
|||
/* STATIC copy_block */
|
||||
/*****************************************************************************/
|
||||
|
||||
/*==========================================================================*|
|
||||
// Only called by copy_tile(), which is itself commented out
|
||||
static void copy_block(kdu_block *in, kdu_block *out)
|
||||
{
|
||||
if (in->K_max_prime != out->K_max_prime)
|
||||
|
|
@ -773,11 +743,14 @@ static void copy_block(kdu_block *in, kdu_block *out)
|
|||
out->set_max_bytes(num_bytes,false);
|
||||
memcpy(out->byte_buffer,in->byte_buffer,(size_t) num_bytes);
|
||||
}
|
||||
|*==========================================================================*/
|
||||
|
||||
/*****************************************************************************/
|
||||
/* STATIC copy_tile */
|
||||
/*****************************************************************************/
|
||||
|
||||
/*==========================================================================*|
|
||||
// Only called by findDiscardLevelsBoundaries(), which is itself commented out
|
||||
static void
|
||||
copy_tile(kdu_tile tile_in, kdu_tile tile_out, int tnum_in, int tnum_out,
|
||||
kdu_params *siz_in, kdu_params *siz_out, int skip_components,
|
||||
|
|
@ -834,10 +807,13 @@ copy_tile(kdu_tile tile_in, kdu_tile tile_out, int tnum_in, int tnum_out,
|
|||
}
|
||||
}
|
||||
}
|
||||
|*==========================================================================*/
|
||||
|
||||
// Find the block boundary for each discard level in the input image.
|
||||
// We parse the input blocks and copy them in a temporary output stream.
|
||||
// For the moment, we do nothing more that parsing the raw list of blocks and outputing result.
|
||||
/*==========================================================================*|
|
||||
// See comments in header file for why this is commented out.
|
||||
void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
|
||||
{
|
||||
// We need the number of levels in that image before starting.
|
||||
|
|
@ -847,7 +823,7 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
|
|||
{
|
||||
//std::cout << "Parsing discard level = " << discard_level << std::endl;
|
||||
// Create the input codestream object.
|
||||
setupCodeStream(base, TRUE, MODE_FAST);
|
||||
setupCodeStream(base, true, MODE_FAST);
|
||||
mCodeStreamp->apply_input_restrictions(0, 4, discard_level, 0, NULL);
|
||||
mCodeStreamp->set_max_bytes(KDU_LONG_MAX,true);
|
||||
siz_params *siz_in = mCodeStreamp->access_siz();
|
||||
|
|
@ -941,6 +917,7 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
|
|||
}
|
||||
return;
|
||||
}
|
||||
|*==========================================================================*/
|
||||
|
||||
void set_default_colour_weights(kdu_params *siz)
|
||||
{
|
||||
|
|
@ -1206,7 +1183,7 @@ LLKDUDecodeState::~LLKDUDecodeState()
|
|||
mTile.close();
|
||||
}
|
||||
|
||||
BOOL LLKDUDecodeState::processTileDecode(F32 decode_time, BOOL limit_time)
|
||||
bool LLKDUDecodeState::processTileDecode(F32 decode_time, bool limit_time)
|
||||
/* Decompresses a tile, writing the data into the supplied byte buffer.
|
||||
The buffer contains interleaved image components, if there are any.
|
||||
Although you may think of the buffer as belonging entirely to this tile,
|
||||
|
|
@ -1238,11 +1215,11 @@ separation between consecutive rows in the real buffer. */
|
|||
{
|
||||
if (limit_time && decode_timer.getElapsedTimeF32() > decode_time)
|
||||
{
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
// kdc_flow_control
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@
|
|||
#endif
|
||||
|
||||
#include "kdu_sample_processing.h"
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
||||
class LLKDUDecodeState;
|
||||
class LLKDUMemSource;
|
||||
|
|
@ -65,43 +67,70 @@ public:
|
|||
virtual ~LLImageJ2CKDU();
|
||||
|
||||
protected:
|
||||
/*virtual*/ BOOL getMetadata(LLImageJ2C &base);
|
||||
/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
BOOL reversible=FALSE);
|
||||
/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
|
||||
/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
|
||||
void findDiscardLevelsBoundaries(LLImageJ2C &base);
|
||||
virtual bool getMetadata(LLImageJ2C &base);
|
||||
virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
|
||||
virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
|
||||
bool reversible=false);
|
||||
virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
|
||||
virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
|
||||
virtual std::string getEngineInfo() const;
|
||||
|
||||
private:
|
||||
BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
|
||||
void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode);
|
||||
bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
|
||||
void setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode);
|
||||
void cleanupCodeStream();
|
||||
|
||||
// This method was public, but the only call to it is commented out in our
|
||||
// own initDecode() method. I (nat 2016-08-04) don't know what it does or
|
||||
// why. Even if it should be uncommented, it should probably still be
|
||||
// private.
|
||||
// void findDiscardLevelsBoundaries(LLImageJ2C &base);
|
||||
|
||||
// Helper class to hold a kdu_codestream, which is a handle to the
|
||||
// underlying implementation object. When CodeStreamHolder is reset() or
|
||||
// destroyed, it calls kdu_codestream::destroy() -- which kdu_codestream
|
||||
// itself does not.
|
||||
//
|
||||
// Call through it like a smart pointer using operator->().
|
||||
//
|
||||
// Every RAII class must be noncopyable. For this we don't need move
|
||||
// support.
|
||||
class CodeStreamHolder: public boost::noncopyable
|
||||
{
|
||||
public:
|
||||
~CodeStreamHolder()
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
void reset()
|
||||
{
|
||||
if (mCodeStream.exists())
|
||||
{
|
||||
mCodeStream.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
kdu_codestream* operator->() { return &mCodeStream; }
|
||||
|
||||
private:
|
||||
kdu_codestream mCodeStream;
|
||||
};
|
||||
|
||||
// Encode variable
|
||||
LLKDUMemSource *mInputp;
|
||||
kdu_codestream *mCodeStreamp;
|
||||
kdu_coords *mTPosp; // tile position
|
||||
kdu_dims *mTileIndicesp;
|
||||
boost::scoped_ptr<LLKDUMemSource> mInputp;
|
||||
CodeStreamHolder mCodeStreamp;
|
||||
boost::scoped_ptr<kdu_coords> mTPosp; // tile position
|
||||
boost::scoped_ptr<kdu_dims> mTileIndicesp;
|
||||
int mBlocksSize;
|
||||
int mPrecinctsSize;
|
||||
int mLevels;
|
||||
|
||||
// Temporary variables for in-progress decodes...
|
||||
// We don't own this LLImageRaw. We're simply pointing to an instance
|
||||
// passed into initDecode().
|
||||
LLImageRaw *mRawImagep;
|
||||
LLKDUDecodeState *mDecodeState;
|
||||
boost::scoped_ptr<LLKDUDecodeState> mDecodeState;
|
||||
};
|
||||
|
||||
#if LL_WINDOWS
|
||||
# define LLSYMEXPORT __declspec(dllexport)
|
||||
#elif LL_LINUX
|
||||
# define LLSYMEXPORT __attribute__ ((visibility("default")))
|
||||
#else
|
||||
# define LLSYMEXPORT
|
||||
#endif
|
||||
|
||||
extern "C" LLSYMEXPORT const char* engineInfoLLImageJ2CKDU();
|
||||
extern "C" LLSYMEXPORT LLImageJ2CKDU* createLLImageJ2CKDU();
|
||||
extern "C" LLSYMEXPORT void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ LLImageRaw::~LLImageRaw() { }
|
|||
U8* LLImageRaw::allocateData(S32 ) { return NULL; }
|
||||
void LLImageRaw::deleteData() { }
|
||||
U8* LLImageRaw::reallocateData(S32 ) { return NULL; }
|
||||
BOOL LLImageRaw::resize(U16, U16, S8) { return TRUE; } // this method always returns TRUE...
|
||||
bool LLImageRaw::resize(U16, U16, S8) { return true; } // this method always returns true...
|
||||
|
||||
LLImageBase::LLImageBase()
|
||||
: LLTrace::MemTrackable<LLImageBase>("LLImageBase"),
|
||||
|
|
@ -89,8 +89,8 @@ LLImageFormatted::~LLImageFormatted() { }
|
|||
U8* LLImageFormatted::allocateData(S32 ) { return NULL; }
|
||||
S32 LLImageFormatted::calcDataSize(S32 ) { return 0; }
|
||||
S32 LLImageFormatted::calcDiscardLevelBytes(S32 ) { return 0; }
|
||||
BOOL LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return FALSE; }
|
||||
BOOL LLImageFormatted::copyData(U8 *, S32) { return TRUE; } // this method always returns TRUE...
|
||||
bool LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return false; }
|
||||
bool LLImageFormatted::copyData(U8 *, S32) { return true; } // this method always returns true...
|
||||
void LLImageFormatted::deleteData() { }
|
||||
void LLImageFormatted::dump() { }
|
||||
U8* LLImageFormatted::reallocateData(S32 ) { return NULL; }
|
||||
|
|
@ -103,14 +103,14 @@ LLImageJ2C::~LLImageJ2C() { }
|
|||
S32 LLImageJ2C::calcDataSize(S32 ) { return 0; }
|
||||
S32 LLImageJ2C::calcDiscardLevelBytes(S32 ) { return 0; }
|
||||
S32 LLImageJ2C::calcHeaderSize() { return 0; }
|
||||
BOOL LLImageJ2C::decode(LLImageRaw*, F32) { return FALSE; }
|
||||
BOOL LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return FALSE; }
|
||||
bool LLImageJ2C::decode(LLImageRaw*, F32) { return false; }
|
||||
bool LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return false; }
|
||||
void LLImageJ2C::decodeFailed() { }
|
||||
BOOL LLImageJ2C::encode(const LLImageRaw*, F32) { return FALSE; }
|
||||
bool LLImageJ2C::encode(const LLImageRaw*, F32) { return false; }
|
||||
S8 LLImageJ2C::getRawDiscardLevel() { return 0; }
|
||||
void LLImageJ2C::resetLastError() { }
|
||||
void LLImageJ2C::setLastError(const std::string&, const std::string&) { }
|
||||
BOOL LLImageJ2C::updateData() { return FALSE; }
|
||||
bool LLImageJ2C::updateData() { return false; }
|
||||
void LLImageJ2C::updateRawDiscardLevel() { }
|
||||
|
||||
LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { }
|
||||
|
|
@ -212,12 +212,12 @@ namespace tut
|
|||
{
|
||||
public:
|
||||
// Provides public access to some protected methods for testing
|
||||
BOOL callGetMetadata(LLImageJ2C &base) { return getMetadata(base); }
|
||||
BOOL callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
bool callGetMetadata(LLImageJ2C &base) { return getMetadata(base); }
|
||||
bool callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
{
|
||||
return decodeImpl(base, raw_image, decode_time, first_channel, max_channel_count);
|
||||
}
|
||||
BOOL callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text)
|
||||
bool callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text)
|
||||
{
|
||||
return encodeImpl(base, raw_image, comment_text);
|
||||
}
|
||||
|
|
@ -254,10 +254,10 @@ namespace tut
|
|||
void llimagej2ckdu_object_t::test<1>()
|
||||
{
|
||||
LLImageJ2C* image = new LLImageJ2C();
|
||||
BOOL res = mImage->callGetMetadata(*image);
|
||||
// Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return TRUE
|
||||
// Note that is linking with KDU, that call will throw an exception and fail, returning FALSE
|
||||
ensure("getMetadata() test failed", res == TRUE);
|
||||
bool res = mImage->callGetMetadata(*image);
|
||||
// Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return true
|
||||
// Note that is linking with KDU, that call will throw an exception and fail, returning false
|
||||
ensure("getMetadata() test failed", res);
|
||||
}
|
||||
|
||||
// Test 2 : test decodeImpl()
|
||||
|
|
@ -266,9 +266,9 @@ namespace tut
|
|||
{
|
||||
LLImageJ2C* image = new LLImageJ2C();
|
||||
LLImageRaw* raw = new LLImageRaw();
|
||||
BOOL res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0);
|
||||
// Decoding returns TRUE whenever there's nothing else to do, including if decoding failed, so we'll get TRUE here
|
||||
ensure("decodeImpl() test failed", res == TRUE);
|
||||
bool res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0);
|
||||
// Decoding returns true whenever there's nothing else to do, including if decoding failed, so we'll get true here
|
||||
ensure("decodeImpl() test failed", res);
|
||||
}
|
||||
|
||||
// Test 3 : test encodeImpl()
|
||||
|
|
@ -277,8 +277,8 @@ namespace tut
|
|||
{
|
||||
LLImageJ2C* image = new LLImageJ2C();
|
||||
LLImageRaw* raw = new LLImageRaw();
|
||||
BOOL res = mImage->callEncodeImpl(*image, *raw, NULL);
|
||||
// Encoding returns TRUE unless an exception was raised, so we'll get TRUE here though nothing really was done
|
||||
ensure("encodeImpl() test failed", res == TRUE);
|
||||
bool res = mImage->callEncodeImpl(*image, *raw, NULL);
|
||||
// Encoding returns true unless an exception was raised, so we'll get true here though nothing really was done
|
||||
ensure("encodeImpl() test failed", res);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -181,6 +181,10 @@ protected:
|
|||
// Map of known bad assets
|
||||
typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t;
|
||||
|
||||
// *TODO: these typedefs are passed into the VFS via a legacy C function pointer
|
||||
// future project would be to convert these to C++ callables (std::function<>) so that
|
||||
// we can use bind and remove the userData parameter.
|
||||
//
|
||||
typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id,
|
||||
LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status);
|
||||
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ void LLAvatarName::setExpires(F64 expires)
|
|||
mExpires = LLFrameTimer::getTotalSeconds() + expires;
|
||||
}
|
||||
|
||||
std::string LLAvatarName::getCompleteName() const
|
||||
std::string LLAvatarName::getCompleteName(bool use_parentheses) const
|
||||
{
|
||||
std::string name;
|
||||
if (sUseDisplayNames)
|
||||
|
|
@ -182,7 +182,14 @@ std::string LLAvatarName::getCompleteName() const
|
|||
name = mDisplayName;
|
||||
if(sUseUsernames)
|
||||
{
|
||||
name += " (" + mUsername + ")";
|
||||
if(use_parentheses)
|
||||
{
|
||||
name += " (" + mUsername + ")";
|
||||
}
|
||||
else
|
||||
{
|
||||
name += " [ " + mUsername + " ]";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -220,7 +227,7 @@ std::string LLAvatarName::getDisplayName() const
|
|||
}
|
||||
}
|
||||
|
||||
std::string LLAvatarName::getUserName() const
|
||||
std::string LLAvatarName::getUserName(bool lowercase) const
|
||||
{
|
||||
std::string name;
|
||||
if (mLegacyLastName.empty() || (mLegacyLastName == "Resident"))
|
||||
|
|
@ -238,7 +245,15 @@ std::string LLAvatarName::getUserName() const
|
|||
}
|
||||
else
|
||||
{
|
||||
name = mLegacyFirstName + " " + mLegacyLastName;
|
||||
if(lowercase)
|
||||
{
|
||||
name = mLegacyFirstName + "." + mLegacyLastName;
|
||||
LLStringUtil::toLower(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
name = mLegacyFirstName + " " + mLegacyLastName;
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ public:
|
|||
|
||||
// For normal names, returns "James Linden (james.linden)"
|
||||
// When display names are disabled returns just "James Linden"
|
||||
std::string getCompleteName() const;
|
||||
std::string getCompleteName(bool use_parentheses = true) const;
|
||||
|
||||
// Returns "James Linden" or "bobsmith123 Resident" for backwards
|
||||
// compatibility with systems like voice and muting
|
||||
|
|
@ -80,7 +80,7 @@ public:
|
|||
// Returns "James Linden" or "bobsmith123 Resident"
|
||||
// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name
|
||||
// Also used for backwards compatibility with systems like voice and muting
|
||||
std::string getUserName() const;
|
||||
std::string getUserName(bool lowercase = false) const;
|
||||
|
||||
// Returns "james.linden" or the legacy name for very old names
|
||||
std::string getAccountName() const { return mUsername; }
|
||||
|
|
|
|||
|
|
@ -2249,7 +2249,11 @@ std::string LLDAELoader::getElementLabel(daeElement *element)
|
|||
// retrieve index to distinguish items inside same parent
|
||||
size_t ind = 0;
|
||||
parent->getChildren().find(element, ind);
|
||||
index_string = "_" + boost::lexical_cast<std::string>(ind);
|
||||
|
||||
if (ind > 0)
|
||||
{
|
||||
index_string = "_" + boost::lexical_cast<std::string>(ind);
|
||||
}
|
||||
|
||||
// if parent has a name or ID, use it
|
||||
std::string name = parent->getAttribute("name");
|
||||
|
|
|
|||
|
|
@ -1326,7 +1326,7 @@ void LLFloater::setMinimized(BOOL minimize)
|
|||
}
|
||||
|
||||
mMinimized = FALSE;
|
||||
|
||||
setFrontmost();
|
||||
// Reshape *after* setting mMinimized
|
||||
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
|
||||
}
|
||||
|
|
@ -1575,6 +1575,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
|
||||
if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
|
||||
|
||||
setFrontmost(TRUE, FALSE);
|
||||
// Otherwise pass to drag handle for movement
|
||||
return mDragHandle->handleMouseDown(x, y, mask);
|
||||
}
|
||||
|
|
@ -1649,7 +1650,7 @@ void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloater::setFrontmost(BOOL take_focus)
|
||||
void LLFloater::setFrontmost(BOOL take_focus, BOOL restore)
|
||||
{
|
||||
LLMultiFloater* hostp = getHost();
|
||||
if (hostp)
|
||||
|
|
@ -1665,7 +1666,7 @@ void LLFloater::setFrontmost(BOOL take_focus)
|
|||
LLFloaterView * parent = dynamic_cast<LLFloaterView*>( getParent() );
|
||||
if (parent)
|
||||
{
|
||||
parent->bringToFront(this, take_focus);
|
||||
parent->bringToFront(this, take_focus, restore);
|
||||
}
|
||||
|
||||
// Make sure to set the appropriate transparency type (STORM-732).
|
||||
|
|
@ -2262,7 +2263,7 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
|
|||
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
|
||||
{
|
||||
LLView* viewp = *child_it;
|
||||
LLFloater* floaterp = (LLFloater*)viewp;
|
||||
LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
|
||||
if (floaterp->isDependent())
|
||||
{
|
||||
// dependents are moved with their "dependee"
|
||||
|
|
@ -2319,8 +2320,11 @@ void LLFloaterView::restoreAll()
|
|||
// make sure all subwindows aren't minimized
|
||||
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
|
||||
{
|
||||
LLFloater* floaterp = (LLFloater*)*child_it;
|
||||
floaterp->setMinimized(FALSE);
|
||||
LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
|
||||
if (floaterp)
|
||||
{
|
||||
floaterp->setMinimized(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
// *FIX: make sure dependents are restored
|
||||
|
|
@ -2394,7 +2398,7 @@ LLRect LLFloaterView::findNeighboringPosition( LLFloater* reference_floater, LLF
|
|||
}
|
||||
|
||||
|
||||
void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
|
||||
void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore)
|
||||
{
|
||||
if (!child)
|
||||
return;
|
||||
|
|
@ -2478,7 +2482,12 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
|
|||
{
|
||||
sendChildToFront(child);
|
||||
}
|
||||
child->setMinimized(FALSE);
|
||||
|
||||
if(restore)
|
||||
{
|
||||
child->setMinimized(FALSE);
|
||||
}
|
||||
|
||||
if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))
|
||||
{
|
||||
child->setFocus(TRUE);
|
||||
|
|
@ -2591,7 +2600,7 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
|
|||
++child_it) //loop floaters
|
||||
{
|
||||
// Examine minimized children.
|
||||
LLFloater* floater = (LLFloater*)((LLView*)*child_it);
|
||||
LLFloater* floater = dynamic_cast<LLFloater*>(*child_it);
|
||||
if(floater->isMinimized())
|
||||
{
|
||||
LLRect r = floater->getRect();
|
||||
|
|
@ -2644,7 +2653,7 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
|
|||
continue;
|
||||
}
|
||||
|
||||
LLFloater* floaterp = (LLFloater*)viewp;
|
||||
LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
|
||||
|
||||
// Attempt to close floater. This will cause the "do you want to save"
|
||||
// dialogs to appear.
|
||||
|
|
@ -2710,8 +2719,7 @@ BOOL LLFloaterView::allChildrenClosed()
|
|||
// by setting themselves invisible)
|
||||
for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it)
|
||||
{
|
||||
LLView* viewp = *it;
|
||||
LLFloater* floaterp = (LLFloater*)viewp;
|
||||
LLFloater* floaterp = dynamic_cast<LLFloater*>(*it);
|
||||
|
||||
if (floaterp->getVisible() && !floaterp->isDead() && floaterp->isCloseable())
|
||||
{
|
||||
|
|
@ -2947,7 +2955,7 @@ void LLFloaterView::syncFloaterTabOrder()
|
|||
// otherwise, make sure the focused floater is in the front of the child list
|
||||
for ( child_list_const_reverse_iter_t child_it = getChildList()->rbegin(); child_it != getChildList()->rend(); ++child_it)
|
||||
{
|
||||
LLFloater* floaterp = (LLFloater*)*child_it;
|
||||
LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
|
||||
if (gFocusMgr.childHasKeyboardFocus(floaterp))
|
||||
{
|
||||
bringToFront(floaterp, FALSE);
|
||||
|
|
@ -2969,7 +2977,7 @@ LLFloater* LLFloaterView::getParentFloater(LLView* viewp) const
|
|||
|
||||
if (parentp == this)
|
||||
{
|
||||
return (LLFloater*)viewp;
|
||||
return dynamic_cast<LLFloater*>(viewp);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ public:
|
|||
/*virtual*/ void setVisible(BOOL visible); // do not override
|
||||
/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override
|
||||
|
||||
void setFrontmost(BOOL take_focus = TRUE);
|
||||
void setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);
|
||||
virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
|
||||
|
||||
// Defaults to false.
|
||||
|
|
@ -547,7 +547,7 @@ public:
|
|||
|
||||
void setCycleMode(BOOL mode) { mFocusCycleMode = mode; }
|
||||
BOOL getCycleMode() const { return mFocusCycleMode; }
|
||||
void bringToFront( LLFloater* child, BOOL give_focus = TRUE );
|
||||
void bringToFront( LLFloater* child, BOOL give_focus = TRUE, BOOL restore = TRUE );
|
||||
void highlightFocusedFloater();
|
||||
void unhighlightFocusedFloater();
|
||||
void focusFrontFloater();
|
||||
|
|
|
|||
|
|
@ -1629,9 +1629,9 @@ void LLFolderView::update()
|
|||
if (mNeedsAutoSelect)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_AUTO_SELECT);
|
||||
// select new item only if a filtered item not currently selected
|
||||
// select new item only if a filtered item not currently selected and there was a selection
|
||||
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
|
||||
if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getViewModelItem()->potentiallyVisible()))
|
||||
if (!mAutoSelectOverride && selected_itemp && !selected_itemp->getViewModelItem()->potentiallyVisible())
|
||||
{
|
||||
// these are named variables to get around gcc not binding non-const references to rvalues
|
||||
// and functor application is inherently non-const to allow for stateful functors
|
||||
|
|
|
|||
|
|
@ -242,6 +242,8 @@ public:
|
|||
bool useLabelSuffix() { return mUseLabelSuffix; }
|
||||
virtual void updateMenu();
|
||||
|
||||
void finishRenamingItem( void );
|
||||
|
||||
// Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.
|
||||
LLHandle<LLFolderView> getHandle() const { return getDerivedHandle<LLFolderView>(); }
|
||||
|
||||
|
|
@ -255,7 +257,6 @@ protected:
|
|||
void commitRename( const LLSD& data );
|
||||
void onRenamerLost();
|
||||
|
||||
void finishRenamingItem( void );
|
||||
void closeRenamer( void );
|
||||
|
||||
bool selectFirstItem();
|
||||
|
|
|
|||
|
|
@ -972,6 +972,11 @@ void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)
|
|||
mIndentation = (getParentFolder())
|
||||
? getParentFolder()->getIndentation() + mLocalIndentation
|
||||
: 0;
|
||||
|
||||
if(isOpen() && folder->isOpen())
|
||||
{
|
||||
requestArrange();
|
||||
}
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_ARRANGE("Arrange");
|
||||
|
|
|
|||
|
|
@ -400,12 +400,7 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
|
|||
|
||||
if (mMaxLengthChars)
|
||||
{
|
||||
LLWString truncated_wstring = utf8str_to_wstring(truncated_utf8);
|
||||
if (truncated_wstring.size() > (U32)mMaxLengthChars)
|
||||
{
|
||||
truncated_wstring = truncated_wstring.substr(0, mMaxLengthChars);
|
||||
}
|
||||
mText.assign(wstring_to_utf8str(truncated_wstring));
|
||||
mText.assign(utf8str_symbol_truncate(truncated_utf8, mMaxLengthChars));
|
||||
}
|
||||
|
||||
if (all_selected)
|
||||
|
|
|
|||
|
|
@ -177,6 +177,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
|
|||
: LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)),
|
||||
mURLClickSignal(NULL),
|
||||
mIsFriendSignal(NULL),
|
||||
mIsObjectBlockedSignal(NULL),
|
||||
mMaxTextByteLength( p.max_text_length ),
|
||||
mFont(p.font),
|
||||
mFontShadow(p.font_shadow),
|
||||
|
|
@ -268,6 +269,8 @@ LLTextBase::~LLTextBase()
|
|||
{
|
||||
mSegments.clear();
|
||||
delete mURLClickSignal;
|
||||
delete mIsFriendSignal;
|
||||
delete mIsObjectBlockedSignal;
|
||||
}
|
||||
|
||||
void LLTextBase::initFromParams(const LLTextBase::Params& p)
|
||||
|
|
@ -1942,6 +1945,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
|
|||
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
|
||||
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));
|
||||
registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
|
||||
registrar.add("Url.Unblock", boost::bind(&LLUrlAction::unblockObject, url));
|
||||
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
|
||||
registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
|
||||
registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
|
||||
|
|
@ -1968,6 +1972,19 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
|
|||
removeFriendButton->setEnabled(isFriend);
|
||||
}
|
||||
}
|
||||
|
||||
if (mIsObjectBlockedSignal)
|
||||
{
|
||||
bool is_blocked = *(*mIsObjectBlockedSignal)(LLUUID(LLUrlAction::getObjectId(url)), LLUrlAction::getObjectName(url));
|
||||
LLView* blockButton = mPopupMenu->getChild<LLView>("block_object");
|
||||
LLView* unblockButton = mPopupMenu->getChild<LLView>("unblock_object");
|
||||
|
||||
if (blockButton && unblockButton)
|
||||
{
|
||||
blockButton->setVisible(!is_blocked);
|
||||
unblockButton->setVisible(is_blocked);
|
||||
}
|
||||
}
|
||||
|
||||
if (mPopupMenu)
|
||||
{
|
||||
|
|
@ -3022,6 +3039,15 @@ boost::signals2::connection LLTextBase::setIsFriendCallback(const is_friend_sign
|
|||
return mIsFriendSignal->connect(cb);
|
||||
}
|
||||
|
||||
boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb)
|
||||
{
|
||||
if (!mIsObjectBlockedSignal)
|
||||
{
|
||||
mIsObjectBlockedSignal = new is_blocked_signal_t();
|
||||
}
|
||||
return mIsObjectBlockedSignal->connect(cb);
|
||||
}
|
||||
|
||||
//
|
||||
// LLTextSegment
|
||||
//
|
||||
|
|
|
|||
|
|
@ -270,6 +270,7 @@ public:
|
|||
friend class LLUICtrlFactory;
|
||||
|
||||
typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t;
|
||||
typedef boost::signals2::signal<bool (const LLUUID& blocked_id, const std::string from)> is_blocked_signal_t;
|
||||
|
||||
struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
|
||||
{
|
||||
|
|
@ -456,6 +457,7 @@ public:
|
|||
virtual void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
|
||||
boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
|
||||
boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);
|
||||
boost::signals2::connection setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb);
|
||||
|
||||
void setWordWrap(bool wrap);
|
||||
LLScrollContainer* getScrollContainer() const { return mScroller; }
|
||||
|
|
@ -685,6 +687,7 @@ protected:
|
|||
|
||||
// Used to check if user with given ID is avatar's friend
|
||||
is_friend_signal_t* mIsFriendSignal;
|
||||
is_blocked_signal_t* mIsObjectBlockedSignal;
|
||||
|
||||
LLUIString mLabel; // text label that is visible when no user text provided
|
||||
};
|
||||
|
|
|
|||
|
|
@ -56,6 +56,26 @@ void LLTextUtil::textboxSetHighlightedVal(LLTextBox *txtbox, const LLStyle::Para
|
|||
txtbox->appendText(text.substr(hl_begin + hl_len), false, normal_style);
|
||||
}
|
||||
|
||||
void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& normal_style, const std::string& text, const std::string& greyed)
|
||||
{
|
||||
static LLUIColor sGreyedTextColor = LLUIColorTable::instance().getColor("Gray", LLColor4::grey);
|
||||
|
||||
size_t greyed_begin = 0, greyed_len = greyed.size();
|
||||
|
||||
if (greyed_len == 0 || (greyed_begin = text.find(greyed)) == std::string::npos)
|
||||
{
|
||||
txtbox->setText(text, normal_style);
|
||||
return;
|
||||
}
|
||||
|
||||
LLStyle::Params greyed_style = normal_style;
|
||||
greyed_style.color = sGreyedTextColor;
|
||||
txtbox->setText(LLStringUtil::null); // clear text
|
||||
txtbox->appendText(text.substr(0, greyed_begin), false, normal_style);
|
||||
txtbox->appendText(text.substr(greyed_begin, greyed_len), false, greyed_style);
|
||||
txtbox->appendText(text.substr(greyed_begin + greyed_len), false, normal_style);
|
||||
}
|
||||
|
||||
const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
|
||||
{
|
||||
static const std::string PHONE_SEPARATOR = LLUI::sSettingGroups["config"]->getString("AvalinePhoneSeparator");
|
||||
|
|
|
|||
|
|
@ -52,6 +52,12 @@ namespace LLTextUtil
|
|||
const std::string& text,
|
||||
const std::string& hl);
|
||||
|
||||
void textboxSetGreyedVal(
|
||||
LLTextBox *txtbox,
|
||||
const LLStyle::Params& normal_style,
|
||||
const std::string& text,
|
||||
const std::string& greyed);
|
||||
|
||||
/**
|
||||
* Formats passed phone number to be more human readable.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -231,3 +231,13 @@ void LLUrlAction::blockObject(std::string url)
|
|||
executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));
|
||||
}
|
||||
}
|
||||
|
||||
void LLUrlAction::unblockObject(std::string url)
|
||||
{
|
||||
std::string object_id = getObjectId(url);
|
||||
std::string object_name = getObjectName(url);
|
||||
if (LLUUID::validate(object_id))
|
||||
{
|
||||
executeSLURL("secondlife:///app/agent/" + object_id + "/unblock/" + object_name);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ public:
|
|||
static void addFriend(std::string url);
|
||||
static void removeFriend(std::string url);
|
||||
static void blockObject(std::string url);
|
||||
static void unblockObject(std::string url);
|
||||
|
||||
/// specify the callbacks to enable this class's functionality
|
||||
typedef boost::function<void (const std::string&)> url_callback_t;
|
||||
|
|
|
|||
|
|
@ -588,6 +588,11 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
|
|||
BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus();
|
||||
BOOST_FOREACH(LLView* viewp, mChildList)
|
||||
{
|
||||
if (!viewp)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// only views that are themselves visible will have their overall visibility affected by their ancestors
|
||||
old_visibility=viewp->getVisible();
|
||||
|
||||
|
|
|
|||
|
|
@ -1317,13 +1317,10 @@ set(viewer_HEADER_FILES
|
|||
|
||||
source_group("CMake Rules" FILES ViewerInstall.cmake)
|
||||
|
||||
#summary.json creation moved to viewer_manifest.py MAINT-6413
|
||||
# the viewer_version.txt file created here is for passing to viewer_manifest and autobuild
|
||||
# the summary.json file is created for the benefit of the TeamCity builds, where
|
||||
# it is used to provide descriptive information to the build results page
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
|
||||
"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/summary.json"
|
||||
"{\"Type\":\"viewer\",\"Version\":\"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\"}\n")
|
||||
|
||||
set_source_files_properties(
|
||||
llversioninfo.cpp tests/llversioninfo_test.cpp
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
tooltip_ref="Command_Build_Tooltip"
|
||||
execute_function="Build.Toggle"
|
||||
execute_parameters="build"
|
||||
is_enabled_function="Build.Enabled"
|
||||
is_enabled_function="Build.EnabledOrActive"
|
||||
is_enabled_parameters="build"
|
||||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="build"
|
||||
|
|
|
|||
|
|
@ -3723,6 +3723,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>QueueInventoryFetchTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Max time llcompilequeue will wait for inventory fetch to complete (in seconds)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>300.0</real>
|
||||
</map>
|
||||
<key>FindLandArea</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -11087,6 +11098,28 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FriendsListHideUsernames</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show both Display name and Username in Friend list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>NearbyListHideUsernames</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show both Display name and Username in Nearby list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>NearbyListShowMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ RenderAvatarCloth 1 1
|
|||
RenderAvatarLODFactor 1 1.0
|
||||
RenderAvatarPhysicsLODFactor 1 1.0
|
||||
RenderAvatarMaxNonImpostors 1 16
|
||||
RenderAvatarMaxComplexity 1 80000
|
||||
RenderAvatarMaxComplexity 1 350000
|
||||
RenderAvatarVP 1 1
|
||||
RenderAutoMuteSurfaceAreaLimit 1 1000.0
|
||||
RenderCubeMap 1 1
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ RenderAvatarCloth 1 1
|
|||
RenderAvatarLODFactor 1 1.0
|
||||
RenderAvatarPhysicsLODFactor 1 1.0
|
||||
RenderAvatarMaxNonImpostors 1 16
|
||||
RenderAvatarMaxComplexity 1 80000
|
||||
RenderAvatarMaxComplexity 1 350000
|
||||
RenderAvatarVP 1 1
|
||||
RenderAutoMuteSurfaceAreaLimit 1 1000.0
|
||||
RenderCubeMap 1 1
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ RenderAvatarCloth 1 1
|
|||
RenderAvatarLODFactor 1 1.0
|
||||
RenderAvatarPhysicsLODFactor 1 1.0
|
||||
RenderAvatarMaxNonImpostors 1 16
|
||||
RenderAvatarMaxComplexity 1 80000
|
||||
RenderAvatarMaxComplexity 1 350000
|
||||
RenderAvatarVP 1 1
|
||||
RenderAutoMuteSurfaceAreaLimit 1 1000.0
|
||||
RenderCubeMap 1 1
|
||||
|
|
|
|||
|
|
@ -648,6 +648,7 @@ Function un.ProgramFiles
|
|||
%%DELETE_FILES%%
|
||||
|
||||
# Optional/obsolete files. Delete won't fail if they don't exist.
|
||||
Delete "$INSTDIR\autorun.bat"
|
||||
Delete "$INSTDIR\dronesettings.ini"
|
||||
Delete "$INSTDIR\message_template.msg"
|
||||
Delete "$INSTDIR\newview.pdb"
|
||||
|
|
@ -679,6 +680,16 @@ FOLDERFOUND:
|
|||
|
||||
NOFOLDER:
|
||||
|
||||
MessageBox MB_YESNO $(DeleteRegistryKeysMB) IDYES DeleteKeys IDNO NoDelete
|
||||
|
||||
DeleteKeys:
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\x-grid-location-info"
|
||||
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\secondlife"
|
||||
DeleteRegKey HKEY_CLASSES_ROOT "x-grid-location-info"
|
||||
DeleteRegKey HKEY_CLASSES_ROOT "secondlife"
|
||||
|
||||
NoDelete:
|
||||
|
||||
FunctionEnd
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -838,11 +838,11 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories)
|
|||
|
||||
void AISUpdate::doUpdate()
|
||||
{
|
||||
// Do version/descendent accounting.
|
||||
// Do version/descendant accounting.
|
||||
for (std::map<LLUUID,S32>::const_iterator catit = mCatDescendentDeltas.begin();
|
||||
catit != mCatDescendentDeltas.end(); ++catit)
|
||||
{
|
||||
LL_DEBUGS("Inventory") << "descendent accounting for " << catit->first << LL_ENDL;
|
||||
LL_DEBUGS("Inventory") << "descendant accounting for " << catit->first << LL_ENDL;
|
||||
|
||||
const LLUUID cat_id(catit->first);
|
||||
// Don't account for update if we just created this category.
|
||||
|
|
@ -859,13 +859,13 @@ void AISUpdate::doUpdate()
|
|||
continue;
|
||||
}
|
||||
|
||||
// If we have a known descendent count, set that now.
|
||||
// If we have a known descendant count, set that now.
|
||||
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
|
||||
if (cat)
|
||||
{
|
||||
S32 descendent_delta = catit->second;
|
||||
S32 old_count = cat->getDescendentCount();
|
||||
LL_DEBUGS("Inventory") << "Updating descendent count for "
|
||||
LL_DEBUGS("Inventory") << "Updating descendant count for "
|
||||
<< cat->getName() << " " << cat_id
|
||||
<< " with delta " << descendent_delta << " from "
|
||||
<< old_count << " to " << (old_count+descendent_delta) << LL_ENDL;
|
||||
|
|
@ -896,7 +896,7 @@ void AISUpdate::doUpdate()
|
|||
LLUUID category_id(update_it->first);
|
||||
LLPointer<LLViewerInventoryCategory> new_category = update_it->second;
|
||||
// Since this is a copy of the category *before* the accounting update, above,
|
||||
// we need to transfer back the updated version/descendent count.
|
||||
// we need to transfer back the updated version/descendant count.
|
||||
LLViewerInventoryCategory* curr_cat = gInventory.getCategory(new_category->getUUID());
|
||||
if (!curr_cat)
|
||||
{
|
||||
|
|
@ -961,7 +961,16 @@ void AISUpdate::doUpdate()
|
|||
{
|
||||
LL_WARNS() << "Possible version mismatch for category " << cat->getName()
|
||||
<< ", viewer version " << cat->getVersion()
|
||||
<< " server version " << version << LL_ENDL;
|
||||
<< " 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
|
||||
// sync with the inventory system. Under normal circumstances
|
||||
// inventory COF is maintained on the viewer through calls to
|
||||
// LLInventoryModel::accountForUpdate when a changing operation
|
||||
// is performed. This occasionally gets out of sync however.
|
||||
cat->setVersion(version);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@
|
|||
#include "llcoros.h"
|
||||
#include "lleventcoro.h"
|
||||
|
||||
#include "llavatarpropertiesprocessor.h"
|
||||
|
||||
#if LL_MSVC
|
||||
// disable boost::lexical_cast warning
|
||||
#pragma warning (disable:4702)
|
||||
|
|
@ -3359,15 +3361,9 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
|
|||
{
|
||||
if (!mOutstandingAppearanceBakeRequest)
|
||||
{
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
mRerequestAppearanceBake = false;
|
||||
LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
|
||||
LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
|
||||
#else
|
||||
LLCoros::instance().launch("serverAppearanceUpdateCoro",
|
||||
boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
|
||||
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3375,17 +3371,8 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
|
||||
#else
|
||||
void LLAppearanceMgr::serverAppearanceUpdateCoro()
|
||||
#endif
|
||||
{
|
||||
#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
|
||||
new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
|
||||
#endif
|
||||
|
||||
mRerequestAppearanceBake = false;
|
||||
if (!gAgent.getRegion())
|
||||
{
|
||||
|
|
@ -3493,10 +3480,15 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro()
|
|||
// on multiple machines.
|
||||
if (result.has("expected"))
|
||||
{
|
||||
|
||||
S32 expectedCofVersion = result["expected"].asInteger();
|
||||
LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
|
||||
|
||||
// Force an update texture request for ourself. The message will return
|
||||
// through the UDP and be handled in LLVOAvatar::processAvatarAppearance
|
||||
// this should ensure that we receive a new canonical COF from the sim
|
||||
// host. Hopefully it will return before the timeout.
|
||||
LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(gAgent.getID());
|
||||
|
||||
bRetry = true;
|
||||
// Wait for a 1/2 second before trying again. Just to keep from asking too quickly.
|
||||
if (++retryCount > BAKE_RETRY_MAX_COUNT)
|
||||
|
|
|
|||
|
|
@ -228,11 +228,7 @@ public:
|
|||
|
||||
|
||||
private:
|
||||
#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
|
||||
void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
|
||||
#else
|
||||
void serverAppearanceUpdateCoro();
|
||||
#endif
|
||||
|
||||
static void debugAppearanceUpdateCOF(const LLSD& content);
|
||||
|
||||
|
|
|
|||
|
|
@ -3442,6 +3442,12 @@ std::string LLAppViewer::getViewerInfoString() const
|
|||
{
|
||||
support << '\n' << LLTrans::getString("AboutTraffic", args);
|
||||
}
|
||||
|
||||
// SLT timestamp
|
||||
LLSD substitution;
|
||||
substitution["datetime"] = (S32)time(NULL);//(S32)time_corrected();
|
||||
support << "\n" << LLTrans::getString("AboutTime", substitution);
|
||||
|
||||
return support.str();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -475,6 +475,57 @@ void LLAvatarActions::kick(const LLUUID& id)
|
|||
LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::freezeAvatar(const LLUUID& id)
|
||||
{
|
||||
std::string fullname;
|
||||
gCacheName->getFullName(id, fullname);
|
||||
LLSD payload;
|
||||
payload["avatar_id"] = id;
|
||||
|
||||
if (!fullname.empty())
|
||||
{
|
||||
LLSD args;
|
||||
args["AVATAR_NAME"] = fullname;
|
||||
LLNotificationsUtil::add("FreezeAvatarFullname", args, payload, handleFreezeAvatar);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationsUtil::add("FreezeAvatar", LLSD(), payload, handleFreezeAvatar);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::ejectAvatar(const LLUUID& id, bool ban_enabled)
|
||||
{
|
||||
std::string fullname;
|
||||
gCacheName->getFullName(id, fullname);
|
||||
LLSD payload;
|
||||
payload["avatar_id"] = id;
|
||||
payload["ban_enabled"] = ban_enabled;
|
||||
LLSD args;
|
||||
if (!fullname.empty())
|
||||
{
|
||||
args["AVATAR_NAME"] = fullname;
|
||||
}
|
||||
|
||||
if (ban_enabled)
|
||||
{
|
||||
LLNotificationsUtil::add("EjectAvatarFullname", args, payload, handleEjectAvatar);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!fullname.empty())
|
||||
{
|
||||
LLNotificationsUtil::add("EjectAvatarFullnameNoBan", args, payload, handleEjectAvatar);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationsUtil::add("EjectAvatarNoBan", LLSD(), payload, handleEjectAvatar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::freeze(const LLUUID& id)
|
||||
{
|
||||
|
|
@ -482,7 +533,6 @@ void LLAvatarActions::freeze(const LLUUID& id)
|
|||
payload["avatar_id"] = id;
|
||||
LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::unfreeze(const LLUUID& id)
|
||||
{
|
||||
|
|
@ -1133,10 +1183,77 @@ bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
|
|||
}
|
||||
return false;
|
||||
}
|
||||
bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
|
||||
|
||||
bool LLAvatarActions::handleFreezeAvatar(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotification::getSelectedOption(notification, response);
|
||||
|
||||
if (0 == option || 1 == option)
|
||||
{
|
||||
U32 flags = 0x0;
|
||||
if (1 == option)
|
||||
{
|
||||
// unfreeze
|
||||
flags |= 0x1;
|
||||
}
|
||||
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
msg->newMessage("FreezeUser");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgent.getID());
|
||||
msg->addUUID("SessionID", gAgent.getSessionID());
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("TargetID", avatar_id );
|
||||
msg->addU32("Flags", flags );
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLAvatarActions::handleEjectAvatar(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (2 == option)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
|
||||
bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean();
|
||||
|
||||
if (0 == option)
|
||||
{
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
U32 flags = 0x0;
|
||||
msg->newMessage("EjectUser");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgent.getID() );
|
||||
msg->addUUID("SessionID", gAgent.getSessionID() );
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("TargetID", avatar_id );
|
||||
msg->addU32("Flags", flags );
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
else if (ban_enabled)
|
||||
{
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
U32 flags = 0x1;
|
||||
msg->newMessage("EjectUser");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgent.getID() );
|
||||
msg->addUUID("SessionID", gAgent.getSessionID() );
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("TargetID", avatar_id );
|
||||
msg->addU32("Flags", flags );
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotification::getSelectedOption(notification, response);
|
||||
if (option == 0)
|
||||
{
|
||||
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
|
||||
|
|
@ -1153,6 +1270,7 @@ bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& respons
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotification::getSelectedOption(notification, response);
|
||||
|
|
|
|||
|
|
@ -173,6 +173,9 @@ public:
|
|||
*/
|
||||
static void inviteToGroup(const LLUUID& id);
|
||||
|
||||
static void freezeAvatar(const LLUUID& id);
|
||||
|
||||
static void ejectAvatar(const LLUUID& id, bool ban_enabled = false);
|
||||
/**
|
||||
* Kick avatar off grid
|
||||
*/
|
||||
|
|
@ -242,6 +245,8 @@ private:
|
|||
static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
|
||||
static bool handleRemove(const LLSD& notification, const LLSD& response);
|
||||
static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
|
||||
static bool handleFreezeAvatar(const LLSD& notification, const LLSD& response);
|
||||
static bool handleEjectAvatar(const LLSD& notification, const LLSD& response);
|
||||
static bool handleKick(const LLSD& notification, const LLSD& response);
|
||||
static bool handleFreeze(const LLSD& notification, const LLSD& response);
|
||||
static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ LLAvatarList::LLAvatarList(const Params& p)
|
|||
, mShowProfileBtn(p.show_profile_btn)
|
||||
, mShowSpeakingIndicator(p.show_speaking_indicator)
|
||||
, mShowPermissions(p.show_permissions_granted)
|
||||
, mShowCompleteName(false)
|
||||
{
|
||||
setCommitOnSelectionChange(true);
|
||||
|
||||
|
|
@ -174,6 +175,11 @@ void LLAvatarList::setShowIcons(std::string param_name)
|
|||
mShowIcons = gSavedSettings.getBOOL(mIconParamName);
|
||||
}
|
||||
|
||||
std::string LLAvatarList::getAvatarName(LLAvatarName av_name)
|
||||
{
|
||||
return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAvatarList::draw()
|
||||
{
|
||||
|
|
@ -279,7 +285,7 @@ void LLAvatarList::refresh()
|
|||
LLAvatarName av_name;
|
||||
have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
|
||||
|
||||
if (!have_filter || findInsensitive(av_name.getDisplayName(), mNameFilter))
|
||||
if (!have_filter || findInsensitive(getAvatarName(av_name), mNameFilter))
|
||||
{
|
||||
if (nadded >= ADD_LIMIT)
|
||||
{
|
||||
|
|
@ -297,7 +303,7 @@ void LLAvatarList::refresh()
|
|||
}
|
||||
else
|
||||
{
|
||||
std::string display_name = av_name.getDisplayName();
|
||||
std::string display_name = getAvatarName(av_name);
|
||||
addNewItem(buddy_id,
|
||||
display_name.empty() ? waiting_str : display_name,
|
||||
LLAvatarTracker::instance().isBuddyOnline(buddy_id));
|
||||
|
|
@ -327,7 +333,7 @@ void LLAvatarList::refresh()
|
|||
const LLUUID& buddy_id = it->asUUID();
|
||||
LLAvatarName av_name;
|
||||
have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
|
||||
if (!findInsensitive(av_name.getDisplayName(), mNameFilter))
|
||||
if (!findInsensitive(getAvatarName(av_name), mNameFilter))
|
||||
{
|
||||
removeItemByUUID(buddy_id);
|
||||
modified = true;
|
||||
|
|
@ -381,6 +387,7 @@ void LLAvatarList::updateAvatarNames()
|
|||
for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)
|
||||
{
|
||||
LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
|
||||
item->setShowCompleteName(mShowCompleteName);
|
||||
item->updateAvatarName();
|
||||
}
|
||||
mNeedUpdateNames = false;
|
||||
|
|
@ -400,7 +407,7 @@ bool LLAvatarList::filterHasMatches()
|
|||
// If name has not been loaded yet we consider it as a match.
|
||||
// When the name will be loaded the filter will be applied again(in refresh()).
|
||||
|
||||
if (have_name && !findInsensitive(av_name.getDisplayName(), mNameFilter))
|
||||
if (have_name && !findInsensitive(getAvatarName(av_name), mNameFilter))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
@ -434,6 +441,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info)
|
|||
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
|
||||
{
|
||||
LLAvatarListItem* item = new LLAvatarListItem();
|
||||
item->setShowCompleteName(mShowCompleteName);
|
||||
// This sets the name as a side effect
|
||||
item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);
|
||||
item->setOnline(mIgnoreOnlineStatus ? true : is_online);
|
||||
|
|
@ -445,6 +453,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
|
|||
item->showSpeakingIndicator(mShowSpeakingIndicator);
|
||||
item->setShowPermissions(mShowPermissions);
|
||||
|
||||
|
||||
item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4));
|
||||
|
||||
addItem(item, id, pos);
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ public:
|
|||
void setShowIcons(std::string param_name);
|
||||
bool getIconsVisible() const { return mShowIcons; }
|
||||
const std::string getIconParamName() const{return mIconParamName;}
|
||||
std::string getAvatarName(LLAvatarName av_name);
|
||||
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
|
||||
/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
|
||||
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
|
||||
|
|
@ -100,6 +101,8 @@ public:
|
|||
void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
|
||||
void handleDisplayNamesOptionChanged();
|
||||
|
||||
void setShowCompleteName(bool show) { mShowCompleteName = show;};
|
||||
|
||||
protected:
|
||||
void refresh();
|
||||
|
||||
|
|
@ -126,6 +129,7 @@ private:
|
|||
bool mShowProfileBtn;
|
||||
bool mShowSpeakingIndicator;
|
||||
bool mShowPermissions;
|
||||
bool mShowCompleteName;
|
||||
|
||||
LLTimer* mLITUpdateTimer; // last interaction time update timer
|
||||
std::string mIconParamName;
|
||||
|
|
|
|||
|
|
@ -77,8 +77,10 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
|
|||
mShowInfoBtn(true),
|
||||
mShowProfileBtn(true),
|
||||
mShowPermissions(false),
|
||||
mShowCompleteName(false),
|
||||
mHovered(false),
|
||||
mAvatarNameCacheConnection()
|
||||
mAvatarNameCacheConnection(),
|
||||
mGreyOutUsername("")
|
||||
{
|
||||
if (not_from_ui_factory)
|
||||
{
|
||||
|
|
@ -399,14 +401,28 @@ void LLAvatarListItem::updateAvatarName()
|
|||
|
||||
void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight)
|
||||
{
|
||||
LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight);
|
||||
if(mShowCompleteName && highlight.empty())
|
||||
{
|
||||
LLTextUtil::textboxSetGreyedVal(mAvatarName, mAvatarNameStyle, name, mGreyOutUsername);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
|
||||
{
|
||||
mAvatarNameCacheConnection.disconnect();
|
||||
|
||||
setAvatarName(av_name.getDisplayName());
|
||||
mGreyOutUsername = "";
|
||||
std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
|
||||
if(av_name.getCompleteName() != av_name.getUserName())
|
||||
{
|
||||
mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]";
|
||||
LLStringUtil::toLower(mGreyOutUsername);
|
||||
}
|
||||
setAvatarName(name_string);
|
||||
setAvatarToolTip(av_name.getUserName());
|
||||
|
||||
//requesting the list to resort
|
||||
|
|
|
|||
|
|
@ -106,6 +106,7 @@ public:
|
|||
void setShowPermissions(bool show) { mShowPermissions = show; };
|
||||
void showLastInteractionTime(bool show);
|
||||
void setAvatarIconVisible(bool visible);
|
||||
void setShowCompleteName(bool show) { mShowCompleteName = show;};
|
||||
|
||||
const LLUUID& getAvatarId() const;
|
||||
std::string getAvatarName() const;
|
||||
|
|
@ -218,6 +219,9 @@ private:
|
|||
/// true when the mouse pointer is hovering over this item
|
||||
bool mHovered;
|
||||
|
||||
bool mShowCompleteName;
|
||||
std::string mGreyOutUsername;
|
||||
|
||||
void fetchAvatarName();
|
||||
boost::signals2::connection mAvatarNameCacheConnection;
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ mLatestAgentComplexity(0),
|
|||
mLatestOverLimitPct(0.0f),
|
||||
mShowOverLimitAgents(false),
|
||||
mNotifyOutfitLoading(false),
|
||||
mLastCofVersion(-1),
|
||||
mLastCofVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),
|
||||
mLastOutfitRezStatus(-1),
|
||||
mLastSkeletonSerialNum(-1)
|
||||
{
|
||||
|
|
@ -207,8 +207,8 @@ void LLAvatarRenderNotifier::updateNotificationState()
|
|||
mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
|
||||
}
|
||||
else if (mLastCofVersion >= 0
|
||||
&& (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion
|
||||
|| mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
|
||||
&& (mLastCofVersion != LLAppearanceMgr::instance().getCOFVersion()
|
||||
|| mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
|
||||
{
|
||||
// version mismatch in comparison to previous outfit - outfit changed
|
||||
mNotifyOutfitLoading = true;
|
||||
|
|
|
|||
|
|
@ -156,6 +156,10 @@ public:
|
|||
LLFloaterSidePanelContainer::showPanel("people", "panel_people",
|
||||
LLSD().with("people_panel_tab_name", "blocked_panel").with("blocked_to_select", getAvatarId()));
|
||||
}
|
||||
else if (level == "unblock")
|
||||
{
|
||||
LLMuteList::getInstance()->remove(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
|
||||
}
|
||||
else if (level == "map")
|
||||
{
|
||||
std::string url = "secondlife://" + mObjectData["slurl"].asString();
|
||||
|
|
@ -169,6 +173,20 @@ public:
|
|||
|
||||
}
|
||||
|
||||
bool onObjectIconContextMenuItemVisible(const LLSD& userdata)
|
||||
{
|
||||
std::string level = userdata.asString();
|
||||
if (level == "is_blocked")
|
||||
{
|
||||
return LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
|
||||
}
|
||||
else if (level == "not_blocked")
|
||||
{
|
||||
return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
|
||||
{
|
||||
std::string level = userdata.asString();
|
||||
|
|
@ -275,6 +293,7 @@ public:
|
|||
registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
|
||||
registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
|
||||
registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
mPopupMenuHandleAvatar = menu->getHandle();
|
||||
|
|
@ -719,6 +738,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
|
|||
editor_params.trusted_content = false;
|
||||
mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
|
||||
mEditor->setIsFriendCallback(LLAvatarActions::isFriend);
|
||||
mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0));
|
||||
|
||||
}
|
||||
|
||||
LLSD LLChatHistory::getValue() const
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -37,6 +37,8 @@
|
|||
|
||||
#include "llviewerinventory.h"
|
||||
|
||||
#include "llevents.h"
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// Class LLFloaterScriptQueue
|
||||
//
|
||||
|
|
@ -48,7 +50,7 @@
|
|||
// scripts manipulated.
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
class LLFloaterScriptQueue : public LLFloater, public LLVOInventoryListener
|
||||
class LLFloaterScriptQueue : public LLFloater/*, public LLVOInventoryListener*/
|
||||
{
|
||||
public:
|
||||
LLFloaterScriptQueue(const LLSD& key);
|
||||
|
|
@ -59,34 +61,23 @@ public:
|
|||
void setMono(bool mono) { mMono = mono; }
|
||||
|
||||
// addObject() accepts an object id.
|
||||
void addObject(const LLUUID& id);
|
||||
void addObject(const LLUUID& id, std::string name);
|
||||
|
||||
// start() returns TRUE if the queue has started, otherwise FALSE.
|
||||
BOOL start();
|
||||
|
||||
protected:
|
||||
// This is the callback method for the viewer object currently
|
||||
// being worked on.
|
||||
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
|
||||
LLInventoryObject::object_list_t* inv,
|
||||
S32 serial_num,
|
||||
void* queue);
|
||||
|
||||
// This is called by inventoryChanged
|
||||
virtual void handleInventory(LLViewerObject* viewer_obj,
|
||||
LLInventoryObject::object_list_t* inv) = 0;
|
||||
void addProcessingMessage(const std::string &message, const LLSD &args);
|
||||
void addStringMessage(const std::string &message);
|
||||
|
||||
std::string getStartString() const { return mStartString; }
|
||||
|
||||
protected:
|
||||
static void onCloseBtn(void* user_data);
|
||||
|
||||
// returns true if this is done
|
||||
BOOL isDone() const;
|
||||
|
||||
virtual BOOL startQueue();
|
||||
|
||||
// go to the next object. If no objects left, it falls out
|
||||
// silently and waits to be killed by the deleteIfDone() callback.
|
||||
BOOL nextObject();
|
||||
BOOL popNext();
|
||||
virtual bool startQueue() = 0;
|
||||
|
||||
void setStartString(const std::string& s) { mStartString = s; }
|
||||
|
||||
|
|
@ -96,12 +87,23 @@ protected:
|
|||
LLButton* mCloseBtn;
|
||||
|
||||
// Object Queue
|
||||
std::vector<LLUUID> mObjectIDs;
|
||||
struct ObjectData
|
||||
{
|
||||
LLUUID mObjectId;
|
||||
std::string mObjectName;
|
||||
};
|
||||
typedef std::vector<ObjectData> object_data_list_t;
|
||||
|
||||
object_data_list_t mObjectList;
|
||||
LLUUID mCurrentObjectID;
|
||||
bool mDone;
|
||||
|
||||
std::string mStartString;
|
||||
bool mMono;
|
||||
|
||||
typedef boost::function<bool(const LLPointer<LLViewerObject> &, LLInventoryObject*, LLEventPump &)> fnQueueAction_t;
|
||||
static void objectScriptProcessingQueueCoro(std::string action, LLHandle<LLFloaterScriptQueue> hfloater, object_data_list_t objectList, fnQueueAction_t func);
|
||||
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -122,8 +124,6 @@ class LLFloaterCompileQueue : public LLFloaterScriptQueue
|
|||
{
|
||||
friend class LLFloaterReg;
|
||||
public:
|
||||
// remove any object in mScriptScripts with the matching uuid.
|
||||
void removeItemByItemID(const LLUUID& item_id);
|
||||
|
||||
void experienceIdsReceived( const LLSD& content );
|
||||
BOOL hasExperience(const LLUUID& id)const;
|
||||
|
|
@ -132,27 +132,17 @@ protected:
|
|||
LLFloaterCompileQueue(const LLSD& key);
|
||||
virtual ~LLFloaterCompileQueue();
|
||||
|
||||
// This is called by inventoryChanged
|
||||
virtual void handleInventory(LLViewerObject* viewer_obj,
|
||||
LLInventoryObject::object_list_t* inv);
|
||||
virtual bool startQueue();
|
||||
|
||||
static void requestAsset(struct LLScriptQueueData* datap, const LLSD& experience);
|
||||
static bool processScript(LLHandle<LLFloaterCompileQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
|
||||
|
||||
|
||||
static void finishLSLUpload(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response, std::string scriptName, LLUUID queueId);
|
||||
|
||||
// This is the callback for when each script arrives
|
||||
static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
|
||||
LLAssetType::EType type,
|
||||
void* user_data, S32 status, LLExtStat ext_status);
|
||||
|
||||
virtual BOOL startQueue();
|
||||
protected:
|
||||
LLViewerInventoryItem::item_array_t mCurrentScripts;
|
||||
//bool checkAssetId(const LLUUID &assetId);
|
||||
static void handleHTTPResponse(std::string pumpName, const LLSD &expresult);
|
||||
static void handleScriptRetrieval(LLVFS *vfs, const LLUUID& assetId, LLAssetType::EType type, void* userData, S32 status, LLExtStat extStatus);
|
||||
|
||||
private:
|
||||
static void processExperienceIdResults(LLSD result, LLUUID parent);
|
||||
|
||||
//uuid_list_t mAssetIds; // list of asset IDs processed.
|
||||
uuid_list_t mExperienceIds;
|
||||
};
|
||||
|
||||
|
|
@ -169,9 +159,9 @@ protected:
|
|||
LLFloaterResetQueue(const LLSD& key);
|
||||
virtual ~LLFloaterResetQueue();
|
||||
|
||||
// This is called by inventoryChanged
|
||||
virtual void handleInventory(LLViewerObject* viewer_obj,
|
||||
LLInventoryObject::object_list_t* inv);
|
||||
static bool resetObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
|
||||
|
||||
virtual bool startQueue();
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -186,10 +176,10 @@ class LLFloaterRunQueue : public LLFloaterScriptQueue
|
|||
protected:
|
||||
LLFloaterRunQueue(const LLSD& key);
|
||||
virtual ~LLFloaterRunQueue();
|
||||
|
||||
// This is called by inventoryChanged
|
||||
virtual void handleInventory(LLViewerObject* viewer_obj,
|
||||
LLInventoryObject::object_list_t* inv);
|
||||
|
||||
static bool runObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
|
||||
|
||||
virtual bool startQueue();
|
||||
};
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -205,9 +195,9 @@ protected:
|
|||
LLFloaterNotRunQueue(const LLSD& key);
|
||||
virtual ~LLFloaterNotRunQueue();
|
||||
|
||||
// This is called by inventoryChanged
|
||||
virtual void handleInventory(LLViewerObject* viewer_obj,
|
||||
LLInventoryObject::object_list_t* inv);
|
||||
static bool stopObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
|
||||
|
||||
virtual bool startQueue();
|
||||
};
|
||||
|
||||
#endif // LL_LLCOMPILEQUEUE_H
|
||||
|
|
|
|||
|
|
@ -62,28 +62,15 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
|
|||
LLFacePool(POOL_TERRAIN),
|
||||
mTexturep(texturep)
|
||||
{
|
||||
U32 format = GL_ALPHA8;
|
||||
U32 int_format = GL_ALPHA;
|
||||
|
||||
// Hack!
|
||||
sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
|
||||
sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
|
||||
mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga",
|
||||
FTT_LOCAL_FILE,
|
||||
TRUE, LLGLTexture::BOOST_UI,
|
||||
LLViewerTexture::FETCHED_TEXTURE,
|
||||
format, int_format,
|
||||
LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
|
||||
mAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD);
|
||||
|
||||
//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
|
||||
mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
||||
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c",
|
||||
FTT_LOCAL_FILE,
|
||||
TRUE, LLGLTexture::BOOST_UI,
|
||||
LLViewerTexture::FETCHED_TEXTURE,
|
||||
format, int_format,
|
||||
LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
|
||||
m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD_2D);
|
||||
|
||||
//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
|
||||
m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
|
|
|||
|
|
@ -40,12 +40,14 @@
|
|||
#include "llcorehttputil.h"
|
||||
#include "lleventfilter.h"
|
||||
|
||||
#include "boost/make_shared.hpp"
|
||||
|
||||
namespace LLEventPolling
|
||||
{
|
||||
namespace Details
|
||||
{
|
||||
|
||||
class LLEventPollImpl
|
||||
class LLEventPollImpl: public boost::enable_shared_from_this<LLEventPollImpl>
|
||||
{
|
||||
public:
|
||||
LLEventPollImpl(const LLHost &sender);
|
||||
|
|
@ -113,7 +115,7 @@ namespace Details
|
|||
{
|
||||
std::string coroname =
|
||||
LLCoros::instance().launch("LLEventPollImpl::eventPollCoro",
|
||||
boost::bind(&LLEventPollImpl::eventPollCoro, this, url));
|
||||
boost::bind(&LLEventPollImpl::eventPollCoro, this->shared_from_this(), url));
|
||||
LL_INFOS("LLEventPollImpl") << coroname << " with url '" << url << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
|
@ -273,8 +275,7 @@ namespace Details
|
|||
LLEventPoll::LLEventPoll(const std::string& poll_url, const LLHost& sender):
|
||||
mImpl()
|
||||
{
|
||||
mImpl = boost::unique_ptr<LLEventPolling::Details::LLEventPollImpl>
|
||||
(new LLEventPolling::Details::LLEventPollImpl(sender));
|
||||
mImpl = boost::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
|
||||
mImpl->start(poll_url);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,12 +27,6 @@
|
|||
#ifndef LL_LLEVENTPOLL_H
|
||||
#define LL_LLEVENTPOLL_H
|
||||
|
||||
#include "boost/move/unique_ptr.hpp"
|
||||
|
||||
namespace boost
|
||||
{
|
||||
using ::boost::movelib::unique_ptr; // move unique_ptr into the boost namespace.
|
||||
}
|
||||
|
||||
class LLHost;
|
||||
|
||||
|
|
@ -57,7 +51,7 @@ public:
|
|||
|
||||
|
||||
private:
|
||||
boost::unique_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
boost::shared_ptr<LLEventPolling::Details::LLEventPollImpl> mImpl;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -809,3 +809,62 @@ void LLFeatureManager::applyBaseMasks()
|
|||
maskFeatures("safe");
|
||||
}
|
||||
}
|
||||
|
||||
LLSD LLFeatureManager::getRecommendedSettingsMap()
|
||||
{
|
||||
// Create the map and fill it with the hardware recommended settings.
|
||||
// It's needed to create an initial Default graphics preset (MAINT-6435).
|
||||
// The process is similar to the one LLFeatureManager::applyRecommendedSettings() does.
|
||||
|
||||
LLSD map(LLSD::emptyMap());
|
||||
|
||||
loadGPUClass();
|
||||
U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
|
||||
LL_INFOS("RenderInit") << "Getting the map of recommended settings for level " << level << LL_ENDL;
|
||||
|
||||
applyBaseMasks();
|
||||
std::string features(isValidGraphicsLevel(level) ? getNameForGraphicsLevel(level) : "Low");
|
||||
|
||||
maskFeatures(features);
|
||||
|
||||
LLControlVariable* ctrl = gSavedSettings.getControl("RenderQualityPerformance"); // include the quality value for correct preset loading
|
||||
map["RenderQualityPerformance"]["Value"] = (LLSD::Integer)level;
|
||||
map["RenderQualityPerformance"]["Comment"] = ctrl->getComment();;
|
||||
map["RenderQualityPerformance"]["Persist"] = 1;
|
||||
map["RenderQualityPerformance"]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
|
||||
|
||||
|
||||
|
||||
for (feature_map_t::iterator mIt = mFeatures.begin(); mIt != mFeatures.end(); ++mIt)
|
||||
{
|
||||
LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
|
||||
if (ctrl == NULL)
|
||||
{
|
||||
LL_WARNS() << "AHHH! Control setting " << mIt->first << " does not exist!" << LL_ENDL;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ctrl->isType(TYPE_BOOLEAN))
|
||||
{
|
||||
map[mIt->first]["Value"] = (LLSD::Boolean)getRecommendedValue(mIt->first);
|
||||
}
|
||||
else if (ctrl->isType(TYPE_S32) || ctrl->isType(TYPE_U32))
|
||||
{
|
||||
map[mIt->first]["Value"] = (LLSD::Integer)getRecommendedValue(mIt->first);
|
||||
}
|
||||
else if (ctrl->isType(TYPE_F32))
|
||||
{
|
||||
map[mIt->first]["Value"] = (LLSD::Real)getRecommendedValue(mIt->first);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "AHHH! Control variable is not a numeric type!" << LL_ENDL;
|
||||
continue;
|
||||
}
|
||||
map[mIt->first]["Comment"] = ctrl->getComment();;
|
||||
map[mIt->first]["Persist"] = 1;
|
||||
map[mIt->first]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,7 +157,9 @@ public:
|
|||
|
||||
// load the dynamic GPU/feature table from a website
|
||||
void fetchHTTPTables();
|
||||
|
||||
|
||||
LLSD getRecommendedSettingsMap();
|
||||
|
||||
protected:
|
||||
bool loadGPUClass();
|
||||
|
||||
|
|
|
|||
|
|
@ -528,7 +528,8 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
|
|||
LLInventoryItem* item = gInventory.getItem(*it);
|
||||
if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
|
||||
{
|
||||
LLClipboard::instance().addToClipboard(item->getUUID(),LLAssetType::AT_GESTURE);
|
||||
LLWString item_name = utf8str_to_wstring(item->getName());
|
||||
LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -601,12 +601,31 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
|
|||
toast_msg = chat_msg.mText;
|
||||
}
|
||||
|
||||
bool chat_overlaps = false;
|
||||
if(nearby_chat->getChatHistory())
|
||||
{
|
||||
LLRect chat_rect = nearby_chat->getChatHistory()->calcScreenRect();
|
||||
for (std::list<LLView*>::const_iterator child_iter = gFloaterView->getChildList()->begin();
|
||||
child_iter != gFloaterView->getChildList()->end(); ++child_iter)
|
||||
{
|
||||
LLView *view = *child_iter;
|
||||
const LLRect& rect = view->getRect();
|
||||
if(view->isInVisibleChain() && (rect.overlaps(chat_rect)))
|
||||
{
|
||||
if(!nearby_chat->getChatHistory()->hasAncestor(view))
|
||||
{
|
||||
chat_overlaps = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Don't show nearby toast, if conversation is visible and selected
|
||||
if ((nearby_chat->hasFocus()) ||
|
||||
(LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized()) ||
|
||||
((im_box->getSelectedSession().isNull() &&
|
||||
((LLFloater::isVisible(im_box) && !im_box->isMinimized() && im_box->isFrontmost())
|
||||
|| (LLFloater::isVisible(nearby_chat) && !nearby_chat->isMinimized() && nearby_chat->isFrontmost())))))
|
||||
((im_box->getSelectedSession().isNull() && !chat_overlaps &&
|
||||
((LLFloater::isVisible(im_box) && !nearby_chat->isTornOff() && !im_box->isMinimized())
|
||||
|| (LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized())))))
|
||||
{
|
||||
if(nearby_chat->isMessagePaneExpanded())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1094,6 +1094,12 @@ void LLFloaterIMSessionTab::saveCollapsedState()
|
|||
gSavedPerAccountSettings.setBOOL("NearbyChatIsNotCollapsed", isMessagePaneExpanded());
|
||||
}
|
||||
}
|
||||
|
||||
LLView* LLFloaterIMSessionTab::getChatHistory()
|
||||
{
|
||||
return mChatHistory;
|
||||
}
|
||||
|
||||
BOOL LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask )
|
||||
{
|
||||
BOOL handled = FALSE;
|
||||
|
|
|
|||
|
|
@ -103,6 +103,8 @@ public:
|
|||
void restoreFloater();
|
||||
void saveCollapsedState();
|
||||
|
||||
LLView* getChatHistory();
|
||||
|
||||
protected:
|
||||
|
||||
// callback for click on any items of the visual states menu
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@
|
|||
#include "llfloaterperms.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewermenufile.h" // upload_new_resource()
|
||||
#include "llstatusbar.h" // can_afford_transaction()
|
||||
#include "llnotificationsutil.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llstring.h"
|
||||
#include "lleconomy.h"
|
||||
|
|
@ -161,12 +163,15 @@ void LLFloaterNameDesc::onBtnOK( )
|
|||
|
||||
LLAssetStorage::LLStoreAssetCallback callback = NULL;
|
||||
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
|
||||
void *nruserdata = NULL;
|
||||
std::string display_name = LLStringUtil::null;
|
||||
|
||||
LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
|
||||
if (can_afford_transaction(expected_upload_cost))
|
||||
{
|
||||
void *nruserdata = NULL;
|
||||
std::string display_name = LLStringUtil::null;
|
||||
|
||||
LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
|
||||
mFilenameAndPath,
|
||||
getChild<LLUICtrl>("name_form")->getValue().asString(),
|
||||
getChild<LLUICtrl>("name_form")->getValue().asString(),
|
||||
getChild<LLUICtrl>("description_form")->getValue().asString(), 0,
|
||||
LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
|
||||
LLFloaterPerms::getNextOwnerPerms("Uploads"),
|
||||
|
|
@ -174,7 +179,14 @@ void LLFloaterNameDesc::onBtnOK( )
|
|||
LLFloaterPerms::getEveryonePerms("Uploads"),
|
||||
expected_upload_cost));
|
||||
|
||||
upload_new_resource(uploadInfo, callback, nruserdata);
|
||||
upload_new_resource(uploadInfo, callback, nruserdata);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD args;
|
||||
args["COST"] = llformat("%d", expected_upload_cost);
|
||||
LLNotificationsUtil::add("ErrorTextureCannotAfford", args);
|
||||
}
|
||||
|
||||
closeFloater(false);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -412,6 +412,11 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
|
|||
panel->getChild<LLUICtrl>("object_bonus_spin")->setValue(LLSD(object_bonus_factor) );
|
||||
panel->getChild<LLUICtrl>("access_combo")->setValue(LLSD(sim_access) );
|
||||
|
||||
LLPanelRegionGeneralInfo* panel_general = LLFloaterRegionInfo::getPanelGeneral();
|
||||
if (panel)
|
||||
{
|
||||
panel_general->setObjBonusFactor(object_bonus_factor);
|
||||
}
|
||||
|
||||
// detect teen grid for maturity
|
||||
|
||||
|
|
@ -464,6 +469,16 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
|
|||
return panel;
|
||||
}
|
||||
|
||||
// static
|
||||
LLPanelRegionGeneralInfo* LLFloaterRegionInfo::getPanelGeneral()
|
||||
{
|
||||
LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
|
||||
if (!floater) return NULL;
|
||||
LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
|
||||
LLPanelRegionGeneralInfo* panel = (LLPanelRegionGeneralInfo*)tab->getChild<LLPanel>("General");
|
||||
return panel;
|
||||
}
|
||||
|
||||
// static
|
||||
LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
|
||||
{
|
||||
|
|
@ -717,7 +732,42 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
|
|||
childSetAction("im_btn", onClickMessage, this);
|
||||
// childSetAction("manage_telehub_btn", onClickManageTelehub, this);
|
||||
|
||||
return LLPanelRegionInfo::postBuild();
|
||||
LLUICtrl* apply_btn = findChild<LLUICtrl>("apply_btn");
|
||||
if (apply_btn)
|
||||
{
|
||||
apply_btn->setCommitCallback(boost::bind(&LLPanelRegionGeneralInfo::onBtnSet, this));
|
||||
}
|
||||
|
||||
refresh();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void LLPanelRegionGeneralInfo::onBtnSet()
|
||||
{
|
||||
if(mObjBonusFactor == getChild<LLUICtrl>("object_bonus_spin")->getValue().asReal())
|
||||
{
|
||||
if (sendUpdate())
|
||||
{
|
||||
disableButton("apply_btn");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationsUtil::add("ChangeObjectBonusFactor", LLSD(), LLSD(), boost::bind(&LLPanelRegionGeneralInfo::onChangeObjectBonus, this, _1, _2));
|
||||
}
|
||||
}
|
||||
|
||||
bool LLPanelRegionGeneralInfo::onChangeObjectBonus(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0)
|
||||
{
|
||||
if (sendUpdate())
|
||||
{
|
||||
disableButton("apply_btn");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLPanelRegionGeneralInfo::onClickKick()
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@ public:
|
|||
static LLPanelEstateCovenant* getPanelCovenant();
|
||||
static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
|
||||
static LLPanelRegionExperiences* getPanelExperiences();
|
||||
static LLPanelRegionGeneralInfo* getPanelGeneral();
|
||||
|
||||
// from LLPanel
|
||||
virtual void refresh();
|
||||
|
|
@ -183,6 +184,9 @@ public:
|
|||
// LLPanel
|
||||
virtual BOOL postBuild();
|
||||
|
||||
void onBtnSet();
|
||||
void setObjBonusFactor(F32 object_bonus_factor) {mObjBonusFactor = object_bonus_factor;}
|
||||
|
||||
protected:
|
||||
virtual BOOL sendUpdate();
|
||||
void onClickKick();
|
||||
|
|
@ -191,6 +195,9 @@ protected:
|
|||
bool onKickAllCommit(const LLSD& notification, const LLSD& response);
|
||||
static void onClickMessage(void* userdata);
|
||||
bool onMessageCommit(const LLSD& notification, const LLSD& response);
|
||||
bool onChangeObjectBonus(const LLSD& notification, const LLSD& response);
|
||||
|
||||
F32 mObjBonusFactor;
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1417,6 +1417,20 @@ void LLFloaterSnapshot::postPanelSwitch()
|
|||
instance->impl.setStatus(Impl::STATUS_READY);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterSnapshot::inventorySaveFailed()
|
||||
{
|
||||
LLFloaterSnapshot* instance = findInstance();
|
||||
if (!instance)
|
||||
{
|
||||
llassert(instance != NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
instance->impl.updateControls(instance);
|
||||
instance->impl.setStatus(Impl::STATUS_FINISHED, false, "inventory");
|
||||
}
|
||||
|
||||
// static
|
||||
LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ public:
|
|||
static BOOL saveLocal();
|
||||
static void postSave();
|
||||
static void postPanelSwitch();
|
||||
static void inventorySaveFailed();
|
||||
static LLPointer<LLImageFormatted> getImageData();
|
||||
static const LLVector3d& getPosTakenGlobal();
|
||||
static void setAgentEmail(const std::string& email);
|
||||
|
|
|
|||
|
|
@ -963,10 +963,10 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,
|
|||
}
|
||||
|
||||
|
||||
void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
|
||||
void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui, BOOL dest_reached)
|
||||
{
|
||||
LLCtrlListInterface *list = mListSearchResults;
|
||||
if (list)
|
||||
if (list && (!dest_reached || (list->getItemCount() == 1)))
|
||||
{
|
||||
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ public:
|
|||
// A z_attenuation of 0.0f collapses the distance into the X-Y plane
|
||||
F32 getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const;
|
||||
|
||||
void clearLocationSelection(BOOL clear_ui = FALSE);
|
||||
void clearLocationSelection(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);
|
||||
void clearAvatarSelection(BOOL clear_ui = FALSE);
|
||||
void clearLandmarkSelection(BOOL clear_ui = FALSE);
|
||||
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ void LLInspectRemoteObject::update()
|
|||
getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
|
||||
|
||||
// disable the Block button if we don't have the object ID (will this ever happen?)
|
||||
getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull());
|
||||
getChild<LLUICtrl>("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -287,7 +287,11 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
|
|||
LL_INFOS("SLM") << "Unlist and clear version folder as the version folder is not at the right place anymore!!" << LL_ENDL;
|
||||
LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null,1);
|
||||
}
|
||||
else if (version_folder_uuid.notNull() && LLMarketplaceData::instance().getActivationState(version_folder_uuid) && (count_descendants_items(version_folder_uuid) == 0) && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))
|
||||
else if (version_folder_uuid.notNull()
|
||||
&& gInventory.isCategoryComplete(version_folder_uuid)
|
||||
&& LLMarketplaceData::instance().getActivationState(version_folder_uuid)
|
||||
&& (count_descendants_items(version_folder_uuid) == 0)
|
||||
&& !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))
|
||||
{
|
||||
LL_INFOS("SLM") << "Unlist as the version folder is empty of any item!!" << LL_ENDL;
|
||||
LLNotificationsUtil::add("AlertMerchantVersionFolderEmpty");
|
||||
|
|
|
|||
|
|
@ -64,6 +64,9 @@
|
|||
#include "llurllineeditorctrl.h"
|
||||
#include "llagentui.h"
|
||||
|
||||
#include "llmenuoptionpathfindingrebakenavmesh.h"
|
||||
#include "llpathfindingmanager.h"
|
||||
|
||||
//============================================================================
|
||||
/*
|
||||
* "ADD LANDMARK" BUTTON UPDATING LOGIC
|
||||
|
|
@ -1194,6 +1197,18 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
|
|||
return false;
|
||||
}
|
||||
|
||||
void LLLocationInputCtrl::callbackRebakeRegion(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
if (option == 0) // OK
|
||||
{
|
||||
if (LLPathfindingManager::getInstance() != NULL)
|
||||
{
|
||||
LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
|
||||
{
|
||||
switch (icon)
|
||||
|
|
@ -1211,6 +1226,16 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
|
|||
LLNotificationsUtil::add("NoBuild");
|
||||
break;
|
||||
case PATHFINDING_DIRTY_ICON:
|
||||
if (LLPathfindingManager::getInstance() != NULL)
|
||||
{
|
||||
LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance();
|
||||
if (rebakeInstance && rebakeInstance->canRebakeRegion() && (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available))
|
||||
{
|
||||
LLNotificationsUtil::add("PathfindingDirtyRebake", LLSD(), LLSD(),
|
||||
boost::bind(&LLLocationInputCtrl::callbackRebakeRegion, this, _1, _2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
LLNotificationsUtil::add("PathfindingDirty");
|
||||
break;
|
||||
case PATHFINDING_DISABLED_ICON:
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@ private:
|
|||
// callbacks
|
||||
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
|
||||
void onLocationContextMenuItemClicked(const LLSD& userdata);
|
||||
void callbackRebakeRegion(const LLSD& notification, const LLSD& response);
|
||||
void onParcelIconClick(EParcelIcon icon);
|
||||
|
||||
void createNavMeshStatusListenerForCurrentRegion();
|
||||
|
|
|
|||
|
|
@ -904,7 +904,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
|
|||
std::string stuff = matches[IDX_STUFF];
|
||||
boost::match_results<std::string::const_iterator> name_and_text;
|
||||
if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
|
||||
|
||||
|
||||
bool has_name = name_and_text[IDX_NAME].matched;
|
||||
std::string name = name_and_text[IDX_NAME];
|
||||
|
||||
|
|
@ -956,7 +956,6 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
|
|||
im[LL_IM_FROM] = name;
|
||||
}
|
||||
|
||||
|
||||
im[LL_IM_TEXT] = name_and_text[IDX_TEXT];
|
||||
return true; //parsed name and message text, maybe have a timestamp too
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3935,7 +3935,7 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
|
|||
{
|
||||
LLMutexLock lock(mHeaderMutex);
|
||||
mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
|
||||
if (iter != mMeshHeader.end())
|
||||
if (iter != mMeshHeader.end() && mMeshHeaderSize[mesh_id] > 0)
|
||||
{
|
||||
return iter->second;
|
||||
}
|
||||
|
|
@ -3956,10 +3956,11 @@ void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3
|
|||
|
||||
S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
|
||||
{
|
||||
if (mThread)
|
||||
if (mThread && mesh_id.notNull())
|
||||
{
|
||||
LLMutexLock lock(mThread->mHeaderMutex);
|
||||
LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
|
||||
if (iter != mThread->mMeshHeader.end())
|
||||
if (iter != mThread->mMeshHeader.end() && mThread->mMeshHeaderSize[mesh_id] > 0)
|
||||
{
|
||||
LLSD& header = iter->second;
|
||||
|
||||
|
|
@ -4031,9 +4032,30 @@ void LLMeshRepository::uploadError(LLSD& args)
|
|||
mUploadErrorQ.push(args);
|
||||
}
|
||||
|
||||
F32 LLMeshRepository::getStreamingCost(LLUUID mesh_id, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)
|
||||
{
|
||||
if (mThread && mesh_id.notNull())
|
||||
{
|
||||
LLMutexLock lock(mThread->mHeaderMutex);
|
||||
LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
|
||||
if (iter != mThread->mMeshHeader.end() && mThread->mMeshHeaderSize[mesh_id] > 0)
|
||||
{
|
||||
return getStreamingCost(iter->second, radius, bytes, bytes_visible, lod, unscaled_value);
|
||||
}
|
||||
}
|
||||
return 0.f;
|
||||
}
|
||||
|
||||
//static
|
||||
F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)
|
||||
{
|
||||
if (header.has("404")
|
||||
|| !header.has("lowest_lod")
|
||||
|| (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION))
|
||||
{
|
||||
return 0.f;
|
||||
}
|
||||
|
||||
F32 max_distance = 512.f;
|
||||
|
||||
F32 dlowest = llmin(radius/0.03f, max_distance);
|
||||
|
|
|
|||
|
|
@ -475,6 +475,7 @@ public:
|
|||
|
||||
static LLDeadmanTimer sQuiescentTimer; // Time-to-complete-mesh-downloads after significant events
|
||||
|
||||
F32 getStreamingCost(LLUUID mesh_id, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);
|
||||
static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);
|
||||
|
||||
LLMeshRepository();
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@ BOOL LLPanelMainInventory::postBuild()
|
|||
LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
|
||||
if (recent_items_panel)
|
||||
{
|
||||
// assign default values until we will be sure that we have setting to restore
|
||||
recent_items_panel->setSinceLogoff(TRUE);
|
||||
recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
|
||||
recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
|
||||
|
|
@ -181,6 +182,7 @@ BOOL LLPanelMainInventory::postBuild()
|
|||
LLParamSDParser parser;
|
||||
parser.readSD(recent_items, p);
|
||||
recent_items_panel->getFilter().fromParams(p);
|
||||
recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -372,7 +374,14 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
|
|||
}
|
||||
|
||||
getActivePanel()->setSortOrder(sort_order_mask);
|
||||
gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
|
||||
if ("Recent Items" == getActivePanel()->getName())
|
||||
{
|
||||
gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -1143,6 +1152,15 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
|
|||
}
|
||||
}
|
||||
|
||||
void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility )
|
||||
{
|
||||
if(!new_visibility)
|
||||
{
|
||||
mMenuAdd->setVisible(FALSE);
|
||||
getActivePanel()->getRootFolder()->finishRenamingItem();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
|
||||
{
|
||||
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ public:
|
|||
std::string& tooltip_msg);
|
||||
/*virtual*/ void changed(U32);
|
||||
/*virtual*/ void draw();
|
||||
/*virtual*/ void onVisibilityChange ( BOOL new_visibility );
|
||||
|
||||
LLInventoryPanel* getPanel() { return mActivePanel; }
|
||||
LLInventoryPanel* getActivePanel() { return mActivePanel; }
|
||||
|
|
|
|||
|
|
@ -611,9 +611,11 @@ BOOL LLPanelPeople::postBuild()
|
|||
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
|
||||
mOnlineFriendList->setShowIcons("FriendsListShowIcons");
|
||||
mOnlineFriendList->showPermissions("FriendsListShowPermissions");
|
||||
mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
|
||||
mAllFriendList->setNoItemsCommentText(getString("no_friends"));
|
||||
mAllFriendList->setShowIcons("FriendsListShowIcons");
|
||||
mAllFriendList->showPermissions("FriendsListShowPermissions");
|
||||
mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
|
||||
|
||||
LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
|
||||
nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2));
|
||||
|
|
@ -622,6 +624,7 @@ BOOL LLPanelPeople::postBuild()
|
|||
mNearbyList->setNoItemsMsg(getString("no_one_near"));
|
||||
mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
|
||||
mNearbyList->setShowIcons("NearbyListShowIcons");
|
||||
mNearbyList->setShowCompleteName(!gSavedSettings.getBOOL("NearbyListHideUsernames"));
|
||||
mMiniMap = (LLNetMap*)getChildView("Net Map",true);
|
||||
mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
|
||||
getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
|
||||
|
|
@ -1342,6 +1345,16 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
|
|||
mAllFriendList->showPermissions(show_permissions);
|
||||
mOnlineFriendList->showPermissions(show_permissions);
|
||||
}
|
||||
else if (chosen_item == "view_usernames")
|
||||
{
|
||||
bool hide_usernames = !gSavedSettings.getBOOL("FriendsListHideUsernames");
|
||||
gSavedSettings.setBOOL("FriendsListHideUsernames", hide_usernames);
|
||||
|
||||
mAllFriendList->setShowCompleteName(!hide_usernames);
|
||||
mAllFriendList->handleDisplayNamesOptionChanged();
|
||||
mOnlineFriendList->setShowCompleteName(!hide_usernames);
|
||||
mOnlineFriendList->handleDisplayNamesOptionChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
|
||||
|
|
@ -1374,6 +1387,14 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
|
|||
{
|
||||
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
|
||||
}
|
||||
else if (chosen_item == "view_usernames")
|
||||
{
|
||||
bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames");
|
||||
gSavedSettings.setBOOL("NearbyListHideUsernames", hide_usernames);
|
||||
|
||||
mNearbyList->setShowCompleteName(!hide_usernames);
|
||||
mNearbyList->handleDisplayNamesOptionChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
|
||||
|
|
|
|||
|
|
@ -38,9 +38,14 @@
|
|||
#include "llavataractions.h"
|
||||
#include "llcallingcard.h" // for LLAvatarTracker
|
||||
#include "lllogchat.h"
|
||||
#include "llparcel.h"
|
||||
#include "llviewermenu.h" // for gMenuHolder
|
||||
#include "llconversationmodel.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "roles_constants.h"
|
||||
|
||||
namespace LLPanelPeopleMenus
|
||||
{
|
||||
|
|
@ -77,9 +82,13 @@ LLContextMenu* PeopleContextMenu::createMenu()
|
|||
registrar.add("Avatar.InviteToGroup", boost::bind(&LLAvatarActions::inviteToGroup, id));
|
||||
registrar.add("Avatar.TeleportRequest", boost::bind(&PeopleContextMenu::requestTeleport, this));
|
||||
registrar.add("Avatar.Calllog", boost::bind(&LLAvatarActions::viewChatHistory, id));
|
||||
registrar.add("Avatar.Freeze", boost::bind(&LLAvatarActions::freezeAvatar, id));
|
||||
registrar.add("Avatar.Eject", boost::bind(&PeopleContextMenu::eject, this));
|
||||
|
||||
|
||||
enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
|
||||
enable_registrar.add("Avatar.CheckItem", boost::bind(&PeopleContextMenu::checkContextMenuItem, this, _2));
|
||||
enable_registrar.add("Avatar.EnableFreezeEject", boost::bind(&PeopleContextMenu::enableFreezeEject, this, _2));
|
||||
|
||||
// create the context menu from the XUI
|
||||
menu = createFromFile("menu_people_nearby.xml");
|
||||
|
|
@ -258,6 +267,50 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool PeopleContextMenu::enableFreezeEject(const LLSD& userdata)
|
||||
{
|
||||
if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const LLUUID& id = mUUIDs.front();
|
||||
|
||||
// Use avatar_id if available, otherwise default to right-click avatar
|
||||
LLVOAvatar* avatar = NULL;
|
||||
if (id.notNull())
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(id);
|
||||
if (object)
|
||||
{
|
||||
if( !object->isAvatar() )
|
||||
{
|
||||
object = NULL;
|
||||
}
|
||||
avatar = (LLVOAvatar*) object;
|
||||
}
|
||||
}
|
||||
if (!avatar) return false;
|
||||
|
||||
// Gods can always freeze
|
||||
if (gAgent.isGodlike()) return true;
|
||||
|
||||
// Estate owners / managers can freeze
|
||||
// Parcel owners can also freeze
|
||||
const LLVector3& pos = avatar->getPositionRegion();
|
||||
const LLVector3d& pos_global = avatar->getPositionGlobal();
|
||||
LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
|
||||
LLViewerRegion* region = avatar->getRegion();
|
||||
if (!region) return false;
|
||||
|
||||
bool new_value = region->isOwnedSelf(pos);
|
||||
if (!new_value || region->isOwnedGroup(pos))
|
||||
{
|
||||
new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
|
||||
}
|
||||
return new_value;
|
||||
}
|
||||
|
||||
void PeopleContextMenu::requestTeleport()
|
||||
{
|
||||
// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(),
|
||||
|
|
@ -272,6 +325,39 @@ void PeopleContextMenu::offerTeleport()
|
|||
LLAvatarActions::offerTeleport(mUUIDs);
|
||||
}
|
||||
|
||||
void PeopleContextMenu::eject()
|
||||
{
|
||||
if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const LLUUID& id = mUUIDs.front();
|
||||
|
||||
// Use avatar_id if available, otherwise default to right-click avatar
|
||||
LLVOAvatar* avatar = NULL;
|
||||
if (id.notNull())
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(id);
|
||||
if (object)
|
||||
{
|
||||
if( !object->isAvatar() )
|
||||
{
|
||||
object = NULL;
|
||||
}
|
||||
avatar = (LLVOAvatar*) object;
|
||||
}
|
||||
}
|
||||
if (!avatar) return;
|
||||
LLSD payload;
|
||||
payload["avatar_id"] = avatar->getID();
|
||||
std::string fullname = avatar->getFullname();
|
||||
|
||||
const LLVector3d& pos = avatar->getPositionGlobal();
|
||||
LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
|
||||
LLAvatarActions::ejectAvatar(id ,LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED));
|
||||
}
|
||||
|
||||
void PeopleContextMenu::startConference()
|
||||
{
|
||||
uuid_vec_t uuids;
|
||||
|
|
@ -320,6 +406,8 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
|
|||
items.push_back(std::string("share"));
|
||||
items.push_back(std::string("pay"));
|
||||
items.push_back(std::string("block_unblock"));
|
||||
items.push_back(std::string("freeze"));
|
||||
items.push_back(std::string("eject"));
|
||||
}
|
||||
|
||||
hide_context_entries(menu, items, disabled_items);
|
||||
|
|
|
|||
|
|
@ -46,7 +46,9 @@ protected:
|
|||
private:
|
||||
bool enableContextMenuItem(const LLSD& userdata);
|
||||
bool checkContextMenuItem(const LLSD& userdata);
|
||||
bool enableFreezeEject(const LLSD& userdata);
|
||||
void offerTeleport();
|
||||
void eject();
|
||||
void startConference();
|
||||
void requestTeleport();
|
||||
};
|
||||
|
|
|
|||
|
|
@ -176,6 +176,16 @@ public:
|
|||
return true;
|
||||
}
|
||||
|
||||
if (verb == "unblock")
|
||||
{
|
||||
if (params.size() > 2)
|
||||
{
|
||||
const std::string object_name = params[2].asString();
|
||||
LLMute mute(avatar_id, object_name, LLMute::OBJECT);
|
||||
LLMuteList::getInstance()->remove(mute);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
|
||||
#include "llpanelsnapshot.h"
|
||||
#include "llviewercontrol.h" // gSavedSettings
|
||||
#include "llstatusbar.h" // can_afford_transaction()
|
||||
#include "llnotificationsutil.h"
|
||||
|
||||
/**
|
||||
* The panel provides UI for saving snapshot as an inventory texture.
|
||||
|
|
@ -102,6 +104,17 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
|
|||
|
||||
void LLPanelSnapshotInventory::onSend()
|
||||
{
|
||||
LLFloaterSnapshot::saveTexture();
|
||||
LLFloaterSnapshot::postSave();
|
||||
S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
|
||||
if (can_afford_transaction(expected_upload_cost))
|
||||
{
|
||||
LLFloaterSnapshot::saveTexture();
|
||||
LLFloaterSnapshot::postSave();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLSD args;
|
||||
args["COST"] = llformat("%d", expected_upload_cost);
|
||||
LLNotificationsUtil::add("ErrorPhotoCannotAfford", args);
|
||||
LLFloaterSnapshot::inventorySaveFailed();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ protected:
|
|||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
|
||||
registrar.add("Wearing.Edit", boost::bind(&edit_outfit));
|
||||
registrar.add("Wearing.ShowOriginal", boost::bind(show_item_original, mUUIDs.front()));
|
||||
registrar.add("Wearing.TakeOff",
|
||||
boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
|
||||
registrar.add("Wearing.Detach",
|
||||
|
|
@ -144,6 +145,7 @@ protected:
|
|||
menu->setItemVisible("take_off", allow_take_off);
|
||||
menu->setItemVisible("detach", allow_detach);
|
||||
menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach);
|
||||
menu->setItemVisible("show_original", mUUIDs.size() == 1);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#include "llviewercontrol.h"
|
||||
#include "llfloaterpreference.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfeaturemanager.h"
|
||||
|
||||
LLPresetsManager::LLPresetsManager()
|
||||
{
|
||||
|
|
@ -60,7 +61,7 @@ void LLPresetsManager::createMissingDefault()
|
|||
LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
|
||||
|
||||
// Write current graphic settings as the default
|
||||
savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT);
|
||||
savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -134,7 +135,7 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam
|
|||
presets = mPresetNames;
|
||||
}
|
||||
|
||||
bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name)
|
||||
bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name, bool createDefault)
|
||||
{
|
||||
if (LLTrans::getString(PRESETS_DEFAULT) == name)
|
||||
{
|
||||
|
|
@ -146,11 +147,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
|
|||
|
||||
if(PRESETS_GRAPHIC == subdirectory)
|
||||
{
|
||||
gSavedSettings.setString("PresetGraphicActive", name);
|
||||
|
||||
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
|
||||
if (instance)
|
||||
if (instance && !createDefault)
|
||||
{
|
||||
gSavedSettings.setString("PresetGraphicActive", name);
|
||||
instance->getControlNames(name_list);
|
||||
LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
|
||||
name_list.push_back("PresetGraphicActive");
|
||||
|
|
@ -170,23 +170,36 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
|
|||
LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
|
||||
}
|
||||
|
||||
if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list
|
||||
if (name_list.size() > 1 // if the active preset name is the only thing in the list, don't save the list
|
||||
|| (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)) // or create a default graphics preset from hw recommended settings
|
||||
{
|
||||
// make an empty llsd
|
||||
LLSD paramsData(LLSD::emptyMap());
|
||||
|
||||
for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
|
||||
if (createDefault)
|
||||
{
|
||||
std::string ctrl_name = *it;
|
||||
LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
|
||||
std::string comment = ctrl->getComment();
|
||||
std::string type = LLControlGroup::typeEnumToString(ctrl->type());
|
||||
LLSD value = ctrl->getValue();
|
||||
paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
|
||||
if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
|
||||
{
|
||||
// use the recommended setting as an initial one (MAINT-6435)
|
||||
gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
|
||||
{
|
||||
std::string ctrl_name = *it;
|
||||
LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
|
||||
std::string comment = ctrl->getComment();
|
||||
std::string type = LLControlGroup::typeEnumToString(ctrl->type());
|
||||
LLSD value = ctrl->getValue();
|
||||
|
||||
paramsData[ctrl_name]["Comment"] = comment;
|
||||
paramsData[ctrl_name]["Persist"] = 1;
|
||||
paramsData[ctrl_name]["Type"] = type;
|
||||
paramsData[ctrl_name]["Value"] = value;
|
||||
paramsData[ctrl_name]["Comment"] = comment;
|
||||
paramsData[ctrl_name]["Persist"] = 1;
|
||||
paramsData[ctrl_name]["Type"] = type;
|
||||
paramsData[ctrl_name]["Value"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
|
||||
|
|
@ -203,10 +216,12 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
|
|||
|
||||
LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
|
||||
|
||||
gSavedSettings.setString("PresetGraphicActive", name);
|
||||
|
||||
// signal interested parties
|
||||
triggerChangeSignal();
|
||||
if (!createDefault)
|
||||
{
|
||||
gSavedSettings.setString("PresetGraphicActive", name);
|
||||
// signal interested parties
|
||||
triggerChangeSignal();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public:
|
|||
static std::string getPresetsDir(const std::string& subdirectory);
|
||||
void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
|
||||
void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
|
||||
bool savePreset(const std::string& subdirectory, std::string name);
|
||||
bool savePreset(const std::string& subdirectory, std::string name, bool createDefault = false);
|
||||
void loadPreset(const std::string& subdirectory, std::string name);
|
||||
bool deletePreset(const std::string& subdirectory, std::string name);
|
||||
|
||||
|
|
|
|||
|
|
@ -94,7 +94,8 @@ BOOL LLPreviewNotecard::postBuild()
|
|||
if (item)
|
||||
{
|
||||
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
|
||||
getChildView("Delete")->setEnabled(true);
|
||||
BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID());
|
||||
getChildView("Delete")->setEnabled(!source_library);
|
||||
}
|
||||
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
|
||||
|
||||
|
|
@ -219,6 +220,7 @@ void LLPreviewNotecard::loadAsset()
|
|||
BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);
|
||||
BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
|
||||
BOOL allow_modify = canModify(mObjectUUID, item);
|
||||
BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID());
|
||||
|
||||
if (allow_copy || gAgent.isGodlike())
|
||||
{
|
||||
|
|
@ -288,7 +290,7 @@ void LLPreviewNotecard::loadAsset()
|
|||
getChildView("lock")->setVisible( TRUE);
|
||||
}
|
||||
|
||||
if(allow_modify || is_owner)
|
||||
if((allow_modify || is_owner) && !source_library)
|
||||
{
|
||||
getChildView("Delete")->setEnabled(TRUE);
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue