15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/painter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Returns the pixels for the bitmap in |image| at scale |image_scale|.
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void* GetBitmapPixels(const gfx::ImageSkia& img, float image_scale) {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_NE(0.0f, image_scale);
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const SkBitmap& bitmap = img.GetRepresentation(image_scale).sk_bitmap();
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SkAutoLockPixels pixel_lock(bitmap);
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return bitmap.getPixels();
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageView::ImageView()
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : image_size_set_(false),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      horiz_alignment_(CENTER),
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vert_alignment_(CENTER),
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      interactive_(true),
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_paint_scale_(0.f),
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      last_painted_bitmap_pixels_(NULL),
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      focus_painter_(Painter::CreateDashedFocusPainter()) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageView::~ImageView() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::SetImage(const gfx::ImageSkia& img) {
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (IsImageEqual(img))
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  last_painted_bitmap_pixels_ = NULL;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size pref_size(GetPreferredSize());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_ = img;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pref_size != GetPreferredSize())
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PreferredSizeChanged();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::SetImage(const gfx::ImageSkia* image_skia) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image_skia) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImage(*image_skia);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::ImageSkia t;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetImage(t);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia& ImageView::GetImage() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::SetImageSize(const gfx::Size& image_size) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_size_set_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_size_ = image_size;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ImageView::GetImageSize(gfx::Size* image_size) const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(image_size);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image_size_set_)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *image_size = image_size_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return image_size_set_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect ImageView::GetImageBounds() const {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size image_size(image_size_set_ ?
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_size_ : gfx::Size(image_.width(), image_.height()));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Rect(ComputeImageOrigin(image_size), image_size);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::ResetImageSize() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_size_set_ = false;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ImageView::SetFocusPainter(scoped_ptr<Painter> focus_painter) {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  focus_painter_ = focus_painter.Pass();
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ImageView::GetPreferredSize() const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets = GetInsets();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (image_size_set_) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size image_size;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetImageSize(&image_size);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_size.Enlarge(insets.width(), insets.height());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return image_size;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(image_.width() + insets.width(),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   image_.height() + insets.height());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ImageView::IsImageEqual(const gfx::ImageSkia& img) const {
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Even though we copy ImageSkia in SetImage() the backing store
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // (ImageSkiaStorage) is not copied and may have changed since the last call
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // to SetImage(). The expectation is that SetImage() with different pixels is
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // treated as though the image changed. For this reason we compare not only
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the backing store but also the pixels of the last image we painted.
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return image_.BackedBySameObjectAs(img) &&
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_paint_scale_ != 0.0f &&
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      last_painted_bitmap_pixels_ == GetBitmapPixels(img, last_paint_scale_);
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point ImageView::ComputeImageOrigin(const gfx::Size& image_size) const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Insets insets = GetInsets();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In order to properly handle alignment of images in RTL locales, we need
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to flip the meaning of trailing and leading. For example, if the
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // horizontal alignment is set to trailing, then we'll use left alignment for
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the image instead of right alignment if the UI layout is RTL.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Alignment actual_horiz_alignment = horiz_alignment_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::i18n::IsRTL() && (horiz_alignment_ != CENTER))
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    actual_horiz_alignment = (horiz_alignment_ == LEADING) ? TRAILING : LEADING;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (actual_horiz_alignment) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LEADING:  x = insets.left();                                 break;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRAILING: x = width() - insets.right() - image_size.width(); break;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CENTER:   x = (width() - image_size.width()) / 2;            break;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:       NOTREACHED(); x = 0;                               break;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int y;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (vert_alignment_) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LEADING:  y = insets.top();                                     break;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TRAILING: y = height() - insets.bottom() - image_size.height(); break;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CENTER:   y = (height() - image_size.height()) / 2;             break;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:       NOTREACHED(); y = 0;                                  break;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Point(x, y);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ImageView::OnFocus() {
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  View::OnFocus();
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (focus_painter_.get())
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SchedulePaint();
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ImageView::OnBlur() {
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  View::OnBlur();
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (focus_painter_.get())
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SchedulePaint();
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ImageView::OnPaint(gfx::Canvas* canvas) {
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  View::OnPaint(canvas);
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OnPaintImage(canvas);
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Painter::PaintFocusPainter(this, canvas, focus_painter_.get());
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageView::GetAccessibleState(ui::AXViewState* state) {
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  state->role = ui::AX_ROLE_IMAGE;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state->name = tooltip_text_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::SetHorizontalAlignment(Alignment ha) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ha != horiz_alignment_) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    horiz_alignment_ = ha;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SchedulePaint();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageView::Alignment ImageView::GetHorizontalAlignment() const {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return horiz_alignment_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ImageView::SetVerticalAlignment(Alignment va) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (va != vert_alignment_) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vert_alignment_ = va;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SchedulePaint();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageView::Alignment ImageView::GetVerticalAlignment() const {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return vert_alignment_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ImageView::SetTooltipText(const base::string16& tooltip) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tooltip_text_ = tooltip;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ImageView::GetTooltipText() const {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tooltip_text_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ImageView::GetTooltipText(const gfx::Point& p,
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               base::string16* tooltip) const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tooltip_text_.empty())
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *tooltip = GetTooltipText();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool ImageView::CanProcessEventsWithinSubtree() const {
20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return interactive_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ImageView::OnPaintImage(gfx::Canvas* canvas) {
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  last_paint_scale_ = canvas->image_scale();
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  last_painted_bitmap_pixels_ = NULL;
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (image_.isNull())
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect image_bounds(GetImageBounds());
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (image_bounds.IsEmpty())
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return;
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (image_bounds.size() != gfx::Size(image_.width(), image_.height())) {
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Resize case
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SkPaint paint;
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    paint.setFilterLevel(SkPaint::kLow_FilterLevel);
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    canvas->DrawImageInt(image_, 0, 0, image_.width(), image_.height(),
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        image_bounds.x(), image_bounds.y(), image_bounds.width(),
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        image_bounds.height(), true, paint);
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  } else {
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    canvas->DrawImageInt(image_, image_bounds.x(), image_bounds.y());
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  last_painted_bitmap_pixels_ = GetBitmapPixels(image_, last_paint_scale_);
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
237