In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Pixel Bender (インターレース風の横線を表示するフィルタ)

-------------------------------------------------
インターレース風の横線を表示するフィルタ
FULL SCREEN 表示にしてブラウザのサイズを変えても
Flash スクリーンのライン表示が維持されている事が確認できます。
-------------------------------------------------
Get Adobe Flash player
by Hakuhin 10 Jan 2010
/**
 * Copyright Hakuhin ( http://wonderfl.net/user/Hakuhin )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/riXV
 */

// -------------------------------------------------
//
// インターレース風の横線を表示するフィルタ
//
//
// FULL SCREEN 表示にしてブラウザのサイズを変えても
// Flash スクリーンのライン表示が維持されている事が確認できます。
//
// -------------------------------------------------
package {
	import flash.events.*;
	import flash.display.*;
	import flash.net.*;
	import flash.text.*;
	import flash.utils.*;
	import flash.system.*;
	import flash.geom.*;
	import flash.filters.*;
	import flash.ui.*;
	import flash.media.*;

    public class Main extends Sprite {
        public function Main() {



// -------------------------------------------------
// コンストラクタ
// -------------------------------------------------

// 100%表示
stage.scaleMode = StageScaleMode.NO_SCALE;

// 左上
stage.align = StageAlign.TOP_LEFT;
stage.align = "TL";

// ビデオを配置
var video_obj : Video = new Video();
addChild(video_obj);

// ストリーム
var connection:NetConnection = new NetConnection();
connection.connect(null);	
var netStream:NetStream = new NetStream(connection);

// ビデオとストリームを関連付け
video_obj.attachNetStream(netStream);

// メタデータ取得
var obj:Object = new Object();
obj.onMetaData = function(param:Object):void{
}
netStream.client = obj;

// リソース読み込み開始
load();


// -------------------------------------------------
// 読み込み
// -------------------------------------------------
function load():void{

	// 動画のURL
	var movie_url:String = "http://actionscript.web.officelive.com/wonderfl/movie000.mp4";

	// サウンドをOFF
	var trans : SoundTransform = netStream.soundTransform;
	trans.volume = 0.0;
	netStream.soundTransform = trans;

	// 再生開始
	netStream.play(movie_url);

	// 初期化へ
	init();
}


// -------------------------------------------------
// 初期化
// -------------------------------------------------
function init():void{

	// ステージサイズ
	var w:uint;
	var h:uint;
	
	// リサイズ時にフィット
	stage.addEventListener(Event.RESIZE,ResizeFunc);
	function ResizeFunc(e:Event):void{
		w = stage.stageWidth;
		h = stage.stageHeight;
		video_obj.width = w;
		video_obj.height = h;
	}
	ResizeFunc(null);

	// シェーダバイトコード
	var binary : ByteArray = CustomFilterGetByteArray();
	
	// シェーダ作成
	var shader:Shader = new Shader();
	shader.byteCode = binary;
	var filter:ShaderFilter = new ShaderFilter(shader); 

	// パラメータアクセス用
	var data : ShaderData  = shader.data;
	var param : ShaderParameter;

	// パラメータ
	var odd_multiplier:Number = 0.5;	// 奇数列のカラーの乗算成分 (デフォルト 1.0)
	var odd_offset:Number = 0;			// 奇数列のカラーの加算成分 (デフォルト   0)
	var even_multiplier:Number = 1.5;	// 偶数列のカラーの乗算成分 (デフォルト 1.0)
	var even_offset:Number = 0;			// 偶数列のカラーの加算成分 (デフォルト   0)
	
	addEventListener(Event.ENTER_FRAME,function(e:Event):void{

		//  奇数列のカラーの乗算成分
		param = data.odd_multiplier;
		param.value = [odd_multiplier];

		// 奇数列のカラーの加算成分
		param = data.odd_offset;
		param.value = [odd_offset];

		//  奇数列のカラーの乗算成分
		param = data.even_multiplier;
		param.value = [even_multiplier];

		// 偶数列のカラーの加算成分
		param = data.even_offset;
		param.value = [even_offset];

		// 適応
		video_obj.filters = [filter];
	});

	// テキスト表示
	var tf : TextField = new TextField();
	tf.x = 5;
	tf.y = 5;
	tf.width = 300;
	tf.height = 60;
	tf.border = true;
	tf.background = true;
	tf.alpha = 0.9;
	
	// 書式
	var format : TextFormat = new TextFormat();
	format.font = "MS ゴシック";
	tf.defaultTextFormat = format;

	addChild(tf);
	addEventListener(Event.ENTER_FRAME,function(e:Event):void{
		var str:String = "";
		str += "奇数列のカラーの乗算成分:" + (Math.floor(odd_multiplier * 100) / 100) + " (1,2キーで変更)\n";
		str += "奇数列のカラーの加算成分:" + odd_offset + " (3,4キーで変更)\n";
		str += "偶数列のカラーの乗算成分:" + (Math.floor(even_multiplier * 100) / 100) + " (5,6キーで変更)\n";
		str += "偶数列のカラーの加算成分:" + even_offset + " (7,8キーで変更)\n";

		tf.text = str;
	});
	
	
	// キー操作
	stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
	function KeyDown(event:KeyboardEvent):void{
		if(event.keyCode == 49)		odd_multiplier -= 0.05;
		if(event.keyCode == 50)		odd_multiplier += 0.05;
		if(event.keyCode == 51)		odd_offset -= 5;
		if(event.keyCode == 52)		odd_offset += 5;
		if(event.keyCode == 53)		even_multiplier -= 0.05;
		if(event.keyCode == 54)		even_multiplier += 0.05;
		if(event.keyCode == 55)		even_offset -= 5;
		if(event.keyCode == 56)		even_offset += 5;
		
		if(odd_multiplier < -2.0)	odd_multiplier = -2.0;
		if(odd_multiplier >  2.0)	odd_multiplier =  2.0;
		if(even_multiplier < -2.0)	even_multiplier = -2.0;
		if(even_multiplier >  2.0)	even_multiplier =  2.0;
		if(odd_offset < -255)		odd_offset = -255;
		if(odd_offset >  255)		odd_offset =  255;
		if(even_offset < -255)		even_offset = -255;
		if(even_offset >  255)		even_offset =  255;
	};

}


// -------------------------------------------------
// シェーダバイトコード
// -------------------------------------------------
function CustomFilterGetByteArray():ByteArray{

	var a:ByteArray = new ByteArray();
	var f:Function;

	f = a.writeUnsignedInt;
	f(0xa5010000); f(0x00a41400); f(0x496e7465); f(0x726c6163); 
	f(0x65537479); f(0x6c654669); f(0x6c746572); f(0xa00c6e61); 
	f(0x6d657370); f(0x61636500); f(0x696e7465); f(0x726c6163); 
	f(0x65207374); f(0x796c6500); f(0xa00c7665); f(0x6e646f72); 
	f(0x0048616b); f(0x7568696e); f(0x00a00876); f(0x65727369); 
	f(0x6f6e0001); f(0x00a00c64); f(0x65736372); f(0x69707469); 
	f(0x6f6e0083); f(0x43839383); f(0x5e815b83); f(0x8c815b83); 
	f(0x58959782); f(0xcc89a190); f(0xfc82f095); f(0x8ea682b7); 
	f(0x82e98374); f(0x8342838b); f(0x835e00a1); f(0x01020000); 
	f(0x0c5f4f75); f(0x74436f6f); f(0x726400a3); f(0x00047372); 
	f(0x6300a102); f(0x0401000f); f(0x64737400); f(0xa1010100); 
	f(0x00026576); f(0x656e5f6d); f(0x756c7469); f(0x706c6965); 
	f(0x7200a201); f(0x64656661); f(0x756c7456); f(0x616c7565); 
	f(0x003f8000); f(0x00a20c64); f(0x65736372); f(0x69707469); 
	f(0x6f6e008b); f(0xf4909497); f(0xf182cc83); f(0x4a838981); 
	f(0x5b82cc8f); f(0xe68e5a90); f(0xac95aa00); f(0xa1010801); 
	f(0x80086576); f(0x656e5f6f); f(0x66667365); f(0x7400a208); 
	f(0x64656661); f(0x756c7456); f(0x616c7565); f(0x000000a2); 
	f(0x0c646573); f(0x63726970); f(0x74696f6e); f(0x008bf490); 
	f(0x9497f182); f(0xcc834a83); f(0x89815b82); f(0xcc89c18e); 
	f(0x5a90ac95); f(0xaa00a101); f(0x01000001); f(0x6f64645f); 
	f(0x6d756c74); f(0x69706c69); f(0x657200a2); f(0x01646566); 
	f(0x61756c74); f(0x56616c75); f(0x65003f80); f(0x0000a20c); 
	f(0x64657363); f(0x72697074); f(0x696f6e00); f(0x8aef9094); 
	f(0x97f182cc); f(0x834a8389); f(0x815b82cc); f(0x8fe68e5a); 
	f(0x90ac95aa); f(0x00a10108); f(0x0180046f); f(0x64645f6f); 
	f(0x66667365); f(0x7400a208); f(0x64656661); f(0x756c7456); 
	f(0x616c7565); f(0x000000a2); f(0x0c646573); f(0x63726970); 
	f(0x74696f6e); f(0x008aef90); f(0x9497f182); f(0xcc834a83); 
	f(0x89815b82); f(0xcc89c18e); f(0x5a90ac95); f(0xaa001d02); 
	f(0x00c10000); f(0x10003003); f(0x00f10200); f(0x10001d04); 
	f(0x00f30300); f(0x1b003202); f(0x00204000); f(0x00001d02); 
	f(0x00100200); f(0x40000802); f(0x00100200); f(0x80001e01); 
	f(0x80200200); f(0xc0003201); f(0x80100000); f(0x00002801); 
	f(0x80200180); f(0xc0001d02); f(0x80800080); f(0x00003400); 
	f(0x00000280); f(0x00000304); f(0x00e20000); f(0xfc001f02); 
	f(0x00200180); f(0x40003202); f(0x0010437f); f(0x00000403); 
	f(0x00800200); f(0xc0000303); f(0x00800200); f(0x80000104); 
	f(0x00e20300); f(0x00003500); f(0x00000000); f(0x00000304); 
	f(0x00e20000); f(0xa8001f02); f(0x00200180); f(0x00003202); 
	f(0x0010437f); f(0x00000403); f(0x00800200); f(0xc0000303); 
	f(0x00800200); f(0x80000104); f(0x00e20300); f(0x00003600); 
	f(0x00000000); f(0x00001d01); f(0x00f30400); 

	f = a.writeShort;
	f(0x1b00); 

	return a;

}


            
        }
    }
}


// ↓ pbk ファイルのコード
/* -----------------------------------------------------------------------------
	パラメータ
	even_multiplier	偶数列のカラーの乗算成分 (デフォルト 1.0)
	even_offset		偶数列のカラーの加算成分 (デフォルト   0)
	odd_multiplier	奇数列のカラーの乗算成分 (デフォルト 1.0)
	odd_offset		奇数列のカラーの加算成分 (デフォルト   0)
 ----------------------------------------------------------------------------- */
/*
<languageVersion : 1.0;>
kernel InterlaceStyleFilter<
	namespace : "interlace style";
	vendor : "Hakuhin";
	version : 1;
	description : "インターレース風の横線を表示するフィルタ";
>{
	input image4 src;	// 入力イメージ
	output pixel4 dst;	// 出力ピクセル


	// -------------------------------------
	// パラメータ
	// -------------------------------------
	parameter float even_multiplier<
		defaultValue:float(1.0);
		description : "偶数列のカラーの乗算成分";
	>;
	parameter int even_offset<
		defaultValue:int(0);
		description : "偶数列のカラーの加算成分";
	>;
	parameter float odd_multiplier<
		defaultValue:float(1.0);
		description : "奇数列のカラーの乗算成分";
	>;
	parameter int odd_offset<
		defaultValue:int(0);
		description : "奇数列のカラーの加算成分";
	>;


	// -------------------------------------
	// ピクセルごとに実行される関数
	// -------------------------------------
	void evaluatePixel(){

		// ピクセルの位置を取得
		float2 pos = outCoord();

		// ソースイメージからピクセルカラーを取得
		float4 color = sampleNearest(src,pos);

		// 奇数ライン
		if(int(mod(pos.y,2.0)) == 0){
			color.rgb *= odd_multiplier;
			color.rgb += float(odd_offset) / 255.0;

		// 偶数ライン
		}else{
			color.rgb *= even_multiplier;
			color.rgb += float(even_offset) / 255.0;
		}

		// ピクセルカラーを出力
		dst = color;
	}
}
*/




// -------------------------------------------------
// 外部画像をサムネイルとしてキャプチャ
// -------------------------------------------------
import flash.net.*;
import flash.events.*;
import flash.display.*;
import flash.geom.*;
function ThumbnailCapture(url:String,time:uint,stage:Stage):void{

	// キャプチャタイミング
	Wonderfl.capture_delay( time );

	
	// スプライト作成
	var sprite : Sprite = new Sprite();

	// ステージ最前面に配置
	stage.addChildAt(sprite,stage.numChildren);
	
	// ローダー
	var loader_obj : Loader = new Loader();
	loader_obj.contentLoaderInfo.addEventListener (Event.INIT,function(e:Event):void{

		// メモリからインスタンス化
		var loader_memory : Loader = new Loader();
		loader_memory.contentLoaderInfo.addEventListener (Event.INIT,function(e:Event):void{

			// キャプチャ
			var bmp : BitmapData = new BitmapData(loader_memory.width,loader_memory.height,true,0);
			sprite.addChild(loader_memory);
			bmp.draw(sprite);
			sprite.removeChild(loader_memory);
			loader_memory.unload();
			loader_obj.unload();
			loader_memory = null;
			loader_obj = null;
			
			
			// 画像を配置
			var bmp_obj : Bitmap = new Bitmap(bmp);
			bmp_obj .width = stage.stageWidth;
			bmp_obj .height = stage.stageHeight;
			stage.addChild(bmp_obj );
			
		});
		
		// 読み込み開始
		loader_memory.loadBytes(loader_obj.contentLoaderInfo.bytes);
	});
	
	// 読み込み開始
	loader_obj.load(new URLRequest(url));
}