@@ -72,6 +72,7 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
72
72
case TiffColorType . PaletteColor :
73
73
UndoGray8BitRow ( pixelBytes , width , y ) ;
74
74
break ;
75
+
75
76
case TiffColorType . BlackIsZero16 :
76
77
case TiffColorType . WhiteIsZero16 :
77
78
if ( isBigEndian )
@@ -84,6 +85,7 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
84
85
}
85
86
86
87
break ;
88
+
87
89
case TiffColorType . BlackIsZero32 :
88
90
case TiffColorType . WhiteIsZero32 :
89
91
if ( isBigEndian )
@@ -96,14 +98,17 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
96
98
}
97
99
98
100
break ;
101
+
99
102
case TiffColorType . Rgb888 :
100
103
case TiffColorType . CieLab :
101
104
UndoRgb24BitRow ( pixelBytes , width , y ) ;
102
105
break ;
106
+
103
107
case TiffColorType . Rgba8888 :
104
108
case TiffColorType . Cmyk :
105
109
UndoRgba32BitRow ( pixelBytes , width , y ) ;
106
110
break ;
111
+
107
112
case TiffColorType . Rgb161616 :
108
113
if ( isBigEndian )
109
114
{
@@ -115,6 +120,7 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
115
120
}
116
121
117
122
break ;
123
+
118
124
case TiffColorType . Rgba16161616 :
119
125
if ( isBigEndian )
120
126
{
@@ -125,6 +131,18 @@ public static void UndoRow(Span<byte> pixelBytes, int width, int y, TiffColorTyp
125
131
UndoRgb64BitLittleEndianRow ( pixelBytes , width , y ) ;
126
132
}
127
133
134
+ break ;
135
+
136
+ case TiffColorType . Rgb323232 :
137
+ if ( isBigEndian )
138
+ {
139
+ UndoRgb96BitBigEndianRow ( pixelBytes , width , y ) ;
140
+ }
141
+ else
142
+ {
143
+ UndoRgb96BitLittleEndianRow ( pixelBytes , width , y ) ;
144
+ }
145
+
128
146
break ;
129
147
}
130
148
}
@@ -621,6 +639,76 @@ private static void UndoRgba64Bit(Span<byte> pixelBytes, int width, bool isBigEn
621
639
}
622
640
}
623
641
642
+ private static void UndoRgb96BitBigEndianRow ( Span < byte > pixelBytes , int width , int y )
643
+ {
644
+ int rowBytesCount = width * 12 ;
645
+
646
+ int offset = 0 ;
647
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
648
+ uint r = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
649
+ offset += 4 ;
650
+ uint g = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
651
+ offset += 4 ;
652
+ uint b = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
653
+ offset += 4 ;
654
+
655
+ for ( int x = 1 ; x < width ; x ++ )
656
+ {
657
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 4 ) ;
658
+ uint deltaR = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
659
+ r += deltaR ;
660
+ BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , r ) ;
661
+ offset += 4 ;
662
+
663
+ rowSpan = rowBytes . Slice ( offset , 4 ) ;
664
+ uint deltaG = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
665
+ g += deltaG ;
666
+ BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , g ) ;
667
+ offset += 4 ;
668
+
669
+ rowSpan = rowBytes . Slice ( offset , 4 ) ;
670
+ uint deltaB = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
671
+ b += deltaB ;
672
+ BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , b ) ;
673
+ offset += 4 ;
674
+ }
675
+ }
676
+
677
+ private static void UndoRgb96BitLittleEndianRow ( Span < byte > pixelBytes , int width , int y )
678
+ {
679
+ int rowBytesCount = width * 12 ;
680
+
681
+ int offset = 0 ;
682
+ Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
683
+ uint r = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
684
+ offset += 4 ;
685
+ uint g = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
686
+ offset += 4 ;
687
+ uint b = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
688
+ offset += 4 ;
689
+
690
+ for ( int x = 1 ; x < width ; x ++ )
691
+ {
692
+ Span < byte > rowSpan = rowBytes . Slice ( offset , 4 ) ;
693
+ uint deltaR = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
694
+ r += deltaR ;
695
+ BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , r ) ;
696
+ offset += 4 ;
697
+
698
+ rowSpan = rowBytes . Slice ( offset , 4 ) ;
699
+ uint deltaG = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
700
+ g += deltaG ;
701
+ BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , g ) ;
702
+ offset += 4 ;
703
+
704
+ rowSpan = rowBytes . Slice ( offset , 4 ) ;
705
+ uint deltaB = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
706
+ b += deltaB ;
707
+ BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , b ) ;
708
+ offset += 4 ;
709
+ }
710
+ }
711
+
624
712
private static void UndoRgb96Bit ( Span < byte > pixelBytes , int width , bool isBigEndian )
625
713
{
626
714
int rowBytesCount = width * 12 ;
@@ -629,70 +717,14 @@ private static void UndoRgb96Bit(Span<byte> pixelBytes, int width, bool isBigEnd
629
717
{
630
718
for ( int y = 0 ; y < height ; y ++ )
631
719
{
632
- int offset = 0 ;
633
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
634
- uint r = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
635
- offset += 4 ;
636
- uint g = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
637
- offset += 4 ;
638
- uint b = TiffUtilities . ConvertToUIntBigEndian ( rowBytes . Slice ( offset , 4 ) ) ;
639
- offset += 4 ;
640
-
641
- for ( int x = 1 ; x < width ; x ++ )
642
- {
643
- Span < byte > rowSpan = rowBytes . Slice ( offset , 4 ) ;
644
- uint deltaR = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
645
- r += deltaR ;
646
- BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , r ) ;
647
- offset += 4 ;
648
-
649
- rowSpan = rowBytes . Slice ( offset , 4 ) ;
650
- uint deltaG = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
651
- g += deltaG ;
652
- BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , g ) ;
653
- offset += 4 ;
654
-
655
- rowSpan = rowBytes . Slice ( offset , 4 ) ;
656
- uint deltaB = TiffUtilities . ConvertToUIntBigEndian ( rowSpan ) ;
657
- b += deltaB ;
658
- BinaryPrimitives . WriteUInt32BigEndian ( rowSpan , b ) ;
659
- offset += 4 ;
660
- }
720
+ UndoRgb96BitBigEndianRow ( pixelBytes , width , y ) ;
661
721
}
662
722
}
663
723
else
664
724
{
665
725
for ( int y = 0 ; y < height ; y ++ )
666
726
{
667
- int offset = 0 ;
668
- Span < byte > rowBytes = pixelBytes . Slice ( y * rowBytesCount , rowBytesCount ) ;
669
- uint r = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
670
- offset += 4 ;
671
- uint g = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
672
- offset += 4 ;
673
- uint b = TiffUtilities . ConvertToUIntLittleEndian ( rowBytes . Slice ( offset , 4 ) ) ;
674
- offset += 4 ;
675
-
676
- for ( int x = 1 ; x < width ; x ++ )
677
- {
678
- Span < byte > rowSpan = rowBytes . Slice ( offset , 4 ) ;
679
- uint deltaR = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
680
- r += deltaR ;
681
- BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , r ) ;
682
- offset += 4 ;
683
-
684
- rowSpan = rowBytes . Slice ( offset , 4 ) ;
685
- uint deltaG = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
686
- g += deltaG ;
687
- BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , g ) ;
688
- offset += 4 ;
689
-
690
- rowSpan = rowBytes . Slice ( offset , 4 ) ;
691
- uint deltaB = TiffUtilities . ConvertToUIntLittleEndian ( rowSpan ) ;
692
- b += deltaB ;
693
- BinaryPrimitives . WriteUInt32LittleEndian ( rowSpan , b ) ;
694
- offset += 4 ;
695
- }
727
+ UndoRgb96BitLittleEndianRow ( pixelBytes , width , y ) ;
696
728
}
697
729
}
698
730
}
0 commit comments