diff --git a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
index b6b078f6d..a9002fd8c 100644
--- a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
@@ -20,6 +20,11 @@ namespace SixLabors.ImageSharp.Formats.Tga
///
private ImageMetadata metadata;
+ ///
+ /// The tga specific metadata.
+ ///
+ private TgaMetadata tgaMetadata;
+
///
/// The file header containing general information about the image.
///
@@ -342,9 +347,9 @@ namespace SixLabors.ImageSharp.Formats.Tga
#endif
this.currentStream.Read(buffer, 0, TgaFileHeader.Size);
this.fileHeader = TgaFileHeader.Parse(buffer);
-
- // TODO: no meta data yet.
this.metadata = new ImageMetadata();
+ this.tgaMetadata = this.metadata.GetFormatMetadata(TgaFormat.Instance);
+ this.tgaMetadata.BitsPerPixel = (TgaBitsPerPixel)this.fileHeader.PixelDepth;
}
}
}
diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
index 349963f7f..ddd430b05 100644
--- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
+++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
@@ -96,14 +96,74 @@ namespace SixLabors.ImageSharp.Formats.Tga
Buffer2D pixels = image.PixelBuffer;
switch (this.bitsPerPixel)
{
+ case TgaBitsPerPixel.Pixel8:
+ this.Write8Bit(stream, pixels);
+ break;
+
+ case TgaBitsPerPixel.Pixel16:
+ this.Write16Bit(stream, pixels);
+ break;
+
case TgaBitsPerPixel.Pixel24:
this.Write24Bit(stream, pixels);
break;
+
+ case TgaBitsPerPixel.Pixel32:
+ this.Write32Bit(stream, pixels);
+ break;
}
}
private IManagedByteBuffer AllocateRow(int width, int bytesPerPixel) => this.memoryAllocator.AllocatePaddedPixelRowBuffer(width, bytesPerPixel, 0);
+ ///
+ /// Writes the 8bit pixels uncompressed to the stream.
+ ///
+ /// The pixel format.
+ /// The to write to.
+ /// The containing pixel data.
+ private void Write8Bit(Stream stream, Buffer2D pixels)
+ where TPixel : struct, IPixel
+ {
+ using (IManagedByteBuffer row = this.AllocateRow(pixels.Width, 1))
+ {
+ for (int y = pixels.Height - 1; y >= 0; y--)
+ {
+ Span pixelSpan = pixels.GetRowSpan(y);
+ PixelOperations.Instance.ToGray8Bytes(
+ this.configuration,
+ pixelSpan,
+ row.GetSpan(),
+ pixelSpan.Length);
+ stream.Write(row.Array, 0, row.Length());
+ }
+ }
+ }
+
+ ///
+ /// Writes the 16bit pixels uncompressed to the stream.
+ ///
+ /// The pixel format.
+ /// The to write to.
+ /// The containing pixel data.
+ private void Write16Bit(Stream stream, Buffer2D pixels)
+ where TPixel : struct, IPixel
+ {
+ using (IManagedByteBuffer row = this.AllocateRow(pixels.Width, 2))
+ {
+ for (int y = pixels.Height - 1; y >= 0; y--)
+ {
+ Span pixelSpan = pixels.GetRowSpan(y);
+ PixelOperations.Instance.ToBgra5551Bytes(
+ this.configuration,
+ pixelSpan,
+ row.GetSpan(),
+ pixelSpan.Length);
+ stream.Write(row.Array, 0, row.Length());
+ }
+ }
+ }
+
///
/// Writes the 24bit pixels uncompressed to the stream.
///
@@ -127,5 +187,29 @@ namespace SixLabors.ImageSharp.Formats.Tga
}
}
}
+
+ ///
+ /// Writes the 32bit pixels uncompressed to the stream.
+ ///
+ /// The pixel format.
+ /// The to write to.
+ /// The containing pixel data.
+ private void Write32Bit(Stream stream, Buffer2D pixels)
+ where TPixel : struct, IPixel
+ {
+ using (IManagedByteBuffer row = this.AllocateRow(pixels.Width, 4))
+ {
+ for (int y = pixels.Height - 1; y >= 0; y--)
+ {
+ Span pixelSpan = pixels.GetRowSpan(y);
+ PixelOperations.Instance.ToBgra32Bytes(
+ this.configuration,
+ pixelSpan,
+ row.GetSpan(),
+ pixelSpan.Length);
+ stream.Write(row.Array, 0, row.Length());
+ }
+ }
+ }
}
}