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 ScreenComposite extends RGBComposite { 024 025 public ScreenComposite( 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 int t = (255-dir) * (255-sr) + 0x80; 053 dor = 255 - ( ((t >> 8) + t) >> 8 ); 054 t = (255-dig) * (255-sg) + 0x80; 055 dog = 255 - ( ((t >> 8) + t) >> 8 ); 056 t = (255-dib) * (255-sb) + 0x80; 057 dob = 255 - ( ((t >> 8) + t) >> 8 ); 058 059 float a = alpha*sa/255f; 060 float ac = 1-a; 061 062 dst[i] = (int)(a*dor + ac*dir); 063 dst[i+1] = (int)(a*dog + ac*dig); 064 dst[i+2] = (int)(a*dob + ac*dib); 065 dst[i+3] = (int)(sa*alpha + dia*ac); 066 } 067 } 068 } 069 070 }