//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// kernel Exclusion < namespace : "Flame"; vendor : "Adobe"; version : 1; description : "Exclusion blend mode"; > { input image4 dst; input image4 src; output pixel4 result; void evaluatePixel() { pixel4 a = sampleNearest(dst,outCoord()); // cb pixel4 b = sampleNearest(src,outCoord()); // cs // remove premultiplied (srcCP/srcA, dstCP/dstA) //pixel3 cb, cs; pixel3 cb = a.rgb; pixel3 cs = b.rgb; if (a.a > 0.0) { cb.rgb = a.rgb / a.a; } if (b.a > 0.0) { cs.rgb = b.rgb / b.a; } // dstA' = (1-srcA)*dstA + srcA result.a = (1.0-b.a)*a.a + b.a; // temp for Blend(srcCP/srcA, dstCP/dstA) float3 blendResult; // cb + cs � 2*cs*cb blendResult.rgb = cb.rgb + cs.rgb - 2.0*cs.rgb*cb.rgb; // dstCP' = (1-srcA)*dstCP + (1-dstA)*srcCP + srcA*dstA*Blend(srcCP/srcA, dstCP/dstA) result.rgb = ((1.0-b.a)*a.rgb) + ((1.0-a.a)*b.rgb) + b.a*a.a*blendResult.rgb; } }