From b6474dda4c0d6a4d90f6220a72c3b726a52055eb Mon Sep 17 00:00:00 2001
From: BobLd <38405645+BobLd@users.noreply.github.com>
Date: Sun, 29 Sep 2024 19:28:53 +0100
Subject: [PATCH] Improve UnwrapIndexedColorSpaceBytes
---
.../Graphics/Colors/ColorSpaceDetails.cs | 114 +++++++++---------
1 file changed, 58 insertions(+), 56 deletions(-)
diff --git a/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs b/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
index 55df8e0ad..6e5dd1aac 100644
--- a/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
+++ b/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
@@ -63,7 +63,7 @@ protected internal ColorSpaceDetails(ColorSpace type)
///
/// Transform image bytes.
///
- internal abstract ReadOnlySpan Transform(ReadOnlySpan decoded);
+ internal abstract Span Transform(Span decoded);
///
/// Convert to byte.
@@ -131,7 +131,7 @@ public override IColor GetInitializeColor()
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
return decoded;
}
@@ -193,7 +193,7 @@ public override IColor GetInitializeColor()
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
return decoded;
}
@@ -256,7 +256,7 @@ public override IColor GetInitializeColor()
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
return decoded;
}
@@ -360,80 +360,82 @@ public override IColor GetColor(params double[] values)
});
}
- internal ReadOnlySpan UnwrapIndexedColorSpaceBytes(ReadOnlySpan input)
+ internal Span UnwrapIndexedColorSpaceBytes(Span input)
{
- var multiplier = 1;
- Func>? transformer = null;
switch (BaseType)
{
case ColorSpace.DeviceRGB:
case ColorSpace.CalRGB:
case ColorSpace.Lab:
- transformer = x =>
+ {
+ Span result = new byte[input.Length * 3];
+ var i = 0;
+ foreach (var x in input)
{
- var r = new byte[3];
- for (var i = 0; i < 3; i++)
+ for (var j = 0; j < 3; ++j)
{
- r[i] = ColorTable[x * 3 + i];
+ result[i++] = ColorTable[x * 3 + j];
}
+ }
- return r;
- };
- multiplier = 3;
- break;
+ return result;
+ }
case ColorSpace.DeviceCMYK:
- transformer = x =>
+ {
+ Span result = new byte[input.Length * 4];
+ var i = 0;
+ foreach (var x in input)
{
- var r = new byte[4];
- for (var i = 0; i < 4; i++)
+ for (var j = 0; j < 4; ++j)
{
- r[i] = ColorTable[x * 4 + i];
+ result[i++] = ColorTable[x * 4 + j];
}
+ }
- return r;
- };
-
- multiplier = 4;
- break;
+ return result;
+ }
case ColorSpace.DeviceGray:
case ColorSpace.CalGray:
case ColorSpace.Separation:
- transformer = x => new[] { ColorTable[x] };
- multiplier = 1;
- break;
+ {
+ for (var i = 0; i < input.Length; ++i)
+ {
+ ref byte b = ref input[i];
+ b = ColorTable[b];
+ }
+
+ return input;
+ }
case ColorSpace.DeviceN:
case ColorSpace.ICCBased:
- transformer = x =>
+ {
+ int i = 0;
+ if (BaseColorSpace.NumberOfColorComponents == 1)
{
- var r = new byte[BaseColorSpace.NumberOfColorComponents];
- for (var i = 0; i < BaseColorSpace.NumberOfColorComponents; i++)
+ // In place
+ for (i = 0; i < input.Length; ++i)
{
- r[i] = ColorTable[x * BaseColorSpace.NumberOfColorComponents + i];
+ ref byte b = ref input[i];
+ b = ColorTable[b];
}
- return r;
- };
-
- multiplier = BaseColorSpace.NumberOfColorComponents;
- break;
- }
+ return input;
+ }
- if (transformer != null)
- {
- var result = new byte[input.Length * multiplier];
- var i = 0;
- foreach (var b in input)
- {
- foreach (var newByte in transformer(b).Span)
+ Span result = new byte[input.Length * BaseColorSpace.NumberOfColorComponents];
+ foreach (var x in input)
{
- result[i++] = newByte;
+ for (var j = 0; j < BaseColorSpace.NumberOfColorComponents; ++j)
+ {
+ result[i++] = ColorTable[x * BaseColorSpace.NumberOfColorComponents + j];
+ }
}
- }
- return result;
+ return result;
+ }
}
return input;
@@ -453,7 +455,7 @@ public override IColor GetInitializeColor()
/// Unwrap then transform using base color space details.
///
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
var unwraped = UnwrapIndexedColorSpaceBytes(decoded);
return BaseColorSpace.Transform(unwraped);
@@ -549,7 +551,7 @@ public override IColor GetColor(params double[] values)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
var cache = new Dictionary();
var transformed = new List();
@@ -726,7 +728,7 @@ public override IColor GetColor(params double[] values)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan values)
+ internal override Span Transform(Span values)
{
var colorCache = new Dictionary(values.Length);
var transformed = new List(values.Length);
@@ -842,7 +844,7 @@ private RGBColor TransformToRGB(double colorA)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
var transformed = new byte[decoded.Length];
@@ -984,7 +986,7 @@ private RGBColor TransformToRGB((double A, double B, double C) colorAbc)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
var transformed = new byte[decoded.Length];
int index = 0;
@@ -1106,7 +1108,7 @@ private RGBColor TransformToRGB((double A, double B, double C) colorAbc)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
var transformed = new byte[decoded.Length];
int index = 0;
@@ -1293,7 +1295,7 @@ public override IColor GetInitializeColor()
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
// TODO - use ICC profile
@@ -1391,7 +1393,7 @@ public override IColor GetColor(params double[] values)
/// Cannot be called for , will throw a .
///
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
throw new InvalidOperationException("PatternColorSpaceDetails");
}
@@ -1446,7 +1448,7 @@ public override IColor GetColor(params double[] values)
}
///
- internal override ReadOnlySpan Transform(ReadOnlySpan decoded)
+ internal override Span Transform(Span decoded)
{
throw new InvalidOperationException("UnsupportedColorSpaceDetails");
}