Example #1
0
        private ILayerMasked merge(IBlendModeAlpha ablend, ILayerMasked baseLayer, IList <DescribedLayer> pars)
        {
            onMergeStarted();
            if (pars == null || pars.Count == 0)
            {
                throw new ArgumentException();
            }

            var final = baseLayer;

            foreach (var describ in pars)
            {
                var current   = describ.Layer;
                var blendMode = describ.GlobalParameters.BlendMode;
                var offset    = describ.GlobalParameters.Offset - .5f;

                var minY = JryMath.Max(0, -current.Offset.Y);
                var minX = JryMath.Max(0, -current.Offset.X);
                var maxY = JryMath.Min(current.Resolution.Y, final.Resolution.Y - current.Offset.Y);
                var maxX = JryMath.Min(current.Resolution.X, final.Resolution.X - current.Offset.X);
                for (int y = minY; y < maxY; y++)
                {
                    for (int x = minX; x < maxX; x++)
                    {
                        int ix = x + current.Offset.X;
                        int iy = y + current.Offset.Y;


                        var curVal = current[x, y];
                        if (!curVal.HasValue || !final[ix, iy].HasValue || !current.HasMask)
                        {
                            continue;
                        }
                        var maskValue = current.Mask[x, y];
                        if (!maskValue.HasValue)
                        {
                            continue;
                        }


                        var currentLayerValue     = curVal.Value + offset;
                        var currentLayerMaskValue = maskValue.Value;
                        //currentLayerMaskValue = 1;
                        var upToThisPointGeneratedLayerValue = final[ix, iy].Value;


                        var blended = blendMode.Blend(upToThisPointGeneratedLayerValue, currentLayerValue * currentLayerMaskValue);
                        final[ix, iy] = ablend.Blend(upToThisPointGeneratedLayerValue, blended, currentLayerMaskValue);
                        if (final[ix, iy] > 0.05f)
                        {
                        }
                    }
                }
            }

            return(baseLayer);
        }