20 for(
int r=0; r<rl->
nr; r++) {
29 if(ind>rl->
nr)
return;
32 free(rl->
roi[ind-1].
x);
33 free(rl->
roi[ind-1].
y);
37 for(
int j=ind; j<rl->
nr; j++)
38 memcpy(&rl->
roi[j-1], &rl->
roi[j],
sizeof(
ROI));
56 char imgfile[FILENAME_MAX], roiname[FILENAME_MAX];
57 float zoom, recon_zoom;
58 int matrix, type, status, pos_x, pos_y, w, h, t, roi, npts, x, y;
61 if((fp=fopen(fname,
"r")) == NULL) {
69 ch=fgetc(fp);
if(ch==EOF || ch!=
'*')
break;
72 if(fscanf(fp,
"%s ", imgfile)==EOF) {
73 strcpy(
roierrmsg,
"cannot read image filename");
74 fclose(fp);
return(3);
78 if(fscanf(fp,
"%f %f ", &zoom, &recon_zoom)==EOF) {
79 strcpy(
roierrmsg,
"cannot read zoom values");
80 fclose(fp);
return(4);}
81 if(recon_zoom==0.0) recon_zoom=1.0;
84 if(fscanf(fp,
"%d %d %d %d %d %d %d %d ", &matrix, &type, &status,
85 &pos_x, &pos_y, &w, &h, &t)==EOF) {
86 strcpy(
roierrmsg,
"cannot read ROI definitions");
87 fclose(fp);
return(5);
91 if(fscanf(fp,
"%d ", &roi)==EOF) {
92 strcpy(
roierrmsg,
"cannot read ROI number");
93 fclose(fp);
return(6);
95 for(i=j=0; j<3 && i<FILENAME_MAX-1; i++) {
96 roiname[i]=(char)getc(fp);
97 if(roiname[i]==
'/') j++;
else j=0;
99 j=i-3; roiname[j]=(char)0;
101 char buf[FILENAME_MAX]; strcpy(buf, roiname);
103 if(c==0) sprintf(roiname,
"ROI%d", roi);
108 (void)getc(fp); (void)getc(fp);
109 if(fscanf(fp,
"%d ", &npts)==EOF) {
110 strcpy(
roierrmsg,
"cannot read nr of ROI border points");
111 fclose(fp);
return(8);
115 if(rl->_allocNr==0){ rl->
roi=malloc(
sizeof(
ROI)); rl->_allocNr++;}
116 else if(rl->_allocNr<=rl->
nr){
122 fclose(fp); rl->
nr=0;
return(11);
147 if((rl->
roi[rl->
nr-1].
x=malloc((npts+1)*
sizeof(
int)))==NULL) {
148 strcpy(
roierrmsg,
"cannot read ROI border definition");
149 fclose(fp); rl->
nr--;
return(12);
151 if((rl->
roi[rl->
nr-1].
y=malloc((npts+1)*
sizeof(
int)))==NULL) {
152 strcpy(
roierrmsg,
"cannot read ROI border definition");
153 fclose(fp); rl->
nr--; free((
char*)rl->
roi[rl->
nr-1].
x);
return(13);
155 for(i=0; i<npts; i++)
156 if(fscanf(fp,
"%d %d", &x, &y) == EOF) {
157 strcpy(
roierrmsg,
"cannot read ROI border definition");
158 free((
char*)rl->
roi[rl->
nr-1].
x); free((
char*)rl->
roi[rl->
nr-1].
y);
159 fclose(fp); rl->
nr--;
return(9);
163 do {ch=getc(fp);}
while(ch!=EOF && ch!=
'\n');
165 if(rl->
roi[rl->
nr-1].
x[npts-1]!=0 || rl->
roi[rl->
nr-1].
y[npts-1]!=0) {
166 rl->
roi[rl->
nr-1].
x[npts]=0;
167 rl->
roi[rl->
nr-1].
y[npts]=0;
178 for(i=rl->
nr-n; i<rl->nr; i++) {
187 strcpy(
roierrmsg,
"cannot read ROI border definition");
188 rl->
nr-=n;
return(21);
203 int i, d, x, y, n, r, s;
206 if((roi->
x=malloc(
sizeof(
int)))==NULL)
return(-1);
207 if((roi->
y=malloc(
sizeof(
int)))==NULL) {free((
char*)roi->
x);
return(-1);}
208 roi->
x[0]=0; roi->
y[0]=r;
210 for(x=1, y=r, d=3-2*r, n=1; x<=y; x++) {
211 if(d<0) d=d+4*x+6;
else {d=d+4*(x-y)+10; y-=1;}
212 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
214 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
215 free((
char*)roi->
x); free((
char*)roi->
y);
return(-1);}
216 roi->
x[n]=x; roi->
y[n]=y;
220 for(i=n-1, s=i; i>0; i--) {
221 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
223 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
224 free((
char*)roi->
x); free((
char*)roi->
y);
return(-1);}
225 roi->
x[n]=roi->
y[--s]; roi->
y[n++]=roi->
x[s];
227 for(i=n-1, s=i; i>0; i--) {
228 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
230 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
231 free((
char*)roi->
x); free((
char*)roi->
y);
return(-1);}
232 roi->
x[n]=roi->
x[--s]; roi->
y[n++]=-roi->
y[s];
234 for(i=n-1, s=i; i>0; i--) {
235 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
237 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
238 free((
char*)roi->
x); free((
char*)roi->
y);
return(-1);}
239 roi->
x[n]=-roi->
x[--s]; roi->
y[n++]=roi->
y[s];
255 int i, ix, iy, oy, n, s, w, h;
258 if((roi->
x=malloc(
sizeof(
int)))==NULL)
return(-1);
259 if((roi->
y=malloc(
sizeof(
int)))==NULL) {free((
char*)roi->
x);
return(-1);}
260 roi->
x[0]=0; roi->
y[0]=h;
262 for(ix=1; ix<w; ix++) {
263 iy=(
jsqrt(h+h*h*(w-ix)*(w+ix)))/w;
if(oy-iy>1)
break;
264 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
266 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
267 free((
char*)roi->
x); free((
char*)roi->
y);
return -1;}
268 roi->
x[n]=ix; roi->
y[n++]=iy;
272 for(iy=oy-1; iy>=0; iy--) {
273 ix=(
jsqrt(w+w*w*(h-iy)*(h+iy)))/h;
274 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
276 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
277 free((
char*)roi->
x); free((
char*)roi->
y);
return -1;}
278 roi->
x[n]=ix; roi->
y[n++]=iy;
281 for(i=n-1, s=i; i>0; i--) {
282 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
284 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
285 free((
char*)roi->
x); free((
char*)roi->
y);
return -1;}
286 roi->
x[n]=roi->
x[--s]; roi->
y[n++]=-roi->
y[s];
288 for(i=n-1, s=i; i>0; i--) {
289 if((roi->
x=(
int*)realloc((
char*)roi->
x, (n+1)*
sizeof(
int)))==NULL)
291 if((roi->
y=(
int*)realloc((
char*)roi->
y, (n+1)*
sizeof(
int)))==NULL) {
292 free((
char*)roi->
x); free((
char*)roi->
y);
return -1;}
293 roi->
x[n]=-roi->
x[--s]; roi->
y[n++]=roi->
y[s];
321 if(verbose>0) {printf(
"roiFillGaps(.., %d, ..)\n", nr); fflush(stdout);}
324 if(nr<1 || x==NULL || y==NULL || ffx==NULL || ffy==NULL)
return(0);
327 if(verbose>1) {printf(
" allocate memory\n"); fflush(stdout);}
329 if((fx=malloc(nr*
sizeof(
int)))==NULL)
return -1;
330 if((fy=malloc(nr*
sizeof(
int)))==NULL) {free((
char*)fx);
return -1;}
333 if(verbose>1) {printf(
" process\n"); fflush(stdout);}
334 int nx, ny, x2=0, y2=0;
337 for(
int i=1, n=j=0; i<nr; i++) {
338 if(verbose>2) {printf(
" i=%d j=%d nr+n=%d \n", i, j, nr+n); fflush(stdout);}
345 fx[j]=x1; fy[j++]=y1;
346 if(abs(dx)<2 && abs(dy)<2)
continue;
347 if(abs(dx)>=abs(dy)) {
348 k=(float)dy/(
float)dx;
350 for(nx=x1+1; nx<x2; nx++) {
352 fx[j]=nx; fy[j++]=ny; n++;
353 if((fx=(
int*)realloc((
char*)fx, (nr+n)*
sizeof(
int)))==NULL) {
354 free((
char*)fy);
return -1;}
355 if((fy=(
int*)realloc((
char*)fy, (nr+n)*
sizeof(
int)))==NULL) {
356 free((
char*)fx);
return -1;}
359 for(nx=x1-1; nx>x2; nx--) {
361 fx[j]=nx; fy[j++]=ny; n++;
362 if((fx=(
int*)realloc((
char*)fx, (nr+n)*
sizeof(
int)))==NULL) {
363 free((
char*)fy);
return -1;}
364 if((fy=(
int*)realloc((
char*)fy, (nr+n)*
sizeof(
int)))==NULL) {
365 free((
char*)fx);
return -1;}
368 k=(float)dx/(
float)dy;
370 for(ny=y1+1; ny<y2; ny++) {
372 fx[j]=nx; fy[j++]=ny; n++;
373 if((fx=(
int*)realloc((
char*)fx, (nr+n)*
sizeof(
int)))==NULL) {
374 free((
char*)fy);
return -1;}
375 if((fy=(
int*)realloc((
char*)fy, (nr+n)*
sizeof(
int)))==NULL) {
376 free((
char*)fx);
return -1;}
379 for(ny=y1-1; ny>y2; ny--) {
381 fx[j]=nx; fy[j++]=ny; n++;
382 if((fx=(
int*)realloc((
char*)fx, (nr+n)*
sizeof(
int)))==NULL) {
383 free((
char*)fy);
return -1;}
384 if((fy=(
int*)realloc((
char*)fy, (nr+n)*
sizeof(
int)))==NULL) {
385 free((
char*)fx);
return -1;}
389 fx[j]=x2; fy[j++]=y2; n=j;
414 int i, j, n, *x, *y, pos_x, pos_y, *fx, *fy;
417 if(verbose>0) {printf(
"roiOnOff()\n"); fflush(stdout);}
420 if(roi==NULL || dimx<2 || dimy<2 || m==NULL) {
421 strcpy(
roierrmsg,
"invalid arguments for roiOnOff()");
427 if((x=malloc((roi->
point_nr)*
sizeof(
int)))==NULL)
return(2);
428 if((y=malloc((roi->
point_nr)*
sizeof(
int)))==NULL) {free((
char*)x);
return(2);}
432 x[i]=pos_x+roi->
x[i];
433 y[i]=pos_y+roi->
y[i];
437 if(verbose>1) {printf(
"fill gaps\n"); fflush(stdout);}
440 strcpy(
roierrmsg,
"cannot fill the gaps in ROI border");
441 free((
char*)x); free((
char*)y);
return(3);
445 if(verbose>1) {printf(
"prepare matrix\n"); fflush(stdout);}
446 for(i=0; i<dimy; i++)
for(j=0; j<dimx; j++) m[j][i]=(
char)0;
447 for(i=0; i<n; i++)
if(fx[i]>=0 && fx[i]<dimx && fy[i]>=0 && fy[i]<dimy)
448 m[fx[i]][fy[i]]=(char)1;
451 if(verbose>1) {printf(
"fill matrix\n"); fflush(stdout);}
452 for(i=0; i<dimy; i++)
if(m[0][i]==0) m[0][i]=2;
else break;
453 for(i=dimy-1; i>=0; i--)
if(m[0][i]==0) m[0][i]=2;
else break;
454 for(i=0; i<dimy; i++)
if(m[dimx-1][i]==0) m[dimx-1][i]=2;
else break;
455 for(i=dimy-1; i>=0; i--)
if(m[dimx-1][i]==0) m[dimx-1][i]=2;
else break;
456 for(i=0; i<dimx; i++)
if(m[i][0]==0) m[i][0]=2;
else break;
457 for(i=dimx-1; i>=0; i--)
if(m[i][0]==0) m[i][0]=2;
else break;
458 for(i=0; i<dimx; i++)
if(m[i][dimy-1]==0) m[i][dimy-1]=2;
else break;
459 for(i=dimx-1; i>=0; i--)
if(m[i][dimy-1]==0) m[i][dimy-1]=2;
else break;
460 for(i=0; i<dimy; i++)
for(j=0; j<dimx; j++) {
461 if(m[j][i]!=2)
continue;
462 if(i>0 && m[j][i-1]==0) {m[j][i-1]=2; j=-1; i-=2;
continue;}
463 if(j>0 && m[j-1][i]==0) {m[j-1][i]=2; j-=2;
continue;}
464 if(j+1<dimx) {
if(m[j+1][i]!=1) m[j+1][i]=2;}
465 if(i+1<dimy) {
if(m[j][i+1]!=1) m[j][i+1]=2;}
468 for(i=0; i<dimy; i++)
for(j=0; j<dimx; j++)
469 if(m[j][i]==0) m[j][i]=2;
else if(m[j][i]>1) m[j][i]=0;
473 if(verbose>1) {printf(
"clean-up\n"); fflush(stdout);}
474 free((
char*)x); free((
char*)y);
475 free((
char*)fx); free((
char*)fy);
491 printf(
"\non-off matrix:\n"); fflush(stdout);
492 if(m==NULL || dimx<1 || dimy<1) {printf(
"empty\n");
return;}
493 for(
int yi=0; yi<dimy; yi++) {
494 for(
int xi=0; xi<dimx; xi++) printf(
"%d", m[xi][yi]);
514 if(!fname[0] || rl==NULL || rl->
nr<1) {
515 strcpy(
roierrmsg,
"invalid arguments for roiSave()");
520 if((fp=fopen(fname,
"w"))==NULL) {
525 for(i=0; i<rl->
nr; i++) {
527 if(fprintf(fp,
"*%s %f %f %d %d %d %d %d %d %d %d %d %s///%d %d\n",
534 fclose(fp);
return(3);
539 fprintf(fp,
"%d %d ", rl->
roi[i].
x[j], rl->
roi[i].
y[j]);
566 if(!fname[0] || rl==NULL || rl->
nr<1) {
567 strcpy(
roierrmsg,
"invalid arguments for roiAppend()");
572 if((fp=fopen(fname,
"a"))==NULL) {
579 for(i=0; i<rl->
nr; i++) {
581 if(fprintf(fp,
"*%s %f %f %d %d %d %d %d %d %d %d %d %s///%d %d\n",
588 fclose(fp);
return(3);
593 fprintf(fp,
"%d %d ", rl->
roi[i].
x[j], rl->
roi[i].
y[j]);
599 if(fprintf(fp,
"*%s %f %f %d %d %d %d %d %d %d %d %d %s///%d %d\n",
606 fclose(fp);
return(3);
611 fprintf(fp,
"%d %d ", rl->
roi[i].
x[j], rl->
roi[i].
y[j]);
int roiComputeRect(ROI *roi)
void roiOnOffPrint(int dimx, int dimy, char **m)
int roiComputeElli(ROI *roi)
int roiRead(const char *fname, ROI_list *rl)
void roiDel(ROI_list *rl, int ind)
int roiComputeCirc(ROI *roi)
int roiAppend(char *fname, ROI_list *rl, int ind)
int roiSave(const char *fname, ROI_list *rl)
int roiFillGaps(int *x, int *y, int nr, int **ffx, int **ffy)
int roiOnOff(ROI *roi, int dimx, int dimy, char **m)
void strReplaceChar(char *str, char c1, char c2)
int strncpyCleanSpaces(char *s1, const char *s2, int maxlen)
Header file for libtpcroi.
char imgfile[FILENAME_MAX]