protected override void ProcessPixelFragment(int startX, int startY, int endX, int endY, Vector2 step, Vector2 start, Func <uint, uint, float, float, int> pixelShader) { int heightInPixels = endY - startY; int widthInPixels = endX - startX; // rendering in half resolution Parallel.For(0, heightInPixels - 1, y => { if (y % 2 == 1) { return; } float _y = y * step.y + start.y; float _x = start.x; for (int x = 0; x < widthInPixels; x += 2) { int res = pixelShader((uint)(x + startX), (uint)(y + startY), _x, _y); var c = ColorBgra.FromInt32(res); if (c.A == 255) { surface.Surface.SetPointFast(x + startX, y + startY, c); surface.Surface.SetPointFast(x + startX + 1, y + startY, c); } _x += step.x * 2; } PaintDotNet.SystemLayer.Memory.Copy(surface.Surface.Scan0.Pointer + (y + 1 + startY) * surface.Surface.Stride + startX * 4, surface.Surface.Scan0.Pointer + (y + startY) * surface.Surface.Stride + startX * 4, (uint)(widthInPixels * 4)); }); }