From d39b5c51f3a7cd36a4dc86423ce099e421263bcc Mon Sep 17 00:00:00 2001 From: elektrahesse Date: Wed, 13 Oct 2010 04:09:26 +0200 Subject: Added support for upload and local usage of PSD (Photoshop, including layers and native transparency) and TIFF images (including alpha channel) on any Intel Mac using native Quartz/vImage routines --- linden/indra/llimage/llimage.h | 6 ++++ linden/indra/llwindow/llwindowmacosx-objc.mm | 45 ++++++++++++++++-------- linden/indra/newview/floaterlocalassetbrowse.cpp | 4 +++ linden/indra/newview/floaterlocalassetbrowse.h | 4 +++ linden/indra/newview/llfilepicker.cpp | 4 +++ linden/indra/newview/llfloaterimagepreview.cpp | 10 ++++++ linden/indra/newview/llviewermenufile.cpp | 32 +++++++++++++++++ 7 files changed, 90 insertions(+), 15 deletions(-) (limited to 'linden/indra') diff --git a/linden/indra/llimage/llimage.h b/linden/indra/llimage/llimage.h index 2bc62fb..fd8d128 100644 --- a/linden/indra/llimage/llimage.h +++ b/linden/indra/llimage/llimage.h @@ -73,7 +73,13 @@ typedef enum e_image_codec IMG_CODEC_JPEG = 5, IMG_CODEC_DXT = 6, IMG_CODEC_PNG = 7, +#ifdef LL_DARWIN + IMG_CODEC_PSD = 8, + IMG_CODEC_TIFF = 9, + IMG_CODEC_EOF = 10 +#else IMG_CODEC_EOF = 8 +#endif } EImageCodec; //============================================================================ diff --git a/linden/indra/llwindow/llwindowmacosx-objc.mm b/linden/indra/llwindow/llwindowmacosx-objc.mm index 5f33764..e961070 100644 --- a/linden/indra/llwindow/llwindowmacosx-objc.mm +++ b/linden/indra/llwindow/llwindowmacosx-objc.mm @@ -49,7 +49,7 @@ BOOL decodeImageQuartz(const UInt8* data, int len, LLImageRaw *raw_image) CFDataRef theData = CFDataCreate(kCFAllocatorDefault, data, len); CGImageSourceRef srcRef = CGImageSourceCreateWithData(theData, NULL); CGImageRef image_ref = CGImageSourceCreateImageAtIndex(srcRef, 0, NULL); - + CFShow(CGImageGetColorSpace(image_ref)); size_t width = CGImageGetWidth(image_ref); size_t height = CGImageGetHeight(image_ref); size_t comps = CGImageGetBitsPerPixel(image_ref) / 8; @@ -58,29 +58,44 @@ BOOL decodeImageQuartz(const UInt8* data, int len, LLImageRaw *raw_image) UInt8* bitmap = (UInt8*)CFDataGetBytePtr(result); CGImageAlphaInfo format = CGImageGetAlphaInfo(image_ref); - if (format & kCGImageAlphaPremultipliedFirst) + if (format != kCGImageAlphaNone) { vImage_Buffer vb; vb.data = bitmap; vb.height = height; vb.width = width; vb.rowBytes = bytes_per_row; - llinfos << "Unpremultiplying ARGB888" << llendl; - vImageUnpremultiplyData_ARGB8888(&vb, &vb, 0); - } - else if (format & kCGImageAlphaPremultipliedLast) - { - vImage_Buffer vb; - vb.data = bitmap; - vb.height = height; - vb.width = width; - vb.rowBytes = bytes_per_row; - llinfos << "Unpremultiplying RGBA888" << llendl; - vImageUnpremultiplyData_RGBA8888(&vb, &vb, 0); + + if (format & kCGImageAlphaPremultipliedFirst) + { + // Ele: ARGB -> BGRA on Intel, need to first reorder the bytes, then unpremultiply as RGBA :) + llinfos << "Unpremultiplying BGRA8888" << llendl; + + for (int i=0; iresize(width, height, comps); - llinfos << "Decoding an image of width: " << width << " and height: " << height << " and components: " << comps << llendl; memcpy(raw_image->getData(), bitmap, height * bytes_per_row); raw_image->verticalFlip(); diff --git a/linden/indra/newview/floaterlocalassetbrowse.cpp b/linden/indra/newview/floaterlocalassetbrowse.cpp index 443b5bf..991d2fd 100644 --- a/linden/indra/newview/floaterlocalassetbrowse.cpp +++ b/linden/indra/newview/floaterlocalassetbrowse.cpp @@ -119,6 +119,10 @@ LocalBitmap::LocalBitmap(std::string fullpath) else if (temp_exten == "tga") { this->extension = IMG_EXTEN_TGA; } else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; } else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; } +#ifdef LL_DARWIN + else if (temp_exten == "psd") { this->extension = IMG_EXTEN_PSD; } + else if (temp_exten == "tif" || temp_exten == "tiff") { this->extension = IMG_EXTEN_TIFF; } +#endif else { return; } // no valid extension. /* getting file's last modified */ diff --git a/linden/indra/newview/floaterlocalassetbrowse.h b/linden/indra/newview/floaterlocalassetbrowse.h index e02a7d3..69afe98 100644 --- a/linden/indra/newview/floaterlocalassetbrowse.h +++ b/linden/indra/newview/floaterlocalassetbrowse.h @@ -114,6 +114,10 @@ class LocalBitmap IMG_EXTEN_TGA, IMG_EXTEN_JPG, IMG_EXTEN_PNG +#ifdef LL_DARWIN + ,IMG_EXTEN_PSD, + IMG_EXTEN_TIFF +#endif }; enum bitmap_type diff --git a/linden/indra/newview/llfilepicker.cpp b/linden/indra/newview/llfilepicker.cpp index 40b1abb..a59fa06 100644 --- a/linden/indra/newview/llfilepicker.cpp +++ b/linden/indra/newview/llfilepicker.cpp @@ -532,12 +532,16 @@ Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callB { if (fileInfo.filetype != 'JPEG' && fileInfo.filetype != 'JPG ' && fileInfo.filetype != 'BMP ' && fileInfo.filetype != 'TGA ' && + fileInfo.filetype != 'TIFF' && fileInfo.filetype != 'PSD ' && fileInfo.filetype != 'BMPf' && fileInfo.filetype != 'TPIC' && fileInfo.filetype != 'PNG ' && (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("jpeg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("jpg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("bmp"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("tga"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && + CFStringCompare(fileInfo.extension, CFSTR("psd"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && + CFStringCompare(fileInfo.extension, CFSTR("tiff"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && + CFStringCompare(fileInfo.extension, CFSTR("tif"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("png"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) ) { diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp index 389bd5a..8142869 100644 --- a/linden/indra/newview/llfloaterimagepreview.cpp +++ b/linden/indra/newview/llfloaterimagepreview.cpp @@ -355,6 +355,16 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename) { codec = IMG_CODEC_PNG; } +#ifdef LL_DARWIN + else if( exten == "psd" ) + { + codec = IMG_CODEC_PSD; + } + else if( exten == "tif" || exten == "tiff" ) + { + codec = IMG_CODEC_TIFF; + } +#endif LLPointer raw_image = new LLImageRaw; #ifdef LL_DARWIN diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp index 432fcc5..1981bb9 100644 --- a/linden/indra/newview/llviewermenufile.cpp +++ b/linden/indra/newview/llviewermenufile.cpp @@ -640,6 +640,38 @@ void upload_new_resource(const std::string& src_filename, std::string name, return; } } +#ifdef LL_DARWIN + else if(exten == "psd") + { + asset_type = LLAssetType::AT_TEXTURE; + if (!LLViewerImageList::createUploadFile(src_filename, + filename, + IMG_CODEC_PSD )) + { + error_message = llformat("Problem with file %s:\n\n%s\n", + src_filename.c_str(), LLImage::getLastError().c_str()); + args["FILE"] = src_filename; + args["ERROR"] = LLImage::getLastError(); + upload_error(error_message, "ProblemWithFile", filename, args); + return; + } + } + else if(exten == "tif" || exten == "tiff") + { + asset_type = LLAssetType::AT_TEXTURE; + if (!LLViewerImageList::createUploadFile(src_filename, + filename, + IMG_CODEC_TIFF )) + { + error_message = llformat("Problem with file %s:\n\n%s\n", + src_filename.c_str(), LLImage::getLastError().c_str()); + args["FILE"] = src_filename; + args["ERROR"] = LLImage::getLastError(); + upload_error(error_message, "ProblemWithFile", filename, args); + return; + } + } +#endif else if(exten == "wav") { asset_type = LLAssetType::AT_SOUND; // tag it as audio -- cgit v1.1