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.89 by greg, Fri Apr 4 18:06:48 2025 UTC vs.
Revision 2.92 by greg, Wed Apr 16 21:54:15 2025 UTC

# Line 574 | Line 574 | rmx_write_header(const RMATRIX *rm, int dtype, FILE *f
574                  return(0);
575          if (rm->info)
576                  fputs(rm->info, fp);
577 <        if (dtype == DTfromHeader)
577 >        if (dtype == DTfromHeader) {
578                  dtype = rm->dtype;
579 <        else if (dtype == DTrgbe && (rm->dtype == DTxyze ||
579 > #if DTrmx_native==DTfloat
580 >                if (dtype == DTdouble)          /* but stored as float? */
581 >                        dtype = DTfloat;
582 > #endif
583 >        } else if (dtype == DTrgbe && (rm->dtype == DTxyze ||
584                                          findCIEprims(rm->info)))
585                  dtype = DTxyze;
586          else if ((dtype == DTxyze) & (rm->dtype == DTrgbe))
# Line 754 | Line 758 | rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int do
758   int
759   rmx_transpose(RMATRIX *rm)
760   {
761 <        RMATRIX dnew;
762 <        int     i, j;
761 > #define bmbyte(r,c)     bmap[((r)*rm->ncols+(c))>>3]
762 > #define bmbit(r,c)      (1 << ((r)*rm->ncols+(c) & 7))
763 > #define bmop(r,c, op)   (bmbyte(r,c) op bmbit(r,c))
764 > #define bmtest(r,c)     bmop(r,c,&)
765 > #define bmset(r,c)      bmop(r,c,|=)
766 > #define bmtestandset(r,c)       (!bmtest(r,c) && bmset(r,c))
767 >        uby8            *bmap;
768 >        rmx_dtype       val[MAXCOMP];
769 >        RMATRIX         dold;
770 >        int             i, j;
771  
772          if (!rm || !rm->mtx | (rm->ncomp > MAXCOMP))
773                  return(0);
# Line 768 | Line 780 | rmx_transpose(RMATRIX *rm)
780                  return(1);
781          }
782          if (rm->nrows == rm->ncols) {   /* square matrix case */
783 <                rmx_dtype       val[MAXCOMP];
784 <                for (j = rm->ncols; j--; )
785 <                    for (i = rm->nrows; i--; ) {
786 <                        if (i == j) continue;
775 <                        memcpy(val, rmx_val(rm,i,j),
783 >             for (i = rm->nrows; i--; )
784 >                for (j = rm->ncols; j--; ) {
785 >                    if (i == j) continue;
786 >                    memcpy(val, rmx_val(rm,i,j),
787                                  sizeof(rmx_dtype)*rm->ncomp);
788 <                        memcpy(rmx_lval(rm,i,j), rmx_val(rm,j,i),
788 >                    memcpy(rmx_lval(rm,i,j), rmx_val(rm,j,i),
789                                  sizeof(rmx_dtype)*rm->ncomp);
790 <                        memcpy(rmx_val(rm,j,i), val,
790 >                    memcpy(rmx_val(rm,j,i), val,
791                                  sizeof(rmx_dtype)*rm->ncomp);
792 <                    }
792 >                }
793                  return(1);
794          }
795 <        memset(&dnew, 0, sizeof(dnew));
796 <        dnew.ncols = rm->nrows; dnew.nrows = rm->ncols;
797 <        dnew.ncomp = rm->ncomp;
787 <        if (!rmx_prepare(&dnew))
795 >                                        /* clear completion bitmap */
796 >        bmap = (uby8 *)calloc(((size_t)rm->nrows*rm->ncols+7)>>3, 1);
797 >        if (!bmap)
798                  return(0);
799 <        rmx_addinfo(&dnew, rm->info);
800 <        dnew.dtype = rm->dtype;
801 <        copycolor(dnew.cexp, rm->cexp);
802 <        memcpy(dnew.wlpart, rm->wlpart, sizeof(dnew.wlpart));
803 <        for (j = dnew.ncols; j--; )
804 <            for (i = dnew.nrows; i--; )
805 <                memcpy(rmx_lval(&dnew,i,j), rmx_val(rm,j,i),
806 <                                sizeof(rmx_dtype)*dnew.ncomp);
807 <                                        /* and reassign result */
808 <        return(rmx_transfer_data(rm, &dnew, 1));
799 >        dold = *rm;
800 >        rm->ncols = dold.nrows; rm->nrows = dold.ncols;
801 >        for (i = rm->nrows; i--; )
802 >            for (j = rm->ncols; j--; ) {
803 >                int     i0, j0, i1 = i, j1 = j;
804 >                if (!bmtestandset(i,j)) continue;
805 >                memcpy(val, rmx_val(rm,i,j),
806 >                        sizeof(rmx_dtype)*rm->ncomp);
807 >                for ( ; ; ) {           /* value transpose loop */
808 >                    const rmx_dtype     *src;
809 >                    i0 = i1; j0 = j1;
810 >                    src = rmx_val(&dold, j0, i0);
811 >                    i1 = (src - dold.mtx)/(dold.ncomp*rm->ncols);
812 >                    j1 = (src - dold.mtx)/dold.ncomp % rm->ncols;
813 >                    if (!bmtestandset(i1,j1)) break;
814 >                    memcpy(rmx_lval(rm,i0,j0), src,
815 >                                sizeof(rmx_dtype)*rm->ncomp);
816 >                }
817 >                                        /* close the loop */
818 >                memcpy(rmx_lval(rm,i0,j0), val,
819 >                        sizeof(rmx_dtype)*rm->ncomp);
820 >            }
821 >        free(bmap);                     /* all done! */
822 >        return(1);
823 > #undef  bmbyte
824 > #undef  bmbit
825 > #undef  bmop
826 > #undef  bmtest
827 > #undef  bmset
828 > #undef  bmtestandset
829   }
830  
831   /* Multiply (concatenate) two matrices and allocate the result */
# Line 1032 | Line 1062 | cm_from_rmatrix(const RMATRIX *rm)
1062                          case 1:
1063                              setcolor(cv, dp[0], dp[0], dp[0]);
1064                              break;
1065 <                        default: {
1065 >                        default:
1066 >                            if (sizeof(COLORV) == sizeof(rmx_dtype)) {
1067 >                                scolor2color(cv, (const COLORV *)dp,
1068 >                                                rm->ncomp, rm->wlpart);
1069 >                            } else {
1070                                  COLORV  scol[MAXCOMP];
1071 <                                int     k;
1072 <                                for (k = rm->ncomp; k--; )
1039 <                                        scol[k] = dp[k];
1071 >                                int     k = rm->ncomp;
1072 >                                while (k--) scol[k] = dp[k];
1073                                  scolor2color(cv, scol, rm->ncomp, rm->wlpart);
1074 <                            } break;
1074 >                            }
1075 >                            break;
1076                          }
1077                      }
1078          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines