ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rmatrix.c
(Generate patch)

Comparing ray/src/util/rmatrix.c (file contents):
Revision 2.97 by greg, Fri Apr 18 23:59:03 2025 UTC vs.
Revision 2.99 by greg, Tue Apr 22 04:45:25 2025 UTC

# Line 424 | Line 424 | rmx_load(const char *inspec)
424  
425          if (fp != stdin) {                      /* close input stream */
426                  if (inspec[0] == '!')
427 <                        pclose(fp);
427 >                        ok &= pclose(fp)==0;
428                  else
429                          fclose(fp);
430          }
# Line 995 | Line 995 | rmx_transform(const RMATRIX *msrc, int n, const double
995          return(dnew);
996   }
997  
998 /* Convert a color matrix to newly allocated RMATRIX buffer */
999 RMATRIX *
1000 rmx_from_cmatrix(const CMATRIX *cm)
1001 {
1002        RMATRIX *dnew;
1003
1004        if (!cm)
1005                return(NULL);
1006        dnew = rmx_alloc(cm->nrows, cm->ncols, 3);
1007        if (!dnew)
1008                return(NULL);
1009
1010        dnew->dtype = sizeof(COLORV)==sizeof(float) ?
1011                        DTfloat : DTdouble;
1012
1013        if (sizeof(COLORV) == sizeof(rmx_dtype)) {
1014                memcpy(dnew->mtx, cm->cmem, rmx_array_size(dnew));
1015        } else {
1016                int     i, j;
1017                for (i = dnew->nrows; i--; )
1018                    for (j = dnew->ncols; j--; ) {
1019                        const COLORV    *cv = cm_lval(cm,i,j);
1020                        rmx_dtype       *dp = rmx_lval(dnew,i,j);
1021                        dp[0] = cv[0];
1022                        dp[1] = cv[1];
1023                        dp[2] = cv[2];
1024                    }
1025        }
1026        return(dnew);
1027 }
1028
1029 /* Convert general matrix to newly allocated CMATRIX buffer */
1030 CMATRIX *
1031 cm_from_rmatrix(const RMATRIX *rm)
1032 {
1033        CMATRIX *cnew;
1034
1035        if (!rm || !rm->mtx | (rm->ncomp == 2) | (rm->ncomp > MAXCOMP))
1036                return(NULL);
1037        cnew = cm_alloc(rm->nrows, rm->ncols);
1038        if (!cnew)
1039                return(NULL);
1040        if ((sizeof(COLORV) == sizeof(rmx_dtype)) & (rm->ncomp == 3)) {
1041                memcpy(cnew->cmem, rm->mtx, rmx_array_size(rm));
1042        } else {
1043                int     i, j;
1044                for (i = cnew->nrows; i--; )
1045                    for (j = cnew->ncols; j--; ) {
1046                        const rmx_dtype *dp = rmx_val(rm,i,j);
1047                        COLORV          *cv = cm_lval(cnew,i,j);
1048                        switch (rm->ncomp) {
1049                        case 3:
1050                            setcolor(cv, dp[0], dp[1], dp[2]);
1051                            break;
1052                        case 1:
1053                            setcolor(cv, dp[0], dp[0], dp[0]);
1054                            break;
1055                        default:
1056                            if (sizeof(COLORV) == sizeof(rmx_dtype)) {
1057                                scolor2color(cv, (const COLORV *)dp,
1058                                                rm->ncomp, rm->wlpart);
1059                            } else {
1060                                COLORV  scol[MAXCOMP];
1061                                int     k = rm->ncomp;
1062                                while (k--) scol[k] = dp[k];
1063                                scolor2color(cv, scol, rm->ncomp, rm->wlpart);
1064                            }
1065                            break;
1066                        }
1067                    }
1068        }
1069        return(cnew);
1070 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines