Advertisement
Ham62

QB BSAVE plugin - Paint.NET

Jan 26th, 2016
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.91 KB | None | 0 0
  1. /*
  2.  * QuickBASIC BSAVE Graphics Plugin for Paint.NET
  3.  *       (C) Copywrite Graham Downey 2016        
  4.  */
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Text;
  8. using PaintDotNet;
  9. using PaintDotNet.Data;
  10. using System.IO;
  11. using System.Reflection;
  12. using System.Drawing;
  13. using System.Windows.Forms;
  14. using System.Drawing.Imaging;
  15.  
  16. namespace QuickBASIC_BSAVE_Graphics
  17. {
  18.     public class MyFileType : FileType
  19.     {
  20.         public MyFileType()
  21.             : base("QuickBASIC BSAVE Graphics",
  22.                 FileTypeFlags.SupportsLoading | FileTypeFlags.SupportsSaving,
  23.                 new String[] { ".VGA", ".BSV" })
  24.         {
  25.         }
  26.  
  27.         // VGA Color Palette
  28.         public Color[] Palette = new Color[256];
  29.  
  30.         protected override Document OnLoad(Stream input)
  31.         {
  32.             try
  33.             {
  34.                 int Magic = input.ReadByte();
  35.                 if (Magic != 0xFD)
  36.                 {
  37.                     MessageBox.Show("ERROR: Not a QuickBASIC BSAVE graphics file!");
  38.                     Bitmap blank = new Bitmap(16, 16);
  39.                     return Document.FromImage(blank);
  40.                 }
  41.  
  42.                 input.Seek(5, 0);                       // Skip Segment/Offset data
  43.                 int LowByte = input.ReadByte();
  44.                 int DataSize = input.ReadByte();
  45.                 DataSize = (DataSize << 8) | LowByte;
  46.  
  47.                 LowByte = input.ReadByte();
  48.                 int GFXWidth = input.ReadByte();
  49.                 GFXWidth = (GFXWidth << 8) | LowByte;
  50.                 GFXWidth = (GFXWidth >> 3);
  51.  
  52.                 LowByte = input.ReadByte();
  53.                 int GFXHeight = input.ReadByte();
  54.                 GFXHeight = (GFXHeight << 8) | LowByte;
  55.  
  56.                 if (GFXWidth*GFXHeight != DataSize-4)
  57.                 {
  58.                     MessageBox.Show("ERROR: Not a Screen 13 graphics file!");
  59.                     Bitmap Blank = new Bitmap(16, 16);
  60.                     return Document.FromImage(Blank);
  61.                 }
  62.                
  63.                 // Read bitmap bytes into byte buffer
  64.                 byte[] ByteBuffer = new byte[DataSize];
  65.                 int DataRead = 0;
  66.                 while (DataSize-4 != 0)
  67.                 {
  68.                     DataRead = input.Read(ByteBuffer, DataRead, DataSize);
  69.                     DataSize -= DataRead;
  70.                 }
  71.  
  72.                 // Load VGA color palette
  73.                 int R, B, G, C;
  74.                 Stream PalStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("QuickBASIC_BSAVE_Graphics.SCR13.PAL");
  75.                 for (C = 0; C < 256; C++)
  76.                 {
  77.                     R = PalStream.ReadByte();
  78.                     B = PalStream.ReadByte();
  79.                     G = PalStream.ReadByte();
  80.                     Palette[C] = Color.FromArgb(R, G, B);
  81.                 }
  82.                 PalStream.Dispose();
  83.  
  84.                 // Convert byte array into .NET bitmap
  85.                 Bitmap GFX = new Bitmap(GFXWidth, GFXHeight);
  86.                 for (int X = 0; X < GFXWidth; X++)
  87.                 {
  88.                     for (int Y = 0; Y < GFXHeight; Y++)
  89.                     {
  90.                         GFX.SetPixel(X, Y, Palette[Convert.ToInt32(ByteBuffer[X+(Y*GFXWidth)])]);
  91.                     }
  92.                 }
  93.                 return Document.FromImage(GFX);
  94.             }
  95.             catch
  96.             {
  97.                 MessageBox.Show("ERROR: Unknown fatal error loading file!");
  98.  
  99.                 Bitmap b = new Bitmap(16, 16);
  100.                 return Document.FromImage(b);
  101.             }
  102.         }
  103.  
  104.         protected override void OnSave(Document input, Stream output, SaveConfigToken token,
  105.             Surface scratchSurface, ProgressEventHandler callback)
  106.         {
  107.             //Render bitmap
  108.             RenderArgs ra = new RenderArgs(new Surface(input.Size));
  109.             input.Render(ra, false);
  110.  
  111.             // Load VGA Color palette
  112.             int R, B, G, C;
  113.             Stream PalStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("QuickBASIC_BSAVE_Graphics.SCR13.PAL");
  114.             for (C = 0; C < 256; C++)
  115.             {
  116.                 R = PalStream.ReadByte();
  117.                 B = PalStream.ReadByte();
  118.                 G = PalStream.ReadByte();
  119.                 Palette[C] = Color.FromArgb(R, G, B);
  120.             }
  121.             PalStream.Dispose();
  122.  
  123.             // Get dimensions from bitmap
  124.             int GFXWidth = ra.Bitmap.Width;
  125.             int GFXHeight = ra.Bitmap.Height;
  126.             int DataSize = GFXWidth * GFXHeight + 4;
  127.  
  128.             // Generate file header
  129.             byte[] header = new byte[7];
  130.             header[0] = 0xFD;                               //Magic
  131.             header[1] = 0x9C; header[2] = 0x00;             //Segment
  132.             header[3] = 0x00; header[4] = 0x00;             //Offset
  133.             header[5] = Convert.ToByte(DataSize & 0xFF);    //Low byte of DataSize
  134.             header[6] = Convert.ToByte(DataSize >> 8);      //High byte of DataSize
  135.  
  136.             byte[] GFX = new byte[DataSize];
  137.             // Generate bitmap data
  138.             for (int X = 0; X < GFXWidth; X++)
  139.             {
  140.                 for (int Y = 0; Y < GFXHeight; Y++)
  141.                 {
  142.                     GFX[X+(Y*GFXWidth)+4] = Convert.ToByte(NearestColor(ra.Bitmap.GetPixel(X, Y)));
  143.                 }
  144.             }
  145.  
  146.             GFXWidth = GFXWidth << 3;                       //In Screen 13 QB stores Width*8
  147.             GFX[0] = Convert.ToByte(GFXWidth & 0xFF);       //Lowbyte of GFXWidth
  148.             GFX[1] = Convert.ToByte(GFXWidth >> 8);         //Highbyte of GFXWidth
  149.             GFX[2] = Convert.ToByte(GFXHeight & 0xFF);      //Lowbyte of GFXHeight
  150.             GFX[3] = Convert.ToByte(GFXHeight >> 8);        //Highbyte of GFXHeight
  151.  
  152.             output.Write(header, 0, 7);         //Write header to file
  153.             output.Write(GFX, 0, DataSize);     //Write bitmap to file
  154.         }
  155.  
  156.         private int NearestColor(Color Pixel)
  157.         {
  158.             int diffR; int diffB; int diffG;
  159.             int smallestDiffValue = 0x7FFFFFFF;
  160.             int SmallestDiff = 0x00;
  161.             int diff = 0x00;
  162.  
  163.             for (int C = 0; C < 256; C++)
  164.             {
  165.                 diffR = Pixel.R - Palette[C].R;
  166.                 diffB = Pixel.B - Palette[C].B;
  167.                 diffG = Pixel.G - Palette[C].G;
  168.                 diff = (diffR*diffR) + (diffB*diffB) + (diffG*diffG);
  169.                 if (diff == 0) { return C; }         // Quit early if match found
  170.                 if (diff < smallestDiffValue)        // Otherwise compare to smallest color found
  171.                 { SmallestDiff = C; smallestDiffValue = diff; }
  172.             }
  173.             return SmallestDiff;
  174.         }
  175.     }
  176.  
  177.     public class MyFileTypeFactory : IFileTypeFactory
  178.     {
  179.         public FileType[] GetFileTypeInstances()
  180.         {
  181.             return new FileType[] { new MyFileType() };
  182.         }
  183.     }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement