@ -450,38 +450,38 @@ static float stbir__srgb_uchar_to_linear_float[256] = {
// sRGB transition values, scaled by 1<<28
static int stbir__srgb_offset_to_linear_scaled [ 256 ] =
{
40579 , 121738 , 202897 , 284056 , 365216 , 446375 , 527534 , 60869 3 ,
689852 , 771011 , 852421 , 938035 , 1028466 , 1123787 , 1224073 , 1329393 ,
1439819 , 1555418 , 1676257 , 1802402 , 1933917 , 2070867 , 2213313 , 2361317 ,
2514938 , 2674237 , 283927 1 , 3010099 , 3186776 , 3369359 , 3557903 , 3752463 ,
3953090 , 4159840 , 4372764 , 4591913 , 481733 9 , 504909 1 , 5287220 , 5531775 ,
5782804 , 6040356 , 6304477 , 6575216 , 6852618 , 713 672 9, 7427596 , 7725263 ,
8029775 , 8341176 , 8659511 , 8984821 , 9317151 , 9656544 , 10003040 , 10356683 ,
10717513 , 11085572 , 11460901 , 11843 540 , 12233529 , 12630908 , 13035717 , 13447994 ,
13867779 , 14295110 , 14730025 , 15172563 , 15622760 , 16080655 , 16546285 , 17019686 ,
17500894 , 17989948 , 18486882 , 18991734 , 19504536 , 20025326 , 20554 13 8 , 21091010 ,
2163597 2 , 2 21890 62 , 22750312 , 23319758 , 23897432 , 24483368 , 25077600 , 25680162 ,
26291086 , 26910406 , 27538152 , 28174360 , 28819058 , 29472282 , 30134062 , 3080443 0 ,
31483418 , 32171058 , 32867378 , 335724 12 , 34286192 , 35008744 , 35740104 , 36480296 ,
37229356 , 37987316 , 38754196 , 39530036 , 40314860 , 41108700 , 41911584 , 42723540 ,
4354460 0 , 44 3747 92 , 45214140 , 46062680 , 469204 40 , 47787444 , 48663720 , 495493 00 ,
50444212 , 51348480 , 522621 36, 53185 204 , 54117712 , 55059688 , 56011160 , 56972156 ,
57942704 , 58922824 , 59912552 , 60911908 , 61920920 , 62939616 , 6396802 4 , 65006 168 ,
66054072 , 671117 60 , 68179272 , 69256616 , 70343832 , 71440936 , 72547952 , 73664920 ,
74791848 , 75928776 , 77075720 , 7823270 4 , 793997 60 , 80576904 , 81764 168 , 82961576 ,
84169152 , 85386920 , 86614904 , 87853120 , 8910160 8 , 90360384 , 91629480 , 9290890 4 ,
94198688 , 95498864 , 96809440 , 98130456 , 99461928 , 100803872 , 102156320 , 103519296 ,
104892824 , 106276920 , 107671616 , 109076928 , 110492880 , 111919504 , 113356808 , 11480482 4 ,
116263 576 , 117733080 , 119213360 , 120704448 , 122206352 , 123719104 , 125242720 , 1267772 32 ,
128322648 , 129879000 , 131446312 , 133024600 , 134613888 , 136214192 , 137825552 , 13944796 8 ,
141 08145 6 , 142726080 , 144381808 , 14604 8704 , 147726768 , 149416016 , 151116496 , 152828192 ,
154551168 , 156285408 , 158030944 , 159787808 , 161556000 , 163335568 , 165126512 , 16692886 4 ,
1687426 40 , 170567856 , 172404544 , 174252704 , 176112384 , 1779835 68 , 179866320 , 181760640 ,
183666528 , 185584032 , 187513168 , 18945395 2 , 191406400 , 193370544 , 195346384 , 197333952 ,
199333264 , 201344352 , 203367216 , 205401904 , 207448400 , 209506752 , 211576960 , 213659056 ,
215753056 , 217858976 , 219976832 , 222106656 , 224248464 , 226402272 , 228568096 , 230745952 ,
232935872 , 23513787 2 , 237351968 , 239578176 , 241816512 , 244066992 , 246329648 , 248604 51 2 ,
250891568 , 253190848 , 25550 2368 , 257826160 , 260162240 , 262510608 , 264871312 , 2672443 36 ,
0 , 40738 , 122216 , 203693 , 285170 , 366648 , 448125 , 529 603,
611080 , 692557 , 774035 , 855852 , 942009 , 1033024 , 1128971 , 1229926 ,
1335959 , 1447142 , 1563542 , 1685229 , 1812268 , 1944725 , 2082664 , 2226148 ,
2375238 , 2529996 , 26904 81 , 285675 3, 3028870 , 3206888 , 3390865 , 3580856 ,
3776916 , 3979100 , 4187460 , 4402049 , 462291 9 , 48 50123 , 5083710 , 5323731 ,
5570236 , 5823273 , 6082892 , 6349140 , 6622065 , 6901714 , 7188133 , 7481369 ,
7781466 , 8088471 , 8402427 , 8723380 , 9051372 , 9386448 , 9728650 , 10078021 ,
10434603 , 10798439 , 11169569 , 11548 036 , 11933879 , 12327139 , 12727857 , 13136073 ,
13551 82 6 , 13975156 , 14406100 , 14844697 , 15290987 , 15745007 , 16206795 , 16676389 ,
17153826 , 17639142 , 1813237 4 , 18633560 , 19142734 , 19659934 , 20185196 , 20718552 ,
2126004 2 , 218096 96 , 22367554 , 22933648 , 23508010 , 24090680 , 24681686 , 25281066 ,
25888850 , 26505076 , 27129772 , 27762974 , 28404716 , 29055026 , 29713942 , 3038149 0 ,
31057708 , 31742624 , 32436272 , 3313868 2 , 33849884 , 34569912 , 35298800 , 36036568 ,
36783260 , 37538896 , 38303512 , 39077136 , 39859796 , 40651528 , 41452360 , 42262316 ,
43081432 , 4390973 2 , 44747252 , 45594016 , 4645 0052 , 47315392 , 48190064 , 49074 096 ,
49967516 , 50870356 , 517826 36, 527 04392 , 53635648 , 54576432 , 55526772 , 56486700 ,
57456236 , 58435408 , 59424248 , 60422780 , 61431036 , 62449032 , 6347680 4 , 64 51437 6 ,
65561776 , 66619 028 , 67686160 , 68763192 , 69850160 , 70947088 , 72053992 , 73170912 ,
74297864 , 75434880 , 76581976 , 7773918 4 , 78 9065 36 , 80084040 , 812 7173 6 , 82469648 ,
83677792 , 84896192 , 86124888 , 87363888 , 88613232 , 89872928 , 91143016 , 92423512 ,
93714432 , 95015816 , 96327688 , 97650056 , 98982952 , 100326408 , 101680440 , 103045072 ,
104420320 , 105806224 , 107202800 , 108610064 , 110028048 , 111456776 , 112896264 , 11434654 4 ,
11580 7632 , 117279552 , 118762328 , 120255976 , 121760536 , 123276016 , 124802440 , 1263398 32 ,
127888216 , 129447616 , 131018048 , 132599544 , 134192112 , 135795792 , 137410592 , 13903652 8 ,
140673648 , 142321952 , 143981456 , 145 6522 08 , 147334208 , 149027488 , 150732064 , 152447968 ,
154175200 , 155913792 , 157663776 , 159425168 , 161197984 , 162982240 , 164777968 , 16658518 4 ,
168403904 , 170234160 , 172075968 , 173929344 , 175794320 , 177670 896 , 179559120 , 181458992 ,
183370528 , 185293776 , 187228736 , 189175 424 , 191133888 , 193104112 , 195086128 , 197079968 ,
199085648 , 201103184 , 203132592 , 205173888 , 207227120 , 209292272 , 211369392 , 213458480 ,
215559568 , 217672656 , 219797792 , 221934976 , 224084240 , 226245600 , 228419056 , 230604656 ,
232802400 , 2350 12 320 , 237234432 , 239468736 , 241715280 , 243974080 , 246245120 , 248528464 ,
250824112 , 253132064 , 2554 52368 , 257785040 , 260130080 , 262487520 , 264857376 , 267239 664 ,
} ;
static float stbir__srgb_to_linear ( float f )
@ -506,23 +506,16 @@ static unsigned char stbir__linear_to_srgb_uchar(float f)
int v = 0 ;
int i ;
// Everything below 128 is off by 1. This fixes that.
int fix = 0 ;
i = v + 128 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 64 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 32 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 16 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 8 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 4 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 2 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 1 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
// Adding 1 to 0 with the fix gives incorrect results for input 0. This fixes that.
if ( x < 81000 )
return 0 ;
i = 128 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ; else fix = 1 ;
i = v + 64 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 32 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 16 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 8 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 4 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 2 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
i = v + 1 ; if ( x > = stbir__srgb_offset_to_linear_scaled [ i ] ) v = i ;
return ( unsigned char ) v + fix ;
return ( unsigned char ) v ;
}
static float stbir__filter_trapezoid ( float x , float scale )