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    }