| 137 |
|
return(0); |
| 138 |
|
} |
| 139 |
|
if (isexpos(s)) { |
| 140 |
< |
double d = exposval(s); |
| 141 |
< |
scalecolor(ip->cexp, d); |
| 140 |
> |
float f = exposval(s); |
| 141 |
> |
scalecolor(ip->cexp, f); |
| 142 |
|
return(0); |
| 143 |
|
} |
| 144 |
|
if (iscolcor(s)) { |
| 204 |
|
int i; |
| 205 |
|
#ifdef MAP_FILE |
| 206 |
|
long pos; /* map memory to file if possible */ |
| 207 |
< |
if (!rm->swapin && (pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) { |
| 207 |
> |
if (!rm->swapin && array_size(rm) >= 1L<<20 && |
| 208 |
> |
(pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) { |
| 209 |
|
rm->mapped = mmap(NULL, array_size(rm)+pos, PROT_READ|PROT_WRITE, |
| 210 |
|
MAP_PRIVATE, fileno(fp), 0); |
| 211 |
|
if (rm->mapped != MAP_FAILED) { |
| 410 |
|
static int |
| 411 |
|
rmx_write_double(const RMATRIX *rm, FILE *fp) |
| 412 |
|
{ |
| 413 |
< |
int i, j; |
| 413 |
> |
int i; |
| 414 |
|
|
| 415 |
|
for (i = 0; i < rm->nrows; i++) |
| 416 |
< |
for (j = 0; j < rm->ncols; j++) |
| 417 |
< |
if (putbinary(&rmx_lval(rm,i,j,0), sizeof(double), rm->ncomp, fp) != rm->ncomp) |
| 416 |
> |
if (putbinary(&rmx_lval(rm,i,0,0), sizeof(double)*rm->ncomp, |
| 417 |
> |
rm->ncols, fp) != rm->ncols) |
| 418 |
|
return(0); |
| 419 |
|
return(1); |
| 420 |
|
} |
| 462 |
|
int |
| 463 |
|
rmx_write(const RMATRIX *rm, int dtype, FILE *fp) |
| 464 |
|
{ |
| 464 |
– |
RMATRIX *mydm = NULL; |
| 465 |
|
int ok = 1; |
| 466 |
|
|
| 467 |
< |
if (!rm | !fp) |
| 467 |
> |
if (!rm | !fp || !rm->mtx) |
| 468 |
|
return(0); |
| 469 |
|
#ifdef getc_unlocked |
| 470 |
|
flockfile(fp); |
| 484 |
|
fprintf(fp, "NCOLS=%d\n", rm->ncols); |
| 485 |
|
fprintf(fp, "NCOMP=%d\n", rm->ncomp); |
| 486 |
|
} else if (rm->ncomp != 3) { /* wrong # components? */ |
| 487 |
< |
double cmtx[3]; |
| 487 |
> |
CMATRIX *cm; /* convert & write */ |
| 488 |
|
if (rm->ncomp != 1) /* only convert grayscale */ |
| 489 |
|
return(0); |
| 490 |
< |
cmtx[0] = cmtx[1] = cmtx[2] = 1; |
| 491 |
< |
mydm = rmx_transform(rm, 3, cmtx); |
| 492 |
< |
if (!mydm) |
| 490 |
> |
if (!(cm = cm_from_rmatrix(rm))) |
| 491 |
|
return(0); |
| 492 |
< |
rm = mydm; |
| 492 |
> |
fputformat(cm_fmt_id[dtype], fp); |
| 493 |
> |
fputc('\n', fp); |
| 494 |
> |
ok = cm_write(cm, dtype, fp); |
| 495 |
> |
cm_free(cm); |
| 496 |
> |
return(ok); |
| 497 |
|
} |
| 498 |
|
if ((dtype == DTfloat) | (dtype == DTdouble)) |
| 499 |
|
fputendian(fp); /* important to record */ |
| 521 |
|
#ifdef getc_unlocked |
| 522 |
|
funlockfile(fp); |
| 523 |
|
#endif |
| 522 |
– |
if (mydm) |
| 523 |
– |
rmx_free(mydm); |
| 524 |
|
return(ok); |
| 525 |
|
} |
| 526 |
|
|
| 533 |
|
|
| 534 |
|
if (!rid) |
| 535 |
|
return(NULL); |
| 536 |
< |
memset(rid->mtx, 0, sizeof(rid->mtx[0])*n*dim*dim); |
| 536 |
> |
memset(rid->mtx, 0, array_size(rid)); |
| 537 |
|
for (i = dim; i--; ) |
| 538 |
|
for (k = n; k--; ) |
| 539 |
|
rmx_lval(rid,i,i,k) = 1; |
| 553 |
|
return(NULL); |
| 554 |
|
rmx_addinfo(dnew, rm->info); |
| 555 |
|
dnew->dtype = rm->dtype; |
| 556 |
< |
memcpy(dnew->mtx, rm->mtx, |
| 557 |
< |
sizeof(rm->mtx[0])*rm->ncomp*rm->nrows*rm->ncols); |
| 556 |
> |
memcpy(dnew->mtx, rm->mtx, array_size(dnew)); |
| 557 |
|
return(dnew); |
| 558 |
|
} |
| 559 |
|
|
| 786 |
|
int i, j; |
| 787 |
|
CMATRIX *cnew; |
| 788 |
|
|
| 789 |
< |
if (!rm || rm->ncomp != 3) |
| 789 |
> |
if (!rm || !rm->mtx | ((rm->ncomp != 3) & (rm->ncomp != 1))) |
| 790 |
|
return(NULL); |
| 791 |
|
cnew = cm_alloc(rm->nrows, rm->ncols); |
| 792 |
|
if (!cnew) |
| 794 |
|
for (i = cnew->nrows; i--; ) |
| 795 |
|
for (j = cnew->ncols; j--; ) { |
| 796 |
|
COLORV *cv = cm_lval(cnew,i,j); |
| 797 |
< |
cv[0] = (COLORV)rmx_lval(rm,i,j,0); |
| 798 |
< |
cv[1] = (COLORV)rmx_lval(rm,i,j,1); |
| 799 |
< |
cv[2] = (COLORV)rmx_lval(rm,i,j,2); |
| 797 |
> |
if (rm->ncomp == 1) |
| 798 |
> |
cv[0] = cv[1] = cv[2] = (COLORV)rmx_lval(rm,i,j,0); |
| 799 |
> |
else { |
| 800 |
> |
cv[0] = (COLORV)rmx_lval(rm,i,j,0); |
| 801 |
> |
cv[1] = (COLORV)rmx_lval(rm,i,j,1); |
| 802 |
> |
cv[2] = (COLORV)rmx_lval(rm,i,j,2); |
| 803 |
> |
} |
| 804 |
|
} |
| 805 |
|
return(cnew); |
| 806 |
|
} |