| // Copyright 2015 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/base/cocoa/three_part_image.h" |
| |
| #include "base/logging.h" |
| #include "ui/base/resource/resource_bundle.h" |
| |
| namespace ui { |
| |
| ThreePartImage::ThreePartImage(NSImage* left, NSImage* middle, NSImage* right) { |
| DCHECK(left); |
| DCHECK(right); |
| leftImage_.reset([left retain]); |
| rightImage_.reset([right retain]); |
| leftSize_ = [leftImage_ size]; |
| rightSize_ = [rightImage_ size]; |
| |
| if (middle) { |
| middleImage_.reset([middle retain]); |
| } |
| } |
| |
| ThreePartImage::~ThreePartImage() { |
| } |
| |
| NSRect ThreePartImage::GetLeftRect(NSRect bounds) const { |
| NSRect left, right; |
| NSDivideRect(bounds, &left, &right, leftSize_.width, NSMinXEdge); |
| return left; |
| } |
| |
| NSRect ThreePartImage::GetMiddleRect(NSRect bounds) const { |
| NSRect left, middle, right; |
| NSDivideRect(bounds, &left, &middle, leftSize_.width, NSMinXEdge); |
| NSDivideRect(middle, &right, &middle, rightSize_.width, NSMaxXEdge); |
| return middle; |
| } |
| |
| NSRect ThreePartImage::GetRightRect(NSRect bounds) const { |
| NSRect left, right; |
| NSDivideRect(bounds, &right, &left, rightSize_.width, NSMaxXEdge); |
| return right; |
| } |
| |
| void ThreePartImage::DrawInRect(NSRect rect, |
| NSCompositingOperation op, |
| CGFloat alpha) const { |
| rect.size.height = leftSize_.height; |
| NSDrawThreePartImage(rect, leftImage_, middleImage_, rightImage_, |
| NO, op, alpha, NO); |
| } |
| |
| BOOL ThreePartImage::HitTest(NSPoint point, NSRect bounds) const { |
| NSRect middleRect = GetMiddleRect(bounds); |
| if (NSPointInRect(point, middleRect)) |
| return middleImage_ ? HitTestImage(point, middleImage_, middleRect) : YES; |
| |
| NSRect leftRect = GetLeftRect(bounds); |
| if (NSPointInRect(point, leftRect)) |
| return HitTestImage(point, leftImage_, leftRect); |
| |
| NSRect rightRect = GetRightRect(bounds); |
| if (NSPointInRect(point, rightRect)) |
| return HitTestImage(point, rightImage_, rightRect); |
| |
| return NO; |
| } |
| |
| BOOL ThreePartImage::HitTestImage(NSPoint point, |
| NSImage* image, |
| NSRect imageRect) const { |
| NSRect pointRect = NSMakeRect(point.x, point.y, 1, 1); |
| return [image hitTestRect:pointRect |
| withImageDestinationRect:imageRect |
| context:nil |
| hints:nil |
| flipped:NO]; |
| } |
| |
| } // namespace ui |