--- ray/src/util/rmatrix.h 2014/08/02 17:10:43 2.4 +++ ray/src/util/rmatrix.h 2025/04/18 23:59:03 2.27 @@ -1,4 +1,4 @@ -/* RCSid $Id: rmatrix.h,v 2.4 2014/08/02 17:10:43 greg Exp $ */ +/* RCSid $Id: rmatrix.h,v 2.27 2025/04/18 23:59:03 greg Exp $ */ /* * Header file for general matrix routines. */ @@ -12,45 +12,103 @@ extern "C" { #endif -/* General plane-ordered component matrix */ +/* RMATRIX flags (usually private): + need to swap input, we should free memory */ +#define RMF_SWAPIN 1 +#define RMF_FREEMEM 2 + +#ifndef MAXCOMP +#define MAXCOMP MAXCSAMP /* #components we support */ +#endif + /* Set in-core data type */ +#if !defined(DTrmx_native) || DTrmx_native==DTfloat +#define DTrmx_native DTfloat +#define rmx_dtype float +#define rmx_scanfmt "%f" +#elif DTrmx_native==DTdouble +#define rmx_dtype double +#define rmx_scanfmt "%lf" +#endif + +/* General [row][col][cmp] component matrix */ typedef struct { - int nrows, ncols, ncomp; - int dtype; - char *info; - double mtx[1]; /* extends struct */ + char *info; + void *mapped; + rmx_dtype *mtx; + COLOR cexp; + float wlpart[4]; + int nrows, ncols; + short ncomp; + uby8 dtype; + uby8 pflags; } RMATRIX; -#define rmx_lval(rm,r,c,i) (rm)->mtx[((i)*(rm)->nrows+(r))*(rm)->ncols+(c)] +#define rmx_lval(rm,r,c) ((rm)->mtx + (rm)->ncomp*((c)+(size_t)(rm)->ncols*(r))) +#define rmx_val rmx_lval -/* Allocate a nr x nc matrix with n components */ +#define rmx_array_size(rm) (sizeof(rmx_dtype)*(rm)->nrows*(rm)->ncols*(rm)->ncomp) +#define rmx_mapped_size(rm) ((char *)(rm)->mtx + rmx_array_size(rm) - (char *)(rm)->mapped) + +/* Initialize a RMATRIX struct but don't allocate array space */ +extern RMATRIX *rmx_new(int nr, int nc, int n); + +/* Prepare a RMATRIX for writing (allocate array if needed) */ +extern int rmx_prepare(RMATRIX *rm); + +/* Call rmx_new() and rmx_prepare() */ extern RMATRIX *rmx_alloc(int nr, int nc, int n); -/* Free a RMATRIX array */ +/* Clear state by freeing info and matrix data */ +extern void rmx_reset(RMATRIX *rm); + +/* Free an RMATRIX struct and data */ extern void rmx_free(RMATRIX *rm); /* Resolve data type based on two input types (returns 0 for mismatch) */ extern int rmx_newtype(int dtyp1, int dtyp2); -/* Load matrix from supported file type */ -extern RMATRIX *rmx_load(const char *fname); +/* Read matrix header from input stream (cannot be XML) */ +extern int rmx_load_header(RMATRIX *rm, FILE *fp); +/* Load next row as rmx_dtype (cannot be XML) */ +extern int rmx_load_row(rmx_dtype *drp, const RMATRIX *rm, FILE *fp); + +/* Allocate & load post-header data from stream given type set in rm->dtype */ +extern int rmx_load_data(RMATRIX *rm, FILE *fp); + +/* Load matrix from supported file type (NULL for stdin, '!' with command) */ +extern RMATRIX *rmx_load(const char *inspec); + /* Append header information associated with matrix data */ extern int rmx_addinfo(RMATRIX *rm, const char *info); -/* Write matrix to file type indicated by dtype */ -extern long rmx_write(const RMATRIX *rm, int dtype, FILE *fp); +/* Finish writing header data with resolution and format, returning type used */ +extern int rmx_write_header(const RMATRIX *rm, int dtype, FILE *fp); +/* Write out matrix data (usually by row) */ +extern int rmx_write_data(const rmx_dtype *dp, int nc, int len, + int dtype, FILE *fp); + +/* Write matrix using file format indicated by dtype */ +extern int rmx_write(const RMATRIX *rm, int dtype, FILE *fp); + /* Allocate and assign square identity matrix with n components */ extern RMATRIX *rmx_identity(int dim, int n); /* Duplicate the given matrix */ extern RMATRIX *rmx_copy(const RMATRIX *rm); -/* Allocate and assign transposed matrix */ -extern RMATRIX *rmx_transpose(const RMATRIX *rm); +/* Replace data in first matrix with data from second */ +extern int rmx_transfer_data(RMATRIX *rdst, RMATRIX *rsrc, int dometa); +/* Transpose the given matrix */ +extern int rmx_transpose(RMATRIX *rm); + /* Multiply (concatenate) two matrices and allocate the result */ extern RMATRIX *rmx_multiply(const RMATRIX *m1, const RMATRIX *m2); + +/* Element-wise multiplication (or division) of m2 into m1 */ +extern int rmx_elemult(RMATRIX *m1, const RMATRIX *m2, int divide); /* Sum second matrix into first, applying scale factor beforehand */ extern int rmx_sum(RMATRIX *msum, const RMATRIX *madd, const double sf[]);