Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: dde81ed01d
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 148 lines (116 sloc) 4.322 kb
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
//
// 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;
}


NSPoint UKCenterOfRect( NSRect rect )
{
return NSMakePoint( NSMidX(rect), NSMidY(rect) );
}

NSPoint UKTopCenterOfRect( NSRect rect )
{
return NSMakePoint( NSMidX(rect), NSMaxY(rect) );
}

NSPoint UKTopLeftOfRect( NSRect rect )
{
return NSMakePoint( NSMinX(rect),NSMaxY(rect) );
}

NSPoint UKTopRightOfRect( NSRect rect )
{
return NSMakePoint( NSMaxX(rect), NSMaxY(rect) );
}

NSPoint UKLeftCenterOfRect( NSRect rect )
{
return NSMakePoint( NSMinX(rect), NSMidY(rect) );
}

NSPoint UKBottomCenterOfRect( NSRect rect )
{
return NSMakePoint( NSMidX(rect), NSMinY(rect) );
}

NSPoint UKBottomLeftOfRect( NSRect rect )
{
return rect.origin;
}

NSPoint UKBottomRightOfRect( NSRect rect )
{
return NSMakePoint( NSMaxX(rect), NSMinY(rect) );
}

NSPoint UKRightCenterOfRect( NSRect rect )
{
return NSMakePoint( NSMaxX(rect), NSMidY(rect) );
}
 

@end
Something went wrong with that request. Please try again.