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 }