Skip to content

Commit d5a3de1

Browse files
committed
Avoid using Dictionary's
1 parent 98b96fe commit d5a3de1

File tree

3 files changed

+70
-43
lines changed

3 files changed

+70
-43
lines changed

src/ImageSharp/Formats/Tiff/Compression/Decompressors/CcittTwoDimensionalCode.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,21 @@ internal readonly struct CcittTwoDimensionalCode
1313
/// <summary>
1414
/// Initializes a new instance of the <see cref="CcittTwoDimensionalCode"/> struct.
1515
/// </summary>
16-
/// <param name="type">The type.</param>
16+
/// <param name="code">The code word.</param>
17+
/// <param name="type">The type of the code.</param>
1718
/// <param name="bitsRequired">The bits required.</param>
1819
/// <param name="extensionBits">The extension bits.</param>
19-
public CcittTwoDimensionalCode(CcittTwoDimensionalCodeType type, int bitsRequired, int extensionBits = 0)
20-
=> this.value = (ushort)((byte)type | ((bitsRequired & 0b1111) << 8) | ((extensionBits & 0b111) << 11));
20+
public CcittTwoDimensionalCode(int code, CcittTwoDimensionalCodeType type, int bitsRequired, int extensionBits = 0)
21+
{
22+
this.Code = code;
23+
this.value = (ushort)((byte)type | ((bitsRequired & 0b1111) << 8) | ((extensionBits & 0b111) << 11));
24+
}
2125

2226
/// <summary>
2327
/// Gets the code type.
2428
/// </summary>
2529
public CcittTwoDimensionalCodeType Type => (CcittTwoDimensionalCodeType)(this.value & 0b11111111);
30+
31+
public int Code { get; }
2632
}
2733
}

src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6BitReader.cs

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// Copyright (c) Six Labors.
22
// Licensed under the Apache License, Version 2.0.
33

4-
using System.Collections.Generic;
54
using System.Runtime.CompilerServices;
65
using SixLabors.ImageSharp.Formats.Tiff.Constants;
76
using SixLabors.ImageSharp.IO;
@@ -16,38 +15,23 @@ internal sealed class T6BitReader : T4BitReader
1615
{
1716
private readonly int maxCodeLength = 12;
1817

19-
private static readonly CcittTwoDimensionalCode None = new(CcittTwoDimensionalCodeType.None, 0);
18+
private static readonly CcittTwoDimensionalCode None = new(0, CcittTwoDimensionalCodeType.None, 0);
2019

21-
private static readonly Dictionary<uint, CcittTwoDimensionalCode> Len1Codes = new()
22-
{
23-
{ 0b1, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.Vertical0, 1) }
24-
};
20+
private static readonly CcittTwoDimensionalCode Len1Code1 = new(0b1, CcittTwoDimensionalCodeType.Vertical0, 1);
2521

26-
private static readonly Dictionary<uint, CcittTwoDimensionalCode> Len3Codes = new()
27-
{
28-
{ 0b001, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.Horizontal, 3) },
29-
{ 0b010, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalL1, 3) },
30-
{ 0b011, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalR1, 3) }
31-
};
22+
private static readonly CcittTwoDimensionalCode Len3Code001 = new(0b001, CcittTwoDimensionalCodeType.Horizontal, 3);
23+
private static readonly CcittTwoDimensionalCode Len3Code010 = new(0b010, CcittTwoDimensionalCodeType.VerticalL1, 3);
24+
private static readonly CcittTwoDimensionalCode Len3Code011 = new(0b011, CcittTwoDimensionalCodeType.VerticalR1, 3);
3225

33-
private static readonly Dictionary<uint, CcittTwoDimensionalCode> Len4Codes = new()
34-
{
35-
{ 0b0001, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.Pass, 4) }
36-
};
26+
private static readonly CcittTwoDimensionalCode Len4Code0001 = new(0b0001, CcittTwoDimensionalCodeType.Pass, 4);
3727

38-
private static readonly Dictionary<uint, CcittTwoDimensionalCode> Len6Codes = new()
39-
{
40-
{ 0b000011, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalR2, 6) },
41-
{ 0b000010, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalL2, 6) }
42-
};
28+
private static readonly CcittTwoDimensionalCode Len6Code000011 = new(0b000011, CcittTwoDimensionalCodeType.VerticalR2, 6);
29+
private static readonly CcittTwoDimensionalCode Len6Code000010 = new(0b000010, CcittTwoDimensionalCodeType.VerticalL2, 6);
4330

44-
private static readonly Dictionary<uint, CcittTwoDimensionalCode> Len7Codes = new()
45-
{
46-
{ 0b0000011, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalR3, 7) },
47-
{ 0b0000010, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.VerticalL3, 7) },
48-
{ 0b0000001, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.Extensions2D, 7) },
49-
{ 0b0000000, new CcittTwoDimensionalCode(CcittTwoDimensionalCodeType.Extensions1D, 7) }
50-
};
31+
private static readonly CcittTwoDimensionalCode Len7Code0000011 = new(0b0000011, CcittTwoDimensionalCodeType.VerticalR3, 7);
32+
private static readonly CcittTwoDimensionalCode Len7Code0000010 = new(0b0000010, CcittTwoDimensionalCodeType.VerticalL3, 7);
33+
private static readonly CcittTwoDimensionalCode Len7Code0000001 = new(0b0000001, CcittTwoDimensionalCodeType.Extensions2D, 7);
34+
private static readonly CcittTwoDimensionalCode Len7Code0000000 = new(0b0000000, CcittTwoDimensionalCodeType.Extensions1D, 7);
5135

5236
/// <summary>
5337
/// Initializes a new instance of the <see cref="T6BitReader"/> class.
@@ -61,7 +45,7 @@ public T6BitReader(BufferedReadStream input, TiffFillOrder fillOrder, int bytesT
6145
}
6246

6347
/// <inheritdoc/>
64-
public override bool HasMoreData => this.Position < (ulong)this.DataLength - 1 || ((uint)(this.BitsRead - 1) < (7 - 1));
48+
public override bool HasMoreData => this.Position < (ulong)this.DataLength - 1 || (uint)(this.BitsRead - 1) < (7 - 1);
6549

6650
/// <summary>
6751
/// Gets or sets the two dimensional code.
@@ -84,45 +68,81 @@ public bool ReadNextCodeWord()
8468
switch (this.CurValueBitsRead)
8569
{
8670
case 1:
87-
if (Len1Codes.ContainsKey(value))
71+
if (value == Len1Code1.Code)
8872
{
89-
this.Code = Len1Codes[value];
73+
this.Code = Len1Code1;
9074
return false;
9175
}
9276

9377
break;
9478

9579
case 3:
96-
if (Len3Codes.ContainsKey(value))
80+
if (value == Len3Code001.Code)
9781
{
98-
this.Code = Len3Codes[value];
82+
this.Code = Len3Code001;
83+
return false;
84+
}
85+
86+
if (value == Len3Code010.Code)
87+
{
88+
this.Code = Len3Code010;
89+
return false;
90+
}
91+
92+
if (value == Len3Code011.Code)
93+
{
94+
this.Code = Len3Code011;
9995
return false;
10096
}
10197

10298
break;
10399

104100
case 4:
105-
if (Len4Codes.ContainsKey(value))
101+
if (value == Len4Code0001.Code)
106102
{
107-
this.Code = Len4Codes[value];
103+
this.Code = Len4Code0001;
108104
return false;
109105
}
110106

111107
break;
112108

113109
case 6:
114-
if (Len6Codes.ContainsKey(value))
110+
if (value == Len6Code000010.Code)
115111
{
116-
this.Code = Len6Codes[value];
112+
this.Code = Len6Code000010;
113+
return false;
114+
}
115+
116+
if (value == Len6Code000011.Code)
117+
{
118+
this.Code = Len6Code000011;
117119
return false;
118120
}
119121

120122
break;
121123

122124
case 7:
123-
if (Len7Codes.ContainsKey(value))
125+
if (value == Len7Code0000000.Code)
126+
{
127+
this.Code = Len7Code0000000;
128+
return false;
129+
}
130+
131+
if (value == Len7Code0000001.Code)
132+
{
133+
this.Code = Len7Code0000001;
134+
return false;
135+
}
136+
137+
if (value == Len7Code0000011.Code)
138+
{
139+
this.Code = Len7Code0000011;
140+
return false;
141+
}
142+
143+
if (value == Len7Code0000010.Code)
124144
{
125-
this.Code = Len7Codes[value];
145+
this.Code = Len7Code0000010;
126146
return false;
127147
}
128148

src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ private nint WriteScanLine(Span<byte> buffer, Span<byte> scanLine, nint bitsWrit
7777
{
7878
nint bitPos = Numerics.Modulo8(bitsWritten);
7979
nint bufferPos = bitsWritten / 8;
80+
ref byte scanLineRef = ref MemoryMarshal.GetReference(scanLine);
8081
for (nint i = 0; i < scanLine.Length; i++)
8182
{
82-
if (Unsafe.Add(ref MemoryMarshal.GetReference(scanLine), i) != this.white)
83+
if (Unsafe.Add(ref scanLineRef, i) != this.white)
8384
{
8485
BitWriterUtils.WriteBit(buffer, bufferPos, bitPos);
8586
}

0 commit comments

Comments
 (0)