diff options
author | Adam Moss <moss@lindenlab.com> | 2009-10-14 10:40:56 +0000 |
---|---|---|
committer | Adam Moss <moss@lindenlab.com> | 2009-10-14 10:40:56 +0000 |
commit | 406927f6293efa416b174cfa1c88689aab9615f7 (patch) | |
tree | 005bb9a384f9dd2adbd00c08f516a29e1902f4ed /indra/newview/llpreviewtexture.cpp | |
parent | d6db0f8b297686c6ae97ace23d0714c4ae95b1f3 (diff) |
Merge a big bunch of fixes from maint-viewer. Hooray.
svn merge -r136066:136073 svn+ssh://svn.lindenlab.com/svn/linden/branches/maint-viewer/maint-viewer-24-qa-9
DEV-8553 New Server Tools - Prep Land For Sale
DEV-32942 (QAR-1521) Bad border crossings or TP / Ruthing issues
DEV-32942 (QAR-1521) Bad border crossings or TP / Ruthing issues
DEV-33239 VWR-13816: Resizing the Search Window Causes the Results to Refresh back to First Page
DEV-27746 Running a dev build of Second Life will make console window show up on non-dev builds (Windows)
DEV-33209 Linux 1.24.0.120778 client fails to run
DEV-29123 SVC-3871: Crash of viewer when clicking on ghost objects at (0,0,0) on a sim
DEV-35433 Attempting to upload wrong file type crashes viewer
DEV-33499 viewer2009 is not using KDU
DEV-33912 Griefing viewer crashes others' viewers with malformed sound files
DEV-3784 VWR-138: Animation Priority not working correctly, Can't create new AOs
DEV-20678 VWR-9069: Region variable says 'Region Name' in AR if no object is selected
DEV-19934 Help->About Second Life doesn't differentiate between 32- and 64-bit Vista
DEV-6604 Restored folders have 'Purge Item' and 'Restore Item' options
DEV-12867 VWR-5717: Selected Text is not replaced by Input text when Japanese IME is on
DEV-11894 Notecards/Texture windows don't open completely when opened from inventory
DEV-10641 VWR-4955: Local Chat doesn't show end of last conversation
DEV-30039 VWR-12620: Viewer build fails on Linux when compiled with -O2 (--type=Release)
DEV-20944 VWR-9065: (intermittent) Right Click >profile on avatar does not display profile
DEV-24828 Menu accelerator prefixes shouldn't be hard-coded
DEV-34529 VWR-14267: Clicking send in an IM window does not add the sent text to the line editor history
DEV-34124 Invite to group, search by name will not show resident if their first name is two characters
DEV-20930 VWR-9248: On Mac: the "--url" option causes a command line parsing error
DEV-35306 Adult keyword filter triggers multiple warnings
DEV-35503 VWR-3595: "Second Life requires True Color (32-bit) to run in a window" message is incorrect
DEV-35656 VWR-12995: FTBFS: error: format '%-3d' expects type 'int', but argument 3 has type 'size_t'
DEV-30043 VWR-12533: Linux viewer build for OpenAL fails during packaging unless FMOD library is available
DEV-31898 VWR-13202: Right clicking mouse triggers arrow key control events
DEV-32610 Keyboard shortcuts on OSX viewer overridden by OSX
DEV-27067 Coverity Prevent: EVALUATION_ORDER defects
DEV-26188 VWR-2242: Specially formatted .BVH file can cause avatar distortion
DEV-25475 About Land dialog no longer shows Area: field
DEV-19897 OSX Viewer Installer (for an RC) opens with poor positioning
DEV-22837 Inventory> Search Recent Items highlighting incorrect characters
DEV-21709 VWR-9377: Mapping will default to leave exact sim name listing first. (Searching Gar forces Gar to come up and not Garden of Dreams)
DEV-23079 implement volume serial for linux client
DEV-13930 VWR-6432: Space Navigator operation with vehicles is broken
DEV-27666 VWR-10829: Linux Viewer: CLICK_ACTION_PAY shows CLICK_ACTION_PLAY icon
DEV-23670 Viewer crashes on startup if installed into a custom folder with Korean, Japanese or Chinese characters in path
DEV-19313 VWR-8454: PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS not highlighted in script editor
DEV-19918 VWR-8885: Move character/*.xml files to source bundle
DEV-25555 VWR-11172: A source coding mistake prevents number-pad keys from specifying Ctrl+digit shortcuts on Windows
DEV-8536 VWR-4057: Multi-line chat display bug - first character in line missing
DEV-29592 Mac LLFastTimer uses wall clock instead of Intel PMU
DEV-29644 VWR-12587: Cmake install target has a hard coded secondlife-bin reference remaining
DEV-25320 VWR-11128: Python not always detected by develop.py
DEV-30040 VWR-12617: Poor type name that violates Coding Standard breaks compatibility with system header files
DEV-30380 indra/newview/res-sdl/toolpay.BMP is modified during ./develop.py configure
DEV-31247 VWR-12763: non-portable printf specifier used with size_t causes FTBFS on 64bit (due to -Werror)
DEV-29565 VWR-12569: A comment in lluistring.h contains undefined UTF-8 code sequences
DEV-22100 VWR-9620: send_parcel_select_objects in newview/llfloaterland.cpp uses the wrong datatype for the ReturnType field causing a warning
DEV-31911 Selected objects / primitives should be greyed out when nothing is selected
DEV-3667 Windows: Accelerator keys should be "Ctrl+X" rather than "Ctrl-X"
DEV-27223 disable gstreamer on 64-bit linux
DEV-8172 We Need a Linden Sale Option to Sell Land to Anyone
DEV-25511 VWR-10311: Enable LipSync by default
DEV-20443 Revamp group creation confirmation dialog to be more communicative
DEV-20132 VWR-7800: Joystick / SpaceNavigator. Camera should remain in position when exiting flycam mode into avatar mode.
DEV-18420 VWR-8393: Have build scripts copy fmod from an external location
DEV-24841 VWR-10717: Right Space Navigator button should toggle fly in avatar movment, not jump/flyup.
DEV-28457 change auto-populate value in buy L$ window from 1000 to 2000
DEV-15545 VWR-3725: Please add resize option to the SEARCH window UI
Diffstat (limited to 'indra/newview/llpreviewtexture.cpp')
-rw-r--r-- | indra/newview/llpreviewtexture.cpp | 113 |
1 files changed, 100 insertions, 13 deletions
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9d7338c111..9c21faa3be 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -38,6 +38,7 @@ #include "llagent.h" #include "llbutton.h" +#include "llcombobox.h" #include "llfilepicker.h" #include "llfloaterreg.h" #include "llimagetga.h" @@ -57,6 +58,10 @@ const S32 CLIENT_RECT_VPAD = 4; const F32 SECONDS_TO_SHOW_FILE_SAVED_MSG = 8.f; +const F32 PREVIEW_TEXTURE_MAX_ASPECT = 200.f; +const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f; + + LLPreviewTexture::LLPreviewTexture(const LLSD& key) : LLPreview( key ), mLoadingFullImage( FALSE ), @@ -65,7 +70,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) mIsCopyable(FALSE), mUpdateDimensions(TRUE), mLastHeight(0), - mLastWidth(0) + mLastWidth(0), + mAspectRatio(0.f) { const LLInventoryItem *item = getItem(); if(item) @@ -144,6 +150,10 @@ BOOL LLPreviewTexture::postBuild() } } + childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); + LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); + combo->setCurrentByIndex(0); + return LLPreview::postBuild(); } @@ -369,8 +379,13 @@ void LLPreviewTexture::updateDimensions() S32 max_client_width = gViewerWindow->getWindowWidth() - horiz_pad; S32 max_client_height = gViewerWindow->getWindowHeight() - vert_pad; + if (mAspectRatio > 0.f) + { + client_height = llceil((F32)client_width / mAspectRatio); + } + while ((client_width > max_client_width) || - (client_height > max_client_height ) ) + (client_height > max_client_height )) { client_width /= 2; client_height /= 2; @@ -383,12 +398,12 @@ void LLPreviewTexture::updateDimensions() childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth())); childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight())); - // add space for dimensions + // add space for dimensions and aspect ratio S32 info_height = 0; - LLRect dim_rect; - childGetRect("dimensions", dim_rect); - S32 dim_height = dim_rect.getHeight(); - info_height += dim_height + CLIENT_RECT_VPAD; + LLRect aspect_rect; + childGetRect("combo_aspect_ratio", aspect_rect); + S32 aspect_height = aspect_rect.getHeight(); + info_height += aspect_height + CLIENT_RECT_VPAD; view_height += info_height; S32 button_height = 0; @@ -445,24 +460,96 @@ void LLPreviewTexture::updateDimensions() else { client_width = getRect().getWidth() - horiz_pad; - client_height = getRect().getHeight() - vert_pad; + if (mAspectRatio > 0) + { + client_height = llround(client_width / mAspectRatio); + } + else + { + client_height = getRect().getHeight() - vert_pad; + } } - S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height + S32 max_height = getRect().getHeight() - PREVIEW_BORDER - button_height - CLIENT_RECT_VPAD - info_height - CLIENT_RECT_VPAD - PREVIEW_HEADER_SIZE; - S32 max_width = getRect().getWidth() - horiz_pad; - client_height = llclamp(client_height, 1, max_height); - client_width = llclamp(client_width, 1, max_width); + if (mAspectRatio > 0.f) + { + max_height = llmax(max_height, 1); + + if (client_height > max_height) + { + client_height = max_height; + client_width = llround(client_height * mAspectRatio); + } + } + else + { + S32 max_width = getRect().getWidth() - horiz_pad; + + client_height = llclamp(client_height, 1, max_height); + client_width = llclamp(client_width, 1, max_width); + } LLRect window_rect(0, getRect().getHeight(), getRect().getWidth(), 0); window_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); window_rect.mBottom += PREVIEW_BORDER + button_height + CLIENT_RECT_VPAD + info_height + CLIENT_RECT_VPAD; - mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); + mClientRect.setLeftTopAndSize(window_rect.getCenterX() - (client_width / 2), window_rect.mTop, client_width, client_height); + + // Hide the aspect ratio label if the window is too narrow + // Assumes the label should be to the right of the dimensions + LLRect dim_rect, aspect_label_rect; + childGetRect("aspect_ratio", aspect_label_rect); + childGetRect("dimensions", dim_rect); + childSetVisible("aspect_ratio", dim_rect.mRight < aspect_label_rect.mLeft); +} + + +// Return true if everything went fine, false if we somewhat modified the ratio as we bumped on border values +bool LLPreviewTexture::setAspectRatio(const F32 width, const F32 height) +{ + mUpdateDimensions = TRUE; + + // We don't allow negative width or height. Also, if height is positive but too small, we reset to default + // A default 0.f value for mAspectRatio means "unconstrained" in the rest of the code + if ((width <= 0.f) || (height <= F_APPROXIMATELY_ZERO)) + { + mAspectRatio = 0.f; + return false; + } + + // Compute and store the ratio + F32 ratio = width / height; + mAspectRatio = llclamp(ratio, PREVIEW_TEXTURE_MIN_ASPECT, PREVIEW_TEXTURE_MAX_ASPECT); + + // Return false if we clamped the value, true otherwise + return (ratio == mAspectRatio); } +void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) +{ + LLPreviewTexture* self = (LLPreviewTexture*) userdata; + + std::string ratio(ctrl->getValue().asString()); + std::string::size_type separator(ratio.find_first_of(":/\\")); + + if (std::string::npos == separator) { + // If there's no separator assume we want an unconstrained ratio + self->setAspectRatio( 0.f, 0.f ); + return; + } + + F32 width, height; + std::istringstream numerator(ratio.substr(0, separator)); + std::istringstream denominator(ratio.substr(separator + 1)); + numerator >> width; + denominator >> height; + + self->setAspectRatio( width, height ); +} + void LLPreviewTexture::loadAsset() { mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE); |