+ // Make sure the output rectangle is at least large enough to hold
+ // the given input rectangle in both dimensions, and is of the
+ // current aspect ratio (aspect_nom/aspect_denom).
+ void size_rectangle_to_fit(unsigned width, unsigned height, unsigned *output_width, unsigned *output_height);
+
+ // Compute the input sizes for all inputs for all effects in a given phase,
+ // and inform the effects about the results.
+ void inform_input_sizes(Phase *phase);
+
+ // Determine the preferred output size of a given phase.
+ // Requires that all input phases (if any) already have output sizes set.
+ void find_output_size(Phase *phase);
+
+ // Find all inputs eventually feeding into this effect that have
+ // output gamma different from GAMMA_LINEAR.
+ void find_all_nonlinear_inputs(Node *effect, std::vector<Node *> *nonlinear_inputs);
+
+ // Create a GLSL program computing the given effects in order.
+ Phase *compile_glsl_program(const std::vector<Node *> &inputs,
+ const std::vector<Node *> &effects);
+
+ // Create all GLSL programs needed to compute the given effect, and all outputs
+ // that depends on it (whenever possible).
+ void construct_glsl_programs(Node *output);
+
+ // Output the current graph to the given file in a Graphviz-compatible format;
+ // only useful for debugging.
+ void output_dot(const char *filename);
+ std::vector<std::string> get_labels_for_edge(const Node *from, const Node *to);
+ void output_dot_edge(FILE *fp,
+ const std::string &from_node_id,
+ const std::string &to_node_id,
+ const std::vector<std::string> &labels);
+
+ // Some of the graph algorithms assume that the nodes array is sorted
+ // topologically (inputs are always before outputs), but some operations
+ // (like graph rewriting) can change that. This function restores that order.
+ void sort_all_nodes_topologically();