mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 02:10:48 +00:00
Replaces [_doPath] with calls to [NSGraphicsContext
GSSendBezierPath:]. Added optimisation methods [appendBezierPath:] and [transformUsingAffineTransform:] on GSBezierPath. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@15038 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
2322b909f3
commit
15e791f6a5
1 changed files with 85 additions and 67 deletions
|
@ -55,7 +55,6 @@ static float default_miter_limit = 10.0;
|
|||
|
||||
- (void)_invalidateCache;
|
||||
- (void)_recalculateBounds;
|
||||
- (void)_doPath;
|
||||
|
||||
@end
|
||||
|
||||
|
@ -479,6 +478,8 @@ static float default_miter_limit = 10.0;
|
|||
//
|
||||
- (void)stroke
|
||||
{
|
||||
NSGraphicsContext *ctxt = GSCurrentContext();
|
||||
|
||||
if(_cachesBezierPath)
|
||||
{
|
||||
NSRect bounds = [self bounds];
|
||||
|
@ -489,22 +490,24 @@ static float default_miter_limit = 10.0;
|
|||
{
|
||||
_cacheImage = [[NSImage alloc] initWithSize: bounds.size];
|
||||
[_cacheImage lockFocus];
|
||||
PStranslate(-origin.x, -origin.y);
|
||||
[self _doPath];
|
||||
PSstroke();
|
||||
DPStranslate(ctxt, -origin.x, -origin.y);
|
||||
[ctxt GSSendBezierPath: self];
|
||||
DPSstroke(ctxt);
|
||||
[_cacheImage unlockFocus];
|
||||
}
|
||||
[_cacheImage compositeToPoint: origin operation: NSCompositeCopy];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self _doPath];
|
||||
PSstroke();
|
||||
[ctxt GSSendBezierPath: self];
|
||||
DPSstroke(ctxt);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)fill
|
||||
{
|
||||
NSGraphicsContext *ctxt = GSCurrentContext();
|
||||
|
||||
if(_cachesBezierPath)
|
||||
{
|
||||
NSRect bounds = [self bounds];
|
||||
|
@ -515,43 +518,47 @@ static float default_miter_limit = 10.0;
|
|||
{
|
||||
_cacheImage = [[NSImage alloc] initWithSize: bounds.size];
|
||||
[_cacheImage lockFocus];
|
||||
PStranslate(-origin.x, -origin.y);
|
||||
[self _doPath];
|
||||
DPStranslate(ctxt, -origin.x, -origin.y);
|
||||
[ctxt GSSendBezierPath: self];
|
||||
if([self windingRule] == NSNonZeroWindingRule)
|
||||
PSfill();
|
||||
DPSfill(ctxt);
|
||||
else
|
||||
PSeofill();
|
||||
DPSeofill(ctxt);
|
||||
[_cacheImage unlockFocus];
|
||||
}
|
||||
[_cacheImage compositeToPoint: origin operation: NSCompositeCopy];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self _doPath];
|
||||
[ctxt GSSendBezierPath: self];
|
||||
if([self windingRule] == NSNonZeroWindingRule)
|
||||
PSfill();
|
||||
DPSfill(ctxt);
|
||||
else
|
||||
PSeofill();
|
||||
DPSeofill(ctxt);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)addClip
|
||||
{
|
||||
[self _doPath];
|
||||
NSGraphicsContext *ctxt = GSCurrentContext();
|
||||
|
||||
[ctxt GSSendBezierPath: self];
|
||||
if([self windingRule] == NSNonZeroWindingRule)
|
||||
PSclip();
|
||||
DPSclip(ctxt);
|
||||
else
|
||||
PSeoclip();
|
||||
DPSeoclip(ctxt);
|
||||
}
|
||||
|
||||
- (void)setClip
|
||||
{
|
||||
PSinitclip();
|
||||
[self _doPath];
|
||||
NSGraphicsContext *ctxt = GSCurrentContext();
|
||||
|
||||
DPSinitclip(ctxt);
|
||||
[ctxt GSSendBezierPath: self];
|
||||
if([self windingRule] == NSNonZeroWindingRule)
|
||||
PSclip();
|
||||
DPSclip(ctxt);
|
||||
else
|
||||
PSeoclip();
|
||||
DPSeoclip(ctxt);
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -723,7 +730,6 @@ static float default_miter_limit = 10.0;
|
|||
INVALIDATE_CACHE();
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Path info
|
||||
//
|
||||
|
@ -819,7 +825,6 @@ static float default_miter_limit = 10.0;
|
|||
int i, count;
|
||||
|
||||
count = [aPath elementCount];
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
type = [aPath elementAtIndex: i associatedPoints: points];
|
||||
|
@ -1396,51 +1401,6 @@ static float default_miter_limit = 10.0;
|
|||
_shouldRecalculateBounds = NO;
|
||||
}
|
||||
|
||||
- (void)_doPath
|
||||
{
|
||||
NSGraphicsContext *ctxt = GSCurrentContext();
|
||||
NSBezierPathElement type;
|
||||
NSPoint pts[3];
|
||||
int i, count;
|
||||
float pattern[10];
|
||||
float phase;
|
||||
|
||||
DPSnewpath(ctxt);
|
||||
DPSsetlinewidth(ctxt, [self lineWidth]);
|
||||
DPSsetlinejoin(ctxt, [self lineJoinStyle]);
|
||||
DPSsetlinecap(ctxt, [self lineCapStyle]);
|
||||
DPSsetmiterlimit(ctxt, [self miterLimit]);
|
||||
DPSsetflat(ctxt, [self flatness]);
|
||||
|
||||
[self getLineDash: pattern count: &count phase: &phase];
|
||||
// Always sent the dash pattern. When NULL this will reset to a solid line.
|
||||
DPSsetdash(ctxt, pattern, count, phase);
|
||||
|
||||
count = [self elementCount];
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
type = [self elementAtIndex: i associatedPoints: pts];
|
||||
switch(type)
|
||||
{
|
||||
case NSMoveToBezierPathElement:
|
||||
DPSmoveto(ctxt, pts[0].x, pts[0].y);
|
||||
break;
|
||||
case NSLineToBezierPathElement:
|
||||
DPSlineto(ctxt, pts[0].x, pts[0].y);
|
||||
break;
|
||||
case NSCurveToBezierPathElement:
|
||||
DPScurveto(ctxt, pts[0].x, pts[0].y,
|
||||
pts[1].x, pts[1].y, pts[2].x, pts[2].y);
|
||||
break;
|
||||
case NSClosePathBezierPathElement:
|
||||
DPSclosepath(ctxt);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
@ -1614,6 +1574,64 @@ typedef struct _PathElement
|
|||
return [super bezierPathByFlatteningPath];
|
||||
}
|
||||
|
||||
- (void) transformUsingAffineTransform: (NSAffineTransform *)transform
|
||||
{
|
||||
NSBezierPathElement type;
|
||||
int i, count;
|
||||
PathElement *elments = (PathElement *)GSIArrayItems(pathElements);
|
||||
SEL transformPointSel = @selector(transformPoint:);
|
||||
NSPoint (*transformPointImp)(NSAffineTransform*, SEL, NSPoint);
|
||||
|
||||
transformPointImp = (NSPoint (*)(NSAffineTransform*, SEL, NSPoint))
|
||||
[transform methodForSelector: transformPointSel];
|
||||
|
||||
count = GSIArrayCount(pathElements);
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
type = elments[i].type;
|
||||
switch(type)
|
||||
{
|
||||
case NSMoveToBezierPathElement:
|
||||
case NSLineToBezierPathElement:
|
||||
elments[i].points[0] = (*transformPointImp)(transform,
|
||||
transformPointSel,
|
||||
elments[i].points[0]);
|
||||
break;
|
||||
case NSCurveToBezierPathElement:
|
||||
elments[i].points[0] = (*transformPointImp)(transform,
|
||||
transformPointSel,
|
||||
elments[i].points[0]);
|
||||
elments[i].points[1] = (*transformPointImp)(transform,
|
||||
transformPointSel,
|
||||
elments[i].points[1]);
|
||||
elments[i].points[2] = (*transformPointImp)(transform,
|
||||
transformPointSel,
|
||||
elments[i].points[2]);
|
||||
break;
|
||||
case NSClosePathBezierPathElement:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
INVALIDATE_CACHE();
|
||||
}
|
||||
|
||||
- (void) appendBezierPath: (NSBezierPath *)aPath
|
||||
{
|
||||
PathElement elem;
|
||||
int i, count;
|
||||
|
||||
count = [aPath elementCount];
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
elem = GSIArrayItemAtIndex(((GSBezierPath*)aPath)->pathElements, i).ext;
|
||||
GSIArrayAddItem(pathElements, (GSIArrayItem)elem);
|
||||
}
|
||||
INVALIDATE_CACHE();
|
||||
}
|
||||
|
||||
//
|
||||
// NSCopying Protocol
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue