mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-18 00:49:23 +02:00
When dragging an endpoint of an inverted measurement, we didn't consider that
inst->base and inst->u.meas.end are swapped, causing fped to crash in vec_at. Also introduced a universal swap() function. - util.h (swap): new swap function for arguments of any type - gui_meas.c (begin_drag_move_meas, draw_move_meas): swap the endpoints if moving an inverted measurement - coord.c (sort_coord): use swap() instead of swap_coord - coord.h, coord.c (swap_coord): removed - gui_util.c (save_pix_buf): use swap() instead of open-coding the swap - kicad.c (kicad_centric): use sort_coord instead of "manually" sorting the coordinates git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5968 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
parent
c9af8cd0fe
commit
7eb3ac5ba2
19
coord.c
19
coord.c
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* coord.c - Coordinate representation and basic operations
|
* coord.c - Coordinate representation and basic operations
|
||||||
*
|
*
|
||||||
* Written 2009 by Werner Almesberger
|
* Written 2009, 2010 by Werner Almesberger
|
||||||
* Copyright 2009 by Werner Almesberger
|
* Copyright 2009, 2010 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
#include "coord.h"
|
#include "coord.h"
|
||||||
|
|
||||||
|
|
||||||
@ -153,22 +154,12 @@ double theta(struct coord c, struct coord p)
|
|||||||
/* ----- sorting coordinates ----------------------------------------------- */
|
/* ----- sorting coordinates ----------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
void swap_coord(unit_type *a, unit_type *b)
|
|
||||||
{
|
|
||||||
unit_type tmp;
|
|
||||||
|
|
||||||
tmp = *a;
|
|
||||||
*a = *b;
|
|
||||||
*b = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void sort_coord(struct coord *min, struct coord *max)
|
void sort_coord(struct coord *min, struct coord *max)
|
||||||
{
|
{
|
||||||
if (min->x > max->x)
|
if (min->x > max->x)
|
||||||
swap_coord(&min->x, &max->x);
|
swap(min->x, max->x);
|
||||||
if (min->y > max->y)
|
if (min->y > max->y)
|
||||||
swap_coord(&min->y, &max->y);
|
swap(min->y, max->y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
coord.h
5
coord.h
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* coord.h - Coordinate representation and basic operations
|
* coord.h - Coordinate representation and basic operations
|
||||||
*
|
*
|
||||||
* Written 2009 by Werner Almesberger
|
* Written 2009, 2010 by Werner Almesberger
|
||||||
* Copyright 2009 by Werner Almesberger
|
* Copyright 2009, 2010 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -87,7 +87,6 @@ struct coord rotate_r(struct coord c, unit_type r, double angle);
|
|||||||
double theta_vec(struct coord v);
|
double theta_vec(struct coord v);
|
||||||
double theta(struct coord c, struct coord p);
|
double theta(struct coord c, struct coord p);
|
||||||
|
|
||||||
void swap_coord(unit_type *a, unit_type *b);
|
|
||||||
void sort_coord(struct coord *min, struct coord *max);
|
void sort_coord(struct coord *min, struct coord *max);
|
||||||
|
|
||||||
unit_type dist_point(struct coord a, struct coord b);
|
unit_type dist_point(struct coord a, struct coord b);
|
||||||
|
18
gui_meas.c
18
gui_meas.c
@ -189,7 +189,8 @@ static void meas_highlight_b(void)
|
|||||||
|
|
||||||
struct pix_buf *draw_move_meas(struct inst *inst, struct coord pos, int i)
|
struct pix_buf *draw_move_meas(struct inst *inst, struct coord pos, int i)
|
||||||
{
|
{
|
||||||
return draw_move_line_common(inst, inst->u.meas.end, pos, i);
|
return draw_move_line_common(inst, inst->u.meas.end, pos,
|
||||||
|
inst->obj->u.meas.inverted ? 1-i : i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -349,6 +350,7 @@ static struct inst *vec_at(const struct vec *vec, struct coord pos)
|
|||||||
void begin_drag_move_meas(struct inst *inst, int i)
|
void begin_drag_move_meas(struct inst *inst, int i)
|
||||||
{
|
{
|
||||||
const struct meas *meas = &inst->obj->u.meas;
|
const struct meas *meas = &inst->obj->u.meas;
|
||||||
|
struct coord a, b;
|
||||||
|
|
||||||
switch (meas->type) {
|
switch (meas->type) {
|
||||||
case mt_xy_next:
|
case mt_xy_next:
|
||||||
@ -367,14 +369,24 @@ void begin_drag_move_meas(struct inst *inst, int i)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
highlight = meas_highlight_b;
|
highlight = meas_highlight_b;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're setting up the same conditions as after picking the first
|
||||||
|
* point when making a new measurement. Thus, we set meas_inst to the
|
||||||
|
* vector to the endpoint we're not moving.
|
||||||
|
*/
|
||||||
|
a = inst->base;
|
||||||
|
b = inst->u.meas.end;
|
||||||
|
if (inst->obj->u.meas.inverted)
|
||||||
|
swap(a, b);
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
case 0:
|
||||||
mode = meas->type < 3 ? next_to_min : max_to_min;
|
mode = meas->type < 3 ? next_to_min : max_to_min;
|
||||||
meas_inst = vec_at(inst->obj->u.meas.high, inst->u.meas.end);
|
meas_inst = vec_at(inst->obj->u.meas.high, b);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
mode = min_to_next_or_max;
|
mode = min_to_next_or_max;
|
||||||
meas_inst = vec_at(inst->obj->base, inst->base);
|
meas_inst = vec_at(inst->obj->base, a);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
|
15
gui_util.c
15
gui_util.c
@ -65,19 +65,12 @@ struct pix_buf *save_pix_buf(GdkDrawable *da, int xa, int ya, int xb, int yb,
|
|||||||
int border)
|
int border)
|
||||||
{
|
{
|
||||||
struct pix_buf *buf;
|
struct pix_buf *buf;
|
||||||
int tmp;
|
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
if (xa > xb) {
|
if (xa > xb)
|
||||||
tmp = xa;
|
swap(xa, xb);
|
||||||
xa = xb;
|
if (ya > yb)
|
||||||
xb = tmp;
|
swap(ya, yb);
|
||||||
}
|
|
||||||
if (ya > yb) {
|
|
||||||
tmp = ya;
|
|
||||||
ya = yb;
|
|
||||||
yb = tmp;
|
|
||||||
}
|
|
||||||
buf = alloc_type(struct pix_buf);
|
buf = alloc_type(struct pix_buf);
|
||||||
buf->da = da;
|
buf->da = da;
|
||||||
buf->x = xa-border;
|
buf->x = xa-border;
|
||||||
|
12
kicad.c
12
kicad.c
@ -30,23 +30,13 @@ static void kicad_centric(struct coord a, struct coord b,
|
|||||||
struct coord *center, struct coord *size)
|
struct coord *center, struct coord *size)
|
||||||
{
|
{
|
||||||
struct coord min, max;
|
struct coord min, max;
|
||||||
unit_type tmp;
|
|
||||||
|
|
||||||
min.x = units_to_kicad(a.x);
|
min.x = units_to_kicad(a.x);
|
||||||
min.y = units_to_kicad(a.y);
|
min.y = units_to_kicad(a.y);
|
||||||
max.x = units_to_kicad(b.x);
|
max.x = units_to_kicad(b.x);
|
||||||
max.y = units_to_kicad(b.y);
|
max.y = units_to_kicad(b.y);
|
||||||
|
|
||||||
if (min.x > max.x) {
|
sort_coord(&min, &max);
|
||||||
tmp = min.x;
|
|
||||||
min.x = max.x;
|
|
||||||
max.x = tmp;
|
|
||||||
}
|
|
||||||
if (min.y > max.y) {
|
|
||||||
tmp = min.y;
|
|
||||||
min.y = max.y;
|
|
||||||
max.y = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
size->x = max.x-min.x;
|
size->x = max.x-min.x;
|
||||||
size->y = max.y-min.y;
|
size->y = max.y-min.y;
|
||||||
|
9
util.h
9
util.h
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* util.h - Common utility functions
|
* util.h - Common utility functions
|
||||||
*
|
*
|
||||||
* Written 2006, 2009 by Werner Almesberger
|
* Written 2006, 2009, 2010 by Werner Almesberger
|
||||||
* Copyright 2006, 2009 Werner Almesberger
|
* Copyright 2006, 2009, 2010 Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -51,6 +51,11 @@
|
|||||||
strnalloc_tmp[n] = 0; \
|
strnalloc_tmp[n] = 0; \
|
||||||
strnalloc_tmp; })
|
strnalloc_tmp; })
|
||||||
|
|
||||||
|
#define swap(a, b) \
|
||||||
|
({ typeof(a) swap_tmp = (a); \
|
||||||
|
(a) = (b); \
|
||||||
|
(b) = swap_tmp; })
|
||||||
|
|
||||||
|
|
||||||
char *stralloc_vprintf(const char *fmt, va_list ap);
|
char *stralloc_vprintf(const char *fmt, va_list ap);
|
||||||
char *stralloc_printf(const char *fmt, ...)
|
char *stralloc_printf(const char *fmt, ...)
|
||||||
|
Loading…
Reference in New Issue
Block a user