private Image CreateRenderThreads(Size size,Area area) { Bitmap image = new Bitmap(size.Width,size.Height); BitmapEditor editor = new BitmapEditor(image); int[] ranges = GetRangesPixelsArray(size.Width,RenderSettings.NumberOfThreads); Thread[] threads = new Thread[RenderSettings.NumberOfThreads]; editor.LockBits(); for (int i = 0; i < RenderSettings.NumberOfThreads; i++) { threads[i] = new Thread(new ParameterizedThreadStart(ProcessBitmapPart)); threads[i].IsBackground = true; threads[i].Priority = RenderSettings.ThreadsPriority; threads[i].Start(new ThreadData() { areaPlain = area, imageSize = size, widthStart = ranges[i], widthEnd = ranges[i+1], editorReference = editor }); } foreach (var t in threads) { t.Join(); } editor.UnlockBits(); return image; }
private Image SingleIterationRender(Size size,Area area) { Bitmap image = new Bitmap(size.Width,size.Height); Graphics.FromImage(image).FillRectangle(new SolidBrush(_backgroundColor),0,0,size.Width,size.Height); BitmapEditor editor = new BitmapEditor(image); double realPart,imaginaryPart; editor.LockBits(); for (int i = 0; i < size.Height; i++) { for (int r = 0; r < size.Width; r++) { realPart = (r*_widthRatio) + area.Start.X; imaginaryPart = (i* _heightRatio) + area.Start.Y; if(Contains(realPart,imaginaryPart,_accuracy)) { editor.SetPixel(r,i,_fractalColor); } } if(RenderProgressCall != null) { RenderProgressCall(i,size.Height); } } editor.UnlockBits(); return image; }