protected override bool TryPrepareLensBlurProperties()
        {
            var focusBand = GetBandFromHorizonLine(HorizonPoint1, HorizonPoint2);

            var sourceSize = GetSourceSize();

            m_kernelGeneratorEdge1.SourceSize = sourceSize;
            m_kernelGeneratorEdge2.SourceSize = sourceSize;

            var kernelCount = Quality == DepthOfFieldQuality.Full ? 5 : 1;

            m_kernelGeneratorEdge1.KernelCount = kernelCount;
            m_kernelGeneratorEdge2.KernelCount = kernelCount;

            var kernelGeneratorAbove = m_kernelGeneratorEdge1;
            var kernelGeneratorBelow = m_kernelGeneratorEdge2;

            if (focusBand.Edge1.Y > focusBand.Edge2.Y)
            {
                kernelGeneratorAbove = m_kernelGeneratorEdge2;
                kernelGeneratorBelow = m_kernelGeneratorEdge1;
            }

            bool kernelGeneratorsAreDirty = m_kernelGeneratorEdge1.IsDirty || m_kernelGeneratorEdge2.IsDirty;

            var  kernelBands         = kernelGeneratorBelow.GetKernelBands(kernelGeneratorAbove.GetKernelBands());
            bool blurShouldBeApplied = kernelBands.Count > 0;

            if (IsDirty || kernelGeneratorsAreDirty || m_horizonPoint1.IsDirty || m_horizonPoint2.IsDirty || m_objectMaskSource.IsDirty)
            {
                bool applySmallBlurToFocus = kernelGeneratorAbove.GetKernelBands() != null && kernelGeneratorBelow.GetKernelBands() != null;

                var kernels = kernelBands.Select(band => band.Kernel).ToList();

                if (kernels.Count > 0)
                {
                    var gradient = LensTiltFocusGradientGenerator.GenerateGradient(focusBand, sourceSize, kernelGeneratorBelow, kernelGeneratorAbove, applySmallBlurToFocus);
                    KernelMapSource = FocusObjectKernelMapGenerator.Generate(ObjectMaskSource, gradient, GetKernelMapSize(), kernels);

                    LensBlurEffect.Kernels                = kernels;
                    LensBlurEffect.KernelMapType          = LensBlurKernelMapType.Continuous;
                    LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.On;
                    LensBlurEffect.FocusEdgeSoftening     = new LensBlurFocusEdgeSoftening(LensBlurFocusEdgeSofteningMode.Low);
                }
            }

            m_objectMaskSource.Reset();
            m_horizonPoint1.Reset();
            m_horizonPoint2.Reset();

            return(blurShouldBeApplied);
        }
示例#2
0
        protected override bool TryPrepareLensBlurProperties()
        {
            var kernelCount = Quality == DepthOfFieldQuality.Full ? 5 : 1;

            m_edge1KernelGenerator.KernelCount = kernelCount;
            m_edge2KernelGenerator.KernelCount = kernelCount;

            var sourceSize = GetSourceSize();

            m_edge1KernelGenerator.SourceSize = sourceSize;
            m_edge2KernelGenerator.SourceSize = sourceSize;

            var kernels = LensBlurEffect.Kernels;

            var kernelGeneratorsAreDirty = m_edge1KernelGenerator.IsDirty || m_edge2KernelGenerator.IsDirty;

            var  kernelBands         = m_edge2KernelGenerator.GetKernelBands(m_edge1KernelGenerator.GetKernelBands());
            bool blurShouldBeApplied = kernelBands.Count > 0;

            if (IsDirty || kernelGeneratorsAreDirty)
            {
                kernels = kernelBands.Select(band => band.Kernel).ToList();

                if (kernels.Count > 0)
                {
                    LensBlurEffect.Kernels = kernels;
                    blurShouldBeApplied    = true;
                }
            }

            if (blurShouldBeApplied && (IsDirty || kernelGeneratorsAreDirty || m_focusBand.IsDirty))
            {
                var gradient = LensTiltFocusGradientGenerator.GenerateGradient(FocusBand, sourceSize, m_edge1KernelGenerator, m_edge2KernelGenerator, false);
                KernelMapSource = new GradientImageSource(GetKernelMapSize(), gradient);

                LensBlurEffect.KernelMapType          = LensBlurKernelMapType.Continuous;
                LensBlurEffect.FocusAreaEdgeMirroring = LensBlurFocusAreaEdgeMirroring.Off;
            }

            m_focusBand.Reset();

            return(blurShouldBeApplied);
        }