69 lines
1.5 KiB
Mathematica
69 lines
1.5 KiB
Mathematica
|
/**
|
||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*/
|
||
|
|
||
|
#import "ARTShape.h"
|
||
|
|
||
|
@implementation ARTShape
|
||
|
|
||
|
- (void)setD:(CGPathRef)d
|
||
|
{
|
||
|
if (d == _d) {
|
||
|
return;
|
||
|
}
|
||
|
[self invalidate];
|
||
|
CGPathRelease(_d);
|
||
|
_d = CGPathRetain(d);
|
||
|
}
|
||
|
|
||
|
- (void)dealloc
|
||
|
{
|
||
|
CGPathRelease(_d);
|
||
|
}
|
||
|
|
||
|
- (void)renderLayerTo:(CGContextRef)context
|
||
|
{
|
||
|
if ((!self.fill && !self.stroke) || !self.d) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CGPathDrawingMode mode = kCGPathStroke;
|
||
|
if (self.fill) {
|
||
|
if ([self.fill applyFillColor:context]) {
|
||
|
mode = kCGPathFill;
|
||
|
} else {
|
||
|
CGContextSaveGState(context);
|
||
|
CGContextAddPath(context, self.d);
|
||
|
CGContextClip(context);
|
||
|
[self.fill paint:context];
|
||
|
CGContextRestoreGState(context);
|
||
|
if (!self.stroke) {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (self.stroke) {
|
||
|
CGContextSetStrokeColorWithColor(context, self.stroke);
|
||
|
CGContextSetLineWidth(context, self.strokeWidth);
|
||
|
CGContextSetLineCap(context, self.strokeCap);
|
||
|
CGContextSetLineJoin(context, self.strokeJoin);
|
||
|
ARTCGFloatArray dash = self.strokeDash;
|
||
|
if (dash.count) {
|
||
|
CGContextSetLineDash(context, 0, dash.array, dash.count);
|
||
|
}
|
||
|
if (mode == kCGPathFill) {
|
||
|
mode = kCGPathFillStroke;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CGContextAddPath(context, self.d);
|
||
|
CGContextDrawPath(context, mode);
|
||
|
}
|
||
|
|
||
|
@end
|