<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -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];
@@ -103,64 +103,74 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
 - (void)drawFromPoint:(CPPoint)startingPoint toPoint:(CPPoint)endingPoint options:(CPGradientDrawingOptions)options
 {
 	var context = [[CPGraphicsContext currentContext] graphicsPort];
-	if (typeof context.canvas != 'undefined')
+	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);
+	   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
@@ -168,15 +178,16 @@ CPGradientDrawsAfterEndingLocation = 1 &lt;&lt; 1;
 - (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')
+ 	if (CPFeatureIsCompatible(CPHTMLCanvasFeature)) // CGContextDrawRadialGradient unimplemented in VML
 	{
+	   CGContextSaveGState(context);
+	   
 	   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);
-	}
-	
+       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/1641e54da6007f4991e4fb98fe50c22485a2a7a0</url>
  <id>1641e54da6007f4991e4fb98fe50c22485a2a7a0</id>
  <committed-date>2009-11-06T02:31:05-08:00</committed-date>
  <authored-date>2009-11-04T16:10:17-08:00</authored-date>
  <message>Fixed start/end point computation in -drawInRect:angle: .Added IE detection and disable drawing for now.</message>
  <tree>1e9b631df52f1adf5cf796ffacdbeace080e55d9</tree>
  <committer>
    <name>cacaodev</name>
    <email>cacaodev@gmail.com</email>
  </committer>
</commit>
