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.60 by greg, Tue Nov 21 01:30:20 2023 UTC vs.
Revision 2.65 by greg, Tue Nov 28 21:07:20 2023 UTC

# Line 172 | Line 172 | get_dminfo(char *s, void *p)
172   }
173  
174   static int
175 < rmx_load_ascii(RMATRIX *rm, FILE *fp)
175 > rmx_load_ascii(double *drp, const RMATRIX *rm, FILE *fp)
176   {
177 <        int     i, j, k;
177 >        int     j, k;
178  
179 <        if (!rmx_prepare(rm))
180 <                return(0);
181 <        for (i = 0; i < rm->nrows; i++)
182 <            for (j = 0; j < rm->ncols; j++) {
183 <                double  *dp = rmx_lval(rm,i,j);
184 <                for (k = 0; k < rm->ncomp; k++)
185 <                    if (fscanf(fp, "%lf", &dp[k]) != 1)
186 <                        return(0);
187 <            }
179 >        for (j = 0; j < rm->ncols; j++)
180 >                for (k = rm->ncomp; k-- > 0; )
181 >                        if (fscanf(fp, "%lf", drp++) != 1)
182 >                                return(0);
183          return(1);
184   }
185  
186   static int
187 < rmx_load_float(RMATRIX *rm, FILE *fp)
187 > rmx_load_float(double *drp, const RMATRIX *rm, FILE *fp)
188   {
189 <        int     i, j, k;
189 >        int     j, k;
190          float   val[100];
191  
192          if (rm->ncomp > 100) {
193                  fputs("Unsupported # components in rmx_load_float()\n", stderr);
194                  exit(1);
195          }
196 <        if (!rmx_prepare(rm))
202 <                return(0);
203 <        for (i = 0; i < rm->nrows; i++)
204 <            for (j = 0; j < rm->ncols; j++) {
205 <                double  *dp = rmx_lval(rm,i,j);
196 >        for (j = 0; j < rm->ncols; j++) {
197                  if (getbinary(val, sizeof(val[0]), rm->ncomp, fp) != rm->ncomp)
198 <                    return(0);
198 >                        return(0);
199                  if (rm->swapin)
200 <                    swap32((char *)val, rm->ncomp);
201 <                for (k = rm->ncomp; k--; )
202 <                     dp[k] = val[k];
203 <            }
200 >                        swap32((char *)val, rm->ncomp);
201 >                for (k = 0; k < rm->ncomp; k++)
202 >                        *drp++ = val[k];
203 >        }
204          return(1);
205   }
206  
207   static int
208 < rmx_load_double(RMATRIX *rm, FILE *fp)
208 > rmx_load_double(double *drp, const RMATRIX *rm, FILE *fp)
209   {
210 <        int     i;
220 < #ifdef MAP_FILE
221 <        long    pos;            /* map memory for file > 1MB if possible */
222 <        if (!rm->swapin && array_size(rm) >= 1L<<20 &&
223 <                        (pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) {
224 <                rm->mapped = mmap(NULL, array_size(rm)+pos, PROT_READ|PROT_WRITE,
225 <                                        MAP_PRIVATE, fileno(fp), 0);
226 <                if (rm->mapped != MAP_FAILED) {
227 <                        rm->mtx = (double *)rm->mapped + pos/sizeof(double);
228 <                        return(1);
229 <                }               /* else fall back on reading into memory */
230 <                rm->mapped = NULL;
231 <        }
232 < #endif
233 <        if (!rmx_prepare(rm))
210 >        if (getbinary(drp, sizeof(*drp)*rm->ncomp, rm->ncols, fp) != rm->ncols)
211                  return(0);
212 <        for (i = 0; i < rm->nrows; i++) {
213 <                if (getbinary(rmx_lval(rm,i,0), sizeof(double)*rm->ncomp,
237 <                                        rm->ncols, fp) != rm->ncols)
238 <                        return(0);
239 <                if (rm->swapin)
240 <                        swap64((char *)rmx_lval(rm,i,0), rm->ncols*rm->ncomp);
241 <        }
212 >        if (rm->swapin)
213 >                swap64((char *)drp, rm->ncols*rm->ncomp);
214          return(1);
215   }
216  
217   static int
218 < rmx_load_rgbe(RMATRIX *rm, FILE *fp)
218 > rmx_load_rgbe(double *drp, const RMATRIX *rm, FILE *fp)
219   {
220 <        COLOR   *scan = (COLOR *)malloc(sizeof(COLOR)*rm->ncols);
221 <        int     i, j;
220 >        COLR    *scan;
221 >        COLOR   col;
222 >        int     j;
223  
224 +        if (rm->ncomp != 3)
225 +                return(0);
226 +        scan = (COLR *)tempbuffer(sizeof(COLR)*rm->ncols);
227          if (!scan)
228                  return(0);
229 <        if (!rmx_prepare(rm)) {
254 <                free(scan);
229 >        if (freadcolrs(scan, rm->ncols, fp) < 0)
230                  return(0);
231 +        for (j = 0; j < rm->ncols; j++) {
232 +                colr_color(col, scan[j]);
233 +                *drp++ = colval(col,RED);
234 +                *drp++ = colval(col,GRN);
235 +                *drp++ = colval(col,BLU);
236          }
257        for (i = 0; i < rm->nrows; i++) {
258            double      *dp = rmx_lval(rm,i,0);
259            if (freadscan(scan, rm->ncols, fp) < 0) {
260                free(scan);
261                return(0);
262            }
263            for (j = 0; j < rm->ncols; j++, dp += 3) {
264                dp[0] = colval(scan[j],RED);
265                dp[1] = colval(scan[j],GRN);
266                dp[2] = colval(scan[j],BLU);
267            }
268        }
269        free(scan);
237          return(1);
238   }
239  
240   static int
241 < rmx_load_spec(RMATRIX *rm, FILE *fp)
241 > rmx_load_spec(double *drp, const RMATRIX *rm, FILE *fp)
242   {
243          uby8    *scan;
244          SCOLOR  scol;
245 <        int     i, j, k;
245 >        int     j, k;
246  
247 <        if (rm->ncomp < 3)
247 >        if ((rm->ncomp < 3) | (rm->ncomp > MAXCSAMP))
248                  return(0);
249 <        scan = (uby8 *)malloc((rm->ncomp+1)*rm->ncols);
249 >        scan = (uby8 *)tempbuffer((rm->ncomp+1)*rm->ncols);
250          if (!scan)
251                  return(0);
252 <        if (!rmx_prepare(rm)) {
286 <                free(scan);
252 >        if (freadscolrs(scan, rm->ncomp, rm->ncols, fp) < 0)
253                  return(0);
254 +        for (j = 0; j < rm->ncols; j++) {
255 +                scolr2scolor(scol, scan+j*(rm->ncomp+1), rm->ncomp);
256 +                for (k = 0; k < rm->ncomp; k++)
257 +                        *drp++ = scol[k];
258          }
259 <        for (i = 0; i < rm->nrows; i++) {
260 <            double      *dp = rmx_lval(rm,i,0);
261 <            if (freadscolrs(scan, rm->ncomp, rm->ncols, fp) < 0) {
262 <                free(scan);
259 >        return(1);
260 > }
261 >
262 > /* Read matrix header from input stream (cannot be XML) */
263 > int
264 > rmx_load_header(RMATRIX *rm, FILE *fp)
265 > {
266 >        if (!rm | !fp)
267                  return(0);
268 <            }
269 <            for (j = 0; j < rm->ncols; j++) {
270 <                scolr2scolor(scol, scan+j*(rm->ncomp+1), rm->ncomp);
297 <                for (k = 0; k < rm->ncomp; k++)
298 <                        *dp++ = scol[k];
299 <            }
268 >        if (rm->info) {                         /* clear state */
269 >                free(rm->info);
270 >                rm->info = NULL;
271          }
272 <        free(scan);
272 >        if (rm->mtx) {                          /* ...and data */
273 > #ifdef MAP_FILE
274 >                if (rm->mapped) {
275 >                        munmap(rm->mapped, mapped_size(rm));
276 >                        rm->mapped = NULL;
277 >                } else
278 > #endif
279 >                        free(rm->mtx);
280 >                rm->mtx = NULL;
281 >        }
282 >        if (rm->nrows | rm->ncols | !rm->dtype) {
283 >                rm->nrows = rm->ncols = 0;
284 >                rm->ncomp = 3;
285 >                setcolor(rm->cexp, 1.f, 1.f, 1.f);
286 >                memcpy(rm->wlpart, WLPART, sizeof(rm->wlpart));
287 >                rm->swapin = 0;
288 >        }
289 >        SET_FILE_BINARY(fp);
290 >        rm->dtype = DTascii;                    /* assumed w/o FORMAT */
291 >        if (getheader(fp, get_dminfo, rm) < 0) {
292 >                fputs("Unrecognized matrix format\n", stderr);
293 >                return(0);
294 >        }
295 >                                                /* resolution string? */
296 >        if ((rm->nrows <= 0) | (rm->ncols <= 0)) {
297 >                if (!fscnresolu(&rm->ncols, &rm->nrows, fp))
298 >                        return(0);
299 >                if ((rm->dtype == DTrgbe) | (rm->dtype == DTxyze) &&
300 >                                rm->ncomp != 3)
301 >                        return(0);
302 >        }
303          return(1);
304   }
305  
306 + /* Load next row as double (cannot be XML) */
307 + int
308 + rmx_load_row(double *drp, const RMATRIX *rm, FILE *fp)
309 + {
310 +        switch (rm->dtype) {
311 +        case DTascii:
312 +                return(rmx_load_ascii(drp, rm, fp));
313 +        case DTfloat:
314 +                return(rmx_load_float(drp, rm, fp));
315 +        case DTdouble:
316 +                return(rmx_load_double(drp, rm, fp));
317 +        case DTrgbe:
318 +        case DTxyze:
319 +                return(rmx_load_rgbe(drp, rm, fp));
320 +        case DTspec:
321 +                return(rmx_load_spec(drp, rm, fp));
322 +        default:
323 +                fputs("Unsupported data type in rmx_load_row()\n", stderr);
324 +        }
325 +        return(0);
326 + }
327 +
328 + /* Allocate & load post-header data from stream given type set in rm->dtype */
329 + int
330 + rmx_load_data(RMATRIX *rm, FILE *fp)
331 + {
332 +        int     i;
333 + #ifdef MAP_FILE
334 +        long    pos;            /* map memory for file > 1MB if possible */
335 +        if ((rm->dtype == DTdouble) & !rm->swapin && array_size(rm) >= 1L<<20 &&
336 +                        (pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) {
337 +                rm->mapped = mmap(NULL, array_size(rm)+pos, PROT_READ|PROT_WRITE,
338 +                                        MAP_PRIVATE, fileno(fp), 0);
339 +                if (rm->mapped != MAP_FAILED) {
340 +                        rm->mtx = (double *)rm->mapped + pos/sizeof(double);
341 +                        return(1);
342 +                }               /* else fall back on reading into memory */
343 +                rm->mapped = NULL;
344 +        }
345 + #endif
346 +        if (!rmx_prepare(rm)) { /* need in-core matrix array */
347 +                fprintf(stderr, "Cannot allocate %g MByte matrix array\n",
348 +                                (1./(1L<<20))*(double)array_size(rm));
349 +                return(0);
350 +        }
351 +        if (rm->dtype == DTascii)
352 +                SET_FILE_TEXT(fp);
353 +        for (i = 0; i < rm->nrows; i++)
354 +                if (!rmx_load_row(rmx_lval(rm,i,0), rm, fp))
355 +                        return(0);
356 +        return(1);
357 + }
358 +
359   /* Load matrix from supported file type */
360   RMATRIX *
361   rmx_load(const char *inspec, RMPref rmp)
362   {
363          FILE            *fp;
364          RMATRIX         *dnew;
365 +        int             ok;
366  
367          if (!inspec)
368                  inspec = stdin_name;
369          else if (!*inspec)
370                  return(NULL);
371 <        if (inspec == stdin_name) {             /* reading from stdin? */
371 >        if (inspec == stdin_name)               /* reading from stdin? */
372                  fp = stdin;
373 <        } else if (inspec[0] == '!') {
374 <                if (!(fp = popen(inspec+1, "r")))
375 <                        return(NULL);
321 <        } else {
373 >        else if (inspec[0] == '!')
374 >                fp = popen(inspec+1, "r");
375 >        else {
376                  const char      *sp = inspec;   /* check suffix */
377                  while (*sp)
378                          ++sp;
# Line 332 | Line 386 | rmx_load(const char *inspec, RMPref rmp)
386                          dnew = rmx_from_cmatrix(cm);
387                          cm_free(cm);
388                          dnew->dtype = DTascii;
389 <                        return(dnew);
390 <                }
391 <                                                /* else open it ourselves */
338 <                if (!(fp = fopen(inspec, "r")))
339 <                        return(NULL);
389 >                        return(dnew);           /* return here */
390 >                }                               /* else open it ourselves */
391 >                fp = fopen(inspec, "r");
392          }
393 <        SET_FILE_BINARY(fp);
393 >        if (!fp)
394 >                return(NULL);
395   #ifdef getc_unlocked
396          flockfile(fp);
397   #endif
398 <        if (!(dnew = rmx_new(0,0,3))) {
399 <                fclose(fp);
398 >                                                /* load header info */
399 >        if (!rmx_load_header(dnew = rmx_new(0,0,3), fp)) {
400 >                fprintf(stderr, "Bad header in: %s\n", inspec);
401 >                if (inspec[0] == '!') pclose(fp);
402 >                else fclose(fp);
403 >                rmx_free(dnew);
404                  return(NULL);
405          }
406 <        dnew->dtype = DTascii;                  /* assumed w/o FORMAT */
407 <        if (getheader(fp, get_dminfo, dnew) < 0) {
408 <                fclose(fp);
352 <                return(NULL);
353 <        }
354 <        if ((dnew->nrows <= 0) | (dnew->ncols <= 0)) {
355 <                if (!fscnresolu(&dnew->ncols, &dnew->nrows, fp)) {
356 <                        fclose(fp);
357 <                        return(NULL);
358 <                }
359 <                if ((dnew->dtype == DTrgbe) | (dnew->dtype == DTxyze) &&
360 <                                dnew->ncomp != 3) {
361 <                        fclose(fp);
362 <                        return(NULL);
363 <                }
364 <        }
365 <        switch (dnew->dtype) {
366 <        case DTascii:
367 <                SET_FILE_TEXT(fp);
368 <                if (!rmx_load_ascii(dnew, fp))
369 <                        goto loaderr;
370 <                dnew->dtype = DTascii;          /* should leave double? */
371 <                break;
372 <        case DTfloat:
373 <                if (!rmx_load_float(dnew, fp))
374 <                        goto loaderr;
375 <                dnew->dtype = DTfloat;
376 <                break;
377 <        case DTdouble:
378 <                if (!rmx_load_double(dnew, fp))
379 <                        goto loaderr;
380 <                dnew->dtype = DTdouble;
381 <                break;
382 <        case DTrgbe:
383 <        case DTxyze:
384 <                if (!rmx_load_rgbe(dnew, fp))
385 <                        goto loaderr;
386 <                break;
387 <        case DTspec:
388 <                if (!rmx_load_spec(dnew, fp))
389 <                        goto loaderr;
390 <                break;
391 <        default:
392 <                goto loaderr;
393 <        }
394 <        if (fp != stdin) {
406 >        ok = rmx_load_data(dnew, fp);           /* allocate & load data */
407 >
408 >        if (fp != stdin) {                      /* close input stream */
409                  if (inspec[0] == '!')
410                          pclose(fp);
411                  else
# Line 401 | Line 415 | rmx_load(const char *inspec, RMPref rmp)
415          else
416                  funlockfile(fp);
417   #endif
418 +        if (!ok) {                              /* load failure? */
419 +                fprintf(stderr, "Error loading data from: %s\n", inspec);
420 +                rmx_free(dnew);
421 +                return(NULL);
422 +        }
423                                                  /* undo exposure? */
424          if ((dnew->cexp[0] != 1.f) |
425                          (dnew->cexp[1] != 1.f) | (dnew->cexp[2] != 1.f)) {
# Line 409 | Line 428 | rmx_load(const char *inspec, RMPref rmp)
428                  cmlt[0] = 1./dnew->cexp[0];
429                  cmlt[1] = 1./dnew->cexp[1];
430                  cmlt[2] = 1./dnew->cexp[2];
431 <                if (dnew->ncomp > MAXCSAMP)
432 <                        goto loaderr;
431 >                if (dnew->ncomp > MAXCSAMP) {
432 >                        fprintf(stderr, "Excess spectral components in: %s\n",
433 >                                        inspec);
434 >                        rmx_free(dnew);
435 >                        return(NULL);
436 >                }
437                  for (i = dnew->ncomp; i-- > 3; )
438                          cmlt[i] = cmlt[1];
439                  rmx_scale(dnew, cmlt);
440                  setcolor(dnew->cexp, 1.f, 1.f, 1.f);
441          }
442          return(dnew);
420 loaderr:                                        /* should report error? */
421        if (inspec[0] == '!')
422                pclose(fp);
423        else
424                fclose(fp);
425        rmx_free(dnew);
426        return(NULL);
443   }
444  
445   static int
# Line 436 | Line 452 | rmx_write_ascii(const RMATRIX *rm, FILE *fp)
452  
453          for (i = 0; i < rm->nrows; i++) {
454              for (j = 0; j < rm->ncols; j++) {
455 <                const double    *dp = rmx_lval(rm,i,j);
455 >                const double    *dp = rmx_val(rm,i,j);
456                  for (k = 0; k < rm->ncomp; k++)
457                      fprintf(fp, fmt, dp[k]);
458                  fputc('\t', fp);
# Line 458 | Line 474 | rmx_write_float(const RMATRIX *rm, FILE *fp)
474          }
475          for (i = 0; i < rm->nrows; i++)
476              for (j = 0; j < rm->ncols; j++) {
477 <                const double    *dp = rmx_lval(rm,i,j);
477 >                const double    *dp = rmx_val(rm,i,j);
478                  for (k = rm->ncomp; k--; )
479                      val[k] = (float)dp[k];
480                  if (putbinary(val, sizeof(float), rm->ncomp, fp) != rm->ncomp)
# Line 473 | Line 489 | rmx_write_double(const RMATRIX *rm, FILE *fp)
489          int     i;
490  
491          for (i = 0; i < rm->nrows; i++)
492 <                if (putbinary(rmx_lval(rm,i,0), sizeof(double)*rm->ncomp,
492 >                if (putbinary(rmx_val(rm,i,0), sizeof(double)*rm->ncomp,
493                                          rm->ncols, fp) != rm->ncols)
494                          return(0);
495          return(1);
# Line 489 | Line 505 | rmx_write_rgbe(const RMATRIX *rm, FILE *fp)
505                  return(0);
506          for (i = 0; i < rm->nrows; i++) {
507              for (j = rm->ncols; j--; ) {
508 <                const double    *dp = rmx_lval(rm,i,j);
508 >                const double    *dp = rmx_val(rm,i,j);
509                  if (rm->ncomp == 1)
510                          setcolr(scan[j], dp[0], dp[0], dp[0]);
511                  else
# Line 507 | Line 523 | rmx_write_rgbe(const RMATRIX *rm, FILE *fp)
523   static int
524   rmx_write_spec(const RMATRIX *rm, FILE *fp)
525   {
510        int     prevNCSAMP = NCSAMP;
526          uby8    *scan = (uby8 *)malloc((rm->ncomp+1)*rm->ncols);
527          int     ok = 1;
528          SCOLOR  scol;
# Line 515 | Line 530 | rmx_write_spec(const RMATRIX *rm, FILE *fp)
530  
531          if (!scan)
532                  return(0);
518        NCSAMP = rm->ncomp;             /* XXX: kosher? */
533          for (i = 0; i < rm->nrows; i++) {
534              for (j = rm->ncols; j--; ) {
535 <                const double    *dp = rmx_lval(rm,i,j);
536 <                for (k = NCSAMP; k--; )
535 >                const double    *dp = rmx_val(rm,i,j);
536 >                for (k = rm->ncomp; k--; )
537                          scol[k] = dp[k];
538 <                scolor2scolr(scan+j*(NCSAMP+1), scol, NCSAMP);
538 >                scolor2scolr(scan+j*(rm->ncomp+1), scol, rm->ncomp);
539              }
540 <            if (fwritescolrs(scan, rm->ncols, fp) < 0) {
540 >            if (fwritescolrs(scan, rm->ncomp, rm->ncols, fp) < 0) {
541                  ok = 0;
542                  break;
543              }
544          }
545          free(scan);
532        NCSAMP = prevNCSAMP;
546          return(ok);
547   }
548  
# Line 561 | Line 574 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
574   #ifdef getc_unlocked
575          flockfile(fp);
576   #endif
577 <                                                /* complete header */
565 <        if (rm->info)
577 >        if (rm->info)                           /* complete header */
578                  fputs(rm->info, fp);
579          if (dtype == DTfromHeader)
580                  dtype = rm->dtype;
# Line 578 | Line 590 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
590          else if (rm->cexp[GRN] != 1.f)
591                  fputexpos(rm->cexp[GRN], fp);
592          if ((dtype != DTrgbe) & (dtype != DTxyze)) {
593 <                if (dtype == DTspec) {
582 <                        if (rm->ncomp < 3)
583 <                                return(0);      /* bad # components */
584 <                        fputwlsplit(rm->wlpart, fp);
585 <                } else {
593 >                if (dtype != DTspec) {
594                          fprintf(fp, "NROWS=%d\n", rm->nrows);
595                          fprintf(fp, "NCOLS=%d\n", rm->ncols);
596 <                }
596 >                } else if (rm->ncomp < 3)
597 >                        return(0);              /* bad # components */
598                  fputncomp(rm->ncomp, fp);
599 +                if (dtype == DTspec || (rm->ncomp > 3 &&
600 +                                memcmp(rm->wlpart, WLPART, sizeof(WLPART))))
601 +                        fputwlsplit(rm->wlpart, fp);
602          } else if ((rm->ncomp != 3) & (rm->ncomp != 1))
603                  return(0);                      /* wrong # components */
604          if ((dtype == DTfloat) | (dtype == DTdouble))
605                  fputendian(fp);                 /* important to record */
606          fputformat(cm_fmt_id[dtype], fp);
607 <        fputc('\n', fp);
607 >        fputc('\n', fp);                        /* end of header */
608          switch (dtype) {                        /* write data */
609          case DTascii:
610                  ok = rmx_write_ascii(rm, fp);
# Line 619 | Line 631 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
631   #ifdef getc_unlocked
632          funlockfile(fp);
633   #endif
634 +        if (!ok) fputs("Error writing matrix\n", stderr);
635          return(ok);
636   }
637  
# Line 688 | Line 701 | rmx_transpose(const RMATRIX *rm)
701          memcpy(dnew->wlpart, rm->wlpart, sizeof(dnew->wlpart));
702          for (j = dnew->ncols; j--; )
703              for (i = dnew->nrows; i--; )
704 <                memcpy(rmx_lval(dnew,i,j), rmx_lval(rm,j,i),
704 >                memcpy(rmx_lval(dnew,i,j), rmx_val(rm,j,i),
705                                  sizeof(double)*dnew->ncomp);
706          return(dnew);
707   }
# Line 715 | Line 728 | rmx_multiply(const RMATRIX *m1, const RMATRIX *m2)
728                  for (k = mres->ncomp; k--; ) {
729                      double      d = 0;
730                      for (h = m1->ncols; h--; )
731 <                        d += rmx_lval(m1,i,h)[k] * rmx_lval(m2,h,j)[k];
731 >                        d += rmx_val(m1,i,h)[k] * rmx_val(m2,h,j)[k];
732                      rmx_lval(mres,i,j)[k] = d;
733                  }
734          return(mres);
# Line 742 | Line 755 | rmx_elemult(RMATRIX *m1, const RMATRIX *m2, int divide
755                  if (divide) {
756                      double      d;
757                      if (m2->ncomp == 1) {
758 <                        d = rmx_lval(m2,i,j)[0];
758 >                        d = rmx_val(m2,i,j)[0];
759                          if (d == 0) {
760                              ++zeroDivides;
761                              for (k = m1->ncomp; k--; )
# Line 754 | Line 767 | rmx_elemult(RMATRIX *m1, const RMATRIX *m2, int divide
767                          }
768                      } else
769                          for (k = m1->ncomp; k--; ) {
770 <                            d = rmx_lval(m2,i,j)[k];
770 >                            d = rmx_val(m2,i,j)[k];
771                              if (d == 0) {
772                                  ++zeroDivides;
773                                  rmx_lval(m1,i,j)[k] = 0;
# Line 763 | Line 776 | rmx_elemult(RMATRIX *m1, const RMATRIX *m2, int divide
776                          }
777                  } else {
778                      if (m2->ncomp == 1) {
779 <                        const double    d = rmx_lval(m2,i,j)[0];
779 >                        const double    d = rmx_val(m2,i,j)[0];
780                          for (k = m1->ncomp; k--; )
781                              rmx_lval(m1,i,j)[k] *= d;
782                      } else
783                          for (k = m1->ncomp; k--; )
784 <                            rmx_lval(m1,i,j)[k] *= rmx_lval(m2,i,j)[k];
784 >                            rmx_lval(m1,i,j)[k] *= rmx_val(m2,i,j)[k];
785                  }
786          if (zeroDivides) {
787                  rmx_addinfo(m1, "WARNING: zero divide(s) corrupted results\n");
# Line 804 | Line 817 | rmx_sum(RMATRIX *msum, const RMATRIX *madd, const doub
817                  rmx_addinfo(msum, rmx_mismatch_warn);
818          for (i = msum->nrows; i--; )
819              for (j = msum->ncols; j--; ) {
820 <                const double    *da = rmx_lval(madd,i,j);
820 >                const double    *da = rmx_val(madd,i,j);
821                  double          *ds = rmx_lval(msum,i,j);
822                  for (k = msum->ncomp; k--; )
823                       ds[k] += sf[k] * da[k];
# Line 856 | Line 869 | rmx_transform(const RMATRIX *msrc, int n, const double
869          dnew->dtype = msrc->dtype;
870          for (i = dnew->nrows; i--; )
871              for (j = dnew->ncols; j--; ) {
872 <                const double    *ds = rmx_lval(msrc,i,j);
872 >                const double    *ds = rmx_val(msrc,i,j);
873                  for (kd = dnew->ncomp; kd--; ) {
874                      double      d = 0;
875                      for (ks = msrc->ncomp; ks--; )
# Line 905 | Line 918 | cm_from_rmatrix(const RMATRIX *rm)
918                  return(NULL);
919          for (i = cnew->nrows; i--; )
920              for (j = cnew->ncols; j--; ) {
921 <                const double    *dp = rmx_lval(rm,i,j);
921 >                const double    *dp = rmx_val(rm,i,j);
922                  COLORV          *cv = cm_lval(cnew,i,j);
923                  switch (rm->ncomp) {
924                  case 3:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines