Пример #1
0
        public IRenderResult Render(IRenderSpecification specification, IDrawingContext context, CancellationToken cancellationToken)
        {
            var shadingSpecification = (ShadingOnlyRenderSpecification)specification;
            var fractalPart          = shadingSpecification.CalculatedFractalPart;

            using (var fastBitmap = this.renderer.CreateBitmap(fractalPart, specification.Settings, specification.Shader))
            {
                var scalableFractalPart = fractalPart as ScalableFractalPart;
                if (scalableFractalPart != null && !scalableFractalPart.ScaledScreenPosition.Equals(scalableFractalPart.ScreenPosition))
                {
                    var targetRect = new Rectangle(
                        scalableFractalPart.ScaledScreenPosition.Left,
                        scalableFractalPart.ScaledScreenPosition.Top,
                        scalableFractalPart.ScaledScreenPosition.Right - scalableFractalPart.ScaledScreenPosition.Left + 1,
                        scalableFractalPart.ScaledScreenPosition.Bottom - scalableFractalPart.ScaledScreenPosition.Top + 1);

                    context.DrawBitmap(fastBitmap.Bitmap, targetRect);
                }
                else
                {
                    var targetPoint = new Point(fractalPart.ScreenPosition.Left, fractalPart.ScreenPosition.Top);
                    context.DrawBitmapUnscaled(fastBitmap.Bitmap, targetPoint);
                }
            }

            return(new RenderResult(shadingSpecification.CalculatedFractalPart));
        }
Пример #2
0
        protected IRenderResult Render(IJob job, IRenderSpecification specification, IDrawingContext context, CancellationToken cancellationToken)
        {
            IRenderer renderer;

            if (this.rendererRegistry.TryGetMatchingRenderer(specification, out renderer))
            {
                return(renderer.Render(specification, context, cancellationToken));
            }

            throw new InvalidOperationException("No renderer found for type " + specification.GetType());
        }
Пример #3
0
        public bool TryGetMatchingRenderer(IRenderSpecification specification, out IRenderer renderer)
        {
            foreach (var knownRenderer in this.renderers)
            {
                if (knownRenderer.CanRender(specification))
                {
                    renderer = knownRenderer;
                    return(true);
                }
            }

            renderer = null;
            return(false);
        }
Пример #4
0
        public IRenderResult Render(IRenderSpecification specification, IDrawingContext context, CancellationToken cancellationToken)
        {
            var renderSpec = (CalculatingRenderSpecification)specification;
            var calculator = this.calculatorRegistry.GetAll().First(c => c.CanCalculatePart(renderSpec.CalculationSpecification));

            // first we calculate the fractal part
            var calculatedPart = calculator.CalculatePart(renderSpec.CalculationSpecification, specification.Settings, cancellationToken);

            // then we defer shading and further rendering to a different renderer
            var shadingSpec = this.renderSpecificationFactory.CreateFromCalculatedPart(calculatedPart, specification.Settings, specification.Shader);

            IRenderer shadingRenderer;

            if (!this.rendererRegistry.TryGetMatchingRenderer(shadingSpec, out shadingRenderer))
            {
                throw new InvalidOperationException("No shading renderer found.");
            }

            return(shadingRenderer.Render(shadingSpec, context, cancellationToken));
        }
Пример #5
0
 public bool CanRender(IRenderSpecification specification)
 {
     return(specification is CalculatingRenderSpecification);
 }
Пример #6
0
 public bool CanRender(IRenderSpecification specification)
 {
     return(specification is ShadingOnlyRenderSpecification);
 }