// Copyright (c) 2010 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 "views/controls/image_view.h" #include "base/logging.h" #include "gfx/canvas.h" #include "gfx/insets.h" namespace views { ImageView::ImageView() : image_size_set_(false), horiz_alignment_(CENTER), vert_alignment_(CENTER) { } ImageView::~ImageView() { } void ImageView::SetImage(const SkBitmap& bm) { image_ = bm; PreferredSizeChanged(); SchedulePaint(); } void ImageView::SetImage(SkBitmap* bm) { if (bm) { SetImage(*bm); } else { SkBitmap t; SetImage(t); } } const SkBitmap& ImageView::GetImage() { return image_; } void ImageView::SetImageSize(const gfx::Size& image_size) { image_size_set_ = true; image_size_ = image_size; PreferredSizeChanged(); } bool ImageView::GetImageSize(gfx::Size* image_size) { DCHECK(image_size); if (image_size_set_) *image_size = image_size_; return image_size_set_; } gfx::Rect ImageView::GetImageBounds() const { gfx::Size image_size(image_size_set_ ? image_size_ : gfx::Size(image_.width(), image_.height())); return gfx::Rect(ComputeImageOrigin(image_size), image_size); } void ImageView::ResetImageSize() { image_size_set_ = false; } gfx::Size ImageView::GetPreferredSize() { gfx::Insets insets = GetInsets(); if (image_size_set_) { gfx::Size image_size; GetImageSize(&image_size); image_size.Enlarge(insets.width(), insets.height()); return image_size; } return gfx::Size(image_.width() + insets.width(), image_.height() + insets.height()); } gfx::Point ImageView::ComputeImageOrigin(const gfx::Size& image_size) const { gfx::Insets insets = GetInsets(); int x; // In order to properly handle alignment of images in RTL locales, we need // to flip the meaning of trailing and leading. For example, if the // horizontal alignment is set to trailing, then we'll use left alignment for // the image instead of right alignment if the UI layout is RTL. Alignment actual_horiz_alignment = horiz_alignment_; if (base::i18n::IsRTL() && (horiz_alignment_ != CENTER)) actual_horiz_alignment = (horiz_alignment_ == LEADING) ? TRAILING : LEADING; switch (actual_horiz_alignment) { case LEADING: x = insets.left(); break; case TRAILING: x = width() - insets.right() - image_size.width(); break; case CENTER: x = (width() - image_size.width()) / 2; break; default: NOTREACHED(); x = 0; break; } int y; switch (vert_alignment_) { case LEADING: y = insets.top(); break; case TRAILING: y = height() - insets.bottom() - image_size.height(); break; case CENTER: y = (height() - image_size.height()) / 2; break; default: NOTREACHED(); y = 0; break; } return gfx::Point(x, y); } void ImageView::Paint(gfx::Canvas* canvas) { View::Paint(canvas); if (image_.empty()) return; gfx::Rect image_bounds(GetImageBounds()); if (image_bounds.IsEmpty()) return; if (image_bounds.size() != gfx::Size(image_.width(), image_.height())) { // Resize case image_.buildMipMap(false); SkPaint paint; paint.setFilterBitmap(true); canvas->DrawBitmapInt(image_, 0, 0, image_.width(), image_.height(), image_bounds.x(), image_bounds.y(), image_bounds.width(), image_bounds.height(), true, paint); } else { canvas->DrawBitmapInt(image_, image_bounds.x(), image_bounds.y()); } } AccessibilityTypes::Role ImageView::GetAccessibleRole() { return AccessibilityTypes::ROLE_GRAPHIC; } void ImageView::SetHorizontalAlignment(Alignment ha) { if (ha != horiz_alignment_) { horiz_alignment_ = ha; SchedulePaint(); } } ImageView::Alignment ImageView::GetHorizontalAlignment() { return horiz_alignment_; } void ImageView::SetVerticalAlignment(Alignment va) { if (va != vert_alignment_) { vert_alignment_ = va; SchedulePaint(); } } ImageView::Alignment ImageView::GetVerticalAlignment() { return vert_alignment_; } void ImageView::SetTooltipText(const std::wstring& tooltip) { tooltip_text_ = tooltip; SetAccessibleName(tooltip); } std::wstring ImageView::GetTooltipText() { return tooltip_text_; } bool ImageView::GetTooltipText(const gfx::Point& p, std::wstring* tooltip) { if (tooltip_text_.empty()) return false; *tooltip = GetTooltipText(); return true; } } // namespace views