Index: ui/base/cocoa/three_part_image.mm |
diff --git a/ui/base/cocoa/three_part_image.mm b/ui/base/cocoa/three_part_image.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5fb8916f9f20ba858d640eebec3b2a55a1d5b5d0 |
--- /dev/null |
+++ b/ui/base/cocoa/three_part_image.mm |
@@ -0,0 +1,82 @@ |
+// 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(int left_id, int middle_id, int right_id) { |
+ DCHECK(left_id); |
+ DCHECK(right_id); |
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
+ leftImage_.reset(rb.GetNativeImageNamed(left_id).CopyNSImage()); |
+ rightImage_.reset(rb.GetNativeImageNamed(right_id).CopyNSImage()); |
+ leftSize_ = [leftImage_ size]; |
+ rightSize_ = [rightImage_ size]; |
+ |
+ if (middle_id) |
+ middleImage_.reset(rb.GetNativeImageNamed(middle_id).CopyNSImage()); |
+} |
+ |
+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 |