1d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)// found in the LICENSE file.
4d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
5d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ui/message_center/views/proportional_image_view.h"
6d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
7d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ui/gfx/canvas.h"
8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "ui/message_center/message_center_style.h"
9d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
10d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)namespace message_center {
11d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
12d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)ProportionalImageView::ProportionalImageView(const gfx::ImageSkia& image)
13d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    : image_(image) {
14d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
15d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
16d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)ProportionalImageView::~ProportionalImageView() {
17d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
18d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
19d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)gfx::Size ProportionalImageView::GetPreferredSize() {
20d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Insets insets = GetInsets();
21d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Rect rect = gfx::Rect(GetImageSizeForWidth(image_.width()));
22d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  rect.Inset(-insets);
23d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  return rect.size();
24d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
25d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
26d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)int ProportionalImageView::GetHeightForWidth(int width) {
27d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // The border will count against the width available for the image
28d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // and towards the height taken by the image.
29d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Insets insets = GetInsets();
30d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  int inset_width = width - insets.width();
31d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  return GetImageSizeForWidth(inset_width).height() + insets.height();
32d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
33d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
34d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)void ProportionalImageView::OnPaint(gfx::Canvas* canvas) {
35d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  views::View::OnPaint(canvas);
36d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
37d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Size draw_size(GetImageSizeForWidth(width() - GetInsets().width()));
38d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  if (!draw_size.IsEmpty()) {
39d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    gfx::Rect draw_bounds = GetContentsBounds();
40d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    draw_bounds.ClampToCenteredSize(draw_size);
41d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
42d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    gfx::Size image_size(image_.size());
43d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    if (image_size == draw_size) {
44d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      canvas->DrawImageInt(image_, draw_bounds.x(), draw_bounds.y());
45d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    } else {
46d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      // Resize case
47d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      SkPaint paint;
48d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      paint.setFilterBitmap(true);
49d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      canvas->DrawImageInt(image_, 0, 0,
50d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                           image_size.width(), image_size.height(),
51d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                           draw_bounds.x(), draw_bounds.y(),
52d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                           draw_size.width(), draw_size.height(),
53d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                           true, paint);
54d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    }
55d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  }
56d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
57d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
58d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)gfx::Size ProportionalImageView::GetImageSizeForWidth(int width) {
59d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  gfx::Size size = visible() ? image_.size() : gfx::Size();
60d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  return message_center::GetImageSizeForWidth(width, size);
61d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
62d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
63d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}  // namespace message_center
64