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: