private void InsertImage(Bitmap bm) { if (romData != null) { byte[] imageData = null, paletteData = null; N64Graphics.Convert(ref imageData, ref paletteData, viewerCodec, bm); bool bufferChanged = ensureCapacity(ref romData, imageData, offset); if (bufferChanged) { DisplayFileSize(romData.Length); } Array.Copy(imageData, 0, romData, offset, imageData.Length); fileDataChanged = true; if (paletteData != null && paletteData.Length > 0) { int palOffset = (int)numericPalette.Value; byte[] paletteDest; if (separatePalette && extPaletteData != null) { ensureCapacity(ref extPaletteData, paletteData, palOffset); extPaletteChanged = true; paletteDest = extPaletteData; } else { bufferChanged = ensureCapacity(ref romData, paletteData, palOffset); if (bufferChanged) { DisplayFileSize(romData.Length); } paletteDest = romData; } Array.Copy(paletteData, 0, paletteDest, palOffset, paletteData.Length); UpdatePalette(); } foreach (GraphicsViewer gv in viewers) { if (bufferChanged) { gv.SetData(romData); } gv.Invalidate(); } } }
private void insertImage(Bitmap bm) { if (romData != null) { byte[] imageData = null, paletteData = null; N64Graphics.Convert(ref imageData, ref paletteData, viewerCodec, bm); int copyLength = Math.Min(imageData.Length, romData.Length - offset); Array.Copy(imageData, 0, romData, offset, copyLength); fileDataChanged = true; if (paletteData != null) { byte[] paletteDest; if (separatePalette && extPaletteData != null) { extPaletteChanged = true; paletteDest = extPaletteData; } else { paletteDest = romData; } int palOffset = (int)numericPalette.Value; copyLength = Math.Min(paletteData.Length, paletteDest.Length - palOffset); if (copyLength > 0) { Array.Copy(paletteData, 0, paletteDest, palOffset, copyLength); UpdatePalette(); } } foreach (GraphicsViewer gv in viewers) { gv.Invalidate(); } } }
private void runTest(int idx, bool verbose, PictureBox pbIn, PictureBox pbOut) { int width = 32; int height = 32; byte[] test = new byte[width * height * 4]; // worst case byte[] result = null; byte[] pal = new byte[16 * 16 * 2]; byte[] resultPal = null; int errorCount = 0; StringBuilder sb = new StringBuilder(); N64Codec testCodec = WhichCodec(idx); // randomize inputs Random rng = new Random(); rng.NextBytes(test); rng.NextBytes(pal); // if alpha bit clear, clear all bits switch (testCodec) { case N64Codec.RGBA16: for (int i = 0; i < test.Length; i += 2) { if ((test[i + 1] & 0x1) == 0) { test[i] = 0; test[i + 1] = 0; } } break; case N64Codec.IA16: for (int i = 0; i < test.Length; i += 2) { if ((test[i + 1]) == 0) { test[i] = 0; } } break; case N64Codec.IA8: for (int i = 0; i < test.Length; i++) { if ((test[i] & 0x0F) == 0) { test[i] = 0; } } break; case N64Codec.IA4: for (int i = 0; i < test.Length; i++) { if ((test[i] & 0x10) == 0) { test[i] &= 0x0F; } if ((test[i] & 0x01) == 0) { test[i] &= 0xF0; } } break; case N64Codec.CI4: case N64Codec.CI8: for (int i = 0; i < pal.Length; i += 2) { if ((pal[i + 1] & 0x1) == 0) { pal[i] = 0; pal[i + 1] = 0; } } break; } Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(b); N64Graphics.RenderTexture(g, test, pal, 0, width, height, 1, testCodec, N64IMode.AlphaCopyIntensity); N64Graphics.Convert(ref result, ref resultPal, testCodec, b); Bitmap bres = new Bitmap(width, height, PixelFormat.Format32bppArgb); N64Graphics.RenderTexture(Graphics.FromImage(bres), result, resultPal, 0, width, height, 1, testCodec, N64IMode.AlphaCopyIntensity); for (int i = 0; i < result.Length; i++) { if (test[i] != result[i]) { errorCount++; } if (verbose) { sb.AppendFormat("{0:X03} {1:X02} {2:X02}\r\n", i, test[i], result[i]); } } if (resultPal != null) { for (int i = 0; i < resultPal.Length; i++) { if (pal[i] != resultPal[i]) { errorCount++; } if (verbose) { sb.AppendFormat("P {0:X03} {1:X02} {2:X02}\r\n", i, pal[i], resultPal[i]); } } } // publish results sb.AppendFormat("Test[{0}] {1}: {2} errors\r\n", idx, N64Graphics.CodecString(testCodec), errorCount); textBoxLog.AppendText(sb.ToString()); pbIn.Image = b; pbOut.Image = bres; }