@@ -62,7 +62,7 @@ public static void Undo(Span<byte> pixelBytes, int width, TiffColorType colorTyp
62
62
}
63
63
}
64
64
65
- public static void UndoRow ( Span < byte > pixelBytes , int width , int y , TiffColorType colorType )
65
+ public static void UndoRow ( Span < byte > pixelBytes , int width , int y , TiffColorType colorType , bool isBigEndian )
66
66
{
67
67
// TODO: Implement missing colortypes, see above.
68
68
switch ( colorType )
@@ -71,6 +71,18 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
71
71
case TiffColorType . WhiteIsZero8 :
72
72
case TiffColorType . PaletteColor :
73
73
UndoGray8BitRow ( pixelBytes , width , y ) ;
74
+ break ;
75
+ case TiffColorType . BlackIsZero16 :
76
+ case TiffColorType . WhiteIsZero16 :
77
+ if ( isBigEndian )
78
+ {
79
+ UndoGray16BitBigEndianRow ( pixelBytes , width , y ) ;
80
+ }
81
+ else
82
+ {
83
+ UndoGray16BitLittleEndianRow ( pixelBytes , width , y ) ;
84
+ }
85
+
74
86
break ;
75
87
case TiffColorType . Rgb888 :
76
88
case TiffColorType . CieLab :
@@ -196,6 +208,44 @@ private static void UndoGray8Bit(Span<byte> pixelBytes, int width)
196
208
}
197
209
}
198
210
211
+ private static void UndoGray16BitBigEndianRow ( Span < byte > pixelBytes , int width , int y )
212
+ {
213
+ int rowBytesCount = width * 2 ;
214
+ int height = pixelBytes . Length / rowBytesCount ;
215
+ int offset = 0 ;
216
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
217
+ ushort pixelValue = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
218
+ offset += 2 ;
219
+
220
+ for ( int x = 1 ; x < width ; x ++ )
221
+ {
222
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
223
+ ushort diff = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
224
+ pixelValue += diff ;
225
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , pixelValue ) ;
226
+ offset += 2 ;
227
+ }
228
+ }
229
+
230
+ private static void UndoGray16BitLittleEndianRow ( Span < byte > pixelBytes , int width , int y )
231
+ {
232
+ int rowBytesCount = width * 2 ;
233
+ int height = pixelBytes . Length / rowBytesCount ;
234
+ int offset = 0 ;
235
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
236
+ ushort pixelValue = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
237
+ offset += 2 ;
238
+
239
+ for ( int x = 1 ; x < width ; x ++ )
240
+ {
241
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
242
+ ushort diff = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
243
+ pixelValue += diff ;
244
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , pixelValue ) ;
245
+ offset += 2 ;
246
+ }
247
+ }
248
+
199
249
private static void UndoGray16Bit ( Span < byte > pixelBytes , int width , bool isBigEndian )
200
250
{
201
251
int rowBytesCount = width * 2 ;
@@ -204,38 +254,14 @@ private static void UndoGray16Bit(Span<byte> pixelBytes, int width, bool isBigEn
204
254
{
205
255
for ( int y = 0 ; y < height ; y ++ )
206
256
{
207
- int offset = 0 ;
208
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
209
- ushort pixelValue = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
210
- offset += 2 ;
211
-
212
- for ( int x = 1 ; x < width ; x ++ )
213
- {
214
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
215
- ushort diff = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
216
- pixelValue += diff ;
217
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , pixelValue ) ;
218
- offset += 2 ;
219
- }
257
+ UndoGray16BitBigEndianRow ( pixelBytes , width , y ) ;
220
258
}
221
259
}
222
260
else
223
261
{
224
262
for ( int y = 0 ; y < height ; y ++ )
225
263
{
226
- int offset = 0 ;
227
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
228
- ushort pixelValue = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
229
- offset += 2 ;
230
-
231
- for ( int x = 1 ; x < width ; x ++ )
232
- {
233
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
234
- ushort diff = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
235
- pixelValue += diff ;
236
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , pixelValue ) ;
237
- offset += 2 ;
238
- }
264
+ UndoGray16BitLittleEndianRow ( pixelBytes , width , y ) ;
239
265
}
240
266
}
241
267
}
0 commit comments