private void MaskExport_Click(object sender, RoutedEventArgs e) { UndertaleSprite sprite = this.DataContext as UndertaleSprite; UndertaleSprite.MaskEntry target = (sender as Button).DataContext as UndertaleSprite.MaskEntry; SaveFileDialog dlg = new SaveFileDialog(); dlg.DefaultExt = ".png"; dlg.Filter = "PNG files (.png)|*.png|All files|*"; if (dlg.ShowDialog() == true) { try { BitmapSource source = BitmapSource.Create((int)sprite.Width, (int)sprite.Height, 96, 96, PixelFormats.BlackWhite, null, target.Data, (int)((sprite.Width + 7) / 8)); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(source)); using (FileStream stream = new FileStream(dlg.FileName, FileMode.Create)) { encoder.Save(stream); } } catch (Exception ex) { MessageBox.Show("Failed to export file: " + ex.Message, "Failed to export file", MessageBoxButton.OK, MessageBoxImage.Error); } } }
private void MaskImport_Click(object sender, RoutedEventArgs e) { UndertaleSprite sprite = this.DataContext as UndertaleSprite; UndertaleSprite.MaskEntry target = (sender as Button).DataContext as UndertaleSprite.MaskEntry; OpenFileDialog dlg = new OpenFileDialog(); dlg.DefaultExt = ".png"; dlg.Filter = "PNG files (.png)|*.png|All files|*"; if (dlg.ShowDialog() == true) { try { System.Drawing.Image img = System.Drawing.Image.FromFile(dlg.FileName); if ((sprite.Width != (uint)img.Width) || (sprite.Height != (uint)img.Height)) { throw new System.Exception(dlg.FileName + " is not the proper size to be imported! Please correct this before importing! The proper dimensions are width: " + sprite.Width.ToString() + " px, height: " + sprite.Height.ToString() + " px."); } target.Data = TextureWorker.ReadMaskData(dlg.FileName); } catch (Exception ex) { mainWindow.ShowError("Failed to import file: " + ex.Message, "Failed to import file"); } } }
private void MaskList_AddingNewItem(object sender, AddingNewItemEventArgs e) { UndertaleSprite.MaskEntry obj = new UndertaleSprite.MaskEntry(); UndertaleSprite sprite = this.DataContext as UndertaleSprite; uint len = (sprite.Width + 7) / 8 * sprite.Height; obj.Data = new byte[len]; e.NewItem = obj; }
public static Bitmap GetCollisionMaskImage(UndertaleSprite sprite, UndertaleSprite.MaskEntry mask) { byte[] maskData = mask.Data; Bitmap bitmap = new Bitmap((int)sprite.Width, (int)sprite.Height, PixelFormat.Format32bppArgb); // Ugh. I want to use 1bpp, but for some BS reason C# doesn't allow SetPixel in that mode. for (int y = 0; y < sprite.Height; y++) { int rowStart = y * (int)((sprite.Width + 7) / 8); for (int x = 0; x < sprite.Width; x++) { byte temp = maskData[rowStart + (x / 8)]; bool pixelBit = (temp & (0b1 << (7 - (x % 8)))) != 0b0; bitmap.SetPixel(x, y, pixelBit ? Color.White : Color.Black); } } return(bitmap); }
private void MaskImport_Click(object sender, RoutedEventArgs e) { UndertaleSprite.MaskEntry target = (sender as Button).DataContext as UndertaleSprite.MaskEntry; OpenFileDialog dlg = new OpenFileDialog(); dlg.DefaultExt = ".png"; dlg.Filter = "PNG files (.png)|*.png|All files|*"; if (dlg.ShowDialog() == true) { try { target.Data = TextureWorker.ReadMaskData(dlg.FileName); } catch (Exception ex) { MessageBox.Show("Failed to import file: " + ex.Message, "Failed to import file", MessageBoxButton.OK, MessageBoxImage.Error); } } }
private void MaskImport_Click(object sender, RoutedEventArgs e) { UndertaleSprite sprite = this.DataContext as UndertaleSprite; UndertaleSprite.MaskEntry target = (sender as Button).DataContext as UndertaleSprite.MaskEntry; OpenFileDialog dlg = new OpenFileDialog(); dlg.DefaultExt = ".png"; dlg.Filter = "PNG files (.png)|*.png|All files|*"; if (dlg.ShowDialog() == true) { try { using (FileStream stream = new FileStream(dlg.FileName, FileMode.Open)) { PngBitmapDecoder decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource source = decoder.Frames[0]; if (source.Format.BitsPerPixel != 1) { throw new Exception("Must be a 1 bit-per-pixel image"); } if (source.PixelWidth != sprite.Width || source.PixelHeight != sprite.Height) { throw new Exception("Mask size doesn't match sprite size"); } int stride = (int)((sprite.Width + 7) / 8); byte[] data = new byte[source.PixelHeight * stride]; source.CopyPixels(data, stride, 0); target.Data = data; } } catch (Exception ex) { MessageBox.Show("Failed to import file: " + ex.Message, "Failed to import file", MessageBoxButton.OK, MessageBoxImage.Error); } } }
private void MaskExport_Click(object sender, RoutedEventArgs e) { UndertaleSprite sprite = this.DataContext as UndertaleSprite; UndertaleSprite.MaskEntry target = (sender as Button).DataContext as UndertaleSprite.MaskEntry; SaveFileDialog dlg = new SaveFileDialog(); dlg.DefaultExt = ".png"; dlg.Filter = "PNG files (.png)|*.png|All files|*"; if (dlg.ShowDialog() == true) { try { TextureWorker.ExportCollisionMaskPNG(sprite, target, dlg.FileName); } catch (Exception ex) { MessageBox.Show("Failed to export file: " + ex.Message, "Failed to export file", MessageBoxButton.OK, MessageBoxImage.Error); } } }
public static void ExportCollisionMaskPNG(UndertaleSprite sprite, UndertaleSprite.MaskEntry mask, string fullPath) { SaveImageToFile(fullPath, GetCollisionMaskImage(sprite, mask)); }