public object Process(object asset, AssetInfo info) { if (asset == null) { throw new ArgumentNullException(nameof(asset)); } if (info == null) { throw new ArgumentNullException(nameof(info)); } var sprite = (IReadOnlyTexture <byte>)asset; var layout = SpriteSheetUtil.ArrangeSpriteSheet(sprite.Regions.Count, 1, sprite.GetRegionBuffer); var totalHeight = ApiUtil.NextPowerOfTwo(layout.Height); byte[] pixelData = new byte[layout.Width * totalHeight]; var subImages = new Region[sprite.Regions.Count]; for (int n = 0; n < sprite.Regions.Count; n++) { var frame = sprite.GetRegionBuffer(n); var destWidth = frame.Width + 2 * MarginPixels; var destHeight = frame.Height + 2 * MarginPixels; var(x, y) = layout.Positions[n]; for (int j = 0; j < destHeight; j++) { for (int i = 0; i < destWidth; i++) { var sourceX = Math.Clamp(i - MarginPixels, 0, frame.Width - 1); var sourceY = Math.Clamp(j - MarginPixels, 0, frame.Height - 1); int src = sourceX + sourceY * sprite.Width; int dest = x + i + (y + j) * layout.Width; byte pixel = frame.Buffer[src]; pixelData[dest] = pixel; } } subImages[n] = new Region( new Vector2(x + MarginPixels, y + MarginPixels), new Vector2(frame.Width, frame.Height), new Vector2(layout.Width, totalHeight), 0); } return(new SimpleTexture <byte>( info.AssetId, sprite.Id.ToString(), layout.Width, totalHeight, pixelData, subImages)); }
public static Image <Rgba32> PackSpriteSheet(uint[] palette, int frameCount, GetFrameDelegate <byte> getFrame) { var layout = SpriteSheetUtil.ArrangeSpriteSheet(frameCount, 0, getFrame); Image <Rgba32> image = new Image <Rgba32>(layout.Width, layout.Height); if (!image.TryGetSinglePixelSpan(out var rgbaSpan)) { throw new InvalidOperationException("Could not retrieve single span from Image"); } Span <uint> pixels = MemoryMarshal.Cast <Rgba32, uint>(rgbaSpan); for (var i = 0; i < frameCount; i++) { var frame = getFrame(i); var(toX, toY) = layout.Positions[i]; var target = pixels[(toX + toY * layout.Width)..];