/* Copyright (c) 2009 Yahoo! Inc. All rights reserved. The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license */ package com.yahoo.astra.utils { import flash.display.DisplayObject; import flash.geom.Point; import flash.geom.Rectangle; /** * Utility functions for use with DisplayObjects. * * @author Josh Tynjala */ public class DisplayObjectUtil { /** * Converts a point from the local coordinate system of one DisplayObject to * the local coordinate system of another DisplayObject. * * @param point the point to convert * @param firstDisplayObject the original coordinate system * @param secondDisplayObject the new coordinate system */ public static function localToLocal(point:Point, firstDisplayObject:DisplayObject, secondDisplayObject:DisplayObject):Point { point = firstDisplayObject.localToGlobal(point); return secondDisplayObject.globalToLocal(point); } /** * Aligns a DisplayObject vertically and horizontally within specific bounds. * * @param target The DisplayObject to align. * @param bounds The rectangle in which to align the target DisplayObject. * @param horizontalAlign The alignment position along the horizontal axis. If null, * the target's horizontal position will not change. * @param verticalAlign The alignment position along the vertical axis. If null, * the target's vertical position will not change. */ public static function align(target:DisplayObject, bounds:Rectangle, horizontalAlign:String = null, verticalAlign:String = null):void { var horizontalDifference:Number = bounds.width - target.width; switch(horizontalAlign) { case "left": target.x = bounds.x; break; case "center": target.x = bounds.x + (horizontalDifference) / 2; break; case "right": target.x = bounds.x + horizontalDifference; break; } var verticalDifference:Number = bounds.height - target.height; switch(verticalAlign) { case "top": target.y = bounds.y; break; case "middle": target.y = bounds.y + (verticalDifference) / 2; break; case "bottom": target.y = bounds.y + verticalDifference; break; } } /** * Resizes a DisplayObject to fit into specified bounds such that the * aspect ratio of the target's width and height does not change. * * @param target The DisplayObject to resize. * @param width The desired width for the target. * @param height The desired height for the target. * @param aspectRatio The desired aspect ratio. If NaN, the aspect * ratio is calculated from the target's current * width and height. */ public static function resizeAndMaintainAspectRatio(target:DisplayObject, width:Number, height:Number, aspectRatio:Number = NaN):void { var currentAspectRatio:Number = !isNaN(aspectRatio) ? aspectRatio : target.width / target.height; var boundsAspectRatio:Number = width / height; if(currentAspectRatio < boundsAspectRatio) { target.width = Math.floor(height * currentAspectRatio); target.height = height; } else { target.width = width; target.height = Math.floor(width / currentAspectRatio); } } } }