private static bool isNew(int startAdress, ArrayList PatternTable, NES_PPU_Color color, int ID) { bool isnew = isNewPattern(startAdress, PatternTable, ID); isnew |= color.isNewPalette; return(isnew); }
private static BitmapWithInfo CreateNewTile(int startAdress, NES_PPU_Color color, ArrayList PatternTable) { byte[,] pattern = new byte[8, 8]; Picture bitmap = new Picture(8, 8); List <byte> cID = new List <byte>(); Parallel.For(0, 8, j => { Parallel.For(0, 8, i => { var a = (((Address)PatternTable[startAdress + i]).Value >> j) & (0x01); var b = ((((Address)PatternTable[startAdress + i + 8]).Value >> j) & (0x01)) << 1; pattern[7 - j, i] = (byte)(a | b); lock (cID) { if (!cID.Contains(pattern[7 - j, i])) { cID.Add(pattern[7 - j, i]); } } lock (bitmap) { bitmap.SetPixel(7 - j, i, color.color[pattern[7 - j, i]]); } }); }); ((Address)PatternTable[startAdress]).setAsOld(); return(new BitmapWithInfo(bitmap, pattern, cID.ToArray())); }
private static BitmapWithInfo UpdateTile(int ID, NES_PPU_Color color) { lock (patternArray) { bool isNew = false; foreach (int cID in patternArray[ID].cID) { isNew |= color.isNewColor[cID]; } if (isNew) { byte[,] pattern = patternArray[ID].Pattern; Picture bitmap = new Picture(8, 8); for (int j = 0; j < 8; j++) { for (int i = 0; i < 8; i++) { bitmap.SetPixel(7 - j, i, color.color[pattern[7 - j, i]]); } } return(new BitmapWithInfo(bitmap, pattern, patternArray[ID].cID, true)); } patternArray[ID].isNew = false; return(patternArray[ID]); } }
/// <summary> /// converts Tiles from Memory to Bitmap. With ID, BankID and Backgrount Tile Select. /// </summary> /// <param name="spriteID">ID of Sprite </param> /// <returns></returns> public static Picture Tile(ushort spriteID, int pallete, int bankID) { int startAdress = spriteID * 16; NES_PPU_Color color = NES_PPU_Palette.getSpriteColorPalette(pallete); var PatternTable = NES_PPU_Memory.PatternTableN[bankID]; int ID = GetTileID(startAdress, pallete, PatternTable); return(CreateTileBitmap(startAdress, color, PatternTable, ID)); }
/// <summary> /// converts Tiles from Memory to Bitmap. /// </summary> /// <param name="startAdress"></param> /// <returns></returns> public static Picture Tile_StartAdress(int startAdress, int pallete) { byte[,] pattern = new byte[8, 8]; NES_PPU_Color color = NES_PPU_Palette.getPalette(pallete); var PatternTable = NES_PPU_Memory.Memory; int ID = GetTileID(startAdress, pallete, PatternTable); return(CreateTileBitmap(startAdress, color, PatternTable, ID)); }
/// <summary> /// Creates an Bitmap from data saved in PPU Adresses. /// </summary> /// <param name="startAdress"></param> /// <param name="bitmap"></param> /// <param name="pattern"></param> /// <param name="color"></param> /// <param name="PatternTable"></param> private static Picture CreateTileBitmap(int startAdress, NES_PPU_Color color, ArrayList PatternTable, int ID) { Stopwatch t = new Stopwatch(); t.Start(); System.TimeSpan t1 = new System.TimeSpan(0); System.TimeSpan t2 = new System.TimeSpan(0); try { if (isNew(startAdress, PatternTable, color, ID)) { BitmapWithInfo bitmap; if (isNewPattern(startAdress, PatternTable, ID)) { bitmap = CreateNewTile(startAdress, color, PatternTable); t1 = t.Elapsed; AddTileToPatternArray(ID, bitmap); t2 = t.Elapsed; t.Stop(); t2 -= t1; return(DrawRefreshFrame(bitmap.Image, Color.Red)); } else { bitmap = UpdateTile(ID, color); t1 = t.Elapsed; AddTileToPatternArray(ID, bitmap); t2 = t.Elapsed; t.Stop(); t2 -= t1; lock (bitmap) { return(DrawRefreshFrame(bitmap.Image, Color.Blue, bitmap.isNew)); } } } else { lock (patternArray) { return(patternArray[ID].Image); } } } catch (Exception) { throw; } }
/// <summary> /// converts Tiles from Memory to Bitmap. With ID and Backgrount Tile Select. /// </summary> /// <param name="spriteID">ID of Sprite </param> /// <returns></returns> public static Picture Tile(ushort spriteID, int pallete) { System.TimeSpan t1 = new System.TimeSpan(0); System.TimeSpan t2 = new System.TimeSpan(0); Stopwatch t = new Stopwatch(); t.Start(); int startAdress = spriteID * 16; byte[,] pattern = new byte[8, 8]; NES_PPU_Color color = NES_PPU_Palette.getPalette(pallete); var PatternTable = NES_PPU_Memory.PatternTableN[NES_PPU_Register.PPUCTRL.B ? 1 : 0]; int ID = GetTileID(startAdress, pallete, PatternTable); t1 = t.Elapsed; var temp = CreateTileBitmap(startAdress, color, PatternTable, ID); t2 = t.Elapsed; t.Stop(); t2 -= t1; return(temp); }