unsafe public override void Render (ImageSurface src, ImageSurface dst, Gdk.Rectangle[] rois) { float bulge = (float)Data.Amount; float hw = dst.Width / 2f; float hh = dst.Height / 2f; float maxrad = Math.Min (hw, hh); float amt = bulge / 100f; hh = hh + (float)Data.Offset.Y * hh; hw = hw + (float)Data.Offset.X * hw; int src_width = src.Width; int src_height = src.Height; ColorBgra* src_data_ptr = (ColorBgra*)src.DataPtr; foreach (Gdk.Rectangle rect in rois) { for (int y = rect.Top; y <= rect.GetBottom (); y++) { ColorBgra* dstPtr = dst.GetPointAddressUnchecked (rect.Left, y); ColorBgra* srcPtr = src.GetPointAddressUnchecked (src_data_ptr, src_width, rect.Left, y); float v = y - hh; for (int x = rect.Left; x <= rect.GetRight (); x++) { float u = x - hw; float r = (float)Math.Sqrt (u * u + v * v); float rscale1 = (1f - (r / maxrad)); if (rscale1 > 0) { float rscale2 = 1 - amt * rscale1 * rscale1; float xp = u * rscale2; float yp = v * rscale2; *dstPtr = src.GetBilinearSampleClamped (src_data_ptr, src_width, src_height, xp + hw, yp + hh); } else { *dstPtr = *srcPtr; } ++dstPtr; ++srcPtr; } } } }
public unsafe override void Render(ImageSurface src, ImageSurface dst, Gdk.Rectangle[] rois) { ColorBgra colPrimary = PintaCore.Palette.PrimaryColor.ToColorBgra (); ColorBgra colSecondary = PintaCore.Palette.SecondaryColor.ToColorBgra (); ColorBgra colTransparent = ColorBgra.Transparent; int aaSampleCount = Data.Quality * Data.Quality; Cairo.PointD* aaPoints = stackalloc Cairo.PointD[aaSampleCount]; Utility.GetRgssOffsets (aaPoints, aaSampleCount, Data.Quality); ColorBgra* samples = stackalloc ColorBgra[aaSampleCount]; TransformData td; foreach (Gdk.Rectangle rect in rois) { for (int y = rect.Top; y < rect.Bottom; y++) { ColorBgra* dstPtr = dst.GetPointAddressUnchecked (rect.Left, y); double relativeY = y - Data.CenterOffset.Y; for (int x = rect.Left; x < rect.Right; x++) { double relativeX = x - Data.CenterOffset.X; int sampleCount = 0; for (int p = 0; p < aaSampleCount; ++p) { td.X = relativeX + aaPoints[p].X; td.Y = relativeY - aaPoints[p].Y; InverseTransform (ref td); float sampleX = (float)(td.X + Data.CenterOffset.X); float sampleY = (float)(td.Y + Data.CenterOffset.Y); ColorBgra sample = colPrimary; if (IsOnSurface (src, sampleX, sampleY)) { sample = src.GetBilinearSample (sampleX, sampleY); } else { switch (Data.EdgeBehavior) { case WarpEdgeBehavior.Clamp: sample = src.GetBilinearSampleClamped (sampleX, sampleY); break; case WarpEdgeBehavior.Wrap: sample = src.GetBilinearSampleWrapped (sampleX, sampleY); break; case WarpEdgeBehavior.Reflect: sample = src.GetBilinearSampleClamped (ReflectCoord (sampleX, src.Width), ReflectCoord (sampleY, src.Height)); break; case WarpEdgeBehavior.Primary: sample = colPrimary; break; case WarpEdgeBehavior.Secondary: sample = colSecondary; break; case WarpEdgeBehavior.Transparent: sample = colTransparent; break; case WarpEdgeBehavior.Original: sample = src.GetColorBgra (x, y); break; default: break; } } samples[sampleCount] = sample; ++sampleCount; } *dstPtr = ColorBgra.Blend (samples, sampleCount); ++dstPtr; } } } }