public void PrintChar(SpeccyFontChar Char, int X, int Y, SpeccyMode Mode) { if (X > width || Y > height) { return; } int baseY = Y * 8; var map = Char.Data; int row = 0; switch (Mode) { case SpeccyMode.AND: for (int y = baseY; y < baseY + 8; y++) { pixels[X, y] &= map[row++]; } break; case SpeccyMode.OR: for (int y = baseY; y < baseY + 8; y++) { pixels[X, y] |= map[row++]; } break; case SpeccyMode.XOR: for (int y = baseY; y < baseY + 8; y++) { pixels[X, y] ^= map[row++]; } break; default: for (int y = baseY; y < baseY + 8; y++) { pixels[X, y] = map[row++]; } break; } }
public void PrintChar(SpeccyFontChar Char, int X, int Y, SpeccyMode Mode, int XShift, int YShift, bool ExpandAttributes) { if (X > width || Y > height) { return; } int baseY = Y * 8 + YShift; int maxY = Math.Min(height * 8, baseY + 8); var map = Char.Data; int row = 0; bool xFits = X + 1 < width || XShift == 0; bool yFits = Y < height - 1 || YShift == 0; switch (Mode) { case SpeccyMode.AND: if (XShift != 0) { if (xFits) { for (int y = baseY; y < maxY; y++) { pixels[X, y] &= (byte)(map[row] >> XShift); pixels[X + 1, y] &= (byte)(map[row++] << 8 - XShift); } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] &= (byte)(map[row++] >> XShift); } } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] &= map[row++]; } } break; case SpeccyMode.OR: if (XShift != 0) { if (xFits) { for (int y = baseY; y < maxY; y++) { pixels[X, y] |= (byte)(map[row] >> XShift); pixels[X + 1, y] |= (byte)(map[row++] << 8 - XShift); } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] |= (byte)(map[row++] >> XShift); } } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] |= map[row++]; } } break; case SpeccyMode.XOR: if (XShift != 0) { if (xFits) { for (int y = baseY; y < maxY; y++) { pixels[X, y] ^= (byte)(map[row] >> XShift); pixels[X + 1, y] ^= (byte)(map[row++] << 8 - XShift); } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] ^= (byte)(map[row++] >> XShift); } } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] ^= map[row++]; } } break; default: if (XShift != 0) { if (xFits) { for (int y = baseY; y < maxY; y++) { pixels[X, y] = (byte)(map[row] >> XShift); pixels[X + 1, y] = (byte)(map[row++] << 8 - XShift); } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] = (byte)(map[row++] >> XShift); } } } else { for (int y = baseY; y < maxY; y++) { pixels[X, y] = map[row++]; } } break; } }