001 /* 002 * 003 004 Licensed under the Apache License, Version 2.0 (the "License"); 005 you may not use this file except in compliance with the License. 006 You may obtain a copy of the License at 007 008 http://www.apache.org/licenses/LICENSE-2.0 009 010 Unless required by applicable law or agreed to in writing, software 011 distributed under the License is distributed on an "AS IS" BASIS, 012 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 See the License for the specific language governing permissions and 014 limitations under the License. 015 */ 016 017 package railo.runtime.img.composite; 018 019 import java.awt.CompositeContext; 020 import java.awt.RenderingHints; 021 import java.awt.image.ColorModel; 022 023 public final class LightenComposite extends RGBComposite { 024 025 public LightenComposite( float alpha ) { 026 super( alpha ); 027 } 028 029 public CompositeContext createContext( ColorModel srcColorModel, ColorModel dstColorModel, RenderingHints hints ) { 030 return new Context( extraAlpha, srcColorModel, dstColorModel ); 031 } 032 033 static class Context extends RGBCompositeContext { 034 public Context( float alpha, ColorModel srcColorModel, ColorModel dstColorModel ) { 035 super( alpha, srcColorModel, dstColorModel ); 036 } 037 038 public void composeRGB( int[] src, int[] dst, float alpha ) { 039 int w = src.length; 040 041 for ( int i = 0; i < w; i += 4 ) { 042 int sr = src[i]; 043 int dir = dst[i]; 044 int sg = src[i+1]; 045 int dig = dst[i+1]; 046 int sb = src[i+2]; 047 int dib = dst[i+2]; 048 int sa = src[i+3]; 049 int dia = dst[i+3]; 050 int dor, dog, dob; 051 052 dor = dir > sr ? dir : sr; 053 dog = dig > sg ? dig : sg; 054 dob = dib > sb ? dib : sb; 055 056 float a = alpha*sa/255f; 057 float ac = 1-a; 058 059 dst[i] = (int)(a*dor + ac*dir); 060 dst[i+1] = (int)(a*dog + ac*dig); 061 dst[i+2] = (int)(a*dob + ac*dib); 062 dst[i+3] = (int)(sa*alpha + dia*ac); 063 } 064 } 065 } 066 067 }