チェンジセット 766

差分発生行の前後
無視リスト:
コミット日時:
2008/07/03 21:44:28 (2 ヶ月前)
コミッタ:
nutsu
ログメッセージ:

bitmap系ぼちぼち

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Frocessing/trunk/src/frocessing/bmp/BmpUtil.as

    r747 r766  
    5151                 * @return      BitmapData 
    5252                 */ 
    53                 public static function makeImage( dobj:DisplayObject, margin:int=0, scale:Number=1, smooth:Boolean=false, bd:BitmapData=null ):BitmapData 
     53                public static function makeImage( dobj:DisplayObject, margin:int=0, scaleX:Number=1, scaleY:Number=1, smooth:Boolean=false, bd:BitmapData=null ):BitmapData 
    5454                { 
    5555                        var mt:Matrix    = dobj.transform.matrix; 
    5656                        var rt:Rectangle = ( dobj.parent ) ? dobj.getBounds( dobj.parent ) : dobj.getBounds( dobj ); 
    57                         var w:uint = Math.ceil( rt.width * scale ); 
    58                         var h:uint = Math.ceil( rt.height * scale ); 
     57                        var w:uint = Math.ceil( rt.width * scaleX ); 
     58                        var h:uint = Math.ceil( rt.height * scaleY ); 
    5959                        mt.translate( -rt.x, -rt.y ); 
    60                         mt.scale( scale, scale ); 
     60                        mt.scale( scaleX, scaleY ); 
    6161                        mt.translate( margin, margin ); 
    6262                        if( bd==null ) 
  • as3/Frocessing/trunk/src/frocessing/bmp/FBitmapData.as

    r747 r766  
    2727package frocessing.bmp { 
    2828        import flash.display.BitmapData; 
     29        import flash.display.BitmapDataChannel; 
     30        import flash.display.DisplayObject; 
     31        import flash.geom.ColorTransform; 
     32        import flash.geom.Point; 
     33        import flash.geom.Rectangle; 
    2934         
     35         
     36        /** 
     37         * TODO: copyPixels と setPixels の比較 
     38         */ 
    3039        /** 
    3140        * ... 
     
    3443        public class FBitmapData extends BitmapData { 
    3544                 
    36                 /** 
    37                  *  
    38                  */ 
    39                 public function FBitmapData( width_:uint, height_:uint, transparent_:Boolean = true, bgcolor_:uint = 0xffffffff )  
     45                private static const zeropoint:Point = new Point(); 
     46                private static var _colortransform:ColorTransform = new ColorTransform(); 
     47                 
     48                private var _keep_src:Boolean = false; 
     49                private var _srcbitmap:BitmapData; 
     50                 
     51                /** 
     52                 * FBitmapData のインスタンスを生成します. 
     53                 */ 
     54                public function FBitmapData( width_:uint, height_:uint, transparent_:Boolean = true, bgcolor_:uint = 0xffffffff, keepOriginal_:Boolean=false  )  
    4055                { 
    4156                        super( width_, height_, transparent_, bgcolor_ ); 
     57                        if ( keepOriginal_ ) 
     58                                keep = keepOriginal_; 
     59                } 
     60                 
     61                /** 
     62                 *  
     63                 * @param       alphaSrcBitmapData 
     64                 * @param       channel 
     65                 */ 
     66                public function mask( alphaSrc:BitmapData, channel:uint=8 ):void 
     67                { 
     68                        copyChannel( alphaSrc, rect, zeropoint, channel, BitmapDataChannel.ALPHA ); 
     69                } 
     70                 
     71                /** 
     72                 *  
     73                 * @param       shape 
     74                 * @param       fit 
     75                 */ 
     76                public function maskShape( alphaSrc:DisplayObject, fit:Boolean = false ):void 
     77                { 
     78                        var scaleX:Number = 1; 
     79                        var scaleY:Number = 1; 
     80                        if ( fit ) 
     81                        { 
     82                                scaleX = width / alphaSrc.width; 
     83                                scaleY = height/alphaSrc.height; 
     84                        } 
     85                        var alphashape:BitmapData = BmpUtil.makeImage( alphaSrc, 0, scaleX, scaleY, false ); 
     86                        mask( alphashape ); 
     87                        alphashape.dispose(); 
     88                        alphashape = null; 
     89                } 
     90                 
     91                /** 
     92                 *  
     93                 * @param       c1 
     94                 * @param       c2 
     95                 * @param       c3 
     96                 * @param       c4 
     97                 */ 
     98                public function tint( c1:Number, c2:Number=NaN, c3:Number=NaN, c4:Number=NaN ):void 
     99                { 
     100                        if ( isNaN( c2 ) ) 
     101                        { 
     102                                _colortransform.redMultiplier   = c1; 
     103                                _colortransform.greenMultiplier = c1; 
     104                                _colortransform.blueMultiplier  = c1; 
     105                                _colortransform.alphaMultiplier = 1.0; 
     106                        } 
     107                        else if ( isNaN( c3 ) ) 
     108                        { 
     109                                _colortransform.redMultiplier   = c1; 
     110                                _colortransform.greenMultiplier = c1; 
     111                                _colortransform.blueMultiplier  = c1; 
     112                                _colortransform.alphaMultiplier = c2; 
     113                        } 
     114                        else if ( isNaN( c4 ) ) 
     115                        { 
     116                                _colortransform.redMultiplier   = c1; 
     117                                _colortransform.greenMultiplier = c2; 
     118                                _colortransform.blueMultiplier  = c3; 
     119                                _colortransform.alphaMultiplier = 1.0; 
     120                        } 
     121                        else 
     122                        { 
     123                                _colortransform.redMultiplier   = c1; 
     124                                _colortransform.greenMultiplier = c2; 
     125                                _colortransform.blueMultiplier  = c3; 
     126                                _colortransform.alphaMultiplier = c4; 
     127                        } 
     128                        colorTransform( rect, _colortransform ); 
    42129                } 
    43130                 
     
    59146                 
    60147                /** 
    61                  * @private 
    62                  */ 
    63                 /* 
    64                 private function _pixelblend( c1:uint, c2:uint, a2:uint ):uint 
    65                 { 
    66                         var a1:uint = c1 >>> 24; 
    67                         var a0:uint = a2^0xff; 
    68                         c1 &= 0x00ffffff; 
    69                         var _r:uint = ( a0*(c1>>16) + a2*(c2>>16) ) >> 8 ; 
    70                         var _g:uint = ( a0*(( c1&0x00ff00 )>>8) + a2*(( c2&0x00ff00 )>>8) ) & 0xff00; 
    71                         var _b:uint = ( a0*( c1 & 0xff ) + a2*( c2 & 0xff ) ) >> 8; 
    72                         return Math.min( a1 + a2, 0xff ) << 24 | _r << 16 | _g | _b; 
    73                 } 
    74                 */ 
     148                 * BitmapData 全体の alpha 値 を指定します. 
     149                 */ 
     150                public function set alpha( value:Number ):void 
     151                { 
     152                        if ( transparent ) 
     153                        { 
     154                                var a:uint = Math.floor( value * 0xff ) << 24 | 0x000000; 
     155                                var alphadata:BitmapData = new BitmapData( width, height, true, a ); 
     156                                copyChannel( alphadata, rect, zeropoint, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA ); 
     157                                alphadata.dispose(); 
     158                                alphadata = null; 
     159                        } 
     160                        else 
     161                        { 
     162                                throw new Error( "this bitmapdata is not supported alpha channel." ); 
     163                        } 
     164                } 
     165                 
     166                /** 
     167                 * オリジナルデータを保持している場合、データを復帰します. 
     168                 */ 
     169                public function restore():void 
     170                { 
     171                        if ( _keep_src ) 
     172                                copyPixels( _srcbitmap, rect, zeropoint ); 
     173                } 
     174                 
     175                /** 
     176                 * オリジナルデータを保持している場合、データを反映させます. 
     177                 */ 
     178                public function store():void 
     179                { 
     180                        if ( _keep_src ) 
     181                                _srcbitmap.copyPixels( this, rect, zeropoint ); 
     182                } 
     183                 
     184                /** 
     185                 * original bitmapdata. if not keep, return null 
     186                 */ 
     187                public function get original():BitmapData { return _srcbitmap;  } 
     188                public function set original( value:BitmapData ):void 
     189                { 
     190                        if ( width != value.width || height != value.height ) 
     191                        { 
     192                                throw new ArgumentError("not match width or height."); 
     193                        } 
     194                        else 
     195                        { 
     196                                if( _srcbitmap ) 
     197                                        _srcbitmap.dispose();                                    
     198                                _srcbitmap = value; 
     199                                _keep_src  = true; 
     200                        } 
     201                } 
     202                 
     203                /** 
     204                 * keep original bitmapdata 
     205                 */ 
     206                public function get keep():Boolean { return _keep_src; } 
     207                public function set keep(value:Boolean):void  
     208                { 
     209                        if ( _keep_src != value ) 
     210                        { 
     211                                _keep_src = value; 
     212                                if ( _keep_src ) 
     213                                { 
     214                                        _srcbitmap = super.clone(); 
     215                                } 
     216                                else 
     217                                { 
     218                                        _srcbitmap.dispose(); 
     219                                        _srcbitmap = null; 
     220                                } 
     221                        } 
     222                } 
     223                 
     224                //---------------------------------------------------------------------------------------------------  
     225                 
     226                /** 
     227                 * BitmapData から FBitmapData のインスタンスを生成します. 
     228                 * @param       src 
     229                 * @param       transparent 
     230                 * @param       disposeSrc 
     231                 */ 
     232                public static function copyBitmapData( src:BitmapData, transparent_:Boolean=true, disposeSrc:Boolean=false ):FBitmapData 
     233                { 
     234                        var bd:FBitmapData; 
     235                        if ( arguments.length == 1 ) 
     236                                bd = new FBitmapData( src.width, src.height, src.transparent ); 
     237                        else 
     238                                bd = new FBitmapData( src.width, src.height, transparent_ ); 
     239                        bd.copyPixels( src, src.rect, zeropoint ); 
     240                        if ( disposeSrc ) 
     241                                src.dispose(); 
     242                        return bd; 
     243                } 
     244                 
     245                /** 
     246                 * DisplayObject から FBitmapData のインスタンスを生成します. 
     247                 * @param       displayobject 
     248                 * @param       margin 
     249                 * @param       scale 
     250                 * @param       smooth 
     251                 * @param       transparent 
     252                 */ 
     253                public static function copyDisplayObject( displayobject:DisplayObject, margin:int=0, scaleX:Number=1, scaleY:Number=1, smooth:Boolean=false, transparent_:Boolean=true ):FBitmapData 
     254                { 
     255                        return copyBitmapData( BmpUtil.makeImage( displayobject, margin, scaleX, scaleY, smooth ), transparent_, true ); 
     256                         
     257                } 
     258                 
     259                //--------------------------------------------------------------------------------------------------- OVERRIDE 
     260                 
     261                /** 
     262                 *  
     263                 */ 
     264                public override function clone():BitmapData 
     265                { 
     266                        var bd:FBitmapData = new FBitmapData( width, height, transparent ); 
     267                        bd.copyPixels( this, rect, zeropoint ); 
     268                        if ( _keep_src ) 
     269                                bd.original = _srcbitmap.clone(); 
     270                        return bd; 
     271                } 
     272                 
     273                /** 
     274                 *  
     275                 */ 
     276                public override function dispose():void 
     277                { 
     278                        super.dispose(); 
     279                        if ( _srcbitmap ) 
     280                        { 
     281                                _srcbitmap.dispose(); 
     282                                _srcbitmap = null; 
     283                        } 
     284                } 
    75285        } 
    76286