Download WestwoodPaletteLoader.zip, last updated 26/12/2017 (27.76 KB)

Download
  • md5: da29ba80301e3fa413c90a973afdaec9
  • sha1: 362ce84dba11d8047dc3c1dc3e44ee2f0edee602
  • sha256: 2e31cc54ea412623684856d331851c8b213bc6369629c620a2fc2d44aedae2bd
using System.Drawing;
using System.IO;

// Reading and writing 18-bit RGB VGA Palette (pal) files with C#
// http://www.cyotek.com/blog/reading-and-writing-18-bit-rgb-vga-palette-pal-files-with-csharp

namespace Cyotek.Demonstrations.Rgb18BitPalette
{
  internal static class PaletteComparer
  {
    #region Static Methods

    public static PaletteCompareResult Compare(string x, string y)
    {
      using (Stream source = File.OpenRead(x))
      {
        using (Stream dest = File.OpenRead(y))
        {
          return Compare(source, dest);
        }
      }
    }

    public static PaletteCompareResult Compare(Stream x, Stream y)
    {
      PaletteCompareResult result;

      if (!AreFilesEqual(x, y))
      {
        y.Position = 0;
        y.Position = 0;

        result = !ArePalettesEqual(x, y) ? PaletteCompareResult.Mismatch : PaletteCompareResult.ColorMatch;
      }
      else
      {
        result = PaletteCompareResult.Match;
      }

      return result;
    }

    public static PaletteCompareResult Compare(WestwoodPalette palette, string y)
    {
      PaletteCompareResult result;

      using (Stream dest = File.OpenRead(y))
      {
        result = Compare(palette, dest);
      }

      return result;
    }

    public static PaletteCompareResult Compare(WestwoodPalette palette, Stream y)
    {
      PaletteCompareResult result;

      result = !ArePalettesEqual(palette, y) ? PaletteCompareResult.Mismatch : PaletteCompareResult.ColorMatch;

      return result;
    }

    private static bool AreFilesEqual(Stream source, Stream dest)
    {
      bool result;

      result = source.Length == dest.Length;

      if (result)
      {
        byte[] sourceBuffer;
        byte[] destBuffer;
        int sourceRead;
        int destRead;
        int bufferSize;

        bufferSize = 4096;
        sourceBuffer = new byte[bufferSize];
        destBuffer = new byte[bufferSize];

        do
        {
          sourceRead = source.Read(sourceBuffer, 0, bufferSize);
          destRead = dest.Read(destBuffer, 0, bufferSize);

          if (sourceRead != destRead)
          {
            result = false;
          }
          else
          {
            for (int i = 0; i < sourceRead; i++)
            {
              if (sourceBuffer[i] != destBuffer[i])
              {
                result = false;
                break;
              }
            }
          }
        } while ((sourceRead != 0 || destRead != 0) && result);
      }

      return result;
    }

    private static bool ArePalettesEqual(Stream x, Stream y)
    {
      WestwoodPalette palette;
      bool result;

      palette = new WestwoodPalette();
      palette.Load(x);

      result = ArePalettesEqual(palette, y);

      return result;
    }

    private static bool ArePalettesEqual(WestwoodPalette x, Stream y)
    {
      WestwoodPalette destination;
      bool result;

      try
      {
        destination = new WestwoodPalette();
        destination.Load(y);
      }
      catch
      {
        destination = new WestwoodPalette();
      }

      result = ArePalettesEqual(x, destination);

      return result;
    }

    private static bool ArePalettesEqual(WestwoodPalette x, WestwoodPalette y)
    {
      bool result;

      if (x.Count == y.Count)
      {
        result = true;

        for (int i = 0; i < x.Count; i++)
        {
          Color cx;
          Color cy;

          cx = x[i];
          cy = y[i];

          if (cx.ToArgb() != cy.ToArgb())
          {
            result = false;
            break;
          }
        }
      }
      else
      {
        result = false;
      }

      return result;
    }

    #endregion
  }
}

Donate

Donate