-
Notifications
You must be signed in to change notification settings - Fork 33
/
NSBezierPath+RoundRect.m
100 lines (80 loc) · 3.38 KB
/
NSBezierPath+RoundRect.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
// NSBezierPathRoundRects.m
// UKDockableWindow
//
// Created by Uli Kusterer on Wed Feb 04 2004.
// Based on code by John C. Randolph.
// Copyright (c) 2004 M. Uli Kusterer.
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#import "NSBezierPath+RoundRect.h"
@implementation NSBezierPath (RoundRects)
+(void) fillRoundRectInRect:(NSRect)rect radius:(float) radius
{
NSBezierPath* p = [self bezierPathWithRoundRectInRect: rect radius: radius];
[p fill];
}
+(void) strokeRoundRectInRect:(NSRect)rect radius:(float) radius
{
NSBezierPath* p = [self bezierPathWithRoundRectInRect: rect radius: radius];
[p stroke];
}
// -----------------------------------------------------------------------------
// bezierPathWithRoundRectInRect:radius:
// This method adds the traditional Macintosh rounded-rectangle to
// NSBezierPath's repertoire.
//
// REVISIONS:
// 2004-02-04 witness Created.
// -----------------------------------------------------------------------------
+(NSBezierPath*) bezierPathWithRoundRectInRect:(NSRect)rect radius:(float) radius
{
// Make sure radius doesn't exceed a maximum size to avoid artifacts:
if( radius >= (rect.size.height /2) )
radius = truncf(rect.size.height /2) -1;
if( radius >= (rect.size.width /2) )
radius = truncf(rect.size.width /2) -1;
// Make sure silly values simply lead to un-rounded corners:
if( radius <= 0 )
return [self bezierPathWithRect: rect];
// Now draw our rectangle:
NSRect innerRect = NSInsetRect( rect, radius, radius ); // Make rect with corners being centers of the corner circles.
NSBezierPath *path = [self bezierPath];
[path moveToPoint: NSMakePoint(rect.origin.x,rect.origin.y +radius)];
// Bottom left (origin):
[path appendBezierPathWithArcWithCenter: UKBottomLeftOfRect(innerRect)
radius: radius startAngle: 180.0 endAngle: 270.0 ];
[path relativeLineToPoint: NSMakePoint(NSWidth(innerRect), 0.0) ]; // Bottom edge.
// Bottom right:
[path appendBezierPathWithArcWithCenter: UKBottomRightOfRect(innerRect)
radius: radius startAngle: 270.0 endAngle: 360.0 ];
[path relativeLineToPoint: NSMakePoint(0.0, NSHeight(innerRect)) ]; // Right edge.
// Top right:
[path appendBezierPathWithArcWithCenter: UKTopRightOfRect(innerRect)
radius: radius startAngle: 0.0 endAngle: 90.0 ];
[path relativeLineToPoint: NSMakePoint( -NSWidth(innerRect), 0.0) ]; // Top edge.
// Top left:
[path appendBezierPathWithArcWithCenter: UKTopLeftOfRect(innerRect)
radius: radius startAngle: 90.0 endAngle: 180.0 ];
[path closePath]; // Implicitly causes left edge.
return path;
}
@end