125 static void MatrixSignalHandler(
int status)
142 #if !defined(MAGICKCORE_HAVE_PWRITE) 144 if (lseek(matrix_info->file,offset,SEEK_SET) < 0)
153 #if !defined(MAGICKCORE_HAVE_PWRITE) 154 count=write(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
157 count=pwrite(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
167 #if !defined(MAGICKCORE_HAVE_PWRITE) 190 #if defined(MAGICKCORE_HAVE_POSIX_FALLOCATE) 192 (void) posix_fallocate(matrix_info->file,offset+1,extent-offset);
195 (void) signal(SIGBUS,MatrixSignalHandler);
201 const size_t rows,
const size_t stride,
ExceptionInfo *exception)
215 (void) memset(matrix_info,0,
sizeof(*matrix_info));
218 matrix_info->
rows=rows;
219 matrix_info->
stride=stride;
222 if (synchronize != (
const char *) NULL)
228 if (matrix_info->
columns != (
size_t) (matrix_info->
length/rows/stride))
231 "CacheResourcesExhausted",
"`%s'",
"matrix cache");
251 if (matrix_info->
elements == (
unsigned short *) NULL)
255 matrix_info->
file=(-1);
256 if (matrix_info->
elements == (
unsigned short *) NULL)
262 "CacheResourcesExhausted",
"`%s'",
"matrix cache");
267 if (matrix_info->
file == -1)
275 (
size_t) matrix_info->
length);
328 if (matrix == (
double **) NULL)
329 return((
double **) NULL);
330 for (i=0; i < (ssize_t) number_rows; i++)
333 if (matrix[i] == (
double *) NULL)
335 for (j=0; j < i; j++)
338 return((
double **) NULL);
340 for (j=0; j < (ssize_t) size; j++)
374 switch (matrix_info->
type)
383 matrix_info->
elements=(
unsigned short *) NULL;
396 if (matrix_info->
file != -1)
397 (void) close(matrix_info->
file);
481 double **vectors,
const size_t rank,
const size_t number_vectors)
483 #define GaussJordanSwap(x,y) \ 512 if ((rows == (ssize_t *) NULL) || (columns == (ssize_t *) NULL) ||
513 (pivots == (ssize_t *) NULL))
515 if (pivots != (ssize_t *) NULL)
517 if (columns != (ssize_t *) NULL)
519 if (rows != (ssize_t *) NULL)
523 (void) memset(columns,0,rank*
sizeof(*columns));
524 (void) memset(rows,0,rank*
sizeof(*rows));
525 (void) memset(pivots,0,rank*
sizeof(*pivots));
528 for (i=0; i < (ssize_t) rank; i++)
531 for (j=0; j < (ssize_t) rank; j++)
534 for (k=0; k < (ssize_t) rank; k++)
541 if (fabs(matrix[j][k]) >= max)
543 max=fabs(matrix[j][k]);
551 for (k=0; k < (ssize_t) rank; k++)
553 for (k=0; k < (ssize_t) number_vectors; k++)
558 if (matrix[column][column] == 0.0)
561 matrix[column][column]=1.0;
562 for (j=0; j < (ssize_t) rank; j++)
563 matrix[column][j]*=scale;
564 for (j=0; j < (ssize_t) number_vectors; j++)
565 vectors[j][column]*=scale;
566 for (j=0; j < (ssize_t) rank; j++)
569 scale=matrix[j][column];
570 matrix[j][column]=0.0;
571 for (k=0; k < (ssize_t) rank; k++)
572 matrix[j][k]-=scale*matrix[column][k];
573 for (k=0; k < (ssize_t) number_vectors; k++)
574 vectors[k][j]-=scale*vectors[k][column];
577 for (j=(ssize_t) rank-1; j >= 0; j--)
578 if (columns[j] != rows[j])
579 for (i=0; i < (ssize_t) rank; i++)
646 static inline ssize_t
EdgeX(
const ssize_t x,
const size_t columns)
650 if (x >= (ssize_t) columns)
651 return((ssize_t) (columns-1));
655 static inline ssize_t
EdgeY(
const ssize_t y,
const size_t rows)
659 if (y >= (ssize_t) rows)
660 return((ssize_t) (rows-1));
674 #if !defined(MAGICKCORE_HAVE_PREAD) 676 if (lseek(matrix_info->file,offset,SEEK_SET) < 0)
685 #if !defined(MAGICKCORE_HAVE_PREAD) 686 count=read(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
689 count=pread(matrix_info->file,buffer+i,(
size_t)
MagickMin(length-i,
699 #if !defined(MAGICKCORE_HAVE_PREAD) 706 const ssize_t x,
const ssize_t y,
void *value)
712 assert(matrix_info != (
const MatrixInfo *) NULL);
718 (void) memcpy(value,(
unsigned char *) matrix_info->
elements+i*
723 matrix_info->
stride,(
unsigned char *) value);
753 assert(matrix_info != (
const MatrixInfo *) NULL);
755 return(matrix_info->
rows);
830 const double *terms,
const double *results,
const size_t rank,
831 const size_t number_vectors)
837 for (j=0; j < (ssize_t) rank; j++)
839 for (i=0; i < (ssize_t) rank; i++)
840 matrix[i][j]+=terms[i]*terms[j];
841 for (i=0; i < (ssize_t) number_vectors; i++)
842 vectors[i][j]+=results[i]*terms[j];
892 assert(matrix_info != (
const MatrixInfo *) NULL);
896 if (matrix_info->
stride <
sizeof(
double))
897 return((
Image *) NULL);
903 for (y=0; y < (ssize_t) matrix_info->
rows; y++)
908 for (x=0; x < (ssize_t) matrix_info->
columns; x++)
915 if (value < min_value)
918 if (value > max_value)
922 if ((min_value == 0.0) && (max_value == 0.0))
925 if (min_value == max_value)
931 scale_factor=(double)
QuantumRange/(max_value-min_value);
941 #if defined(MAGICKCORE_OPENMP_SUPPORT) 942 #pragma omp parallel for schedule(static) shared(status) \ 943 magick_number_threads(image,image,image->rows,1) 945 for (y=0; y < (ssize_t) image->
rows; y++)
964 for (x=0; x < (ssize_t) image->
columns; x++)
968 value=scale_factor*(value-min_value);
1015 assert(matrix_info != (
const MatrixInfo *) NULL);
1019 (void) memset(matrix_info->
elements,0,(
size_t)
1024 (void) lseek(matrix_info->
file,0,SEEK_SET);
1025 for (y=0; y < (ssize_t) matrix_info->
rows; y++)
1027 for (x=0; x < (ssize_t) matrix_info->
length; x++)
1029 count=write(matrix_info->
file,&value,
sizeof(value));
1030 if (count != (ssize_t)
sizeof(value))
1033 if (x < (ssize_t) matrix_info->
length)
1067 const size_t number_rows)
1072 if (matrix == (
double **) NULL )
1074 for (i=0; i < (ssize_t) number_rows; i++)
1111 const ssize_t x,
const ssize_t y,
const void *value)
1117 assert(matrix_info != (
const MatrixInfo *) NULL);
1125 (void) memcpy((
unsigned char *) matrix_info->
elements+i*
1130 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)