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