blob: 922ea6a7aad2630adbfd138214c40a1f0be78288 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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 spark.primitives
{
import mx.core.UIComponent;
import mx.graphics.RectangularDropShadow;
/**
* <p>This class optimizes drop shadows for the common case.
* If you are applying a drop shadow to a rectangularly-shaped object
* whose edges fall on pixel boundaries, then this class should
* be used instead of using a DropShadowFilter directly.</p>
*
* <p>This class accepts the first four parameters that are passed
* to DropShadowFilter: <code>alpha</code>, <code>angle</code>,
* <code>color</code>, and <code>distance</code>.
* In addition, this class accepts the corner radii for each of the four
* corners of the rectangularly-shaped object that is casting a shadow.</p>
*
* <p>Once those 8 values have been set,
* this class pre-computes the drop shadow in an offscreen Bitmap.
* When the <code>drawShadow()</code> method is called, pieces of the
* precomputed drop shadow are copied onto the passed-in Graphics object.</p>
*
* @see spark.filters.DropShadowFilter
* @see flash.display.DisplayObject
*
* @includeExample examples/RectangularDropShadowExample.mxml
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public class RectangularDropShadow extends UIComponent
{
include "../core/Version.as";
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.1
* @productversion Flex 4
*/
public function RectangularDropShadow()
{
mouseEnabled = false;
super();
}
//--------------------------------------------------------------------------
//
// Variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private var dropShadow:mx.graphics.RectangularDropShadow;
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
//----------------------------------
// alpha
//----------------------------------
/**
* @private
* Storage for the alpha property.
*/
private var _alpha:Number = 0.4;
[Inspectable]
/**
* @copy spark.filters.DropShadowFilter#alpha
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
override public function get alpha():Number
{
return _alpha;
}
/**
* @private
*/
override public function set alpha(value:Number):void
{
if (_alpha != value)
{
_alpha = value;
invalidateDisplayList();
}
}
//----------------------------------
// angle
//----------------------------------
/**
* @private
* Storage for the angle property.
*/
private var _angle:Number = 45.0;
[Inspectable]
/**
* @copy spark.filters.DropShadowFilter#angle
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get angle():Number
{
return _angle;
}
/**
* @private
*/
public function set angle(value:Number):void
{
if (_angle != value)
{
_angle = value;
invalidateDisplayList();
}
}
//----------------------------------
// color
//----------------------------------
/**
* @private
* Storage for the color property.
*/
private var _color:int = 0;
[Inspectable]
/**
* @copy spark.filters.DropShadowFilter#color
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get color():int
{
return _color;
}
/**
* @private
*/
public function set color(value:int):void
{
if (_color != value)
{
_color = value;
invalidateDisplayList();
}
}
//----------------------------------
// distance
//----------------------------------
/**
* @private
* Storage for the distance property.
*/
private var _distance:Number = 4.0;
[Inspectable]
/**
* @copy flash.filters.DropShadowFilter#distance
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get distance():Number
{
return _distance;
}
/**
* @private
*/
public function set distance(value:Number):void
{
if (_distance != value)
{
_distance = value;
invalidateDisplayList();
}
}
//----------------------------------
// tlRadius
//----------------------------------
/**
* @private
* Storage for the tlRadius property.
*/
private var _tlRadius:Number = 0;
[Inspectable]
/**
* The corner radius of the top left corner
* of the rounded rectangle that is casting the shadow.
* May be zero for non-rounded rectangles.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get tlRadius():Number
{
return _tlRadius;
}
/**
* @private
*/
public function set tlRadius(value:Number):void
{
if (_tlRadius != value)
{
_tlRadius = value;
invalidateDisplayList();
}
}
//----------------------------------
// trRadius
//----------------------------------
/**
* @private
* Storage for the trRadius property.
*/
private var _trRadius:Number = 0;
[Inspectable]
/**
* The corner radius of the top right corner
* of the rounded rectangle that is casting the shadow.
* May be zero for non-rounded rectangles.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get trRadius():Number
{
return _trRadius;
}
/**
* @private
*/
public function set trRadius(value:Number):void
{
if (_trRadius != value)
{
_trRadius = value;
invalidateDisplayList();
}
}
//----------------------------------
// blRadius
//----------------------------------
/**
* @private
* Storage for the blRadius property.
*/
private var _blRadius:Number = 0;
[Inspectable]
/**
* The corner radius of the bottom left corner
* of the rounded rectangle that is casting the shadow.
* May be zero for non-rounded
* rectangles.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get blRadius():Number
{
return _blRadius;
}
/**
* @private
*/
public function set blRadius(value:Number):void
{
if (_blRadius != value)
{
_blRadius = value;
invalidateDisplayList();
}
}
//----------------------------------
// brRadius
//----------------------------------
/**
* @private
* Storage for the brRadius property.
*/
private var _brRadius:Number = 0;
[Inspectable]
/**
* The corner radius of the bottom right corner
* of the rounded rectangle that is casting the shadow.
* May be zero for non-rounded rectangles.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get brRadius():Number
{
return _brRadius;
}
/**
* @private
*/
public function set brRadius(value:Number):void
{
if (_brRadius != value)
{
_brRadius = value;
invalidateDisplayList();
}
}
//----------------------------------
// blurX
//----------------------------------
/**
* @private
* Storage for the brRadius property.
*/
private var _blurX:Number = 4;
[Inspectable]
/**
* The amount of horizontal blur.
* @default 4
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get blurX():Number
{
return _blurX;
}
/**
* @private
*/
public function set blurX(value:Number):void
{
if (_blurX != value)
{
_blurX = value;
invalidateDisplayList();
}
}
//----------------------------------
// blurY
//----------------------------------
/**
* @private
* Storage for the brRadius property.
*/
private var _blurY:Number = 4;
[Inspectable]
/**
* The amount of vertical blur.
* @default 4
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function get blurY():Number
{
return _blurY;
}
/**
* @private
*/
public function set blurY(value:Number):void
{
if (_blurY != value)
{
_blurY = value;
invalidateDisplayList();
}
}
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
graphics.clear();
if (!dropShadow)
dropShadow = new mx.graphics.RectangularDropShadow();
dropShadow.distance = _distance;
dropShadow.angle = _angle;
dropShadow.color = _color;
dropShadow.blurX = _blurX;
dropShadow.blurY = _blurY;
dropShadow.alpha = _alpha;
dropShadow.tlRadius = isNaN(_tlRadius) ? 0 : _tlRadius;
dropShadow.trRadius = isNaN(_trRadius) ? 0 : _trRadius;
dropShadow.blRadius = isNaN(_blRadius) ? 0 : _blRadius;
dropShadow.brRadius = isNaN(_brRadius) ? 0 : _brRadius;
dropShadow.drawShadow(graphics, 0, 0, unscaledWidth, unscaledHeight);
}
}
}