topical media & game development

talk show tell print

#graphic-flex-image-effects-07-source-aether-effects-adjustments-GradientMapEffect.ax

#graphic-flex-image-effects-07-source-aether-effects-adjustments-GradientMapEffect.ax [swf] [flash] flex


  package aether.effects.adjustments {
  
          import aether.effects.ImageEffect;
          import aether.utils.Adjustments;
  
          import flash.display.BitmapData;
          import flash.geom.Point;
          
          public class @ax-graphic-flex-image-effects-07-source-aether-effects-adjustments-GradientMapEffect extends ImageEffect {
                  
                  private var _colors:Array;
                  private var _ratios:Array;
                  
                  public function @ax-graphic-flex-image-effects-07-source-aether-effects-adjustments-GradientMapEffect(
                          colors:Array,
                          ratios:Array,
                          blendMode:String=null,
                          alpha:Number=1
                  ) {
                          init(blendMode, alpha);
                          _colors = colors;
                          _ratios = ratios;
                  }
          
                  private function createLookUp(colors:Array, ratios:Array):Object {
                          var lU:Object = {};
                          lU.r = [];
                          lU.g = [];
                          lU.b = [];
                          var gC:Array = [];
                          var r:Number;
                          var g:Number;
                          var b:Number;
                          var c:Number;
                          var c1:Object;
                          var c2:Object;
                          var r1:Number;
                          var r2:Number;
                          var index:Number = 0;
                          var cI:Number = 0;
                          var br:Number;
                          var cL:Number = colors.length;
                          for (var i:uint = 0; i < cL; i++){
                                  c = colors[i];
                                  gC.push({r:c>>16&255,g:c>>8&255,b:c&255});
                          }
                          for (i = 0; i < 256; i++){
                                  cI = findColorIndex(i, ratios, cL, index);
                                  index = (cI < 0) ? 0 : cI;
                                  c1 = gC[index];
                                  c2 = gC[index + 1];
                                  r1 = ratios[index];
                                  r2 = ratios[index + 1];
                                  if (c2 == null || cI < 0){
                                          r = c1.r;
                                          g = c1.g;
                                          b = c1.b;
                                  } else {
                                          br = (i - r1)/(r2 - r1);
                                          r = ((c2.r - c1.r)|0) * br + c1.r;
                                          g = ((c2.g - c1.g)|0) * br + c1.g;
                                          b = ((c2.b - c1.b)|0) * br + c1.b;
                                  }
                                  lU.r.push(r << 16);
                                  lU.g.push(g << 8);
                                  lU.b.push(b);
                          }
                          return lU;
                  }
          
                  private function findColorIndex(
                          pos:uint,
                          ratios:Array,
                          rLength:uint,
                          index:uint
                  ):Number {
                          var r1:Number;
                          var r2:Number;
                          if (pos < ratios[index]) return -1;
                          for (var i:uint = index; i < rLength; i++){
                                  r1 = ratios[i];
                                  r2 = ratios[i + 1];
                                  if ((pos >= r1 && pos < r2) || isNaN(r2)) return i;
                          }
                          return 0;
                  }
          
                  override protected function applyEffect(bitmapData:BitmapData):void {
                          var grayscaleImage:BitmapData = bitmapData.clone();
                          Adjustments.desaturate(grayscaleImage);
                          var map:Object = createLookUp(_colors, _ratios);
                          bitmapData.copyPixels(grayscaleImage, grayscaleImage.rect, new Point());
                          bitmapData.paletteMap(bitmapData, bitmapData.rect, new Point(), map.r, map.g, map.b);
                  }
          
          }
          
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.