summaryrefslogtreecommitdiff
path: root/src/bjc/imgchain/pipeline/MutablePipeline.java
blob: 98b4ff91f101ac7a47f0dffc552a3ef7f171a100 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package bjc.imgchain.pipeline;

import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;

import bjc.imgchain.ImgChain;
import bjc.imgchain.utils.Utils;

/**
 * An editable {@link Pipeline}
 * 
 * @author acm
 *
 */
public class MutablePipeline implements Pipeline {
	private final List<PipelineStage> stages;

	private String name;

	/**
	 * Create a new unnamed mutable pipeline.
	 */
	public MutablePipeline() {
		stages = new ArrayList<>();

		name = "Unnamed Pipeline";
	}

	/**
	 * Create a new named mutable pipeline.
	 * 
	 * @param name
	 *                The name of the pipeline.
	 */
	public MutablePipeline(String name) {
		stages = new ArrayList<>();

		this.name = name;
	}

	@Override
	public Image process(Image input) {
		Image proc = input;

		int i = 1;

		for (PipelineStage stage : stages) {
			System.out.println("Applying stage " + stage.name() + "(" + stage.toString() + ")");

			proc = stage.process(proc);

			Utils.displayImage(proc, "Pipeline Results - " + stage.name() + " - #" + i);

			System.out.println("Applied stage " + stage.name());
		}

		return proc;
	}

	@Override
	public List<PipelineStage> stages() {
		return stages;
	}

	@Override
	public String name() {
		return name;
	}

	/**
	 * Set the name of the pipeline.
	 * 
	 * @param nam
	 *                The name of the pipeline.
	 */
	public void name(String nam) {
		name = nam;
	}

	/**
	 * Append a pipeline stage to the end of this pipeline.
	 * 
	 * @param stag
	 *                The stage to add.
	 */
	public void addStage(PipelineStage stag) {
		System.out.println("Adding stage " + stag);
		stages.add(stag);
	}

	/**
	 * Remove a pipeline stage.
	 * 
	 * @param stag
	 *                The stage to remove.
	 */
	public void removeStage(PipelineStage stag) {
		System.out.println("Removing stage " + stag);
		stages.remove(stag);
	}

	/**
	 * Remove a pipeline stage by index.
	 * 
	 * @param idx
	 *                The index of the stage to remove.
	 */
	public void removeStage(int idx) {
		System.out.println("Removing stage # " + idx);
		stages.remove(idx);
		System.out.println("Pipeline contains " + stages.size() + " stages");
	}

}