#include "MagickCore/utility-private.h"
\f
-/*
-** The following test is for special floating point numbers of value NaN (not
-** a number), that may be used within a Kernel Definition. NaN's are defined
-** as part of the IEEE standard for floating point number representation.
-**
-** These are used as a Kernel value to mean that this kernel position is not
-** part of the kernel neighbourhood for convolution or morphology processing,
-** and thus should be ignored. This allows the use of 'shaped' kernels.
-**
-** The special property that two NaN's are never equal, even if they are from
-** the same variable allow you to test if a value is special NaN value.
-**
-** This macro IsNaN() is thus is only true if the value given is NaN.
-*/
-#define IsNan(a) ((a)!=(a))
-
/*
Other global definitions used by module.
*/
/* check actual kernel values */
for (i=0; i < (kernel1->width*kernel1->height); i++) {
/* Test for Nan equivalence */
- if ( IsNan(kernel1->values[i]) && !IsNan(kernel2->values[i]) )
+ if ( IsNaN(kernel1->values[i]) && !IsNaN(kernel2->values[i]) )
return MagickFalse;
- if ( IsNan(kernel2->values[i]) && !IsNan(kernel1->values[i]) )
+ if ( IsNaN(kernel2->values[i]) && !IsNaN(kernel1->values[i]) )
return MagickFalse;
/* Test actual values are equivalent */
if ( fabs(kernel1->values[i] - kernel2->values[i]) >= MagickEpsilon )
** Convolution is just a simple greyscale channel operation
*/
for (v=0; v < (ssize_t) kernel->height; v++) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
result.red += (*k)*GetPixelRed(image,k_pixels);
result.green += (*k)*GetPixelGreen(image,k_pixels);
result.blue += (*k)*GetPixelBlue(image,k_pixels);
count=0;
gamma=0.0;
for (v=0; v < (ssize_t) kernel->height; v++) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
alpha=QuantumScale*GetPixelAlpha(image,k_pixels);
gamma += alpha; /* normalize alpha weights only */
count++; /* number of alpha values collected */
*/
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
result.red += (*k)*
GetPixelRed(image,k_pixels+u*GetPixelChannels(image));
result.green += (*k)*
gamma=0.0;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
alpha=QuantumScale*GetPixelAlpha(image,
k_pixels+u*GetPixelChannels(image));
gamma += alpha; /* normalize alpha weights only */
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k++) {
- if ( IsNan(*k) || (*k) < 0.5 ) continue;
+ if ( IsNaN(*k) || (*k) < 0.5 ) continue;
Minimize(min.red, (double)
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(min.green, (double)
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) || (*k) < 0.5 ) continue;
+ if ( IsNaN(*k) || (*k) < 0.5 ) continue;
Maximize(max.red, (double)
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Maximize(max.green, (double)
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k++) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
if ( (*k) > 0.7 )
{ /* minimim of foreground pixels */
Minimize(min.red, (double)
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k++) {
- if ( IsNan(*k) || (*k) < 0.5 ) continue;
+ if ( IsNaN(*k) || (*k) < 0.5 ) continue;
if ( result.red == 0.0 ||
GetPixelIntensity(image,k_pixels+u*GetPixelChannels(image)) < GetPixelIntensity(morphology_image,q) ) {
/* copy the whole pixel - no channel selection */
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) || (*k) < 0.5 ) continue; /* boolean kernel */
+ if ( IsNaN(*k) || (*k) < 0.5 ) continue; /* boolean kernel */
if ( result.red == 0.0 ||
GetPixelIntensity(image,k_pixels+u*GetPixelChannels(image)) > GetPixelIntensity(morphology_image,q) ) {
/* copy the whole pixel - no channel selection */
k_pixels = p;
for (v=0; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
Minimize(result.red, (*k)+(double)
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(result.green, (*k)+(double)
k_pixels = p;
for (v=0; v <= (ssize_t) offy; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
Minimize(result.red, (*k)+
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(result.green, (*k)+
k_pixels = q-offx*GetPixelChannels(image);
for (u=0; u < (ssize_t) offx; u++, k--) {
if ( x+u-offx < 0 ) continue; /* off the edge! */
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
Minimize(result.red, (*k)+
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(result.green, (*k)+
k_pixels = p;
for (v=0; v <= (ssize_t) offy; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
if( result.alpha > (*k)+GetPixelAlpha(image,k_pixels+u*GetPixelChannels(image)) )
{
GetPixelInfoPixel(image,k_pixels+u*GetPixelChannels(image),
k_pixels = q-offx*GetPixelChannels(image);
for (u=0; u < (ssize_t) offx; u++, k--) {
if ( x+u-offx < 0 ) continue; /* off the edge! */
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
if( result.alpha > (*k)+GetPixelAlpha(image,k_pixels+u*GetPixelChannels(image)) )
{
GetPixelInfoPixel(image,k_pixels+u*GetPixelChannels(image),
k_pixels = p;
for (v=offy; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
Minimize(result.red, (*k)+
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(result.green, (*k)+
k_pixels = q-offx*GetPixelChannels(image);
for (u=offx+1; u < (ssize_t) kernel->width; u++, k--) {
if ( (x+u-offx) >= (ssize_t)image->columns ) continue;
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
Minimize(result.red, (*k)+
GetPixelRed(image,k_pixels+u*GetPixelChannels(image)));
Minimize(result.green, (*k)+
k_pixels = p;
for (v=offy; v < (ssize_t) kernel->height; v++) {
for (u=0; u < (ssize_t) kernel->width; u++, k--) {
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
if( result.alpha > (*k)+GetPixelAlpha(image,k_pixels+u*GetPixelChannels(image)) )
{
GetPixelInfoPixel(image,k_pixels+u*GetPixelChannels(image),
k_pixels = q-offx*GetPixelChannels(image);
for (u=offx+1; u < (ssize_t) kernel->width; u++, k--) {
if ( (x+u-offx) >= (ssize_t)image->columns ) continue;
- if ( IsNan(*k) ) continue;
+ if ( IsNaN(*k) ) continue;
if( result.alpha > (*k)+GetPixelAlpha(image,k_pixels+u*GetPixelChannels(image)) )
{
GetPixelInfoPixel(image,k_pixels+u*GetPixelChannels(image),
neg_scale = scaling_factor/neg_scale;
for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++)
- if ( ! IsNan(kernel->values[i]) )
+ if ( ! IsNaN(kernel->values[i]) )
kernel->values[i] *= (kernel->values[i] >= 0) ? pos_scale : neg_scale;
/* convolution output range */
for (i=v=0; v < k->height; v++) {
(void) FormatLocaleFile(stderr, "%2lu:", (unsigned long) v );
for (u=0; u < k->width; u++, i++)
- if ( IsNan(k->values[i]) )
+ if ( IsNaN(k->values[i]) )
(void) FormatLocaleFile(stderr," %*s", GetMagickPrecision()+3, "nan");
else
(void) FormatLocaleFile(stderr," %*.*lg", GetMagickPrecision()+3,
ZeroKernelNans(kernel->next);
for (i=0; i < (kernel->width*kernel->height); i++)
- if ( IsNan(kernel->values[i]) )
+ if ( IsNaN(kernel->values[i]) )
kernel->values[i] = 0.0;
return;