public void DrawPatternAt(Vector2i position)
{
int size = PatternSize;
int sx = Math.Max(position.X - size, 0);
int sy = Math.Max(position.Y - size, 0);
int ex = Math.Min(sx + size * 2 + 1, Canvas.Resolution.X - 1);
int ey = Math.Min(sy + size * 2 + 1, Canvas.Resolution.Y - 1);
int baseTextureOffset = PatternTextureOffsets[PatternNumber];
int textureOffset = baseTextureOffset / 8;
int textureBit = 7 - baseTextureOffset % 8, textureValue = PatternTextures[textureOffset % PatternTextures.Length];
byte[] circleData = PatternCircles[size];
int circleOffset = 1;
int circleValue = circleData[0];
int circleBit = 7;
bool useRectangle = (PatternFlags & PicturePatternFlags.Rectangle) != 0;
bool usePattern = (PatternFlags & PicturePatternFlags.UsePattern) != 0;
Canvas.Visual.DitherBlendOverride = false;
for (int y = sy; y <= ey; y++) {
for (int x = sx; x <= ex; x++) {
if (textureBit < 0) {
textureValue = PatternTextures[textureOffset++ % PatternTextures.Length];
textureBit = 7;
}
bool textureOn = usePattern ? (textureValue & (1 << textureBit)) != 0 : true;
if (useRectangle) {
if (usePattern) {
if (textureOn)
DrawPixel(x, y);
textureBit--;
}
} else {
bool circleOn = (circleValue & 1) != 0;
circleValue >>= 1;
if (circleBit-- == 0) {
circleBit = 7;
circleValue = circleOffset >= circleData.Length ? 0 : circleData[circleOffset++];
}
if (circleOn) {
if (textureOn)
DrawPixel(x, y);
textureBit--;
}
}
}
}
Canvas.Visual.DitherBlendOverride = false;
}