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)); }
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()); }
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); }
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)); }
public bool CanRender(IRenderSpecification specification) { return(specification is CalculatingRenderSpecification); }
public bool CanRender(IRenderSpecification specification) { return(specification is ShadingOnlyRenderSpecification); }