You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2016/08/25 15:32:22 UTC

[14/50] [abbrv] git commit: [flex-asjs] [refs/heads/spark] - Added IMatrix and MeagerMatrix to reduce overhead when creating Matrices.

Added IMatrix and MeagerMatrix to reduce overhead when creating Matrices.


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/6b16b713
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/6b16b713
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/6b16b713

Branch: refs/heads/spark
Commit: 6b16b713c7116744acf33933ccecc1f9cf6e5578
Parents: b3ab3eb
Author: yishayw <yi...@hotmail.com>
Authored: Sun Jul 31 09:27:02 2016 +0300
Committer: yishayw <yi...@hotmail.com>
Committed: Sun Jul 31 09:27:02 2016 +0300

----------------------------------------------------------------------
 .../projects/Core/src/main/flex/CoreClasses.as  |  1 +
 .../org/apache/flex/core/ITransformModel.as     | 47 +++++++++++
 .../apache/flex/core/TransformCompoundModel.as  | 52 ++++++++++++
 .../flex/org/apache/flex/core/TransformModel.as | 50 +++++++++++
 .../org/apache/flex/core/TransformMoveXModel.as | 25 ++++++
 .../org/apache/flex/core/TransformMoveYModel.as | 25 ++++++
 .../apache/flex/core/TransformRotateModel.as    | 28 +++++++
 .../org/apache/flex/core/TransformScaleModel.as | 24 ++++++
 .../main/flex/org/apache/flex/geom/Matrix.as    | 76 +++++++++++++++--
 .../flex/org/apache/flex/svg/TransformBead.as   | 87 ++++++++++++++++++++
 10 files changed, 407 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/CoreClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/CoreClasses.as b/frameworks/projects/Core/src/main/flex/CoreClasses.as
index a1cfe9c..df30ea2 100644
--- a/frameworks/projects/Core/src/main/flex/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/flex/CoreClasses.as
@@ -107,6 +107,7 @@ internal class CoreClasses
 	import org.apache.flex.events.ValueEvent; ValueEvent;
     import org.apache.flex.events.utils.MouseUtils; MouseUtils;
 	import org.apache.flex.geom.Matrix; Matrix;
+	import org.apache.flex.geom.MeagerMatrix; MeagerMatrix;
     import org.apache.flex.geom.Point; Point;
     import org.apache.flex.geom.Rectangle; Rectangle;
     import org.apache.flex.utils.BinaryData; BinaryData;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/ITransformModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/ITransformModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/ITransformModel.as
new file mode 100644
index 0000000..a88fcb6
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/ITransformModel.as
@@ -0,0 +1,47 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You 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.core
+{
+	import org.apache.flex.events.IEventDispatcher;
+	import org.apache.flex.geom.IMatrix;
+	
+    /**
+     *  The ITransformModel interface describes the minimum set of properties
+     *  needed to define a transformation on an object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+	public interface ITransformModel extends IEventDispatcher, IBeadModel
+	{
+        /**
+         *  The matrix of the Transform
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+		function get matrix():IMatrix;
+		function set matrix(value:IMatrix):void;
+		
+	}
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformCompoundModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformCompoundModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformCompoundModel.as
new file mode 100644
index 0000000..0a1b448
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformCompoundModel.as
@@ -0,0 +1,52 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.geom.IMatrix;
+
+	[DefaultProperty("transformModels")]
+	public class TransformCompoundModel extends TransformModel
+	{
+		public function set transformModels(value:Array):void
+		{
+			if (value && value.length > 0)
+			{
+				var length:int = value.length;
+				var product:IMatrix = (value[0] as ITransformModel).matrix.clone();
+				for (var i:int = 1; i < length; i++)
+				{
+					var current:IMatrix = (value[i] as ITransformModel).matrix;
+					concat(product, current);
+				}
+				matrix = product;
+			} else
+			{
+				matrix = null;
+			}
+		}
+		
+		private function concat(product:IMatrix, factor:IMatrix):void
+		{
+			var result_a:Number = product.a * factor.a;
+			var result_b:Number = 0.0;
+			var result_c:Number = 0.0;
+			var result_d:Number = product.d * factor.d;
+			var result_tx:Number = product.tx * factor.a + factor.tx;
+			var result_ty:Number = product.ty * factor.d + factor.ty;
+			if (product.b != 0.0 || product.c != 0.0 || factor.b != 0.0 || factor.c != 0.0)
+			{
+				result_a = result_a + product.b * factor.c;
+				result_d = result_d + product.c * factor.b;
+				result_b = result_b + (product.a * factor.b + product.b * factor.d);
+				result_c = result_c + (product.c * factor.a + product.d * factor.c);
+				result_tx = result_tx + product.ty * factor.c;
+				result_ty = result_ty + product.tx * factor.b;
+			}
+			product.a = result_a;
+			product.b = result_b;
+			product.c = result_c;
+			product.d = result_d;
+			product.tx = result_tx;
+			product.ty = result_ty;
+		}
+		
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformModel.as
new file mode 100644
index 0000000..4fa2a20
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformModel.as
@@ -0,0 +1,50 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.events.Event;
+	import org.apache.flex.events.EventDispatcher;
+	import org.apache.flex.geom.IMatrix;
+	
+	public class TransformModel extends EventDispatcher implements ITransformModel
+	{
+		
+		public static const CHANGE:String = "transferModelChange";
+		
+		private var _matrix:IMatrix;
+		private var _strand:IStrand;
+		
+		public function TransformModel()
+		{
+		}
+		
+		public function get matrix():IMatrix
+		{
+			return _matrix;
+		}
+
+		private function dispatchModelChangeEvent():void
+		{
+			host.dispatchEvent(new Event(CHANGE));
+		}
+		
+		private function get host():ITransformHost
+		{
+			return _strand as ITransformHost;
+		}
+		
+		public function set matrix(value:IMatrix):void
+		{
+			_matrix = value;
+			if (_strand)
+			{
+				dispatchModelChangeEvent();
+			}
+		}
+		
+		public function set strand(value:IStrand):void 
+		{
+			_strand = value;
+			dispatchModelChangeEvent();
+		}
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveXModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveXModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveXModel.as
new file mode 100644
index 0000000..1cb692e
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveXModel.as
@@ -0,0 +1,25 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.geom.MeagerMatrix;
+
+	public class TransformMoveXModel extends TransformModel
+	{
+		private var _x:Number;
+		
+		public function TransformMoveXModel()
+		{
+		}
+
+		public function get x():Number
+		{
+			return _x;
+		}
+
+		public function set x(value:Number):void
+		{
+			_x = value;
+			matrix = new MeagerMatrix(1, 0, 0, 1, x, 0);
+		}
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveYModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveYModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveYModel.as
new file mode 100644
index 0000000..13d0384
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformMoveYModel.as
@@ -0,0 +1,25 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.geom.MeagerMatrix;
+
+	public class TransformMoveYModel extends TransformModel
+	{
+		private var _y:Number;
+		
+		public function TransformMoveYModel()
+		{
+		}
+
+		public function get y():Number
+		{
+			return _y;
+		}
+
+		public function set y(value:Number):void
+		{
+			_y = value;
+			matrix = new MeagerMatrix(1, 0, 0, 1, 0, y);
+		}
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformRotateModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformRotateModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformRotateModel.as
new file mode 100644
index 0000000..90e0a46
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformRotateModel.as
@@ -0,0 +1,28 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.geom.MeagerMatrix;
+	
+	
+	public class TransformRotateModel extends TransformModel
+	{
+		private var _angle:Number;
+		
+		public function TransformRotateModel()
+		{
+		}
+		
+		public function get angle():Number
+		{
+			return _angle;
+		}
+
+		public function set angle(value:Number):void
+		{
+			_angle = value;
+			var radians:Number = value * Math.PI/180;
+			matrix = new MeagerMatrix(Math.cos(radians), Math.sin(radians), -Math.sin(radians), Math.cos(radians));
+		}
+
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformScaleModel.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformScaleModel.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformScaleModel.as
new file mode 100644
index 0000000..798b66d
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/core/TransformScaleModel.as
@@ -0,0 +1,24 @@
+package org.apache.flex.core
+{
+	import org.apache.flex.geom.MeagerMatrix;
+
+	public class TransformScaleModel extends TransformModel
+	{
+		private var _scale:Number
+		public function TransformScaleModel()
+		{
+		}
+
+		public function get scale():Number
+		{
+			return _scale;
+		}
+
+		public function set scale(value:Number):void
+		{
+			_scale = value;
+			matrix = new MeagerMatrix(scale, 0, 0, scale, 0, 0);
+		}
+
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Core/src/main/flex/org/apache/flex/geom/Matrix.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/geom/Matrix.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/geom/Matrix.as
index da88259..bf634e3 100644
--- a/frameworks/projects/Core/src/main/flex/org/apache/flex/geom/Matrix.as
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/geom/Matrix.as
@@ -19,7 +19,7 @@
 package org.apache.flex.geom
 {
 
-	public class Matrix
+	public class Matrix implements IMatrix
 	{
 		public function Matrix(a:Number = 1, b:Number = 0, c:Number = 0, d:Number = 1, tx:Number = 0, ty:Number = 0)
 		{
@@ -31,14 +31,74 @@ package org.apache.flex.geom
 			this.ty = ty;
 
 		}
-		public var a:Number;
-		public var b:Number;
-		public var c:Number;
-		public var d:Number;
-		public var tx:Number;
-		public var ty:Number;
+		private var _a:Number;
+		private var _b:Number;
+		private var _c:Number;
+		private var _d:Number;
+		private var _tx:Number;
+		private var _ty:Number;
 
-		public function clone():Matrix
+		public function get ty():Number
+		{
+			return _ty;
+		}
+
+		public function set ty(value:Number):void
+		{
+			_ty = value;
+		}
+
+		public function get tx():Number
+		{
+			return _tx;
+		}
+
+		public function set tx(value:Number):void
+		{
+			_tx = value;
+		}
+
+		public function get d():Number
+		{
+			return _d;
+		}
+
+		public function set d(value:Number):void
+		{
+			_d = value;
+		}
+
+		public function get c():Number
+		{
+			return _c;
+		}
+
+		public function set c(value:Number):void
+		{
+			_c = value;
+		}
+
+		public function get b():Number
+		{
+			return _b;
+		}
+
+		public function set b(value:Number):void
+		{
+			_b = value;
+		}
+
+		public function get a():Number
+		{
+			return _a;
+		}
+
+		public function set a(value:Number):void
+		{
+			_a = value;
+		}
+
+		public function clone():IMatrix
 		{
 			return new Matrix(a, b, c, d, tx, ty);
 		}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/6b16b713/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/TransformBead.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/TransformBead.as b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/TransformBead.as
new file mode 100644
index 0000000..60af498
--- /dev/null
+++ b/frameworks/projects/Graphics/src/main/flex/org/apache/flex/svg/TransformBead.as
@@ -0,0 +1,87 @@
+package org.apache.flex.svg
+{
+	import org.apache.flex.core.IBeadTransform;
+	import org.apache.flex.core.IStrand;
+	import org.apache.flex.core.ITransformHost;
+	import org.apache.flex.core.ITransformModel;
+	import org.apache.flex.core.TransformModel;
+	import org.apache.flex.events.Event;
+	import org.apache.flex.geom.IMatrix;
+
+	COMPILE::SWF {
+		import flash.display.Sprite;
+		import flash.geom.Matrix;
+	}
+	
+	public class TransformBead implements IBeadTransform
+	{
+		private var _strand:IStrand;
+		
+		public function TransformBead()
+		{
+		}
+		
+		/**
+		 *  @copy org.apache.flex.core.IBead#strand
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.0
+		 */		
+		public function set strand(value:IStrand):void
+		{
+			_strand = value;
+			host.addEventListener(TransformModel.CHANGE, changeHandler);
+			var model:ITransformModel = transformModel;
+			if (model && model.matrix)
+			{
+				transform();
+			}
+		}
+		
+		public function get transformModel():ITransformModel
+		{
+			return host.getBeadByType(ITransformModel) as ITransformModel;
+		}
+				
+		COMPILE::SWF
+		public function transform():void
+		{
+			var element:Sprite = host.transformElement as Sprite;
+			var fjsm:org.apache.flex.geom.IMatrix = transformModel.matrix;
+			var flashMatrix:flash.geom.Matrix = new flash.geom.Matrix(fjsm.a, fjsm.b, fjsm.c, fjsm.d, fjsm.tx, fjsm.ty);
+			element.transform.matrix = flashMatrix;
+		}
+		/**
+		 * @flexjsignorecoercion HTMLElement
+		 */
+		COMPILE::JS
+		public function transform():void
+		{
+			var element:org.apache.flex.core.WrappedHTMLElement = host.transformElement;
+			(element.parentNode as HTMLElement).setAttribute("overflow", "visible");
+			var fjsm:org.apache.flex.geom.IMatrix = transformModel.matrix;
+			var matrixArray:Array = [fjsm.a , fjsm.b, fjsm.c, fjsm.d, fjsm.tx, fjsm.ty];
+			element.setAttribute("transform", "matrix(" +matrixArray.join(",") + ")";
+		}
+		
+		private function changeHandler(e:Event):void
+		{
+			transform();
+		}
+		
+		/**
+		 *  The host component. 
+		 * 
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.0
+		 */
+		public function get host():ITransformHost
+		{
+			return _strand as ITransformHost;
+		}
+	}
+}
\ No newline at end of file