summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorMerov Linden <merov@lindenlab.com>2014-02-25 23:01:52 -0800
committerMerov Linden <merov@lindenlab.com>2014-02-25 23:01:52 -0800
commit6dfcd7fc2bd0f502673c43f1a54cda2a8d74e391 (patch)
treead45a1abd388e6803cf19ca6eaacc596c01d9c23 /indra/newview
parentd220657d8525ccfa246e0f49904e18cc36458b28 (diff)
ACME-1327 : WIP : Added computation of the big preview, allow big preview to be resizable
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llfloaterbigpreview.cpp8
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp54
-rw-r--r--indra/newview/llsnapshotlivepreview.h10
-rw-r--r--indra/newview/skins/default/xui/en/floater_big_preview.xml2
4 files changed, 66 insertions, 8 deletions
diff --git a/indra/newview/llfloaterbigpreview.cpp b/indra/newview/llfloaterbigpreview.cpp
index 84a1523e7c..d5f25d5f95 100644
--- a/indra/newview/llfloaterbigpreview.cpp
+++ b/indra/newview/llfloaterbigpreview.cpp
@@ -78,7 +78,7 @@ void LLFloaterBigPreview::draw()
// Display the preview if one is available
// HACK!!! We use the puny thumbnail image for the moment
// *TODO : Use the real large preview
- if (previewp && previewp->getThumbnailImage())
+ if (previewp && previewp->getBigThumbnailImage())
{
const LLRect& preview_rect = mPreviewPlaceholder->getRect();
// const S32 thumbnail_w = previewp->getThumbnailWidth();
@@ -93,9 +93,7 @@ void LLFloaterBigPreview::draw()
// calc preview offset within the floater rect
S32 offset_x = preview_rect.mLeft + local_offset_x;
S32 offset_y = preview_rect.mBottom + local_offset_y;
-
- //llinfos << "Merov : draw, offset x = " << offset_x << ", y = " << offset_y << ", thumbnail w = " << thumbnail_w << ", h = " << thumbnail_h << ", rect w = " << preview_rect.getWidth() << ", h = " << preview_rect.getHeight() << llendl;
-
+
gGL.matrixMode(LLRender::MM_MODELVIEW);
// Apply floater transparency to the texture unless the floater is focused.
F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
@@ -103,7 +101,7 @@ void LLFloaterBigPreview::draw()
gl_draw_scaled_image(offset_x, offset_y,
//thumbnail_w, thumbnail_h,
preview_rect.getWidth(), preview_rect.getHeight(),
- previewp->getThumbnailImage(), color % alpha);
+ previewp->getBigThumbnailImage(), color % alpha);
}
}
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index eef4ed78c8..2ab00419f9 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -75,7 +75,8 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param
mColor(1.f, 0.f, 0.f, 0.5f),
mCurImageIndex(0),
mPreviewImage(NULL),
- mThumbnailImage(NULL) ,
+ mThumbnailImage(NULL) ,
+ mBigThumbnailImage(NULL) ,
mThumbnailWidth(0),
mThumbnailHeight(0),
mThumbnailSubsampled(FALSE),
@@ -115,6 +116,7 @@ LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Param
mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ;
mThumbnailUpdateLock = FALSE ;
mThumbnailUpToDate = FALSE ;
+ mBigThumbnailUpToDate = FALSE ;
}
LLSnapshotLivePreview::~LLSnapshotLivePreview()
@@ -205,6 +207,7 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail
if (new_thumbnail)
{
mThumbnailUpToDate = FALSE ;
+ mBigThumbnailUpToDate = FALSE;
}
}
@@ -602,6 +605,55 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update)
mThumbnailUpdateLock = FALSE ;
}
+LLViewerTexture* LLSnapshotLivePreview::getBigThumbnailImage()
+{
+ if (mThumbnailUpdateLock) //in the process of updating
+ {
+ return NULL;
+ }
+ if (mBigThumbnailUpToDate && mBigThumbnailImage)//already updated
+ {
+ return mBigThumbnailImage;
+ }
+
+ LLPointer<LLImageRaw> raw = new LLImageRaw;
+
+ // The big thumbnail is be a subsampled version of the preview (used in SL Share previews, i.e. Flickr, Twitter, Facebook)
+ raw->resize( mPreviewImage->getWidth(),
+ mPreviewImage->getHeight(),
+ mPreviewImage->getComponents());
+ raw->copy(mPreviewImage);
+ // Scale to the big thumbnail size
+ if (!raw->scale(getBigThumbnailWidth(), getBigThumbnailHeight()))
+ {
+ raw = NULL ;
+ }
+
+ if (raw)
+ {
+ // Filter
+ // Note: filtering needs to be done *before* the scaling to power of 2 or the effect is distorted
+ if (getFilter() != "")
+ {
+ std::string filter_path = LLImageFiltersManager::getInstance()->getFilterPath(getFilter());
+ if (filter_path != "")
+ {
+ LLImageFilter filter(filter_path);
+ filter.executeFilter(raw);
+ }
+ else
+ {
+ llwarns << "Couldn't find a path to the following filter : " << getFilter() << llendl;
+ }
+ }
+ // Scale to a power of 2 so it can be mapped to a texture
+ raw->expandToPowerOfTwo();
+ mBigThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE);
+ mBigThumbnailUpToDate = TRUE ;
+ }
+
+ return mBigThumbnailImage ;
+}
// Called often. Checks whether it's time to grab a new snapshot and if so, does it.
// Returns TRUE if new snapshot generated, FALSE otherwise.
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 1b7b5290f8..baf3531e69 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -120,6 +120,11 @@ public:
void resetThumbnailImage() { mThumbnailImage = NULL ; }
void drawPreviewRect(S32 offset_x, S32 offset_y) ;
+
+ LLViewerTexture* getBigThumbnailImage();
+ S32 getBigThumbnailWidth() const { return 3*mThumbnailWidth ; }
+ S32 getBigThumbnailHeight() const { return 3*mThumbnailHeight ; }
+
// Returns TRUE when snapshot generated, FALSE otherwise.
static BOOL onIdle( void* snapshot_preview );
@@ -145,7 +150,10 @@ private:
BOOL mThumbnailUpdateLock ;
BOOL mThumbnailUpToDate ;
LLRect mThumbnailPlaceholderRect;
- BOOL mThumbnailSubsampled; // TRUE is the thumbnail is a subsampled version of the mPreviewImage
+ BOOL mThumbnailSubsampled; // TRUE if the thumbnail is a subsampled version of the mPreviewImage
+
+ LLPointer<LLViewerTexture> mBigThumbnailImage ;
+ BOOL mBigThumbnailUpToDate;
S32 mCurImageIndex;
// The logic is mPreviewImage (raw frame) -> mFormattedImage (formatted / filtered) -> mPreviewImageEncoded (decoded back, to show artifacts)
diff --git a/indra/newview/skins/default/xui/en/floater_big_preview.xml b/indra/newview/skins/default/xui/en/floater_big_preview.xml
index 23698ccc40..c0bdd3d9bd 100644
--- a/indra/newview/skins/default/xui/en/floater_big_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_big_preview.xml
@@ -2,7 +2,7 @@
<floater
positioning="cascading"
can_close="true"
- can_resize="false"
+ can_resize="true"
can_minimize="false"
help_topic="floater_big_preview"
layout="topleft"