From 5c7b29920e8ed409e7c8d87e52a1d0f35b2a14b2 Mon Sep 17 00:00:00 2001
From: AndreyL ProductEngine <andreylproductengine@lindenlab.com>
Date: Tue, 26 May 2015 07:27:36 +0300
Subject: MAINT-5096 FIXED Camming is broken in freeze frame mode once snapshot
 is refreshed... Fix for freezing by ticking the "Freeze frame" checkbox

---
 indra/newview/llfloatersnapshot.cpp     |  8 +++-
 indra/newview/llsnapshotlivepreview.cpp | 76 +++++++++++++++++++--------------
 indra/newview/llsnapshotlivepreview.h   |  2 +-
 3 files changed, 51 insertions(+), 35 deletions(-)

diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 16fa4684ab..afec981d56 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -663,14 +663,20 @@ void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data)
 {
 	LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl;
 	LLFloaterSnapshot *view = (LLFloaterSnapshot *)data;
+	LLSnapshotLivePreview* previewp = getPreviewView(view);
 		
-	if (!view || !check_box)
+	if (!view || !check_box || !previewp)
 	{
 		return;
 	}
 
 	gSavedSettings.setBOOL("UseFreezeFrame", check_box->get());
 
+	if (check_box->get())
+	{
+		previewp->prepareFreezeFrame();
+	}
+
 	updateLayout(view);
 }
 
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index abab3174cd..6af9d61a54 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -750,40 +750,9 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
             // Full size preview is set: get the decoded image result and save it for animation
             if (gSavedSettings.getBOOL("UseFreezeFrame") && previewp->mAllowFullScreenPreview)
             {
-                // Get the decoded version of the formatted image
-                previewp->getEncodedImage();
-            
-                // We need to scale that a bit for display...
-                LLPointer<LLImageRaw> scaled = new LLImageRaw(
-                    previewp->mPreviewImageEncoded->getData(),
-                    previewp->mPreviewImageEncoded->getWidth(),
-                    previewp->mPreviewImageEncoded->getHeight(),
-                    previewp->mPreviewImageEncoded->getComponents());
-
-                if (!scaled->isBufferInvalid())
-                {
-                    // leave original image dimensions, just scale up texture buffer
-                    if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024)
-                    {
-                        // go ahead and shrink image to appropriate power of 2 for display
-                        scaled->biasedScaleToPowerOfTwo(1024);
-                        previewp->setImageScaled(TRUE);
-                    }
-                    else
-                    {
-                        // expand image but keep original image data intact
-                        scaled->expandToPowerOfTwo(1024, FALSE);
-                    }
-
-                    previewp->mViewerImage[previewp->mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE);
-                    LLPointer<LLViewerTexture> curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex];
-                    gGL.getTexUnit(0)->bind(curr_preview_image);
-                    curr_preview_image->setFilteringOption(previewp->getSnapshotType() == SNAPSHOT_TEXTURE ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT);
-                    curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP);
-
-                    previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
-                }
+                previewp->prepareFreezeFrame();
             }
+
             // The snapshot is updated now...
             previewp->mSnapshotUpToDate = TRUE;
         
@@ -811,6 +780,47 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 	return TRUE;
 }
 
+void LLSnapshotLivePreview::prepareFreezeFrame()
+{
+    // Get the decoded version of the formatted image
+    getEncodedImage();
+
+    // We need to scale that a bit for display...
+    LLPointer<LLImageRaw> scaled = new LLImageRaw(
+        mPreviewImageEncoded->getData(),
+        mPreviewImageEncoded->getWidth(),
+        mPreviewImageEncoded->getHeight(),
+        mPreviewImageEncoded->getComponents());
+
+    if (!scaled->isBufferInvalid())
+    {
+        // leave original image dimensions, just scale up texture buffer
+        if (mPreviewImageEncoded->getWidth() > 1024 || mPreviewImageEncoded->getHeight() > 1024)
+        {
+            // go ahead and shrink image to appropriate power of 2 for display
+            scaled->biasedScaleToPowerOfTwo(1024);
+            setImageScaled(TRUE);
+        }
+        else
+        {
+            // expand image but keep original image data intact
+            scaled->expandToPowerOfTwo(1024, FALSE);
+        }
+
+        mViewerImage[mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE);
+        LLPointer<LLViewerTexture> curr_preview_image = mViewerImage[mCurImageIndex];
+        gGL.getTexUnit(0)->bind(curr_preview_image);
+        curr_preview_image->setFilteringOption(getSnapshotType() == SNAPSHOT_TEXTURE ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT);
+        curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP);
+
+
+        if (gSavedSettings.getBOOL("UseFreezeFrame") && mAllowFullScreenPreview)
+        {
+            mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
+        }
+    }
+}
+
 S32 LLSnapshotLivePreview::getEncodedImageWidth() const
 {
     S32 width = getWidth();
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index fed33bf37c..57e5d83f8e 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -119,7 +119,7 @@ public:
 	void generateThumbnailImage(BOOL force_update = FALSE) ;
 	void resetThumbnailImage() { mThumbnailImage = NULL ; }
 	void drawPreviewRect(S32 offset_x, S32 offset_y) ;
-
+	void prepareFreezeFrame();
     
 	LLViewerTexture* getBigThumbnailImage();
 	S32  getBigThumbnailWidth() const { return mBigThumbnailWidth ; }
-- 
cgit v1.2.3