public ICanvasImage GetRegionMask()
{
// Do we already have a cached version of this mask?
ICanvasImage mask = cachedRegionMask.Get(regionFeather, regionDilate);
if (mask == null)
{
mask = regionMask;
// Expand or contract the selection?
if (regionDilate != 0)
{
mask = new MorphologyEffect
{
Source = new BorderEffect { Source = mask },
Mode = (regionDilate > 0) ? MorphologyEffectMode.Dilate : MorphologyEffectMode.Erode,
Height = Math.Abs(regionDilate),
Width = Math.Abs(regionDilate)
};
}
// Feather the selection?
if (regionFeather > 0)
{
mask = new GaussianBlurEffect
{
Source = mask,
BlurAmount = regionFeather,
BorderMode = EffectBorderMode.Hard
};
}
// If this mask was expensive to compute, cache it now.
if (mask != regionMask)
{
mask = cachedRegionMask.Cache(Parent, mask, regionFeather, regionDilate);
}
}
return mask;
}