Generate correctly instance coordinates in GDS driver.

* Bug: In gds_drive.c, the XY GDSII record for storing the instances
    coordinates was using two longs (8 bytes each) instead of int (4 bytes).
    Now use a coord_t to force them to be 32 bits integers.
* Bug: In gds_parse.c, symmetric bug to the above. Read 32 bits integers
    for XY of instances instead of 64 bits integers.
This commit is contained in:
Jean-Paul Chaput 2016-03-04 14:47:35 +01:00
parent 10a7b7e755
commit 131bc65f4b
2 changed files with 18 additions and 14 deletions

View File

@ -490,18 +490,22 @@ FILE *fp;
} }
entete(XY, sizeof(coord_t)); entete(XY, sizeof(coord_t));
if (islittle()) { coord_t xy;
long X = swapl(inst->X); xy.X = inst->X;
long Y = swapl(inst->Y); xy.Y = inst->Y;
numb = fwrite((char *)&X, sizeof(long), 1, fp); if (islittle()) {
xy.X = swapi(xy.X);
xy.Y = swapi(xy.Y);
numb = fwrite((char *)&xy.X, sizeof(int32_t), 1, fp);
controle(1); controle(1);
numb = fwrite((char *)&Y, sizeof(long), 1, fp); numb = fwrite((char *)&xy.Y, sizeof(int32_t), 1, fp);
controle(1); controle(1);
} else { } else {
numb = fwrite((char *)&inst->X, sizeof(long), 1, fp); numb = fwrite((char *)&xy.X, sizeof(int32_t), 1, fp);
controle(1); controle(1);
numb = fwrite((char *)&inst->Y, sizeof(long), 1, fp); numb = fwrite((char *)&xy.Y, sizeof(int32_t), 1, fp);
controle(1); controle(1);
} }

View File

@ -832,7 +832,7 @@ char gds_real[sizeof(mag_type)];
short ref_x_axis, abs_mag, abs_ang; short ref_x_axis, abs_mag, abs_ang;
ushort strans; ushort strans;
double mag, angle; double mag, angle;
long x, y; int32_t x, y;
char sym; char sym;
char poubelle[TRASHSIZE]; char poubelle[TRASHSIZE];
int FLAG = 0; int FLAG = 0;
@ -846,14 +846,14 @@ int FLAG = 0;
} }
switch (infobuf.gdscode) { switch (infobuf.gdscode) {
case XY : case XY :
lecture1(&x, sizeof(long)); lecture1(&x, sizeof(int32_t));
if (islittle()) if (islittle())
x = swapl(x); x = swapl(x);
x = (long)(pv_scale * (double)x); x = (int32_t)(pv_scale * (double)x);
lecture1(&y, sizeof(long)); lecture1(&y, sizeof(int32_t));
if (islittle()) if (islittle())
y = swapl(y); y = swapl(y);
y = (long)(pv_scale * (double)y); y = (int32_t)(pv_scale * (double)y);
break; break;
case STRANS : case STRANS :
lecture1(&strans, sizeof(ushort)); lecture1(&strans, sizeof(ushort));
@ -988,8 +988,8 @@ FILE *fp;
coord_tab[0].X = swapl(coord_tab[0].X); coord_tab[0].X = swapl(coord_tab[0].X);
coord_tab[0].Y = swapl(coord_tab[0].Y); coord_tab[0].Y = swapl(coord_tab[0].Y);
} }
coord_tab[0].X = (long)(pv_scale * (double)coord_tab[0].X); coord_tab[0].X = (int32_t)(pv_scale * (double)coord_tab[0].X);
coord_tab[0].Y = (long)(pv_scale * (double)coord_tab[0].Y); coord_tab[0].Y = (int32_t)(pv_scale * (double)coord_tab[0].Y);
XYFLAG = 1; XYFLAG = 1;
break; break;
case TEXTTYPE : case TEXTTYPE :