Pinta.ImageManipulation.Effects.WarpEffect.RenderLine C# (CSharp) Method

RenderLine() protected method

protected RenderLine ( ISurface src, ISurface dst, Rectangle rect ) : void
src ISurface
dst ISurface
rect Rectangle
return void
		protected unsafe override void RenderLine (ISurface src, ISurface dst, Rectangle rect)
		{
			ColorBgra colTransparent = ColorBgra.Transparent;

			int aaSampleCount = quality * quality;
			PointD* aaPoints = stackalloc PointD[aaSampleCount];
			Utility.GetRgssOffsets (aaPoints, aaSampleCount, quality);
			ColorBgra* samples = stackalloc ColorBgra[aaSampleCount];

			TransformData td;

			for (int y = rect.Top; y <= rect.Bottom; y++) {
				ColorBgra* dstPtr = dst.GetPointAddress (rect.Left, y);

				double relativeY = y - center_offset.Y;

				for (int x = rect.Left; x <= rect.Right; x++) {
					double relativeX = x - center_offset.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 + center_offset.X);
						float sampleY = (float)(td.Y + center_offset.Y);

						ColorBgra sample = primary_color;

						if (IsOnSurface (src, sampleX, sampleY)) {
							sample = Utility.GetBilinearSampleClamped (src, sampleX, sampleY);
						} else {
							switch (edge_behavior) {
								case WarpEdgeBehavior.Clamp:
									sample = Utility.GetBilinearSampleClamped (src, sampleX, sampleY);
									break;

								case WarpEdgeBehavior.Wrap:
									sample = Utility.GetBilinearSampleWrapped (src, sampleX, sampleY);
									break;

								case WarpEdgeBehavior.Reflect:
									sample = Utility.GetBilinearSampleClamped (src, ReflectCoord (sampleX, src.Width), ReflectCoord (sampleY, src.Height));

									break;

								case WarpEdgeBehavior.Primary:
									sample = primary_color;
									break;

								case WarpEdgeBehavior.Secondary:
									sample = secondary_color;
									break;

								case WarpEdgeBehavior.Transparent:
									sample = colTransparent;
									break;

								case WarpEdgeBehavior.Original:
									sample = src.GetPoint (x, y);
									break;
								default:

									break;
							}
						}

						samples[sampleCount] = sample;
						++sampleCount;
					}

					*dstPtr = ColorBgra.Blend (samples, sampleCount);
					++dstPtr;
				}
			}
		}