Skip to content

Commit f41f7c6

Browse files
committed
Merge pull request cats-oss#119 from vashisthg/develop
added GPUImageLevelsFilter
2 parents d1f1c3c + e5e0785 commit f41f7c6

File tree

2 files changed

+146
-1
lines changed

2 files changed

+146
-1
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package jp.co.cyberagent.android.gpuimage;
2+
3+
import android.opengl.GLES20;
4+
import android.util.Log;
5+
6+
/**
7+
* Created by vashisthg 30/05/14.
8+
*/
9+
public class GPUImageLevelsFilter extends GPUImageFilter{
10+
11+
private static final String LOGTAG = GPUImageLevelsFilter.class.getSimpleName();
12+
13+
public static final String LEVELS_FRAGMET_SHADER =
14+
15+
" varying highp vec2 textureCoordinate;\n" +
16+
" \n" +
17+
" uniform sampler2D inputImageTexture;\n" +
18+
" uniform mediump vec3 levelMinimum;\n" +
19+
" uniform mediump vec3 levelMiddle;\n" +
20+
" uniform mediump vec3 levelMaximum;\n" +
21+
" uniform mediump vec3 minOutput;\n" +
22+
" uniform mediump vec3 maxOutput;\n" +
23+
" \n" +
24+
" void main()\n" +
25+
" {\n" +
26+
" mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" +
27+
" \n" +
28+
" gl_FragColor = vec4( mix(minOutput, maxOutput, pow(min(max(textureColor.rgb -levelMinimum, vec3(0.0)) / (levelMaximum - levelMinimum ), vec3(1.0)), 1.0 /levelMiddle)) , textureColor.a);\n" +
29+
" }\n";
30+
31+
private int mMinLocation;
32+
private float[] mMin;
33+
private int mMidLocation;
34+
private float[] mMid;
35+
private int mMaxLocation;
36+
private float[] mMax;
37+
private int mMinOutputLocation;
38+
private float[] mMinOutput;
39+
private int mMaxOutputLocation;
40+
private float[] mMaxOutput;
41+
42+
public GPUImageLevelsFilter() {
43+
this(new float[] {0.0f,0.0f,0.0f}, new float[] {1.0f, 1.0f, 1.0f }, new float[] {1.0f, 1.0f ,1.0f}, new float[] {0.0f, 0.0f, 0.0f}, new float[] {1.0f,1.0f,1.0f});
44+
}
45+
46+
private GPUImageLevelsFilter(final float[] min, final float[] mid, final float[] max, final float[] minOUt, final float[] maxOut) {
47+
super(NO_FILTER_VERTEX_SHADER, LEVELS_FRAGMET_SHADER);
48+
49+
mMin = min;
50+
mMid = mid;
51+
mMax = max;
52+
mMinOutput = minOUt;
53+
mMaxOutput = maxOut;
54+
setMin(0.0f, 1.0f, 1.0f, 0.0f, 1.0f);
55+
}
56+
57+
@Override
58+
public void onInit() {
59+
super.onInit();
60+
mMinLocation = GLES20.glGetUniformLocation(getProgram(), "levelMinimum");
61+
mMidLocation = GLES20.glGetUniformLocation(getProgram(), "levelMiddle");
62+
mMaxLocation = GLES20.glGetUniformLocation(getProgram(), "levelMaximum");
63+
mMinOutputLocation = GLES20.glGetUniformLocation(getProgram(), "minOutput");
64+
mMaxOutputLocation = GLES20.glGetUniformLocation(getProgram(), "maxOutput");
65+
}
66+
67+
@Override
68+
public void onInitialized() {
69+
super.onInitialized();
70+
updateUniforms();
71+
}
72+
73+
74+
public void updateUniforms () {
75+
setFloatVec3(mMinLocation, mMin);
76+
setFloatVec3(mMidLocation, mMid);
77+
setFloatVec3(mMaxLocation, mMax);
78+
setFloatVec3(mMinOutputLocation, mMinOutput);
79+
setFloatVec3(mMaxOutputLocation, mMaxOutput);
80+
}
81+
82+
public void setMin(float min, float mid , float max ,float minOut , float maxOut) {
83+
setRedMin(min, mid, max, minOut, maxOut);
84+
setGreenMin(min, mid, max, minOut, maxOut);
85+
setBlueMin(min, mid, max, minOut, maxOut);
86+
}
87+
88+
public void setMin(float min, float mid , float max ) {
89+
setMin(min, mid, max, 0.0f, 1.0f);
90+
}
91+
92+
public void setRedMin(float min, float mid , float max ,float minOut , float maxOut) {
93+
mMin[0] = min;
94+
mMid[0] = mid;
95+
mMax[0] = max;
96+
mMinOutput[0] = minOut;
97+
mMaxOutput[0] = maxOut;
98+
updateUniforms();
99+
}
100+
101+
public void setRedMin(float min, float mid , float max ){
102+
setRedMin(min, mid, max, 0, 1);
103+
}
104+
105+
public void setGreenMin(float min, float mid , float max ,float minOut , float maxOut) {
106+
mMin[1] = min;
107+
mMid[1] = mid;
108+
mMax[1] = max;
109+
mMinOutput[1] = minOut;
110+
mMaxOutput[1] = maxOut;
111+
updateUniforms();
112+
}
113+
114+
public void setGreenMin(float min, float mid , float max ){
115+
setGreenMin(min, mid, max, 0, 1);
116+
}
117+
118+
public void setBlueMin(float min, float mid , float max ,float minOut , float maxOut) {
119+
mMin[2] = min;
120+
mMid[2] = mid;
121+
mMax[2] = max;
122+
mMinOutput[2] = minOut;
123+
mMaxOutput[2] = maxOut;
124+
updateUniforms();
125+
}
126+
127+
public void setBlueMin(float min, float mid , float max ){
128+
setBlueMin(min, mid, max, 0, 1);
129+
}
130+
}

sample/src/jp/co/cyberagent/android/gpuimage/sample/GPUImageFilterTools.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ public static void showDialog(final Context context,
104104

105105
filters.addFilter("Color Balance", FilterType.COLOR_BALANCE);
106106

107+
filters.addFilter("Levels Min (Mid Adjust)", FilterType.LEVELS_FILTER_MIN);
108+
107109
AlertDialog.Builder builder = new AlertDialog.Builder(context);
108110
builder.setTitle("Choose a filter");
109111
builder.setItems(filters.names.toArray(new String[filters.names.size()]),
@@ -280,6 +282,10 @@ private static GPUImageFilter createFilterForType(final Context context, final F
280282
return new GPUImageFalseColorFilter();
281283
case COLOR_BALANCE:
282284
return new GPUImageColorBalanceFilter();
285+
case LEVELS_FILTER_MIN:
286+
GPUImageLevelsFilter levelsFilter = new GPUImageLevelsFilter();
287+
levelsFilter.setMin(0.0f, 3.0f, 1.0f);
288+
return levelsFilter;
283289

284290
default:
285291
throw new IllegalStateException("No filter of that type!");
@@ -308,7 +314,7 @@ private enum FilterType {
308314
BLEND_DISSOLVE, BLEND_EXCLUSION, BLEND_SOURCE_OVER, BLEND_HARD_LIGHT, BLEND_LIGHTEN, BLEND_ADD, BLEND_DIVIDE, BLEND_MULTIPLY, BLEND_OVERLAY, BLEND_SCREEN, BLEND_ALPHA,
309315
BLEND_COLOR, BLEND_HUE, BLEND_SATURATION, BLEND_LUMINOSITY, BLEND_LINEAR_BURN, BLEND_SOFT_LIGHT, BLEND_SUBTRACT, BLEND_CHROMA_KEY, BLEND_NORMAL, LOOKUP_AMATORKA,
310316
GAUSSIAN_BLUR, CROSSHATCH, BOX_BLUR, CGA_COLORSPACE, DILATION, KUWAHARA, RGB_DILATION, SKETCH, TOON, SMOOTH_TOON, BULGE_DISTORTION, GLASS_SPHERE, HAZE, LAPLACIAN, NON_MAXIMUM_SUPPRESSION,
311-
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE
317+
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE, LEVELS_FILTER_MIN
312318
}
313319

314320
private static class FilterList {
@@ -381,6 +387,8 @@ public FilterAdjuster(final GPUImageFilter filter) {
381387
adjuster = new SwirlAdjuster().filter(filter);
382388
} else if (filter instanceof GPUImageColorBalanceFilter) {
383389
adjuster = new ColorBalanceAdjuster().filter(filter);
390+
} else if (filter instanceof GPUImageLevelsFilter) {
391+
adjuster = new LevelsMinMidAdjuster().filter(filter);
384392
} else {
385393
adjuster = null;
386394
}
@@ -628,5 +636,12 @@ public void adjust(int percentage) {
628636
range(percentage / 3, 0.0f, 1.0f)});
629637
}
630638
}
639+
640+
private class LevelsMinMidAdjuster extends Adjuster<GPUImageLevelsFilter> {
641+
@Override
642+
public void adjust(int percentage) {
643+
getFilter().setMin(0.0f, range(percentage, 0.0f, 1.0f) , 1.0f);
644+
}
645+
}
631646
}
632647
}

0 commit comments

Comments
 (0)