<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -12,10 +12,10 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
 
 @implementation CPGradient : CPObject
 {
-    CPArray 	 _colors;
-    CPArray 	 _locations;
+    CPArray      _colors;
+    CPArray      _locations;
     CPColorSpace _colorSpace;
-    CGGradient 	 _CGGradient;
+    CGGradient   _CGGradient;
 }
 
 - (id)initWithStartingColor:(CPColor)startingColor endingColor:(CPColor)endingColor
@@ -26,7 +26,7 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
 - (id)initWithColors:(CPArray)colors
 {
     if ([colors count] &lt; 2) 
-            [CPException raise:CPinvalidArgumentException reason:&quot;A gradient need at least 2 colors&quot;];
+            [CPException raise:CPinvalidArgumentException reason:&quot;A gradient needs at least 2 colors&quot;];
             
     var count = [colors count],
         locations = [[CPArray alloc] init];
@@ -43,7 +43,7 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
 - (id)initWithColorsAndLocations:(CPColor)firstColor, ...
 {
     if (arguments.length &lt; 4)
-        [CPException raise:CPinvalidArgumentException reason:&quot;A gradient need at least 2 colors and 2 locations&quot;];
+        [CPException raise:CPinvalidArgumentException reason:&quot;A gradient needs at least 2 colors and 2 locations&quot;];
         
     var colors = [CPArray array],
         locations = [CPArray array];
@@ -93,90 +93,101 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
     var components = [];
  
     for (var i = 0; i &lt; count; i++)
-    	components = components.concat([_colors[i] components]);
+        components = components.concat([_colors[i] components]);
 
-	return CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), components, _locations, count);
+    return CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), components, _locations, count);
 }
 
 #pragma mark Drawing Linear Gradients
 
 - (void)drawFromPoint:(CPPoint)startingPoint toPoint:(CPPoint)endingPoint options:(CPGradientDrawingOptions)options
 {
-	var context = [[CPGraphicsContext currentContext] graphicsPort];
-	if (typeof context.canvas != 'undefined')
-	{
-	   var canvas = context.canvas;
-	   CGContextClipToRect(context, CGRectMake(0, 0, canvas.width, canvas.height));
-	}
-	
-	CGContextDrawLinearGradient(context, _CGGradient, startingPoint, endingPoint, options);
+    var context = [[CPGraphicsContext currentContext] graphicsPort];
+    if (CPFeatureIsCompatible(CPHTMLCanvasFeature)) // CGContextDrawLinearGradient is broken in VML
+    {
+       CGContextSaveGState(context);
+       
+       var canvas = context.canvas;
+       CGContextClipToRect(context, CGRectMake(0, 0, canvas.width, canvas.height)); 
+       CGContextDrawLinearGradient(context, _CGGradient, startingPoint, endingPoint, options);
+       
+       CGContextRestoreGState(context);
+    }
 }
 
 // This is from Cocotron. Thanks Cocotron !
 
 - (void)drawInRect:(CPRect)rect angle:(float)angle
 {
-    if ([_colors count] &lt; 2)
+    if ([_colors count] &lt; 2 || rect.size.width == 0)
         return;
 
     var start,
         end,
-        width = rect.size.width,
-        height = rect.size.height;
+        tanSize;
 
     angle = angle % 360; // fmod
-    var radAngleToEndFromCenter;
+    
     if (angle &lt; 90)
     {
-        start = CPMakePoint(0, 0);
-        radAngleToEndFromCenter = (angle * 2 - 45) / 180 * PI;
+        start = CGPointMake(rect.origin.x, rect.origin.y);
+        tanSize = CGPointMake(rect.size.width, rect.size.height);
     }
     else if (angle &lt; 180)
     {
-        start = CPMakePoint(width, 0);
-        radAngleToEndFromCenter = ((angle - 90) * 2 + 45) / 180 * PI;
+        start = CGPointMake(rect.origin.x + rect.size.width, rect.origin.y);
+        tanSize = CGPointMake(-rect.size.width, rect.size.height);
     }
     else if (angle &lt; 270)
     {
-        start = CPMakePoint(width, height);
-        radAngleToEndFromCenter = ((angle - 180) * 2 + 135) / 180 * PI;
+        start = CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
+        tanSize = CGPointMake(-rect.size.width, -rect.size.height);
     }
     else
     {
-        start = CPMakePoint(0, height);
-        radAngleToEndFromCenter = ((angle - 270) * 2 + 225) / 180 * PI;
+        start = CGPointMake(rect.origin.x, rect.origin.y + rect.size.height);
+        tanSize = CGPointMake(rect.size.width, -rect.size.height);
     }
 
-    var endx = (0.5 + COS(radAngleToEndFromCenter) / SQRT(2)) * width;
-    var endy = (0.5 + SIN(radAngleToEndFromCenter) / SQRT(2)) * height;
-    end = CPMakePoint(endx, endy);
+    var radAngle = angle / 180 * PI; 
+    var distanceToEnd = COS(ATAN2(tanSize.y,tanSize.x) - radAngle) * 
+        SQRT(rect.size.width * rect.size.width + rect.size.height * rect.size.height);
+    end = CGPointMake(COS(radAngle) * distanceToEnd + start.x, SIN(radAngle) * distanceToEnd + start.y);
 
     [self drawFromPoint:start toPoint:end options:0];
 }
 
 - (void)drawInBezierPath:(CPBezierPath)bezierPath angle:(CGFloat)angle
 {
-    var context = [[CPGraphicsContext currentContext] graphicsPort];
-    //    rect = [bezierPath bounds]; // Unimplemented
-
-    CGContextAddPath(context, bezierPath._path);
+    CPLogConsole(_cmd + &quot; Unimplemented method&quot;);
+/*
+    var context = [[CPGraphicsContext currentContext] graphicsPort],
+        rect = [bezierPath bounds]; // Unimplemented
+    
+    CGContextSaveGState(context);
+    
+    [bezierPath addClip]; // Unimplemented
     [self drawInRect:rect angle:angle];
+    
+    CGContextRestoreGState(context);
+*/
 }
 
 #pragma mark Drawing Radial Gradients
 
 - (void)drawFromCenter:(CPPoint)startCenter radius:(float)startRadius toCenter:(CPPoint)endCenter radius:(float)endRadius options:(CPGradientDrawingOptions)options
 {
-	var context = [[CPGraphicsContext currentContext] graphicsPort];
- 	if (typeof context.canvas != 'undefined')
-	{
-	   var canvas = context.canvas;
-	   CGContextClipToRect(context, CGRectMake(0, 0, canvas.width, canvas.height));
-        	   
-	   // Not implemented in VML. Yet ?
-	   CGContextDrawRadialGradient(context, _CGGradient, startCenter, startRadius, endCenter, endRadius, options);
-	}
-	
+    var context = [[CPGraphicsContext currentContext] graphicsPort];
+    if (CPFeatureIsCompatible(CPHTMLCanvasFeature)) // CGContextDrawRadialGradient unimplemented in VML
+    {
+       CGContextSaveGState(context);
+       
+       var canvas = context.canvas;
+       CGContextClipToRect(context, CGRectMake(0, 0, canvas.width, canvas.height));
+       CGContextDrawRadialGradient(context, _CGGradient, startCenter, startRadius, endCenter, endRadius, options);
+       
+       CGContextRestoreGState(context);
+    }   
 }
 
 - (void)drawInRect:(CPRect)rect relativeCenterPosition:(CPPoint)relativeCenterPosition
@@ -185,19 +196,21 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
         endCenter = CGPointMake(startCenter.x * (relativeCenterPosition.x + 1), startCenter.y * (relativeCenterPosition.y + 1)),
         endRadius = 2 * SQRT(POW(CGRectGetWidth(rect)/2 * (ABS(relativeCenterPosition.x) + 1),2) + POW(CGRectGetHeight(rect)/2* (ABS(relativeCenterPosition.y) + 1),2));
     
-    // clip to rect here ?
-        
+    var context = [[CPGraphicsContext currentContext] graphicsPort];    
+    CGContextClipToRect(context, rect);  
     [self drawFromCenter:startCenter radius:0 toCenter:endCenter radius:endRadius options:0];
 }
 
-- (void)drawInBezierPath:(CPBezierPath )path relativeCenterPosition:(CPPoint)center
+- (void)drawInBezierPath:(CPBezierPath )bezierPath relativeCenterPosition:(CPPoint)center
 {
-    var context = [[CPGraphicsContext currentContext] graphicsPort];
-    //    rect = [bezierPath bounds]; // Unimplemented
-
-    CGContextAddPath(context, bezierPath._path);
+    CPLogConsole(_cmd + &quot; Unimplemented method&quot;);
+/*
+    var context = [[CPGraphicsContext currentContext] graphicsPort],
+        rect = [bezierPath bounds]; // Unimplemented
     
+    [bezierPath addClip]; // Unimplemented
     [self drawInRect:rect relativeCenterPosition:relativeCenterPosition];
+*/    
 }
 
 @end</diff>
      <filename>AppKit/CPGradient.j</filename>
    </modified>
    <modified>
      <diff>@@ -157,7 +157,6 @@ function CGContextAddRects(aContext, rects, count)
 function CGContextBeginPath(aContext)
 {
     _CGContextBeginPathCanvas(aContext);
-    aContext.path = YES;
 }
 
 function CGContextClosePath(aContext)
@@ -429,17 +428,21 @@ function CGContextDrawLinearGradient(aContext, aGradient, aStartPoint, anEndPoin
 {
     var colors = aGradient.colors,
         count = colors.length,
-        canvas = aContext.canvas,
+        
         linearGradient = aContext.createLinearGradient(aStartPoint.x, aStartPoint.y, anEndPoint.x, anEndPoint.y);
 
     while (count--)
         linearGradient.addColorStop(aGradient.locations[count], to_string(colors[count]));
     
     aContext.fillStyle = linearGradient;
-    // if (CGContextIsPathEmpty(aContext))
-    // canvas = aContext.canvas;
-    // aContext.fillRect(0,0,canvas.width, canvas.height);
-    // else
+/*
+    if (CGContextIsPathEmpty(aContext))
+    {
+        var canvas = aContext.canvas;
+        aContext.fillRect(0,0,canvas.width, canvas.height);
+    }
+        else
+*/
     aContext.fill();
 }
 
@@ -447,18 +450,22 @@ function CGContextDrawRadialGradient(aContext, aGradient, startCenter, startRadi
 {
     var colors = aGradient.colors,
         count = colors.length,
+        
         radialGradient = aContext.createRadialGradient(startCenter.x, startCenter.y, startRadius, endCenter.x, endCenter.y, endRadius);
 
     while (count--)
         radialGradient.addColorStop(aGradient.locations[count], to_string(colors[count]));
     
     aContext.fillStyle = radialGradient;
-    // if (CGContextIsPathEmpty(aContext))
-    // canvas = aContext.canvas;
-    // aContext.fillRect(0,0,canvas.width, canvas.height);
-    // else
+/*
+    if (CGContextIsPathEmpty(aContext))
+    {
+        var canvas = aContext.canvas;
+        aContext.fillRect(0,0,canvas.width, canvas.height);
+    }
+        else
+*/
     aContext.fill();
-
 }
 
 function CGBitmapGraphicsContextCreate()</diff>
      <filename>AppKit/CoreGraphics/CGContextCanvas.j</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>4b1c27dde22284c870377d06142ce5b06b888059</id>
    </parent>
  </parents>
  <author>
    <name>cacaodev</name>
    <email>cacaodev@gmail.com</email>
  </author>
  <url>http://github.com/cacaodev/cappuccino/commit/cb6e149c27cd454fa3904f56380e7d4b1e21e83f</url>
  <id>cb6e149c27cd454fa3904f56380e7d4b1e21e83f</id>
  <committed-date>2009-11-06T02:38:56-08:00</committed-date>
  <authored-date>2009-11-04T16:10:17-08:00</authored-date>
  <message>Fixed start/end point computation in -drawInRect:angle: . Save and restore context state when drawing</message>
  <tree>b385c64a93cc83204bb5f5f1fa40a8701201ca6a</tree>
  <committer>
    <name>cacaodev</name>
    <email>cacaodev@gmail.com</email>
  </committer>
</commit>
