diff options
| -rw-r--r-- | indra/newview/llfloaterfacebook.cpp | 36 | ||||
| -rw-r--r-- | indra/newview/llfloaterfacebook.h | 2 | ||||
| -rw-r--r-- | indra/newview/llsnapshotlivepreview.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llsnapshotlivepreview.h | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_facebook_photo.xml | 4 | 
5 files changed, 47 insertions, 7 deletions
| diff --git a/indra/newview/llfloaterfacebook.cpp b/indra/newview/llfloaterfacebook.cpp index 6488e7ea00..09cc14f6db 100644 --- a/indra/newview/llfloaterfacebook.cpp +++ b/indra/newview/llfloaterfacebook.cpp @@ -59,6 +59,13 @@ const std::string DEFAULT_CHECKIN_ICON_URL = "http://map.secondlife.com.s3.amazo  const std::string DEFAULT_CHECKIN_QUERY_PARAMETERS = "?sourceid=slshare_checkin&utm_source=facebook&utm_medium=checkin&utm_campaign=slshare";  const std::string DEFAULT_PHOTO_QUERY_PARAMETERS = "?sourceid=slshare_photo&utm_source=facebook&utm_medium=photo&utm_campaign=slshare"; +const S32 MAX_QUALITY = 100;        // Max quality value for jpeg images +const S32 MIN_QUALITY = 0;          // Min quality value for jpeg images +const S32 TARGET_DATA_SIZE = 95000; // Size of the image (compressed) we're trying to send to Facebook +const S32 MAX_DATA_SIZE = 98000;    // Max size of the image (compressed) sent to Facebook +const S32 QUALITY_DECREMENT = 5;    // Value we use to ratchet the quality down if we're over MAX_DATA_SIZE + +  std::string get_map_url()  {      LLVector3d center_agent; @@ -73,6 +80,14 @@ std::string get_map_url()      return map_url;  } +// Compute target jpeg quality : see https://wiki.lindenlab.com/wiki/Facebook_Image_Quality for details +S32 compute_jpeg_quality(S32 width, S32 height) +{ +    F32 target_compression_ratio = (F32)(width * height * 3) / (F32)(TARGET_DATA_SIZE); +    S32 quality = (S32)(110.0f - (2.0f * target_compression_ratio)); +    return llclamp(quality,MIN_QUALITY,MAX_QUALITY); +} +  ///////////////////////////  //LLFacebookStatusPanel//////  /////////////////////////// @@ -173,7 +188,8 @@ mWorkingLabel(NULL),  mThumbnailPlaceholder(NULL),  mCaptionTextBox(NULL),  mLocationCheckbox(NULL), -mPostButton(NULL) +mPostButton(NULL), +mQuality(MAX_QUALITY)  {  	mCommitCallbackRegistrar.add("SocialSharing.SendPhoto", boost::bind(&LLFacebookPhotoPanel::onSend, this));  	mCommitCallbackRegistrar.add("SocialSharing.RefreshPhoto", boost::bind(&LLFacebookPhotoPanel::onClickNewSnapshot, this)); @@ -285,10 +301,11 @@ void LLFacebookPhotoPanel::onVisibilityChange(const LLSD& new_visibility)  			p.rect(full_screen_rect);  			LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p);  			mPreviewHandle = previewp->getHandle();	 +            mQuality = MAX_QUALITY;  			previewp->setSnapshotType(previewp->SNAPSHOT_WEB);  			previewp->setSnapshotFormat(LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); -			//previewp->setSnapshotQuality(98); +			previewp->setSnapshotQuality(mQuality, false);  			previewp->setThumbnailPlaceholderRect(mThumbnailPlaceholder->getRect());  			updateControls(); @@ -399,6 +416,11 @@ void LLFacebookPhotoPanel::updateControls()  	if (got_snap)  	{  		LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); +        if (previewp->getDataSize() >= MAX_DATA_SIZE) +        { +            // If size too big, change mQuality +            mQuality -= QUALITY_DECREMENT; +        }  	}  	//getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : getString("unknown")); <---uses localized string @@ -445,8 +467,14 @@ void LLFacebookPhotoPanel::updateResolution(BOOL do_update)  		checkAspectRatio(width);  		previewp->getSize(width, height); +        if (do_update || (mQuality == MAX_QUALITY)) +        { +            // Recompute quality setting if the update is requested by the UI or if quality has been reset +            mQuality = compute_jpeg_quality(width, height); +        } +        bool quality_reset = previewp->setSnapshotQuality(mQuality, false); -		if(original_width != width || original_height != height) +		if (original_width != width || original_height != height || quality_reset)  		{  			previewp->setSize(width, height); @@ -454,7 +482,7 @@ void LLFacebookPhotoPanel::updateResolution(BOOL do_update)  			lldebugs << "updating thumbnail" << llendl;  			previewp->updateSnapshot(FALSE, TRUE); -			if(do_update) +			if (do_update || quality_reset)  			{  				lldebugs << "Will update controls" << llendl;  				updateControls(); diff --git a/indra/newview/llfloaterfacebook.h b/indra/newview/llfloaterfacebook.h index ab6420264b..0776f24034 100644 --- a/indra/newview/llfloaterfacebook.h +++ b/indra/newview/llfloaterfacebook.h @@ -88,6 +88,8 @@ private:  	LLUICtrl * mLocationCheckbox;  	LLUICtrl * mPostButton;  	LLUICtrl* mCancelButton; +     +    S32 mQuality;       // Compression quality  };  class LLFacebookCheckinPanel : public LLPanel diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 9feeea1644..7f578975db 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -222,15 +222,21 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail  	}  } -void LLSnapshotLivePreview::setSnapshotQuality(S32 quality) +// Return true if the quality has been changed, false otherwise +bool LLSnapshotLivePreview::setSnapshotQuality(S32 quality, bool set_by_user)  {  	llclamp(quality, 0, 100);  	if (quality != mSnapshotQuality)  	{  		mSnapshotQuality = quality; -		gSavedSettings.setS32("SnapshotQuality", quality); +        if (set_by_user) +        { +            gSavedSettings.setS32("SnapshotQuality", quality); +        }  		mSnapshotUpToDate = FALSE; +        return true;  	} +    return false;  }  void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y) diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h index fe3d257b02..0c63bf47c7 100644 --- a/indra/newview/llsnapshotlivepreview.h +++ b/indra/newview/llsnapshotlivepreview.h @@ -93,7 +93,7 @@ public:  	void setSnapshotType(ESnapshotType type) { mSnapshotType = type; }  	void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } -	void setSnapshotQuality(S32 quality); +	bool setSnapshotQuality(S32 quality, bool set_by_user = true);  	void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }  	void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);  	void saveWeb(); diff --git a/indra/newview/skins/default/xui/en/panel_facebook_photo.xml b/indra/newview/skins/default/xui/en/panel_facebook_photo.xml index 19f9f2fb74..2d46665bae 100644 --- a/indra/newview/skins/default/xui/en/panel_facebook_photo.xml +++ b/indra/newview/skins/default/xui/en/panel_facebook_photo.xml @@ -39,6 +39,10 @@                 label="1024x768"                 name="1024x768"                 value="[i1024,i768]" /> +              <combo_box.item +               label="1200x630" +               name="1200x630" +               value="[i1200,i630]" />              </combo_box>              <text               follows="left|top" | 
