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/master Commit: 6b16b713c7116744acf33933ccecc1f9cf6e5578 Parents: b3ab3eb Author: yishayw <[email protected]> Authored: Sun Jul 31 09:27:02 2016 +0300 Committer: yishayw <[email protected]> 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
