topical media & game development
lib-flex-book-org-flashsandy-display-DistortImage.ax
lib-flex-book-org-flashsandy-display-DistortImage.ax
(swf
)
[ flash
]
flex
package org.flashsandy.display {
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.geom.Matrix;
import flash.geom.Point;
Tesselates an area into several triangles to allow free transform distortion on BitmapData objects.
@author Thomas Pfeiffer (aka kiroukou)
kiroukou@gmail.com
www.flashsandy.org
@author Ruben Swieringa
ruben.swieringa@gmail.com
www.rubenswieringa.com
www.rubenswieringa.com/blog
@version 1.1.0
edit 2
The original Actionscript2.0 version of the class was written by Thomas Pfeiffer (aka kiroukou),
inspired by Andre Michelle (andre-michelle.com).
Ruben Swieringa rewrote Thomas Pfeiffer's class in Actionscript3.0, making some minor changes/additions.
Copyright (c) 2005 Thomas PFEIFFER. All rights reserved.
Licensed under the CREATIVE COMMONS Attribution-NonCommercial-ShareAlike 2.0 you may not use this
file except in compliance with the License. You may obtain a copy of the License at:
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.en_GB
*
public class @ax-lib-flex-book-org-flashsandy-display-DistortImage {
// skew and translation matrix:
@private
protected var _sMat:Matrix, _tMat:Matrix;
@private
protected var _xMin:Number, _xMax:Number, _yMin:Number, _yMax:Number;
@private
protected var _hseg:uint, _vseg:uint;
@private
protected var _hsLen:Number, _vsLen:Number;
@private
protected var _p:Array;
@private
protected var _tri:Array;
// internals for accessors:
@private
protected var _w:Number, _h:Number;
// plain var properties:
Indicates whether or not use pixelsmoothing in the beginBitmapFill method of the Graphics class.
@default true
public var smoothing:Boolean = true;
Constructor.
@param w Width of the image to be processed
@param h Height of image to be processed
@param hseg Horizontal precision
@param vseg Vertical precision
public function @ax-lib-flex-book-org-flashsandy-display-DistortImage (w:Number,
h:Number,
hseg:uint=2,
vseg:uint=2):void {
_w = w;
_h = h;
_vseg = vseg;
_hseg = hseg;
__init();
}
Tesselates the area into triangles.
@private
protected function __init():void {
_p = new Array();
_tri = new Array();
var ix: Number;
var iy: Number;
var w2: Number = _w / 2;
var h2: Number = _h / 2;
_xMin = _yMin = 0;
_xMax = _w; _yMax = _h;
_hsLen = _w / ( _hseg + 1 );
_vsLen = _h / ( _vseg + 1 );
var x: Number, y: Number;
// create points:
for ( ix = 0 ; ix <_vseg + 2 ; ix++ ){
for ( iy = 0 ; iy <_hseg + 2 ; iy++ ){
x = ix * _hsLen;
y = iy * _vsLen;
_p.push( { x: x, y: y, sx: x, sy: y } );
}
}
// create triangles:
for ( ix = 0 ; ix <_vseg + 1 ; ix++ ){
for ( iy = 0 ; iy <_hseg + 1 ; iy++ ){
_tri.push([ _p[ iy + ix * ( _hseg + 2 ) ] , _p[ iy + ix * ( _hseg + 2 ) + 1 ] , _p[ iy + ( ix + 1 ) * ( _hseg + 2 ) ] ] );
_tri.push([ _p[ iy + ( ix + 1 ) * ( _hseg + 2 ) + 1 ] , _p[ iy + ( ix + 1 ) * ( _hseg + 2 ) ] , _p[ iy + ix * ( _hseg + 2 ) + 1 ] ] );
}
}
}
Distorts the provided BitmapData according to the provided Point instances and draws it onto the provided Graphics.
@param graphics Graphics on which to draw the distorted BitmapData
@param bmd The undistorted BitmapData
@param tl Point specifying the coordinates of the top-left corner of the distortion
@param tr Point specifying the coordinates of the top-right corner of the distortion
@param br Point specifying the coordinates of the bottom-right corner of the distortion
@param bl Point specifying the coordinates of the bottom-left corner of the distortion
public function setTransform (graphics:Graphics,
bmd:BitmapData,
tl:Point,
tr:Point,
br:Point,
bl:Point):void {
var dx30:Number = bl.x - tl.x;
var dy30:Number = bl.y - tl.y;
var dx21:Number = br.x - tr.x;
var dy21:Number = br.y - tr.y;
var l:Number = _p.length;
while( --l> -1 ){
var point:Object = _p[ l ];
var gx:Number = ( point.x - _xMin ) / _w;
var gy:Number = ( point.y - _yMin ) / _h;
var bx:Number = tl.x + gy * ( dx30 );
var by:Number = tl.y + gy * ( dy30 );
point.sx = bx + gx * ( ( tr.x + gy * ( dx21 ) ) - bx );
point.sy = by + gx * ( ( tr.y + gy * ( dy21 ) ) - by );
}
__render(graphics, bmd);
}
Distorts the provided BitmapData and draws it onto the provided Graphics.
@param graphics Graphics
@param bmd BitmapData
@private
protected function __render(graphics:Graphics, bmd:BitmapData):void {
var t: Number;
var vertices: Array;
var p0:Object, p1:Object, p2:Object;
var a:Array;
_sMat = new Matrix();
_tMat = new Matrix();
var l:Number = _tri.length;
while( --l> -1 ){
a = _tri[ l ];
p0 = a[0];
p1 = a[1];
p2 = a[2];
var x0: Number = p0.sx;
var y0: Number = p0.sy;
var x1: Number = p1.sx;
var y1: Number = p1.sy;
var x2: Number = p2.sx;
var y2: Number = p2.sy;
var u0: Number = p0.x;
var v0: Number = p0.y;
var u1: Number = p1.x;
var v1: Number = p1.y;
var u2: Number = p2.x;
var v2: Number = p2.y;
_tMat.tx = u0;
_tMat.ty = v0;
_tMat.a = ( u1 - u0 ) / _w;
_tMat.b = ( v1 - v0 ) / _w;
_tMat.c = ( u2 - u0 ) / _h;
_tMat.d = ( v2 - v0 ) / _h;
_sMat.a = ( x1 - x0 ) / _w;
_sMat.b = ( y1 - y0 ) / _w;
_sMat.c = ( x2 - x0 ) / _h;
_sMat.d = ( y2 - y0 ) / _h;
_sMat.tx = x0;
_sMat.ty = y0;
_tMat.invert();
_tMat.concat( _sMat );
// draw:
graphics.beginBitmapFill( bmd, _tMat, false, smoothing );
graphics.moveTo( x0, y0 );
graphics.lineTo( x1, y1 );
graphics.lineTo( x2, y2 );
graphics.endFill();
}
}
Sets the size of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance and re-initializes the triangular grid.
@param width New width.
@param height New height.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#width
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#height
public function setSize (width:Number, height:Number):void {
this._w = width;
this._h = height;
this.__init();
}
Sets the precision of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance and re-initializes the triangular grid.
@param horizontal New horizontal precision.
@param vertical New vertical precision.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#hPrecision
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#vPrecision
public function setPrecision (horizontal:Number, vertical:Number):void {
this._hseg = horizontal;
this._vseg = vertical;
this.__init();
}
Width of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance. Property can only be set through the class constructor.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#setSize()
public function get width ():Number {
return _w;
}
Height of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance. Property can only be set through the class constructor.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#setSize()
public function get height ():Number {
return _h;
}
Horizontal precision of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance. Property can only be set through the class constructor.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#setPrecision()
public function get hPrecision ():uint {
return _hseg;
}
Vertical precision of this @ax-lib-flex-book-org-flashsandy-display-DistortImage instance. Property can only be set through the class constructor.
@see @ax-lib-flex-book-org-flashsandy-display-DistortImage#setPrecision()
public function get vPrecision ():uint {
return _vseg;
}
}
}
(C) Æliens
18/6/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.