| 28 |
|
return(NULL); |
| 29 |
|
dnew = (RMATRIX *)malloc(sizeof(RMATRIX)-sizeof(dnew->mtx) + |
| 30 |
|
sizeof(dnew->mtx[0])*(n*nr*nc)); |
| 31 |
< |
if (dnew == NULL) |
| 31 |
> |
if (!dnew) |
| 32 |
|
return(NULL); |
| 33 |
|
dnew->nrows = nr; dnew->ncols = nc; dnew->ncomp = n; |
| 34 |
|
dnew->dtype = DTdouble; |
| 63 |
|
int |
| 64 |
|
rmx_addinfo(RMATRIX *rm, const char *info) |
| 65 |
|
{ |
| 66 |
< |
if (!info || !*info) |
| 66 |
> |
if (!rm || !info || !*info) |
| 67 |
|
return(0); |
| 68 |
|
if (!rm->info) { |
| 69 |
|
rm->info = (char *)malloc(strlen(info)+1); |
| 81 |
|
get_dminfo(char *s, void *p) |
| 82 |
|
{ |
| 83 |
|
RMATRIX *ip = (RMATRIX *)p; |
| 84 |
< |
char fmt[64]; |
| 84 |
> |
char fmt[MAXFMTLEN]; |
| 85 |
|
int i; |
| 86 |
|
|
| 87 |
|
if (headidval(fmt, s)) |
| 161 |
|
COLOR *scan = (COLOR *)malloc(sizeof(COLOR)*rm->ncols); |
| 162 |
|
int i, j; |
| 163 |
|
|
| 164 |
< |
if (scan == NULL) |
| 164 |
> |
if (!scan) |
| 165 |
|
return(0); |
| 166 |
|
for (i = 0; i < rm->nrows; i++) { |
| 167 |
|
if (freadscan(scan, rm->ncols, fp) < 0) { |
| 186 |
|
RMATRIX dinfo; |
| 187 |
|
RMATRIX *dnew; |
| 188 |
|
|
| 189 |
< |
if (inspec == NULL) { /* reading from stdin? */ |
| 189 |
> |
if (!inspec) { /* reading from stdin? */ |
| 190 |
|
inspec = "<stdin>"; |
| 191 |
|
SET_FILE_BINARY(stdin); |
| 192 |
|
} else if (inspec[0] == '!') { |
| 193 |
< |
if ((fp = popen(inspec+1, "r")) == NULL) |
| 193 |
> |
if (!(fp = popen(inspec+1, "r"))) |
| 194 |
|
return(NULL); |
| 195 |
|
SET_FILE_BINARY(stdin); |
| 196 |
|
} else { |
| 201 |
|
--sp; |
| 202 |
|
if (!strcasecmp(sp, "XML")) { /* assume it's a BSDF */ |
| 203 |
|
CMATRIX *cm = cm_loadBTDF((char *)inspec); |
| 204 |
< |
if (cm == NULL) |
| 204 |
> |
if (!cm) |
| 205 |
|
return(NULL); |
| 206 |
|
dnew = rmx_from_cmatrix(cm); |
| 207 |
|
cm_free(cm); |
| 209 |
|
return(dnew); |
| 210 |
|
} |
| 211 |
|
/* else open it ourselves */ |
| 212 |
< |
if ((fp = fopen(inspec, "rb")) == NULL) |
| 212 |
> |
if (!(fp = fopen(inspec, "rb"))) |
| 213 |
|
return(NULL); |
| 214 |
|
} |
| 215 |
|
#ifdef getc_unlocked |
| 236 |
|
} |
| 237 |
|
} |
| 238 |
|
dnew = rmx_alloc(dinfo.nrows, dinfo.ncols, dinfo.ncomp); |
| 239 |
< |
if (dnew == NULL) { |
| 239 |
> |
if (!dnew) { |
| 240 |
|
fclose(fp); |
| 241 |
|
return(NULL); |
| 242 |
|
} |
| 290 |
|
static int |
| 291 |
|
rmx_write_ascii(const RMATRIX *rm, FILE *fp) |
| 292 |
|
{ |
| 293 |
+ |
const char *fmt = (rm->dtype == DTfloat) ? " %.7e" : |
| 294 |
+ |
(rm->dtype == DTrgbe) | (rm->dtype == DTxyze) ? " %.3e" : |
| 295 |
+ |
" %.15e" ; |
| 296 |
|
int i, j, k; |
| 297 |
|
|
| 298 |
|
for (i = 0; i < rm->nrows; i++) { |
| 299 |
|
for (j = 0; j < rm->ncols; j++) { |
| 300 |
|
for (k = 0; k < rm->ncomp; k++) |
| 301 |
< |
fprintf(fp, " %.15e", rmx_lval(rm,i,j,k)); |
| 301 |
> |
fprintf(fp, fmt, rmx_lval(rm,i,j,k)); |
| 302 |
|
fputc('\t', fp); |
| 303 |
|
} |
| 304 |
|
fputc('\n', fp); |
| 341 |
|
static int |
| 342 |
|
rmx_write_rgbe(const RMATRIX *rm, FILE *fp) |
| 343 |
|
{ |
| 344 |
< |
COLOR *scan = (COLOR *)malloc(sizeof(COLOR)*rm->ncols); |
| 344 |
> |
COLR *scan = (COLR *)malloc(sizeof(COLR)*rm->ncols); |
| 345 |
|
int i, j; |
| 346 |
|
|
| 347 |
< |
if (scan == NULL) |
| 347 |
> |
if (!scan) |
| 348 |
|
return(0); |
| 349 |
|
for (i = 0; i < rm->nrows; i++) { |
| 350 |
|
for (j = rm->ncols; j--; ) |
| 351 |
< |
setcolor(scan[j], rmx_lval(rm,i,j,0), |
| 351 |
> |
setcolr(scan[j], rmx_lval(rm,i,j,0), |
| 352 |
|
rmx_lval(rm,i,j,1), |
| 353 |
|
rmx_lval(rm,i,j,2) ); |
| 354 |
< |
if (fwritescan(scan, rm->ncols, fp) < 0) { |
| 354 |
> |
if (fwritecolrs(scan, rm->ncols, fp) < 0) { |
| 355 |
|
free(scan); |
| 356 |
|
return(0); |
| 357 |
|
} |
| 367 |
|
RMATRIX *mydm = NULL; |
| 368 |
|
int ok = 1; |
| 369 |
|
|
| 370 |
< |
if ((rm == NULL) | (fp == NULL)) |
| 370 |
> |
if (!rm | !fp) |
| 371 |
|
return(0); |
| 372 |
|
#ifdef getc_unlocked |
| 373 |
|
flockfile(fp); |
| 391 |
|
return(0); |
| 392 |
|
cmtx[0] = cmtx[1] = cmtx[2] = 1; |
| 393 |
|
mydm = rmx_transform(rm, 3, cmtx); |
| 394 |
< |
if (mydm == NULL) |
| 394 |
> |
if (!mydm) |
| 395 |
|
return(0); |
| 396 |
|
rm = mydm; |
| 397 |
|
} |
| 419 |
|
#ifdef getc_unlocked |
| 420 |
|
funlockfile(fp); |
| 421 |
|
#endif |
| 422 |
< |
rmx_free(mydm); |
| 422 |
> |
if (mydm) |
| 423 |
> |
rmx_free(mydm); |
| 424 |
|
return(ok); |
| 425 |
|
} |
| 426 |
|
|
| 431 |
|
RMATRIX *rid = rmx_alloc(dim, dim, n); |
| 432 |
|
int i, k; |
| 433 |
|
|
| 434 |
< |
if (rid == NULL) |
| 434 |
> |
if (!rid) |
| 435 |
|
return(NULL); |
| 436 |
|
memset(rid->mtx, 0, sizeof(rid->mtx[0])*n*dim*dim); |
| 437 |
|
for (i = dim; i--; ) |
| 446 |
|
{ |
| 447 |
|
RMATRIX *dnew; |
| 448 |
|
|
| 449 |
< |
if (rm == NULL) |
| 449 |
> |
if (!rm) |
| 450 |
|
return(NULL); |
| 451 |
|
dnew = rmx_alloc(rm->nrows, rm->ncols, rm->ncomp); |
| 452 |
< |
if (dnew == NULL) |
| 452 |
> |
if (!dnew) |
| 453 |
|
return(NULL); |
| 454 |
|
rmx_addinfo(dnew, rm->info); |
| 455 |
|
dnew->dtype = rm->dtype; |
| 465 |
|
RMATRIX *dnew; |
| 466 |
|
int i, j, k; |
| 467 |
|
|
| 468 |
< |
if (rm == NULL) |
| 468 |
> |
if (!rm) |
| 469 |
|
return(0); |
| 470 |
+ |
if ((rm->nrows == 1) | (rm->ncols == 1)) { |
| 471 |
+ |
dnew = rmx_copy(rm); |
| 472 |
+ |
if (!dnew) |
| 473 |
+ |
return(NULL); |
| 474 |
+ |
dnew->nrows = rm->ncols; |
| 475 |
+ |
dnew->ncols = rm->nrows; |
| 476 |
+ |
return(dnew); |
| 477 |
+ |
} |
| 478 |
|
dnew = rmx_alloc(rm->ncols, rm->nrows, rm->ncomp); |
| 479 |
< |
if (dnew == NULL) |
| 479 |
> |
if (!dnew) |
| 480 |
|
return(NULL); |
| 481 |
|
if (rm->info) { |
| 482 |
|
rmx_addinfo(dnew, rm->info); |
| 497 |
|
RMATRIX *mres; |
| 498 |
|
int i, j, k, h; |
| 499 |
|
|
| 500 |
< |
if ((m1 == NULL) | (m2 == NULL) || |
| 489 |
< |
(m1->ncomp != m2->ncomp) | (m1->ncols != m2->nrows)) |
| 500 |
> |
if (!m1 | !m2 || (m1->ncomp != m2->ncomp) | (m1->ncols != m2->nrows)) |
| 501 |
|
return(NULL); |
| 502 |
|
mres = rmx_alloc(m1->nrows, m2->ncols, m1->ncomp); |
| 503 |
< |
if (mres == NULL) |
| 503 |
> |
if (!mres) |
| 504 |
|
return(NULL); |
| 505 |
|
i = rmx_newtype(m1->dtype, m2->dtype); |
| 506 |
|
if (i) |
| 525 |
|
int zeroDivides = 0; |
| 526 |
|
int i, j, k; |
| 527 |
|
|
| 528 |
< |
if ((m1 == NULL) | (m2 == NULL) || |
| 518 |
< |
(m1->ncols != m2->ncols) | (m1->nrows != m2->nrows)) |
| 528 |
> |
if (!m1 | !m2 || (m1->ncols != m2->ncols) | (m1->nrows != m2->nrows)) |
| 529 |
|
return(0); |
| 530 |
|
if ((m2->ncomp > 1) & (m2->ncomp != m1->ncomp)) |
| 531 |
|
return(0); |
| 568 |
|
rmx_lval(m1,i,j,k) *= rmx_lval(m2,i,j,k); |
| 569 |
|
} |
| 570 |
|
if (zeroDivides) { |
| 571 |
< |
fputs("Divide by zero in rmx_elemult()\n", stderr); |
| 571 |
> |
rmx_addinfo(m1, "WARNING: zero divide(s) corrupted results\n"); |
| 572 |
|
errno = ERANGE; |
| 573 |
|
} |
| 574 |
|
return(1); |
| 581 |
|
double *mysf = NULL; |
| 582 |
|
int i, j, k; |
| 583 |
|
|
| 584 |
< |
if ((msum == NULL) | (madd == NULL) || |
| 584 |
> |
if (!msum | !madd || |
| 585 |
|
(msum->nrows != madd->nrows) | |
| 586 |
|
(msum->ncols != madd->ncols) | |
| 587 |
|
(msum->ncomp != madd->ncomp)) |
| 588 |
|
return(0); |
| 589 |
< |
if (sf == NULL) { |
| 589 |
> |
if (!sf) { |
| 590 |
|
mysf = (double *)malloc(sizeof(double)*msum->ncomp); |
| 591 |
< |
if (mysf == NULL) |
| 591 |
> |
if (!mysf) |
| 592 |
|
return(0); |
| 593 |
|
for (k = msum->ncomp; k--; ) |
| 594 |
|
mysf[k] = 1; |
| 603 |
|
for (j = msum->ncols; j--; ) |
| 604 |
|
for (k = msum->ncomp; k--; ) |
| 605 |
|
rmx_lval(msum,i,j,k) += sf[k] * rmx_lval(madd,i,j,k); |
| 606 |
< |
|
| 607 |
< |
free(mysf); |
| 606 |
> |
if (mysf) |
| 607 |
> |
free(mysf); |
| 608 |
|
return(1); |
| 609 |
|
} |
| 610 |
|
|
| 614 |
|
{ |
| 615 |
|
int i, j, k; |
| 616 |
|
|
| 617 |
< |
if ((rm == NULL) | (sf == NULL)) |
| 617 |
> |
if (!rm | !sf) |
| 618 |
|
return(0); |
| 619 |
|
for (i = rm->nrows; i--; ) |
| 620 |
|
for (j = rm->ncols; j--; ) |
| 621 |
|
for (k = rm->ncomp; k--; ) |
| 622 |
|
rmx_lval(rm,i,j,k) *= sf[k]; |
| 623 |
|
|
| 624 |
+ |
if (rm->info) |
| 625 |
+ |
rmx_addinfo(rm, "Applied scalar\n"); |
| 626 |
|
return(1); |
| 627 |
|
} |
| 628 |
|
|
| 633 |
|
int i, j, ks, kd; |
| 634 |
|
RMATRIX *dnew; |
| 635 |
|
|
| 636 |
< |
if ((msrc == NULL) | (n <= 0) | (cmat == NULL)) |
| 636 |
> |
if (!msrc | (n <= 0) | !cmat) |
| 637 |
|
return(NULL); |
| 638 |
|
dnew = rmx_alloc(msrc->nrows, msrc->ncols, n); |
| 639 |
< |
if (dnew == NULL) |
| 639 |
> |
if (!dnew) |
| 640 |
|
return(NULL); |
| 641 |
+ |
if (msrc->info) { |
| 642 |
+ |
char buf[128]; |
| 643 |
+ |
sprintf(buf, "Applied %dx%d matrix transform\n", |
| 644 |
+ |
dnew->ncomp, msrc->ncomp); |
| 645 |
+ |
rmx_addinfo(dnew, msrc->info); |
| 646 |
+ |
rmx_addinfo(dnew, buf); |
| 647 |
+ |
} |
| 648 |
|
dnew->dtype = msrc->dtype; |
| 649 |
|
for (i = dnew->nrows; i--; ) |
| 650 |
|
for (j = dnew->ncols; j--; ) |
| 664 |
|
int i, j; |
| 665 |
|
RMATRIX *dnew; |
| 666 |
|
|
| 667 |
< |
if (cm == NULL) |
| 667 |
> |
if (!cm) |
| 668 |
|
return(NULL); |
| 669 |
|
dnew = rmx_alloc(cm->nrows, cm->ncols, 3); |
| 670 |
< |
if (dnew == NULL) |
| 670 |
> |
if (!dnew) |
| 671 |
|
return(NULL); |
| 672 |
|
dnew->dtype = DTfloat; |
| 673 |
|
for (i = dnew->nrows; i--; ) |
| 687 |
|
int i, j; |
| 688 |
|
CMATRIX *cnew; |
| 689 |
|
|
| 690 |
< |
if (rm == NULL || rm->ncomp != 3) |
| 690 |
> |
if (!rm || rm->ncomp != 3) |
| 691 |
|
return(NULL); |
| 692 |
|
cnew = cm_alloc(rm->nrows, rm->ncols); |
| 693 |
< |
if (cnew == NULL) |
| 693 |
> |
if (!cnew) |
| 694 |
|
return(NULL); |
| 695 |
|
for (i = cnew->nrows; i--; ) |
| 696 |
|
for (j = cnew->ncols; j--; ) { |