/// <summary> /// Set a graphic tile. /// </summary> /// <param name="tileNum">Tile number to set.</param> /// <param name="mode">Palette mode.</param> /// <param name="pal">Palette.</param> /// <param name="paletteNum">Palette number.</param> /// <param name="data">Bitmap data.</param> /// <param name="dataXPos">Bitmap data X position.</param> /// <param name="dataYPos">Bitmap data Y position.</param> public void SetTile(int tileNum, PaletteMode mode, NCL pal, int paletteNum, Bitmap data, int dataXPos, int dataYPos) { List <byte> newTileData = GenTile(mode, pal, paletteNum, data, ref dataXPos, ref dataYPos); int dataOff = tileNum * 64; if (mode == PaletteMode.Bpp4) { dataOff = tileNum * 32; } for (int i = 0; i < newTileData.Count; i++) { Data[dataOff + i] = newTileData[i]; } }
/// <summary> /// Generate a tile. /// </summary> /// <param name="mode">Palette mode.</param> /// <param name="pal">Palette.</param> /// <param name="paletteNum">Palette number.</param> /// <param name="data">Bitmap data.</param> /// <param name="xPtr">X position in bitmap.</param> /// <param name="yPtr">Y position in bitmap.</param> /// <returns>Generated tile.</returns> private List <byte> GenTile(PaletteMode mode, NCL pal, int paletteNum, Bitmap data, ref int xPtr, ref int yPtr) { List <byte> ret = new List <byte>(); bool isFirstNybble = true; int numPixelsDone = 0; int scanX = 0; int scanY = 0; while (numPixelsDone < 64) { if (mode == PaletteMode.Bpp4) { if (isFirstNybble) { ret.Add((byte)(pal.GetClosestColor(data.GetPixel(xPtr + scanX, yPtr + scanY), paletteNum, mode) << 4)); } else { ret[ret.Count - 1] |= (byte)pal.GetClosestColor(data.GetPixel(xPtr + scanX, yPtr + scanY), paletteNum, mode); numPixelsDone++; scanX++; } isFirstNybble = !isFirstNybble; } else { ret.Add((byte)pal.GetClosestColor(data.GetPixel(xPtr + scanX, yPtr + scanY), paletteNum, mode)); numPixelsDone++; scanX++; } if (scanX == 8) { scanX = 0; scanY++; } } xPtr += 8; yPtr += 8; return(ret); }