Commit 97f841d7 authored by Alex Newcomer's avatar Alex Newcomer Committed by Commit Bot

cros: Update image view size when the image changes

When FadeImageView changes images, update the image size.
This will prevent distorted images when HTML renders.

Bug: 1128721
Change-Id: I3144c4489fd667c3287cd24dbb069e748e7e8613
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2436861
Commit-Queue: Alex Newcomer <newcomer@chromium.org>
Reviewed-by: default avatarMatthew Mourgos <mmourgos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812293}
parent 087a8a8a
...@@ -49,10 +49,12 @@ class FadeImageView : public views::ImageView, ...@@ -49,10 +49,12 @@ class FadeImageView : public views::ImageView,
public ui::ImplicitAnimationObserver, public ui::ImplicitAnimationObserver,
public ClipboardHistoryResourceManager::Observer { public ClipboardHistoryResourceManager::Observer {
public: public:
FadeImageView(const ClipboardHistoryItem& clipboard_history_item, FadeImageView(ClipboardHistoryBitmapItemView* bitmap_item_view,
const ClipboardHistoryItem& clipboard_history_item,
const ClipboardHistoryResourceManager* resource_manager, const ClipboardHistoryResourceManager* resource_manager,
float opacity) float opacity)
: views::ImageView(), : views::ImageView(),
bitmap_item_view_(bitmap_item_view),
resource_manager_(resource_manager), resource_manager_(resource_manager),
clipboard_history_item_(clipboard_history_item), clipboard_history_item_(clipboard_history_item),
opacity_(opacity) { opacity_(opacity) {
...@@ -121,6 +123,11 @@ class FadeImageView : public views::ImageView, ...@@ -121,6 +123,11 @@ class FadeImageView : public views::ImageView,
} else { } else {
SetImage(image); SetImage(image);
} }
// When fading in a new image, the ImageView's image has likely changed
// sizes.
if (animation_state_ == FadeAnimationState::kFadeIn)
bitmap_item_view_->UpdateChildImageViewSize();
} }
// The different animation states possible when transitioning from one // The different animation states possible when transitioning from one
...@@ -134,6 +141,10 @@ class FadeImageView : public views::ImageView, ...@@ -134,6 +141,10 @@ class FadeImageView : public views::ImageView,
// The current animation state. // The current animation state.
FadeAnimationState animation_state_ = FadeAnimationState::kNoFadeAnimation; FadeAnimationState animation_state_ = FadeAnimationState::kNoFadeAnimation;
// The parent ClipboardHistoryBitmapItemView, used to notify of image changes.
// Owned by the view hierarchy.
ClipboardHistoryBitmapItemView* const bitmap_item_view_;
// The resource manager, owned by ClipboardHistoryController. // The resource manager, owned by ClipboardHistoryController.
const ClipboardHistoryResourceManager* const resource_manager_; const ClipboardHistoryResourceManager* const resource_manager_;
...@@ -193,6 +204,21 @@ ClipboardHistoryBitmapItemView::ClipboardHistoryBitmapItemView( ...@@ -193,6 +204,21 @@ ClipboardHistoryBitmapItemView::ClipboardHistoryBitmapItemView(
ClipboardHistoryBitmapItemView::~ClipboardHistoryBitmapItemView() = default; ClipboardHistoryBitmapItemView::~ClipboardHistoryBitmapItemView() = default;
void ClipboardHistoryBitmapItemView::UpdateChildImageViewSize() {
const gfx::Size image_size = image_view_->GetImage().size();
const double width_ratio = image_size.width() / double(width());
const double height_ratio = image_size.height() / double(height());
if (width_ratio <= 1.f || height_ratio <= 1.f) {
image_view_->SetImageSize(image_size);
return;
}
const double resize_ratio = std::fmin(width_ratio, height_ratio);
image_view_->SetImageSize(gfx::Size(image_size.width() / resize_ratio,
image_size.height() / resize_ratio));
}
const char* ClipboardHistoryBitmapItemView::GetClassName() const { const char* ClipboardHistoryBitmapItemView::GetClassName() const {
return "ClipboardHistoryBitmapItemView"; return "ClipboardHistoryBitmapItemView";
} }
...@@ -211,7 +237,7 @@ ClipboardHistoryBitmapItemView::CreateContentsView() { ...@@ -211,7 +237,7 @@ ClipboardHistoryBitmapItemView::CreateContentsView() {
void ClipboardHistoryBitmapItemView::OnBoundsChanged( void ClipboardHistoryBitmapItemView::OnBoundsChanged(
const gfx::Rect& previous_bounds) { const gfx::Rect& previous_bounds) {
image_view_->SetImageSize(CalculateTargetImageSize()); UpdateChildImageViewSize();
} }
std::unique_ptr<views::ImageView> std::unique_ptr<views::ImageView>
...@@ -220,8 +246,9 @@ ClipboardHistoryBitmapItemView::BuildImageView() { ...@@ -220,8 +246,9 @@ ClipboardHistoryBitmapItemView::BuildImageView() {
ClipboardHistoryUtil::CalculateMainFormat(clipboard_history_item_.data()) ClipboardHistoryUtil::CalculateMainFormat(clipboard_history_item_.data())
.value()) { .value()) {
case ui::ClipboardInternalFormat::kHtml: case ui::ClipboardInternalFormat::kHtml:
return std::make_unique<FadeImageView>( return std::make_unique<FadeImageView>(this, clipboard_history_item_,
clipboard_history_item_, resource_manager_, GetContentsOpacity()); resource_manager_,
GetContentsOpacity());
case ui::ClipboardInternalFormat::kBitmap: { case ui::ClipboardInternalFormat::kBitmap: {
auto image_view = std::make_unique<views::ImageView>(); auto image_view = std::make_unique<views::ImageView>();
gfx::ImageSkia bitmap_image = gfx::ImageSkia::CreateFrom1xBitmap( gfx::ImageSkia bitmap_image = gfx::ImageSkia::CreateFrom1xBitmap(
...@@ -239,17 +266,4 @@ ClipboardHistoryBitmapItemView::BuildImageView() { ...@@ -239,17 +266,4 @@ ClipboardHistoryBitmapItemView::BuildImageView() {
} }
} }
gfx::Size ClipboardHistoryBitmapItemView::CalculateTargetImageSize() const {
const gfx::Size image_size = image_view_->GetImage().size();
const double width_ratio = image_size.width() / double(width());
const double height_ratio = image_size.height() / double(height());
if (width_ratio <= 1.f || height_ratio <= 1.f)
return image_size;
const double resize_ratio = std::fmin(width_ratio, height_ratio);
return gfx::Size(image_size.width() / resize_ratio,
image_size.height() / resize_ratio);
}
} // namespace ash } // namespace ash
...@@ -29,6 +29,9 @@ class ClipboardHistoryBitmapItemView : public ClipboardHistoryItemView { ...@@ -29,6 +29,9 @@ class ClipboardHistoryBitmapItemView : public ClipboardHistoryItemView {
const ClipboardHistoryBitmapItemView& rhs) = delete; const ClipboardHistoryBitmapItemView& rhs) = delete;
~ClipboardHistoryBitmapItemView() override; ~ClipboardHistoryBitmapItemView() override;
// Updates |image_view_|'s size.
void UpdateChildImageViewSize();
private: private:
class BitmapContentsView; class BitmapContentsView;
...@@ -40,9 +43,6 @@ class ClipboardHistoryBitmapItemView : public ClipboardHistoryItemView { ...@@ -40,9 +43,6 @@ class ClipboardHistoryBitmapItemView : public ClipboardHistoryItemView {
// Builds `image_view_`. // Builds `image_view_`.
std::unique_ptr<views::ImageView> BuildImageView(); std::unique_ptr<views::ImageView> BuildImageView();
// Calculates the target size of the image to show.
gfx::Size CalculateTargetImageSize() const;
// Owned by view hierarchy. // Owned by view hierarchy.
views::ImageView* image_view_ = nullptr; views::ImageView* image_view_ = nullptr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment