You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ha...@apache.org on 2016/07/25 21:03:28 UTC
git commit: [flex-asjs] [refs/heads/develop] - Added svg drawing APIs
Repository: flex-asjs
Updated Branches:
refs/heads/develop 1e67bacde -> c383fa729
Added svg drawing APIs
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/c383fa72
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/c383fa72
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/c383fa72
Branch: refs/heads/develop
Commit: c383fa72950e95168c1478acd9470deb94d034e7
Parents: 1e67bac
Author: Harbs <ha...@in-tools.com>
Authored: Tue Jul 26 00:03:16 2016 +0300
Committer: Harbs <ha...@in-tools.com>
Committed: Tue Jul 26 00:03:16 2016 +0300
----------------------------------------------------------------------
.../Graphics/src/main/flex/GraphicsClasses.as | 11 +
.../flex/org/apache/flex/graphics/CubicCurve.as | 56 +++
.../apache/flex/graphics/ICompoundGraphic.as | 6 +-
.../org/apache/flex/graphics/IPathCommand.as | 16 +
.../flex/org/apache/flex/graphics/LineTo.as | 47 +++
.../flex/org/apache/flex/graphics/MoveTo.as | 47 +++
.../org/apache/flex/graphics/PathBuilder.as | 292 +++++++++++++
.../org/apache/flex/graphics/QuadraticCurve.as | 51 +++
.../flex/org/apache/flex/svg/CompoundGraphic.as | 419 +++++++++++++------
9 files changed, 819 insertions(+), 126 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/GraphicsClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/GraphicsClasses.as b/frameworks/projects/Graphics/src/main/flex/GraphicsClasses.as
index 0cc1db9..551c4a4 100644
--- a/frameworks/projects/Graphics/src/main/flex/GraphicsClasses.as
+++ b/frameworks/projects/Graphics/src/main/flex/GraphicsClasses.as
@@ -39,6 +39,17 @@ internal class GraphicsClasses
import org.apache.flex.svg.Text; Text;
import org.apache.flex.svg.CompoundGraphic; CompoundGraphic;
import org.apache.flex.svg.LinearGradient; LinearGradient;
+ import org.apache.flex.graphics.CubicCurve; CubicCurve;
+ import org.apache.flex.graphics.ICompoundGraphic; ICompoundGraphic;
+ import org.apache.flex.graphics.IGraphicShape; IGraphicShape;
+ import org.apache.flex.graphics.IPathCommand; IPathCommand;
+ import org.apache.flex.graphics.LineStyle; LineStyle;
+ import org.apache.flex.graphics.LineTo; LineTo;
+ import org.apache.flex.graphics.MoveTo; MoveTo;
+ import org.apache.flex.graphics.PathBuilder; PathBuilder;
+ import org.apache.flex.graphics.QuadraticCurve; QuadraticCurve;
+ import org.apache.flex.svg.DOMWrapper; DOMWrapper;
+
}
}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/CubicCurve.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/CubicCurve.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/CubicCurve.as
new file mode 100644
index 0000000..1727e52
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/CubicCurve.as
@@ -0,0 +1,56 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package org.apache.flex.graphics
+{
+ COMPILE::SWF
+ {
+ import flash.display.Graphics;
+ }
+
+ public class CubicCurve implements IPathCommand
+ {
+ public function CubicCurve(controlX1:Number, controlY1:Number, controlX2:Number, controlY2:Number, anchorX:Number, anchorY:Number)
+ {
+ _controlX1 = controlX1;
+ _controlY1 = controlY1;
+ _controlX2 = controlX2;
+ _controlY2 = controlY2;
+ _anchorX = anchorX;
+ _anchorY = anchorY;
+ }
+ private var _controlX1:Number;
+ private var _controlY1:Number;
+ private var _controlX2:Number;
+ private var _controlY2:Number;
+ private var _anchorX:Number;
+ private var _anchorY:Number;
+
+ public function toString():String
+ {
+ return ["C",_controlX1,_controlY1,_controlX2,_controlY2,_anchorX,_anchorY].join(" ");
+ }
+ COMPILE::SWF
+ public function execute(g:Graphics):void
+ {
+ g.cubicCurveTo(_controlX1,_controlY1,_controlX2,_controlY2,_anchorX,_anchorY);
+ }
+ COMPILE::JS
+ public function execute(ctx:Object):void
+ {
+ //ctx should be a canvas context. Not sure what the type is.
+ ctx.bezierCurveTo(_controlX1,_controlY1,_controlX2,_controlY2,_anchorX,_anchorY);
+ }
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/ICompoundGraphic.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/ICompoundGraphic.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/ICompoundGraphic.as
index 95a7dcd..20f7a74 100644
--- a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/ICompoundGraphic.as
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/ICompoundGraphic.as
@@ -22,7 +22,9 @@ package org.apache.flex.graphics
function drawCircle(x:Number, y:Number, radius:Number):void;
function drawPath(data:String):void;
function drawText(value:String, x:Number, y:Number):Object;
- function get textColor():IFill;
- function set textColor(value:IFill):void;
+ function get textFill():IFill;
+ function set textFill(value:IFill):void;
+ function get textStroke():IStroke;
+ function set textStroke(value:IStroke):void;
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/IPathCommand.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/IPathCommand.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/IPathCommand.as
new file mode 100644
index 0000000..100d3ce
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/IPathCommand.as
@@ -0,0 +1,16 @@
+package org.apache.flex.graphics
+{
+ COMPILE::SWF
+ {
+ import flash.display.Graphics;
+ }
+
+ public interface IPathCommand
+ {
+ function toString():String;
+ COMPILE::SWF
+ function execute(g:Graphics):void;
+ COMPILE::JS
+ function execute(ctx:Object):void;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/LineTo.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/LineTo.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/LineTo.as
new file mode 100644
index 0000000..3a86530
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/LineTo.as
@@ -0,0 +1,47 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package org.apache.flex.graphics
+{
+ COMPILE::SWF
+ {
+ import flash.display.Graphics;
+ }
+ public class LineTo implements IPathCommand
+ {
+ public function LineTo(x:Number, y:Number)
+ {
+ _x = x;
+ _y = y;
+ }
+ private var _x:Number;
+ private var _y:Number;
+
+ public function toString():String
+ {
+ return ["L",_x,_y].join(" ");
+ }
+ COMPILE::SWF
+ public function execute(g:Graphics):void
+ {
+ g.lineTo(_x,_y);
+ }
+ COMPILE::JS
+ public function execute(ctx:Object):void
+ {
+ //ctx should be a canvas context. Not sure what the type is.
+ ctx.lineTo(_x,_y);
+ }
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/MoveTo.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/MoveTo.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/MoveTo.as
new file mode 100644
index 0000000..7835cdd
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/MoveTo.as
@@ -0,0 +1,47 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package org.apache.flex.graphics
+{
+ COMPILE::SWF
+ {
+ import flash.display.Graphics;
+ }
+ public class MoveTo implements IPathCommand
+ {
+ public function MoveTo(x:Number, y:Number)
+ {
+ _x = x;
+ _y = y;
+ }
+ private var _x:Number;
+ private var _y:Number;
+
+ public function toString():String
+ {
+ return ["M",_x,_y].join(" ");
+ }
+ COMPILE::SWF
+ public function execute(g:Graphics):void
+ {
+ g.moveTo(_x,_y);
+ }
+ COMPILE::JS
+ public function execute(ctx:Object):void
+ {
+ //ctx should be a canvas context. Not sure what the type is.
+ ctx.moveTo(_x,_y);
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/PathBuilder.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/PathBuilder.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/PathBuilder.as
new file mode 100644
index 0000000..3b376c7
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/PathBuilder.as
@@ -0,0 +1,292 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flex.graphics
+{
+ import flash.display.Graphics;
+
+ public class PathBuilder
+ {
+
+ /**
+ * Constructor.
+ *
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function PathBuilder()
+ {
+ commands = new Vector.<IPathCommand>();
+ }
+
+ public function getPathString():String
+ {
+ return commands.join(" ");
+ }
+ COMPILE::SWF
+ public function draw(g:Graphics):void
+ {
+ //TODO we can probably make this more efficient by doing all the drawing commands at once.
+ var i:int = -1;
+ var len:int = commands.length;
+ while(++i<len)
+ {
+ commands[i].execute(g);
+ }
+
+ }
+ COMPILE::JS
+ public function draw(ctx:Object):void
+ {
+ var i:int = -1;
+ var len:int = commands.length;
+ while(++i<len)
+ {
+ commands[i].execute(ctx);
+ }
+
+ }
+
+ private var commands:Vector.<IPathCommand>;
+
+ public function lineTo(x:Number, y:Number):void
+ {
+ commands.push(new LineTo(x,y));
+ }
+
+ public function moveTo(x:Number, y:Number):void
+ {
+ commands.push(new MoveTo(x,y));
+ }
+
+ public function quadraticCurveTo(controlX:Number, controlY:Number, anchorX:Number, anchorY:Number):void
+ {
+ commands.push(new QuadraticCurve(controlX,controlY,anchorX,anchorY));
+ }
+
+ public function cubicCurveTo(controlX1:Number, controlY1:Number, controlX2:Number, controlY2:Number, anchorX:Number, anchorY:Number):void
+ {
+ commands.push(new CubicCurve(controlX1, controlY1, controlX2, controlY2, anchorX, anchorY));
+ }
+
+ public function drawRoundRectComplex(x:Number, y:Number,
+ width:Number, height:Number,
+ topLeftRadius:Number, topRightRadius:Number,
+ bottomLeftRadius:Number, bottomRightRadius:Number):void
+ {
+ var b:Array = [];
+ var xw:Number = x + width;
+ var yh:Number = y + height;
+
+ // Make sure none of the radius values are greater than w/h.
+ // These are all inlined to avoid function calling overhead
+ var minSize:Number = width < height ? width * 2 : height * 2;
+ topLeftRadius = topLeftRadius < minSize ? topLeftRadius : minSize;
+ topRightRadius = topRightRadius < minSize ? topRightRadius : minSize;
+ bottomLeftRadius = bottomLeftRadius < minSize ? bottomLeftRadius : minSize;
+ bottomRightRadius = bottomRightRadius < minSize ? bottomRightRadius : minSize;
+
+ // Math.sin and Math,tan values for optimal performance.
+ // Math.rad = Math.PI / 180 = 0.0174532925199433
+ // r * Math.sin(45 * Math.rad) = (r * 0.707106781186547);
+ // r * Math.tan(22.5 * Math.rad) = (r * 0.414213562373095);
+ //
+ // We can save further cycles by precalculating
+ // 1.0 - 0.707106781186547 = 0.292893218813453 and
+ // 1.0 - 0.414213562373095 = 0.585786437626905
+
+ // bottom-right corner
+ var a:Number = bottomRightRadius * 0.292893218813453; // radius - anchor pt;
+ var s:Number = bottomRightRadius * 0.585786437626905; // radius - control pt;
+ commands.push(new MoveTo(xw, yh - bottomRightRadius));
+ commands.push(new QuadraticCurve(xw, yh - s, xw - a, yh - a));
+ commands.push(new QuadraticCurve(xw - s, yh, xw - bottomRightRadius, yh));
+
+ // bottom-left corner
+ a = bottomLeftRadius * 0.292893218813453;
+ s = bottomLeftRadius * 0.585786437626905;
+ commands.push(new LineTo(x + bottomLeftRadius, yh));
+ commands.push(new QuadraticCurve(x + s, yh, x + a, yh - a));
+ commands.push(new QuadraticCurve(x, yh - s, x, yh - bottomLeftRadius));
+
+ // top-left corner
+ a = topLeftRadius * 0.292893218813453;
+ s = topLeftRadius * 0.585786437626905;
+ commands.push(new LineTo(x, y + topLeftRadius));
+ commands.push(new QuadraticCurve(x, y + s, x + a, y + a));
+ commands.push(new QuadraticCurve(x + s, y, x + topLeftRadius, y));
+
+ // top-right corner
+ a = topRightRadius * 0.292893218813453;
+ s = topRightRadius * 0.585786437626905;
+ commands.push(new LineTo(xw - topRightRadius, y));
+ commands.push(new QuadraticCurve(xw - s, y, xw - a, y + a));
+ commands.push(new QuadraticCurve(xw, y + s, xw, y + topRightRadius));
+ commands.push(new LineTo(xw, yh - bottomRightRadius));
+ }
+ /**
+ * Draws a rounded rectangle using the size of individual x and y radii to
+ * draw the rounded corners.
+ *
+ * @param x The horizontal position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param y The vertical position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param width The width of the round rectangle, in pixels.
+ *
+ * @param height The height of the round rectangle, in pixels.
+ *
+ * @param radiusX The default radiusX to use, if corner-specific values are not specified.
+ * This value must be specified.
+ *
+ * @param radiusY The default radiusY to use, if corner-specific values are not specified.
+ * If 0, the value of radiusX is used.
+ *
+ * @param topLeftRadiusX The x radius of the upper-left corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param topLeftRadiusY The y radius of the upper-left corner, in pixels. If NaN,
+ * the value of topLeftRadiusX is used.
+ *
+ * @param topRightRadiusX The x radius of the upper-right corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param topRightRadiusY The y radius of the upper-right corner, in pixels. If NaN,
+ * the value of topRightRadiusX is used.
+ *
+ * @param bottomLeftRadiusX The x radius of the bottom-left corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param bottomLeftRadiusY The y radius of the bottom-left corner, in pixels. If NaN,
+ * the value of bottomLeftRadiusX is used.
+ *
+ * @param bottomRightRadiusX The x radius of the bottom-right corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param bottomRightRadiusY The y radius of the bottom-right corner, in pixels. If NaN,
+ * the value of bottomRightRadiusX is used.
+ *
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4
+ */
+ public function drawRoundRectComplex2(x:Number, y:Number,
+ width:Number, height:Number,
+ radiusX:Number, radiusY:Number,
+ topLeftRadiusX:Number, topLeftRadiusY:Number,
+ topRightRadiusX:Number, topRightRadiusY:Number,
+ bottomLeftRadiusX:Number, bottomLeftRadiusY:Number,
+ bottomRightRadiusX:Number, bottomRightRadiusY:Number):void
+ {
+ var xw:Number = x + width;
+ var yh:Number = y + height;
+ var maxXRadius:Number = width / 2;
+ var maxYRadius:Number = height / 2;
+
+ // Rules for determining radius for each corner:
+ // - If explicit nnnRadiusX value is set, use it. Otherwise use radiusX.
+ // - If explicit nnnRadiusY value is set, use it. Otherwise use corresponding nnnRadiusX.
+ if (radiusY == 0)
+ radiusY = radiusX;
+ if (isNaN(topLeftRadiusX))
+ topLeftRadiusX = radiusX;
+ if (isNaN(topLeftRadiusY))
+ topLeftRadiusY = topLeftRadiusX;
+ if (isNaN(topRightRadiusX))
+ topRightRadiusX = radiusX;
+ if (isNaN(topRightRadiusY))
+ topRightRadiusY = topRightRadiusX;
+ if (isNaN(bottomLeftRadiusX))
+ bottomLeftRadiusX = radiusX;
+ if (isNaN(bottomLeftRadiusY))
+ bottomLeftRadiusY = bottomLeftRadiusX;
+ if (isNaN(bottomRightRadiusX))
+ bottomRightRadiusX = radiusX;
+ if (isNaN(bottomRightRadiusY))
+ bottomRightRadiusY = bottomRightRadiusX;
+
+ // Pin radius values to half of the width/height
+ if (topLeftRadiusX > maxXRadius)
+ topLeftRadiusX = maxXRadius;
+ if (topLeftRadiusY > maxYRadius)
+ topLeftRadiusY = maxYRadius;
+ if (topRightRadiusX > maxXRadius)
+ topRightRadiusX = maxXRadius;
+ if (topRightRadiusY > maxYRadius)
+ topRightRadiusY = maxYRadius;
+ if (bottomLeftRadiusX > maxXRadius)
+ bottomLeftRadiusX = maxXRadius;
+ if (bottomLeftRadiusY > maxYRadius)
+ bottomLeftRadiusY = maxYRadius;
+ if (bottomRightRadiusX > maxXRadius)
+ bottomRightRadiusX = maxXRadius;
+ if (bottomRightRadiusY > maxYRadius)
+ bottomRightRadiusY = maxYRadius;
+
+ // Math.sin and Math,tan values for optimal performance.
+ // Math.rad = Math.PI / 180 = 0.0174532925199433
+ // r * Math.sin(45 * Math.rad) = (r * 0.707106781186547);
+ // r * Math.tan(22.5 * Math.rad) = (r * 0.414213562373095);
+ //
+ // We can save further cycles by precalculating
+ // 1.0 - 0.707106781186547 = 0.292893218813453 and
+ // 1.0 - 0.414213562373095 = 0.585786437626905
+
+ // bottom-right corner
+ var aX:Number = bottomRightRadiusX * 0.292893218813453; // radius - anchor pt;
+ var aY:Number = bottomRightRadiusY * 0.292893218813453; // radius - anchor pt;
+ var sX:Number = bottomRightRadiusX * 0.585786437626905; // radius - control pt;
+ var sY:Number = bottomRightRadiusY * 0.585786437626905; // radius - control pt;
+ commands.push(new MoveTo(xw, yh - bottomRightRadiusY));
+ commands.push(new QuadraticCurve(xw, yh - sY, xw - aX, yh - aY));
+ commands.push(new QuadraticCurve(xw - sX, yh, xw - bottomRightRadiusX, yh));
+
+ // bottom-left corner
+ aX = bottomLeftRadiusX * 0.292893218813453;
+ aY = bottomLeftRadiusY * 0.292893218813453;
+ sX = bottomLeftRadiusX * 0.585786437626905;
+ sY = bottomLeftRadiusY * 0.585786437626905;
+ commands.push(new LineTo(x + bottomLeftRadiusX, yh));
+ commands.push(new QuadraticCurve(x + sX, yh, x + aX, yh - aY));
+ commands.push(new QuadraticCurve(x, yh - sY, x, yh - bottomLeftRadiusY));
+
+ // top-left corner
+ aX = topLeftRadiusX * 0.292893218813453;
+ aY = topLeftRadiusY * 0.292893218813453;
+ sX = topLeftRadiusX * 0.585786437626905;
+ sY = topLeftRadiusY * 0.585786437626905;
+ commands.push(new LineTo(x, y + topLeftRadiusY));
+ commands.push(new QuadraticCurve(x, y + sY, x + aX, y + aY));
+ commands.push(new QuadraticCurve(x + sX, y, x + topLeftRadiusX, y));
+
+ // top-right corner
+ aX = topRightRadiusX * 0.292893218813453;
+ aY = topRightRadiusY * 0.292893218813453;
+ sX = topRightRadiusX * 0.585786437626905;
+ sY = topRightRadiusY * 0.585786437626905;
+ commands.push(new LineTo(xw - topRightRadiusX, y));
+ commands.push(new QuadraticCurve(xw - sX, y, xw - aX, y + aY));
+ commands.push(new QuadraticCurve(xw, y + sY, xw, y + topRightRadiusY));
+ commands.push(new LineTo(xw, yh - bottomRightRadiusY));
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/QuadraticCurve.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/QuadraticCurve.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/QuadraticCurve.as
new file mode 100644
index 0000000..68bec93
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/graphics/QuadraticCurve.as
@@ -0,0 +1,51 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package org.apache.flex.graphics
+{
+ COMPILE::SWF
+ {
+ import flash.display.Graphics;
+ }
+ public class QuadraticCurve implements IPathCommand
+ {
+ public function QuadraticCurve(controlX:Number, controlY:Number, anchorX:Number, anchorY:Number)
+ {
+ _controlX = controlX;
+ _controlY = controlY;
+ _anchorX = anchorX;
+ _anchorY = anchorY;
+ }
+ private var _controlX:Number;
+ private var _controlY:Number;
+ private var _anchorX:Number;
+ private var _anchorY:Number;
+
+ public function toString():String
+ {
+ return ["Q",_controlX,_controlY,_anchorX,_anchorY].join(" ");
+ }
+ COMPILE::SWF
+ public function execute(g:Graphics):void
+ {
+ g.curveTo(_controlX,_controlY,_anchorX,_anchorY);
+ }
+ COMPILE::JS
+ public function execute(ctx:Object):void
+ {
+ //ctx should be a canvas context. Not sure what the type is.
+ ctx.quadraticCurveTo(_controlX,_controlY,_anchorX,_anchorY);
+ }
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c383fa72/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/CompoundGraphic.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/CompoundGraphic.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/CompoundGraphic.as
index 02f3aa5..9cb3865 100644
--- a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/CompoundGraphic.as
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/CompoundGraphic.as
@@ -14,9 +14,11 @@
package org.apache.flex.svg
{
- import org.apache.flex.graphics.ICompoundGraphic;
- import org.apache.flex.graphics.IFill;
- import org.apache.flex.graphics.SolidColor;
+ import org.apache.flex.graphics.ICompoundGraphic;
+ import org.apache.flex.graphics.IFill;
+ import org.apache.flex.graphics.IStroke;
+ import org.apache.flex.graphics.PathBuilder;
+ import org.apache.flex.graphics.SolidColor;
COMPILE::SWF
{
@@ -35,21 +37,21 @@ package org.apache.flex.svg
import org.apache.flex.core.WrappedHTMLElement;
}
- /**
- * CompoundGraphic is a surface on which you can
- * draw various graphic elements such as Rect, Circle,
- * Ellipse, Path etc.
- * Use this class if you want to draw multiple graphic
- * shapes on a single container.
- *
- */
- public class CompoundGraphic extends GraphicShape implements ICompoundGraphic
- {
- private var _textColor:IFill;
-
- public function get textColor():IFill
+ /**
+ * CompoundGraphic is a surface on which you can
+ * draw various graphic elements such as Rect, Circle,
+ * Ellipse, Path etc.
+ * Use this class if you want to draw multiple graphic
+ * shapes on a single container.
+ *
+ */
+ public class CompoundGraphic extends GraphicShape implements ICompoundGraphic
+ {
+ private var _textFill:IFill;
+
+ public function get textFill():IFill
{
- return _textColor;
+ return _textFill;
}
/**
* The color of the text.
@@ -59,21 +61,40 @@ package org.apache.flex.svg
* @playerversion AIR 1.1
* @productversion FlexJS 0.0
*/
- public function set textColor(value:IFill):void
+ public function set textFill(value:IFill):void
{
- _textColor = value;
+ _textFill = value;
}
- /**
- * Removes all of the drawn elements of the container.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0.3
- */
- public function removeAllElements():void
- {
+ private var _textStroke:IStroke;
+
+ public function get textStroke():IStroke
+ {
+ return _textStroke;
+ }
+ /**
+ * The stroke color of the text.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion FlexJS 0.0
+ */
+ public function set textStroke(value:IStroke):void
+ {
+ _textStroke = value;
+ }
+
+ /**
+ * Removes all of the drawn elements of the container.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0.3
+ */
+ public function removeAllElements():void
+ {
clear();
}
@@ -100,21 +121,21 @@ package org.apache.flex.svg
}
}
- /**
- * Draw the rectangle.
- * @param x The x position of the top-left corner of the rectangle.
- * @param y The y position of the top-left corner.
- * @param width The width of the rectangle.
- * @param height The height of the rectangle.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0.3
+ /**
+ * Draw the rectangle.
+ * @param x The x position of the top-left corner of the rectangle.
+ * @param y The y position of the top-left corner.
+ * @param width The width of the rectangle.
+ * @param height The height of the rectangle.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0.3
* @flexjsignorecoercion org.apache.flex.core.WrappedHTMLElement
- */
- public function drawRect(x:Number, y:Number, width:Number, height:Number):void
- {
+ */
+ public function drawRect(x:Number, y:Number, width:Number, height:Number):void
+ {
COMPILE::SWF
{
applyStroke();
@@ -136,23 +157,23 @@ package org.apache.flex.svg
rect.setAttribute('height', String(height) + 'px');
element.appendChild(rect);
}
- }
-
- /**
- * Draw the ellipse.
- * @param x The x position of the top-left corner of the bounding box of the ellipse.
- * @param y The y position of the top-left corner of the bounding box of the ellipse.
- * @param width The width of the ellipse.
- * @param height The height of the ellipse.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0.3
+ }
+
+ /**
+ * Draw the ellipse.
+ * @param x The x position of the top-left corner of the bounding box of the ellipse.
+ * @param y The y position of the top-left corner of the bounding box of the ellipse.
+ * @param width The width of the ellipse.
+ * @param height The height of the ellipse.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0.3
* @flexjsignorecoercion org.apache.flex.core.WrappedHTMLElement
- */
- public function drawEllipse(x:Number, y:Number, width:Number, height:Number):void
- {
+ */
+ public function drawEllipse(x:Number, y:Number, width:Number, height:Number):void
+ {
COMPILE::SWF
{
applyStroke();
@@ -174,22 +195,22 @@ package org.apache.flex.svg
ellipse.setAttribute('ry', String(height / 2));
element.appendChild(ellipse);
}
- }
-
- /**
- * Draw the circle.
- * @param x The x location of the center of the circle
- * @param y The y location of the center of the circle.
- * @param radius The radius of the circle.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0
+ }
+
+ /**
+ * Draw the circle.
+ * @param x The x location of the center of the circle
+ * @param y The y location of the center of the circle.
+ * @param radius The radius of the circle.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
* @flexjsignorecoercion org.apache.flex.core.WrappedHTMLElement
- */
- public function drawCircle(x:Number, y:Number, radius:Number):void
- {
+ */
+ public function drawCircle(x:Number, y:Number, radius:Number):void
+ {
COMPILE::SWF
{
applyStroke();
@@ -212,26 +233,26 @@ package org.apache.flex.svg
element.appendChild(circle);
}
- }
-
- /**
- * Draw the path.
- * @param data A string containing a compact represention of the path segments.
- * The value is a space-delimited string describing each path segment. Each
- * segment entry has a single character which denotes the segment type and
- * two or more segment parameters.
- *
- * If the segment command is upper-case, the parameters are absolute values.
- * If the segment command is lower-case, the parameters are relative values.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0
+ }
+
+ /**
+ * Draw the path.
+ * @param data A string containing a compact represention of the path segments.
+ * The value is a space-delimited string describing each path segment. Each
+ * segment entry has a single character which denotes the segment type and
+ * two or more segment parameters.
+ *
+ * If the segment command is upper-case, the parameters are absolute values.
+ * If the segment command is lower-case, the parameters are relative values.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
* @flexjsignorecoercion org.apache.flex.core.WrappedHTMLElement
- */
- public function drawPath(data:String):void
- {
+ */
+ public function drawPath(data:String):void
+ {
COMPILE::SWF
{
applyStroke();
@@ -252,34 +273,187 @@ package org.apache.flex.svg
path.setAttribute('d', data);
element.appendChild(path);
}
- }
+ }
+
+ public function drawLine():void
+ {
+
+ }
+
+ public function drawPolygon():void
+ {
- public function drawLine():void
- {
+ }
+
+
+ /**
+ * Draws a rounded rectangle using the size of a radius to draw the rounded corners.
+ * You must set the line style, fill, or both
+ * on the Graphics object before
+ * you call the <code>drawRoundRectComplex()</code> method
+ * by calling the <code>linestyle()</code>,
+ * <code>lineGradientStyle()</code>, <code>beginFill()</code>,
+ * <code>beginGradientFill()</code>, or
+ * <code>beginBitmapFill()</code> method.
+ *
+ * @param graphics The Graphics object that draws the rounded rectangle.
+ *
+ * @param x The horizontal position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param y The vertical position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param width The width of the round rectangle, in pixels.
+ *
+ * @param height The height of the round rectangle, in pixels.
+ *
+ * @param topLeftRadius The radius of the upper-left corner, in pixels.
+ *
+ * @param topRightRadius The radius of the upper-right corner, in pixels.
+ *
+ * @param bottomLeftRadius The radius of the bottom-left corner, in pixels.
+ *
+ * @param bottomRightRadius The radius of the bottom-right corner, in pixels.
+ *
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function drawRoundRectComplex(x:Number, y:Number,
+ width:Number, height:Number,
+ topLeftRadius:Number, topRightRadius:Number,
+ bottomLeftRadius:Number, bottomRightRadius:Number):void
+ {
+ COMPILE::SWF
+ {
+ applyStroke();
+ beginFill(new Rectangle(x,y,width,height), new Point(x,y));
+ graphics.drawRoundRectComplex(x,y,width,height,topLeftRadius,topRightRadius,bottomLeftRadius,bottomRightRadius);
+ endFill();
+ }
+ COMPILE::JS
+ {
+ var builder:PathBuilder = new PathBuilder();
+ builder.drawRoundRectComplex(x, y, width, height, topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius);
+ drawPath(builder.getPathString());
+ }
- }
- public function drawPolygon():void
- {
+ }
+
+ /**
+ * Draws a rounded rectangle using the size of individual x and y radii to
+ * draw the rounded corners.
+ * You must set the line style, fill, or both
+ * on the Graphics object before
+ * you call the <code>drawRoundRectComplex2()</code> method
+ * by calling the <code>linestyle()</code>,
+ * <code>lineGradientStyle()</code>, <code>beginFill()</code>,
+ * <code>beginGradientFill()</code>, or
+ * <code>beginBitmapFill()</code> method.
+ *
+ * @param graphics The Graphics object that draws the rounded rectangle.
+ *
+ * @param x The horizontal position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param y The vertical position relative to the
+ * registration point of the parent display object, in pixels.
+ *
+ * @param width The width of the round rectangle, in pixels.
+ *
+ * @param height The height of the round rectangle, in pixels.
+ *
+ * @param radiusX The default radiusX to use, if corner-specific values are not specified.
+ * This value must be specified.
+ *
+ * @param radiusY The default radiusY to use, if corner-specific values are not specified.
+ * If 0, the value of radiusX is used.
+ *
+ * @param topLeftRadiusX The x radius of the upper-left corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param topLeftRadiusY The y radius of the upper-left corner, in pixels. If NaN,
+ * the value of topLeftRadiusX is used.
+ *
+ * @param topRightRadiusX The x radius of the upper-right corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param topRightRadiusY The y radius of the upper-right corner, in pixels. If NaN,
+ * the value of topRightRadiusX is used.
+ *
+ * @param bottomLeftRadiusX The x radius of the bottom-left corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param bottomLeftRadiusY The y radius of the bottom-left corner, in pixels. If NaN,
+ * the value of bottomLeftRadiusX is used.
+ *
+ * @param bottomRightRadiusX The x radius of the bottom-right corner, in pixels. If NaN,
+ * the value of radiusX is used.
+ *
+ * @param bottomRightRadiusY The y radius of the bottom-right corner, in pixels. If NaN,
+ * the value of bottomRightRadiusX is used.
+ *
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10
+ * @playerversion AIR 1.5
+ * @productversion Flex 4
+ */
+ public function drawRoundRectComplex2(x:Number, y:Number,
+ width:Number, height:Number,
+ radiusX:Number, radiusY:Number,
+ topLeftRadiusX:Number, topLeftRadiusY:Number,
+ topRightRadiusX:Number, topRightRadiusY:Number,
+ bottomLeftRadiusX:Number, bottomLeftRadiusY:Number,
+ bottomRightRadiusX:Number, bottomRightRadiusY:Number):void
+ {
+ var builder:PathBuilder = new PathBuilder();
+ builder.drawRoundRectComplex2(x, y, width, height, radiusX, radiusY,topLeftRadiusX, topLeftRadiusY,topRightRadiusX, topRightRadiusY,bottomLeftRadiusX, bottomLeftRadiusY,bottomRightRadiusX, bottomRightRadiusY);
- }
+ COMPILE::SWF
+ {
+ applyStroke();
+ beginFill(new Rectangle(x,y,width,height), new Point(x,y));
+ builder.draw(graphics);
+ endFill();
+ }
+ COMPILE::JS
+ {
+ drawPath(builder.getPathString());
+ }
+ }
+
+ /*
+ What about these?
+ beginBitmapFill
+ beginFill
+ beginGradientFill
+ beginShaderFill
+ drawGraphicsData
+ drawRoundRect
+ drawTriangles
+ */
- /**
- * Draw a string of characters.
- * @param value The string to draw.
- * @param x The x location of the center of the circle
- * @param y The y location of the center of the circle.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion FlexJS 0.0
+ /**
+ * Draw a string of characters.
+ * @param value The string to draw.
+ * @param x The x location of the center of the circle
+ * @param y The y location of the center of the circle.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
* @flexjsignorecoercion org.apache.flex.core.WrappedHTMLElement
* @flexjsignorecoercion Text
* @flexjsignorecoercion Node
- */
- public function drawText(value:String, x:Number, y:Number):Object
- {
+ */
+ public function drawText(value:String, x:Number, y:Number):Object
+ {
COMPILE::SWF
{
var textField:CSSTextField = new CSSTextField();
@@ -291,7 +465,7 @@ package org.apache.flex.svg
textField.autoSize = "left";
textField.text = value;
- var color:SolidColor = textColor as SolidColor;
+ var color:SolidColor = textFill as SolidColor;
if (color) {
textField.textColor = color.color;
textField.alpha = color.alpha;
@@ -318,7 +492,7 @@ package org.apache.flex.svg
element.appendChild(text);
return text;
}
- }
+ }
/**
* @return {string} The style attribute.
@@ -327,31 +501,28 @@ package org.apache.flex.svg
public function getTxtStyleStr():String
{
var fillStr:String;
- if (textColor)
+ if (textFill)
{
- fillStr = textColor.addFillAttrib(this);
+ fillStr = textFill.addFillAttrib(this);
}
else
{
fillStr = 'fill:none';
}
- return fillStr;
- // Not supporting text strokes for now.
-/*
var strokeStr:String;
- if (stroke)
+ if (textStroke)
{
- strokeStr = stroke.addStrokeAttrib(this);
+ strokeStr = textStroke.addStrokeAttrib(this);
}
else
{
strokeStr = 'stroke:none';
}
return fillStr + ';' + strokeStr;
-*/
+
}
- }
+ }
}