diff --git a/source2/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs b/source2/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs new file mode 100644 index 000000000..0d3a0ffc7 --- /dev/null +++ b/source2/Users/Orvid/Orvid.Graphics/ImageFormats/ImageFormat.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace Orvid.Graphics.ImageFormats +{ + /// + /// This class represents any Image format, + /// and should be the base type for all drivers. + /// + public abstract class ImageFormat + { + /// + /// Save an image to the specified stream. + /// + /// The image to save. + /// The Stream to write to. + public abstract void Save(Image i, Stream dest); + /// + /// Load an image from the specified stream. + /// + /// The Stream to load from. + /// The loaded Image. + public abstract Image Load(Stream s); + } +} diff --git a/source2/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs b/source2/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs new file mode 100644 index 000000000..4123e532a --- /dev/null +++ b/source2/Users/Orvid/Orvid.Graphics/ImageFormats/OIFSupport.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace Orvid.Graphics.ImageFormats +{ + public class OIFSupport : ImageFormat + { + + public override void Save(Image i, System.IO.Stream dest) + { + MemoryStream m = new MemoryStream(); + m.WriteByte(0); +#warning Change this next byte to 255 if you update Image with UInt64 for width and height. + m.WriteByte(0); + m.WriteByte(0); + m.WriteByte(0); // Write the 8 empty bytes at the start of the file. + m.WriteByte(0); + m.WriteByte(0); + m.WriteByte(0); + m.WriteByte(0); + + byte[] dat = BitConverter.GetBytes(i.Height); // Write the height. + m.Write(dat, 0, dat.Length); + dat = BitConverter.GetBytes(i.Width); // Write the width. + m.Write(dat, 0, dat.Length); + + // Now to write the actual data. + Pixel p; + for (uint x = 0; x < i.Width; x++) + { + for (uint y = 0; y < i.Height; y++) + { + p = i.GetPixel(x, y); + m.WriteByte(p.R); + m.WriteByte(p.G); + m.WriteByte(p.B); + m.WriteByte(p.A); + } + } + dat = Orvid.Compression.LZMA.Compress(m.GetBuffer()); + dest.WriteByte(255); + dest.Write(dat, 0, dat.Length); + } + + private UInt32 ReadUInt32(byte[] data) + { + UInt32 r = 0; + + r += data[3]; + r <<= 8; + r += data[2]; + r <<= 8; + r += data[1]; + r <<= 8; + r += data[0]; + + return r; + } + + public override Image Load(System.IO.Stream s) + { + + if (s.ReadByte() == 255) + { + byte[] buf = new byte[s.Length - 1]; + s.Read(buf, 0, buf.Length); + s = new MemoryStream(Orvid.Compression.LZMA.Decompress(buf)); + } + else + { + s.Position = 0; + } + byte[] tmp = new byte[8]; + s.Read(tmp, 0, 8); // skip the 8 empty bytes at the start of the file. + tmp = new byte[4]; + s.Read(tmp, 0, 4); + uint Height = ReadUInt32(tmp); // Read the Height. + s.Read(tmp, 0, 4); + uint Width = ReadUInt32(tmp); // Read the Width. + Image i = new Image((int)Width, (int)Height); + byte r, g, b, a; + for (uint x = 0; x < Width; x++) + { + for (uint y = 0; y < Height; y++) + { + r = (byte)s.ReadByte(); + g = (byte)s.ReadByte(); + b = (byte)s.ReadByte(); + a = (byte)s.ReadByte(); + i.SetPixel(x, y, new Pixel(r, g, b, a)); + } + } + return i; + } + } +} diff --git a/source2/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj b/source2/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj index 835ebb3d0..7004b921c 100644 --- a/source2/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj +++ b/source2/Users/Orvid/Orvid.Graphics/Orvid.Graphics.csproj @@ -52,6 +52,8 @@ Code + + diff --git a/source2/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs b/source2/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs index 9a7717270..dd2bb7aa5 100644 --- a/source2/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs +++ b/source2/Users/Orvid/Orvid.Graphics/Shapes/ShapedImage.cs @@ -17,7 +17,12 @@ namespace Orvid.Graphics.Shapes { if (Modified) { - + this.Clear(new Pixel(true)); + foreach (Shape s in Shapes) + { + s.Draw(); + } + this.Modified = false; } return this; } diff --git a/source2/Users/Orvid/Orvid.Graphics/Shapes/Square.cs b/source2/Users/Orvid/Orvid.Graphics/Shapes/Square.cs index e22d2de19..9082ce8f6 100644 --- a/source2/Users/Orvid/Orvid.Graphics/Shapes/Square.cs +++ b/source2/Users/Orvid/Orvid.Graphics/Shapes/Square.cs @@ -7,7 +7,7 @@ namespace Orvid.Graphics.Shapes public class Square : Shape { private Image i; - private Pixel fillColor = new Pixel(255, 255, 255, 0); // Initialize white. + private Pixel fillColor = new Pixel(255, 255, 255, 255); // Initialize white. public Pixel FillColor { get @@ -16,11 +16,14 @@ namespace Orvid.Graphics.Shapes } set { - Modified = true; - fillColor = value; + if (fillColor != value) + { + Modified = true; + fillColor = value; + } } } - private Pixel borderColor = new Pixel(0, 0, 0, 0); // Initialize black. + private Pixel borderColor = new Pixel(0, 0, 0, 255); // Initialize black. public Pixel BorderColor { get @@ -29,8 +32,11 @@ namespace Orvid.Graphics.Shapes } set { - Modified = true; - borderColor = value; + if (borderColor != value) + { + Modified = true; + borderColor = value; + } } } private int size; @@ -42,9 +48,12 @@ namespace Orvid.Graphics.Shapes } set { - Modified = true; - size = value; - i = new Image(this.Size, this.Size); + if (size != value) + { + Modified = true; + size = value; + i = new Image(this.Size, this.Size); + } } }