package com.android.gallery3d.filtershow.filters;

import android.util.Log;

import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.ui.Spline;

/**
 * TODO: Insert description here. (generated by hoford)
 */
public class FilterCurvesRepresentation extends FilterRepresentation {
    private static final String LOGTAG = "FilterCurvesRepresentation";

    private Spline[] mSplines = new Spline[4];

    public FilterCurvesRepresentation() {
        super("Curves");
        setFilterClass(ImageFilterCurves.class);
        setTextId(R.string.curvesRGB);
        setButtonId(R.id.curvesButtonRGB);
        setOverlayId(R.drawable.filtershow_button_colors_curve);
        setEditorId(R.id.imageCurves);
        setShowEditingControls(false);
        setShowParameterValue(false);
        setShowUtilityPanel(true);
        setSupportsPartialRendering(true);
        reset();
    }

    @Override
    public FilterRepresentation clone() throws CloneNotSupportedException {
        FilterCurvesRepresentation rep = new FilterCurvesRepresentation();
        rep.useParametersFrom(this);
        return rep;
    }

    @Override
    public void useParametersFrom(FilterRepresentation a) {
        if (!(a instanceof FilterCurvesRepresentation)) {
            Log.v(LOGTAG, "cannot use parameters from " + a);
            return;
        }
        FilterCurvesRepresentation representation = (FilterCurvesRepresentation) a;
        Spline[] spline = new Spline[4];
        for (int i = 0; i < spline.length; i++) {
            Spline sp = representation.mSplines[i];
            if (sp != null) {
                spline[i] = new Spline(sp);
            } else {
                spline[i] = new Spline();
            }
        }
        mSplines = spline;
    }

    public boolean isNil() {
        for (int i = 0; i < 4; i++) {
            if (getSpline(i) != null && !getSpline(i).isOriginal()) {
                return false;
            }
        }
        return true;
    }

    public void reset() {
        Spline spline = new Spline();

        spline.addPoint(0.0f, 1.0f);
        spline.addPoint(1.0f, 0.0f);

        for (int i = 0; i < 4; i++) {
            mSplines[i] = new Spline(spline);
        }
    }

    public void setSpline(int splineIndex, Spline s) {
        mSplines[splineIndex] = s;
    }
    public Spline getSpline(int splineIndex) {
        return mSplines[splineIndex];
    }
}
