@@ -103,6 +103,17 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
103
103
case TiffColorType . Rgba8888 :
104
104
case TiffColorType . Cmyk :
105
105
UndoRgba32BitRow ( pixelBytes , width , y ) ;
106
+ break ;
107
+ case TiffColorType . Rgb161616 :
108
+ if ( isBigEndian )
109
+ {
110
+ UndoRgb48BitBigEndianRow ( pixelBytes , width , y ) ;
111
+ }
112
+ else
113
+ {
114
+ UndoRgb48BitLittleEndianRow ( pixelBytes , width , y ) ;
115
+ }
116
+
106
117
break ;
107
118
}
108
119
}
@@ -401,6 +412,78 @@ private static void UndoRgba32Bit(Span<byte> pixelBytes, int width)
401
412
}
402
413
}
403
414
415
+ private static void UndoRgb48BitBigEndianRow ( Span < byte > pixelBytes , int width , int y )
416
+ {
417
+ int rowBytesCount = width * 6 ;
418
+ int height = pixelBytes . Length / rowBytesCount ;
419
+
420
+ int offset = 0 ;
421
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
422
+ ushort r = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
423
+ offset += 2 ;
424
+ ushort g = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
425
+ offset += 2 ;
426
+ ushort b = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
427
+ offset += 2 ;
428
+
429
+ for ( int x = 1 ; x < width ; x ++ )
430
+ {
431
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
432
+ ushort deltaR = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
433
+ r += deltaR ;
434
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , r ) ;
435
+ offset += 2 ;
436
+
437
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
438
+ ushort deltaG = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
439
+ g += deltaG ;
440
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , g ) ;
441
+ offset += 2 ;
442
+
443
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
444
+ ushort deltaB = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
445
+ b += deltaB ;
446
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , b ) ;
447
+ offset += 2 ;
448
+ }
449
+ }
450
+
451
+ private static void UndoRgb48BitLittleEndianRow ( Span < byte > pixelBytes , int width , int y )
452
+ {
453
+ int rowBytesCount = width * 6 ;
454
+ int height = pixelBytes . Length / rowBytesCount ;
455
+
456
+ int offset = 0 ;
457
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
458
+ ushort r = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
459
+ offset += 2 ;
460
+ ushort g = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
461
+ offset += 2 ;
462
+ ushort b = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
463
+ offset += 2 ;
464
+
465
+ for ( int x = 1 ; x < width ; x ++ )
466
+ {
467
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
468
+ ushort deltaR = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
469
+ r += deltaR ;
470
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , r ) ;
471
+ offset += 2 ;
472
+
473
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
474
+ ushort deltaG = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
475
+ g += deltaG ;
476
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , g ) ;
477
+ offset += 2 ;
478
+
479
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
480
+ ushort deltaB = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
481
+ b += deltaB ;
482
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , b ) ;
483
+ offset += 2 ;
484
+ }
485
+ }
486
+
404
487
private static void UndoRgb48Bit ( Span < byte > pixelBytes , int width , bool isBigEndian )
405
488
{
406
489
int rowBytesCount = width * 6 ;
@@ -409,70 +492,14 @@ private static void UndoRgb48Bit(Span<byte> pixelBytes, int width, bool isBigEnd
409
492
{
410
493
for ( int y = 0 ; y < height ; y ++ )
411
494
{
412
- int offset = 0 ;
413
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
414
- ushort r = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
415
- offset += 2 ;
416
- ushort g = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
417
- offset += 2 ;
418
- ushort b = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
419
- offset += 2 ;
420
-
421
- for ( int x = 1 ; x < width ; x ++ )
422
- {
423
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
424
- ushort deltaR = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
425
- r += deltaR ;
426
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , r ) ;
427
- offset += 2 ;
428
-
429
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
430
- ushort deltaG = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
431
- g += deltaG ;
432
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , g ) ;
433
- offset += 2 ;
434
-
435
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
436
- ushort deltaB = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
437
- b += deltaB ;
438
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , b ) ;
439
- offset += 2 ;
440
- }
495
+ UndoRgb48BitBigEndianRow ( pixelBytes , width , y ) ;
441
496
}
442
497
}
443
498
else
444
499
{
445
500
for ( int y = 0 ; y < height ; y ++ )
446
501
{
447
- int offset = 0 ;
448
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
449
- ushort r = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
450
- offset += 2 ;
451
- ushort g = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
452
- offset += 2 ;
453
- ushort b = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
454
- offset += 2 ;
455
-
456
- for ( int x = 1 ; x < width ; x ++ )
457
- {
458
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
459
- ushort deltaR = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
460
- r += deltaR ;
461
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , r ) ;
462
- offset += 2 ;
463
-
464
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
465
- ushort deltaG = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
466
- g += deltaG ;
467
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , g ) ;
468
- offset += 2 ;
469
-
470
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
471
- ushort deltaB = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
472
- b += deltaB ;
473
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , b ) ;
474
- offset += 2 ;
475
- }
502
+ UndoRgb48BitLittleEndianRow ( pixelBytes , width , y ) ;
476
503
}
477
504
}
478
505
}
0 commit comments