diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index b61a567bb..e710fa6dc 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -217,6 +217,7 @@ public:
virtual BOOL canSaveAs() const { return FALSE; }
virtual void saveAs() {}
+ virtual void saveAsType(BOOL type=false) {}
//
virtual LLUUID getItemID() { return LLUUID::null; }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 8bcf0dd2a..d4b0d7099 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -39,6 +39,7 @@
#include "llcombobox.h"
#include "statemachine/aifilepicker.h"
#include "llfloaterinventory.h"
+#include "llimagepng.h"
#include "llimagetga.h"
#include "llinventory.h"
#include "llnotificationsutil.h"
@@ -375,17 +376,27 @@ BOOL LLPreviewTexture::canSaveAs() const
return mIsCopyable && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset();
}
+static bool sPng(false);
// virtual
-void LLPreviewTexture::saveAs()
+void LLPreviewTexture::saveAsType(BOOL png)
{
if( mLoadingFullImage )
return;
const LLViewerInventoryItem* item = getItem() ;
AIFilePicker* filepicker = AIFilePicker::create();
- filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".tga" : LLStringUtil::null, FFSAVE_TGA, "", "image");
- filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker));
+ sPng = png;
+ if(png)
+ {
+ filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".png" : LLStringUtil::null, FFSAVE_PNG, "", "image");
+ filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker));
+ }
+ else
+ {
+ filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".tga" : LLStringUtil::null, FFSAVE_TGA, "", "image");
+ filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker));
+ }
}
void LLPreviewTexture::saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker)
@@ -433,14 +444,16 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
if( self && final && success )
{
+ //FIXME: There has to be a better way
+ LLPointer image_png = new LLImagePNG;
LLPointer image_tga = new LLImageTGA;
- if( !image_tga->encode( src ) )
+ if( sPng ? !image_png->encode( src, 0.0 ) : !image_tga->encode( src ) )
{
LLSD args;
args["FILE"] = self->mSaveFileName;
LLNotificationsUtil::add("CannotEncodeFile", args);
}
- else if( !image_tga->save( self->mSaveFileName ) )
+ else if( sPng ? !image_png->save( self->mSaveFileName ) : !image_tga->save( self->mSaveFileName ) )
{
LLSD args;
args["FILE"] = self->mSaveFileName;
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index ce26d4dd4..bb20af473 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -64,7 +64,8 @@ public:
virtual void draw();
virtual BOOL canSaveAs() const;
- virtual void saveAs();
+ virtual void saveAs(){ saveAsType(false); }
+ void saveAsType(BOOL png);
void saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker);
virtual LLUUID getItemID();
virtual std::string getItemCreatorName();
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index bb1ad75a4..8f3019121 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -504,6 +504,19 @@ class LLFileSavePreview : public view_listener_t
}
};
+class LLFileSavePreviewPNG : public view_listener_t
+{
+ bool handleEvent(LLPointer event, const LLSD& userdata)
+ {
+ LLFloater* top = gFloaterView->getFrontmost();
+ if (top)
+ {
+ top->saveAsType(true);
+ }
+ return true;
+ }
+};
+
class LLFileTakeSnapshot : public view_listener_t
{
bool handleEvent(LLPointer event, const LLSD& userdata)
@@ -1313,6 +1326,7 @@ void init_menu_file()
(new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows");
//
(new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview");
+ (new LLFileSavePreviewPNG())->registerListener(gMenuHolder, "File.SavePreviewPNG");
(new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
(new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
(new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
diff --git a/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/indra/newview/skins/default/xui/en-us/floater_about_land.xml
index 41ffa8969..f40659986 100644
--- a/indra/newview/skins/default/xui/en-us/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en-us/floater_about_land.xml
@@ -1345,11 +1345,11 @@ Select the thumbnail to choose a different texture.
One or more of these options is set at the estate level
- minutes
- 1 minute
- 1 second
- seconds
- remaining
+ minutes
+ 1 minute
+ 1 second
+ seconds
+ remaining
-
+
+
+
+
Autoresponse sent to
was sent auto-response item
(Unnamed)
- (Saved [LONG_TIMESTAMP])
+ (Saved [LONG_TIMESTAMP])
You are bestowed with powers beyond mortal comprehension.
Use your newfound abilities wisely.
Unlocked: