You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by pu...@apache.org on 2020/12/01 13:41:07 UTC

[royale-asjs] branch develop updated: Create GraphicsUtil.as

This is an automated email from the ASF dual-hosted git repository.

pushminakazi pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 8d6c0eb  Create GraphicsUtil.as
8d6c0eb is described below

commit 8d6c0eb9be1aa287dc500eefd08a17f52afde00f
Author: pashminakazi <42...@users.noreply.github.com>
AuthorDate: Tue Dec 1 18:41:00 2020 +0500

    Create GraphicsUtil.as
---
 .../src/main/royale/mx/utils/GraphicsUtil.as       | 298 +++++++++++++++++++++
 1 file changed, 298 insertions(+)

diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/utils/GraphicsUtil.as b/frameworks/projects/MXRoyale/src/main/royale/mx/utils/GraphicsUtil.as
new file mode 100644
index 0000000..e528343
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/utils/GraphicsUtil.as
@@ -0,0 +1,298 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 mx.utils
+{
+
+import mx.display.Graphics;
+
+/**
+ *  The Graphics class is an all-static class with utility methods
+ *  related to the Graphics class.
+ *  You do not create instances of GraphicsUtil;
+ *  instead you simply call methods such as the
+ *  <code>GraphicsUtil.drawRoundRectComplex()</code> method.
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 9
+ *  @playerversion AIR 1.1
+ *  @productversion Flex 3
+ */
+public class GraphicsUtil
+{
+	//include "../core/Version.as";
+
+	//--------------------------------------------------------------------------
+	//
+	//  Class methods
+	//
+	//--------------------------------------------------------------------------
+    
+    /**
+     * 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 static function drawRoundRectComplex(graphics:Graphics, x:Number, y:Number, 
+                                                width:Number, height:Number, 
+                                                topLeftRadius:Number, topRightRadius:Number, 
+                                                bottomLeftRadius:Number, bottomRightRadius:Number):void
+    {
+        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;
+        graphics.moveTo(xw, yh - bottomRightRadius);
+        graphics.curveTo(xw, yh - s, xw - a, yh - a);
+        graphics.curveTo(xw - s, yh, xw - bottomRightRadius, yh);
+        
+        // bottom-left corner
+        a = bottomLeftRadius * 0.292893218813453;
+        s = bottomLeftRadius * 0.585786437626905;
+        graphics.lineTo(x + bottomLeftRadius, yh);
+        graphics.curveTo(x + s, yh, x + a, yh - a);
+        graphics.curveTo(x, yh - s, x, yh - bottomLeftRadius);
+        
+        // top-left corner
+        a = topLeftRadius * 0.292893218813453;
+        s = topLeftRadius * 0.585786437626905;
+        graphics.lineTo(x, y + topLeftRadius);
+        graphics.curveTo(x, y + s, x + a, y + a);
+        graphics.curveTo(x + s, y, x + topLeftRadius, y);
+        
+        // top-right corner
+        a = topRightRadius * 0.292893218813453;
+        s = topRightRadius * 0.585786437626905;
+        graphics.lineTo(xw - topRightRadius, y);
+        graphics.curveTo(xw - s, y, xw - a, y + a);
+        graphics.curveTo(xw, y + s, xw, y + topRightRadius);
+        graphics.lineTo(xw, yh - bottomRightRadius);
+    }
+    
+    /**
+     * 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 static function drawRoundRectComplex2(graphics:Graphics, 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;
+        graphics.moveTo(xw, yh - bottomRightRadiusY);
+        graphics.curveTo(xw, yh - sY, xw - aX, yh - aY);
+        graphics.curveTo(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;
+        graphics.lineTo(x + bottomLeftRadiusX, yh);
+        graphics.curveTo(x + sX, yh, x + aX, yh - aY);
+        graphics.curveTo(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;
+        graphics.lineTo(x, y + topLeftRadiusY);
+        graphics.curveTo(x, y + sY, x + aX, y + aY);
+        graphics.curveTo(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;
+        graphics.lineTo(xw - topRightRadiusX, y);
+        graphics.curveTo(xw - sX, y, xw - aX, y + aY);
+        graphics.curveTo(xw, y + sY, xw, y + topRightRadiusY);
+        graphics.lineTo(xw, yh - bottomRightRadiusY);
+    }
+}
+
+}