digraph DFA { size = "8 11"; subgraph cluster0 { label = "header"; color = blue; fontcolor = blue; init [label = "x=3", shape = plaintext]; header_loop [label = "", shape = doublecircle]; header_newline [label = "x--"]; } subgraph cluster1 { label = "even scanline"; color = red; fontcolor = red; even_line_init [label = "x=width"]; even_line_0r [label = ""]; even_line_0g [label = ""]; even_line_0b [label = "x--"]; } subgraph cluster2 { label = "odd scanline"; color = green; fontcolor = green; odd_line_init [label = "x=width"]; odd_line_0r [label = ""]; odd_line_0g [label = ""]; odd_line_0b [label = "x--"]; odd_line_1r [label = "flush"]; odd_line_1g [label = "flush"]; odd_line_1b [label = "flush;x--"]; } // Skip header // P6\n \n\n init -> header_loop; header_loop -> header_loop [label = "?"]; header_loop -> header_newline [label = "\\n"]; header_newline -> header_loop [label = "? && x!=0"]; header_newline -> even_line_init [label = "R && x==0"]; // Skip all pixels in even scanline even_line_init -> even_line_0g [label = "G"]; even_line_0r -> even_line_0g [label = "G"]; even_line_0g -> even_line_0b [label = "B"]; even_line_0b -> even_line_0r [label = "R && x!=0"]; even_line_0b -> odd_line_init [label = "R && x==0"]; // Skip even pixels in odd scanline odd_line_init -> odd_line_0g [label = "G"]; odd_line_0r -> odd_line_0g [label = "G"]; odd_line_0g -> odd_line_0b [label = "B"]; odd_line_0b -> odd_line_1r [label = "R && x!=0"]; odd_line_0b -> even_line_init [label = "R && x==0"]; odd_line_1r -> odd_line_1g [label = "G"]; odd_line_1g -> odd_line_1b [label = "B"]; odd_line_1b -> odd_line_0r [label = "R && x!=0"]; odd_line_1b -> even_line_init [label = "R && x==0"]; }