1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-10-01 09:14:44 +03:00

- replaced awkward FOR_GLOBAL_INSTS / FOR_PKG_INSTS sequence with single

FOR_ALL_INSTS
- several functions only walked the active package instances, so we couldn't 
  access the origin of the root frame



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5482 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2009-08-18 22:03:51 +00:00
parent f368014b3c
commit 4920bb96fa
3 changed files with 36 additions and 72 deletions

80
inst.c
View File

@ -158,7 +158,7 @@ int inst_select(struct coord pos)
enum inst_prio prio; enum inst_prio prio;
struct inst *inst; struct inst *inst;
int best_dist = 0; /* keep gcc happy */ int best_dist = 0; /* keep gcc happy */
int dist; int dist, i;
deselect_outside(); deselect_outside();
edit_nothing(); edit_nothing();
@ -170,7 +170,7 @@ int inst_select(struct coord pos)
FOR_INST_PRIOS_DOWN(prio) { FOR_INST_PRIOS_DOWN(prio) {
if (!show(prio)) if (!show(prio))
continue; continue;
for (inst = active_pkg->insts[prio]; inst; inst = inst->next) { FOR_ALL_INSTS(i, prio, inst) {
if (!inst->active || !inst->ops->distance) if (!inst->active || !inst->ops->distance)
continue; continue;
if (!inst_connected(inst)) if (!inst_connected(inst))
@ -190,7 +190,7 @@ int inst_select(struct coord pos)
/* give vectors a second chance */ /* give vectors a second chance */
for (inst = active_pkg->insts[ip_vec]; inst; inst = inst->next) { FOR_ALL_INSTS(i, ip_vec, inst) {
if (!inst->active) if (!inst->active)
continue; continue;
if (!inst_connected(inst)) if (!inst_connected(inst))
@ -215,10 +215,10 @@ struct inst *inst_find_point(struct coord pos)
{ {
struct inst *inst, *found; struct inst *inst, *found;
int best_dist = 0; /* keep gcc happy */ int best_dist = 0; /* keep gcc happy */
int dist; int dist, i;
found = NULL; found = NULL;
for (inst = active_pkg->insts[ip_frame]; inst; inst = inst->next) { FOR_ALL_INSTS(i, ip_frame, inst) {
if (!inst->u.frame.active) if (!inst->u.frame.active)
continue; continue;
dist = gui_dist_frame_eye(inst, pos, draw_ctx.scale); dist = gui_dist_frame_eye(inst, pos, draw_ctx.scale);
@ -230,7 +230,7 @@ struct inst *inst_find_point(struct coord pos)
if (found) if (found)
return found; return found;
for (inst = active_pkg->insts[ip_vec]; inst; inst = inst->next) { FOR_ALL_INSTS(i, ip_vec, inst) {
if (!inst->active || !inst->ops->distance) if (!inst->active || !inst->ops->distance)
continue; continue;
dist = inst->ops->distance(inst, pos, draw_ctx.scale); dist = inst->ops->distance(inst, pos, draw_ctx.scale);
@ -249,14 +249,13 @@ int inst_find_point_selected(struct coord pos, struct inst **res)
int n, best_i, i; int n, best_i, i;
struct inst *best = NULL; struct inst *best = NULL;
struct inst *inst; struct inst *inst;
int d_min, d; int d_min, d, j;
assert(selected_inst); assert(selected_inst);
n = inst_anchors(selected_inst, anchors); n = inst_anchors(selected_inst, anchors);
for (i = 0; i != n; i++) { for (i = 0; i != n; i++) {
if (*anchors[i]) { if (*anchors[i]) {
for (inst = active_pkg->insts[ip_vec]; inst; FOR_ALL_INSTS(j, ip_vec, inst) {
inst = inst->next) {
if (inst->vec != *anchors[i]) if (inst->vec != *anchors[i])
continue; continue;
d = gui_dist_vec(inst, pos, draw_ctx.scale); d = gui_dist_vec(inst, pos, draw_ctx.scale);
@ -267,8 +266,7 @@ int inst_find_point_selected(struct coord pos, struct inst **res)
} }
} }
} else { } else {
for (inst = active_pkg->insts[ip_frame]; inst; FOR_ALL_INSTS(j, ip_vec, inst) {
inst = inst->next) {
if (inst != selected_inst->outer) if (inst != selected_inst->outer)
continue; continue;
d = gui_dist_frame(inst, pos, draw_ctx.scale); d = gui_dist_frame(inst, pos, draw_ctx.scale);
@ -345,10 +343,11 @@ static void obj_edit(struct obj *obj);
void inst_select_vec(struct vec *vec) void inst_select_vec(struct vec *vec)
{ {
struct inst *inst; struct inst *inst;
int i;
if (vec->frame != active_frame) if (vec->frame != active_frame)
select_frame(vec->frame); select_frame(vec->frame);
for (inst = active_pkg->insts[ip_vec]; inst; inst = inst->next) FOR_ALL_INSTS(i, ip_vec, inst)
if (inst->vec == vec && inst->active) { if (inst->vec == vec && inst->active) {
inst_deselect(); inst_deselect();
inst_select_inst(inst); inst_select_inst(inst);
@ -362,17 +361,14 @@ void inst_select_obj(struct obj *obj)
{ {
enum inst_prio prio; enum inst_prio prio;
struct inst *inst; struct inst *inst;
int i;
if (obj->frame != active_frame) if (obj->frame != active_frame)
select_frame(obj->frame); select_frame(obj->frame);
FOR_INST_PRIOS_DOWN(prio) { FOR_INST_PRIOS_DOWN(prio)
FOR_GLOBAL_INSTS(prio, inst) FOR_ALL_INSTS(i, prio, inst)
if (inst->obj && inst->obj == obj && inst->active) if (inst->obj && inst->obj == obj && inst->active)
goto found; goto found;
FOR_PKG_INSTS(prio, inst)
if (inst->obj && inst->obj == obj && inst->active)
goto found;
}
obj_edit(obj); obj_edit(obj);
return; return;
@ -1037,35 +1033,22 @@ void inst_draw(void)
{ {
enum inst_prio prio; enum inst_prio prio;
struct inst *inst; struct inst *inst;
int i;
FOR_INST_PRIOS_UP(prio) { FOR_INST_PRIOS_UP(prio)
FOR_GLOBAL_INSTS(prio, inst) FOR_ALL_INSTS(i, prio, inst)
if (show(prio) && !inst->active && inst->ops->draw) if (show(prio) && !inst->active && inst->ops->draw)
inst->ops->draw(inst); inst->ops->draw(inst);
FOR_PKG_INSTS(prio, inst) FOR_INST_PRIOS_UP(prio)
if (show(prio) && !inst->active && inst->ops->draw) FOR_ALL_INSTS(i, prio, inst)
inst->ops->draw(inst);
}
FOR_INST_PRIOS_UP(prio) {
FOR_GLOBAL_INSTS(prio, inst)
if (show(prio) && prio != ip_frame && inst->active && if (show(prio) && prio != ip_frame && inst->active &&
inst != selected_inst && inst->ops->draw) inst != selected_inst && inst->ops->draw)
inst->ops->draw(inst); inst->ops->draw(inst);
FOR_PKG_INSTS(prio, inst) if (show_stuff)
if (show(prio) && prio != ip_frame && inst->active && FOR_ALL_INSTS(i, ip_frame, inst)
inst != selected_inst && inst->ops->draw)
inst->ops->draw(inst);
}
if (show_stuff) {
FOR_GLOBAL_INSTS(ip_frame, inst)
if (inst->active && inst != selected_inst && if (inst->active && inst != selected_inst &&
inst->ops->draw) inst->ops->draw)
inst->ops->draw(inst); inst->ops->draw(inst);
FOR_PKG_INSTS(ip_frame, inst)
if (inst->active && inst != selected_inst &&
inst->ops->draw)
inst->ops->draw(inst);
}
if (selected_inst && selected_inst->ops->draw) if (selected_inst && selected_inst->ops->draw)
selected_inst->ops->draw(selected_inst); selected_inst->ops->draw(selected_inst);
} }
@ -1074,11 +1057,9 @@ void inst_draw(void)
void inst_highlight_vecs(int (*pick)(struct inst *inst, void *user), void *user) void inst_highlight_vecs(int (*pick)(struct inst *inst, void *user), void *user)
{ {
struct inst *inst; struct inst *inst;
int i;
FOR_GLOBAL_INSTS(ip_vec, inst) FOR_ALL_INSTS(i, ip_vec, inst)
if (pick(inst, user))
gui_highlight_vec(inst);
FOR_PKG_INSTS(ip_vec, inst)
if (pick(inst, user)) if (pick(inst, user))
gui_highlight_vec(inst); gui_highlight_vec(inst);
} }
@ -1089,21 +1070,10 @@ struct inst *inst_find_vec(struct coord pos,
{ {
struct inst *inst, *found; struct inst *inst, *found;
int best_dist = 0; /* keep gcc happy */ int best_dist = 0; /* keep gcc happy */
int dist; int dist, i;
found = NULL; found = NULL;
FOR_GLOBAL_INSTS(ip_vec, inst) { FOR_ALL_INSTS(i, ip_vec, inst) {
if (!inst->ops->distance)
continue;
dist = inst->ops->distance(inst, pos, draw_ctx.scale);
if (dist < 0 || (found && best_dist <= dist))
continue;
if (!pick(inst, user))
continue;
found = inst;
best_dist = dist;
}
FOR_PKG_INSTS(ip_vec, inst) {
if (!inst->ops->distance) if (!inst->ops->distance)
continue; continue;
dist = inst->ops->distance(inst, pos, draw_ctx.scale); dist = inst->ops->distance(inst, pos, draw_ctx.scale);

13
inst.h
View File

@ -137,17 +137,16 @@ extern struct inst *curr_frame;
* allow other items shared by all packages be there as well. * allow other items shared by all packages be there as well.
*/ */
#define FOR_INST_PRIOS_UP(prio) \ #define FOR_INST_PRIOS_UP(prio) \
for (prio = 0; prio != ip_n; prio++) for (prio = 0; prio != ip_n; prio++)
#define FOR_INST_PRIOS_DOWN(prio) \ #define FOR_INST_PRIOS_DOWN(prio) \
for (prio = ip_n-1; prio != (enum inst_prio) -1; prio--) for (prio = ip_n-1; prio != (enum inst_prio) -1; prio--)
#define FOR_GLOBAL_INSTS(prio, inst) \ #define FOR_ALL_INSTS(i, prio, inst) \
for (inst = pkgs->insts[prio]; inst; inst = inst->next) for (i = 0; i != 2; i++) \
for (inst = (i ? active_pkg : pkgs)->insts[prio]; inst; \
#define FOR_PKG_INSTS(prio, inst) \ inst = inst->next)
for (inst = active_pkg->insts[prio]; inst; inst = inst->next)
void inst_select_outside(void *item, void (*deselect)(void *item)); void inst_select_outside(void *item, void (*deselect)(void *item));

View File

@ -278,6 +278,7 @@ int postscript(FILE *file)
{ {
enum inst_prio prio; enum inst_prio prio;
const struct inst *inst; const struct inst *inst;
int i;
fprintf(file, "%%!PS\n"); fprintf(file, "%%!PS\n");
@ -373,18 +374,12 @@ fprintf(file,
" dup false charpath stroke grestore\n" " dup false charpath stroke grestore\n"
" show } def\n"); " show } def\n");
FOR_INST_PRIOS_UP(prio) { FOR_INST_PRIOS_UP(prio)
FOR_GLOBAL_INSTS(prio, inst) FOR_ALL_INSTS(i, prio, inst)
ps_background(file, prio, inst); ps_background(file, prio, inst);
FOR_PKG_INSTS(prio, inst) FOR_INST_PRIOS_UP(prio)
ps_background(file, prio, inst); FOR_ALL_INSTS(i, prio, inst)
}
FOR_INST_PRIOS_UP(prio) {
FOR_GLOBAL_INSTS(prio, inst)
ps_foreground(file, prio, inst); ps_foreground(file, prio, inst);
FOR_PKG_INSTS(prio, inst)
ps_foreground(file, prio, inst);
}
fprintf(file, "showpage\n"); fprintf(file, "showpage\n");
fprintf(file, "%%%%EOF\n"); fprintf(file, "%%%%EOF\n");