root/as3/SirdsAS3/org/libspark/dsler/SirdsAS3/RDSTextureImageCreator.as

リビジョン 2902, 5.9 kB (コミッタ: dsler, コミット時期: 3 年 前)

ソースの行を詰めるなどの操作

Line 
1
2 /**
3  * - SirdsAS3 -
4  * RDS/SISステレオグラム生成ライブラリ
5  *
6  * RDSTextureImageCreatorクラス
7  * グレースケール画像(深度マップ画像)からテクスチャパターンのステレオグラムを生成
8  *
9  * @author              dsler
10  * @version             1.0.0
11  * @update      2009/07/03
12  *
13  * Licensed under The MIT License
14  * Copyright (c) 2009 dsler
15  * Permission is hereby granted, free of charge, to any person obtaining a copy
16  * of this software and associated documentation files (the "Software"), to deal
17  * in the Software without restriction, including without limitation the rights
18  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19  * copies of the Software, and to permit persons to whom the Software is
20  * furnished to do so, subject to the following conditions:
21  * The above copyright notice and this permission notice shall be included in
22  * all copies or substantial portions of the Software.
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29  * THE SOFTWARE.
30  */
31
32 package org.libspark.dsler.SirdsAS3
33 {
34         import __AS3__.vec.Vector;
35        
36         import flash.display.Bitmap;
37         import flash.display.BitmapData;
38         import flash.display.Sprite;
39         import flash.geom.Point;
40         import flash.geom.Rectangle;
41        
42         public class RDSTextureImageCreator implements IRDSImageCreatable
43         {
44                 protected var _repeatPattern:BitmapData;
45                 protected var _canvasDefinition:Rectangle;
46                 protected var _depthRange:int;
47                
48                 public function RDSTextureImageCreator(canvasWidth:int, canvasHeight:int, repeatPattern:BitmapData, depthRange:int = 20)
49                 {
50                         _canvasDefinition = new Rectangle(0, 0, canvasWidth, canvasHeight);
51                         _repeatPattern = repeatPattern.clone();
52                         _depthRange = depthRange;
53                 }
54                
55                 public function create(dep:BitmapData):RDSImage{
56                         var rdsImage:Sprite = new Sprite, depthMap:BitmapData = dep.clone();
57                         var canvasHeight:int = _canvasDefinition.height, canvasWidth:int = _canvasDefinition.width;
58                         var rdsSurface:BitmapData = new BitmapData(canvasWidth, canvasHeight);
59                         var pattern:BitmapData = new BitmapData(_repeatPattern.width, 1);
60                         var t:Number = (new Date).getTime();
61                          for(var i:int = 0; i < canvasHeight; i++){
62                                 var iterator:int = 0, oldDepth:uint = 0;
63                                 //新規オリジナルランダムドットパターンを設定
64                                 pattern = new BitmapData(_repeatPattern.width, 1);
65                                 pattern.copyPixels(_repeatPattern, new Rectangle(0, i % _repeatPattern.height, _repeatPattern.width, 1), new Point(0, 0));
66                                 for(var j:int = 0; j < canvasWidth; j++){
67                                         var newDepth:int = ( ( depthMap.getPixel(j, i) / 0xffffff ) * _depthRange + 0.5 ) >> 0, depthSub:int = newDepth - oldDepth;
68                                         if(depthSub != 0){
69                                                 //上昇、下降処理(ランダムパターンの更新)
70                                                 if(depthSub > 0) pattern = createDeletedPattern(pattern, iterator % pattern.width, depthSub);
71                                                 else if(depthSub < 0) pattern = createInsertedPattern(pattern, iterator % pattern.width, - depthSub);
72                                                 iterator = 0;
73                                         }
74                                         rdsSurface.setPixel(j, i, pattern.getPixel(iterator++ % pattern.width, 0));
75                                         oldDepth = newDepth;
76                                 }
77                         }
78                         trace("convert time: ", ((new Date).getTime()-t)*0.001+"sec");
79                         rdsImage.addChild(new Bitmap(rdsSurface));
80                         return(new RDSImage(rdsImage, _repeatPattern.width, depthMap));
81                 }
82                
83                 //ある区間を削除したパターンを生成(上昇処理)
84                 protected function createDeletedPattern(prevPattern:BitmapData, delPoint:uint, delWidth:uint):BitmapData{
85                         var returnPattern:BitmapData = new BitmapData(prevPattern.width - delWidth, 1), bWidth:int = 0, prevPatternWidth:int = prevPattern.width;
86                         if(prevPatternWidth - delPoint - delWidth > 0){
87                                 //通常の場合
88                                 returnPattern.copyPixels(prevPattern, new Rectangle(delPoint + delWidth, 0, prevPatternWidth - delPoint - delWidth, 1), new Point(0, 0));
89                                 bWidth = prevPatternWidth - delPoint - delWidth;
90                         }else{
91                                 //削除範囲がパターン幅外に及ぶ場合
92                                 returnPattern.copyPixels(prevPattern, new Rectangle(delPoint + delWidth - prevPatternWidth, 0, prevPatternWidth - delWidth, 1), new Point(0, 0));
93                         }
94                         if(bWidth && delPoint > 0) returnPattern.copyPixels(prevPattern, new Rectangle(0, 0, delPoint, 1), new Point(bWidth, 0));
95                         return(returnPattern);
96                 }
97                
98                 //ピクセルを追加したパターンを生成(下降処理)
99                 protected function createInsertedPattern(prevPattern:BitmapData, edgeAt:int, insertPixelsNum:int):BitmapData{
100                         var prevPatternWidth:int = prevPattern.width, returnPattern:BitmapData = new BitmapData(prevPatternWidth + insertPixelsNum, 1), colorSub:Vector.<Number> = new Vector.<Number>, target:uint = prevPattern.getPixel(edgeAt, 0), prev:uint;
101                         if(edgeAt != 0) prev = prevPattern.getPixel(edgeAt - 1, 0);
102                         else prev = prevPattern.getPixel(prevPatternWidth - 1, 0);
103                         colorSub.push( (target >> 16) - (prev >> 16) ); colorSub.push( ( ( target & 0x00ff00 ) >> 8 ) - ( ( prev & 0x00ff00 ) >> 8 ) );
104                         colorSub.push( ( target & 0x0000ff ) - ( prev & 0x0000ff ) );
105                         //ピクセル追加
106                         for(var i:int = 0; i < insertPixelsNum; i++){
107                                 var r:uint=uint((prev>>16)+colorSub[0]*(i+1)/(insertPixelsNum+1)), g:uint=uint(((prev&0x00ff00)>>8)+colorSub[1]*(i+1)/(insertPixelsNum+1)), b:uint=uint((prev&0x0000ff)+colorSub[2]*(i+1)/(insertPixelsNum+1));
108                                 returnPattern.setPixel(i, 0, ( r << 16 | g << 8 | b ));
109                         }
110                         if(prevPatternWidth - edgeAt - 1 > 0) returnPattern.copyPixels(prevPattern, new Rectangle(edgeAt, 0, prevPatternWidth - edgeAt, 1), new Point(insertPixelsNum, 0));
111                         if(edgeAt > 0) returnPattern.copyPixels(prevPattern, new Rectangle(0, 0, edgeAt, 1), new Point(prevPatternWidth - edgeAt + insertPixelsNum, 0));
112                         return(returnPattern);
113                 }
114         }
115 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。