/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package android.filterfw;

import android.filterfw.core.Filter;
import android.filterfw.core.FilterFactory;
import android.filterfw.core.FilterFunction;
import android.filterfw.core.FrameManager;

/**
 * A FilterFunctionEnvironment provides a simple functional front-end to manually executing
 * filters. Use this environment if a graph-based approach is not convenient for your case.
 * Typically, a FilterFunctionEnvironment is used as follows:
 *   1. Instantiate a new FilterFunctionEnvironment instance.
 *   2. Perform any configuration, such as setting a GL environment.
 *   3. Wrap Filters into FilterFunctions by calling createFunction().
 *   4. Execute FilterFunctions individually and use the results for further processing.
 * Additionally, there is a convenience method to execute a number of filters in sequence.
 * @hide
 */
public class FilterFunctionEnvironment extends MffEnvironment {

    /**
     * Create a new FilterFunctionEnvironment with the default components.
     */
    public FilterFunctionEnvironment() {
        super(null);
    }

    /**
     * Create a new FilterFunctionEnvironment with a custom FrameManager. Pass null to auto-create
     * a FrameManager.
     *
     * @param frameManager The FrameManager to use, or null to auto-create one.
     */
    public FilterFunctionEnvironment(FrameManager frameManager) {
        super(frameManager);
    }

    /**
     * Create a new FilterFunction from a specific filter class. The function is initialized with
     * the given key-value list of parameters. Note, that this function uses the default shared
     * FilterFactory to create the filter instance.
     *
     * @param filterClass   The class of the filter to wrap. This must be a Filter subclass.
     * @param parameters    An argument list of alternating key-value filter parameters.
     * @return             A new FilterFunction instance.
     */
    public FilterFunction createFunction(Class filterClass, Object... parameters) {
        String filterName = "FilterFunction(" + filterClass.getSimpleName() + ")";
        Filter filter = FilterFactory.sharedFactory().createFilterByClass(filterClass, filterName);
        filter.initWithAssignmentList(parameters);
        return new FilterFunction(getContext(), filter);
    }

    /**
     * Convenience method to execute a sequence of filter functions. Note that every function in
     * the list MUST have one input and one output port, except the first filter (which must not
     * have any input ports) and the last filter (which may not have any output ports).
     *
     * @param functions A list of filter functions. The first filter must be a source filter.
     * @return         The result of the last filter executed, or null if the last filter did not
                        produce any output.
     *
    public Frame executeSequence(FilterFunction[] functions) {
        Frame oldFrame = null;
        Frame newFrame = null;
        for (FilterFunction filterFunction : functions) {
            if (oldFrame == null) {
                newFrame = filterFunction.executeWithArgList();
            } else {
                newFrame = filterFunction.executeWithArgList(oldFrame);
                oldFrame.release();
            }
            oldFrame = newFrame;
        }
        if (oldFrame != null) {
            oldFrame.release();
        }
        return newFrame;
    }*/

}
