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