126 static void MatrixSignalHandler(
int status)
143 #if !defined(MAGICKCORE_HAVE_PWRITE) 145 if (lseek(matrix_info->file,offset,SEEK_SET) < 0)
154 #if !defined(MAGICKCORE_HAVE_PWRITE) 155 count=write(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
158 count=pwrite(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
168 #if !defined(MAGICKCORE_HAVE_PWRITE) 191 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) 193 (void) posix_fallocate(matrix_info->file,offset+1,extent-offset);
196 (void) signal(SIGBUS,MatrixSignalHandler);
202 const size_t rows,
const size_t stride,
ExceptionInfo *exception)
216 (void) memset(matrix_info,0,
sizeof(*matrix_info));
219 matrix_info->
rows=rows;
220 matrix_info->
stride=stride;
223 if (synchronize != (
const char *) NULL)
229 if (matrix_info->
columns != (
size_t) (matrix_info->
length/rows/stride))
232 "CacheResourcesExhausted",
"`%s'",
"matrix cache");
252 if (matrix_info->
elements == (
unsigned short *) NULL)
256 matrix_info->
file=(-1);
257 if (matrix_info->
elements == (
unsigned short *) NULL)
263 "CacheResourcesExhausted",
"`%s'",
"matrix cache");
268 if (matrix_info->
file == -1)
276 (
size_t) matrix_info->
length);
329 if (matrix == (
double **) NULL)
330 return((
double **) NULL);
331 for (i=0; i < (ssize_t) number_rows; i++)
334 if (matrix[i] == (
double *) NULL)
336 for (j=0; j < i; j++)
339 return((
double **) NULL);
341 for (j=0; j < (ssize_t) size; j++)
375 switch (matrix_info->
type)
384 matrix_info->
elements=(
unsigned short *) NULL;
397 if (matrix_info->
file != -1)
398 (void) close(matrix_info->
file);
482 double **vectors,
const size_t rank,
const size_t number_vectors)
484 #define GaussJordanSwap(x,y) \ 513 if ((rows == (ssize_t *) NULL) || (columns == (ssize_t *) NULL) ||
514 (pivots == (ssize_t *) NULL))
516 if (pivots != (ssize_t *) NULL)
518 if (columns != (ssize_t *) NULL)
520 if (rows != (ssize_t *) NULL)
524 (void) memset(columns,0,rank*
sizeof(*columns));
525 (void) memset(rows,0,rank*
sizeof(*rows));
526 (void) memset(pivots,0,rank*
sizeof(*pivots));
529 for (i=0; i < (ssize_t) rank; i++)
532 for (j=0; j < (ssize_t) rank; j++)
535 for (k=0; k < (ssize_t) rank; k++)
542 if (fabs(matrix[j][k]) >= max)
544 max=fabs(matrix[j][k]);
552 for (k=0; k < (ssize_t) rank; k++)
554 for (k=0; k < (ssize_t) number_vectors; k++)
559 if (matrix[column][column] == 0.0)
562 matrix[column][column]=1.0;
563 for (j=0; j < (ssize_t) rank; j++)
564 matrix[column][j]*=scale;
565 for (j=0; j < (ssize_t) number_vectors; j++)
566 vectors[j][column]*=scale;
567 for (j=0; j < (ssize_t) rank; j++)
570 scale=matrix[j][column];
571 matrix[j][column]=0.0;
572 for (k=0; k < (ssize_t) rank; k++)
573 matrix[j][k]-=scale*matrix[column][k];
574 for (k=0; k < (ssize_t) number_vectors; k++)
575 vectors[k][j]-=scale*vectors[k][column];
578 for (j=(ssize_t) rank-1; j >= 0; j--)
579 if (columns[j] != rows[j])
580 for (i=0; i < (ssize_t) rank; i++)
647 static inline ssize_t
EdgeX(
const ssize_t x,
const size_t columns)
651 if (x >= (ssize_t) columns)
652 return((ssize_t) (columns-1));
656 static inline ssize_t
EdgeY(
const ssize_t y,
const size_t rows)
660 if (y >= (ssize_t) rows)
661 return((ssize_t) (rows-1));
675 #if !defined(MAGICKCORE_HAVE_PREAD) 677 if (lseek(matrix_info->file,offset,SEEK_SET) < 0)
686 #if !defined(MAGICKCORE_HAVE_PREAD) 687 count=read(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
690 count=pread(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
700 #if !defined(MAGICKCORE_HAVE_PREAD) 707 const ssize_t x,
const ssize_t y,
void *value)
713 assert(matrix_info != (
const MatrixInfo *) NULL);
719 (void) memcpy(value,(
unsigned char *) matrix_info->
elements+i*
724 matrix_info->
stride,(
unsigned char *) value);
754 assert(matrix_info != (
const MatrixInfo *) NULL);
756 return(matrix_info->
rows);
831 const double *terms,
const double *results,
const size_t rank,
832 const size_t number_vectors)
838 for (j=0; j < (ssize_t) rank; j++)
840 for (i=0; i < (ssize_t) rank; i++)
841 matrix[i][j]+=terms[i]*terms[j];
842 for (i=0; i < (ssize_t) number_vectors; i++)
843 vectors[i][j]+=results[i]*terms[j];
893 assert(matrix_info != (
const MatrixInfo *) NULL);
897 if (matrix_info->
stride <
sizeof(
double))
898 return((
Image *) NULL);
904 for (y=0; y < (ssize_t) matrix_info->
rows; y++)
909 for (x=0; x < (ssize_t) matrix_info->
columns; x++)
916 if (value < min_value)
919 if (value > max_value)
923 if ((min_value == 0.0) && (max_value == 0.0))
926 if (min_value == max_value)
932 scale_factor=(double)
QuantumRange/(max_value-min_value);
942 #if defined(MAGICKCORE_OPENMP_SUPPORT) 943 #pragma omp parallel for schedule(static) shared(status) \ 944 magick_number_threads(image,image,image->rows,1) 946 for (y=0; y < (ssize_t) image->
rows; y++)
965 for (x=0; x < (ssize_t) image->
columns; x++)
969 value=scale_factor*(value-min_value);
1016 assert(matrix_info != (
const MatrixInfo *) NULL);
1020 (void) memset(matrix_info->
elements,0,(
size_t)
1025 (void) lseek(matrix_info->
file,0,SEEK_SET);
1026 for (y=0; y < (ssize_t) matrix_info->
rows; y++)
1028 for (x=0; x < (ssize_t) matrix_info->
length; x++)
1030 count=write(matrix_info->
file,&value,
sizeof(value));
1031 if (count != (ssize_t)
sizeof(value))
1034 if (x < (ssize_t) matrix_info->
length)
1068 const size_t number_rows)
1073 if (matrix == (
double **) NULL )
1075 for (i=0; i < (ssize_t) number_rows; i++)
1112 const ssize_t x,
const ssize_t y,
const void *value)
1118 assert(matrix_info != (
const MatrixInfo *) NULL);
1126 (void) memcpy((
unsigned char *) matrix_info->
elements+i*
1131 matrix_info->
stride,(
unsigned char *) value);
MagickExport CacheView * DestroyCacheView(CacheView *cache_view)
MagickPrivate void LeastSquaresAddTerms(double **matrix, double **vectors, const double *terms, const double *results, const size_t rank, const size_t number_vectors)
MagickExport void UnlockSemaphoreInfo(SemaphoreInfo *semaphore_info)
#define ThrowFatalException(severity, tag)
MagickExport MagickBooleanType NullMatrix(MatrixInfo *matrix_info)
MagickExport SemaphoreInfo * AcquireSemaphoreInfo(void)
MagickBooleanType synchronize
MagickExport size_t GetMatrixColumns(const MatrixInfo *matrix_info)
MagickExport void RelinquishMagickResource(const ResourceType type, const MagickSizeType size)
MagickExport MagickBooleanType GetMatrixElement(const MatrixInfo *matrix_info, const ssize_t x, const ssize_t y, void *value)
MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type, const MagickSizeType size)
static Quantum ClampToQuantum(const MagickRealType quantum)
MagickExport MagickBooleanType SetMatrixElement(const MatrixInfo *matrix_info, const ssize_t x, const ssize_t y, const void *value)
#define MagickCoreSignature
MagickExport void LockSemaphoreInfo(SemaphoreInfo *semaphore_info)
static double PerceptibleReciprocal(const double x)
MagickExport int AcquireUniqueFileResource(char *path)
#define GaussJordanSwap(x, y)
char path[MagickPathExtent]
MagickExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
MagickExport MagickBooleanType RelinquishUniqueFileResource(const char *path)
MagickExport Image * MatrixToImage(const MatrixInfo *matrix_info, ExceptionInfo *exception)
MagickExport MagickBooleanType IsStringTrue(const char *value)
MagickExport Quantum * QueueCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x, const ssize_t y, const size_t columns, const size_t rows, ExceptionInfo *exception)
MagickExport MatrixInfo * AcquireMatrixInfo(const size_t columns, const size_t rows, const size_t stride, ExceptionInfo *exception)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
static MagickOffsetType ReadMatrixElements(const MatrixInfo *magick_restrict matrix_info, const MagickOffsetType offset, const MagickSizeType length, unsigned char *magick_restrict buffer)
MagickPrivate MagickBooleanType GaussJordanElimination(double **matrix, double **vectors, const size_t rank, const size_t number_vectors)
MagickExport Image * AcquireImage(const ImageInfo *image_info, ExceptionInfo *exception)
MagickExport char * GetEnvironmentValue(const char *name)
MagickExport double ** RelinquishMagickMatrix(double **matrix, const size_t number_rows)
static size_t GetPixelChannels(const Image *magick_restrict image)
#define GetMagickModule()
static MagickOffsetType WriteMatrixElements(const MatrixInfo *magick_restrict matrix_info, const MagickOffsetType offset, const MagickSizeType length, const unsigned char *magick_restrict buffer)
static MagickBooleanType SetMatrixExtent(MatrixInfo *magick_restrict matrix_info, MagickSizeType length)
MagickExport double ** AcquireMagickMatrix(const size_t number_rows, const size_t size)
MagickExport char * DestroyString(char *string)
MagickExport void * AcquireMagickMemory(const size_t size)
static ssize_t EdgeY(const ssize_t y, const size_t rows)
static ssize_t EdgeX(const ssize_t x, const size_t columns)
MagickExport void * RelinquishMagickMemory(void *memory)
#define magick_unreferenced(x)
MagickExport MagickBooleanType UnmapBlob(void *, const size_t)
MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *magick_restrict cache_view, ExceptionInfo *exception)
MagickExport CacheView * AcquireAuthenticCacheView(const Image *image, ExceptionInfo *exception)
SemaphoreInfo * semaphore
MagickExport void RelinquishSemaphoreInfo(SemaphoreInfo **semaphore_info)
MagickExport Image * DestroyImage(Image *image)
ColorspaceType colorspace
MagickExport size_t GetMatrixRows(const MatrixInfo *matrix_info)
MagickExport MatrixInfo * DestroyMatrixInfo(MatrixInfo *matrix_info)
MagickExport void * MapBlob(int, const MapMode, const MagickOffsetType, const size_t)