Browse Source

Use Dictionarys for terminating and makeup codes

pull/1570/head
Brian Popow 6 years ago
parent
commit
7514df6ddf
  1. 729
      src/ImageSharp/Formats/Tiff/Compression/T4BitReader.cs

729
src/ImageSharp/Formats/Tiff/Compression/T4BitReader.cs

@ -3,6 +3,7 @@
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Memory;
@ -60,6 +61,136 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
private const int MaxCodeLength = 13; private const int MaxCodeLength = 13;
private static readonly Dictionary<uint, uint> WhiteLen4TermCodes = new Dictionary<uint, uint>()
{
{ 0x7, 2 }, { 0x8, 3 }, { 0xB, 4 }, { 0xC, 5 }, { 0xE, 6 }, { 0xF, 7 }
};
private static readonly Dictionary<uint, uint> WhiteLen5TermCodes = new Dictionary<uint, uint>()
{
{ 0x13, 8 }, { 0x14, 9 }, { 0x7, 10 }, { 0x8, 11 }
};
private static readonly Dictionary<uint, uint> WhiteLen6TermCodes = new Dictionary<uint, uint>()
{
{ 0x7, 1 }, { 0x8, 12 }, { 0x3, 13 }, { 0x34, 14 }, { 0x35, 15 }, { 0x2A, 16 }, { 0x2B, 17 }
};
private static readonly Dictionary<uint, uint> WhiteLen7TermCodes = new Dictionary<uint, uint>()
{
{ 0x27, 18 }, { 0xC, 19 }, { 0x8, 20 }, { 0x17, 21 }, { 0x3, 22 }, { 0x4, 23 }, { 0x28, 24 }, { 0x2B, 25 }, { 0x13, 26 }, { 0x24, 27 }, { 0x18, 28 }
};
private static readonly Dictionary<uint, uint> WhiteLen8TermCodes = new Dictionary<uint, uint>()
{
{ 0x35, 0 }, { 0x2, 29 }, { 0x3, 30 }, { 0x1A, 31 }, { 0x1B, 32 }, { 0x12, 33 }, { 0x13, 34 }, { 0x14, 35 }, { 0x15, 36 }, { 0x16, 37 }, { 0x17, 38 }, { 0x28, 39 }, { 0x29, 40 }, { 0x2A, 41 },
{ 0x2B, 42 }, { 0x2C, 43 }, { 0x2D, 44 }, { 0x4, 45 }, { 0x5, 46 }, { 0xA, 47 }, { 0xB, 48 }, { 0x52, 49 }, { 0x53, 50 }, { 0x54, 51 }, { 0x55, 52 }, { 0x24, 53 }, { 0x25, 54 }, { 0x58, 55 },
{ 0x59, 56 }, { 0x5A, 57 }, { 0x5B, 58 }, { 0x4A, 59 }, { 0x4B, 60 }, { 0x32, 61 }, { 0x33, 62 }, { 0x34, 63 }
};
private static readonly Dictionary<uint, uint> BlackLen2TermCodes = new Dictionary<uint, uint>()
{
{ 0x3, 2 }, { 0x2, 3 }
};
private static readonly Dictionary<uint, uint> BlackLen3TermCodes = new Dictionary<uint, uint>()
{
{ 0x2, 1 }, { 0x3, 4 }
};
private static readonly Dictionary<uint, uint> BlackLen4TermCodes = new Dictionary<uint, uint>()
{
{ 0x3, 5 }, { 0x2, 6 }
};
private static readonly Dictionary<uint, uint> BlackLen5TermCodes = new Dictionary<uint, uint>()
{
{ 0x3, 7 }
};
private static readonly Dictionary<uint, uint> BlackLen6TermCodes = new Dictionary<uint, uint>()
{
{ 0x5, 8 }, { 0x4, 9 }
};
private static readonly Dictionary<uint, uint> BlackLen7TermCodes = new Dictionary<uint, uint>()
{
{ 0x4, 10 }, { 0x5, 11 }, { 0x7, 12 }
};
private static readonly Dictionary<uint, uint> BlackLen8TermCodes = new Dictionary<uint, uint>()
{
{ 0x4, 13 }, { 0x7, 14 }
};
private static readonly Dictionary<uint, uint> BlackLen9TermCodes = new Dictionary<uint, uint>()
{
{ 0x18, 15 }
};
private static readonly Dictionary<uint, uint> BlackLen10TermCodes = new Dictionary<uint, uint>()
{
{ 0x37, 0 }, { 0x17, 16 }, { 0x18, 17 }, { 0x8, 18 }
};
private static readonly Dictionary<uint, uint> BlackLen11TermCodes = new Dictionary<uint, uint>()
{
{ 0x67, 19 }, { 0x68, 20 }, { 0x6C, 21 }, { 0x37, 22 }, { 0x28, 23 }, { 0x17, 24 }, { 0x18, 25 }
};
private static readonly Dictionary<uint, uint> BlackLen12TermCodes = new Dictionary<uint, uint>()
{
{ 0xCA, 26 }, { 0xCB, 27 }, { 0xCC, 28 }, { 0xCD, 29 }, { 0x68, 30 }, { 0x69, 31 }, { 0x6A, 32 }, { 0x6B, 33 }, { 0xD2, 34 },
{ 0xD3, 35 }, { 0xD4, 36 }, { 0xD5, 37 }, { 0xD6, 38 }, { 0xD7, 39 }, { 0x6C, 40 }, { 0x6D, 41 }, { 0xDA, 42 }, { 0xDB, 43 },
{ 0x54, 44 }, { 0x55, 45 }, { 0x56, 46 }, { 0x57, 47 }, { 0x64, 48 }, { 0x65, 49 }, { 0x52, 50 }, { 0x53, 51 }, { 0x24, 52 },
{ 0x37, 53 }, { 0x38, 54 }, { 0x27, 55 }, { 0x28, 56 }, { 0x58, 57 }, { 0x59, 58 }, { 0x2B, 59 }, { 0x2C, 60 }, { 0x5A, 61 },
{ 0x66, 62 }, { 0x67, 63 }
};
private static readonly Dictionary<uint, uint> WhiteLen5MakeupCodes = new Dictionary<uint, uint>()
{
{ 0x1B, 64 }, { 0x12, 128 }
};
private static readonly Dictionary<uint, uint> WhiteLen6MakeupCodes = new Dictionary<uint, uint>()
{
{ 0x17, 192 }, { 0x18, 1664 }
};
private static readonly Dictionary<uint, uint> WhiteLen8MakeupCodes = new Dictionary<uint, uint>()
{
{ 0x36, 320 }, { 0x37, 348 }, { 0x64, 448 }, { 0x65, 512 }, { 0x68, 576 }, { 0x67, 640 }
};
private static readonly Dictionary<uint, uint> WhiteLen7MakeupCodes = new Dictionary<uint, uint>()
{
{ 0x37, 256 }
};
private static readonly Dictionary<uint, uint> WhiteLen9MakeupCodes = new Dictionary<uint, uint>()
{
{ 0xCC, 704 }, { 0xCD, 768 }, { 0xD2, 832 }, { 0xD3, 896 }, { 0xD4, 960 }, { 0xD5, 1024 }, { 0xD6, 1088 },
{ 0xD7, 1152 }, { 0xD8, 1216 }, { 0xD9, 1280 }, { 0xDA, 1344 }, { 0xDB, 1408 }, { 0x98, 1472 }, { 0x99, 1536 },
{ 0x9A, 1600 }, { 0x9B, 1728 }
};
private static readonly Dictionary<uint, uint> BlackLen10MakeupCodes = new Dictionary<uint, uint>()
{
{ 0xF, 64 }
};
private static readonly Dictionary<uint, uint> BlackLen12MakeupCodes = new Dictionary<uint, uint>()
{
{ 0xC8, 128 }, { 0xC9, 192 }, { 0x5B, 256 }, { 0x33, 320 }, { 0x34, 384 }, { 0x35, 448 }
};
private static readonly Dictionary<uint, uint> BlackLen13MakeupCodes = new Dictionary<uint, uint>()
{
{ 0x6C, 512 }, { 0x6D, 576 }, { 0x4A, 640 }, { 0x4B, 704 }, { 0x4C, 768 }, { 0x4D, 832 }, { 0x72, 896 },
{ 0x73, 960 }, { 0x74, 1024 }, { 0x75, 1088 }, { 0x76, 1152 }, { 0x77, 1216 }, { 0x52, 1280 }, { 0x53, 1344 },
{ 0x54, 1408 }, { 0x55, 1472 }, { 0x5A, 1536 }, { 0x5B, 1600 }, { 0x64, 1664 }, { 0x65, 1728 }
};
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="T4BitReader" /> class. /// Initializes a new instance of the <see cref="T4BitReader" /> class.
/// </summary> /// </summary>
@ -232,175 +363,27 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 4: case 4:
{ {
switch (this.value) return WhiteLen4TermCodes[this.value];
{
case 0x7:
return 2;
case 0x8:
return 3;
case 0xB:
return 4;
case 0xC:
return 5;
case 0xE:
return 6;
case 0xF:
return 7;
}
break;
} }
case 5: case 5:
{ {
switch (this.value) return WhiteLen5TermCodes[this.value];
{
case 0x13:
return 8;
case 0x14:
return 9;
case 0x7:
return 10;
case 0x8:
return 11;
}
break;
} }
case 6: case 6:
{ {
switch (this.value) return WhiteLen6TermCodes[this.value];
{
case 0x7:
return 1;
case 0x8:
return 12;
case 0x3:
return 13;
case 0x34:
return 14;
case 0x35:
return 15;
case 0x2A:
return 16;
case 0x2B:
return 17;
}
break;
} }
case 7: case 7:
{ {
switch (this.value) return WhiteLen7TermCodes[this.value];
{
case 0x27:
return 18;
case 0xC:
return 19;
case 0x8:
return 20;
case 0x17:
return 21;
case 0x3:
return 22;
case 0x4:
return 23;
case 0x28:
return 24;
case 0x2B:
return 25;
case 0x13:
return 26;
case 0x24:
return 27;
case 0x18:
return 28;
}
break;
} }
case 8: case 8:
{ {
switch (this.value) return WhiteLen8TermCodes[this.value];
{
case 0x35:
return 0;
case 0x2:
return 29;
case 0x3:
return 30;
case 0x1A:
return 31;
case 0x1B:
return 32;
case 0x12:
return 33;
case 0x13:
return 34;
case 0x14:
return 35;
case 0x15:
return 36;
case 0x16:
return 37;
case 0x17:
return 38;
case 0x28:
return 39;
case 0x29:
return 40;
case 0x2A:
return 41;
case 0x2B:
return 42;
case 0x2C:
return 43;
case 0x2D:
return 44;
case 0x4:
return 45;
case 0x5:
return 46;
case 0xA:
return 47;
case 0xB:
return 48;
case 0x52:
return 49;
case 0x53:
return 50;
case 0x54:
return 51;
case 0x55:
return 52;
case 0x24:
return 53;
case 0x25:
return 54;
case 0x58:
return 55;
case 0x59:
return 56;
case 0x5A:
return 57;
case 0x5B:
return 58;
case 0x4A:
return 59;
case 0x4B:
return 60;
case 0x32:
return 61;
case 0x33:
return 62;
case 0x34:
return 63;
}
break;
} }
} }
@ -413,229 +396,57 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 2: case 2:
{ {
switch (this.value) return BlackLen2TermCodes[this.value];
{
case 0x3:
return 2;
case 0x2:
return 3;
}
break;
} }
case 3: case 3:
{ {
switch (this.value) return BlackLen3TermCodes[this.value];
{
case 0x2:
return 1;
case 0x3:
return 4;
}
break;
} }
case 4: case 4:
{ {
switch (this.value) return BlackLen4TermCodes[this.value];
{
case 0x3:
return 5;
case 0x2:
return 6;
}
break;
} }
case 5: case 5:
{ {
switch (this.value) return BlackLen5TermCodes[this.value];
{
case 0x3:
return 7;
}
break;
} }
case 6: case 6:
{ {
switch (this.value) return BlackLen6TermCodes[this.value];
{
case 0x5:
return 8;
case 0x4:
return 9;
}
break;
} }
case 7: case 7:
{ {
switch (this.value) return BlackLen7TermCodes[this.value];
{
case 0x4:
return 10;
case 0x5:
return 11;
case 0x7:
return 12;
}
break;
} }
case 8: case 8:
{ {
switch (this.value) return BlackLen8TermCodes[this.value];
{
case 0x4:
return 13;
case 0x7:
return 14;
}
break;
} }
case 9: case 9:
{ {
switch (this.value) return BlackLen9TermCodes[this.value];
{
case 0x18:
return 15;
}
break;
} }
case 10: case 10:
{ {
switch (this.value) return BlackLen10TermCodes[this.value];
{
case 0x37:
return 0;
case 0x17:
return 16;
case 0x18:
return 17;
case 0x8:
return 18;
}
break;
} }
case 11: case 11:
{ {
switch (this.value) return BlackLen11TermCodes[this.value];
{
case 0x67:
return 19;
case 0x68:
return 20;
case 0x6C:
return 21;
case 0x37:
return 22;
case 0x28:
return 23;
case 0x17:
return 24;
case 0x18:
return 25;
}
break;
} }
case 12: case 12:
{ {
switch (this.value) return BlackLen12TermCodes[this.value];
{
case 0xCA:
return 26;
case 0xCB:
return 27;
case 0xCC:
return 28;
case 0xCD:
return 29;
case 0x68:
return 30;
case 0x69:
return 31;
case 0x6A:
return 32;
case 0x6B:
return 33;
case 0xD2:
return 34;
case 0xD3:
return 35;
case 0xD4:
return 36;
case 0xD5:
return 37;
case 0xD6:
return 38;
case 0xD7:
return 39;
case 0x6C:
return 40;
case 0x6D:
return 41;
case 0xDA:
return 42;
case 0xDB:
return 43;
case 0x54:
return 44;
case 0x55:
return 45;
case 0x56:
return 46;
case 0x57:
return 47;
case 0x64:
return 48;
case 0x65:
return 49;
case 0x52:
return 50;
case 0x53:
return 51;
case 0x24:
return 52;
case 0x37:
return 53;
case 0x38:
return 54;
case 0x27:
return 55;
case 0x28:
return 56;
case 0x58:
return 57;
case 0x59:
return 58;
case 0x2B:
return 59;
case 0x2C:
return 60;
case 0x5A:
return 61;
case 0x66:
return 62;
case 0x67:
return 63;
}
break;
} }
} }
@ -648,101 +459,27 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 5: case 5:
{ {
switch (this.value) return WhiteLen5MakeupCodes[this.value];
{
case 0x1B:
return 64;
case 0x12:
return 128;
}
break;
} }
case 6: case 6:
{ {
switch (this.value) return WhiteLen6MakeupCodes[this.value];
{
case 0x17:
return 192;
case 0x18:
return 1664;
}
break;
} }
case 7: case 7:
{ {
switch (this.value) return WhiteLen7MakeupCodes[this.value];
{
case 0x37:
return 256;
}
break;
} }
case 8: case 8:
{ {
switch (this.value) return WhiteLen8MakeupCodes[this.value];
{
case 0x36:
return 320;
case 0x37:
return 348;
case 0x64:
return 448;
case 0x65:
return 512;
case 0x68:
return 576;
case 0x67:
return 640;
}
break;
} }
case 9: case 9:
{ {
switch (this.value) return WhiteLen9MakeupCodes[this.value];
{
case 0xCC:
return 704;
case 0xCD:
return 768;
case 0xD2:
return 832;
case 0xD3:
return 896;
case 0xD4:
return 960;
case 0xD5:
return 1024;
case 0xD6:
return 1088;
case 0xD7:
return 1152;
case 0xD8:
return 1216;
case 0xD9:
return 1280;
case 0xDA:
return 1344;
case 0xDB:
return 1408;
case 0x98:
return 1472;
case 0x99:
return 1536;
case 0x9A:
return 1600;
case 0x9B:
return 1728;
}
break;
} }
} }
@ -755,83 +492,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 10: case 10:
{ {
switch (this.value) return BlackLen10MakeupCodes[this.value];
{
case 0xF:
return 64;
}
} }
break;
case 12: case 12:
{ {
switch (this.value) return BlackLen12MakeupCodes[this.value];
{
case 0xC8:
return 128;
case 0xC9:
return 192;
case 0x5B:
return 256;
case 0x33:
return 320;
case 0x34:
return 384;
case 0x35:
return 448;
}
} }
break;
case 13: case 13:
{ {
switch (this.value) return BlackLen13MakeupCodes[this.value];
{
case 0x6C:
return 512;
case 0x6D:
return 576;
case 0x4A:
return 640;
case 0x4B:
return 704;
case 0x4C:
return 768;
case 0x4D:
return 832;
case 0x72:
return 896;
case 0x73:
return 960;
case 0x74:
return 1024;
case 0x75:
return 1088;
case 0x76:
return 1152;
case 0x77:
return 1216;
case 0x52:
return 1280;
case 0x53:
return 1344;
case 0x54:
return 1408;
case 0x55:
return 1472;
case 0x5A:
return 1536;
case 0x5B:
return 1600;
case 0x64:
return 1664;
case 0x65:
return 1728;
}
break;
} }
} }
@ -854,36 +525,27 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 5: case 5:
{ {
uint[] codes = { 0x1B, 0x12 }; return WhiteLen5MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 6: case 6:
{ {
uint[] codes = { 0x17, 0x18 }; return WhiteLen6MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 7: case 7:
{ {
uint[] codes = { 0x37 }; return WhiteLen7MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 8: case 8:
{ {
uint[] codes = { 0x36, 0x37, 0x64, 0x65, 0x68, 0x67 }; return WhiteLen8MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 9: case 9:
{ {
uint[] codes = return WhiteLen9MakeupCodes.ContainsKey(this.value);
{
0xCC, 0xCD, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0x98,
0x99, 0x9A, 0x9B
};
return codes.Contains(this.value);
} }
} }
@ -896,24 +558,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 10: case 10:
{ {
uint[] codes = { 0xF }; return BlackLen10MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 12: case 12:
{ {
uint[] codes = { 0xC8, 0xC9, 0x5B, 0x33, 0x34, 0x35 }; return BlackLen12MakeupCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 13: case 13:
{ {
uint[] codes = return BlackLen13MakeupCodes.ContainsKey(this.value);
{
0x6C, 0x6D, 0x4A, 0x4B, 0x4C, 0x4D, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x52,
0x53, 0x54, 0x55, 0x5A, 0x5B, 0x64, 0x65
};
return codes.Contains(this.value);
} }
} }
@ -936,37 +591,27 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 4: case 4:
{ {
uint[] codes = { 0x7, 0x8, 0xB, 0xC, 0xE, 0xF }; return WhiteLen4TermCodes.Keys.Contains(this.value);
return codes.Contains(this.value);
} }
case 5: case 5:
{ {
uint[] codes = { 0x13, 0x14, 0x7, 0x8 }; return WhiteLen5TermCodes.Keys.Contains(this.value);
return codes.Contains(this.value);
} }
case 6: case 6:
{ {
uint[] codes = { 0x7, 0x8, 0x3, 0x34, 0x35, 0x2A, 0x2B }; return WhiteLen6TermCodes.Keys.Contains(this.value);
return codes.Contains(this.value);
} }
case 7: case 7:
{ {
uint[] codes = { 0x27, 0xC, 0x8, 0x17, 0x3, 0x4, 0x28, 0x2B, 0x13, 0x24, 0x18 }; return WhiteLen7TermCodes.Keys.Contains(this.value);
return codes.Contains(this.value);
} }
case 8: case 8:
{ {
uint[] codes = return WhiteLen8TermCodes.Keys.Contains(this.value);
{
0x35, 0x2, 0x3, 0x1A, 0x1B, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x28, 0x29,
0x2A, 0x2B, 0x2C, 0x2D, 0x4, 0x5, 0xA, 0xB, 0x52, 0x53, 0x54, 0x55, 0x24, 0x25,
0x58, 0x59, 0x5A, 0x5B, 0x4A, 0x4B, 0x32, 0x33, 0x34
};
return codes.Contains(this.value);
} }
} }
@ -979,73 +624,57 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
case 2: case 2:
{ {
uint[] codes = { 0x3, 0x2 }; return BlackLen2TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 3: case 3:
{ {
uint[] codes = { 0x02, 0x03 }; return BlackLen3TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 4: case 4:
{ {
uint[] codes = { 0x03, 0x02 }; return BlackLen4TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 5: case 5:
{ {
uint[] codes = { 0x03 }; return BlackLen5TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 6: case 6:
{ {
uint[] codes = { 0x5, 0x4 }; return BlackLen6TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 7: case 7:
{ {
uint[] codes = { 0x4, 0x5, 0x7 }; return BlackLen7TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 8: case 8:
{ {
uint[] codes = { 0x4, 0x7 }; return BlackLen8TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 9: case 9:
{ {
uint[] codes = { 0x18 }; return BlackLen9TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 10: case 10:
{ {
uint[] codes = { 0x37, 0x17, 0x18, 0x8 }; return BlackLen10TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 11: case 11:
{ {
uint[] codes = { 0x67, 0x68, 0x6C, 0x37, 0x28, 0x17, 0x18 }; return BlackLen11TermCodes.ContainsKey(this.value);
return codes.Contains(this.value);
} }
case 12: case 12:
{ {
uint[] codes = return BlackLen12TermCodes.ContainsKey(this.value);
{
0xCA, 0xCB, 0xCC, 0xCD, 0x68, 0x69, 0x6A, 0x6B, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
0xD7, 0x6C, 0x6D, 0xDA, 0xDB, 0x54, 0x55, 0x56, 0x57, 0x64, 0x65, 0x52, 0x53,
0x24, 0x37, 0x38, 0x27, 0x28, 0x58, 0x59, 0x2B, 0x2C, 0x5A, 0x66, 0x67
};
return codes.Contains(this.value);
} }
} }

Loading…
Cancel
Save