diff --git a/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs b/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
index 9b110fa8..892922c6 100644
--- a/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
+++ b/src/UglyToad.PdfPig/Graphics/Colors/ColorSpaceDetails.cs
@@ -533,23 +533,31 @@
///
internal override IReadOnlyList Transform(IReadOnlyList decoded)
{
+ var cache = new Dictionary();
var transformed = new List();
for (var i = 0; i < decoded.Count; i += NumberOfColorComponents)
{
+ int key = 0;
double[] comps = new double[NumberOfColorComponents];
for (int n = 0; n < NumberOfColorComponents; n++)
{
- comps[n] = decoded[i + n] / 255.0;
+ byte b = decoded[i + n];
+ key = (key * 31) ^ b;
+ comps[n] = b / 255.0;
+ }
+
+ if (!cache.TryGetValue(key, out double[] colors))
+ {
+ colors = Process(comps);
+ cache[key] = colors;
}
- var colors = Process(comps);
for (int c = 0; c < colors.Length; c++)
{
transformed.Add(ConvertToByte(colors[c]));
}
}
-
- return transformed;
+ return transformed.ToArray();
}
///
@@ -697,10 +705,17 @@
///
internal override IReadOnlyList Transform(IReadOnlyList values)
{
+ var cache = new Dictionary();
var transformed = new List();
for (var i = 0; i < values.Count; i += 3)
{
- var colors = Process(values[i++] / 255.0);
+ byte b = values[i++];
+ if (!cache.TryGetValue(b, out double[] colors))
+ {
+ colors = Process(b / 255.0);
+ cache[b] = colors;
+ }
+
for (int c = 0; c < colors.Length; c++)
{
transformed.Add(ConvertToByte(colors[c]));