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 Carceroni
1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterpacks.imageproc;
1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Filter;
21692c3bf7a1c7e2d5b1066cf7a1b057e993742c87Marius Rennimport android.filterfw.core.FilterContext;
2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame;
2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat;
2430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.KeyValueMap;
2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeProgram;
2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeFrame;
2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Program;
2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.ShaderProgram;
2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.util.Set;
3130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
32a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/**
33a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide
34a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */
3521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpublic class ContrastFilter extends SimpleImageFilter {
3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
3721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn    private static final String mContrastShader =
3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "precision mediump float;\n" +
3930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "uniform sampler2D tex_sampler_0;\n" +
4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "uniform float contrast;\n" +
4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "varying vec2 v_texcoord;\n" +
4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "void main() {\n" +
4330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
4430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  color -= 0.5;\n" +
4530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  color *= contrast;\n" +
4630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  color += 0.5;\n" +
4730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "  gl_FragColor = color;\n" +  // this will clamp
4830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni            "}\n";
4930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    public ContrastFilter(String name) {
5121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        super(name, "contrast");
5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
54c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn    @Override
55511360e61650864ea22a171159efe073c80d0cdbMarius Renn    protected Program getNativeProgram(FilterContext context) {
5621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn        return new NativeProgram("filterpack_imageproc", "contrast");
5730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
5830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
59c0017fd82acec5d0427306ea5f536c3d78854f95Marius Renn    @Override
60511360e61650864ea22a171159efe073c80d0cdbMarius Renn    protected Program getShaderProgram(FilterContext context) {
61511360e61650864ea22a171159efe073c80d0cdbMarius Renn        return new ShaderProgram(context, mContrastShader);
6230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni    }
6330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni
6430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni}
65