311
312
register const double
320
i=(long) (width*QuantumScale*PixelIntensity(r)+0.5);
321
i=(ssize_t) ceil((double) width*QuantumScale*PixelIntensity(r)-0.5);
324
if (i > (long) width)
325
if (i > (ssize_t) width)
326
327
if ((i & 0x01) != 0)
328
p=GetCacheViewVirtualPixels(image_view,x-((long) (width-i)/2L),y-(long)
329
p=GetCacheViewVirtualPixels(image_view,x-((ssize_t) (width-i)/2L),y-(ssize_t)
329
330
((width-i)/2L),width-i,width-i,exception);
330
331
if (p == (const PixelPacket *) NULL)
332
333
indexes=GetCacheViewVirtualIndexQueue(image_view);
335
for (v=0; v < (long) (width-i); v++)
336
for (v=0; v < (ssize_t) (width-i); v++)
337
for (u=0; u < (long) (width-i); u++)
338
for (u=0; u < (ssize_t) (width-i); u++)
340
341
if (((channel & OpacityChannel) != 0) &&
341
342
(image->matte != MagickFalse))
342
alpha=(MagickRealType) (QuantumScale*(QuantumRange-p->opacity));
343
alpha=(MagickRealType) (QuantumScale*GetAlphaPixelComponent(p));
343
344
if ((channel & RedChannel) != 0)
344
pixel.red+=(*k)*alpha*p->red;
345
pixel.red+=(*k)*alpha*GetRedPixelComponent(p);
345
346
if ((channel & GreenChannel) != 0)
346
pixel.green+=(*k)*alpha*p->green;
347
pixel.green+=(*k)*alpha*GetGreenPixelComponent(p);
347
348
if ((channel & BlueChannel) != 0)
348
pixel.blue+=(*k)*alpha*p->blue;
349
pixel.blue+=(*k)*alpha*GetBluePixelComponent(p);
349
350
if ((channel & OpacityChannel) != 0)
350
pixel.opacity+=(*k)*p->opacity;
351
pixel.opacity+=(*k)*GetOpacityPixelComponent(p);
351
352
if (((channel & IndexChannel) != 0) &&
352
353
(image->colorspace == CMYKColorspace))
353
354
pixel.index+=(*k)*alpha*indexes[x+(width-i)*v+u];
628
629
register const double
637
i=(long) (width*(QuantumRange-QuantumScale*PixelIntensity(r))+0.5);
638
i=(ssize_t) ceil((double) width*(QuantumRange-QuantumScale*
639
PixelIntensity(r))-0.5);
641
if (i > (long) width)
643
if (i > (ssize_t) width)
643
645
if ((i & 0x01) != 0)
645
p=GetCacheViewVirtualPixels(image_view,x-((long) (width-i)/2L),y-(long)
647
p=GetCacheViewVirtualPixels(image_view,x-((ssize_t) (width-i)/2L),y-(ssize_t)
646
648
((width-i)/2L),width-i,width-i,exception);
647
649
if (p == (const PixelPacket *) NULL)
649
651
indexes=GetCacheViewVirtualIndexQueue(image_view);
652
for (v=0; v < (long) (width-i); v++)
654
for (v=0; v < (ssize_t) (width-i); v++)
654
for (u=0; u < (long) (width-i); u++)
656
for (u=0; u < (ssize_t) (width-i); u++)
657
659
if (((channel & OpacityChannel) != 0) &&
658
660
(image->matte != MagickFalse))
659
alpha=(MagickRealType) (QuantumScale*(QuantumRange-p->opacity));
661
alpha=(MagickRealType) (QuantumScale*GetAlphaPixelComponent(p));
660
662
if ((channel & RedChannel) != 0)
661
pixel.red+=(*k)*alpha*p->red;
663
pixel.red+=(*k)*alpha*GetRedPixelComponent(p);
662
664
if ((channel & GreenChannel) != 0)
663
pixel.green+=(*k)*alpha*p->green;
665
pixel.green+=(*k)*alpha*GetGreenPixelComponent(p);
664
666
if ((channel & BlueChannel) != 0)
665
pixel.blue+=(*k)*alpha*p->blue;
667
pixel.blue+=(*k)*alpha*GetBluePixelComponent(p);
666
668
if ((channel & OpacityChannel) != 0)
667
pixel.opacity+=(*k)*p->opacity;
669
pixel.opacity+=(*k)*GetOpacityPixelComponent(p);
668
670
if (((channel & IndexChannel) != 0) &&
669
671
(image->colorspace == CMYKColorspace))
670
672
pixel.index+=(*k)*alpha*indexes[x+(width-i)*v+u];
1270
% C o n v o l v e I m a g e %
1274
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1276
% ConvolveImage() applies a custom convolution kernel to the image.
1278
% The format of the ConvolveImage method is:
1280
% Image *ConvolveImage(const Image *image,const size_t order,
1281
% const double *kernel,ExceptionInfo *exception)
1282
% Image *ConvolveImageChannel(const Image *image,const ChannelType channel,
1283
% const size_t order,const double *kernel,
1284
% ExceptionInfo *exception)
1286
% A description of each parameter follows:
1288
% o image: the image.
1290
% o channel: the channel type.
1292
% o order: the number of columns and rows in the filter kernel.
1294
% o kernel: An array of double representing the convolution kernel.
1296
% o exception: return any errors or warnings in this structure.
1300
MagickExport Image *ConvolveImage(const Image *image,const size_t order,
1301
const double *kernel,ExceptionInfo *exception)
1306
convolve_image=ConvolveImageChannel(image,DefaultChannels,order,kernel,
1308
return(convolve_image);
1311
MagickExport Image *ConvolveImageChannel(const Image *image,
1312
const ChannelType channel,const size_t order,const double *kernel,
1313
ExceptionInfo *exception)
1315
#define ConvolveImageTag "Convolve/Image"
1349
Initialize convolve image attributes.
1351
assert(image != (Image *) NULL);
1352
assert(image->signature == MagickSignature);
1353
if (image->debug != MagickFalse)
1354
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1355
assert(exception != (ExceptionInfo *) NULL);
1356
assert(exception->signature == MagickSignature);
1358
if ((width % 2) == 0)
1359
ThrowImageException(OptionError,"KernelWidthMustBeAnOddNumber");
1360
convolve_image=CloneImage(image,0,0,MagickTrue,exception);
1361
if (convolve_image == (Image *) NULL)
1362
return((Image *) NULL);
1363
if (SetImageStorageClass(convolve_image,DirectClass) == MagickFalse)
1365
InheritException(exception,&convolve_image->exception);
1366
convolve_image=DestroyImage(convolve_image);
1367
return((Image *) NULL);
1369
if (image->debug != MagickFalse)
1372
format[MaxTextExtent],
1379
register const double
1382
(void) LogMagickEvent(TransformEvent,GetMagickModule(),
1383
" ConvolveImage with %.20gx%.20g kernel:",(double) width,(double)
1385
message=AcquireString("");
1387
for (v=0; v < (ssize_t) width; v++)
1390
(void) FormatMagickString(format,MaxTextExtent,"%.20g: ",(double) v);
1391
(void) ConcatenateString(&message,format);
1392
for (u=0; u < (ssize_t) width; u++)
1394
(void) FormatMagickString(format,MaxTextExtent,"%g ",*k++);
1395
(void) ConcatenateString(&message,format);
1397
(void) LogMagickEvent(TransformEvent,GetMagickModule(),"%s",message);
1399
message=DestroyString(message);
1404
normal_kernel=(double *) AcquireQuantumMemory(width*width,
1405
sizeof(*normal_kernel));
1406
if (normal_kernel == (double *) NULL)
1408
convolve_image=DestroyImage(convolve_image);
1409
ThrowImageException(ResourceLimitError,"MemoryAllocationFailed");
1412
for (i=0; i < (ssize_t) (width*width); i++)
1414
gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
1415
for (i=0; i < (ssize_t) (width*width); i++)
1416
normal_kernel[i]=gamma*kernel[i];
1422
GetMagickPixelPacket(image,&bias);
1423
SetMagickPixelPacketBias(image,&bias);
1424
image_view=AcquireCacheView(image);
1425
convolve_view=AcquireCacheView(convolve_image);
1426
#if defined(MAGICKCORE_OPENMP_SUPPORT)
1427
#pragma omp parallel for schedule(dynamic,4) shared(progress,status)
1429
for (y=0; y < (ssize_t) image->rows; y++)
1434
register const IndexPacket
1437
register const PixelPacket
1440
register IndexPacket
1441
*restrict convolve_indexes;
1446
register PixelPacket
1449
if (status == MagickFalse)
1451
p=GetCacheViewVirtualPixels(image_view,-((ssize_t) width/2L),y-(ssize_t) (width/
1452
2L),image->columns+width,width,exception);
1453
q=GetCacheViewAuthenticPixels(convolve_view,0,y,convolve_image->columns,1,
1455
if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
1460
indexes=GetCacheViewVirtualIndexQueue(image_view);
1461
convolve_indexes=GetCacheViewAuthenticIndexQueue(convolve_view);
1462
for (x=0; x < (ssize_t) image->columns; x++)
1470
register const double
1473
register const PixelPacket
1474
*restrict kernel_pixels;
1482
if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse))
1484
for (v=0; v < (ssize_t) width; v++)
1486
for (u=0; u < (ssize_t) width; u++)
1488
pixel.red+=(*k)*kernel_pixels[u].red;
1489
pixel.green+=(*k)*kernel_pixels[u].green;
1490
pixel.blue+=(*k)*kernel_pixels[u].blue;
1493
kernel_pixels+=image->columns+width;
1495
if ((channel & RedChannel) != 0)
1496
SetRedPixelComponent(q,ClampRedPixelComponent(&pixel));
1497
if ((channel & GreenChannel) != 0)
1498
SetGreenPixelComponent(q,ClampGreenPixelComponent(&pixel));
1499
if ((channel & BlueChannel) != 0)
1500
SetBluePixelComponent(q,ClampBluePixelComponent(&pixel));
1501
if ((channel & OpacityChannel) != 0)
1505
for (v=0; v < (ssize_t) width; v++)
1507
for (u=0; u < (ssize_t) width; u++)
1509
pixel.opacity+=(*k)*kernel_pixels[u].opacity;
1512
kernel_pixels+=image->columns+width;
1514
SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
1516
if (((channel & IndexChannel) != 0) &&
1517
(image->colorspace == CMYKColorspace))
1519
register const IndexPacket
1520
*restrict kernel_indexes;
1523
kernel_indexes=indexes;
1524
for (v=0; v < (ssize_t) width; v++)
1526
for (u=0; u < (ssize_t) width; u++)
1528
pixel.index+=(*k)*kernel_indexes[u];
1531
kernel_indexes+=image->columns+width;
1533
convolve_indexes[x]=ClampToQuantum(pixel.index);
1543
for (v=0; v < (ssize_t) width; v++)
1545
for (u=0; u < (ssize_t) width; u++)
1547
alpha=(MagickRealType) (QuantumScale*(QuantumRange-
1548
kernel_pixels[u].opacity));
1549
pixel.red+=(*k)*alpha*kernel_pixels[u].red;
1550
pixel.green+=(*k)*alpha*kernel_pixels[u].green;
1551
pixel.blue+=(*k)*alpha*kernel_pixels[u].blue;
1555
kernel_pixels+=image->columns+width;
1557
gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
1558
if ((channel & RedChannel) != 0)
1559
q->red=ClampToQuantum(gamma*GetRedPixelComponent(&pixel));
1560
if ((channel & GreenChannel) != 0)
1561
q->green=ClampToQuantum(gamma*GetGreenPixelComponent(&pixel));
1562
if ((channel & BlueChannel) != 0)
1563
q->blue=ClampToQuantum(gamma*GetBluePixelComponent(&pixel));
1564
if ((channel & OpacityChannel) != 0)
1568
for (v=0; v < (ssize_t) width; v++)
1570
for (u=0; u < (ssize_t) width; u++)
1572
pixel.opacity+=(*k)*kernel_pixels[u].opacity;
1575
kernel_pixels+=image->columns+width;
1577
SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
1579
if (((channel & IndexChannel) != 0) &&
1580
(image->colorspace == CMYKColorspace))
1582
register const IndexPacket
1583
*restrict kernel_indexes;
1587
kernel_indexes=indexes;
1588
for (v=0; v < (ssize_t) width; v++)
1590
for (u=0; u < (ssize_t) width; u++)
1592
alpha=(MagickRealType) (QuantumScale*(QuantumRange-
1593
kernel_pixels[u].opacity));
1594
pixel.index+=(*k)*alpha*kernel_indexes[u];
1597
kernel_pixels+=image->columns+width;
1598
kernel_indexes+=image->columns+width;
1600
convolve_indexes[x]=ClampToQuantum(gamma*
1601
GetIndexPixelComponent(&pixel));
1607
sync=SyncCacheViewAuthenticPixels(convolve_view,exception);
1608
if (sync == MagickFalse)
1610
if (image->progress_monitor != (MagickProgressMonitor) NULL)
1615
#if defined(MAGICKCORE_OPENMP_SUPPORT)
1616
#pragma omp critical (MagickCore_ConvolveImageChannel)
1618
proceed=SetImageProgress(image,ConvolveImageTag,progress++,image->rows);
1619
if (proceed == MagickFalse)
1623
convolve_image->type=image->type;
1624
convolve_view=DestroyCacheView(convolve_view);
1625
image_view=DestroyCacheView(image_view);
1626
normal_kernel=(double *) RelinquishMagickMemory(normal_kernel);
1627
if (status == MagickFalse)
1628
convolve_image=DestroyImage(convolve_image);
1629
return(convolve_image);
1633
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1269
1637
% D e s p e c k l e I m a g e %
2134
% F i l t e r I m a g e %
2138
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2140
% FilterImage() applies a custom convolution kernel to the image.
2142
% The format of the FilterImage method is:
2144
% Image *FilterImage(const Image *image,const KernelInfo *kernel,
2145
% ExceptionInfo *exception)
2146
% Image *FilterImageChannel(const Image *image,const ChannelType channel,
2147
% const KernelInfo *kernel,ExceptionInfo *exception)
2149
% A description of each parameter follows:
2151
% o image: the image.
2153
% o channel: the channel type.
2155
% o kernel: the filtering kernel.
2157
% o exception: return any errors or warnings in this structure.
2161
MagickExport Image *FilterImage(const Image *image,const KernelInfo *kernel,
2162
ExceptionInfo *exception)
2167
filter_image=FilterImageChannel(image,DefaultChannels,kernel,exception);
2168
return(filter_image);
2171
MagickExport Image *FilterImageChannel(const Image *image,
2172
const ChannelType channel,const KernelInfo *kernel,ExceptionInfo *exception)
2174
#define FilterImageTag "Filter/Image"
2196
Initialize filter image attributes.
2198
assert(image != (Image *) NULL);
2199
assert(image->signature == MagickSignature);
2200
if (image->debug != MagickFalse)
2201
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
2202
assert(exception != (ExceptionInfo *) NULL);
2203
assert(exception->signature == MagickSignature);
2204
if ((kernel->width % 2) == 0)
2205
ThrowImageException(OptionError,"KernelWidthMustBeAnOddNumber");
2206
filter_image=CloneImage(image,0,0,MagickTrue,exception);
2207
if (filter_image == (Image *) NULL)
2208
return((Image *) NULL);
2209
if (SetImageStorageClass(filter_image,DirectClass) == MagickFalse)
2211
InheritException(exception,&filter_image->exception);
2212
filter_image=DestroyImage(filter_image);
2213
return((Image *) NULL);
2215
if (image->debug != MagickFalse)
2218
format[MaxTextExtent],
2225
register const double
2228
(void) LogMagickEvent(TransformEvent,GetMagickModule(),
2229
" FilterImage with %.20gx%.20g kernel:",(double) kernel->width,(double)
2231
message=AcquireString("");
2233
for (v=0; v < (ssize_t) kernel->height; v++)
2236
(void) FormatMagickString(format,MaxTextExtent,"%.20g: ",(double) v);
2237
(void) ConcatenateString(&message,format);
2238
for (u=0; u < (ssize_t) kernel->width; u++)
2240
(void) FormatMagickString(format,MaxTextExtent,"%g ",*k++);
2241
(void) ConcatenateString(&message,format);
2243
(void) LogMagickEvent(TransformEvent,GetMagickModule(),"%s",message);
2245
message=DestroyString(message);
2247
status=AccelerateConvolveImage(image,kernel,filter_image,exception);
2248
if (status == MagickTrue)
2249
return(filter_image);
2255
GetMagickPixelPacket(image,&bias);
2256
SetMagickPixelPacketBias(image,&bias);
2257
image_view=AcquireCacheView(image);
2258
filter_view=AcquireCacheView(filter_image);
2259
#if defined(MAGICKCORE_OPENMP_SUPPORT)
2260
#pragma omp parallel for schedule(dynamic,4) shared(progress,status)
2262
for (y=0; y < (ssize_t) image->rows; y++)
2267
register const IndexPacket
2270
register const PixelPacket
2273
register IndexPacket
2274
*restrict filter_indexes;
2279
register PixelPacket
2282
if (status == MagickFalse)
2284
p=GetCacheViewVirtualPixels(image_view,-((ssize_t) kernel->width/2L),
2285
y-(ssize_t) (kernel->height/2L),image->columns+kernel->width,kernel->height,
2287
q=GetCacheViewAuthenticPixels(filter_view,0,y,filter_image->columns,1,
2289
if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
2294
indexes=GetCacheViewVirtualIndexQueue(image_view);
2295
filter_indexes=GetCacheViewAuthenticIndexQueue(filter_view);
2296
for (x=0; x < (ssize_t) image->columns; x++)
2304
register const double
2307
register const PixelPacket
2308
*restrict kernel_pixels;
2316
if (((channel & OpacityChannel) == 0) || (image->matte == MagickFalse))
2318
for (v=0; v < (ssize_t) kernel->width; v++)
2320
for (u=0; u < (ssize_t) kernel->height; u++)
2322
pixel.red+=(*k)*kernel_pixels[u].red;
2323
pixel.green+=(*k)*kernel_pixels[u].green;
2324
pixel.blue+=(*k)*kernel_pixels[u].blue;
2327
kernel_pixels+=image->columns+kernel->width;
2329
if ((channel & RedChannel) != 0)
2330
SetRedPixelComponent(q,ClampRedPixelComponent(&pixel));
2331
if ((channel & GreenChannel) != 0)
2332
SetGreenPixelComponent(q,ClampGreenPixelComponent(&pixel));
2333
if ((channel & BlueChannel) != 0)
2334
SetBluePixelComponent(q,ClampBluePixelComponent(&pixel));
2335
if ((channel & OpacityChannel) != 0)
2339
for (v=0; v < (ssize_t) kernel->width; v++)
2341
for (u=0; u < (ssize_t) kernel->height; u++)
2343
pixel.opacity+=(*k)*kernel_pixels[u].opacity;
2346
kernel_pixels+=image->columns+kernel->width;
2348
SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
2350
if (((channel & IndexChannel) != 0) &&
2351
(image->colorspace == CMYKColorspace))
2353
register const IndexPacket
2354
*restrict kernel_indexes;
2357
kernel_indexes=indexes;
2358
for (v=0; v < (ssize_t) kernel->width; v++)
2360
for (u=0; u < (ssize_t) kernel->height; u++)
2362
pixel.index+=(*k)*kernel_indexes[u];
2365
kernel_indexes+=image->columns+kernel->width;
2367
filter_indexes[x]=ClampToQuantum(pixel.index);
2377
for (v=0; v < (ssize_t) kernel->width; v++)
2379
for (u=0; u < (ssize_t) kernel->height; u++)
2381
alpha=(MagickRealType) (QuantumScale*(QuantumRange-
2382
kernel_pixels[u].opacity));
2383
pixel.red+=(*k)*alpha*kernel_pixels[u].red;
2384
pixel.green+=(*k)*alpha*kernel_pixels[u].green;
2385
pixel.blue+=(*k)*alpha*kernel_pixels[u].blue;
2389
kernel_pixels+=image->columns+kernel->width;
2391
gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
2392
if ((channel & RedChannel) != 0)
2393
q->red=ClampToQuantum(gamma*GetRedPixelComponent(&pixel));
2394
if ((channel & GreenChannel) != 0)
2395
q->green=ClampToQuantum(gamma*GetGreenPixelComponent(&pixel));
2396
if ((channel & BlueChannel) != 0)
2397
q->blue=ClampToQuantum(gamma*GetBluePixelComponent(&pixel));
2398
if ((channel & OpacityChannel) != 0)
2402
for (v=0; v < (ssize_t) kernel->width; v++)
2404
for (u=0; u < (ssize_t) kernel->height; u++)
2406
pixel.opacity+=(*k)*kernel_pixels[u].opacity;
2409
kernel_pixels+=image->columns+kernel->width;
2411
SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
2413
if (((channel & IndexChannel) != 0) &&
2414
(image->colorspace == CMYKColorspace))
2416
register const IndexPacket
2417
*restrict kernel_indexes;
2421
kernel_indexes=indexes;
2422
for (v=0; v < (ssize_t) kernel->width; v++)
2424
for (u=0; u < (ssize_t) kernel->height; u++)
2426
alpha=(MagickRealType) (QuantumScale*(QuantumRange-
2427
kernel_pixels[u].opacity));
2428
pixel.index+=(*k)*alpha*kernel_indexes[u];
2431
kernel_pixels+=image->columns+kernel->width;
2432
kernel_indexes+=image->columns+kernel->width;
2434
filter_indexes[x]=ClampToQuantum(gamma*
2435
GetIndexPixelComponent(&pixel));
2441
sync=SyncCacheViewAuthenticPixels(filter_view,exception);
2442
if (sync == MagickFalse)
2444
if (image->progress_monitor != (MagickProgressMonitor) NULL)
2449
#if defined(MAGICKCORE_OPENMP_SUPPORT)
2450
#pragma omp critical (MagickCore_FilterImageChannel)
2452
proceed=SetImageProgress(image,FilterImageTag,progress++,image->rows);
2453
if (proceed == MagickFalse)
2457
filter_image->type=image->type;
2458
filter_view=DestroyCacheView(filter_view);
2459
image_view=DestroyCacheView(image_view);
2460
if (status == MagickFalse)
2461
filter_image=DestroyImage(filter_image);
2462
return(filter_image);
2466
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1766
2470
% G a u s s i a n B l u r I m a g e %
4678
5392
indexes=GetCacheViewVirtualIndexQueue(image_view);
4679
5393
unsharp_indexes=GetCacheViewAuthenticIndexQueue(unsharp_view);
4681
for (x=0; x < (long) image->columns; x++)
5395
for (x=0; x < (ssize_t) image->columns; x++)
4683
5397
if ((channel & RedChannel) != 0)
4685
5399
pixel.red=p->red-(MagickRealType) q->red;
4686
5400
if (fabs(2.0*pixel.red) < quantum_threshold)
4687
pixel.red=(MagickRealType) p->red;
5401
pixel.red=(MagickRealType) GetRedPixelComponent(p);
4689
5403
pixel.red=(MagickRealType) p->red+(pixel.red*amount);
4690
q->red=RoundToQuantum(pixel.red);
5404
SetRedPixelComponent(q,ClampRedPixelComponent(&pixel));
4692
5406
if ((channel & GreenChannel) != 0)
4694
5408
pixel.green=p->green-(MagickRealType) q->green;
4695
5409
if (fabs(2.0*pixel.green) < quantum_threshold)
4696
pixel.green=(MagickRealType) p->green;
5410
pixel.green=(MagickRealType) GetGreenPixelComponent(p);
4698
5412
pixel.green=(MagickRealType) p->green+(pixel.green*amount);
4699
q->green=RoundToQuantum(pixel.green);
5413
SetGreenPixelComponent(q,ClampGreenPixelComponent(&pixel));
4701
5415
if ((channel & BlueChannel) != 0)
4703
5417
pixel.blue=p->blue-(MagickRealType) q->blue;
4704
5418
if (fabs(2.0*pixel.blue) < quantum_threshold)
4705
pixel.blue=(MagickRealType) p->blue;
5419
pixel.blue=(MagickRealType) GetBluePixelComponent(p);
4707
5421
pixel.blue=(MagickRealType) p->blue+(pixel.blue*amount);
4708
q->blue=RoundToQuantum(pixel.blue);
5422
SetBluePixelComponent(q,ClampBluePixelComponent(&pixel));
4710
5424
if ((channel & OpacityChannel) != 0)
4712
5426
pixel.opacity=p->opacity-(MagickRealType) q->opacity;
4713
5427
if (fabs(2.0*pixel.opacity) < quantum_threshold)
4714
pixel.opacity=(MagickRealType) p->opacity;
5428
pixel.opacity=(MagickRealType) GetOpacityPixelComponent(p);
4716
5430
pixel.opacity=p->opacity+(pixel.opacity*amount);
4717
q->opacity=RoundToQuantum(pixel.opacity);
5431
SetOpacityPixelComponent(q,ClampOpacityPixelComponent(&pixel));
4719
5433
if (((channel & IndexChannel) != 0) &&
4720
5434
(image->colorspace == CMYKColorspace))