Repository: flex-asjs Updated Branches: refs/heads/develop 6913fa1cd -> ed7f71b1f
getBoundingClientRect() is unreliable, so add option to give original bounds as an argument. Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/ed7f71b1 Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/ed7f71b1 Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/ed7f71b1 Branch: refs/heads/develop Commit: ed7f71b1f6ebc63073822fd1787f97d3dcb3ec1a Parents: 6913fa1 Author: yishayw <yishayj...@hotmail.com> Authored: Mon Jan 9 11:24:56 2017 +0200 Committer: yishayw <yishayj...@hotmail.com> Committed: Mon Jan 9 11:24:56 2017 +0200 ---------------------------------------------------------------------- .../flex/org/apache/flex/utils/DisplayUtils.as | 51 +++++++++++++++++--- 1 file changed, 44 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ed7f71b1/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/DisplayUtils.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/DisplayUtils.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/DisplayUtils.as index 4e08ffd..586b6da 100644 --- a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/DisplayUtils.as +++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/DisplayUtils.as @@ -18,13 +18,19 @@ //////////////////////////////////////////////////////////////////////////////// package org.apache.flex.utils { + import org.apache.flex.core.IUIBase; + import org.apache.flex.geom.Matrix; import org.apache.flex.geom.Rectangle; + COMPILE::SWF + { + import flash.geom.Matrix; + } + COMPILE::JS { import org.apache.flex.geom.Point; - import org.apache.flex.geom.Matrix; import org.apache.flex.geom.Point; import org.apache.flex.core.ITransformHost; } @@ -52,7 +58,7 @@ package org.apache.flex.utils * @flexjsignorecoercion HTMLElement * @flexjsignorecoercion ITransformHost */ - public static function getScreenBoundingRect(obj:IUIBase):Rectangle + public static function getScreenBoundingRect(obj:IUIBase, boundsBeforeTransform:Rectangle=null):Rectangle { COMPILE::SWF { @@ -61,15 +67,17 @@ package org.apache.flex.utils COMPILE::JS { - var r:Object = (obj.element as HTMLElement).getBoundingClientRect(); - var bounds:Rectangle = new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top); + var bounds:Rectangle = boundsBeforeTransform; + if (bounds == null) + { + var r:Object = (obj.element as HTMLElement).getBoundingClientRect(); + bounds = new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top); + } bounds.x -= window.pageXOffset; bounds.y -= window.pageYOffset; if (obj.element instanceof SVGElement) { - var svgElement:Object = (obj as ITransformHost).transformElement as Object; - var sm:SVGMatrix = svgElement.getScreenCTM(); - var m:Matrix = new Matrix(sm.a,sm.b,sm.c,sm.d,sm.e,sm.f); + var m:org.apache.flex.geom.Matrix = getTransormMatrix(obj); var tl:Point = m.transformPoint(bounds.topLeft); var tr:Point = m.transformPoint(new Point(bounds.right, bounds.top)); var bl:Point = m.transformPoint(new Point(bounds.left, bounds.bottom)); @@ -86,6 +94,35 @@ package org.apache.flex.utils return bounds; } } + + /** + * Gets a composition all transform matrices applied to an IUIBase. Currently only works for SVG on JS side. + * + * @param obj The object to test. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + * @flexjsignorecoercion HTMLElement + * @flexjsignorecoercion ITransformHost + */ + public static function getTransormMatrix(obj:IUIBase):org.apache.flex.geom.Matrix + { + COMPILE::SWF + { + var m:flash.geom.Matrix = obj.$displayObject.transform.matrix; + return new org.apache.flex.geom.Matrix(m.a, m.b, m.c, m.d, m.tx, m.ty); + } + COMPILE::JS + { + // currently only works for SVG elements + var svgElement:Object = (obj as ITransformHost).transformElement as Object; + var sm:SVGMatrix = svgElement.getScreenCTM(); + return new org.apache.flex.geom.Matrix(sm.a,sm.b,sm.c,sm.d,sm.e,sm.f); + } + + } /** * Evaluates the bounding box of two objects to see if thier bounding boxes overlap.