001 002 package railo.runtime.img.composite; 003 004 import java.awt.CompositeContext; 005 import java.awt.RenderingHints; 006 import java.awt.image.ColorModel; 007 008 public final class AverageComposite extends RGBComposite { 009 010 public AverageComposite( float alpha ) { 011 super( alpha ); 012 } 013 014 public CompositeContext createContext( ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints ) { 015 return new Context( extraAlpha, srcColorModel, dstColorModel ); 016 } 017 018 static class Context extends RGBCompositeContext { 019 public Context( float alpha, ColorModel srcColorModel, ColorModel dstColorModel ) { 020 super( alpha, srcColorModel, dstColorModel ); 021 } 022 023 public void composeRGB( int[] src, int[] dst, float alpha ) { 024 int w = src.length; 025 026 for ( int i = 0; i < w; i += 4 ) { 027 int sr = src[i]; 028 int dir = dst[i]; 029 int sg = src[i+1]; 030 int dig = dst[i+1]; 031 int sb = src[i+2]; 032 int dib = dst[i+2]; 033 int sa = src[i+3]; 034 int dia = dst[i+3]; 035 int dor, dog, dob; 036 037 dor = (dir + sr) / 2; 038 dog = (dig + sg) / 2; 039 dob = (dib + sb) / 2; 040 041 float a = alpha*sa/255f; 042 float ac = 1-a; 043 044 dst[i] = (int)(a*dor + ac*dir); 045 dst[i+1] = (int)(a*dog + ac*dig); 046 dst[i+2] = (int)(a*dob + ac*dib); 047 dst[i+3] = (int)(sa*alpha + dia*ac); 048 } 049 } 050 } 051 052 }