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;
}
}
}