package com.marshalchen.common.demoofui.imageprocessingexample;
import com.marshalchen.common.demoofui.R;
import com.marshalchen.common.uimodule.imageprocessing.FastImageProcessingPipeline;
import com.marshalchen.common.uimodule.imageprocessing.FastImageProcessingView;
import com.marshalchen.common.uimodule.imageprocessing.GLRenderer;
import com.marshalchen.common.uimodule.imageprocessing.filter.GenericFilter;
import com.marshalchen.common.uimodule.imageprocessing.inputprocess.ImageResourceInput;
import com.marshalchen.common.uimodule.imageprocessing.outputprocess.JPGFileEndpoint;
import com.marshalchen.common.uimodule.imageprocessing.outputprocess.ScreenEndpoint;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Window;
import android.view.WindowManager;
public class ImageProcessingGenericFilterExample extends Activity {
private FastImageProcessingView view;
private FastImageProcessingPipeline pipeline;
private ImageResourceInput imageIn;
private GenericFilter generic;
private JPGFileEndpoint imageOut;
private ScreenEndpoint screen;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
view = new FastImageProcessingView(this);
pipeline = new FastImageProcessingPipeline();
view.setPipeline(pipeline);
setContentView(view);
imageIn = new ImageResourceInput(view, this, R.drawable.image_processing_kukulkan);
generic = setupGenericFilterAsPolkaDot();
imageOut = new JPGFileEndpoint(this, true, Environment.getExternalStorageDirectory().getAbsolutePath()+"/Pictures/outputImage", true);
screen = new ScreenEndpoint(pipeline);
imageIn.addTarget(generic);
generic.addTarget(imageOut);
generic.addTarget(screen);
pipeline.addRootRenderer(imageIn);
pipeline.startRendering();
}
private GenericFilter setupGenericFilterAsPolkaDot() {
String UNIFORM_FRACTIONAL_WIDTH = "u_FractionalWidth";
String UNIFORM_ASPECT_RATIO = "u_AspectRatio";
String UNIFORM_DOT_SCALING = "u_DotScaling";
GenericFilter filter = new GenericFilter();
filter.setFragmentShader(
"precision mediump float;\n"
+"uniform sampler2D "+GLRenderer.UNIFORM_TEXTURE0+";\n"
+"varying vec2 "+GLRenderer.VARYING_TEXCOORD+";\n"
+"uniform float "+UNIFORM_FRACTIONAL_WIDTH+";\n"
+"uniform float "+UNIFORM_ASPECT_RATIO+";\n"
+"uniform highp float "+UNIFORM_DOT_SCALING+";\n"
+"void main(){\n"
+" highp vec2 sampleDivisor = vec2("+UNIFORM_FRACTIONAL_WIDTH+", "+UNIFORM_FRACTIONAL_WIDTH+" / "+UNIFORM_ASPECT_RATIO+");\n"
+" highp vec2 samplePos = "+GLRenderer.VARYING_TEXCOORD+" - mod("+GLRenderer.VARYING_TEXCOORD+", sampleDivisor) + 0.5 * sampleDivisor;\n"
+" highp vec2 textureCoordinateToUse = vec2("+GLRenderer.VARYING_TEXCOORD+".x, ("+GLRenderer.VARYING_TEXCOORD+".y * "+UNIFORM_ASPECT_RATIO+" + 0.5 - 0.5 * "+UNIFORM_ASPECT_RATIO+"));\n"
+" highp vec2 adjustedSamplePos = vec2(samplePos.x, (samplePos.y * "+UNIFORM_ASPECT_RATIO+" + 0.5 - 0.5 * "+UNIFORM_ASPECT_RATIO+"));\n"
+" highp float distanceFromSamplePoint = distance(adjustedSamplePos, textureCoordinateToUse);\n"
+" lowp float checkForPresenceWithinDot = step(distanceFromSamplePoint, ("+UNIFORM_FRACTIONAL_WIDTH+" * 0.5) * "+UNIFORM_DOT_SCALING+");\n"
+" gl_FragColor = vec4(texture2D("+GLRenderer.UNIFORM_TEXTURE0+", samplePos ).rgb * checkForPresenceWithinDot, 1.0);\n"
+"}\n"
);
filter.addUniformFloat(UNIFORM_FRACTIONAL_WIDTH, 0.02f);
filter.addUniformFloat(UNIFORM_DOT_SCALING, 0.9f);
filter.addUniformFloat(UNIFORM_ASPECT_RATIO, imageIn.getImageWidth()/imageIn.getImageHeight());
return filter;
}
}