Date:2011-10-25 21:13:11 (12 years 5 months ago)
Author:Werner Almesberger
Commit:c8f5d2917894a339cdcda64b01ceafff95c02467
Message:obj.c: move vector to coord translation to separate function (for future extension)

Files: obj.c (4 diffs)

Change Details

obj.c
168168}
169169
170170
171static int generate_vecs(struct frame *frame, struct coord base)
171static 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
179static int generate_vecs(struct frame *frame, struct coord base_pos)
172180{
173181    struct coord vec_base;
174182    struct vec *vec;
...... 
181189        y = eval_unit(vec->y, frame);
182190        if (is_undef(y))
183191            goto error;
184        vec_base = vec->base ? vec->base->pos : base;
192        if (!resolve_vec(vec->base, base_pos, &vec_base))
193            goto error;
185194        vec->pos = vec_base;
186195        vec->pos.x += x.n;
187196        vec->pos.y += y.n;
...... 
197206}
198207
199208
200static int generate_objs(struct frame *frame, struct coord base, int active)
209static int generate_objs(struct frame *frame, struct coord base_pos,
210    int active)
201211{
202212    struct obj *obj;
203213    char *name;
204214    int ok;
205215    struct num width, offset;
216    struct coord base, other, start, end;
206217
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;
208222        switch (obj->type) {
209223        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,
212225                active && obj->u.frame.ref->active_ref == obj))
213226                return 0;
214227            break;
215228        case ot_line:
229            if (!resolve_vec(obj->u.line.other, base_pos, &other))
230                goto error;
216231            width = eval_unit_default(obj->u.line.width, frame,
217232                DEFAULT_SILK_WIDTH);
218233            if (is_undef(width))
219234                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))
223236                goto error;
224237            break;
225238        case ot_rect:
239            if (!resolve_vec(obj->u.rect.other, base_pos, &other))
240                goto error;
226241            width = eval_unit_default(obj->u.rect.width, frame,
227242                DEFAULT_SILK_WIDTH);
228243            if (is_undef(width))
229244                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))
233246                goto error;
234247            break;
235248        case ot_pad:
249            if (!resolve_vec(obj->u.pad.other, base_pos, &other))
250                goto error;
236251            name = expand(obj->u.pad.name, frame);
237252            if (!name)
238253                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);
242255            free(name);
243256            if (!ok)
244257                goto error;
245258            break;
246259        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))
249263                goto error;
250264            break;
251265        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;
252270            width = eval_unit_default(obj->u.arc.width, frame,
253271                DEFAULT_SILK_WIDTH);
254272            if (is_undef(width))
255273                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))
260275                goto error;
261276            break;
262277        case ot_meas:
...... 
270285        default:
271286            abort();
272287        }
288    }
273289    return 1;
274290
275291error:

Archive Download the corresponding diff file

Branches:
master



interactive