| 18 |  |  | 
| 19 |  | static const char       rmx_mismatch_warn[] = "WARNING: data type mismatch\n"; | 
| 20 |  |  | 
| 21 | – | #define array_size(rm)  (sizeof(double)*(rm)->nrows*(rm)->ncols*(rm)->ncomp) | 
| 22 | – | #define mapped_size(rm) ((char *)(rm)->mtx + array_size(rm) - (char *)(rm)->mapped) | 
| 23 | – |  | 
| 21 |  | /* Initialize a RMATRIX struct but don't allocate array space */ | 
| 22 |  | RMATRIX * | 
| 23 |  | rmx_new(int nr, int nc, int n) | 
| 31 |  | if (!dnew) | 
| 32 |  | return(NULL); | 
| 33 |  |  | 
| 34 | < | dnew->dtype = DTdouble; | 
| 34 | > | dnew->dtype = DTrmx_native; | 
| 35 |  | dnew->nrows = nr; | 
| 36 |  | dnew->ncols = nc; | 
| 37 |  | dnew->ncomp = n; | 
| 46 |  | rmx_prepare(RMATRIX *rm) | 
| 47 |  | { | 
| 48 |  | if (!rm) return(0); | 
| 49 | < | if (rm->mtx) | 
| 49 | > | if (rm->mtx)                    /* assume it's right size */ | 
| 50 |  | return(1); | 
| 51 |  | if ((rm->nrows <= 0) | (rm->ncols <= 0) | (rm->ncomp <= 0)) | 
| 52 |  | return(0); | 
| 53 | < | rm->mtx = (double *)malloc(array_size(rm)); | 
| 53 | > | rm->mtx = (rmx_dtype *)malloc(rmx_array_size(rm)); | 
| 54 | > | rm->pflags |= RMF_FREEMEM; | 
| 55 |  | return(rm->mtx != NULL); | 
| 56 |  | } | 
| 57 |  |  | 
| 61 |  | { | 
| 62 |  | RMATRIX *dnew = rmx_new(nr, nc, n); | 
| 63 |  |  | 
| 64 | < | if (dnew && !rmx_prepare(dnew)) { | 
| 64 | > | if (!rmx_prepare(dnew)) { | 
| 65 |  | rmx_free(dnew); | 
| 66 | < | dnew = NULL; | 
| 66 | > | return(NULL); | 
| 67 |  | } | 
| 68 |  | return(dnew); | 
| 69 |  | } | 
| 77 |  | free(rm->info); | 
| 78 |  | rm->info = NULL; | 
| 79 |  | } | 
| 82 | – | if (rm->mtx) { | 
| 80 |  | #ifdef MAP_FILE | 
| 81 | < | if (rm->mapped) { | 
| 82 | < | munmap(rm->mapped, mapped_size(rm)); | 
| 83 | < | rm->mapped = NULL; | 
| 84 | < | } else | 
| 81 | > | if (rm->mapped) { | 
| 82 | > | munmap(rm->mapped, rmx_mapped_size(rm)); | 
| 83 | > | rm->mapped = NULL; | 
| 84 | > | } else | 
| 85 |  | #endif | 
| 86 | < | free(rm->mtx); | 
| 87 | < | rm->mtx = NULL; | 
| 86 | > | if (rm->pflags & RMF_FREEMEM) { | 
| 87 | > | free(rm->mtx); | 
| 88 | > | rm->pflags &= ~RMF_FREEMEM; | 
| 89 |  | } | 
| 90 | + | rm->mtx = NULL; | 
| 91 |  | } | 
| 92 |  |  | 
| 93 |  | /* Free an RMATRIX struct and data */ | 
| 116 |  | int | 
| 117 |  | rmx_addinfo(RMATRIX *rm, const char *info) | 
| 118 |  | { | 
| 119 | < | int     oldlen = 0; | 
| 119 | > | size_t  oldlen = 0; | 
| 120 |  |  | 
| 121 |  | if (!rm || !info || !*info) | 
| 122 |  | return(0); | 
| 123 |  | if (!rm->info) { | 
| 124 |  | rm->info = (char *)malloc(strlen(info)+1); | 
| 126 | – | if (rm->info) rm->info[0] = '\0'; | 
| 125 |  | } else { | 
| 126 |  | oldlen = strlen(rm->info); | 
| 127 |  | rm->info = (char *)realloc(rm->info, | 
| 140 |  | char    fmt[MAXFMTLEN]; | 
| 141 |  | int     i; | 
| 142 |  |  | 
| 143 | < | if (headidval(NULL, s)) | 
| 143 | > | if (isheadid(s)) | 
| 144 |  | return(0); | 
| 145 |  | if (isncomp(s)) { | 
| 146 |  | ip->ncomp = ncompval(s); | 
| 147 | < | return(0); | 
| 147 | > | return(ip->ncomp - 1); | 
| 148 |  | } | 
| 149 |  | if (!strncmp(s, "NROWS=", 6)) { | 
| 150 |  | ip->nrows = atoi(s+6); | 
| 151 | < | return(0); | 
| 151 | > | return(ip->nrows - 1); | 
| 152 |  | } | 
| 153 |  | if (!strncmp(s, "NCOLS=", 6)) { | 
| 154 |  | ip->ncols = atoi(s+6); | 
| 155 | < | return(0); | 
| 155 | > | return(ip->ncols - 1); | 
| 156 |  | } | 
| 157 |  | if ((i = isbigendian(s)) >= 0) { | 
| 158 | < | ip->swapin = (nativebigendian() != i); | 
| 158 | > | if (nativebigendian() != i) | 
| 159 | > | ip->pflags |= RMF_SWAPIN; | 
| 160 | > | else | 
| 161 | > | ip->pflags &= ~RMF_SWAPIN; | 
| 162 |  | return(0); | 
| 163 |  | } | 
| 164 |  | if (isexpos(s)) { | 
| 165 |  | float   f = exposval(s); | 
| 166 |  | scalecolor(ip->cexp, f); | 
| 167 | < | return(0); | 
| 167 | > | return(f > .0 ? 0 : -1); | 
| 168 |  | } | 
| 169 |  | if (iscolcor(s)) { | 
| 170 |  | COLOR   ctmp; | 
| 171 | < | colcorval(ctmp, s); | 
| 171 | > | if (!colcorval(ctmp, s)) return(-1); | 
| 172 |  | multcolor(ip->cexp, ctmp); | 
| 173 |  | return(0); | 
| 174 |  | } | 
| 175 | < | if (iswlsplit(s)) { | 
| 176 | < | wlsplitval(ip->wlpart, s); | 
| 177 | < | return(0); | 
| 177 | < | } | 
| 175 | > | if (iswlsplit(s)) | 
| 176 | > | return(wlsplitval(ip->wlpart, s) - 1); | 
| 177 | > |  | 
| 178 |  | if (!formatval(fmt, s)) { | 
| 179 |  | rmx_addinfo(ip, s); | 
| 180 |  | return(0); | 
| 184 |  | ip->dtype = i; | 
| 185 |  | return(0); | 
| 186 |  | } | 
| 187 | < | return(-1); | 
| 187 | > | return(-1);             /* bad format */ | 
| 188 |  | } | 
| 189 |  |  | 
| 190 |  | static int | 
| 191 | < | rmx_load_ascii(double *drp, const RMATRIX *rm, FILE *fp) | 
| 191 | > | rmx_load_ascii(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 192 |  | { | 
| 193 |  | int     j, k; | 
| 194 |  |  | 
| 200 |  | } | 
| 201 |  |  | 
| 202 |  | static int | 
| 203 | < | rmx_load_float(double *drp, const RMATRIX *rm, FILE *fp) | 
| 203 | > | rmx_load_float(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 204 |  | { | 
| 205 |  | int     j, k; | 
| 206 |  | float   val[100]; | 
| 212 |  | for (j = 0; j < rm->ncols; j++) { | 
| 213 |  | if (getbinary(val, sizeof(val[0]), rm->ncomp, fp) != rm->ncomp) | 
| 214 |  | return(0); | 
| 215 | < | if (rm->swapin) | 
| 215 | > | if (rm->pflags & RMF_SWAPIN) | 
| 216 |  | swap32((char *)val, rm->ncomp); | 
| 217 |  | for (k = 0; k < rm->ncomp; k++) | 
| 218 |  | *drp++ = val[k]; | 
| 221 |  | } | 
| 222 |  |  | 
| 223 |  | static int | 
| 224 | < | rmx_load_double(double *drp, const RMATRIX *rm, FILE *fp) | 
| 224 | > | rmx_load_double(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 225 |  | { | 
| 226 |  | if (getbinary(drp, sizeof(*drp)*rm->ncomp, rm->ncols, fp) != rm->ncols) | 
| 227 |  | return(0); | 
| 228 | < | if (rm->swapin) | 
| 228 | > | if (rm->pflags & RMF_SWAPIN) | 
| 229 |  | swap64((char *)drp, rm->ncols*rm->ncomp); | 
| 230 |  | return(1); | 
| 231 |  | } | 
| 232 |  |  | 
| 233 |  | static int | 
| 234 | < | rmx_load_rgbe(double *drp, const RMATRIX *rm, FILE *fp) | 
| 234 | > | rmx_load_rgbe(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 235 |  | { | 
| 236 |  | COLR    *scan; | 
| 237 |  | COLOR   col; | 
| 254 |  | } | 
| 255 |  |  | 
| 256 |  | static int | 
| 257 | < | rmx_load_spec(double *drp, const RMATRIX *rm, FILE *fp) | 
| 257 | > | rmx_load_spec(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 258 |  | { | 
| 259 |  | uby8    *scan; | 
| 260 |  | SCOLOR  scol; | 
| 287 |  | rm->ncomp = 3; | 
| 288 |  | setcolor(rm->cexp, 1.f, 1.f, 1.f); | 
| 289 |  | memcpy(rm->wlpart, WLPART, sizeof(rm->wlpart)); | 
| 290 | < | rm->swapin = 0; | 
| 290 | > | rm->pflags = 0; | 
| 291 |  | } | 
| 292 |  | rm->dtype = DTascii;                    /* assumed w/o FORMAT */ | 
| 293 |  | if (getheader(fp, get_dminfo, rm) < 0) { | 
| 294 | < | fputs("Unrecognized matrix format\n", stderr); | 
| 294 | > | fputs("Bad matrix header\n", stderr); | 
| 295 |  | return(0); | 
| 296 |  | } | 
| 297 |  | if ((rm->dtype == DTrgbe) | (rm->dtype == DTxyze) && | 
| 307 |  | return(1); | 
| 308 |  | } | 
| 309 |  |  | 
| 310 | < | /* Load next row as double (cannot be XML) */ | 
| 310 | > | /* Load next row as rmx_dtype (cannot be XML) */ | 
| 311 |  | int | 
| 312 | < | rmx_load_row(double *drp, const RMATRIX *rm, FILE *fp) | 
| 312 | > | rmx_load_row(rmx_dtype *drp, const RMATRIX *rm, FILE *fp) | 
| 313 |  | { | 
| 314 |  | switch (rm->dtype) { | 
| 315 |  | case DTascii: | 
| 336 |  | int     i; | 
| 337 |  | #ifdef MAP_FILE | 
| 338 |  | long    pos;            /* map memory for file > 1MB if possible */ | 
| 339 | < | if ((rm->dtype == DTdouble) & !rm->swapin && array_size(rm) >= 1L<<20 && | 
| 340 | < | (pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) { | 
| 341 | < | rm->mapped = mmap(NULL, array_size(rm)+pos, PROT_READ|PROT_WRITE, | 
| 339 | > | if ((rm->dtype == DTrmx_native) & !(rm->pflags & RMF_SWAPIN) & | 
| 340 | > | (rmx_array_size(rm) >= 1L<<20) && | 
| 341 | > | (pos = ftell(fp)) >= 0 && !(pos % sizeof(rmx_dtype))) { | 
| 342 | > | rm->mapped = mmap(NULL, rmx_array_size(rm)+pos, PROT_READ|PROT_WRITE, | 
| 343 |  | MAP_PRIVATE, fileno(fp), 0); | 
| 344 |  | if (rm->mapped != MAP_FAILED) { | 
| 345 | < | rm->mtx = (double *)rm->mapped + pos/sizeof(double); | 
| 345 | > | if (rm->pflags & RMF_FREEMEM) | 
| 346 | > | free(rm->mtx); | 
| 347 | > | rm->mtx = (rmx_dtype *)rm->mapped + pos/sizeof(rmx_dtype); | 
| 348 | > | rm->pflags &= ~RMF_FREEMEM; | 
| 349 |  | return(1); | 
| 350 |  | }               /* else fall back on reading into memory */ | 
| 351 |  | rm->mapped = NULL; | 
| 353 |  | #endif | 
| 354 |  | if (!rmx_prepare(rm)) { /* need in-core matrix array */ | 
| 355 |  | fprintf(stderr, "Cannot allocate %g MByte matrix array\n", | 
| 356 | < | (1./(1L<<20))*(double)array_size(rm)); | 
| 356 | > | (1./(1L<<20))*(double)rmx_array_size(rm)); | 
| 357 |  | return(0); | 
| 358 |  | } | 
| 359 |  | for (i = 0; i < rm->nrows; i++) | 
| 378 |  | fp = stdin; | 
| 379 |  | else if (inspec[0] == '!') | 
| 380 |  | fp = popen(inspec+1, "r"); | 
| 381 | < | else { | 
| 382 | < | const char      *sp = inspec;   /* check suffix */ | 
| 383 | < | while (*sp) | 
| 380 | < | ++sp; | 
| 381 | < | while (sp > inspec && sp[-1] != '.') | 
| 382 | < | --sp; | 
| 383 | < | if (!strcasecmp(sp, "XML")) {   /* assume it's a BSDF */ | 
| 381 | > | else {                                  /* check suffix */ | 
| 382 | > | const char      *sp = strrchr(inspec, '.'); | 
| 383 | > | if (sp > inspec && !strcasecmp(sp+1, "XML")) {  /* BSDF? */ | 
| 384 |  | CMATRIX *cm = rmp==RMPnone ? (CMATRIX *)NULL : | 
| 385 |  | rmp==RMPtrans ? cm_loadBTDF(inspec) : | 
| 386 |  | cm_loadBRDF(inspec, rmp==RMPreflB) ; | 
| 393 |  | }                               /* else open it ourselves */ | 
| 394 |  | fp = fopen(inspec, "r"); | 
| 395 |  | } | 
| 396 | < | if (!fp) | 
| 396 | > | if (!fp) { | 
| 397 | > | fprintf(stderr, "Cannot open for reading: %s\n", inspec); | 
| 398 |  | return(NULL); | 
| 399 | + | } | 
| 400 |  | #ifdef getc_unlocked | 
| 401 |  | flockfile(fp); | 
| 402 |  | #endif | 
| 430 |  | (dnew->cexp[1] != 1.f) | (dnew->cexp[2] != 1.f)) { | 
| 431 |  | double  cmlt[MAXCSAMP]; | 
| 432 |  | int     i; | 
| 431 | – | cmlt[0] = 1./dnew->cexp[0]; | 
| 432 | – | cmlt[1] = 1./dnew->cexp[1]; | 
| 433 | – | cmlt[2] = 1./dnew->cexp[2]; | 
| 433 |  | if (dnew->ncomp > MAXCSAMP) { | 
| 434 |  | fprintf(stderr, "Excess spectral components in: %s\n", | 
| 435 |  | inspec); | 
| 436 |  | rmx_free(dnew); | 
| 437 |  | return(NULL); | 
| 438 |  | } | 
| 439 | + | cmlt[0] = 1./dnew->cexp[0]; | 
| 440 | + | cmlt[1] = 1./dnew->cexp[1]; | 
| 441 | + | cmlt[2] = 1./dnew->cexp[2]; | 
| 442 |  | for (i = dnew->ncomp; i-- > 3; ) | 
| 443 | < | cmlt[i] = cmlt[1]; | 
| 443 | > | cmlt[i] = cmlt[1];      /* XXX hack! */ | 
| 444 |  | rmx_scale(dnew, cmlt); | 
| 445 |  | setcolor(dnew->cexp, 1.f, 1.f, 1.f); | 
| 446 |  | } | 
| 448 |  | } | 
| 449 |  |  | 
| 450 |  | static int | 
| 451 | < | rmx_write_ascii(const double *dp, int nc, int len, FILE *fp) | 
| 451 | > | rmx_write_ascii(const rmx_dtype *dp, int nc, int len, FILE *fp) | 
| 452 |  | { | 
| 453 |  | while (len-- > 0) { | 
| 454 |  | int     k = nc; | 
| 455 | < | while (nc-- > 0) | 
| 455 | > | while (k-- > 0) | 
| 456 |  | fprintf(fp, " %.7e", *dp++); | 
| 457 |  | fputc('\t', fp); | 
| 458 |  | } | 
| 460 |  | } | 
| 461 |  |  | 
| 462 |  | static int | 
| 463 | < | rmx_write_float(const double *dp, int len, FILE *fp) | 
| 463 | > | rmx_write_float(const rmx_dtype *dp, int len, FILE *fp) | 
| 464 |  | { | 
| 465 |  | float   val; | 
| 466 |  |  | 
| 473 |  | } | 
| 474 |  |  | 
| 475 |  | static int | 
| 476 | < | rmx_write_rgbe(const double *dp, int nc, int len, FILE *fp) | 
| 476 | > | rmx_write_rgbe(const rmx_dtype *dp, int nc, int len, FILE *fp) | 
| 477 |  | { | 
| 478 |  | COLR    *scan; | 
| 479 |  | int     j; | 
| 492 |  | } | 
| 493 |  |  | 
| 494 |  | static int | 
| 495 | < | rmx_write_spec(const double *dp, int nc, int len, FILE *fp) | 
| 495 | > | rmx_write_spec(const rmx_dtype *dp, int nc, int len, FILE *fp) | 
| 496 |  | { | 
| 497 |  | uby8    *scan; | 
| 498 |  | SCOLOR  scol; | 
| 501 |  | if (nc < 3) return(0); | 
| 502 |  | scan = (uby8 *)tempbuffer((nc+1)*len); | 
| 503 |  | if (!scan) return(0); | 
| 504 | < | for (j = len; j--; dp += nc) { | 
| 504 | > | for (j = 0; j < len; j++, dp += nc) { | 
| 505 |  | for (k = nc; k--; ) | 
| 506 |  | scol[k] = dp[k]; | 
| 507 |  | scolor2scolr(scan+j*(nc+1), scol, nc); | 
| 541 |  | dtype = DTxyze; | 
| 542 |  | else if ((dtype == DTxyze) & (rm->dtype == DTrgbe)) | 
| 543 |  | dtype = DTrgbe; | 
| 544 | < | if ((dtype == DTspec) & (rm->ncomp < 3)) | 
| 544 | > | if ((dtype < DTspec) & (rm->ncomp > 3)) | 
| 545 | > | dtype = DTspec; | 
| 546 | > | else if ((dtype == DTspec) & (rm->ncomp <= 3)) | 
| 547 |  | return(0); | 
| 548 |  |  | 
| 549 |  | if (dtype == DTascii)                   /* set file type (WINDOWS) */ | 
| 564 |  | } | 
| 565 |  | if (dtype >= DTspec) {                  /* # components & split? */ | 
| 566 |  | fputncomp(rm->ncomp, fp); | 
| 567 | < | if (dtype == DTspec || (rm->ncomp > 3 && | 
| 568 | < | memcmp(rm->wlpart, WLPART, sizeof(WLPART)))) | 
| 567 | > | if (rm->ncomp > 3 && | 
| 568 | > | memcmp(rm->wlpart, WLPART, sizeof(WLPART))) | 
| 569 |  | fputwlsplit(rm->wlpart, fp); | 
| 570 |  | } else if ((rm->ncomp != 3) & (rm->ncomp != 1)) | 
| 571 |  | return(0);                      /* wrong # components */ | 
| 580 |  |  | 
| 581 |  | /* Write out matrix data (usually by row) */ | 
| 582 |  | int | 
| 583 | < | rmx_write_data(const double *dp, int nc, int len, int dtype, FILE *fp) | 
| 583 | > | rmx_write_data(const rmx_dtype *dp, int nc, int len, int dtype, FILE *fp) | 
| 584 |  | { | 
| 585 |  | switch (dtype) { | 
| 586 |  | case DTascii: | 
| 587 |  | return(rmx_write_ascii(dp, nc, len, fp)); | 
| 588 |  | case DTfloat: | 
| 589 |  | return(rmx_write_float(dp, nc*len, fp)); | 
| 590 | < | case DTdouble: | 
| 590 | > | case DTrmx_native: | 
| 591 |  | return(putbinary(dp, sizeof(*dp)*nc, len, fp) == len); | 
| 592 |  | case DTrgbe: | 
| 593 |  | case DTxyze: | 
| 611 |  | #ifdef getc_unlocked | 
| 612 |  | flockfile(fp); | 
| 613 |  | #endif | 
| 614 | < | if (dtype == DTdouble)                  /* write all at once? */ | 
| 614 | > | if (dtype == DTrmx_native)              /* write all at once? */ | 
| 615 |  | ok = rmx_write_data(rm->mtx, rm->ncomp, | 
| 616 |  | rm->nrows*rm->ncols, dtype, fp); | 
| 617 |  | else                                    /* else row by row */ | 
| 638 |  |  | 
| 639 |  | if (!rid) | 
| 640 |  | return(NULL); | 
| 641 | < | memset(rid->mtx, 0, array_size(rid)); | 
| 641 | > | memset(rid->mtx, 0, rmx_array_size(rid)); | 
| 642 |  | for (i = dim; i--; ) { | 
| 643 | < | double      *dp = rmx_lval(rid,i,i); | 
| 643 | > | rmx_dtype   *dp = rmx_lval(rid,i,i); | 
| 644 |  | for (k = n; k--; ) | 
| 645 |  | dp[k] = 1.; | 
| 646 |  | } | 
| 663 |  | rmx_free(dnew); | 
| 664 |  | return(NULL); | 
| 665 |  | } | 
| 666 | < | memcpy(dnew->mtx, rm->mtx, array_size(dnew)); | 
| 666 | > | memcpy(dnew->mtx, rm->mtx, rmx_array_size(dnew)); | 
| 667 |  | } | 
| 668 |  | rmx_addinfo(dnew, rm->info); | 
| 669 |  | dnew->dtype = rm->dtype; | 
| 672 |  | return(dnew); | 
| 673 |  | } | 
| 674 |  |  | 
| 675 | + | /* Replace data in first matrix with data from second */ | 
| 676 | + | int | 
| 677 | + | rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int dometa) | 
| 678 | + | { | 
| 679 | + | if (!rdst | !rsrc || (rdst->nrows != rsrc->nrows) | | 
| 680 | + | (rdst->ncols != rsrc->ncols) | | 
| 681 | + | (rdst->ncomp != rsrc->ncomp)) | 
| 682 | + | return(0); | 
| 683 | + |  | 
| 684 | + | if (dometa) {           /* transfer everything? */ | 
| 685 | + | rmx_reset(rdst); | 
| 686 | + | *rdst = *rsrc; | 
| 687 | + | rsrc->info = NULL; rsrc->mapped = NULL; rsrc->mtx = NULL; | 
| 688 | + | return(1); | 
| 689 | + | } | 
| 690 | + | #ifdef MAP_FILE                 /* just matrix data -- leave metadata */ | 
| 691 | + | if (rdst->mapped) | 
| 692 | + | munmap(rdst->mapped, rmx_mapped_size(rdst)); | 
| 693 | + | else | 
| 694 | + | #endif | 
| 695 | + | if (rdst->pflags & RMF_FREEMEM) { | 
| 696 | + | free(rdst->mtx); | 
| 697 | + | rdst->pflags &= ~RMF_FREEMEM; | 
| 698 | + | } | 
| 699 | + | rdst->mapped = rsrc->mapped; | 
| 700 | + | rdst->mtx = rsrc->mtx; | 
| 701 | + | rdst->pflags |= rsrc->pflags & RMF_FREEMEM; | 
| 702 | + | rsrc->mapped = NULL; rsrc->mtx = NULL; | 
| 703 | + | return(1); | 
| 704 | + | } | 
| 705 | + |  | 
| 706 |  | /* Allocate and assign transposed matrix */ | 
| 707 |  | RMATRIX * | 
| 708 |  | rmx_transpose(const RMATRIX *rm) | 
| 733 |  | for (j = dnew->ncols; j--; ) | 
| 734 |  | for (i = dnew->nrows; i--; ) | 
| 735 |  | memcpy(rmx_lval(dnew,i,j), rmx_val(rm,j,i), | 
| 736 | < | sizeof(double)*dnew->ncomp); | 
| 736 | > | sizeof(rmx_dtype)*dnew->ncomp); | 
| 737 |  | return(dnew); | 
| 738 |  | } | 
| 739 |  |  | 
| 758 |  | for (i = mres->nrows; i--; ) | 
| 759 |  | for (j = mres->ncols; j--; ) | 
| 760 |  | for (k = mres->ncomp; k--; ) { | 
| 761 | < | double      d = 0; | 
| 761 | > | rmx_dtype   d = 0; | 
| 762 |  | for (h = m1->ncols; h--; ) | 
| 763 |  | d += rmx_val(m1,i,h)[k] * rmx_val(m2,h,j)[k]; | 
| 764 |  | rmx_lval(mres,i,j)[k] = d; | 
| 786 |  | for (i = m1->nrows; i--; ) | 
| 787 |  | for (j = m1->ncols; j--; ) | 
| 788 |  | if (divide) { | 
| 789 | < | double      d; | 
| 789 | > | rmx_dtype   d; | 
| 790 |  | if (m2->ncomp == 1) { | 
| 791 |  | d = rmx_val(m2,i,j)[0]; | 
| 792 |  | if (d == 0) { | 
| 809 |  | } | 
| 810 |  | } else { | 
| 811 |  | if (m2->ncomp == 1) { | 
| 812 | < | const double    d = rmx_val(m2,i,j)[0]; | 
| 812 | > | const rmx_dtype d = rmx_val(m2,i,j)[0]; | 
| 813 |  | for (k = m1->ncomp; k--; ) | 
| 814 |  | rmx_lval(m1,i,j)[k] *= d; | 
| 815 |  | } else | 
| 850 |  | rmx_addinfo(msum, rmx_mismatch_warn); | 
| 851 |  | for (i = msum->nrows; i--; ) | 
| 852 |  | for (j = msum->ncols; j--; ) { | 
| 853 | < | const double    *da = rmx_val(madd,i,j); | 
| 854 | < | double          *ds = rmx_lval(msum,i,j); | 
| 853 | > | const rmx_dtype *da = rmx_val(madd,i,j); | 
| 854 | > | rmx_dtype       *ds = rmx_lval(msum,i,j); | 
| 855 |  | for (k = msum->ncomp; k--; ) | 
| 856 |  | ds[k] += sf[k] * da[k]; | 
| 857 |  | } | 
| 870 |  | return(0); | 
| 871 |  | for (i = rm->nrows; i--; ) | 
| 872 |  | for (j = rm->ncols; j--; ) { | 
| 873 | < | double  *dp = rmx_lval(rm,i,j); | 
| 873 | > | rmx_dtype       *dp = rmx_lval(rm,i,j); | 
| 874 |  | for (k = rm->ncomp; k--; ) | 
| 875 |  | dp[k] *= sf[k]; | 
| 876 |  | } | 
| 902 |  | dnew->dtype = msrc->dtype; | 
| 903 |  | for (i = dnew->nrows; i--; ) | 
| 904 |  | for (j = dnew->ncols; j--; ) { | 
| 905 | < | const double    *ds = rmx_val(msrc,i,j); | 
| 905 | > | const rmx_dtype *ds = rmx_val(msrc,i,j); | 
| 906 |  | for (kd = dnew->ncomp; kd--; ) { | 
| 907 | < | double      d = 0; | 
| 907 | > | rmx_dtype   d = 0; | 
| 908 |  | for (ks = msrc->ncomp; ks--; ) | 
| 909 |  | d += cmat[kd*msrc->ncomp + ks] * ds[ks]; | 
| 910 |  | rmx_lval(dnew,i,j)[kd] = d; | 
| 929 |  | for (i = dnew->nrows; i--; ) | 
| 930 |  | for (j = dnew->ncols; j--; ) { | 
| 931 |  | const COLORV    *cv = cm_lval(cm,i,j); | 
| 932 | < | double          *dp = rmx_lval(dnew,i,j); | 
| 932 | > | rmx_dtype       *dp = rmx_lval(dnew,i,j); | 
| 933 |  | dp[0] = cv[0]; | 
| 934 |  | dp[1] = cv[1]; | 
| 935 |  | dp[2] = cv[2]; | 
| 951 |  | return(NULL); | 
| 952 |  | for (i = cnew->nrows; i--; ) | 
| 953 |  | for (j = cnew->ncols; j--; ) { | 
| 954 | < | const double    *dp = rmx_val(rm,i,j); | 
| 954 | > | const rmx_dtype *dp = rmx_val(rm,i,j); | 
| 955 |  | COLORV          *cv = cm_lval(cnew,i,j); | 
| 956 |  | switch (rm->ncomp) { | 
| 957 |  | case 3: |