| 31 |  | return(NULL); | 
| 32 |  |  | 
| 33 |  | dnew = (RMATRIX *)calloc(1, sizeof(RMATRIX)); | 
| 34 | < | if (dnew) { | 
| 35 | < | dnew->dtype = DTdouble; | 
| 36 | < | dnew->nrows = nr; | 
| 37 | < | dnew->ncols = nc; | 
| 38 | < | dnew->ncomp = n; | 
| 39 | < | setcolor(dnew->cexp, 1.f, 1.f, 1.f); | 
| 40 | < | memcpy(dnew->wlpart, WLPART, sizeof(dnew->wlpart)); | 
| 41 | < | } | 
| 34 | > | if (!dnew) | 
| 35 | > | return(NULL); | 
| 36 | > |  | 
| 37 | > | dnew->dtype = DTdouble; | 
| 38 | > | dnew->nrows = nr; | 
| 39 | > | dnew->ncols = nc; | 
| 40 | > | dnew->ncomp = n; | 
| 41 | > | setcolor(dnew->cexp, 1.f, 1.f, 1.f); | 
| 42 | > | memcpy(dnew->wlpart, WLPART, sizeof(dnew->wlpart)); | 
| 43 | > |  | 
| 44 |  | return(dnew); | 
| 45 |  | } | 
| 46 |  |  | 
| 374 |  | fp = stdin; | 
| 375 |  | else if (inspec[0] == '!') | 
| 376 |  | fp = popen(inspec+1, "r"); | 
| 377 | < | else if (rmp != RMPnone) { | 
| 377 | > | else { | 
| 378 |  | const char      *sp = inspec;   /* check suffix */ | 
| 379 |  | while (*sp) | 
| 380 |  | ++sp; | 
| 381 |  | while (sp > inspec && sp[-1] != '.') | 
| 382 |  | --sp; | 
| 383 |  | if (!strcasecmp(sp, "XML")) {   /* assume it's a BSDF */ | 
| 384 | < | CMATRIX *cm = rmp==RMPtrans ? cm_loadBTDF(inspec) : | 
| 384 | > | CMATRIX *cm = rmp==RMPnone ? (CMATRIX *)NULL : | 
| 385 | > | rmp==RMPtrans ? cm_loadBTDF(inspec) : | 
| 386 |  | cm_loadBRDF(inspec, rmp==RMPreflB) ; | 
| 387 |  | if (!cm) | 
| 388 |  | return(NULL); | 
| 528 |  | int | 
| 529 |  | rmx_write_header(const RMATRIX *rm, int dtype, FILE *fp) | 
| 530 |  | { | 
| 531 | < | if (!rm | !fp || !rm->mtx | (rm->ncols <= 0)) | 
| 531 | > | if (!rm | !fp || rm->ncols <= 0) | 
| 532 |  | return(0); | 
| 533 |  | if (rm->info) | 
| 534 |  | fputs(rm->info, fp); | 
| 643 |  | return(rid); | 
| 644 |  | } | 
| 645 |  |  | 
| 646 | < | /* Duplicate the given matrix */ | 
| 646 | > | /* Duplicate the given matrix (may be unallocated) */ | 
| 647 |  | RMATRIX * | 
| 648 |  | rmx_copy(const RMATRIX *rm) | 
| 649 |  | { | 
| 650 |  | RMATRIX *dnew; | 
| 651 |  |  | 
| 652 | < | if (!rm || !rm->mtx) | 
| 652 | > | if (!rm) | 
| 653 |  | return(NULL); | 
| 654 | < | dnew = rmx_alloc(rm->nrows, rm->ncols, rm->ncomp); | 
| 654 | > | dnew = rmx_new(rm->nrows, rm->ncols, rm->ncomp); | 
| 655 |  | if (!dnew) | 
| 656 |  | return(NULL); | 
| 657 | + | if (rm->mtx) { | 
| 658 | + | if (!rmx_prepare(dnew)) { | 
| 659 | + | rmx_free(dnew); | 
| 660 | + | return(NULL); | 
| 661 | + | } | 
| 662 | + | memcpy(dnew->mtx, rm->mtx, array_size(dnew)); | 
| 663 | + | } | 
| 664 |  | rmx_addinfo(dnew, rm->info); | 
| 665 |  | dnew->dtype = rm->dtype; | 
| 666 |  | copycolor(dnew->cexp, rm->cexp); | 
| 667 |  | memcpy(dnew->wlpart, rm->wlpart, sizeof(dnew->wlpart)); | 
| 658 | – | memcpy(dnew->mtx, rm->mtx, array_size(dnew)); | 
| 668 |  | return(dnew); | 
| 669 |  | } | 
| 670 |  |  |