예제 #1
0
        private IVisualization2d GenerateBitmap(ReadOnlyDictionary <string, object> parms)
        {
            int  offset      = Util.GetFromObjDict(parms, P_OFFSET, 0);
            int  width       = Util.GetFromObjDict(parms, P_WIDTH, 1);
            int  height      = Util.GetFromObjDict(parms, P_HEIGHT, 1);
            bool showInvalid = Util.GetFromObjDict(parms, P_SHOWINVALID, false);

            // Check parameters.
            int lastAddress = offset + width * height - 1;

            if ((offset < 0) || (lastAddress >= this.mFileData.Length))
            {
                this.mAppRef.ReportError("Invalid parameter");
                return(null);
            }

            // Set palette.
            PaletteBitmap bitmap = new PaletteBitmap((uint)width, (uint)height);

            bitmap.AddColor(0x00000000);                                        // Transparent
            for (int i = 0; i < NesPalette.Length; i++)
            {
                UInt32 color = 0xFF000000U | (UInt32)NesPalette[i];
                bitmap.AddColor((int)color);                    // Palette color (1 shift)
            }

            // Convert to pixels.
            for (uint y = 0; y < (uint)height; y++)
            {
                for (uint x = 0; x < (uint)width; x++)
                {
                    uint index = y * (uint)width + x;

                    byte palette = this.mFileData[offset + index];
                    if (!showInvalid & ((int)palette > NesPalette.Length))
                    {
                        // Transparent invalid color.
                        bitmap.SetPixel(x, y, 0);
                        continue;
                    }

                    palette = (byte)((palette % NesPalette.Length) + 1);
                    bitmap.SetPixel(x, y, palette);
                }
            }

            return(bitmap.Bitmap);
        }
예제 #2
0
 public Nametable(ChrMapper mapper)
 {
     this.bitmap  = new PaletteBitmap(screenWidth * 8u, screenHeight * 8u);
     this.mapper  = mapper;
     this.ppuAddr = 0x0000;
     this.SetDirection(AccessDirection.Horizontal);
     bitmap.AddColor(0x00000000);                                // Transparent
 }
예제 #3
0
        private IVisualization2d GenerateBitmap(ReadOnlyDictionary <string, object> parms)
        {
            int offset   = Util.GetFromObjDict(parms, P_OFFSET, 0);
            int width    = Util.GetFromObjDict(parms, P_WIDTH, 1);
            int height   = Util.GetFromObjDict(parms, P_HEIGHT, 1);
            int palette1 = Util.GetFromObjDict(parms, P_PALETTE1, 0x0F);
            int palette2 = Util.GetFromObjDict(parms, P_PALETTE2, 0x00);
            int palette3 = Util.GetFromObjDict(parms, P_PALETTE3, 0x10);
            int palette4 = Util.GetFromObjDict(parms, P_PALETTE4, 0x30);

            int[] palette = new int[4] {
                palette1, palette2, palette3, palette4
            };

            // Check parameters.
            int lastAddress = offset + width * height * 16 - 1;

            if ((offset < 0) || (lastAddress >= this.mFileData.Length))
            {
                this.mAppRef.ReportError("Invalid parameter");
                return(null);
            }
            for (int i = 0; i < palette.Length; i++)
            {
                int color = palette[i];
                if (color >= NesPalette.Length)
                {
                    this.mAppRef.ReportError("Invalid parameter");
                    return(null);
                }
            }

            // Set palette.
            PaletteBitmap bitmap = new PaletteBitmap((uint)(width * 8), (uint)(height * 8));

            bitmap.AddColor(0x00000000);                                // Transparent
            for (int i = 0; i < palette.Length; i++)
            {
                int index = palette[i];
                if (index >= 0)
                {
                    UInt32 color = 0xFF000000U | (UInt32)NesPalette[index];
                    bitmap.AddColor((int)color);                        // ARGB
                }
                else
                {
                    bitmap.AddColor(0x00000000);                        // Transparent
                }
            }

            // Convert to pixels.
            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    this.GenerateTile(bitmap, width, row, col, offset);
                }
            }

            return(bitmap.Bitmap);
        }
예제 #4
0
        private IVisualization2d GenerateBitmap(ReadOnlyDictionary <string, object> parms)
        {
            int  tileoffset = Util.GetFromObjDict(parms, P_TILEOFFSET, 0);
            int  width      = Util.GetFromObjDict(parms, P_WIDTH, 1);
            int  height     = Util.GetFromObjDict(parms, P_HEIGHT, 1);
            int  chroffset  = Util.GetFromObjDict(parms, P_CHROFFSET, 0);
            int  chipoffset = Util.GetFromObjDict(parms, P_CHIPOFFSET, 0);
            int  chrbank1   = Util.GetFromObjDict(parms, P_CHRBANK1, 0);
            int  chrbank2   = Util.GetFromObjDict(parms, P_CHRBANK2, 1);
            int  chrbank3   = Util.GetFromObjDict(parms, P_CHRBANK3, 2);
            int  chrbank4   = Util.GetFromObjDict(parms, P_CHRBANK4, 3);
            int  palette1   = Util.GetFromObjDict(parms, P_PALETTE1, 0x0F);
            int  palette2   = Util.GetFromObjDict(parms, P_PALETTE2, 0x00);
            int  palette3   = Util.GetFromObjDict(parms, P_PALETTE3, 0x10);
            int  palette4   = Util.GetFromObjDict(parms, P_PALETTE4, 0x30);
            bool vertical   = Util.GetFromObjDict(parms, P_VERTICAL, false);

            int[] bank = new int[4] {
                chrbank1, chrbank2, chrbank3, chrbank4
            };
            int[] palette = new int[4] {
                palette1, palette2, palette3, palette4
            };
            ChrMapper mapper = null;

            // Check parameters.
            try{
                {                       // tile
                    int lastAddress = tileoffset + width * height - 1;
                    if ((tileoffset < 0) || (lastAddress >= this.mFileData.Length))
                    {
                        this.mAppRef.ReportError("Invalid parameter");
                        return(null);
                    }
                }
                {                                         // bank
                    int lastAddress = chroffset + 0x03FF; // chr = [0, 0, 0, 0] -> 0x1000 / 4 - 1 = 0x03FF
                    if ((chroffset < 0) || (lastAddress >= this.mFileData.Length))
                    {
                        this.mAppRef.ReportError("Invalid parameter");
                        return(null);
                    }
                }
                // palette
                for (int i = 0; i < palette.Length; i++)
                {
                    int color = palette[i];
                    if (color >= NesPalette.Length)
                    {
                        this.mAppRef.ReportError("Invalid parameter");
                        return(null);
                    }
                }
                // Copy CHR data.
                mapper = new ChrMapper(this.mFileData, chroffset, bank);
            }
            catch {
                this.mAppRef.ReportError("Invalid parameter");
                return(null);
            }

            // Set palette.
            PaletteBitmap bitmap = new PaletteBitmap((uint)(width * 8), (uint)(height * 8));

            bitmap.AddColor(0x00000000);                                // Transparent
            for (int i = 0; i < palette.Length; i++)
            {
                int index = palette[i];
                if (index >= 0)
                {
                    UInt32 color = 0xFF000000U | (UInt32)NesPalette[index];
                    bitmap.AddColor((int)color);                        // ARGB
                }
                else
                {
                    bitmap.AddColor(0x00000000);                        // Transparent
                }
            }

            // Convert to pixels.
            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    int address;
                    if (!vertical)
                    {
                        // Horizontal
                        address = tileoffset + (row * width) + col;
                    }
                    else
                    {
                        // Vertical
                        address = tileoffset + (col * height) + row;
                    }
                    byte tile = (byte)(this.mFileData[address] + chipoffset);
                    this.GenerateTile(bitmap, mapper, (uint)row, (uint)col, tile);
                }
            }

            return(bitmap.Bitmap);
        }