//////////////////////////////////////////////////////////////////////////////// // // 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 ColorBurn < namespace : "Flame"; vendor : "Adobe"; version : 1; description : "ColorBurn 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 = 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) pixel3 blendResult; // = 1, if cb = 1 (*** this case is AE/PS and AGM only, not PDF spec) // = 0, if (1 � cb) >= cs // = (1 � cb) / cs, otherwise if (cb.r == 1.0) { blendResult.r = 1.0; } else if ((1.0 - cb.r) >= cs.r) { blendResult.r = 0.0; } else { blendResult.r = 1.0 - (1.0 - cb.r) / cs.r; } if (cb.g == 1.0) { blendResult.g = 1.0; } else if ((1.0 - cb.g) >= cs.g) { blendResult.g = 0.0; } else { blendResult.g = 1.0 - (1.0 - cb.g) / cs.g; } if (cb.b == 1.0) { blendResult.b = 1.0; } else if ((1.0 - cb.b) >= cs.b) { blendResult.b = 0.0; } else { blendResult.b = 1.0 - (1.0 - cb.b) / cs.b; } // 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; } }