<?xml version="1.0"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<!-- filters/examples/ColorMatrixFilterExample .mxml -->
<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    creationComplete="createFilters()">
    
  <fx:Script><![CDATA[ 
     import spark.filters.*;
     import flash.filters.BitmapFilterQuality;
     import flash.filters.BitmapFilterType;
  
     private var myGreenMatrixFilter:ColorMatrixFilter;  
     private var myBlueMatrixFilter:ColorMatrixFilter;  
     private var myRedMatrixFilter:ColorMatrixFilter;  

     public function createFilters():void {        
         var greenMatrix:Array = new Array();
                greenMatrix = greenMatrix.concat([0, 0, 0, 0, 0]); // red
                greenMatrix = greenMatrix.concat([0, 1, 0, 0, 0]); // green
                greenMatrix = greenMatrix.concat([0, 0, 0, 0, 0]); // blue
                greenMatrix = greenMatrix.concat([0, 0, 0, 1, 0]); // alpha

         var blueMatrix:Array = new Array();
                blueMatrix = blueMatrix.concat([0, 0, 0, 0, 0]); // red
                blueMatrix = blueMatrix.concat([0, 0, 0, 0, 0]); // green
                blueMatrix = blueMatrix.concat([0, 0, 1, 0, 0]); // blue
                blueMatrix = blueMatrix.concat([0, 0, 0, 1, 0]); // alpha

         var redMatrix:Array = new Array();
                redMatrix = redMatrix.concat([1, 0, 0, 0, 0]); // red
                redMatrix = redMatrix.concat([0, 0, 0, 0, 0]); // green
                redMatrix = redMatrix.concat([0, 0, 0, 0, 0]); // blue
                redMatrix = redMatrix.concat([0, 0, 0, 1, 0]); // alpha

        myGreenMatrixFilter = new ColorMatrixFilter(greenMatrix);
        myBlueMatrixFilter = new ColorMatrixFilter(blueMatrix);
        myRedMatrixFilter = new ColorMatrixFilter(redMatrix);

        greenImage.filters = [myGreenMatrixFilter];
        blueImage.filters = [myBlueMatrixFilter];
        redImage.filters = [myRedMatrixFilter];
     }
  
  ]]></fx:Script>

    <s:VGroup>
        <s:VGroup>
            <s:Label text="Original Image"/>
            <mx:Image id="originalImage" source="@Embed(source='assets/c2.png')"/>
        </s:VGroup>        

        <s:VGroup>
            <s:Label text="Green Matrix Image"/>
            <mx:Image id="greenImage" source="@Embed(source='assets/c2.png')"/>
        </s:VGroup>        

        <s:VGroup>
            <s:Label text="Blue Matrix Image"/>
            <mx:Image id="blueImage" source="@Embed(source='assets/c2.png')"/>
        </s:VGroup>        

        <s:VGroup>
            <s:Label text="Red Matrix Image"/>
            <mx:Image id="redImage" source="@Embed(source='assets/c2.png')"/>
        </s:VGroup>        
    </s:VGroup>        
</s:Application>