summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llfloaterfacebook.cpp36
-rw-r--r--indra/newview/llfloaterfacebook.h2
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp10
-rw-r--r--indra/newview/llsnapshotlivepreview.h2
-rw-r--r--indra/newview/skins/default/xui/en/panel_facebook_photo.xml4
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"