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]));