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); }
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); }