Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }