obj.c |
168 | 168 | } |
169 | 169 | |
170 | 170 | |
171 | | static int generate_vecs(struct frame *frame, struct coord base) |
| 171 | static int resolve_vec(const struct vec *vec, struct coord base_pos, |
| 172 | struct coord *res) |
| 173 | { |
| 174 | *res = vec ? vec->pos : base_pos; |
| 175 | return 1; |
| 176 | } |
| 177 | |
| 178 | |
| 179 | static int generate_vecs(struct frame *frame, struct coord base_pos) |
172 | 180 | { |
173 | 181 | struct coord vec_base; |
174 | 182 | struct vec *vec; |
... | ... | |
181 | 189 | y = eval_unit(vec->y, frame); |
182 | 190 | if (is_undef(y)) |
183 | 191 | goto error; |
184 | | vec_base = vec->base ? vec->base->pos : base; |
| 192 | if (!resolve_vec(vec->base, base_pos, &vec_base)) |
| 193 | goto error; |
185 | 194 | vec->pos = vec_base; |
186 | 195 | vec->pos.x += x.n; |
187 | 196 | vec->pos.y += y.n; |
... | ... | |
197 | 206 | } |
198 | 207 | |
199 | 208 | |
200 | | static int generate_objs(struct frame *frame, struct coord base, int active) |
| 209 | static int generate_objs(struct frame *frame, struct coord base_pos, |
| 210 | int active) |
201 | 211 | { |
202 | 212 | struct obj *obj; |
203 | 213 | char *name; |
204 | 214 | int ok; |
205 | 215 | struct num width, offset; |
| 216 | struct coord base, other, start, end; |
206 | 217 | |
207 | | for (obj = frame->objs; obj; obj = obj->next) |
| 218 | for (obj = frame->objs; obj; obj = obj->next) { |
| 219 | if (obj->type != ot_meas) |
| 220 | if (!resolve_vec(obj->base, base_pos, &base)) |
| 221 | goto error; |
208 | 222 | switch (obj->type) { |
209 | 223 | case ot_frame: |
210 | | if (!generate_frame(obj->u.frame.ref, |
211 | | obj->base ? obj->base->pos : base, frame, obj, |
| 224 | if (!generate_frame(obj->u.frame.ref, base, frame, obj, |
212 | 225 | active && obj->u.frame.ref->active_ref == obj)) |
213 | 226 | return 0; |
214 | 227 | break; |
215 | 228 | case ot_line: |
| 229 | if (!resolve_vec(obj->u.line.other, base_pos, &other)) |
| 230 | goto error; |
216 | 231 | width = eval_unit_default(obj->u.line.width, frame, |
217 | 232 | DEFAULT_SILK_WIDTH); |
218 | 233 | if (is_undef(width)) |
219 | 234 | goto error; |
220 | | if (!inst_line(obj, obj->base ? obj->base->pos : base, |
221 | | obj->u.line.other ? obj->u.line.other->pos : base, |
222 | | width.n)) |
| 235 | if (!inst_line(obj, base, other, width.n)) |
223 | 236 | goto error; |
224 | 237 | break; |
225 | 238 | case ot_rect: |
| 239 | if (!resolve_vec(obj->u.rect.other, base_pos, &other)) |
| 240 | goto error; |
226 | 241 | width = eval_unit_default(obj->u.rect.width, frame, |
227 | 242 | DEFAULT_SILK_WIDTH); |
228 | 243 | if (is_undef(width)) |
229 | 244 | goto error; |
230 | | if (!inst_rect(obj, obj->base ? obj->base->pos : base, |
231 | | obj->u.rect.other ? obj->u.rect.other->pos : base, |
232 | | width.n)) |
| 245 | if (!inst_rect(obj, base, other, width.n)) |
233 | 246 | goto error; |
234 | 247 | break; |
235 | 248 | case ot_pad: |
| 249 | if (!resolve_vec(obj->u.pad.other, base_pos, &other)) |
| 250 | goto error; |
236 | 251 | name = expand(obj->u.pad.name, frame); |
237 | 252 | if (!name) |
238 | 253 | goto error; |
239 | | ok = inst_pad(obj, name, |
240 | | obj->base ? obj->base->pos : base, |
241 | | obj->u.pad.other ? obj->u.pad.other->pos : base); |
| 254 | ok = inst_pad(obj, name, base, other); |
242 | 255 | free(name); |
243 | 256 | if (!ok) |
244 | 257 | goto error; |
245 | 258 | break; |
246 | 259 | case ot_hole: |
247 | | if (!inst_hole(obj, obj->base ? obj->base->pos : base, |
248 | | obj->u.hole.other ? obj->u.hole.other->pos : base)) |
| 260 | if (!resolve_vec(obj->u.hole.other, base_pos, &other)) |
| 261 | goto error; |
| 262 | if (!inst_hole(obj, base, other)) |
249 | 263 | goto error; |
250 | 264 | break; |
251 | 265 | case ot_arc: |
| 266 | if (!resolve_vec(obj->u.arc.start, base_pos, &start)) |
| 267 | goto error; |
| 268 | if (!resolve_vec(obj->u.arc.end, base_pos, &end)) |
| 269 | goto error; |
252 | 270 | width = eval_unit_default(obj->u.arc.width, frame, |
253 | 271 | DEFAULT_SILK_WIDTH); |
254 | 272 | if (is_undef(width)) |
255 | 273 | goto error; |
256 | | if (!inst_arc(obj, obj->base ? obj->base->pos : base, |
257 | | obj->u.arc.start ? obj->u.arc.start->pos : base, |
258 | | obj->u.arc.end ? obj->u.arc.end->pos : base, |
259 | | width.n)) |
| 274 | if (!inst_arc(obj, base, start, end, width.n)) |
260 | 275 | goto error; |
261 | 276 | break; |
262 | 277 | case ot_meas: |
... | ... | |
270 | 285 | default: |
271 | 286 | abort(); |
272 | 287 | } |
| 288 | } |
273 | 289 | return 1; |
274 | 290 | |
275 | 291 | error: |