}
}
+static inline void CompositeDarkenIntensity(const MagickPixelPacket *p,
+ const MagickPixelPacket *q,const ChannelType channel,
+ MagickPixelPacket *composite)
+{
+ /*
+ Select the pixel based on the intensity level.
+ If 'Sync' flag select whole pixel based on alpha weighted intensity.
+ Otherwise use Intenisty only, but restrict copy according to channel.
+ */
+ if ( (channel & SyncChannels) != 0 ) {
+ MagickRealType
+ Da,
+ Sa;
+
+ Sa=1.0-QuantumScale*p->opacity;
+ Da=1.0-QuantumScale*q->opacity;
+ *composite = (Sa*MagickPixelIntensity(p) < Da*MagickPixelIntensity(q))
+ ? *p : *q;
+ }
+ else {
+ int from_p = (MagickPixelIntensity(p) < MagickPixelIntensity(q));
+ if ( (channel & AlphaChannel) != 0 )
+ composite->opacity = from_p ? p->opacity : q->opacity;
+ if ( (channel & RedChannel) != 0 )
+ composite->red = from_p ? p->red : q->red;
+ if ( (channel & GreenChannel) != 0 )
+ composite->green = from_p ? p->green : q->green;
+ if ( (channel & BlueChannel) != 0 )
+ composite->blue = from_p ? p->blue : q->blue;
+ if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+ composite->index = from_p ? p->index : q->index;
+ }
+}
+
static inline MagickRealType Difference(const MagickRealType p,
const MagickRealType Sa,const MagickRealType q,const MagickRealType Da)
{
}
}
+static inline void CompositeLightenIntensity(const MagickPixelPacket *p,
+ const MagickPixelPacket *q,const ChannelType channel,
+ MagickPixelPacket *composite)
+{
+ /*
+ Select the pixel based on the intensity level.
+ If 'Sync' flag select whole pixel based on alpha weighted intensity.
+ Otherwise use Intenisty only, but restrict copy according to channel.
+ */
+ if ( (channel & SyncChannels) != 0 ) {
+ MagickRealType
+ Da,
+ Sa;
+
+ Sa=1.0-QuantumScale*p->opacity;
+ Da=1.0-QuantumScale*q->opacity;
+ *composite = (Sa*MagickPixelIntensity(p) > Da*MagickPixelIntensity(q))
+ ? *p : *q;
+ }
+ else {
+ int from_p = (MagickPixelIntensity(p) > MagickPixelIntensity(q));
+ if ( (channel & AlphaChannel) != 0 )
+ composite->opacity = from_p ? p->opacity : q->opacity;
+ if ( (channel & RedChannel) != 0 )
+ composite->red = from_p ? p->red : q->red;
+ if ( (channel & GreenChannel) != 0 )
+ composite->green = from_p ? p->green : q->green;
+ if ( (channel & BlueChannel) != 0 )
+ composite->blue = from_p ? p->blue : q->blue;
+ if ( (channel & IndexChannel) != 0 && q->colorspace == CMYKColorspace)
+ composite->index = from_p ? p->index : q->index;
+ }
+}
+
#if 0
static inline MagickRealType LinearDodge(const MagickRealType Sca,
const MagickRealType Sa,const MagickRealType Dca,const MagickRealType Da)
CompositeLighten(&source,&destination,channel,&composite);
break;
}
+ case DarkenIntensityCompositeOp:
+ {
+ CompositeDarkenIntensity(&source,&destination,channel,&composite);
+ break;
+ }
+ case LightenIntensityCompositeOp:
+ {
+ CompositeLightenIntensity(&source,&destination,channel,&composite);
+ break;
+ }
case MathematicsCompositeOp:
{
CompositeMathematics(&source,&destination,channel,&geometry_info,
{ "CopyRed", (ssize_t) CopyRedCompositeOp, MagickFalse },
{ "CopyYellow", (ssize_t) CopyYellowCompositeOp, MagickFalse },
{ "Darken", (ssize_t) DarkenCompositeOp, MagickFalse },
+ { "DarkenIntensity", (ssize_t) DarkenIntensityCompositeOp, MagickFalse },
{ "DivideDst", (ssize_t) DivideDstCompositeOp, MagickFalse },
{ "DivideSrc", (ssize_t) DivideSrcCompositeOp, MagickFalse },
{ "Dst", (ssize_t) DstCompositeOp, MagickFalse },
{ "Hue", (ssize_t) HueCompositeOp, MagickFalse },
{ "In", (ssize_t) InCompositeOp, MagickFalse },
{ "Lighten", (ssize_t) LightenCompositeOp, MagickFalse },
+ { "LightenIntensity", (ssize_t) LightenIntensityCompositeOp, MagickFalse },
{ "LinearBurn", (ssize_t) LinearBurnCompositeOp, MagickFalse },
{ "LinearDodge", (ssize_t) LinearDodgeCompositeOp, MagickFalse },
{ "LinearLight", (ssize_t) LinearLightCompositeOp, MagickFalse },