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