@@ -114,6 +114,17 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
114
114
UndoRgb48BitLittleEndianRow ( pixelBytes , width , y ) ;
115
115
}
116
116
117
+ break ;
118
+ case TiffColorType . Rgba16161616 :
119
+ if ( isBigEndian )
120
+ {
121
+ UndoRgb64BitBigEndianRow ( pixelBytes , width , y ) ;
122
+ }
123
+ else
124
+ {
125
+ UndoRgb64BitLittleEndianRow ( pixelBytes , width , y ) ;
126
+ }
127
+
117
128
break ;
118
129
}
119
130
}
@@ -504,6 +515,92 @@ private static void UndoRgb48Bit(Span<byte> pixelBytes, int width, bool isBigEnd
504
515
}
505
516
}
506
517
518
+ private static void UndoRgb64BitBigEndianRow ( Span < byte > pixelBytes , int width , int y )
519
+ {
520
+ int rowBytesCount = width * 8 ;
521
+ int offset = 0 ;
522
+
523
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
524
+ ushort r = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
525
+ offset += 2 ;
526
+ ushort g = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
527
+ offset += 2 ;
528
+ ushort b = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
529
+ offset += 2 ;
530
+ ushort a = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
531
+ offset += 2 ;
532
+
533
+ for ( int x = 1 ; x < width ; x ++ )
534
+ {
535
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
536
+ ushort deltaR = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
537
+ r += deltaR ;
538
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , r ) ;
539
+ offset += 2 ;
540
+
541
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
542
+ ushort deltaG = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
543
+ g += deltaG ;
544
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , g ) ;
545
+ offset += 2 ;
546
+
547
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
548
+ ushort deltaB = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
549
+ b += deltaB ;
550
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , b ) ;
551
+ offset += 2 ;
552
+
553
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
554
+ ushort deltaA = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
555
+ a += deltaA ;
556
+ BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , a ) ;
557
+ offset += 2 ;
558
+ }
559
+ }
560
+
561
+ private static void UndoRgb64BitLittleEndianRow ( Span < byte > pixelBytes , int width , int y )
562
+ {
563
+ int rowBytesCount = width * 8 ;
564
+ int offset = 0 ;
565
+
566
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
567
+ ushort r = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
568
+ offset += 2 ;
569
+ ushort g = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
570
+ offset += 2 ;
571
+ ushort b = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
572
+ offset += 2 ;
573
+ ushort a = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
574
+ offset += 2 ;
575
+
576
+ for ( int x = 1 ; x < width ; x ++ )
577
+ {
578
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
579
+ ushort deltaR = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
580
+ r += deltaR ;
581
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , r ) ;
582
+ offset += 2 ;
583
+
584
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
585
+ ushort deltaG = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
586
+ g += deltaG ;
587
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , g ) ;
588
+ offset += 2 ;
589
+
590
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
591
+ ushort deltaB = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
592
+ b += deltaB ;
593
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , b ) ;
594
+ offset += 2 ;
595
+
596
+ rowSpan = rowBytes . Slice ( offset , 2 ) ;
597
+ ushort deltaA = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
598
+ a += deltaA ;
599
+ BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , a ) ;
600
+ offset += 2 ;
601
+ }
602
+ }
603
+
507
604
private static void UndoRgba64Bit ( Span < byte > pixelBytes , int width , bool isBigEndian )
508
605
{
509
606
int rowBytesCount = width * 8 ;
@@ -512,86 +609,14 @@ private static void UndoRgba64Bit(Span<byte> pixelBytes, int width, bool isBigEn
512
609
{
513
610
for ( int y = 0 ; y < height ; y ++ )
514
611
{
515
- int offset = 0 ;
516
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
517
- ushort r = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
518
- offset += 2 ;
519
- ushort g = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
520
- offset += 2 ;
521
- ushort b = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
522
- offset += 2 ;
523
- ushort a = TiffUtilities . ConvertToUShortBigEndian ( rowBytes . Slice ( offset , 2 ) ) ;
524
- offset += 2 ;
525
-
526
- for ( int x = 1 ; x < width ; x ++ )
527
- {
528
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
529
- ushort deltaR = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
530
- r += deltaR ;
531
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , r ) ;
532
- offset += 2 ;
533
-
534
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
535
- ushort deltaG = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
536
- g += deltaG ;
537
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , g ) ;
538
- offset += 2 ;
539
-
540
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
541
- ushort deltaB = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
542
- b += deltaB ;
543
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , b ) ;
544
- offset += 2 ;
545
-
546
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
547
- ushort deltaA = TiffUtilities . ConvertToUShortBigEndian ( rowSpan ) ;
548
- a += deltaA ;
549
- BinaryPrimitives . WriteUInt16BigEndian ( rowSpan , a ) ;
550
- offset += 2 ;
551
- }
612
+ UndoRgb64BitBigEndianRow ( pixelBytes , width , y ) ;
552
613
}
553
614
}
554
615
else
555
616
{
556
617
for ( int y = 0 ; y < height ; y ++ )
557
618
{
558
- int offset = 0 ;
559
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
560
- ushort r = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
561
- offset += 2 ;
562
- ushort g = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
563
- offset += 2 ;
564
- ushort b = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
565
- offset += 2 ;
566
- ushort a = TiffUtilities . ConvertToUShortLittleEndian ( rowBytes . Slice ( offset , 2 ) ) ;
567
- offset += 2 ;
568
-
569
- for ( int x = 1 ; x < width ; x ++ )
570
- {
571
- Span < byte > rowSpan = rowBytes . Slice ( offset , 2 ) ;
572
- ushort deltaR = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
573
- r += deltaR ;
574
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , r ) ;
575
- offset += 2 ;
576
-
577
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
578
- ushort deltaG = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
579
- g += deltaG ;
580
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , g ) ;
581
- offset += 2 ;
582
-
583
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
584
- ushort deltaB = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
585
- b += deltaB ;
586
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , b ) ;
587
- offset += 2 ;
588
-
589
- rowSpan = rowBytes . Slice ( offset , 2 ) ;
590
- ushort deltaA = TiffUtilities . ConvertToUShortLittleEndian ( rowSpan ) ;
591
- a += deltaA ;
592
- BinaryPrimitives . WriteUInt16LittleEndian ( rowSpan , a ) ;
593
- offset += 2 ;
594
- }
619
+ UndoRgb64BitLittleEndianRow ( pixelBytes , width , y ) ;
595
620
}
596
621
}
597
622
}
0 commit comments