summaryrefslogtreecommitdiff
path: root/indra/newview/llpreviewtexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpreviewtexture.cpp')
-rwxr-xr-x[-rw-r--r--]indra/newview/llpreviewtexture.cpp121
1 files changed, 105 insertions, 16 deletions
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 3ff5a05d81..f91a18d8d3 100644..100755
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -36,6 +36,7 @@
#include "llfilepicker.h"
#include "llfloaterreg.h"
#include "llimagetga.h"
+#include "llimagepng.h"
#include "llinventory.h"
#include "llnotificationsutil.h"
#include "llresmgr.h"
@@ -64,13 +65,14 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
mShowKeepDiscard(FALSE),
mCopyToInv(FALSE),
mIsCopyable(FALSE),
+ mIsFullPerm(FALSE),
mUpdateDimensions(TRUE),
mLastHeight(0),
mLastWidth(0),
mAspectRatio(0.f),
mPreviewToSave(FALSE),
mImage(NULL),
- mImageOldBoostLevel(LLViewerTexture::BOOST_NONE)
+ mImageOldBoostLevel(LLGLTexture::BOOST_NONE)
{
updateImageID();
if (key.has("save_as"))
@@ -126,9 +128,28 @@ BOOL LLPreviewTexture::postBuild()
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
}
+
+ // Fill in ratios list with common aspect ratio values
+ mRatiosList.clear();
+ mRatiosList.push_back(LLTrans::getString("Unconstrained"));
+ mRatiosList.push_back("1:1");
+ mRatiosList.push_back("4:3");
+ mRatiosList.push_back("10:7");
+ mRatiosList.push_back("3:2");
+ mRatiosList.push_back("16:10");
+ mRatiosList.push_back("16:9");
+ mRatiosList.push_back("2:1");
- childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
+ // Now fill combo box with provided list
LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ combo->removeall();
+
+ for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
+ {
+ combo->add(*it);
+ }
+
+ childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
combo->setCurrentByIndex(0);
return LLPreview::postBuild();
@@ -162,12 +183,6 @@ void LLPreviewTexture::draw()
if ( mImage.notNull() )
{
- // Automatically bring up SaveAs dialog if we opened this to save the texture.
- if (mPreviewToSave)
- {
- mPreviewToSave = FALSE;
- saveAs();
- }
// Draw the texture
gGL.diffuseColor3f( 1.f, 1.f, 1.f );
gl_draw_scaled_image(interior.mLeft,
@@ -249,7 +264,7 @@ void LLPreviewTexture::draw()
// virtual
BOOL LLPreviewTexture::canSaveAs() const
{
- return mIsCopyable && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset();
+ return mIsFullPerm && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset();
}
@@ -261,11 +276,17 @@ void LLPreviewTexture::saveAs()
LLFilePicker& file_picker = LLFilePicker::instance();
const LLInventoryItem* item = getItem() ;
- if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) )
+ if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGAPNG, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) )
{
// User canceled or we failed to acquire save file.
return;
}
+ if(mPreviewToSave)
+ {
+ mPreviewToSave = FALSE;
+ LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", item->getUUID());
+ }
+
// remember the user-approved/edited file name.
mSaveFileName = file_picker.getFirstFile();
mLoadingFullImage = TRUE;
@@ -358,14 +379,27 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
if( self && final && success )
{
- LLPointer<LLImageTGA> image_tga = new LLImageTGA;
- if( !image_tga->encode( src ) )
+ const U32 ext_length = 3;
+ std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length);
+
+ // We only support saving in PNG or TGA format
+ LLPointer<LLImageFormatted> image;
+ if(extension == "png")
+ {
+ image = new LLImagePNG;
+ }
+ else if(extension == "tga")
+ {
+ image = new LLImageTGA;
+ }
+
+ if( image && !image->encode( src, 0 ) )
{
LLSD args;
args["FILE"] = self->mSaveFileName;
LLNotificationsUtil::add("CannotEncodeFile", args);
}
- else if( !image_tga->save( self->mSaveFileName ) )
+ else if( image && !image->save( self->mSaveFileName ) )
{
LLSD args;
args["FILE"] = self->mSaveFileName;
@@ -400,6 +434,13 @@ void LLPreviewTexture::updateDimensions()
{
return;
}
+
+ if (mAssetStatus != PREVIEW_ASSET_LOADED)
+ {
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ // Asset has been fully loaded, adjust aspect ratio
+ adjustAspectRatio();
+ }
// Update the width/height display every time
getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
@@ -468,14 +509,19 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata)
void LLPreviewTexture::loadAsset()
{
- mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
mImageOldBoostLevel = mImage->getBoostLevel();
- mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
+ mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
mImage->forceToSaveRawImage(0) ;
mAssetStatus = PREVIEW_ASSET_LOADING;
mUpdateDimensions = TRUE;
updateDimensions();
getChildView("save_tex_btn")->setEnabled(canSaveAs());
+ if (mObjectUUID.notNull())
+ {
+ // check that we can copy inworld items into inventory
+ getChildView("Keep")->setEnabled(mIsCopyable);
+ }
}
LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
@@ -487,6 +533,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
return mAssetStatus;
}
+void LLPreviewTexture::adjustAspectRatio()
+{
+ S32 w = mImage->getFullWidth();
+ S32 h = mImage->getFullHeight();
+
+ // Determine aspect ratio of the image
+ S32 tmp;
+ while (h != 0)
+ {
+ tmp = w % h;
+ w = h;
+ h = tmp;
+ }
+ S32 divisor = w;
+ S32 num = mImage->getFullWidth() / divisor;
+ S32 denom = mImage->getFullHeight() / divisor;
+
+ if (setAspectRatio(num, denom))
+ {
+ // Select corresponding ratio entry in the combo list
+ LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ if (combo)
+ {
+ std::ostringstream ratio;
+ ratio << num << ":" << denom;
+ std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str());
+ if (found == mRatiosList.end())
+ {
+ combo->setCurrentByIndex(0);
+ }
+ else
+ {
+ combo->setCurrentByIndex(found - mRatiosList.begin());
+ }
+ }
+ }
+
+ mUpdateDimensions = TRUE;
+}
+
void LLPreviewTexture::updateImageID()
{
const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
@@ -500,7 +586,9 @@ void LLPreviewTexture::updateImageID()
mShowKeepDiscard = TRUE;
mCopyToInv = FALSE;
- mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ LLPermissions perm(item->getPermissions());
+ mIsCopyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) && perm.allowTransferTo(gAgent.getID());
+ mIsFullPerm = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
else // not an item, assume it's an asset id
{
@@ -508,6 +596,7 @@ void LLPreviewTexture::updateImageID()
mShowKeepDiscard = FALSE;
mCopyToInv = TRUE;
mIsCopyable = TRUE;
+ mIsFullPerm = TRUE;
}
}