private void Parse4BppIndexed(DataElement info) { byte * ptr = _DataElement.Data; ImageInfoWrapper * imageInfo = (ImageInfoWrapper *)info.Data; ImageDataHeaderWrapper *imageHeader = (ImageDataHeaderWrapper *)ptr; ImageDataHeaderWrapper *paletteHeader = (ImageDataHeaderWrapper *)(ptr + imageInfo->imageDataSize); byte * imageData = (byte *)imageHeader + ImageDataHeaderWrapper.SIZE; byte * paletteData = (byte *)paletteHeader + ImageDataHeaderWrapper.SIZE; _Image = new Bitmap(imageInfo->width, imageInfo->height, PixelFormat.Format32bppRgb); _PaletteImage = new Bitmap(0x4, 0x4, PixelFormat.Format32bppRgb); _Palette = new Color[0x10]; for (int i = 0; i < _Palette.Length; i++) { _Palette[i] = Color.FromArgb(paletteData[(i * 4) + 0], paletteData[(i * 4) + 1], paletteData[(i * 4) + 2]);; _PaletteImage.SetPixel(i % 0x4, i / 0x4, _Palette[i]); } for (int by = 0; by < _Image.Height / 0x2; by++) { for (int bx = 0; bx < _Image.Width / 0x10; bx++) { int blockY = (by / 0x2) * 0x4 + (by % 0x2); int blockX = bx * 0x10; int blockI = bx * 0x20 + by * Math.Max(_Image.Width, 0x20) * 0x2; for (int j = 0; j < 0x8; j++) { int x = (blockX + (0x4 + j) % 0x8) ^ ((by & 0x2) << 1); int x2 = (blockX + 0x8 + (0x4 + j) % 0x8) ^ ((by & 0x2) << 1); int y = blockY + 0x0; int y2 = blockY + 0x2; int i1 = blockI + (j * 0x4) % 0x20; int i2 = blockI + (j * 0x4 + 0x11) % 0x20; int i3 = blockI + (j * 0x4 + 0x2) % 0x20; int i4 = blockI + (j * 0x4 + 0x11 + 0x2) % 0x20; _Image.SetPixel(x, y2, _Palette[ReadNibble(imageData, i1)]); _Image.SetPixel(x, y, _Palette[ReadNibble(imageData, i2)]); _Image.SetPixel(x2, y2, _Palette[ReadNibble(imageData, i3)]); _Image.SetPixel(x2, y, _Palette[ReadNibble(imageData, i4)]); } } } }
private void Parse32BppRGB(DataElement info) { byte * ptr = _DataElement.Data; ImageInfoWrapper * imageInfo = (ImageInfoWrapper *)info.Data; ImageDataHeaderWrapper *imageHeader = (ImageDataHeaderWrapper *)ptr; byte * imageData = (byte *)imageHeader + ImageDataHeaderWrapper.SIZE; _Image = new Bitmap(imageHeader->width, imageHeader->height, PixelFormat.Format32bppRgb); for (int y = 0; y < _Image.Height; y++) { for (int x = 0; x < _Image.Width; x++) { int index = (y * _Image.Width + x) * sizeof(uint); int r = imageData[index + 0x0]; int g = imageData[index + 0x1]; int b = imageData[index + 0x2]; int a = imageData[index + 0x3]; _Image.SetPixel(x, y, Color.FromArgb(a, r, g, b)); } } }
private void Parse8BppIndexed(DataElement info) { byte * ptr = _DataElement.Data; ImageInfoWrapper * imageInfo = (ImageInfoWrapper *)info.Data; ImageDataHeaderWrapper *imageHeader = (ImageDataHeaderWrapper *)ptr; ImageDataHeaderWrapper *paletteHeader = (ImageDataHeaderWrapper *)(ptr + imageInfo->imageDataSize); byte * imageData = (byte *)imageHeader + ImageDataHeaderWrapper.SIZE; byte * paletteData = (byte *)paletteHeader + ImageDataHeaderWrapper.SIZE; _Image = new Bitmap(imageInfo->width, imageInfo->height, PixelFormat.Format32bppRgb); _PaletteImage = new Bitmap(0x10, 0x10, PixelFormat.Format32bppRgb); _Palette = new Color[0x100]; for (int i = 0; i < _Palette.Length; i++) { int index = i & ~0x18 | ((i & 0x10) >> 0x1) | ((i & 0x8) << 0x1); _Palette[i] = Color.FromArgb(paletteData[(index * 4) + 0], paletteData[(index * 4) + 1], paletteData[(index * 4) + 2]);; _PaletteImage.SetPixel(i % 0x10, i / 0x10, _Palette[i]); } for (int by = 0; by < _Image.Height / 0x2; by++) { for (int bx = 0; bx < _Image.Width / 0x10; bx++) { int blockY = (by / 0x2) * 0x4 + (by % 0x2); int blockX = bx * 0x10; int blockI = bx * 0x20 + by * _Image.Width * 0x2; for (int j = 0; j < 0x8; j++) { int x = (blockX + j) ^ ((by & 0x2) << 1); int x2 = (blockX + 0x8 + j) ^ ((by & 0x2) << 1); int y = blockY + 0x0; int y2 = blockY + 0x2; int i1 = blockI + (j * 0x4) % 0x20; int i2 = blockI + (j * 0x4 + 0x11) % 0x20; int i3 = blockI + (j * 0x4 + 0x2) % 0x20; int i4 = blockI + (j * 0x4 + 0x11 + 0x2) % 0x20; _Image.SetPixel(x, y, _Palette[imageData[i1]]); _Image.SetPixel(x, y2, _Palette[imageData[i2]]); _Image.SetPixel(x2, y, _Palette[imageData[i3]]); _Image.SetPixel(x2, y2, _Palette[imageData[i4]]); } } } /* * for (int y = 0; y < _Image.Height ; y++) * for (int x = 0; x < _Image.Width; x++) * { * int index = (y * _Image.Width + x); * int i = imageData[index]; * //int r = imageData[index + 0x0]; * //int g = imageData[index + 0x1]; * //int b = imageData[index + 0x2]; * //int a = imageData[index + 0x3]; * _Image.SetPixel(x, y, _Palette[i]); * } */ }