------------------------------------------------------------------------
| 83 | |
| 84 | //------------------------------------------------------------------------ |
| 85 | unsigned vcgen_stroke::vertex(double* x, double* y) |
| 86 | { |
| 87 | unsigned cmd = path_cmd_line_to; |
| 88 | while(!is_stop(cmd)) |
| 89 | { |
| 90 | switch(m_status) |
| 91 | { |
| 92 | case initial: |
| 93 | rewind(0); |
| 94 | |
| 95 | case ready: |
| 96 | if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) |
| 97 | { |
| 98 | cmd = path_cmd_stop; |
| 99 | break; |
| 100 | } |
| 101 | m_status = m_closed ? outline1 : cap1; |
| 102 | cmd = path_cmd_move_to; |
| 103 | m_src_vertex = 0; |
| 104 | m_out_vertex = 0; |
| 105 | break; |
| 106 | |
| 107 | case cap1: |
| 108 | m_stroker.calc_cap(m_out_vertices, |
| 109 | m_src_vertices[0], |
| 110 | m_src_vertices[1], |
| 111 | m_src_vertices[0].dist); |
| 112 | m_src_vertex = 1; |
| 113 | m_prev_status = outline1; |
| 114 | m_status = out_vertices; |
| 115 | m_out_vertex = 0; |
| 116 | break; |
| 117 | |
| 118 | case cap2: |
| 119 | m_stroker.calc_cap(m_out_vertices, |
| 120 | m_src_vertices[m_src_vertices.size() - 1], |
| 121 | m_src_vertices[m_src_vertices.size() - 2], |
| 122 | m_src_vertices[m_src_vertices.size() - 2].dist); |
| 123 | m_prev_status = outline2; |
| 124 | m_status = out_vertices; |
| 125 | m_out_vertex = 0; |
| 126 | break; |
| 127 | |
| 128 | case outline1: |
| 129 | if(m_closed) |
| 130 | { |
| 131 | if(m_src_vertex >= m_src_vertices.size()) |
| 132 | { |
| 133 | m_prev_status = close_first; |
| 134 | m_status = end_poly1; |
| 135 | break; |
| 136 | } |
| 137 | } |
| 138 | else |
| 139 | { |
| 140 | if(m_src_vertex >= m_src_vertices.size() - 1) |
| 141 | { |
| 142 | m_status = cap2; |