package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;

    [SWF(width="360", height="320", backgroundColor="#ffffff", frameRate="15")]

    public class ChromakeyCamera extends CameraFramework
    {
        [Embed(source='backGround.jpg')]
        private var BackGround:Class;       ///< 背景画像

        public static const
            VIDEO_WIDTH:int = 320,          ///< ビデオの幅
            VIDEO_HEIGHT:int = 240,         ///< ビデオの高さ
            SCREEN_WIDTH:int = 360,         ///< 画面の幅
            SCREEN_HEIGHT:int = 320;        ///< 画面の高さ

        private var backGround:BitmapData = null;       ///< 背景画像
        private var chromakeyOn:Boolean = true;

        public function ChromakeyCamera()
        {
            super( SCREEN_WIDTH, SCREEN_HEIGHT, VIDEO_WIDTH, VIDEO_HEIGHT );

            var bmp:Bitmap = new BackGround();
            backGround = bmp.bitmapData;

            label.text = "Chromakey Camera";
            drawBgColor(0xD78500);

            // ボタン追加
            var buttonY:int = 10, buttonW:int = 140;
            var chromakeyOnButton:TextButton = new TextButton(buttonW, 20, "ChromaKey ON");
            chromakeyOnButton.x = 10;
            chromakeyOnButton.y = buttonY;
            addChild(chromakeyOnButton);
            chromakeyOnButton.addEventListener( MouseEvent.CLICK, chromakeyOnButtonClick );

            var chromakeyOffButton:TextButton = new TextButton(buttonW, 20, "ChromaKey OFF");
            chromakeyOffButton.x = chromakeyOnButton.x + chromakeyOnButton.width + 10;
            chromakeyOffButton.y = buttonY;
            addChild(chromakeyOffButton);
            chromakeyOffButton.addEventListener( MouseEvent.CLICK, chromakeyOffButtonClick );
        }

        /// Chromakey ON ボタン処理
        private function chromakeyOnButtonClick(event:MouseEvent):void {
            chromakeyOn = true;
        }

        /// Chromakey OFF ボタン処理
        private function chromakeyOffButtonClick(event:MouseEvent):void {
            chromakeyOn = false;
        }

        /// 描画処理
        public override function draw():void {

            /// 画面の真ん中の色を色調整用に出力
            trace( "COLOR:" + bdTmp.getPixel32(VIDEO_WIDTH/2,VIDEO_HEIGHT/2).toString(16) );

            if( chromakeyOn == false ){
                bd.draw(bdTmp);
                return;
            }

            /// マスクの作成
            //var maskBitmap:BitmapData = bdTmp.clone();    ///< こっちだとなんかダメ
            var MASKFLAG_COLOR:uint = 0xFFFF0000;
            var maskBitmap:BitmapData = new BitmapData(bdTmp.width, bdTmp.height);
            maskBitmap.draw(bdTmp);

            /// 青系の色を透過色にする(ここの色の値を調整するとクロマキーで抜ける色が変わる)
            var THRESHOLD_RG_COLOR:uint = 0x444400;     ///< 赤、緑がこの値以上だったら透過色ではない
            var THRESHOLD_BLUE_COLOR:uint = 0x000060;   ///< 青がこの値以上でないと透過色ではない

            // まず赤、緑成分が一定値以上のところをMASKFLAG_COLORで塗りつぶす
            maskBitmap.threshold(maskBitmap, maskBitmap.rect, new Point(), ">", THRESHOLD_RG_COLOR, MASKFLAG_COLOR, 0x00ffff00 );
            // 次に青成分が、一定値以下のところをMASKFLAG_COLORで塗りつぶす
            maskBitmap.threshold(maskBitmap, maskBitmap.rect, new Point(), "<", THRESHOLD_BLUE_COLOR, MASKFLAG_COLOR, 0x000000ff );
            // MASKFLAG_COLORで塗られてないところをalphaで塗りつぶし(残ったところはかなり青いはず)
            maskBitmap.threshold(maskBitmap, maskBitmap.rect, new Point(), "!=", MASKFLAG_COLOR, 0x00000000);

            /// 背景描画を描画
            bd.draw(backGround);

            /// マスキングして、WEBカメラ画像の描画
            bd.copyPixels( bdTmp, bdTmp.rect, new Point(), maskBitmap, new Point(), true);

        }

    }
}