FileDocCategorySizeDatePackage
RotateFilter.javaAPI DocAndroid 5.1 API4926Thu Mar 12 22:22:30 GMT 2015android.filterpacks.imageproc

RotateFilter

public class RotateFilter extends android.filterfw.core.Filter
hide

Fields Summary
private int
mAngle
private int
mTileSize
private android.filterfw.core.Program
mProgram
private int
mWidth
private int
mHeight
private int
mTarget
private int
mOutputWidth
private int
mOutputHeight
Constructors Summary
public RotateFilter(String name)


       
        super(name);
    
Methods Summary
public voidfieldPortValueUpdated(java.lang.String name, android.filterfw.core.FilterContext context)

        if (mProgram != null) {
            updateParameters();
        }
    
public voidinitProgram(android.filterfw.core.FilterContext context, int target)

        switch (target) {
            case FrameFormat.TARGET_GPU:
                ShaderProgram shaderProgram = ShaderProgram.createIdentity(context);
                shaderProgram.setMaximumTileSize(mTileSize);
                shaderProgram.setClearsOutput(true);
                mProgram = shaderProgram;
                break;

            default:
                throw new RuntimeException("Filter Sharpen does not support frames of " +
                    "target " + target + "!");
        }
        mTarget = target;
    
public voidprocess(android.filterfw.core.FilterContext context)

        // Get input frame
        Frame input = pullInput("image");
        FrameFormat inputFormat = input.getFormat();

        // Create program if not created already
        if (mProgram == null || inputFormat.getTarget() != mTarget) {
            initProgram(context, inputFormat.getTarget());
        }

        if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
            mWidth = inputFormat.getWidth();
            mHeight = inputFormat.getHeight();
            mOutputWidth = mWidth;
            mOutputHeight = mHeight;

            updateParameters();
        }

        // Create output frame
        FrameFormat outputFormat = ImageFormat.create(mOutputWidth, mOutputHeight,
                                                      ImageFormat.COLORSPACE_RGBA,
                                                      FrameFormat.TARGET_GPU);

        Frame output = context.getFrameManager().newFrame(outputFormat);

        // Process
        mProgram.process(input, output);

        // Push output
        pushOutput("image", output);

        // Release pushed frame
        output.release();
    
public voidsetupPorts()

        addMaskedInputPort("image", ImageFormat.create(ImageFormat.COLORSPACE_RGBA));
        addOutputBasedOnInput("image", "image");
    
private voidupdateParameters()

        float sinTheta;
        float cosTheta;

        if (mAngle % 90 == 0) {
            if (mAngle % 180 == 0) {
                sinTheta = 0f;
                cosTheta = (mAngle % 360 == 0) ? 1f:-1f;
            } else {
                cosTheta = 0f;
                sinTheta = ((mAngle + 90) % 360 == 0) ? -1f:1f;

                mOutputWidth = mHeight;
                mOutputHeight = mWidth;
            }
        } else {
            throw new RuntimeException("degree has to be multiply of 90.");
        }

        Point x0 = new Point(0.5f * (-cosTheta + sinTheta + 1f),
                             0.5f * (-sinTheta - cosTheta + 1f));
        Point x1 = new Point(0.5f * (cosTheta + sinTheta + 1f),
                             0.5f * (sinTheta - cosTheta + 1f));
        Point x2 = new Point(0.5f * (-cosTheta - sinTheta + 1f),
                             0.5f * (-sinTheta + cosTheta + 1f));
        Point x3 = new Point(0.5f * (cosTheta - sinTheta + 1f),
                             0.5f * (sinTheta + cosTheta + 1f));
        Quad quad = new Quad(x0, x1, x2, x3);
        ((ShaderProgram) mProgram).setTargetRegion(quad);