Index: chrome/browser/enhanced_bookmarks/android/bookmark_image_service_android.cc |
diff --git a/chrome/browser/enhanced_bookmarks/android/bookmark_image_service_android.cc b/chrome/browser/enhanced_bookmarks/android/bookmark_image_service_android.cc |
index 5671c783b2578bf443d94d567e3a09454003bfe0..b46ac671e0aac010d4a04c7e6bd162d576ec12b0 100644 |
--- a/chrome/browser/enhanced_bookmarks/android/bookmark_image_service_android.cc |
+++ b/chrome/browser/enhanced_bookmarks/android/bookmark_image_service_android.cc |
@@ -18,7 +18,10 @@ |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/referrer.h" |
#include "net/base/load_flags.h" |
+#include "skia/ext/image_operations.h" |
+#include "ui/base/device_form_factor.h" |
#include "ui/base/resource/resource_bundle.h" |
+#include "ui/gfx/android/device_display_info.h" |
#include "ui/gfx/image/image_skia.h" |
using content::Referrer; |
@@ -33,6 +36,30 @@ BookmarkImageServiceAndroid::BookmarkImageServiceAndroid( |
EnhancedBookmarkModelFactory::GetForBrowserContext(browserContext), |
make_scoped_refptr(content::BrowserThread::GetBlockingPool())), |
browser_context_(browserContext) { |
+ // The images we're saving will be used locally. So it's wasteful to store |
+ // images larger than the device resolution. |
+ gfx::DeviceDisplayInfo display_info; |
+ int max_length = std::min(display_info.GetPhysicalDisplayWidth(), |
+ display_info.GetPhysicalDisplayHeight()); |
+ // GetPhysicalDisplay*() returns 0 for pre-JB MR1. If so, fall back to the |
+ // second best option we have. |
+ if (max_length == 0) { |
+ max_length = std::min(display_info.GetDisplayWidth(), |
+ display_info.GetDisplayHeight()); |
+ } |
+ |
+ if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET) { |
+ max_length = max_length / 2; |
+ } else if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_PHONE) { |
+ max_length = max_length * 3 / 4; |
+ } |
+ |
+ DCHECK(max_length > 0); |
+ max_size_.set_height(max_length); |
+ max_size_.set_width(max_length); |
+} |
+ |
+BookmarkImageServiceAndroid::~BookmarkImageServiceAndroid() { |
} |
void BookmarkImageServiceAndroid::RetrieveSalientImage( |
@@ -45,7 +72,7 @@ void BookmarkImageServiceAndroid::RetrieveSalientImage( |
enhanced_bookmark_model_->bookmark_model() |
->GetMostRecentlyAddedUserNodeForURL(page_url); |
if (!bookmark || !image_url.is_valid()) { |
- ProcessNewImage(page_url, update_bookmark, gfx::Image(), image_url); |
+ ProcessNewImage(page_url, update_bookmark, image_url, gfx::Image()); |
return; |
} |
@@ -184,6 +211,28 @@ void BookmarkImageServiceAndroid::RetrieveSalientImageFromContextCallback( |
referrer_policy, update_bookmark); |
} |
+gfx::Image BookmarkImageServiceAndroid::ResizeImage(gfx::Image image) { |
+ DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ |
+ gfx::Image resized_image = image; |
+ if (image.Width() > max_size_.width() && |
+ image.Height() > max_size_.height()) { |
+ float resize_ratio = std::min(((float)max_size_.width()) / image.Width(), |
+ ((float)max_size_.height()) / image.Height()); |
noyau (Ping after 24h)
2015/02/26 12:56:11
This should be std::max, not std::min. What you ar
|
+ // +0.5f is for correct rounding. Without it, it's possible that dest_width |
+ // is smaller than max_size_.Width() by one. |
+ int dest_width = static_cast<int>(resize_ratio * image.Width() + 0.5f); |
+ int dest_height = static_cast<int>(resize_ratio * image.Height() + 0.5f); |
+ |
+ resized_image = |
+ gfx::Image::CreateFrom1xBitmap(skia::ImageOperations::Resize( |
+ image.AsBitmap(), skia::ImageOperations::RESIZE_BEST, dest_width, |
+ dest_height)); |
+ resized_image.AsImageSkia().MakeThreadSafe(); |
+ } |
+ return resized_image; |
+} |
+ |
void BookmarkImageServiceAndroid::BitmapFetcherHandler::Start( |
content::BrowserContext* browser_context, |
const std::string& referrer, |
@@ -209,7 +258,7 @@ void BookmarkImageServiceAndroid::BitmapFetcherHandler::OnFetchComplete( |
imageSkia.MakeThreadSafe(); |
image = gfx::Image(imageSkia); |
} |
- service_->ProcessNewImage(page_url_, update_bookmark_, image, url); |
+ service_->ProcessNewImage(page_url_, update_bookmark_, url, image); |
delete this; |
} |