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 = "flush;x=width-1"]; even_line_0 [label = "x--"]; even_line_1 [label = "flush;x--"]; } subgraph cluster2 { label = "odd scanline"; color = green; fontcolor = green; odd_line_init [label = "x=width-1"]; odd_line_0 [label = "x--"]; } // Skip header // P5\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 = "P && x==0"]; // Skip odd pixels in even scanline even_line_init -> even_line_0 [label = "P && x!=0"]; even_line_init -> odd_line_init [label = "P && x==0"]; even_line_0 -> even_line_1 [label = "P && x!=0"]; even_line_0 -> odd_line_init [label = "P && x==0"]; even_line_1 -> even_line_0 [label = "P && x!=0"]; even_line_1 -> odd_line_init [label = "P && x==0"]; // Skip all pixels in odd scanline odd_line_init -> odd_line_0 [label = "P && x!=0"]; odd_line_init -> even_line_init [label = "P && x==0"]; odd_line_0 -> odd_line_0 [label = "P && x!=0"]; odd_line_0 -> even_line_init [label = "P && x==0"]; }