Merge "pseudo random number generator in shader with limited precisions" into jb-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
c2e393f86c
@ -46,8 +46,6 @@ public class BitmapOverlayFilter extends Filter {
|
|||||||
private Program mProgram;
|
private Program mProgram;
|
||||||
private Frame mFrame;
|
private Frame mFrame;
|
||||||
|
|
||||||
private int mWidth = 0;
|
|
||||||
private int mHeight = 0;
|
|
||||||
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
||||||
|
|
||||||
private final String mOverlayShader =
|
private final String mOverlayShader =
|
||||||
@ -113,18 +111,17 @@ public class BitmapOverlayFilter extends Filter {
|
|||||||
initProgram(context, inputFormat.getTarget());
|
initProgram(context, inputFormat.getTarget());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the frame size has changed
|
if (mBitmap != null) {
|
||||||
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
|
Frame frame = createBitmapFrame(context);
|
||||||
mWidth = inputFormat.getWidth();
|
|
||||||
mHeight = inputFormat.getHeight();
|
|
||||||
|
|
||||||
createBitmapFrame(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process
|
// Process
|
||||||
Frame[] inputs = {input, mFrame};
|
Frame[] inputs = {input, frame};
|
||||||
mProgram.process(inputs, output);
|
mProgram.process(inputs, output);
|
||||||
|
|
||||||
|
frame.release();
|
||||||
|
} else {
|
||||||
|
output.setDataFromFrame(input);
|
||||||
|
}
|
||||||
|
|
||||||
// Push output
|
// Push output
|
||||||
pushOutput("image", output);
|
pushOutput("image", output);
|
||||||
|
|
||||||
@ -132,22 +129,18 @@ public class BitmapOverlayFilter extends Filter {
|
|||||||
output.release();
|
output.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createBitmapFrame(FilterContext context) {
|
private Frame createBitmapFrame(FilterContext context) {
|
||||||
if (mBitmap != null) {
|
|
||||||
FrameFormat format = ImageFormat.create(mBitmap.getWidth(),
|
FrameFormat format = ImageFormat.create(mBitmap.getWidth(),
|
||||||
mBitmap.getHeight(),
|
mBitmap.getHeight(),
|
||||||
ImageFormat.COLORSPACE_RGBA,
|
ImageFormat.COLORSPACE_RGBA,
|
||||||
FrameFormat.TARGET_GPU);
|
FrameFormat.TARGET_GPU);
|
||||||
|
|
||||||
if (mFrame != null) {
|
Frame frame = context.getFrameManager().newFrame(format);
|
||||||
mFrame.release();
|
frame.setBitmap(mBitmap);
|
||||||
}
|
|
||||||
|
|
||||||
mFrame = context.getFrameManager().newFrame(format);
|
|
||||||
mFrame.setBitmap(mBitmap);
|
|
||||||
|
|
||||||
mBitmap.recycle();
|
mBitmap.recycle();
|
||||||
mBitmap = null;
|
mBitmap = null;
|
||||||
}
|
|
||||||
|
return frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import android.filterfw.core.Program;
|
|||||||
import android.filterfw.core.ShaderProgram;
|
import android.filterfw.core.ShaderProgram;
|
||||||
import android.filterfw.format.ImageFormat;
|
import android.filterfw.format.ImageFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class BlackWhiteFilter extends Filter {
|
public class BlackWhiteFilter extends Filter {
|
||||||
@ -42,24 +43,30 @@ public class BlackWhiteFilter extends Filter {
|
|||||||
private int mTileSize = 640;
|
private int mTileSize = 640;
|
||||||
|
|
||||||
private Program mProgram;
|
private Program mProgram;
|
||||||
|
private Random mRandom;
|
||||||
|
|
||||||
private int mWidth = 0;
|
|
||||||
private int mHeight = 0;
|
|
||||||
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
||||||
|
|
||||||
private final String mBlackWhiteShader =
|
private final String mBlackWhiteShader =
|
||||||
"precision mediump float;\n" +
|
"precision mediump float;\n" +
|
||||||
"uniform sampler2D tex_sampler_0;\n" +
|
"uniform sampler2D tex_sampler_0;\n" +
|
||||||
|
"uniform vec2 seed;\n" +
|
||||||
"uniform float black;\n" +
|
"uniform float black;\n" +
|
||||||
"uniform float scale;\n" +
|
"uniform float scale;\n" +
|
||||||
"uniform float stepsize;\n" +
|
"uniform float stepsize;\n" +
|
||||||
"varying vec2 v_texcoord;\n" +
|
"varying vec2 v_texcoord;\n" +
|
||||||
"float rand(vec2 loc) {\n" +
|
"float rand(vec2 loc) {\n" +
|
||||||
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
|
" const float divide = 0.00048828125;\n" +
|
||||||
|
" const float factor = 2048.0;\n" +
|
||||||
|
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
|
||||||
|
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
|
||||||
|
" float part2 = mod(value, divide);\n" +
|
||||||
|
" float part1 = value - part2;\n" +
|
||||||
|
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
|
||||||
"}\n" +
|
"}\n" +
|
||||||
"void main() {\n" +
|
"void main() {\n" +
|
||||||
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
|
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
|
||||||
" float dither = rand(v_texcoord);\n" +
|
" float dither = rand(v_texcoord + seed);\n" +
|
||||||
" vec3 xform = clamp((color.rgb - black) * scale, 0.0, 1.0);\n" +
|
" vec3 xform = clamp((color.rgb - black) * scale, 0.0, 1.0);\n" +
|
||||||
" vec3 temp = clamp((color.rgb + stepsize - black) * scale, 0.0, 1.0);\n" +
|
" vec3 temp = clamp((color.rgb + stepsize - black) * scale, 0.0, 1.0);\n" +
|
||||||
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
||||||
@ -68,6 +75,7 @@ public class BlackWhiteFilter extends Filter {
|
|||||||
|
|
||||||
public BlackWhiteFilter(String name) {
|
public BlackWhiteFilter(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
|
mRandom = new Random(new Date().getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -100,10 +108,12 @@ public class BlackWhiteFilter extends Filter {
|
|||||||
private void updateParameters() {
|
private void updateParameters() {
|
||||||
float scale = (mBlack != mWhite) ? 1.0f / (mWhite - mBlack) : 2000f;
|
float scale = (mBlack != mWhite) ? 1.0f / (mWhite - mBlack) : 2000f;
|
||||||
float stepsize = 1.0f / 255.0f;
|
float stepsize = 1.0f / 255.0f;
|
||||||
|
|
||||||
mProgram.setHostValue("black", mBlack);
|
mProgram.setHostValue("black", mBlack);
|
||||||
mProgram.setHostValue("scale", scale);
|
mProgram.setHostValue("scale", scale);
|
||||||
mProgram.setHostValue("stepsize", stepsize);
|
mProgram.setHostValue("stepsize", stepsize);
|
||||||
|
|
||||||
|
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
|
||||||
|
mProgram.setHostValue("seed", seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -124,12 +134,6 @@ public class BlackWhiteFilter extends Filter {
|
|||||||
initProgram(context, inputFormat.getTarget());
|
initProgram(context, inputFormat.getTarget());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the frame size has changed
|
|
||||||
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
|
|
||||||
mWidth = inputFormat.getWidth();
|
|
||||||
mHeight = inputFormat.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create output frame
|
// Create output frame
|
||||||
Frame output = context.getFrameManager().newFrame(inputFormat);
|
Frame output = context.getFrameManager().newFrame(inputFormat);
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import android.filterfw.core.Program;
|
|||||||
import android.filterfw.core.ShaderProgram;
|
import android.filterfw.core.ShaderProgram;
|
||||||
import android.filterfw.format.ImageFormat;
|
import android.filterfw.format.ImageFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class DocumentaryFilter extends Filter {
|
public class DocumentaryFilter extends Filter {
|
||||||
@ -36,6 +37,7 @@ public class DocumentaryFilter extends Filter {
|
|||||||
private int mTileSize = 640;
|
private int mTileSize = 640;
|
||||||
|
|
||||||
private Program mProgram;
|
private Program mProgram;
|
||||||
|
private Random mRandom;
|
||||||
|
|
||||||
private int mWidth = 0;
|
private int mWidth = 0;
|
||||||
private int mHeight = 0;
|
private int mHeight = 0;
|
||||||
@ -44,17 +46,24 @@ public class DocumentaryFilter extends Filter {
|
|||||||
private final String mDocumentaryShader =
|
private final String mDocumentaryShader =
|
||||||
"precision mediump float;\n" +
|
"precision mediump float;\n" +
|
||||||
"uniform sampler2D tex_sampler_0;\n" +
|
"uniform sampler2D tex_sampler_0;\n" +
|
||||||
|
"uniform vec2 seed;\n" +
|
||||||
"uniform float stepsize;\n" +
|
"uniform float stepsize;\n" +
|
||||||
"uniform float inv_max_dist;\n" +
|
"uniform float inv_max_dist;\n" +
|
||||||
"uniform vec2 center;\n" +
|
"uniform vec2 center;\n" +
|
||||||
"varying vec2 v_texcoord;\n" +
|
"varying vec2 v_texcoord;\n" +
|
||||||
"float rand(vec2 loc) {\n" +
|
"float rand(vec2 loc) {\n" +
|
||||||
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
|
" const float divide = 0.00048828125;\n" +
|
||||||
|
" const float factor = 2048.0;\n" +
|
||||||
|
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
|
||||||
|
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
|
||||||
|
" float part2 = mod(value, divide);\n" +
|
||||||
|
" float part1 = value - part2;\n" +
|
||||||
|
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
|
||||||
"}\n" +
|
"}\n" +
|
||||||
"void main() {\n" +
|
"void main() {\n" +
|
||||||
// black white
|
// black white
|
||||||
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
|
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
|
||||||
" float dither = rand(v_texcoord);\n" +
|
" float dither = rand(v_texcoord + seed);\n" +
|
||||||
" vec3 xform = clamp(2.0 * color.rgb, 0.0, 1.0);\n" +
|
" vec3 xform = clamp(2.0 * color.rgb, 0.0, 1.0);\n" +
|
||||||
" vec3 temp = clamp(2.0 * (color.rgb + stepsize), 0.0, 1.0);\n" +
|
" vec3 temp = clamp(2.0 * (color.rgb + stepsize), 0.0, 1.0);\n" +
|
||||||
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
" vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
||||||
@ -69,6 +78,8 @@ public class DocumentaryFilter extends Filter {
|
|||||||
|
|
||||||
public DocumentaryFilter(String name) {
|
public DocumentaryFilter(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
|
Date date = new Date();
|
||||||
|
mRandom = new Random(new Date().getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -138,7 +149,9 @@ public class DocumentaryFilter extends Filter {
|
|||||||
mProgram.setHostValue("center", center);
|
mProgram.setHostValue("center", center);
|
||||||
mProgram.setHostValue("inv_max_dist", 1.0f / max_dist);
|
mProgram.setHostValue("inv_max_dist", 1.0f / max_dist);
|
||||||
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
|
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
|
||||||
|
mProgram.setHostValue("seed", seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import android.filterfw.format.ImageFormat;
|
|||||||
import android.filterfw.geometry.Quad;
|
import android.filterfw.geometry.Quad;
|
||||||
import android.filterfw.geometry.Point;
|
import android.filterfw.geometry.Point;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class GrainFilter extends Filter {
|
public class GrainFilter extends Filter {
|
||||||
@ -49,14 +50,20 @@ public class GrainFilter extends Filter {
|
|||||||
private int mHeight = 0;
|
private int mHeight = 0;
|
||||||
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
private int mTarget = FrameFormat.TARGET_UNSPECIFIED;
|
||||||
|
|
||||||
private Random mRandom = new Random();
|
private Random mRandom;
|
||||||
|
|
||||||
private final String mNoiseShader =
|
private final String mNoiseShader =
|
||||||
"precision mediump float;\n" +
|
"precision mediump float;\n" +
|
||||||
"uniform vec2 seed;\n" +
|
"uniform vec2 seed;\n" +
|
||||||
"varying vec2 v_texcoord;\n" +
|
"varying vec2 v_texcoord;\n" +
|
||||||
"float rand(vec2 loc) {\n" +
|
"float rand(vec2 loc) {\n" +
|
||||||
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
|
" const float divide = 0.00048828125;\n" +
|
||||||
|
" const float factor = 2048.0;\n" +
|
||||||
|
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
|
||||||
|
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
|
||||||
|
" float part2 = mod(value, divide);\n" +
|
||||||
|
" float part1 = value - part2;\n" +
|
||||||
|
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
|
||||||
"}\n" +
|
"}\n" +
|
||||||
"void main() {\n" +
|
"void main() {\n" +
|
||||||
" gl_FragColor = vec4(rand(v_texcoord + seed), 0.0, 0.0, 1.0);\n" +
|
" gl_FragColor = vec4(rand(v_texcoord + seed), 0.0, 0.0, 1.0);\n" +
|
||||||
@ -86,6 +93,7 @@ public class GrainFilter extends Filter {
|
|||||||
|
|
||||||
public GrainFilter(String name) {
|
public GrainFilter(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
|
mRandom = new Random(new Date().getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -28,12 +28,16 @@ import android.filterfw.core.Program;
|
|||||||
import android.filterfw.core.ShaderProgram;
|
import android.filterfw.core.ShaderProgram;
|
||||||
import android.filterfw.format.ImageFormat;
|
import android.filterfw.format.ImageFormat;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public class LomoishFilter extends Filter {
|
public class LomoishFilter extends Filter {
|
||||||
|
|
||||||
@GenerateFieldPort(name = "tile_size", hasDefault = true)
|
@GenerateFieldPort(name = "tile_size", hasDefault = true)
|
||||||
private int mTileSize = 640;
|
private int mTileSize = 640;
|
||||||
|
|
||||||
private Program mProgram;
|
private Program mProgram;
|
||||||
|
private Random mRandom;
|
||||||
|
|
||||||
private int mWidth = 0;
|
private int mWidth = 0;
|
||||||
private int mHeight = 0;
|
private int mHeight = 0;
|
||||||
@ -42,6 +46,7 @@ public class LomoishFilter extends Filter {
|
|||||||
private final String mLomoishShader =
|
private final String mLomoishShader =
|
||||||
"precision mediump float;\n" +
|
"precision mediump float;\n" +
|
||||||
"uniform sampler2D tex_sampler_0;\n" +
|
"uniform sampler2D tex_sampler_0;\n" +
|
||||||
|
"uniform vec2 seed;\n" +
|
||||||
"uniform float stepsizeX;\n" +
|
"uniform float stepsizeX;\n" +
|
||||||
"uniform float stepsizeY;\n" +
|
"uniform float stepsizeY;\n" +
|
||||||
"uniform float stepsize;\n" +
|
"uniform float stepsize;\n" +
|
||||||
@ -49,7 +54,13 @@ public class LomoishFilter extends Filter {
|
|||||||
"uniform float inv_max_dist;\n" +
|
"uniform float inv_max_dist;\n" +
|
||||||
"varying vec2 v_texcoord;\n" +
|
"varying vec2 v_texcoord;\n" +
|
||||||
"float rand(vec2 loc) {\n" +
|
"float rand(vec2 loc) {\n" +
|
||||||
" return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\n" +
|
" const float divide = 0.00048828125;\n" +
|
||||||
|
" const float factor = 2048.0;\n" +
|
||||||
|
" float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
|
||||||
|
" float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
|
||||||
|
" float part2 = mod(value, divide);\n" +
|
||||||
|
" float part1 = value - part2;\n" +
|
||||||
|
" return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
|
||||||
"}\n" +
|
"}\n" +
|
||||||
"void main() {\n" +
|
"void main() {\n" +
|
||||||
// sharpen
|
// sharpen
|
||||||
@ -96,7 +107,7 @@ public class LomoishFilter extends Filter {
|
|||||||
" }\n" +
|
" }\n" +
|
||||||
" c_color.b = s_color.b * 0.5 + 0.25;\n" +
|
" c_color.b = s_color.b * 0.5 + 0.25;\n" +
|
||||||
// blackwhite
|
// blackwhite
|
||||||
" float dither = rand(v_texcoord);\n" +
|
" float dither = rand(v_texcoord + seed);\n" +
|
||||||
" vec3 xform = clamp((c_color.rgb - 0.15) * 1.53846, 0.0, 1.0);\n" +
|
" vec3 xform = clamp((c_color.rgb - 0.15) * 1.53846, 0.0, 1.0);\n" +
|
||||||
" vec3 temp = clamp((color.rgb + stepsize - 0.15) * 1.53846, 0.0, 1.0);\n" +
|
" vec3 temp = clamp((color.rgb + stepsize - 0.15) * 1.53846, 0.0, 1.0);\n" +
|
||||||
" vec3 bw_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
" vec3 bw_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
|
||||||
@ -108,6 +119,7 @@ public class LomoishFilter extends Filter {
|
|||||||
|
|
||||||
public LomoishFilter(String name) {
|
public LomoishFilter(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
|
mRandom = new Random(new Date().getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -149,6 +161,9 @@ public class LomoishFilter extends Filter {
|
|||||||
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
|
mProgram.setHostValue("stepsize", 1.0f / 255.0f);
|
||||||
mProgram.setHostValue("stepsizeX", 1.0f / mWidth);
|
mProgram.setHostValue("stepsizeX", 1.0f / mWidth);
|
||||||
mProgram.setHostValue("stepsizeY", 1.0f / mHeight);
|
mProgram.setHostValue("stepsizeY", 1.0f / mHeight);
|
||||||
|
|
||||||
|
float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
|
||||||
|
mProgram.setHostValue("seed", seed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,14 +114,6 @@ public class RedEyeFilter extends Filter {
|
|||||||
mTarget = target;
|
mTarget = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tearDown(FilterContext context) {
|
|
||||||
if (mRedEyeBitmap != null) {
|
|
||||||
mRedEyeBitmap.recycle();
|
|
||||||
mRedEyeBitmap = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(FilterContext context) {
|
public void process(FilterContext context) {
|
||||||
// Get input frame
|
// Get input frame
|
||||||
@ -140,10 +132,7 @@ public class RedEyeFilter extends Filter {
|
|||||||
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
|
if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
|
||||||
mWidth = inputFormat.getWidth();
|
mWidth = inputFormat.getWidth();
|
||||||
mHeight = inputFormat.getHeight();
|
mHeight = inputFormat.getHeight();
|
||||||
|
|
||||||
createRedEyeBitmap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
createRedEyeFrame(context);
|
createRedEyeFrame(context);
|
||||||
|
|
||||||
// Process
|
// Process
|
||||||
@ -168,29 +157,26 @@ public class RedEyeFilter extends Filter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createRedEyeBitmap() {
|
private void createRedEyeFrame(FilterContext context) {
|
||||||
if (mRedEyeBitmap != null) {
|
|
||||||
mRedEyeBitmap.recycle();
|
|
||||||
}
|
|
||||||
|
|
||||||
int bitmapWidth = mWidth / 2;
|
int bitmapWidth = mWidth / 2;
|
||||||
int bitmapHeight = mHeight / 2;
|
int bitmapHeight = mHeight / 2;
|
||||||
|
|
||||||
mRedEyeBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
|
Bitmap redEyeBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
|
||||||
mCanvas.setBitmap(mRedEyeBitmap);
|
mCanvas.setBitmap(redEyeBitmap);
|
||||||
mPaint.setColor(Color.WHITE);
|
mPaint.setColor(Color.WHITE);
|
||||||
mRadius = Math.max(MIN_RADIUS, RADIUS_RATIO * Math.min(bitmapWidth, bitmapHeight));
|
mRadius = Math.max(MIN_RADIUS, RADIUS_RATIO * Math.min(bitmapWidth, bitmapHeight));
|
||||||
|
|
||||||
updateProgramParams();
|
for (int i = 0; i < mCenters.length; i += 2) {
|
||||||
|
mCanvas.drawCircle(mCenters[i] * bitmapWidth, mCenters[i + 1] * bitmapHeight,
|
||||||
|
mRadius, mPaint);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createRedEyeFrame(FilterContext context) {
|
FrameFormat format = ImageFormat.create(bitmapWidth, bitmapHeight,
|
||||||
FrameFormat format = ImageFormat.create(mRedEyeBitmap.getWidth() ,
|
|
||||||
mRedEyeBitmap.getHeight(),
|
|
||||||
ImageFormat.COLORSPACE_RGBA,
|
ImageFormat.COLORSPACE_RGBA,
|
||||||
FrameFormat.TARGET_GPU);
|
FrameFormat.TARGET_GPU);
|
||||||
mRedEyeFrame = context.getFrameManager().newFrame(format);
|
mRedEyeFrame = context.getFrameManager().newFrame(format);
|
||||||
mRedEyeFrame.setBitmap(mRedEyeBitmap);
|
mRedEyeFrame.setBitmap(redEyeBitmap);
|
||||||
|
redEyeBitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateProgramParams() {
|
private void updateProgramParams() {
|
||||||
@ -199,13 +185,5 @@ public class RedEyeFilter extends Filter {
|
|||||||
if ( mCenters.length % 2 == 1) {
|
if ( mCenters.length % 2 == 1) {
|
||||||
throw new RuntimeException("The size of center array must be even.");
|
throw new RuntimeException("The size of center array must be even.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mRedEyeBitmap != null) {
|
|
||||||
for (int i = 0; i < mCenters.length; i += 2) {
|
|
||||||
mCanvas.drawCircle(mCenters[i] * mRedEyeBitmap.getWidth(),
|
|
||||||
mCenters[i + 1] * mRedEyeBitmap.getHeight(),
|
|
||||||
mRadius, mPaint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user