private void FlushCanvases(Action <byte[]> onChunkReady) { for (int y = 0; y < Height; y += TileHeight) { RCINFO[] rcs = new RCINFO[WidthCount]; int i = 0; for (int x = 0; x < Width; x += TileWidth) { var canvas = GetCanvas(x, y); var rcinfo = new RCINFO { currentOffset = 0, rc = canvas, }; canvas.LockAddress(out rcinfo.pitch, out rcinfo.data); rcinfo.length = Math.Min(Width - x, TileWidth) * canvas.PixFormat.BytesPerPixel(); } var tileHeightSize = TileSize(Math.Min(TileHeight, Height - y)); var bytesPerWrite = PixFormat.PixelsPerYAxis(); // We need to correct for DXT3/DXT5 images having multiple pixels in Y axis per written bytes // Additionally, MagLevel also applies to the canvases, so need to keep that } }
public override void Write(ArchiveWriter writer) { writer.Write((byte)0); if (_objects.Count > 0) { writer.Write((byte)1); base.Write(writer); } else { writer.Write((byte)0); } writer.WriteCompressedInt(Width); writer.WriteCompressedInt(Height); writer.WriteCompressedInt((int)PixFormat); writer.WriteCompressedInt(MagLevel); for (var i = 0; i < 4; i++) { writer.WriteCompressedInt((int)0); } int dataSize = 0; // Data Size writer.Write(dataSize); if (dataSize > 0) { // CWzCanvas::SerializeData writer.Write((byte)0); for (int y = 0; y < Height; y += TileHeight) { RCINFO[] rcs = new RCINFO[WidthCount]; int i = 0; for (int x = 0; x < Width; x += TileWidth) { var canvas = GetCanvas(x, y); var rcinfo = new RCINFO { currentOffset = 0, rc = canvas, }; canvas.LockAddress(out rcinfo.pitch, out rcinfo.data); } } } }