Browse Source

Resolved findings in PR

af/merge-core
Devedse 8 years ago
parent
commit
1b5b85572b
  1. 24
      src/ImageSharp/Formats/Png/PngDecoderCore.cs
  2. 24
      src/ImageSharp/Formats/Png/PngEncoderCore.cs
  3. 8
      src/ImageSharp/Formats/Png/PngMetaData.cs
  4. 16
      src/ImageSharp/Formats/Png/PngScanlineProcessor.cs

24
src/ImageSharp/Formats/Png/PngDecoderCore.cs

@ -656,8 +656,8 @@ namespace SixLabors.ImageSharp.Formats.Png
scanlineSpan, scanlineSpan,
rowSpan, rowSpan,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Luminance16Trans.GetValueOrDefault(), pngMetaData.TransparentGray16.GetValueOrDefault(),
pngMetaData.LuminanceTrans.GetValueOrDefault()); pngMetaData.TransparentGray8.GetValueOrDefault());
break; break;
@ -690,8 +690,8 @@ namespace SixLabors.ImageSharp.Formats.Png
this.bytesPerPixel, this.bytesPerPixel,
this.bytesPerSample, this.bytesPerSample,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Rgb48Trans.GetValueOrDefault(), pngMetaData.TransparentRgb48.GetValueOrDefault(),
pngMetaData.Rgb24Trans.GetValueOrDefault()); pngMetaData.TransparentRgb24.GetValueOrDefault());
break; break;
@ -740,8 +740,8 @@ namespace SixLabors.ImageSharp.Formats.Png
pixelOffset, pixelOffset,
increment, increment,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Luminance16Trans.GetValueOrDefault(), pngMetaData.TransparentGray16.GetValueOrDefault(),
pngMetaData.LuminanceTrans.GetValueOrDefault()); pngMetaData.TransparentGray8.GetValueOrDefault());
break; break;
@ -779,8 +779,8 @@ namespace SixLabors.ImageSharp.Formats.Png
this.bytesPerPixel, this.bytesPerPixel,
this.bytesPerSample, this.bytesPerSample,
pngMetaData.HasTrans, pngMetaData.HasTrans,
pngMetaData.Rgb48Trans.GetValueOrDefault(), pngMetaData.TransparentRgb48.GetValueOrDefault(),
pngMetaData.Rgb24Trans.GetValueOrDefault()); pngMetaData.TransparentRgb24.GetValueOrDefault());
break; break;
@ -817,7 +817,7 @@ namespace SixLabors.ImageSharp.Formats.Png
ushort gc = BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(2, 2)); ushort gc = BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(2, 2));
ushort bc = BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(4, 2)); ushort bc = BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(4, 2));
pngMetaData.Rgb48Trans = new Rgb48(rc, gc, bc); pngMetaData.TransparentRgb48 = new Rgb48(rc, gc, bc);
pngMetaData.HasTrans = true; pngMetaData.HasTrans = true;
return; return;
} }
@ -825,7 +825,7 @@ namespace SixLabors.ImageSharp.Formats.Png
byte r = ReadByteLittleEndian(alpha, 0); byte r = ReadByteLittleEndian(alpha, 0);
byte g = ReadByteLittleEndian(alpha, 2); byte g = ReadByteLittleEndian(alpha, 2);
byte b = ReadByteLittleEndian(alpha, 4); byte b = ReadByteLittleEndian(alpha, 4);
pngMetaData.Rgb24Trans = new Rgb24(r, g, b); pngMetaData.TransparentRgb24 = new Rgb24(r, g, b);
pngMetaData.HasTrans = true; pngMetaData.HasTrans = true;
} }
} }
@ -835,11 +835,11 @@ namespace SixLabors.ImageSharp.Formats.Png
{ {
if (this.header.BitDepth == 16) if (this.header.BitDepth == 16)
{ {
pngMetaData.Luminance16Trans = BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(0, 2)); pngMetaData.TransparentGray16 = new Gray16(BinaryPrimitives.ReadUInt16LittleEndian(alpha.Slice(0, 2)));
} }
else else
{ {
pngMetaData.LuminanceTrans = ReadByteLittleEndian(alpha, 0); pngMetaData.TransparentGray8 = new Gray8(ReadByteLittleEndian(alpha, 0));
} }
pngMetaData.HasTrans = true; pngMetaData.HasTrans = true;

24
src/ImageSharp/Formats/Png/PngEncoderCore.cs

@ -314,37 +314,37 @@ namespace SixLabors.ImageSharp.Formats.Png
{ {
if (pngMetaData.ColorType == PngColorType.Rgb) if (pngMetaData.ColorType == PngColorType.Rgb)
{ {
if (pngMetaData.Rgb48Trans != null) if (pngMetaData.TransparentRgb48 != null)
{ {
var r = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.R); var r = BitConverter.GetBytes(pngMetaData.TransparentRgb48.Value.R);
var g = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.R); var g = BitConverter.GetBytes(pngMetaData.TransparentRgb48.Value.R);
var b = BitConverter.GetBytes(pngMetaData.Rgb48Trans.Value.B); var b = BitConverter.GetBytes(pngMetaData.TransparentRgb48.Value.B);
var alphaArray = r.Concat(g).Concat(b).ToArray(); var alphaArray = r.Concat(g).Concat(b).ToArray();
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length); this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
} }
else if (pngMetaData.Rgb24Trans != null) else if (pngMetaData.TransparentRgb24 != null)
{ {
var alphaArray = new byte[6]; var alphaArray = new byte[6];
alphaArray[1] = pngMetaData.Rgb24Trans.Value.R; alphaArray[1] = pngMetaData.TransparentRgb24.Value.R;
alphaArray[3] = pngMetaData.Rgb24Trans.Value.G; alphaArray[3] = pngMetaData.TransparentRgb24.Value.G;
alphaArray[5] = pngMetaData.Rgb24Trans.Value.B; alphaArray[5] = pngMetaData.TransparentRgb24.Value.B;
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length); this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
} }
} }
else if (pngMetaData.ColorType == PngColorType.Grayscale) else if (pngMetaData.ColorType == PngColorType.Grayscale)
{ {
if (pngMetaData.Luminance16Trans != null) if (pngMetaData.TransparentGray16 != null)
{ {
var alphaArray = BitConverter.GetBytes(pngMetaData.Luminance16Trans.Value); var alphaArray = BitConverter.GetBytes(pngMetaData.TransparentGray16.Value.PackedValue);
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length); this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
} }
else if (pngMetaData.LuminanceTrans != null) else if (pngMetaData.TransparentGray8 != null)
{ {
var alphaArray = new byte[2]; var alphaArray = new byte[2];
alphaArray[1] = pngMetaData.LuminanceTrans.Value; alphaArray[1] = pngMetaData.TransparentGray8.Value.PackedValue;
this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length); this.WriteChunk(stream, PngChunkType.PaletteAlpha, alphaArray, 0, alphaArray.Length);
} }

8
src/ImageSharp/Formats/Png/PngMetaData.cs

@ -47,22 +47,22 @@ namespace SixLabors.ImageSharp.Formats.Png
/// <summary> /// <summary>
/// Gets or sets the Rgb 24 transparent color. This represents any color in an 8 bit Rgb24 encoded png that should be transparent /// Gets or sets the Rgb 24 transparent color. This represents any color in an 8 bit Rgb24 encoded png that should be transparent
/// </summary> /// </summary>
public Rgb24? Rgb24Trans { get; set; } public Rgb24? TransparentRgb24 { get; set; }
/// <summary> /// <summary>
/// Gets or sets the Rgb 48 transparent color. This represents any color in a 16 bit Rgb24 encoded png that should be transparent /// Gets or sets the Rgb 48 transparent color. This represents any color in a 16 bit Rgb24 encoded png that should be transparent
/// </summary> /// </summary>
public Rgb48? Rgb48Trans { get; set; } public Rgb48? TransparentRgb48 { get; set; }
/// <summary> /// <summary>
/// Gets or sets the 8 bit grayscale transparent color. This represents any color in an 8 bit grayscale encoded png that should be transparent /// Gets or sets the 8 bit grayscale transparent color. This represents any color in an 8 bit grayscale encoded png that should be transparent
/// </summary> /// </summary>
public byte? LuminanceTrans { get; set; } public Gray8? TransparentGray8 { get; set; }
/// <summary> /// <summary>
/// Gets or sets the 16 bit grayscale transparent color. This represents any color in a 16 bit grayscale encoded png that should be transparent /// Gets or sets the 16 bit grayscale transparent color. This represents any color in a 16 bit grayscale encoded png that should be transparent
/// </summary> /// </summary>
public ushort? Luminance16Trans { get; set; } public Gray16? TransparentGray16 { get; set; }
/// <summary> /// <summary>
/// Gets or sets a value indicating whether the image has transparency chunk and markers were decoded /// Gets or sets a value indicating whether the image has transparency chunk and markers were decoded

16
src/ImageSharp/Formats/Png/PngScanlineProcessor.cs

@ -20,8 +20,8 @@ namespace SixLabors.ImageSharp.Formats.Png
ReadOnlySpan<byte> scanlineSpan, ReadOnlySpan<byte> scanlineSpan,
Span<TPixel> rowSpan, Span<TPixel> rowSpan,
bool hasTrans, bool hasTrans,
ushort luminance16Trans, Gray16 luminance16Trans,
byte luminanceTrans) Gray8 luminanceTrans)
where TPixel : struct, IPixel<TPixel> where TPixel : struct, IPixel<TPixel>
{ {
TPixel pixel = default; TPixel pixel = default;
@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.Formats.Png
rgba64.R = luminance; rgba64.R = luminance;
rgba64.G = luminance; rgba64.G = luminance;
rgba64.B = luminance; rgba64.B = luminance;
rgba64.A = luminance.Equals(luminance16Trans) ? ushort.MinValue : ushort.MaxValue; rgba64.A = luminance.Equals(luminance16Trans.PackedValue) ? ushort.MinValue : ushort.MaxValue;
pixel.FromRgba64(rgba64); pixel.FromRgba64(rgba64);
Unsafe.Add(ref rowSpanRef, x) = pixel; Unsafe.Add(ref rowSpanRef, x) = pixel;
@ -70,7 +70,7 @@ namespace SixLabors.ImageSharp.Formats.Png
} }
else else
{ {
byte scaledLuminanceTrans = (byte)(luminanceTrans * scaleFactor); byte scaledLuminanceTrans = (byte)(luminanceTrans.PackedValue * scaleFactor);
Rgba32 rgba32 = default; Rgba32 rgba32 = default;
for (int x = 0; x < header.Width; x++) for (int x = 0; x < header.Width; x++)
{ {
@ -93,8 +93,8 @@ namespace SixLabors.ImageSharp.Formats.Png
int pixelOffset, int pixelOffset,
int increment, int increment,
bool hasTrans, bool hasTrans,
ushort luminance16Trans, Gray16 luminance16Trans,
byte luminanceTrans) Gray8 luminanceTrans)
where TPixel : struct, IPixel<TPixel> where TPixel : struct, IPixel<TPixel>
{ {
TPixel pixel = default; TPixel pixel = default;
@ -135,7 +135,7 @@ namespace SixLabors.ImageSharp.Formats.Png
rgba64.R = luminance; rgba64.R = luminance;
rgba64.G = luminance; rgba64.G = luminance;
rgba64.B = luminance; rgba64.B = luminance;
rgba64.A = luminance.Equals(luminance16Trans) ? ushort.MinValue : ushort.MaxValue; rgba64.A = luminance.Equals(luminance16Trans.PackedValue) ? ushort.MinValue : ushort.MaxValue;
pixel.FromRgba64(rgba64); pixel.FromRgba64(rgba64);
Unsafe.Add(ref rowSpanRef, x) = pixel; Unsafe.Add(ref rowSpanRef, x) = pixel;
@ -143,7 +143,7 @@ namespace SixLabors.ImageSharp.Formats.Png
} }
else else
{ {
byte scaledLuminanceTrans = (byte)(luminanceTrans * scaleFactor); byte scaledLuminanceTrans = (byte)(luminanceTrans.PackedValue * scaleFactor);
Rgba32 rgba32 = default; Rgba32 rgba32 = default;
for (int x = pixelOffset; x < header.Width; x += increment) for (int x = pixelOffset; x < header.Width; x += increment)
{ {

Loading…
Cancel
Save