1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/message_center/views/proportional_image_view.h"
6
7#include "ui/gfx/canvas.h"
8#include "ui/message_center/message_center_style.h"
9
10namespace message_center {
11
12ProportionalImageView::ProportionalImageView(const gfx::ImageSkia& image,
13                                             const gfx::Size& max_size)
14    : image_(image), max_size_(max_size) {}
15
16ProportionalImageView::~ProportionalImageView() {}
17
18gfx::Size ProportionalImageView::GetPreferredSize() const { return max_size_; }
19
20int ProportionalImageView::GetHeightForWidth(int width) const {
21  return max_size_.height();
22}
23
24void ProportionalImageView::OnPaint(gfx::Canvas* canvas) {
25  views::View::OnPaint(canvas);
26
27  gfx::Size draw_size = GetImageDrawingSize();
28
29  if (draw_size.IsEmpty())
30    return;
31
32  gfx::Rect draw_bounds = GetContentsBounds();
33  draw_bounds.ClampToCenteredSize(draw_size);
34
35  gfx::Size image_size(image_.size());
36
37  if (image_size == draw_size) {
38    canvas->DrawImageInt(image_, draw_bounds.x(), draw_bounds.y());
39  } else {
40    SkPaint paint;
41    paint.setFilterLevel(SkPaint::kLow_FilterLevel);
42
43    // This call resizes the image while drawing into the canvas.
44    canvas->DrawImageInt(
45        image_,
46        0, 0, image_size.width(), image_size.height(),
47        draw_bounds.x(), draw_bounds.y(), draw_size.width(), draw_size.height(),
48        true,
49        paint);
50  }
51}
52
53gfx::Size ProportionalImageView::GetImageDrawingSize() {
54  if (!visible())
55    return gfx::Size();
56  return message_center::GetImageSizeForContainerSize(
57      GetContentsBounds().size(), image_.size());
58}
59
60}  // namespace message_center
61