130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/*
230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project
330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License");
530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License.
630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at
730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *      http://www.apache.org/licenses/LICENSE-2.0
930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni *
1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software
1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS,
1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and
1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License.
1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */
1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterpacks.imageproc;
1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Filter;
20692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Rennimport android.filterfw.core.FilterContext;
2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame;
2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat;
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.KeyValueMap;
2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeProgram;
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeFrame;
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Program;
2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.ShaderProgram;
28c0017fd82acec5d0427306ea5f536c3d78854f95Marius Rennimport android.filterfw.format.ImageFormat;
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.util.Set;
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
32a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/**
33c80c7521d8f883b47a9234b9de7bd1feea54bcbaRuei-sung Lin * The filter linearly blends "left" and "right" frames. The blending weight is
34c80c7521d8f883b47a9234b9de7bd1feea54bcbaRuei-sung Lin * the multiplication of parameter "blend" and the alpha value in "right" frame.
35a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide
36a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */
3721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpublic class BlendFilter extends ImageCombineFilter {
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    private final String mBlendShader =
4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "precision mediump float;\n" +
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "uniform sampler2D tex_sampler_0;\n" +
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "uniform sampler2D tex_sampler_1;\n" +
4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "uniform float blend;\n" +
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "varying vec2 v_texcoord;\n" +
4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "void main() {\n" +
4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  vec4 colorL = texture2D(tex_sampler_0, v_texcoord);\n" +
4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  vec4 colorR = texture2D(tex_sampler_1, v_texcoord);\n" +
48c80c7521d8f883b47a9234b9de7bd1feea54bcbaRuei-sung Lin            "  float weight = colorR.a * blend;\n" +
49c80c7521d8f883b47a9234b9de7bd1feea54bcbaRuei-sung Lin            "  gl_FragColor = mix(colorL, colorR, weight);\n" +
5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "}\n";
5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public BlendFilter(String name) {
5321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        super(name, new String[] { "left", "right" }, "blended", "blend");
5430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
56c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn    @Override
57511360e61650864ea22a171159efe073c80d0cdbMarius Renn    protected Program getNativeProgram(FilterContext context) {
58c80c7521d8f883b47a9234b9de7bd1feea54bcbaRuei-sung Lin        throw new RuntimeException("TODO: Write native implementation for Blend!");
5930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
61c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn    @Override
62511360e61650864ea22a171159efe073c80d0cdbMarius Renn    protected Program getShaderProgram(FilterContext context) {
63511360e61650864ea22a171159efe073c80d0cdbMarius Renn        return new ShaderProgram(context, mBlendShader);
6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
66