Skip to content
Snippets Groups Projects
Commit 9c73b1a5 authored by Rye Mutt's avatar Rye Mutt :bread:
Browse files

Add filepicker, local bitmap, and texture saving support for webp

parent 36990e4a
No related branches found
No related tags found
No related merge requests found
...@@ -52,7 +52,7 @@ LLFilePicker LLFilePicker::sInstance; ...@@ -52,7 +52,7 @@ LLFilePicker LLFilePicker::sInstance;
#if LL_WINDOWS #if LL_WINDOWS
#define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0" #define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0"
#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" #define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png; *.webp)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png;*.webp\0"
#define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0" #define ANIM_FILTER L"Animations (*.bvh; *.anim)\0*.bvh;*.anim\0"
#define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0" #define COLLADA_FILTER L"Scene (*.dae)\0*.dae\0"
#ifdef _CORY_TESTING #ifdef _CORY_TESTING
...@@ -442,7 +442,17 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, ...@@ -442,7 +442,17 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
L"PNG Images (*.png)\0*.png\0" \ L"PNG Images (*.png)\0*.png\0" \
L"\0"; L"\0";
break; break;
case FFSAVE_TGAPNG: case FFSAVE_WEBP:
if (filename.empty())
{
wcsncpy(mFilesW, L"untitled.webp", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
}
mOFN.lpstrDefExt = L"webp";
mOFN.lpstrFilter =
L"WebP Images (*.webp)\0*.webp\0" \
L"\0";
break;
case FFSAVE_TGAPNGWEBP:
if (filename.empty()) if (filename.empty())
{ {
wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
...@@ -452,9 +462,10 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, ...@@ -452,9 +462,10 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,
mOFN.lpstrFilter = mOFN.lpstrFilter =
L"PNG Images (*.png)\0*.png\0" \ L"PNG Images (*.png)\0*.png\0" \
L"Targa Images (*.tga)\0*.tga\0" \ L"Targa Images (*.tga)\0*.tga\0" \
L"WebP Images (*.webp)\0*.webp\0" \
L"\0"; L"\0";
break; break;
case FFSAVE_JPEG: case FFSAVE_JPEG:
if (filename.empty()) if (filename.empty())
{ {
...@@ -614,6 +625,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) // ...@@ -614,6 +625,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //
allowedv->push_back("bmpf"); allowedv->push_back("bmpf");
allowedv->push_back("tpic"); allowedv->push_back("tpic");
allowedv->push_back("png"); allowedv->push_back("png");
allowedv->push_back("webp");
break; break;
case FFLOAD_EXE: case FFLOAD_EXE:
allowedv->push_back("app"); allowedv->push_back("app");
...@@ -704,10 +716,10 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena ...@@ -704,10 +716,10 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena
creator = "prvw"; creator = "prvw";
extension = "tga"; extension = "tga";
break; break;
case FFSAVE_TGAPNG: case FFSAVE_TGAPNGWEBP:
type = "PNG"; type = "PNG";
creator = "prvw"; creator = "prvw";
extension = "png,tga"; extension = "png,tga,webp";
break; break;
case FFSAVE_BMP: case FFSAVE_BMP:
type = "BMPf"; type = "BMPf";
...@@ -724,6 +736,11 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena ...@@ -724,6 +736,11 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena
creator = "prvw"; creator = "prvw";
extension = "png"; extension = "png";
break; break;
case FFSAVE_WEBP:
type = "WebP";
creator = "prvw";
extension = "webp";
break;
case FFSAVE_AVI: case FFSAVE_AVI:
type = "\?\?\?\?"; type = "\?\?\?\?";
creator = "\?\?\?\?"; creator = "\?\?\?\?";
...@@ -1017,6 +1034,10 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer ...@@ -1017,6 +1034,10 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer
{ {
picker->mCurrentExtension = ".tga"; picker->mCurrentExtension = ".tga";
} }
else if (filter == LLTrans::getString("webp_image_files"))
{
picker->mCurrentExtension = ".webp";
}
} }
// set the default path for this usage context. // set the default path for this usage context.
...@@ -1206,17 +1227,22 @@ static std::string add_save_texture_filter_to_gtkchooser(GtkWindow *picker) ...@@ -1206,17 +1227,22 @@ static std::string add_save_texture_filter_to_gtkchooser(GtkWindow *picker)
{ {
GtkFileFilter *gfilter_tga = gtk_file_filter_new(); GtkFileFilter *gfilter_tga = gtk_file_filter_new();
GtkFileFilter *gfilter_png = gtk_file_filter_new(); GtkFileFilter *gfilter_png = gtk_file_filter_new();
GtkFileFilter *gfilter_webp = gtk_file_filter_new();
gtk_file_filter_add_pattern(gfilter_tga, "*.tga"); gtk_file_filter_add_pattern(gfilter_tga, "*.tga");
gtk_file_filter_add_mime_type(gfilter_png, "image/png"); gtk_file_filter_add_mime_type(gfilter_png, "image/png");
std::string caption = LLTrans::getString("save_texture_image_files") + " (*.tga; *.png)"; gtk_file_filter_add_pattern(gfilter_webp, "*.webp");
std::string caption = LLTrans::getString("save_texture_image_files") + " (*.tga; *.png; *.webp)";
gtk_file_filter_set_name(gfilter_tga, LLTrans::getString("targa_image_files").c_str()); gtk_file_filter_set_name(gfilter_tga, LLTrans::getString("targa_image_files").c_str());
gtk_file_filter_set_name(gfilter_png, LLTrans::getString("png_image_files").c_str()); gtk_file_filter_set_name(gfilter_png, LLTrans::getString("png_image_files").c_str());
gtk_file_filter_set_name(gfilter_webp, LLTrans::getString("webp_image_files").c_str());
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker),
gfilter_png); gfilter_png);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker),
gfilter_tga); gfilter_tga);
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker),
gfilter_webp);
return caption; return caption;
} }
...@@ -1262,7 +1288,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ...@@ -1262,7 +1288,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
(picker, "image/png", LLTrans::getString("png_image_files") + " (*.png)"); (picker, "image/png", LLTrans::getString("png_image_files") + " (*.png)");
suggest_ext = ".png"; suggest_ext = ".png";
break; break;
case FFSAVE_TGAPNG: case FFSAVE_WEBP:
caption += add_simple_pattern_filter_to_gtkchooser
(picker, "*.webp", LLTrans::getString("webp_image_files") + " (*.webp)");
suggest_ext = ".webp";
break;
case FFSAVE_TGAPNGWEBP:
caption += add_save_texture_filter_to_gtkchooser(picker); caption += add_save_texture_filter_to_gtkchooser(picker);
suggest_ext = ".png"; suggest_ext = ".png";
break; break;
...@@ -1324,7 +1355,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ...@@ -1324,7 +1355,7 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
rtn = (getFileCount() == 1); rtn = (getFileCount() == 1);
if(rtn && filter == FFSAVE_TGAPNG) if(rtn && filter == FFSAVE_TGAPNGWEBP)
{ {
std::string selected_file = mFiles.back(); std::string selected_file = mFiles.back();
mFiles.pop_back(); mFiles.pop_back();
......
...@@ -110,7 +110,8 @@ class LLFilePicker ...@@ -110,7 +110,8 @@ class LLFilePicker
FFSAVE_PNG = 13, FFSAVE_PNG = 13,
FFSAVE_JPEG = 14, FFSAVE_JPEG = 14,
FFSAVE_SCRIPT = 15, FFSAVE_SCRIPT = 15,
FFSAVE_TGAPNG = 16 FFSAVE_TGAPNGWEBP = 16,
FFSAVE_WEBP = 17
}; };
// open the dialog. This is a modal operation // open the dialog. This is a modal operation
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "llimagetga.h" #include "llimagetga.h"
#include "llimagejpeg.h" #include "llimagejpeg.h"
#include "llimagepng.h" #include "llimagepng.h"
#include "llimagewebp.h"
/* time headers */ /* time headers */
#include <time.h> #include <time.h>
...@@ -109,6 +110,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename) ...@@ -109,6 +110,10 @@ LLLocalBitmap::LLLocalBitmap(std::string filename)
{ {
mExtension = ET_IMG_PNG; mExtension = ET_IMG_PNG;
} }
else if (temp_exten == "webp")
{
mExtension = ET_IMG_WEBP;
}
else else
{ {
LL_WARNS() << "File of no valid extension given, local bitmap creation aborted." << "\n" LL_WARNS() << "File of no valid extension given, local bitmap creation aborted." << "\n"
...@@ -324,6 +329,17 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg) ...@@ -324,6 +329,17 @@ bool LLLocalBitmap::decodeBitmap(LLPointer<LLImageRaw> rawimg)
break; break;
} }
case ET_IMG_WEBP:
{
LLPointer<LLImageWebP> webp_image = new LLImageWebP;
if (webp_image->load(mFilename) && webp_image->decode(rawimg, 0.0f))
{
rawimg->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
decode_successful = true;
}
break;
}
default: default:
{ {
// separating this into -several- LL_WARNS() calls because in the extremely unlikely case that this happens // separating this into -several- LL_WARNS() calls because in the extremely unlikely case that this happens
......
...@@ -80,7 +80,8 @@ class LLLocalBitmap ...@@ -80,7 +80,8 @@ class LLLocalBitmap
ET_IMG_BMP, ET_IMG_BMP,
ET_IMG_TGA, ET_IMG_TGA,
ET_IMG_JPG, ET_IMG_JPG,
ET_IMG_PNG ET_IMG_PNG,
ET_IMG_WEBP
}; };
private: /* members */ private: /* members */
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "llfloaterreg.h" #include "llfloaterreg.h"
#include "llimagetga.h" #include "llimagetga.h"
#include "llimagepng.h" #include "llimagepng.h"
#include "llimagewebp.h"
#include "llinventory.h" #include "llinventory.h"
#include "llinventorymodel.h" #include "llinventorymodel.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
...@@ -295,7 +296,7 @@ void LLPreviewTexture::saveAs() ...@@ -295,7 +296,7 @@ void LLPreviewTexture::saveAs()
return; return;
std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null; std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null;
(new LLFilePickerReplyThread(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename))->getFile(); (new LLFilePickerReplyThread(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNGWEBP, filename))->getFile();
} }
void LLPreviewTexture::saveTextureToFile(const std::vector<std::string>& filenames) void LLPreviewTexture::saveTextureToFile(const std::vector<std::string>& filenames)
...@@ -412,8 +413,12 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, ...@@ -412,8 +413,12 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
if( self && final && success ) if( self && final && success )
{ {
const U32 ext_length = 3; std::string extension;
std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length); size_t extpos = self->mSaveFileName.rfind(".");
if (extpos != std::string::npos)
{
extension = self->mSaveFileName.substr(extpos + 1);
}
// We only support saving in PNG or TGA format // We only support saving in PNG or TGA format
LLPointer<LLImageFormatted> image; LLPointer<LLImageFormatted> image;
...@@ -425,6 +430,10 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, ...@@ -425,6 +430,10 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
{ {
image = new LLImageTGA; image = new LLImageTGA;
} }
else if (extension == "webp")
{
image = new LLImageWebP;
}
if( image && !image->encode( src, 0 ) ) if( image && !image->encode( src, 0 ) )
{ {
......
...@@ -258,7 +258,7 @@ void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames) ...@@ -258,7 +258,7 @@ void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames)
#if LL_WINDOWS #if LL_WINDOWS
static std::string SOUND_EXTENSIONS = "wav"; static std::string SOUND_EXTENSIONS = "wav";
static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg png"; static std::string IMAGE_EXTENSIONS = "tga bmp jpg jpeg png webp";
static std::string ANIM_EXTENSIONS = "bvh anim"; static std::string ANIM_EXTENSIONS = "bvh anim";
#ifdef _CORY_TESTING #ifdef _CORY_TESTING
static std::string GEOMETRY_EXTENSIONS = "slg"; static std::string GEOMETRY_EXTENSIONS = "slg";
......
...@@ -563,7 +563,8 @@ http://secondlife.com/support for help fixing this problem. ...@@ -563,7 +563,8 @@ http://secondlife.com/support for help fixing this problem.
<string name="targa_image_files">Targa Images</string> <string name="targa_image_files">Targa Images</string>
<string name="bitmap_image_files">Bitmap Images</string> <string name="bitmap_image_files">Bitmap Images</string>
<string name="png_image_files">PNG Images</string> <string name="png_image_files">PNG Images</string>
<string name="save_texture_image_files">Targa or PNG Images</string> <string name="webp_image_files">WebP Images</string>
<string name="save_texture_image_files">Targa, PNG, or WebP Images</string>
<string name="avi_movie_file">AVI Movie File</string> <string name="avi_movie_file">AVI Movie File</string>
<string name="xaf_animation_file">XAF Anim File</string> <string name="xaf_animation_file">XAF Anim File</string>
<string name="xml_file">XML File</string> <string name="xml_file">XML File</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment